Drupal 7 多语言站点:每个节点 URL 在所有语言中都是重复的

Drupal 7 multilingual site: each node URL is duplicated in all languages

我有一个 Drupal 7 多语言网站,有 3 种语言:英语、阿拉伯语和中文。

一切正常,但我刚刚注意到未翻译的页面对每种语言都有重复的 URL。

例如我有 www.example.com/node/12(默认语言 = 英语)。此节点没有任何翻译。

然而 www.example.com/ar/node/12 和 www.example.com/zh/node/12 都存在并指向英文页面。他们甚至在 Google.

中成为索引

如何让这些 URL 显示 "Page not found"(这应该是预期的行为)?

还有另一种方式来翻译您的内容,您可以使用Entity Translation module。使用此模块,您可以说您的内容不是完全可翻译的,而只是其中的一些字段(如果所有字段都是可翻译的,则为全部字段)。使用此系统,每种语言只有一个节点,这是一件更好的事情,如果您导航到 "ar/node/12",该节点将使用阿拉伯语,如果您导航到 "zh/node/12",该节点将是中文的。 通常这样更好,因为有些字段不需要翻译,因为它在每种语言中都是相同的,例如实体引用、地址等。

如果您有其他问题,请不要犹豫。

嗯,最后我用 hook_init 中的一些自定义代码解决了它:

$lang_name = $language->language ;
if ($lang_name == "ar" || $lang_name == "zh-hans") {
    $has_translation = false;
    if ($is_node) {
      $translation_array = translation_node_get_translations($node->tnid);
      $has_translation = isset($translation_array[$lang_name]);
    }
    if (!$has_translation) {
      $path = drupal_get_path_alias(current_path());
      $installed_languages = language_list();
      $en = $installed_languages["en"];
      drupal_goto($path, array('language' => $en), 301);
    }
  }

所以,基本上,我会在每个页面上检查我们是否使用英语以外的语言(这意味着我们在以 /ar 或 /zh 开头的路径中)。如果是这种情况,并且如果我们在一个节点上,我会检查是否存在该节点和该语言的现有翻译。如果是,我们什么都不做,但如果不是,我们将重定向到默认路径(没有语言前缀)。