url中的语言环境模块和语言前缀

时间:2010-08-09 10:06:12

标签: drupal drupal-6 drupal-modules hook-menu

我一直在处理模块并且很清楚hook_menu是否要传递url参数来回调。例如:

$items['webtv/block/%/playlist/edit/%'] = array(
    ...
    'page callback' => 'drupal_get_form',
    'page arguments' => array('webtv_playlist_form', 5, 2),
    ...
);

和回调为

function webtv_playlist_form($form_state, $fifth_arg, $second_arg){
...
}

除此之外,arg()函数是另一个通过其位置获取url参数的实用程序。

$second_arg = arg(2);
$fifth_arg = arg(5);

当我启用语言环境模块以使网络成为多语言时,URL将前缀分类为语言符号。例如:

en/webtv/block/%/playlist/edit/%

OR

nl/webtv/block/%/playlist/edit/%

这个东西取代了右边的参数的逻辑位置,现在正确放置参数(根据例子)是:

$second_arg = arg(3);
$fifth_arg = arg(6);

如何设置模块独立于此类参数放置问题?

1 个答案:

答案 0 :(得分:1)

查看Drupal核心代码(例如,node_menu()),使用菜单占位符的菜单回调在启用locale.module时不会调整,而local.module也不会改变从其他模块定义的菜单。 实际上,调用Drupal bootstrap的language_initialize()包含以下代码:

case LANGUAGE_NEGOTIATION_PATH_DEFAULT:
case LANGUAGE_NEGOTIATION_PATH:
  // $_GET['q'] might not be available at this time, because
  // path initialization runs after the language bootstrap phase.
  $args = isset($_GET['q']) ? explode('/', $_GET['q']) : array();
  $prefix = array_shift($args);
  // Search prefix within enabled languages.
  foreach ($languages as $language) {
    if (!empty($language->prefix) && $language->prefix == $prefix) {
      // Rebuild $GET['q'] with the language removed.
      $_GET['q'] = implode('/', $args);
      return $language;
    }
  }

代码正在删除URL中传递的语言ID。 如果正确设置了locale.module,则在启用模块时不应更改菜单回调定义。