You are here

function menu_manipulator_get_multilingual_menu in Menu Manipulator 3.0.x

Same name and namespace in other branches
  1. 8.2 menu_manipulator.module \menu_manipulator_get_multilingual_menu()
  2. 8 menu_manipulator.module \menu_manipulator_get_multilingual_menu()
  3. 2.0.x menu_manipulator.module \menu_manipulator_get_multilingual_menu()

Get a menu tree filtered by the current language.

Based on our custom MenuTreeManipulators services. This is pretty useful as of now (8.4.x) as Drupal doesn't provide a way to filer MenuLinkContent entity by their language.

// Implements theme_preprocess_menu().
function yourtheme_preprocess_menu(&$variables, $hook) {
  if (isset($variables['menu_name']) && ($menu_name = $variables['menu_name'])) {
    $moduleHandler = \Drupal::service('module_handler');
    if ($moduleHandler
      ->moduleExists('menu_manipulator')) {
      $menu_tree_translated = menu_manipulator_get_multilingual_menu($menu_name);
      $variables['items'] = isset($menu_tree_translated['#items']) ? $menu_tree_translated['#items'] : [];
    }
  }
}

Parameters

string $menu_name: The menu machine name.

\Drupal\Core\Menu\MenuTreeParameters $parameters: Extra parameters for the menu tree.

Return value

array The filtered MenuTree renderable array.

File

./menu_manipulator.module, line 64
Contains menu_manipulator.module.

Code

function menu_manipulator_get_multilingual_menu(string $menu_name, MenuTreeParameters $parameters = NULL) {
  $menu_tree = \Drupal::menuTree();
  $manipulators = [
    [
      'callable' => 'menu.default_tree_manipulators:checkAccess',
    ],
    [
      'callable' => 'menu.default_tree_manipulators:generateIndexAndSort',
    ],
    [
      'callable' => 'menu_manipulator.menu_tree_manipulators:filterByCurrentLanguage',
    ],
  ];
  if ($menu_name == 'admin') {

    // Specific manipulation for the "Admin Toolbar" menu.
    // See admin_toolbar_prerender_toolbar_administration_tray()
    $parameters = $parameters ?: new MenuTreeParameters();
    $parameters
      ->setRoot('system.admin')
      ->excludeRoot()
      ->setMaxDepth(4)
      ->onlyEnabledLinks();
  }
  else {

    // Default method to retrieve menu items.
    // See MenuLinkTreeInteface::getCurrentRouteMenuTreeParameters().
    $parameters = $parameters ?: $menu_tree
      ->getCurrentRouteMenuTreeParameters($menu_name);
  }

  // Manipulate the menu tree to filter by current language.
  $menu = $menu_tree
    ->load($menu_name, $parameters);
  $menu = $menu_tree
    ->transform($menu, $manipulators);
  return $menu_tree
    ->build($menu);
}