如何根据站点Locale切换加载自定义菜单(main/main_uk)?
实现多地区菜单切换方案
针对你的需求,结合Country Path模块,可以通过主题预处理函数或自定义模块钩子拦截菜单渲染逻辑,根据当前地区加载对应菜单,以下是具体实现步骤:
方式一:主题预处理(无需额外模块)
在你的主题.theme文件(比如yourtheme.theme)中添加以下代码:
/** * Implements hook_preprocess_menu(). */ function yourtheme_preprocess_menu(&$variables) { // 仅针对默认主菜单进行替换 if ($variables['menu_name'] !== 'main') { return; } // 通过Country Path模块获取当前地区Locale $locale = \Drupal::service('country_path.locale_resolver')->getLocale(); // 若模块无此服务,可尝试模块提供的函数:country_path_get_current_locale() // 确定要加载的菜单名称 $target_menu = 'main'; if ($locale === 'en-gb') { $target_menu = 'main_uk'; } // 加载目标菜单的树结构并替换原有菜单内容 $tree_parameters = new \Drupal\Core\Menu\MenuTreeParameters(); $tree = \Drupal::menuTree()->load($target_menu, $tree_parameters); // 应用菜单权限检查与排序逻辑 $manipulators = [ ['callable' => 'menu.default_tree_manipulators:checkAccess'], ['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'], ]; $tree = \Drupal::menuTree()->transform($tree, $manipulators); // 将处理后的菜单树转换为渲染数组 $variables['items'] = \Drupal::menuTree()->build($tree)['#items']; }
方式二:自定义模块钩子
如果需要将逻辑封装在模块中,创建自定义模块(比如custom_menu_switch),在模块.module文件中添加:
/** * Implements hook_menu_tree_alter(). */ function custom_menu_switch_menu_tree_alter(&$tree, $menu_name, $parameters) { // 仅拦截默认主菜单的树结构 if ($menu_name !== 'main') { return; } // 获取当前地区Locale $locale = \Drupal::service('country_path.locale_resolver')->getLocale(); // 切换目标菜单 $target_menu = 'main'; if ($locale === 'en-gb') { $target_menu = 'main_uk'; } // 重新加载目标菜单的树结构并替换 $new_tree = \Drupal::menuTree()->load($target_menu, $parameters); $manipulators = [ ['callable' => 'menu.default_tree_manipulators:checkAccess'], ['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'], ]; $tree = \Drupal::menuTree()->transform($new_tree, $manipulators); }
注意事项
- 确保
main_uk菜单已在站点后台创建并配置好菜单链接; - 验证Country Path模块获取Locale的方式,若上述服务/函数无效,可查看模块文档确认正确的API;
- 若你的主菜单是通过区块展示,也可通过
hook_preprocess_block()钩子针对菜单区块进行替换,逻辑类似; - 修正你思路里的笔误:将
menu_uk改为实际的菜单名称main_uk。
内容的提问来源于stack exchange,提问作者MadzQuestioning
相关产品推荐
相关产品推荐

