diff --git a/core/core.services.yml b/core/core.services.yml
index eb562afea7..24355bc696 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -631,6 +631,9 @@ services:
   menu.default_tree_manipulators:
     class: Drupal\Core\Menu\DefaultMenuLinkTreeManipulators
     arguments: ['@access_manager', '@current_user', '@entity_type.manager']
+  menu.language_tree_manipulator:
+    class: Drupal\Core\Menu\LanguageMenuLinkManipulator
+    arguments: ['@language_manager']
   menu.active_trail:
     class: Drupal\Core\Menu\MenuActiveTrail
     arguments: ['@plugin.manager.menu.link', '@current_route_match', '@cache.menu', '@lock']
diff --git a/core/lib/Drupal/Core/Menu/LanguageMenuLinkManipulator.php b/core/lib/Drupal/Core/Menu/LanguageMenuLinkManipulator.php
new file mode 100644
index 0000000000..1e58656aa2
--- /dev/null
+++ b/core/lib/Drupal/Core/Menu/LanguageMenuLinkManipulator.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace Drupal\Core\Menu;
+
+use Drupal\Core\Language\LanguageManagerInterface;
+
+/**
+ * Provides a menu link language manipulator.
+ */
+class LanguageMenuLinkManipulator {
+
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface
+   */
+  protected $languageManager;
+
+  /**
+   * LanguageMenuLinkManipulator constructor.
+   *
+   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
+   *   The language manager.
+   */
+  public function __construct(LanguageManagerInterface $language_manager) {
+    $this->languageManager = $language_manager;
+  }
+
+  /**
+   * Generates a unique index and sorts by it.
+   *
+   * @param \Drupal\Core\Menu\MenuLinkTreeElement[] $tree
+   *   The menu link tree to manipulate.
+   *
+   * @return \Drupal\Core\Menu\MenuLinkTreeElement[]
+   *   The manipulated menu link tree.
+   */
+  public function filterLanguage(array $tree) {
+    $current_language = $this->languageManager->getCurrentLanguage()->getId();
+
+    foreach ($tree as $key => $link) {
+      if (!$link->link instanceof MenuLinkTranslationInterface) {
+        continue;
+      }
+      // Hide menu links that does not have translation for current language.
+      if (!$link->link->hasTranslation($current_language)) {
+        unset($tree[$key]);
+      }
+    }
+    return $tree;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Menu/MenuLinkTranslationInterface.php b/core/lib/Drupal/Core/Menu/MenuLinkTranslationInterface.php
new file mode 100644
index 0000000000..5cbe338574
--- /dev/null
+++ b/core/lib/Drupal/Core/Menu/MenuLinkTranslationInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Drupal\Core\Menu;
+
+/**
+ * Defines an interface for exposing multilingual capabilities.
+ */
+interface MenuLinkTranslationInterface {
+
+  /**
+   * Determines if menu link has a translation.
+   *
+   * @param string $langcode
+   *   The langucode.
+   *
+   * @return bool
+   *   TRUE if menu link has a translation, FALSE if not.
+   */
+  public function hasTranslation($langcode);
+
+}
diff --git a/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php b/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php
index 98e8cdfcb0..03d05bd4da 100644
--- a/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php
+++ b/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php
@@ -8,13 +8,14 @@ use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Menu\MenuLinkBase;
+use Drupal\Core\Menu\MenuLinkTranslationInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;

 /**
  * Provides the menu link plugin for content menu links.
  */
-class MenuLinkContent extends MenuLinkBase implements ContainerFactoryPluginInterface {
+class MenuLinkContent extends MenuLinkBase implements ContainerFactoryPluginInterface, MenuLinkTranslationInterface {
   use DeprecatedServicePropertyTrait;

   /**
@@ -256,6 +257,17 @@ class MenuLinkContent extends MenuLinkBase implements ContainerFactoryPluginInte
     return $this->getEntity()->isTranslatable();
   }

+  /**
+   * {@inheritdoc}
+   */
+  public function hasTranslation($langcode) {
+    if (!$this->isTranslatable()) {
+      return TRUE;
+    }
+    return $this->getEntity()->hasTranslation($langcode);
+  }
+
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/system/src/Plugin/Block/SystemMenuBlock.php b/core/modules/system/src/Plugin/Block/SystemMenuBlock.php
index a551ca64d3..3132b747c8 100644
--- a/core/modules/system/src/Plugin/Block/SystemMenuBlock.php
+++ b/core/modules/system/src/Plugin/Block/SystemMenuBlock.php
@@ -161,6 +161,7 @@ public function build() {
     $manipulators = [
       ['callable' => 'menu.default_tree_manipulators:checkAccess'],
       ['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'],
+      ['callable' => 'menu.language_tree_manipulator:filterLanguage'],
     ];
     $tree = $this->menuTree->transform($tree, $manipulators);
     return $this->menuTree->build($tree);
