diff --git a/core/core.services.yml b/core/core.services.yml index 5b0de75..6d59d36 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -618,6 +618,9 @@ services: menu.default_tree_manipulators: class: Drupal\Core\Menu\DefaultMenuLinkTreeManipulators arguments: ['@access_manager', '@current_user', '@entity.query'] + 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 0000000..1e58656 --- /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 0000000..5cbe338 --- /dev/null +++ b/core/lib/Drupal/Core/Menu/MenuLinkTranslationInterface.php @@ -0,0 +1,21 @@ +isTranslatable()) { + return TRUE; + } + return $this->getEntity()->hasTranslation($langcode); + } + + /** + * {@inheritdoc} + */ public function deleteLink() { $this->getEntity()->delete(); } diff --git a/core/modules/system/src/Plugin/Block/SystemMenuBlock.php b/core/modules/system/src/Plugin/Block/SystemMenuBlock.php index de9ee79..0cf52bc 100644 --- a/core/modules/system/src/Plugin/Block/SystemMenuBlock.php +++ b/core/modules/system/src/Plugin/Block/SystemMenuBlock.php @@ -151,6 +151,7 @@ public function build() { $manipulators = array( array('callable' => 'menu.default_tree_manipulators:checkAccess'), array('callable' => 'menu.default_tree_manipulators:generateIndexAndSort'), + array('callable' => 'menu.language_tree_manipulator:filterLanguage'), ); $tree = $this->menuTree->transform($tree, $manipulators); return $this->menuTree->build($tree);