Drupal 的开发和使用,都是通过一个国际化的社区完成的。因此,Drupal 默认支持本地化。本地化是将用户接口的文本替换为用户本地的翻译过的文本。在本章,我们将看一下如何启用本地化,以及如何有选择的将 Drupal 的内置的字符串替换为我们自己的。然后,我们看一个完全的翻译,并学习如何创建、导入和导出它们。

启用本地模块(Locale Module)

当你初次安装 Drupal 时,大多数模块(甚至包括核心模块比如说本地化模块)默认是禁用的。这与 Drupal 的哲学,仅当需要的时候才启用相应的功能,相一致。你可以在 Administer > Site building > Modules 下面启用本地化模块。本章的例子都假定本地化模块已启用。

使用 t() 函数来翻译字符串

在 Drupal 中所有的字符串都应该使用 t() 函数封装;它是 Drupal 的翻译函数,由于经常使用,为了方便,所以将其函数简写为“t”。t() 函数看起来如下所示:

function t($string, $args = 0) {
global $locale;
if (function_exists(’locale’) && $locale != ‘en’) {
// Translate the string.
$string = locale($string);
}
if (!$args) {
return $string;
}

}

除翻译以外,t() 函数对字符串中的占位符中的插入值也进行了处理。这些值一般为用户提供的输入,在展示它们以前,必须对它们进行文本转换。

t(’Hello, my name is %name.’, array(’%name’ => ‘John’);
Hello, my name is John.

文本中待插入的位置由占位符表示,而待插入的文本是一个带键的数组。这一文本转换处理过程对于 Drupal 的安全性非常重要(参看第20章以获得更多信息)。图18-1向你展示了 t() 函数如何处理翻译的;图20-1向你展示了 t() 函数如何处理占位符的。

图18-1 t() 函数时如何处理翻译和占位符的插入的

将内置字符串替换为定制的字符串

假定你对单词 blog 感到别扭,你想将其替换为 journal 而不修改任何代码。你可以使用本地化模块来修改它。方法是,添加一个语言让它仅包含我们想替换的字符串。首先,让我们添加一个定制的语言来持有我们定制的 字符串。图18-2展示了这样做的后台接口页面。我们将新加语言叫做 English-custom,并使用 en-US 来作为语言代码。

提示:如果你打算为你的站点同时启用多个语言并允许用户选择一个语言时,你所启用的语言的名字将出现在用户的帐号设置页面(如图18-4)。因此, 为语言起一个具有描述性的名字就很重要了(“English-custom”的描述性就不强)。如果你不觉得冗余的话,我们也可以使用 “English(blog replaced with journal)”。

图18-2 为特定字符串的翻译添加一个定制的语言

现在启用你新加的语言并将其设为默认选项,如图18-3所示:

图18-3 启用新加的语言并将其设为默认选项

注意:如果你启用了多个语言,那么每一个用户在他/她的帐户页面都会出现一个选择语言的选项,如下图所示。如果你不想让用户选择他们自己的语言,那么仅启用一个语言即可。

在“我的帐号”页面的用户接口上,用户可以对语言进行选择(如果启用了多个语言)

我们将原来的语言“英语”禁用,这样用户就不用选择了。如图18-4所示。不要担心,如果找不到字符串的翻译版本,Drupal 将使用原来的字符串,所以禁用英语并不会是我们的站点变成空白站点。

图18-4 禁用所有的语言,除了默认语言

注意列“已翻译(Tanslated)”下面的数字增加了。这是由于 Drupal 使用了即时翻译。当一个页面载入后,每一个字符串都被 t() 和 lacale() 函数处理,在这里,如果字符串在表 locales_source 和 locales_target 中不存在的话,字符串将被添加到这两个表中。图18-4中“已翻译”列下面的值说明有357个字符串使用了 t() 函数并且可被翻译。我们将使用本地化模块的后台接口来翻译一些字符串。

提示:当使用后台接口来翻译字符串时,在翻译以前要访问一下包含了你想翻译字符串的页面;这将确保字符串使用了 t() 函数并且可被翻译。

点击“Manage strings”标签以后,我们看到一个搜索接口,它允许我们查找要翻译的字符串。让我们搜索到目前为止可用的357个字符串。搜索接口如图18-5所示。

图18-5 用于展示可翻译字符串的搜索接口

选择我们的语言 English-custom,搜索所有的字符串,将搜索输入框置为空,点击搜索按钮,将得到所有的可翻译的字符串。如图18-6所示,每个字符串在其右 边都有一个编辑操作。第一个字符串是 Save configuration。通过点击编辑链接,让我们将其改为 Save your configuration。

图18-6 一列可翻译的字符串和它们的状态

当我们编辑完该字符串以后,注意该行中的 Locales 列里面的删除线没有了,这意味着该字符串已经被翻译了,如图18-7所示。

图18-7 编辑完 Save configuration 以后的一列可翻译的字符串

注意这里显示的是原始的字符串,而不是翻译后的,如果我们返回“Manage Languages(管理语言)”接口页面,如图18-8所示,我们不仅看到357个字符串中的一个已被翻译,而下面的按钮也说明了所做的修改。

图18-8 管理语言页面的截图展示了本地化的按钮文本

现在你已经学会了如何修改字符串,我们可以继续将所有出现 blog 的地方替换为 journal。在启用了日志模块以后,访问日志相关的页面(比如 /node/add/blog 和 blog/1)我们将看到, 等待翻译的可翻译字符串。在 Manage strings(管理字符串)标签下面的搜索功能是大小写敏感的,所以对 blog 和 Blog 分别搜索将为我们展示所有的情况,并让我们将它们替换为 joiurnal 和 Journal。

警告:我们这里介绍的方法适用于可接触的 Drupal 站点和对于特定接口元素的字符串替换,但是它不是完全的。例如,一个包含了 blog 的模块没有被启用,我们就没有对这些字符串进行翻译。一个更完全的方法在本章的“开始一个新翻译“一节中介绍。

这个修改看起来很不错,但是创建一个新的日志的 url 仍然是 http://example.com/?q=node/add/blog, 这让人仍然有点困惑;难道不可以适用 http://example.com/?q=node/add/journal 来替换么?当然可以。我们可以这样很快的解决这个问题:启用路径模块(path module),将 node/add/blog 作为系统存在的路径,为其添加一个别名 node/add/journal。转眼间,所有的 blog 消失了,这样当你使用站点时感觉就很舒心了。

相关文章


没有评论

(*)
(不会公布)