diff --git a/core/core.services.yml b/core/core.services.yml index 08b09d9953..3ac0c73df0 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -642,6 +642,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 @@ +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 @@ +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 84f34b4b25..6e3db0caae 100644 --- a/core/modules/system/src/Plugin/Block/SystemMenuBlock.php +++ b/core/modules/system/src/Plugin/Block/SystemMenuBlock.php @@ -193,6 +193,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);