diff --git a/core/modules/layout_builder/src/Element/LayoutBuilder.php b/core/modules/layout_builder/src/Element/LayoutBuilder.php
index e59caad98e..4e86e5a408 100644
--- a/core/modules/layout_builder/src/Element/LayoutBuilder.php
+++ b/core/modules/layout_builder/src/Element/LayoutBuilder.php
@@ -123,7 +123,7 @@ public function preRender($element) {
    */
   protected function layout(SectionStorageInterface $section_storage) {
     $this->prepareLayout($section_storage);
-    $sections_editable = !($section_storage instanceof TranslatableSectionStorageInterface && !$section_storage->isDefaultTranslation());
+    $is_translation = $section_storage instanceof TranslatableSectionStorageInterface && !$section_storage->isDefaultTranslation();
 
     $output = [];
     if ($this->isAjax()) {
@@ -133,14 +133,14 @@ protected function layout(SectionStorageInterface $section_storage) {
     }
     $count = 0;
     for ($i = 0; $i < $section_storage->count(); $i++) {
-      if ($sections_editable) {
+      if (!$is_translation) {
         $output[] = $this->buildAddSectionLink($section_storage, $count);
       }
 
       $output[] = $this->buildAdministrativeSection($section_storage, $count);
       $count++;
     }
-    if ($sections_editable) {
+    if (!$is_translation) {
       $output[] = $this->buildAddSectionLink($section_storage, $count);
     }
 
@@ -156,8 +156,20 @@ protected function layout(SectionStorageInterface $section_storage) {
     // Mark this UI as uncacheable.
     $output['#cache']['max-age'] = 0;
 
-    // @todo Add message if not components have translate links!
-    //    "There are no settings to translate"
+    if ($is_translation) {
+      $has_translatable_component = FALSE;
+      foreach ($section_storage->getSections() as $section) {
+        foreach ($section->getComponents() as $uuid => $component) {
+          if ($component->hasTranslatableConfiguration()) {
+            $has_translatable_component = TRUE;
+            break 2;
+          }
+        }
+      }
+      if (!$has_translatable_component) {
+        $this->messenger()->addStatus($this->t('There are currently no settings that can be translated'));
+      }
+    }
 
     return $output;
   }
@@ -172,14 +184,6 @@ protected function prepareLayout(SectionStorageInterface $section_storage) {
     // If the layout has pending changes, add a warning.
     if ($this->layoutTempstoreRepository->has($section_storage)) {
       $this->messenger->addWarning($this->t('You have unsaved changes.'));
-      if ($section_storage instanceof TranslatableSectionStorageInterface && !$section_storage->isDefaultTranslation()) {
-        // @todo Copy in any change from the default translation and then
-        //   reapply any translated labels where the original labels has not
-        //   changed. This should avoid data loss if the layout has been
-        //   updated since this layout override has started. This probably also
-        //   needs to be done on save to avoid overriding the layout if it was
-        //   saved since the last time this page was opened.
-      }
     }
     // If the layout is an override that has not yet been overridden, copy the
     // sections from the corresponding default.
@@ -299,39 +303,37 @@ protected function buildAdministrativeSection(SectionStorageInterface $section_s
               'uuid' => $uuid,
             ],
           ];
-          if ($sections_editable) {
-            // 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',
-            ];
-            $build[$region][$uuid]['#contextual_links'] = [
-              'layout_builder_block' => $contextual_link_settings,
-            ];
-          }
-          elseif ($is_translation) {
+          if ($is_translation) {
             $component = $section->getComponent($uuid);
             if ($component->hasTranslatableConfiguration()) {
+              $contextual_group = 'layout_builder_block_translation';
               /** @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']);
-                $build[$region][$uuid]['#contextual_links'] = [
-                  $block->isTranslatable() ? 'layout_builder_inline_block_translation' : 'layout_builder_block_translation' => $contextual_link_settings,
-                ];
+                if ($block->isTranslatable()) {
+                  $contextual_group = 'layout_builder_inline_block_translation';
+                }
               }
-              else {
-                $build[$region][$uuid]['#contextual_links'] = [
-                  'layout_builder_block_translation' => $contextual_link_settings,
-                ];
-              }
-
             }
           }
+          else {
+            // 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',
+            ];
+            $contextual_group = 'layout_builder_block';
+          }
+          if (isset($contextual_group)) {
+            $build[$region][$uuid]['#contextual_links'] = [
+              $contextual_group => $contextual_link_settings,
+            ];
+          }
         }
       }
 
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Block/TestSimpleBlock.php b/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Block/TestSimpleBlock.php
deleted file mode 100644
index aaccc66a02..0000000000
--- a/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Block/TestSimpleBlock.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-namespace Drupal\layout_builder_test\Plugin\Block;
-
-use Drupal\Core\Block\BlockBase;
-
-/**
- * Provides a 'Simple Block' block.
- *
- * @Block(
- *   id = "test_simple_block",
- *   admin_label = @Translation("Simple Block")
- * )
- */
-class TestSimpleBlock extends BlockBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return ['label_display' => FALSE];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function build() {
-    return ['#markup' => 'Simple Block Build'];
-  }
-
-}
diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/ModeratedTranslationTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/ModeratedTranslationTest.php
index 8e77149c1c..ea1192ed04 100644
--- a/core/modules/layout_builder/tests/src/FunctionalJavascript/ModeratedTranslationTest.php
+++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/ModeratedTranslationTest.php
@@ -39,6 +39,7 @@ class ModeratedTranslationTest extends WebDriverTestBase {
     'node',
     'contextual',
     'layout_builder_test',
+    'block_test',
   ];
 
   /**
@@ -47,6 +48,7 @@ class ModeratedTranslationTest extends WebDriverTestBase {
   protected function setUp() {
     parent::setUp();
     $page = $this->getSession()->getPage();
+    $this->container->get('state')->set('test_block_access', TRUE);
 
     // @todo The Layout Builder UI relies on local tasks; fix in
     //   https://www.drupal.org/project/drupal/issues/2917777.
@@ -192,7 +194,7 @@ public function testModerationTranslatedOverrides() {
     // Add a new block to the default translation override.
     $this->drupalGet($node->toUrl());
     $page->clickLink('Layout');
-    $this->addBlock('Simple Block', '#layout-builder .block-test-simple-block', TRUE, 'untranslated new label');
+    $this->addBlock('Test block access', '#layout-builder .block-test-access', TRUE, 'untranslated new label');
     $page->fillField('moderation_state[0][state]', 'draft');
     $page->pressButton('Save layout');
 
