You are here

Drupal专业开发指南 第18章 带有翻译的多语言支持

g089h515r806 的头像
Submitted by g089h515r806 on 星期二, 2009-08-25 16:44

 能够使用多个语言创建内容固然不错。然而,大多数的站点,都不会有一篇内容使用英语,另外一篇内容使用法语,两者没有任何关系。相反,法语内容通常是英语内容的一个翻译(或者反之亦然)。当把内容类型的“多语言支持”设为“已启用,带有翻译”(参看图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

Drupal版本: