能够使用多个语言创建内容固然不错。然而,大多数的站点,都不会有一篇内容使用英语,另外一篇内容使用法语,两者没有任何关系。相反,法语内容通常是英语内容的一个翻译(或者反之亦然)。当把内容类型的“多语言支持”设为“已启用,带有翻译”(参看图18-24)时,那就变成可能的了。它涉及到以下步骤:
1. 使用一个语言创建一篇文章。这就是源文章。
2. 创建文章的翻译。
让我们使用一个例子,来逐步的实现这些任务。首先,确保Page内容类型的“多语言支持”设置已被设为 “已启用,带有翻译”。接着,我们使用英语创建一个简单的页面。导航到“创建内容➤Page”,为标题输入Hello,为正文输入Have a nice day.。将语言设为英语,并点击保存按钮。除了通常的查看和编辑标签以外,你现在应该还会看到一个翻译标签(参看图18-27)。
图 18-27.节点现在有了一个翻译标签。
点击翻译标签,将会显示该文章的翻译状态的总结。如图18-28所示,在英语中已有了一篇源文章,但是现在也只有这些了。通过点击“添加翻译”链接,让我们创建一个法语翻译。
图 18-28.点击翻译标签,显示了翻译状态的总结。
点击“添加翻译”链接,将再次来到节点编辑表单页面,但是这次,语言被设置为了法语。为标题输入Bonjour,为正文输入Ayez un beau jour.。点击保存按钮,这样就新增了一个节点。Drupal将自动的在源节点和翻译之间创建链接,并使用语言名字作为链接的文本。图18-29给出了源节点的法语翻译的外观,在这里,源节点使用的是英语,同时还有一个使用以色列语的附加翻译。
图 18-29.源节点的法语翻译包含了指向英语和以色列语版本的链接。
通过实现modules/translation/translation.module中的hook_link(),来构建这些链接:
/**
* Implementation of hook_link().
*
* Display translation links with native language names, if this node
* is part of a translation set.
*/
function translation_link($type, $node = NULL, $teaser = FALSE) {
$links = array();
if ($type == 'node' && ($node->tnid) &&
$translations = translation_node_get_translations($node->tnid)) {
// Do not show link to the same node.
unset($translations[$node->language]);
$languages = language_list();
foreach ($translations as $language => $translation) {
$links["node_translation_$language"] = array(
'title' => $languages[$language]->native,
'href' => "node/$translation->nid",
'language' => $languages[$language],
'attributes' => array(
'title' => $translation->title,
'class' => 'translation-link'
)
);
}
}
return $links;
}
除了内容翻译模块生成的链接以外,本地模块还提供了一个语言转换区块,你可以在“管理➤站点构建➤区块”中启用它。只有当启用了多个语言,并且“语言协定”设置没有被设为“一个也没有”时,语言转换区块才会显示出来。语言转换区块如图18-30所示。
图 18-30. 语言转换区块
让我们回到正题,继续讨论源节点和它们的翻译。如果一个节点是一个源节点,那么编辑它时将会在节点编辑表单中显示一个附加的名为“翻译设置”的字段集。这个字段集包含了单个复选框:“把翻译标记为过时的”,如图18-31所示。
图 18-31.一个源节点的节点编辑表单中的“翻译设置”字段集
复选框是用来指示是否需要重新翻译的,如果你对源节点作了比较大的更改,也就是说原有的翻译已不再适用,那么就需要重新翻译了。选中复选框,将把翻译标记为过时的,这样在查看节点的翻译状态时,就会显示一个红色的提示“过时的”,对比图18-28和图18-32。
图 18-32.源节点已被编辑,而翻译的文章也被标记为过时的。
源节点和它的翻译都有单独的节点ID,事实上,在数据库中它们就是完全独立的节点。它们通过使用node表的tnid列关联起来,该列包含的值,就是源节点的节点ID。假定英语版本就是源节点,并且是站点的第一个节点,而法语和以色列语翻译是紧接着添加的两个节点,那么node表将如图18-33所示。
图 18-33. tnid列用来追踪源节点和它们的翻译之间的关系
注意translate列中的1,用来指示一个过时的翻译。
老葛的Drupal培训班 Think in Drupal