diff --git a/core/modules/layout_builder/layout_builder.links.contextual.yml b/core/modules/layout_builder/layout_builder.links.contextual.yml
index 4bbfcc9e64..b43b81ea69 100644
--- a/core/modules/layout_builder/layout_builder.links.contextual.yml
+++ b/core/modules/layout_builder/layout_builder.links.contextual.yml
@@ -27,3 +27,23 @@ layout_builder_block_remove:
       class: ['use-ajax']
       data-dialog-type: dialog
       data-dialog-renderer: off_canvas
+
+layout_builder_block_translate:
+  title: 'Translate block'
+  route_name: 'layout_builder.translate_block'
+  group: 'layout_builder_block_translation'
+  options:
+    attributes:
+      class: ['use-ajax']
+      data-dialog-type: dialog
+      data-dialog-renderer: off_canvas
+
+layout_builder_inline_block_translate:
+  title: 'Translate block'
+  route_name: 'layout_builder.translate_inline_block'
+  group: 'layout_builder_inline_block_translation'
+  options:
+    attributes:
+      class: ['use-ajax']
+      data-dialog-type: dialog
+      data-dialog-renderer: off_canvas
diff --git a/core/modules/layout_builder/layout_builder.module b/core/modules/layout_builder/layout_builder.module
index 6e8d0a25f9..dad9128dfe 100644
--- a/core/modules/layout_builder/layout_builder.module
+++ b/core/modules/layout_builder/layout_builder.module
@@ -17,6 +17,7 @@
 use Drupal\field\FieldConfigInterface;
 use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
 use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplayStorage;
+use Drupal\layout_builder\Form\BlockContentInlineBlockTranslateForm;
 use Drupal\layout_builder\Form\DefaultsEntityForm;
 use Drupal\layout_builder\Form\LayoutBuilderEntityViewDisplayForm;
 use Drupal\layout_builder\Form\OverridesEntityForm;
@@ -83,6 +84,10 @@ function layout_builder_entity_type_alter(array &$entity_types) {
       $entity_type->setFormClass('layout_builder', OverridesEntityForm::class);
     }
   }
+
+  if (isset($entity_types['block_content'])) {
+    $entity_types['block_content']->setFormClass('layout_builder_translate', BlockContentInlineBlockTranslateForm::class);
+  }
 }
 
 /**
diff --git a/core/modules/layout_builder/layout_builder.post_update.php b/core/modules/layout_builder/layout_builder.post_update.php
index 04d2139cf7..e5e869fac3 100644
--- a/core/modules/layout_builder/layout_builder.post_update.php
+++ b/core/modules/layout_builder/layout_builder.post_update.php
@@ -7,7 +7,10 @@
 
 use Drupal\Core\Config\Entity\ConfigEntityUpdater;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\layout_builder\Entity\LayoutEntityDisplayInterface;
+use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
 
 /**
  * Implements hook_removed_post_updates().
@@ -39,6 +42,65 @@ function layout_builder_post_update_override_entity_form_controller() {
   // Empty post-update hook.
 }
 
+/**
+ * Adds the layout translation settings field.
+ */
+function layout_builder_post_update_add_translation_field() {
+  /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $field_manager */
+  $field_manager = \Drupal::service('entity_field.manager');
+  $field_map = $field_manager->getFieldMap();
+  foreach ($field_map as $entity_type_id => $field_infos) {
+    if (isset($field_infos[OverridesSectionStorage::FIELD_NAME]['bundles'])) {
+      $non_translatable_bundle_count = 0;
+      foreach ($field_infos[OverridesSectionStorage::FIELD_NAME]['bundles'] as $bundle) {
+        $bundles_not_added = [];
+        // The field map can contain stale information. If the field does not
+        // exist, ignore it. The field map will be rebuilt when the cache is
+        // cleared at the end of the update process.
+        if (!$field_config = FieldConfig::loadByName($entity_type_id, $bundle, OverridesSectionStorage::FIELD_NAME)) {
+          continue;
+        }
+        _layout_builder_add_translation_field($entity_type_id, $bundle);
+
+      }
+    }
+
+  }
+}
+
+/**
+ * Adds a layout translation field to a given bundle.
+ *
+ * @param string $entity_type_id
+ *   The entity type ID.
+ * @param string $bundle
+ *   The bundle.
+ */
+function _layout_builder_add_translation_field($entity_type_id, $bundle) {
+  $field_name = OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME;
+  $field = FieldConfig::loadByName($entity_type_id, $bundle, $field_name);
+  if (!$field) {
+    $field_storage = FieldStorageConfig::loadByName($entity_type_id, $field_name);
+    if (!$field_storage) {
+      $field_storage = FieldStorageConfig::create([
+        'entity_type' => $entity_type_id,
+        'field_name' => $field_name,
+        'type' => 'layout_translation',
+        'locked' => TRUE,
+      ]);
+      $field_storage->setTranslatable(TRUE);
+      $field_storage->save();
+    }
+
+    $field = FieldConfig::create([
+      'field_storage' => $field_storage,
+      'bundle' => $bundle,
+      'label' => t('Layout Labels'),
+    ]);
+    $field->save();
+  }
+}
+
 /**
  * Update view displays that use Layout Builder to add empty context mappings.
  */
diff --git a/core/modules/layout_builder/layout_builder.routing.yml b/core/modules/layout_builder/layout_builder.routing.yml
index 6dcf0c9f05..4f561b8e97 100644
--- a/core/modules/layout_builder/layout_builder.routing.yml
+++ b/core/modules/layout_builder/layout_builder.routing.yml
@@ -5,6 +5,7 @@ layout_builder.choose_section:
    _title: 'Choose a layout for this section'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'untranslated'
   options:
     _admin_route: TRUE
     parameters:
@@ -17,6 +18,7 @@ layout_builder.add_section:
     _controller: '\Drupal\layout_builder\Controller\AddSectionController::build'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'untranslated'
   options:
     _admin_route: TRUE
     parameters:
@@ -33,6 +35,7 @@ layout_builder.configure_section:
     plugin_id: null
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'untranslated'
   options:
     _admin_route: TRUE
     parameters:
@@ -45,6 +48,7 @@ layout_builder.remove_section:
     _form: '\Drupal\layout_builder\Form\RemoveSectionForm'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'untranslated'
   options:
     _admin_route: TRUE
     parameters:
@@ -58,6 +62,7 @@ layout_builder.choose_block:
     _title: 'Choose a block'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'untranslated'
   options:
     _admin_route: TRUE
     parameters:
@@ -71,6 +76,7 @@ layout_builder.add_block:
     _title: 'Configure block'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'untranslated'
   options:
     _admin_route: TRUE
     parameters:
@@ -84,6 +90,7 @@ layout_builder.choose_inline_block:
     _title: 'Add a new custom block'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'untranslated'
   options:
     _admin_route: TRUE
     parameters:
@@ -97,6 +104,35 @@ layout_builder.update_block:
     _title: 'Configure block'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'untranslated'
+  options:
+    _admin_route: TRUE
+    parameters:
+      section_storage:
+        layout_builder_tempstore: TRUE
+
+layout_builder.translate_block:
+  path: '/layout_builder/translate/block/{section_storage_type}/{section_storage}/{delta}/{region}/{uuid}/{langcode}'
+  defaults:
+    _form: '\Drupal\layout_builder\Form\TranslateBlockForm'
+    _title: 'Translate block'
+  requirements:
+    _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'translated'
+  options:
+    _admin_route: TRUE
+    parameters:
+      section_storage:
+        layout_builder_tempstore: TRUE
+
+layout_builder.translate_inline_block:
+  path: '/layout_builder/translate/inline-block/{section_storage_type}/{section_storage}/{delta}/{region}/{uuid}'
+  defaults:
+    _entity_form: 'block_content.layout_builder_translate'
+    _title: 'Translate block'
+  requirements:
+    _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'translated'
   options:
     _admin_route: TRUE
     parameters:
@@ -110,6 +146,7 @@ layout_builder.move_block_form:
     _form: '\Drupal\layout_builder\Form\MoveBlockForm'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'untranslated'
   options:
     _admin_route: TRUE
     parameters:
@@ -122,6 +159,7 @@ layout_builder.remove_block:
     _form: '\Drupal\layout_builder\Form\RemoveBlockForm'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_translation_access: 'untranslated'
   options:
     _admin_route: TRUE
     parameters:
diff --git a/core/modules/layout_builder/layout_builder.services.yml b/core/modules/layout_builder/layout_builder.services.yml
index e67a3b4d1a..8296df3758 100644
--- a/core/modules/layout_builder/layout_builder.services.yml
+++ b/core/modules/layout_builder/layout_builder.services.yml
@@ -6,6 +6,10 @@ services:
     class: Drupal\layout_builder\Access\LayoutBuilderAccessCheck
     tags:
       - { name: access_check, applies_to: _layout_builder_access }
+  access_check.entity.layout_builder_translation_access:
+    class: Drupal\layout_builder\Access\LayoutBuilderTranslationAccessCheck
+    tags:
+      - { name: access_check, applies_to: _layout_builder_translation_access }
   plugin.manager.layout_builder.section_storage:
     class: Drupal\layout_builder\SectionStorage\SectionStorageManager
     parent: default_plugin_manager
@@ -43,6 +47,11 @@ services:
     arguments: ['@current_user']
     tags:
       - { name: event_subscriber }
+  layout_builder.translate_block_component_subscriber:
+    class: Drupal\layout_builder\EventSubscriber\ComponentPluginTranslate
+    arguments: ['@language_manager', '@current_route_match']
+    tags:
+      - { name: event_subscriber }
   logger.channel.layout_builder:
     parent: logger.channel_base
     arguments: ['layout_builder']
diff --git a/core/modules/layout_builder/src/Element/LayoutBuilder.php b/core/modules/layout_builder/src/Element/LayoutBuilder.php
index 5c91b1e392..7d6b352060 100644
--- a/core/modules/layout_builder/src/Element/LayoutBuilder.php
+++ b/core/modules/layout_builder/src/Element/LayoutBuilder.php
@@ -2,7 +2,10 @@
 
 namespace Drupal\layout_builder\Element;
 
+use Drupal\Component\Plugin\DerivativeInspectionInterface;
 use Drupal\Core\Ajax\AjaxHelperTrait;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Messenger\MessengerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Plugin\PluginFormInterface;
 use Drupal\Core\Render\Element;
@@ -12,6 +15,7 @@
 use Drupal\layout_builder\Event\PrepareLayoutEvent;
 use Drupal\layout_builder\LayoutBuilderEvents;
 use Drupal\layout_builder\LayoutBuilderHighlightTrait;
+use Drupal\layout_builder\LayoutEntityHelperTrait;
 use Drupal\layout_builder\SectionStorageInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
@@ -29,6 +33,7 @@ class LayoutBuilder extends RenderElement implements ContainerFactoryPluginInter
   use AjaxHelperTrait;
   use LayoutBuilderContextTrait;
   use LayoutBuilderHighlightTrait;
+  use LayoutEntityHelperTrait;
 
   /**
    * The event dispatcher.
@@ -37,6 +42,13 @@ class LayoutBuilder extends RenderElement implements ContainerFactoryPluginInter
    */
   protected $eventDispatcher;
 
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
   /**
    * Constructs a new LayoutBuilder.
    *
@@ -48,11 +60,14 @@ class LayoutBuilder extends RenderElement implements ContainerFactoryPluginInter
    *   The plugin implementation definition.
    * @param \Symfony\Contracts\EventDispatcher\EventDispatcherInterface $event_dispatcher
    *   The event dispatcher service.
-   * @param \Drupal\Core\Messenger\MessengerInterface|null $messenger
-   *   The messenger service. This is no longer used and will be removed in
-   *   drupal:10.0.0.
+   * @param \Drupal\Core\Messenger\MessengerInterface|\Drupal\Core\Entity\EntityTypeManagerInterface|null $entity_type_manager
+   *   (optional) The entity type manager.
+   *
+   * @todo The current constructor signature is deprecated:
+   *   - The $entity_type_manager parameter is optional but should become
+   *   required. Deprecate in https://www.drupal.org/node/3058490.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, $event_dispatcher, $messenger = NULL) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, $event_dispatcher, $entity_type_manager = NULL) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
     if (!($event_dispatcher instanceof EventDispatcherInterface)) {
@@ -61,9 +76,15 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
     }
     $this->eventDispatcher = $event_dispatcher;
 
-    if ($messenger) {
+    if ($entity_type_manager instanceof MessengerInterface) {
       @trigger_error('Calling LayoutBuilder::__construct() with the $messenger argument is deprecated in drupal:9.1.0 and will be removed in drupal:10.0.0. See https://www.drupal.org/node/3152690', E_USER_DEPRECATED);
     }
+
+    if ($entity_type_manager === NULL || !$entity_type_manager instanceof EntityTypeManagerInterface) {
+      @trigger_error('The entity_type.manager service must be passed to \Drupal\layout_builder\Element\LayoutBuilder::__construct(). It was added in Drupal 8.8.0 and will be required before Drupal 9.0.0.', E_USER_DEPRECATED);
+      $entity_type_manager = \Drupal::service('entity_type.manager');
+    }
+    $this->entityTypeManager = $entity_type_manager;
   }
 
   /**
@@ -74,7 +95,8 @@ public static function create(ContainerInterface $container, array $configuratio
       $configuration,
       $plugin_id,
       $plugin_definition,
-      $container->get('event_dispatcher')
+      $container->get('event_dispatcher'),
+      $container->get('entity_type.manager')
     );
   }
 
@@ -111,6 +133,7 @@ public function preRender($element) {
    */
   protected function layout(SectionStorageInterface $section_storage) {
     $this->prepareLayout($section_storage);
+    $is_translation = static::isTranslation($section_storage);
 
     $output = [];
     if ($this->isAjax()) {
@@ -120,11 +143,15 @@ protected function layout(SectionStorageInterface $section_storage) {
     }
     $count = 0;
     for ($i = 0; $i < $section_storage->count(); $i++) {
-      $output[] = $this->buildAddSectionLink($section_storage, $count);
+      if (!$is_translation) {
+        $output[] = $this->buildAddSectionLink($section_storage, $count);
+      }
       $output[] = $this->buildAdministrativeSection($section_storage, $count);
       $count++;
     }
-    $output[] = $this->buildAddSectionLink($section_storage, $count);
+    if (!$is_translation) {
+      $output[] = $this->buildAddSectionLink($section_storage, $count);
+    }
     $output['#attached']['library'][] = 'layout_builder/drupal.layout_builder';
     // As the Layout Builder UI is typically displayed using the frontend theme,
     // it is not marked as an administrative page at the route level even though
@@ -136,6 +163,7 @@ protected function layout(SectionStorageInterface $section_storage) {
     $output['#attributes']['class'][] = 'layout-builder';
     // Mark this UI as uncacheable.
     $output['#cache']['max-age'] = 0;
+
     return $output;
   }
 
@@ -234,6 +262,8 @@ protected function buildAdministrativeSection(SectionStorageInterface $section_s
     $section = $section_storage->getSection($delta);
 
     $layout = $section->getLayout($this->getPopulatedContexts($section_storage));
+    $sections_editable = !static::isTranslation($section_storage);
+    $layout = $section->getLayout();
     $layout_settings = $section->getLayoutSettings();
     $section_label = !empty($layout_settings['label']) ? $layout_settings['label'] : $this->t('Section @section', ['@section' => $delta + 1]);
 
@@ -244,33 +274,19 @@ protected function buildAdministrativeSection(SectionStorageInterface $section_s
     foreach ($layout_definition->getRegions() as $region => $info) {
       if (!empty($build[$region])) {
         foreach (Element::children($build[$region]) as $uuid) {
-          $build[$region][$uuid]['#attributes']['class'][] = 'js-layout-builder-block';
+          if ($sections_editable) {
+            $build[$region][$uuid]['#attributes']['class'][] = 'js-layout-builder-block';
+          }
           $build[$region][$uuid]['#attributes']['class'][] = 'layout-builder-block';
           $build[$region][$uuid]['#attributes']['data-layout-block-uuid'] = $uuid;
           $build[$region][$uuid]['#attributes']['data-layout-builder-highlight-id'] = $this->blockUpdateHighlightId($uuid);
-          $build[$region][$uuid]['#contextual_links'] = [
-            'layout_builder_block' => [
-              'route_parameters' => [
-                'section_storage_type' => $storage_type,
-                'section_storage' => $storage_id,
-                'delta' => $delta,
-                'region' => $region,
-                'uuid' => $uuid,
-              ],
-              // Add metadata about the current operations available in
-              // contextual links. This will invalidate the client-side cache of
-              // links that were cached before the 'move' link was added.
-              // @see layout_builder.links.contextual.yml
-              'metadata' => [
-                'operations' => 'move:update:remove',
-              ],
-            ],
-          ];
+          $build[$region][$uuid]['#contextual_links'] = $this->createContextualLinkElement($section_storage, $delta, $region, $uuid);
         }
       }
 
       $build[$region]['layout_builder_add_block']['link'] = [
         '#type' => 'link',
+        '#access' => $sections_editable,
         // Add one to the current delta since it is zero-indexed.
         '#title' => $this->t('Add block <span class="visually-hidden">in @section, @region region</span>', ['@section' => $section_label, '@region' => $region_labels[$region]]),
         '#url' => Url::fromRoute('layout_builder.choose_block',
@@ -346,6 +362,7 @@ protected function buildAdministrativeSection(SectionStorageInterface $section_s
       ],
       'remove' => [
         '#type' => 'link',
+        '#access' => $sections_editable,
         '#title' => $this->t('Remove @section', ['@section' => $section_label]),
         '#url' => Url::fromRoute('layout_builder.remove_section', [
           'section_storage_type' => $storage_type,
@@ -370,8 +387,8 @@ protected function buildAdministrativeSection(SectionStorageInterface $section_s
       ],
       'configure' => [
         '#type' => 'link',
+        '#access' => $layout instanceof PluginFormInterface && $sections_editable,
         '#title' => $this->t('Configure @section', ['@section' => $section_label]),
-        '#access' => $layout instanceof PluginFormInterface,
         '#url' => Url::fromRoute('layout_builder.configure_section', [
           'section_storage_type' => $storage_type,
           'section_storage' => $storage_id,
@@ -391,4 +408,67 @@ protected function buildAdministrativeSection(SectionStorageInterface $section_s
     ];
   }
 
+  /**
+   * Creates contextual link element for a component.
+   *
+   * @param \Drupal\layout_builder\SectionStorageInterface $section_storage
+   *   The section storage.
+   * @param $delta
+   *   The section delta.
+   * @param $region
+   *   The region.
+   * @param $uuid
+   *   The UUID of the component.
+   * @param $is_translation
+   *   Whether the section storage is handling a translation.
+   *
+   * @return array|null
+   *   The contextual link render array or NULL if none.
+   */
+  protected function createContextualLinkElement(SectionStorageInterface $section_storage, $delta, $region, $uuid) {
+    $section = $section_storage->getSection($delta);
+    $contextual_link_settings = [
+      'route_parameters' => [
+        'section_storage_type' => $section_storage->getStorageType(),
+        'section_storage' => $section_storage->getStorageId(),
+        'delta' => $delta,
+        'region' => $region,
+        'uuid' => $uuid,
+      ],
+    ];
+    if (static::isTranslation($section_storage)) {
+      $contextual_group = 'layout_builder_block_translation';
+      $component = $section->getComponent($uuid);
+      /** @var \Drupal\Core\Language\LanguageInterface $language */
+      if ($language = $section_storage->getTranslationLanguage()) {
+        $contextual_link_settings['route_parameters']['langcode'] = $language->getId();
+      }
+
+      /** @var \Drupal\layout_builder\Plugin\Block\InlineBlock $plugin */
+      $plugin = $component->getPlugin();
+      if ($plugin instanceof DerivativeInspectionInterface && $plugin->getBaseId() === 'inline_block') {
+        $configuration = $plugin->getConfiguration();
+        /** @var \Drupal\block_content\Entity\BlockContent $block */
+        $block = $this->entityTypeManager->getStorage('block_content')
+          ->loadRevision($configuration['block_revision_id']);
+        if ($block->isTranslatable()) {
+          $contextual_group = 'layout_builder_inline_block_translation';
+        }
+      }
+    }
+    else {
+      $contextual_group = 'layout_builder_block';
+      // Add metadata about the current operations available in
+      // contextual links. This will invalidate the client-side cache of
+      // links that were cached before the 'move' link was added.
+      // @see layout_builder.links.contextual.yml
+      $contextual_link_settings['metadata'] = [
+        'operations' => 'move:update:remove',
+      ];
+    }
+    return [
+      $contextual_group => $contextual_link_settings,
+    ];
+  }
+
 }
diff --git a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
index 70e86f6999..9fe99f00dc 100644
--- a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
+++ b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
@@ -217,6 +217,41 @@ protected function addSectionField($entity_type_id, $bundle, $field_name) {
       $field->setTranslatable(FALSE);
       $field->save();
     }
+    $this->addTranslationField($entity_type_id, $bundle, OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME);
+  }
+
+  /**
+   * Adds a layout translation field to a given bundle.
+   *
+   * @param string $entity_type_id
+   *   The entity type ID.
+   * @param string $bundle
+   *   The bundle.
+   * @param string $field_name
+   *   The name for the translation field.
+   */
+  protected function addTranslationField($entity_type_id, $bundle, $field_name) {
+    $field = FieldConfig::loadByName($entity_type_id, $bundle, $field_name);
+    if (!$field) {
+      $field_storage = FieldStorageConfig::loadByName($entity_type_id, $field_name);
+      if (!$field_storage) {
+        $field_storage = FieldStorageConfig::create([
+          'entity_type' => $entity_type_id,
+          'field_name' => $field_name,
+          'type' => 'layout_translation',
+          'locked' => TRUE,
+        ]);
+        $field_storage->setTranslatable(TRUE);
+        $field_storage->save();
+      }
+
+      $field = FieldConfig::create([
+        'field_storage' => $field_storage,
+        'bundle' => $bundle,
+        'label' => t('Layout Labels'),
+      ]);
+      $field->save();
+    }
   }
 
   /**
diff --git a/core/modules/layout_builder/src/Form/OverridesEntityForm.php b/core/modules/layout_builder/src/Form/OverridesEntityForm.php
index 29f940bdcc..12c36d5ca8 100644
--- a/core/modules/layout_builder/src/Form/OverridesEntityForm.php
+++ b/core/modules/layout_builder/src/Form/OverridesEntityForm.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\layout_builder\LayoutEntityHelperTrait;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
 use Drupal\layout_builder\OverridesSectionStorageInterface;
 use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
@@ -24,6 +25,7 @@
 class OverridesEntityForm extends ContentEntityForm {
 
   use PreviewToggleTrait;
+  use LayoutEntityHelperTrait;
 
   /**
    * Layout tempstore repository.
@@ -82,7 +84,10 @@ protected function init(FormStateInterface $form_state) {
     parent::init($form_state);
 
     $form_display = EntityFormDisplay::collectRenderDisplay($this->entity, $this->getOperation(), FALSE);
-    $form_display->setComponent(OverridesSectionStorage::FIELD_NAME, [
+    $field_name = static::isTranslation($this->sectionStorage) ?
+      OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME :
+      OverridesSectionStorage::FIELD_NAME;
+    $form_display->setComponent($field_name, [
       'type' => 'layout_builder_widget',
       'weight' => -10,
       'settings' => [],
@@ -103,6 +108,7 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt
     //   restricts all access to the field, explicitly allow access here until
     //   https://www.drupal.org/node/2942975 is resolved.
     $form[OverridesSectionStorage::FIELD_NAME]['#access'] = TRUE;
+    $form[OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME]['#access'] = TRUE;
 
     $form['layout_builder_message'] = $this->buildMessage($section_storage->getContextValue('entity'), $section_storage);
     return $form;
@@ -199,14 +205,16 @@ protected function actions(array $form, FormStateInterface $form_state) {
       '#submit' => ['::redirectOnSubmit'],
       '#redirect' => 'discard_changes',
     ];
-    // @todo This button should be conditionally displayed, see
-    //   https://www.drupal.org/node/2917777.
-    $actions['revert'] = [
-      '#type' => 'submit',
-      '#value' => $this->t('Revert to defaults'),
-      '#submit' => ['::redirectOnSubmit'],
-      '#redirect' => 'revert',
-    ];
+    if (!static::isTranslation($this->sectionStorage)) {
+      // @todo This button should be conditionally displayed, see
+      //   https://www.drupal.org/node/2917777.
+      $actions['revert'] = [
+        '#type' => 'submit',
+        '#value' => $this->t('Revert to defaults'),
+        '#submit' => ['::redirectOnSubmit'],
+        '#redirect' => 'revert',
+      ];
+    }
     $actions['preview_toggle'] = $this->buildContentPreviewToggle();
     return $actions;
   }
diff --git a/core/modules/layout_builder/src/InlineBlockEntityOperations.php b/core/modules/layout_builder/src/InlineBlockEntityOperations.php
index ad255cd6fe..92189b07d9 100644
--- a/core/modules/layout_builder/src/InlineBlockEntityOperations.php
+++ b/core/modules/layout_builder/src/InlineBlockEntityOperations.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\layout_builder;
 
+use Drupal\Core\Block\BlockManagerInterface;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
@@ -42,26 +43,39 @@ class InlineBlockEntityOperations implements ContainerInjectionInterface {
   protected $entityTypeManager;
 
   /**
-   * Constructs a new EntityOperations object.
+   * The block plugin manager.
    *
-   * @todo This constructor has one optional parameter, $section_storage_manager
-   *    and one totally unused $database parameter. Deprecate the current
-   *    constructor signature in https://www.drupal.org/node/3031492 after the
-   *    general policy for constructor backwards compatibility is determined in
-   *    https://www.drupal.org/node/3030640.
+   * @var \Drupal\Core\Block\BlockManagerInterface
+   */
+  protected $blockManager;
+
+  /**
+   * Constructs a new EntityOperations object.
    *
    * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
    *   The entity type manager service.
    * @param \Drupal\layout_builder\InlineBlockUsageInterface $usage
    *   Inline block usage tracking service.
    * @param \Drupal\layout_builder\SectionStorage\SectionStorageManagerInterface $section_storage_manager
-   *   (optional) The section storage manager.
+   *   The section storage manager.
+   * @param \Drupal\Core\Block\BlockManagerInterface|null $block_manager
+   *   (optional) The block manager;
+   *
+   * @todo This constructor has one optional parameter, $block_manager. Deprecate the current
+   *    constructor signature in https://www.drupal.org/node/3031492 after the
+   *    general policy for constructor backwards compatibility is determined in
+   *    https://www.drupal.org/node/3030640.
    */
-  public function __construct(EntityTypeManagerInterface $entityTypeManager, InlineBlockUsageInterface $usage, SectionStorageManagerInterface $section_storage_manager) {
+  public function __construct(EntityTypeManagerInterface $entityTypeManager, InlineBlockUsageInterface $usage, SectionStorageManagerInterface $section_storage_manager, BlockManagerInterface $block_manager = NULL) {
     $this->entityTypeManager = $entityTypeManager;
     $this->blockContentStorage = $entityTypeManager->getStorage('block_content');
     $this->usage = $usage;
     $this->sectionStorageManager = $section_storage_manager;
+    if ($block_manager === NULL) {
+      @trigger_error('The plugin.manager.block service must be passed to \Drupal\layout_builder\InlineBlockEntityOperations::__construct(). It was added in Drupal 9.1.0 and will be required before Drupal 10.0.0.', E_USER_DEPRECATED);
+      $block_manager = \Drupal::service('plugin.manager.block');
+    }
+    $this->blockManager = $block_manager;
   }
 
   /**
@@ -71,7 +85,8 @@ public static function create(ContainerInterface $container) {
     return new static(
       $container->get('entity_type.manager'),
       $container->get('inline_block.usage'),
-      $container->get('plugin.manager.layout_builder.section_storage')
+      $container->get('plugin.manager.layout_builder.section_storage'),
+      $container->get('plugin.manager.block')
     );
   }
 
@@ -167,8 +182,17 @@ public function handlePreSave(EntityInterface $entity) {
       // revisions, when a block is modified, it must always result in the
       // creation of a new block revision.
       $new_revision = $entity instanceof RevisionableInterface;
+      $section_storage = $this->getSectionStorageForEntity($entity);
       foreach ($this->getInlineBlockComponents($sections) as $component) {
-        $this->saveInlineBlockComponent($entity, $component, $new_revision, $duplicate_blocks);
+        if (static::isTranslation($section_storage)) {
+          $translated_component_configuration = $section_storage->getTranslatedComponentConfiguration($component->getUuid());
+          if (isset($translated_component_configuration['block_serialized'])) {
+            $this->saveTranslatedInlineBlock($entity, $component->getUuid(), $translated_component_configuration, $new_revision);
+          }
+        }
+        else {
+          $this->saveInlineBlockComponent($entity, $component, $new_revision, $duplicate_blocks);
+        }
       }
     }
     $this->removeUnusedForEntityOnSave($entity);
@@ -260,4 +284,37 @@ protected function saveInlineBlockComponent(EntityInterface $entity, SectionComp
     $component->setConfiguration($post_save_configuration);
   }
 
+  /**
+   * Saves a translated inline block.
+   *
+   * @param \Drupal\Core\Entity\EntityInterface $entity
+   *   The entity with the layout.
+   * @param string $component_uuid
+   *   The component UUID.
+   * @param array $translated_component_configuration
+   *   The translated component configuration.
+   * @param bool $new_revision
+   *   Whether a new revision of the block should be created.
+   */
+  protected function saveTranslatedInlineBlock(EntityInterface $entity, $component_uuid, array $translated_component_configuration, $new_revision) {
+    /** @var \Drupal\block_content\BlockContentInterface $block */
+    $block = unserialize($translated_component_configuration['block_serialized']);
+    // Create a InlineBlock plugin from the translated configuration in order to
+    // save the block.
+    /** @var \Drupal\layout_builder\Plugin\Block\InlineBlock $plugin */
+    $plugin = $this->blockManager->createInstance('inline_block:' . $block->bundle(), $translated_component_configuration);
+    $plugin->saveBlockContent($new_revision);
+    // Remove serialized block after the block has been saved.
+    unset($translated_component_configuration['block_serialized']);
+
+    // Update the block_revision_id in the translated configuration which may
+    // have changed after saving the block.
+    $configuration = $plugin->getConfiguration();
+    $translated_component_configuration['block_revision_id'] = $configuration['block_revision_id'];
+
+    /** @var \Drupal\layout_builder\TranslatableSectionStorageInterface $section_storage */
+    $section_storage = $this->getSectionStorageForEntity($entity);
+    $section_storage->setTranslatedComponentConfiguration($component_uuid, $translated_component_configuration);
+  }
+
 }
diff --git a/core/modules/layout_builder/src/LayoutEntityHelperTrait.php b/core/modules/layout_builder/src/LayoutEntityHelperTrait.php
index 1abf322178..4ec2e83513 100644
--- a/core/modules/layout_builder/src/LayoutEntityHelperTrait.php
+++ b/core/modules/layout_builder/src/LayoutEntityHelperTrait.php
@@ -155,4 +155,17 @@ private function sectionStorageManager() {
     return $this->sectionStorageManager ?: \Drupal::service('plugin.manager.layout_builder.section_storage');
   }
 
+  /**
+   * Determines if the sections is for a translation.
+   *
+   * @param \Drupal\layout_builder\SectionStorageInterface $section_storage
+   *   The section storage.
+   *
+   * @return bool
+   *   TRUE if the section storage is for translation otherwise false.
+   */
+  protected static function isTranslation(SectionStorageInterface $section_storage) {
+    return $section_storage instanceof TranslatableSectionStorageInterface && !$section_storage->isDefaultTranslation();
+  }
+
 }
diff --git a/core/modules/layout_builder/src/Plugin/Block/InlineBlock.php b/core/modules/layout_builder/src/Plugin/Block/InlineBlock.php
index 9f347174d3..75cea21c90 100644
--- a/core/modules/layout_builder/src/Plugin/Block/InlineBlock.php
+++ b/core/modules/layout_builder/src/Plugin/Block/InlineBlock.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Block\BlockBase;
 use Drupal\Core\Entity\Entity\EntityFormDisplay;
 use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Form\SubformStateInterface;
@@ -61,6 +62,13 @@ class InlineBlock extends BlockBase implements ContainerFactoryPluginInterface,
    */
   protected $isNew = TRUE;
 
+  /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
   /**
    * The current user.
    *
@@ -83,8 +91,10 @@ class InlineBlock extends BlockBase implements ContainerFactoryPluginInterface,
    *   The entity display repository.
    * @param \Drupal\Core\Session\AccountInterface $current_user
    *   The current user.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, EntityDisplayRepositoryInterface $entity_display_repository, AccountInterface $current_user) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, EntityDisplayRepositoryInterface $entity_display_repository, AccountInterface $current_user, EntityRepositoryInterface $entity_repository) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
     $this->entityTypeManager = $entity_type_manager;
@@ -93,6 +103,7 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
     if (!empty($this->configuration['block_revision_id']) || !empty($this->configuration['block_serialized'])) {
       $this->isNew = FALSE;
     }
+    $this->entityRepository = $entity_repository;
   }
 
   /**
@@ -105,7 +116,8 @@ public static function create(ContainerInterface $container, array $configuratio
       $plugin_definition,
       $container->get('entity_type.manager'),
       $container->get('entity_display.repository'),
-      $container->get('current_user')
+      $container->get('current_user'),
+      $container->get('entity.repository')
     );
   }
 
@@ -125,6 +137,10 @@ public function defaultConfiguration() {
    */
   public function blockForm($form, FormStateInterface $form_state) {
     $block = $this->getEntity();
+    if (!$this->isNew && !$block->isNew() && empty($this->configuration['block_serialized'])) {
+      // Get the active block for editing purposes.
+      $block = $this->entityRepository->getActive('block_content', $block->id());
+    }
 
     // Add the entity form display in a process callback so that #parents can
     // be successfully propagated to field widgets.
@@ -165,6 +181,9 @@ public static function processBlockForm(array $element, FormStateInterface $form
     EntityFormDisplay::collectRenderDisplay($block, 'edit')->buildForm($block, $element, $form_state);
     $element['revision_log']['#access'] = FALSE;
     $element['info']['#access'] = FALSE;
+    if (isset($element['langcode'])) {
+      $element['langcode']['#access'] = FALSE;
+    }
     return $element;
   }
 
diff --git a/core/modules/layout_builder/src/Plugin/Field/FieldWidget/LayoutBuilderWidget.php b/core/modules/layout_builder/src/Plugin/Field/FieldWidget/LayoutBuilderWidget.php
index 0195065ff5..1e5251689e 100644
--- a/core/modules/layout_builder/src/Plugin/Field/FieldWidget/LayoutBuilderWidget.php
+++ b/core/modules/layout_builder/src/Plugin/Field/FieldWidget/LayoutBuilderWidget.php
@@ -5,6 +5,8 @@
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\WidgetBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
+use Drupal\layout_builder\TranslatableSectionStorageInterface;
 
 /**
  * A widget to display the layout form.
@@ -15,6 +17,7 @@
  *   description = @Translation("A field widget for Layout Builder."),
  *   field_types = {
  *     "layout_section",
+ *     "layout_translation"
  *   },
  *   multiple_values = TRUE,
  * )
@@ -60,7 +63,19 @@ public function extractFormValues(FieldItemListInterface $items, array $form, Fo
       return;
     }
 
-    $items->setValue($this->getSectionStorage($form_state)->getSections());
+    $field_name = $this->fieldDefinition->getName();
+    $section_storage = $this->getSectionStorage($form_state);
+    if ($field_name === OverridesSectionStorage::FIELD_NAME) {
+      $items->setValue($section_storage->getSections());
+    }
+    elseif ($field_name === OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME && $section_storage instanceof TranslatableSectionStorageInterface) {
+      // The translated configuration is stored in single value field because it
+      // stores configuration for components in all sections.
+      $items->set(0, $section_storage->getTranslatedConfiguration());
+    }
+    else {
+      throw new \LogicException("Widget used with unexpected field, $field_name for section storage: " . $section_storage->getStorageType());
+    }
   }
 
   /**
diff --git a/core/modules/layout_builder/src/Plugin/SectionStorage/OverridesSectionStorage.php b/core/modules/layout_builder/src/Plugin/SectionStorage/OverridesSectionStorage.php
index 219a3c6a0a..d497e10bc1 100644
--- a/core/modules/layout_builder/src/Plugin/SectionStorage/OverridesSectionStorage.php
+++ b/core/modules/layout_builder/src/Plugin/SectionStorage/OverridesSectionStorage.php
@@ -19,6 +19,7 @@
 use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
 use Drupal\layout_builder\OverridesSectionStorageInterface;
 use Drupal\layout_builder\SectionStorage\SectionStorageManagerInterface;
+use Drupal\layout_builder\TranslatableSectionStorageInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\Routing\RouteCollection;
 
@@ -46,15 +47,22 @@
  * @internal
  *   Plugin classes are internal.
  */
-class OverridesSectionStorage extends SectionStorageBase implements ContainerFactoryPluginInterface, OverridesSectionStorageInterface, SectionStorageLocalTaskProviderInterface {
+class OverridesSectionStorage extends SectionStorageBase implements ContainerFactoryPluginInterface, OverridesSectionStorageInterface, TranslatableSectionStorageInterface, SectionStorageLocalTaskProviderInterface {
 
   /**
-   * The field name used by this storage.
+   * The field name for layout sections used by this storage.
    *
    * @var string
    */
   const FIELD_NAME = 'layout_builder__layout';
 
+  /**
+   * The field name for translated configuration used by this storage.
+   *
+   * @var string
+   */
+  const TRANSLATED_CONFIGURATION_FIELD_NAME = 'layout_builder__translation';
+
   /**
    * The entity type manager.
    *
@@ -380,7 +388,12 @@ public function access($operation, AccountInterface $account = NULL, $return_as_
   protected function handleTranslationAccess(AccessResult $result, $operation, AccountInterface $account) {
     $entity = $this->getEntity();
     // Access is always denied on non-default translations.
-    return $result->andIf(AccessResult::allowedIf(!($entity instanceof TranslatableInterface && !$entity->isDefaultTranslation())))->addCacheableDependency($entity);
+    $field_config = $entity->getFieldDefinition(static::FIELD_NAME)->getConfig($entity->bundle());
+    // Access is allow if one of the following conditions is true:
+    // 1. This is the default translation.
+    // 2. The entity is translatable and the layout is overridden and the layout
+    //    field is not translatable.
+    return $result->andIf(AccessResult::allowedIf($this->isDefaultTranslation() || ($entity instanceof TranslatableInterface && $this->isOverridden() && !$field_config->isTranslatable())))->addCacheableDependency($entity)->addCacheableDependency($field_config);
   }
 
   /**
@@ -403,4 +416,84 @@ public function isOverridden() {
     return !empty($this->getSections());
   }
 
+  /**
+   * Indicates if the layout is translatable.
+   *
+   * @return bool
+   *   TRUE if the layout is translatable, otherwise FALSE.
+   */
+  protected function isTranslatable() {
+    $entity = $this->getEntity();
+    if ($entity instanceof TranslatableInterface) {
+      return $entity->isTranslatable();
+    }
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isDefaultTranslation() {
+    if ($this->isTranslatable()) {
+      /** @var \Drupal\Core\Entity\TranslatableInterface $entity */
+      $entity = $this->getEntity();
+      return $entity->isDefaultTranslation();
+    }
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setTranslatedComponentConfiguration($uuid, array $configuration) {
+    if (!$this->getEntity()->get(OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME)->isEmpty()) {
+      $translation_settings = $this->getEntity()->get(OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME)->getValue()[0];
+    }
+    $translation_settings['value']['components'][$uuid] = $configuration;
+    $this->getEntity()->set(OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME, [$translation_settings]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTranslatedComponentConfiguration($uuid) {
+    if ($this->getEntity()->get(OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME)->isEmpty()) {
+      return [];
+    }
+    $translation_settings = $this->getEntity()->get(OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME)->getValue()[0];
+    return isset($translation_settings['value']['components'][$uuid]) ? $translation_settings['value']['components'][$uuid] : [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTranslatedConfiguration() {
+    if ($this->getEntity()->get(OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME)->isEmpty()) {
+      return [];
+    }
+    return $this->getEntity()->get(OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME)->getValue()[0];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTranslationLanguage() {
+    if (!$this->isDefaultTranslation()) {
+      return $this->getEntity()->language();
+    }
+    return NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSourceLanguage() {
+    if (!$this->isDefaultTranslation()) {
+      /** @var \Drupal\Core\Entity\TranslatableInterface $entity */
+      $entity = $this->getEntity();
+      return $entity->getUntranslated()->language();
+    }
+    return NULL;
+  }
+
 }
diff --git a/core/modules/layout_builder/tests/src/Functional/Jsonapi/LayoutBuilderEntityViewDisplayTest.php b/core/modules/layout_builder/tests/src/Functional/Jsonapi/LayoutBuilderEntityViewDisplayTest.php
index e5f91a4aca..0ff126e379 100644
--- a/core/modules/layout_builder/tests/src/Functional/Jsonapi/LayoutBuilderEntityViewDisplayTest.php
+++ b/core/modules/layout_builder/tests/src/Functional/Jsonapi/LayoutBuilderEntityViewDisplayTest.php
@@ -44,6 +44,7 @@ protected function getExpectedDocument() {
     $document = parent::getExpectedDocument();
     array_unshift($document['data']['attributes']['dependencies']['module'], 'layout_builder');
     $document['data']['attributes']['hidden'][OverridesSectionStorage::FIELD_NAME] = TRUE;
+    $document['data']['attributes']['hidden'][OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME] = TRUE;
     $document['data']['attributes']['third_party_settings']['layout_builder'] = [
       'enabled' => TRUE,
       'allow_custom' => TRUE,
diff --git a/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTranslationTest.php b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTranslationTest.php
index a4873d5d7b..eb7e2dc238 100644
--- a/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTranslationTest.php
+++ b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTranslationTest.php
@@ -2,16 +2,20 @@
 
 namespace Drupal\Tests\layout_builder\Functional;
 
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
 use Drupal\Tests\content_translation\Functional\ContentTranslationTestBase;
 use Drupal\Core\Entity\Entity\EntityViewDisplay;
 use Drupal\Core\Url;
 
 /**
- * Tests that the Layout Builder works with translated content.
+ * Tests that the Layout Builder UI works with translated content.
  *
  * @group layout_builder
  */
 class LayoutBuilderTranslationTest extends ContentTranslationTestBase {
+  use TranslationTestTrait;
 
   /**
    * {@inheritdoc}
@@ -46,32 +50,57 @@ protected function setUp(): void {
   }
 
   /**
-   * Tests that layout overrides work when created after a translation.
+   * Tests that the Layout Builder UI works with translated content.
    */
-  public function testTranslationBeforeLayoutOverride() {
+  public function testLayoutPerTranslation() {
     $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
 
-    $this->addEntityTranslation();
-
-    $entity_url = $this->entity->toUrl()->toString();
+    $entity_url = $this->entity->toUrl('canonical')->toString();
     $language = \Drupal::languageManager()->getLanguage($this->langcodes[2]);
     $translated_entity_url = $this->entity->toUrl('canonical', ['language' => $language])->toString();
+    $layout_url = $entity_url . '/layout';
     $translated_layout_url = $translated_entity_url . '/layout';
 
     $this->drupalGet($entity_url);
     $assert_session->pageTextNotContains('The translated field value');
     $assert_session->pageTextContains('The untranslated field value');
-    $assert_session->linkExists('Layout');
 
     $this->drupalGet($translated_entity_url);
     $assert_session->pageTextNotContains('The untranslated field value');
     $assert_session->pageTextContains('The translated field value');
-    $assert_session->linkNotExists('Layout');
 
+    $this->drupalGet($layout_url);
+    $assert_session->pageTextNotContains('The translated field value');
+    $assert_session->pageTextContains('The untranslated field value');
+
+    // If there is not a layout override the layout translation is not
+    // accessible.
     $this->drupalGet($translated_layout_url);
     $assert_session->pageTextContains('Access denied');
 
-    $this->addLayoutOverride();
+    // Ensure that the tempstore varies per-translation.
+    $this->drupalGet($layout_url);
+    $assert_session->pageTextNotContains('The translated field value');
+    $assert_session->pageTextContains('The untranslated field value');
+
+    // Adjust the layout of the original entity.
+    $assert_session->linkExists('Add block');
+    $this->clickLink('Add block');
+    $assert_session->linkExists('Powered by Drupal');
+    $this->clickLink('Powered by Drupal');
+    $page->pressButton('Add block');
+
+    $assert_session->pageTextContains('Powered by Drupal');
+
+    // Confirm the tempstore for the translated layout is not affected.
+    $this->drupalGet($translated_layout_url);
+    $assert_session->pageTextContains('Access denied');
+
+    $this->drupalGet($layout_url);
+    $assert_session->pageTextContains('Powered by Drupal');
+    $assert_session->buttonExists('Save layout');
+    $page->pressButton('Save layout');
 
     $this->drupalGet($entity_url);
     $assert_session->pageTextNotContains('The translated field value');
@@ -83,43 +112,121 @@ public function testTranslationBeforeLayoutOverride() {
     $assert_session->pageTextNotContains('The untranslated field value');
     $assert_session->pageTextContains('The translated field value');
     $assert_session->pageTextContains('Powered by Drupal');
+
+    // Confirm that layout translation page is accessible once the untranslated
+    // entity has a override.
+    $this->drupalGet($translated_layout_url);
+    $assert_session->pageTextNotContains('Access denied');
+    $assert_session->pageTextNotContains('The untranslated field value');
+    $assert_session->pageTextContains('The translated field value');
+    $assert_session->pageTextContains('Powered by Drupal');
+    $assert_session->buttonExists('Save layout');
+
+    $this->assertNonTranslationActionsRemoved();
+
   }
 
   /**
-   * Tests that layout overrides work when created before a translation.
+   * Tests that access is denied to a layout translation if there is override.
    */
-  public function testLayoutOverrideBeforeTranslation() {
+  public function testLayoutTranslationNoOverride() {
     $assert_session = $this->assertSession();
 
-    $entity_url = $this->entity->toUrl()->toString();
+    $entity_url = $this->entity->toUrl('canonical')->toString();
     $language = \Drupal::languageManager()->getLanguage($this->langcodes[2]);
 
-    $this->addLayoutOverride();
+    $translated_entity_url = $this->entity->toUrl('canonical', ['language' => $language])->toString();
+    $translated_layout_url = $translated_entity_url . '/layout';
 
     $this->drupalGet($entity_url);
     $assert_session->pageTextNotContains('The translated field value');
     $assert_session->pageTextContains('The untranslated field value');
-    $assert_session->pageTextContains('Powered by Drupal');
-    $assert_session->linkExists('Layout');
+    $this->drupalGet($translated_entity_url);
+    $assert_session->pageTextNotContains('The untranslated field value');
+    $assert_session->pageTextContains('The translated field value');
+
+    // If there is not a layout override the layout translation is not
+    // accessible.
+    $this->drupalGet($translated_layout_url);
+    $assert_session->pageTextContains('Access denied');
+  }
+
+  /**
+   * Tests access to layout translation if the layout field is translatable.
+   */
+  public function testTranslatableLayoutField() {
+    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
+
+    $field_storage = FieldStorageConfig::loadByName('entity_test_mul', OverridesSectionStorage::FIELD_NAME);
+    $this->assertNotEmpty($field_storage);
+    $field_storage->setTranslatable(TRUE);
+    $this->assertNotEmpty($field_storage->save());
+    $field_config = FieldConfig::loadByName('entity_test_mul', 'entity_test_mul', OverridesSectionStorage::FIELD_NAME);
+    $this->assertNotEmpty($field_config);
+    $field_config->setTranslatable(TRUE);
+    $this->assertNotEmpty($field_config->save());
 
-    $this->addEntityTranslation();
+    $entity_url = $this->entity->toUrl('canonical')->toString();
+    $layout_url = $entity_url . '/layout';
+    $language = \Drupal::languageManager()->getLanguage($this->langcodes[2]);
     $translated_entity_url = $this->entity->toUrl('canonical', ['language' => $language])->toString();
     $translated_layout_url = $translated_entity_url . '/layout';
 
     $this->drupalGet($entity_url);
     $assert_session->pageTextNotContains('The translated field value');
     $assert_session->pageTextContains('The untranslated field value');
-    $assert_session->pageTextContains('Powered by Drupal');
-    $assert_session->linkExists('Layout');
 
     $this->drupalGet($translated_entity_url);
     $assert_session->pageTextNotContains('The untranslated field value');
     $assert_session->pageTextContains('The translated field value');
+
+    // If there is not a layout override the layout translation is not
+    // accessible.
+    $this->drupalGet($translated_layout_url);
+    $assert_session->pageTextContains('Access denied');
+
+    // Ensure that the tempstore varies per-translation.
+    $this->drupalGet($layout_url);
+    $assert_session->pageTextNotContains('The translated field value');
+    $assert_session->pageTextContains('The untranslated field value');
+
+    // Adjust the layout of the original entity.
+    $assert_session->linkExists('Add block');
+    $this->clickLink('Add block');
+    $assert_session->linkExists('Powered by Drupal');
+    $this->clickLink('Powered by Drupal');
+    $page->pressButton('Add block');
+
     $assert_session->pageTextContains('Powered by Drupal');
-    $assert_session->linkNotExists('Layout');
 
+    // Confirm the tempstore for the translated layout is not affected.
     $this->drupalGet($translated_layout_url);
     $assert_session->pageTextContains('Access denied');
+
+    $this->drupalGet($layout_url);
+    $assert_session->pageTextContains('Powered by Drupal');
+    $assert_session->buttonExists('Save layout');
+    $page->pressButton('Save layout');
+
+    $this->drupalGet($entity_url);
+    $assert_session->pageTextContains('Powered by Drupal');
+
+    // Confirm the translation layout is still not allowed.
+    $this->drupalGet($translated_layout_url);
+
+    $assert_session->pageTextContains('Access denied');
+
+    // Update the layout field to be not translatable.
+    $field_config = FieldConfig::loadByName('entity_test_mul', 'entity_test_mul', OverridesSectionStorage::FIELD_NAME);
+    $this->assertNotEmpty($field_config);
+    $field_config->setTranslatable(FALSE);
+    $this->assertNotEmpty($field_config->save());
+
+    // Confirm the translation layout is still not allowed.
+    $this->drupalGet($translated_layout_url);
+    $assert_session->pageTextNotContains('Access denied');
+    $assert_session->buttonExists('Save layout');
   }
 
   /**
@@ -168,25 +275,8 @@ protected function setUpEntities() {
       ->getStorage($this->entityTypeId);
     $storage->resetCache([$id]);
     $this->entity = $storage->load($id);
-  }
 
-  /**
-   * Set up the View Display.
-   */
-  protected function setUpViewDisplay() {
-    EntityViewDisplay::create([
-      'targetEntityType' => $this->entityTypeId,
-      'bundle' => $this->bundle,
-      'mode' => 'default',
-      'status' => TRUE,
-    ])->setComponent($this->fieldName, ['type' => 'string'])->save();
-  }
-
-  /**
-   * Adds an entity translation.
-   */
-  protected function addEntityTranslation() {
-    $user = $this->loggedInUser;
+    // Create a translation.
     $this->drupalLogin($this->translator);
     $add_translation_url = Url::fromRoute("entity.$this->entityTypeId.content_translation_add", [
       $this->entityTypeId => $this->entity->id(),
@@ -195,31 +285,18 @@ protected function addEntityTranslation() {
     ]);
     $this->drupalGet($add_translation_url);
     $this->submitForm(["{$this->fieldName}[0][value]" => 'The translated field value'], 'Save');
-    $this->drupalLogin($user);
   }
 
   /**
-   * Adds a layout override.
+   * Set up the View Display.
    */
-  protected function addLayoutOverride() {
-    $assert_session = $this->assertSession();
-    $page = $this->getSession()->getPage();
-    $entity_url = $this->entity->toUrl()->toString();
-    $layout_url = $entity_url . '/layout';
-    $this->drupalGet($layout_url);
-    $assert_session->pageTextNotContains('The translated field value');
-    $assert_session->pageTextContains('The untranslated field value');
-
-    // Adjust the layout.
-    $assert_session->linkExists('Add block');
-    $this->clickLink('Add block');
-    $assert_session->linkExists('Powered by Drupal');
-    $this->clickLink('Powered by Drupal');
-    $page->pressButton('Add block');
-
-    $assert_session->pageTextContains('Powered by Drupal');
-    $assert_session->buttonExists('Save layout');
-    $page->pressButton('Save layout');
+  protected function setUpViewDisplay() {
+    EntityViewDisplay::create([
+      'targetEntityType' => $this->entityTypeId,
+      'bundle' => $this->bundle,
+      'mode' => 'default',
+      'status' => TRUE,
+    ])->setComponent($this->fieldName, ['type' => 'string'])->save();
   }
 
 }
diff --git a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayResourceTestBase.php b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayResourceTestBase.php
index 7d28bda963..b286601238 100644
--- a/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayResourceTestBase.php
+++ b/core/modules/layout_builder/tests/src/Functional/Rest/LayoutBuilderEntityViewDisplayResourceTestBase.php
@@ -36,6 +36,7 @@ protected function getExpectedNormalizedEntity() {
     $expected = parent::getExpectedNormalizedEntity();
     array_unshift($expected['dependencies']['module'], 'layout_builder');
     $expected['hidden'][OverridesSectionStorage::FIELD_NAME] = TRUE;
+    $expected['hidden'][OverridesSectionStorage::TRANSLATED_CONFIGURATION_FIELD_NAME] = TRUE;
     $expected['third_party_settings']['layout_builder'] = [
       'enabled' => TRUE,
       'allow_custom' => TRUE,
diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderDisableInteractionsTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderDisableInteractionsTest.php
index e83099c1db..daeab08205 100644
--- a/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderDisableInteractionsTest.php
+++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderDisableInteractionsTest.php
@@ -18,6 +18,7 @@
 class LayoutBuilderDisableInteractionsTest extends WebDriverTestBase {
 
   use ContextualLinkClickTrait;
+  use LayoutBuilderTestTrait;
 
   /**
    * {@inheritdoc}
@@ -139,36 +140,6 @@ public function testFormsLinksDisabled() {
     $this->assertContextualLinksClickable();
   }
 
-  /**
-   * Adds a block in the Layout Builder.
-   *
-   * @param string $block_link_text
-   *   The link text to add the block.
-   * @param string $rendered_locator
-   *   The CSS locator to confirm the block was rendered.
-   */
-  protected function addBlock($block_link_text, $rendered_locator) {
-    $assert_session = $this->assertSession();
-    $page = $this->getSession()->getPage();
-
-    // Add a new block.
-    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#layout-builder a:contains(\'Add block\')'));
-    $this->clickLink('Add block');
-    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas'));
-    $assert_session->assertWaitOnAjaxRequest();
-
-    $assert_session->linkExists($block_link_text);
-    $this->clickLink($block_link_text);
-
-    // Wait for off-canvas dialog to reopen with block form.
-    $this->assertNotEmpty($assert_session->waitForElementVisible('css', ".layout-builder-add-block"));
-    $assert_session->assertWaitOnAjaxRequest();
-    $page->pressButton('Add block');
-
-    // Wait for block form to be rendered in the Layout Builder.
-    $this->assertNotEmpty($assert_session->waitForElement('css', $rendered_locator));
-  }
-
   /**
    * Checks if element is unclickable.
    *
diff --git a/core/modules/layout_builder/tests/src/Kernel/OverridesSectionStorageTest.php b/core/modules/layout_builder/tests/src/Kernel/OverridesSectionStorageTest.php
index ef67ae87ac..c27c0d67db 100644
--- a/core/modules/layout_builder/tests/src/Kernel/OverridesSectionStorageTest.php
+++ b/core/modules/layout_builder/tests/src/Kernel/OverridesSectionStorageTest.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Plugin\Context\ContextDefinition;
 use Drupal\Core\Plugin\Context\EntityContext;
 use Drupal\entity_test\Entity\EntityTest;
+use Drupal\entity_test\Entity\EntityTestMul;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\layout_builder\DefaultsSectionStorageInterface;
@@ -35,6 +36,8 @@ class OverridesSectionStorageTest extends KernelTestBase {
     'system',
     'user',
     'language',
+    'content_translation',
+    'content_translation_test',
   ];
 
   /**
@@ -52,6 +55,8 @@ protected function setUp(): void {
 
     $this->setUpCurrentUser();
     $this->installEntitySchema('entity_test');
+    $this->installEntitySchema('entity_test_mul');
+    $this->installEntitySchema('user');
 
     $definition = $this->container->get('plugin.manager.layout_builder.section_storage')->getDefinition('overrides');
     $this->plugin = OverridesSectionStorage::create($this->container, [], 'overrides', $definition);
@@ -71,9 +76,10 @@ protected function setUp(): void {
    *   An array of permissions to grant to the user.
    */
   public function testAccess($expected, $is_enabled, array $section_data, array $permissions) {
+    ConfigurableLanguage::createFromLangcode('es')->save();
     $display = LayoutBuilderEntityViewDisplay::create([
-      'targetEntityType' => 'entity_test',
-      'bundle' => 'entity_test',
+      'targetEntityType' => 'entity_test_mul',
+      'bundle' => 'entity_test_mul',
       'mode' => 'default',
       'status' => TRUE,
     ]);
@@ -84,7 +90,7 @@ public function testAccess($expected, $is_enabled, array $section_data, array $p
       ->setOverridable()
       ->save();
 
-    $entity = EntityTest::create([OverridesSectionStorage::FIELD_NAME => $section_data]);
+    $entity = EntityTestMul::create([OverridesSectionStorage::FIELD_NAME => $section_data]);
     $entity->save();
 
     $account = $this->setUpCurrentUser([], $permissions);
@@ -99,18 +105,17 @@ public function testAccess($expected, $is_enabled, array $section_data, array $p
     $this->assertSame($expected, $result);
 
     // Create a translation.
-    ConfigurableLanguage::createFromLangcode('es')->save();
-    $entity = EntityTest::load($entity->id());
     $translation = $entity->addTranslation('es');
     $translation->save();
     $this->plugin->setContext('entity', EntityContext::fromEntity($translation));
+    // Translation access should only be allowed when there is section data.
+    $translation_expected_access = $expected && !empty($section_data);
 
-    // Perform the same checks again but with a non default translation which
-    // should always deny access.
+    // Perform the same checks again but with a non default translation.
     $result = $this->plugin->access('view');
-    $this->assertFalse($result);
+    $this->assertSame($translation_expected_access, $result);
     $result = $this->plugin->access('view', $account);
-    $this->assertFalse($result);
+    $this->assertSame($translation_expected_access, $result);
   }
 
   /**
@@ -148,22 +153,22 @@ public function providerTestAccess() {
       TRUE, TRUE, $section_data, ['configure any layout'],
     ];
     $data['enabled, no data, bundle overrides'] = [
-      TRUE, TRUE, [], ['configure all entity_test entity_test layout overrides'],
+      TRUE, TRUE, [], ['configure all entity_test_mul entity_test_mul layout overrides'],
     ];
     $data['enabled, data, bundle overrides'] = [
-      TRUE, TRUE, $section_data, ['configure all entity_test entity_test layout overrides'],
+      TRUE, TRUE, $section_data, ['configure all entity_test_mul entity_test_mul layout overrides'],
     ];
     $data['enabled, no data, bundle edit overrides, no edit access'] = [
-      FALSE, TRUE, [], ['configure editable entity_test entity_test layout overrides'],
+      FALSE, TRUE, [], ['configure editable entity_test_mul entity_test_mul layout overrides'],
     ];
     $data['enabled, data, bundle edit overrides, no edit access'] = [
-      FALSE, TRUE, $section_data, ['configure editable entity_test entity_test layout overrides'],
+      FALSE, TRUE, $section_data, ['configure editable entity_test_mul entity_test_mul layout overrides'],
     ];
     $data['enabled, no data, bundle edit overrides, edit access'] = [
-      TRUE, TRUE, [], ['configure editable entity_test entity_test layout overrides', 'administer entity_test content'],
+      TRUE, TRUE, [], ['configure editable entity_test_mul entity_test_mul layout overrides', 'administer entity_test content'],
     ];
     $data['enabled, data, bundle edit overrides, edit access'] = [
-      TRUE, TRUE, $section_data, ['configure editable entity_test entity_test layout overrides', 'administer entity_test content'],
+      TRUE, TRUE, $section_data, ['configure editable entity_test_mul entity_test_mul layout overrides', 'administer entity_test content'],
     ];
     return $data;
   }
diff --git a/core/modules/layout_builder/tests/src/Unit/OverridesSectionStorageTest.php b/core/modules/layout_builder/tests/src/Unit/OverridesSectionStorageTest.php
index 14f3576baf..821d0ac9d2 100644
--- a/core/modules/layout_builder/tests/src/Unit/OverridesSectionStorageTest.php
+++ b/core/modules/layout_builder/tests/src/Unit/OverridesSectionStorageTest.php
@@ -138,6 +138,18 @@ public function providerTestExtractEntityFromRoute() {
       'my_entity_type.entity_without_layout',
       [],
     ];
+    $data['with value, with layout, fr'] = [
+      TRUE,
+      'my_entity_type',
+      'my_entity_type.entity_with_layout.fr',
+      [],
+    ];
+    $data['with value, without layout, fr'] = [
+      FALSE,
+      'my_entity_type',
+      'my_entity_type.entity_without_layout.fr',
+      [],
+    ];
     $data['empty value, populated defaults'] = [
       TRUE,
       'my_entity_type',
@@ -147,6 +159,18 @@ public function providerTestExtractEntityFromRoute() {
         'my_entity_type' => 'entity_with_layout',
       ],
     ];
+    $data['with value, with layout, fr'] = [
+      TRUE,
+      'my_entity_type',
+      'my_entity_type.entity_with_layout.fr',
+      [],
+    ];
+    $data['with value, without layout, fr'] = [
+      FALSE,
+      'my_entity_type',
+      'my_entity_type.entity_without_layout.fr',
+      [],
+    ];
     $data['empty value, empty defaults'] = [
       FALSE,
       NULL,
