You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据站点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);
}

注意事项

  1. 确保main_uk菜单已在站点后台创建并配置好菜单链接;
  2. 验证Country Path模块获取Locale的方式,若上述服务/函数无效,可查看模块文档确认正确的API;
  3. 若你的主菜单是通过区块展示,也可通过hook_preprocess_block()钩子针对菜单区块进行替换,逻辑类似;
  4. 修正你思路里的笔误:将menu_uk改为实际的菜单名称main_uk。

内容的提问来源于stack exchange,提问作者MadzQuestioning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:27:31