跳转到主要内容
东方龙马 提交于 21 May 2014

原文链接:What Developers Need to Know about Multilingual Drupal 7 Sites

译者:龙马

当用代码方式做Drupal多语言或者locale组件时,我们需要注意这样的几个问题来保证多语言的子系统可以如我们所期待的那样。

硬编码一个语言(或者未指定语言)会有问题

与字段打交道时,开发人员通常从指定的未定义的语言设置或者获取字段的值(如果默认安装选的是“Standard”时,语言系统是没有的,“LANGUAGE_NONE”被定义为“UND”)。这将导致每当在激活的语言下Entity Translation模块启用时代码失败。那是否有更好的方法来让Drupal与当前语言自动工作呢?

检索字段值

fieldgetitems() API 调用可以实现这个要求。当你没有指定语言时,如果不指定的话,它会默认为当前语言。所以,如果你真的想针对特定的语言,你可以。

例如,

$value = $node->field_subtitle[LANGUAGE_NONE][0]['value'];

... 通常替换为 ...

$field_items = field_get_items('node', $node, 'field_subtitle');
$value = $field_items[0]['value'];

设置字段值

不幸的是,Drupal7中没有field_set_items()这个方法。尽管如此,假如我们正在搞翻译字段,当设置字段数据时,我们仍然可以指定当前语言。

替换

$node->body[LANGUAGE_NONE][0]['format'] = 'full_html';

..你可能想使用其中的全局变量$language (针对界面语言)或者 $language_content (只是内容语言),如 ...

$langcode_current = $GLOBALS['language']->language;
$node->body[$langcode_current][0]['format'] = 'full_html';

替代方案

针对当前语言,Entity API 模块实际上通过Entity metadata wrappers同时提供了setter和getter两种方法。但是,它的另一个依赖和额外的开销,如果你不使用它,你可能不需要。这也使得调试很棘手。关于这方面的讨论,请参阅使用 language[und] 工作时,什么是最好的做法?

翻译标题字段实际上是不同的字段

默认情况下,通过 Entity Translation 模块,标题字段不允许被翻译。这是因为在Drupal7标题字段不是使用Field API 开发的。为了解决这个限制,有必要使用 Title 模块替换为可翻译的标题字段。

要启用特定的字段,需要点击“replace(替换)”按钮,在内容类型 / bundle 的管理字段选项卡下的标题字段。这将改用基本用例(basic use cases),用新的“FIELD_TITLE”字段替换默认的“标题”字段。

请注意,你必须更新任何views和自定义代码以使用新的字段。如果不这样做,标题总是会出现在原来的语言,你可能会说为什么翻译的标题没有显示出来。

如果你并不需要翻译标题,最好是保留原来的标题。否则,多个标题字段会让情况变得复杂。

Drupal 版本