国际化

什么是国际化

国际化是主题开发的流程,使它可以很容易地被翻译成其他语言。国际化(internationalization)通常缩写为i18n(因为在字母i和n之间有18个字母)。

 

为什么国际化很重要

WordPress在全世界被使用,在那些英语不是主要语言的国家,WordPress插件中的字符串需要以特殊的方式进行编码,这样可以很容易地被翻译成其他语言。作为一个开发者,你可能无法为所有的用户提供本地化服务,但是,一个翻译可以成功地将主题本地化,而不需要修改源代码本身。

 

如何使你的主题国际化

为了使主题中的文本能够容易地被翻译,文本不应该被硬编码在主题中,而应该作为一个参数通过WordPress中的一个本地化功能传递。

下面的例子无法翻译,除非译者修改了源代码,这不是很有效。

<h1>Settings Page</h1>

通过将字符串传递给一个本地化函数,它可以很容易地被解析以进行翻译。

<h1><?php _e( 'Settings Page' ); ?></h1>

WordPress使用gettext库,能够在PHP中添加翻译。在WordPress中,你应该使用WordPress的本地化功能,而不是本地的PHP gettext兼容的翻译功能。

 

文本域

文本域是在国际化函数中使用的第二个参数,文本域是一个唯一的标识符,使WordPress能够区分所有加载的翻译。文本域只需要为主题和插件定义。

托管在WordPress.org上的主题,其文本域必须与你的主题URL (wordpress.org/themes/)的slug一致。这是需要的,以便来自translate.wordpress.org的翻译能够正确工作。

文本域名必须使用破折号,而不是下划线,并且要小写。例如,如果在style.css中定义的主题的名称是My Theme,或者它包含在一个叫做my-theme的文件夹中,那么文本域应该是my-theme。

文本域被用在三个不同的地方:

  1. style.css的头部
  2. 作为本地化函数中的一个参数
  3. 作为使用load_theme_textdomain()load_child_theme_textdomain()加载翻译时的参数。

 

style.css头部

文本域被添加到style.css头部,这样即使在主题没有启用的情况下,像“描述”这样的主题元数据也可以被翻译。文本域应该与加载文本域时使用的文本域相同。

示例

/*
* Theme Name: My Theme
* Author: Theme Author
* Text Domain: my-theme
*/
文本域路径

当翻译被保存在languages以外的目录中时,需要文本域路径。这是为了让WordPress知道在主题没有被启用的时候在哪里找到翻译。例如,如果.mo文件位于languages文件夹中,那么文本域路径将是/languages(必须用斜杠开头)默认为主题中的语言文件夹。

示例

/*
* Theme Name: My Theme
* Author: Theme Author
* Text Domain: my-theme
* Domain Path: /languages
*/

 

为字符串添加文本域

文本域应作为一个参数添加到所有的本地化函数中,以便翻译工作正常进行。

例子 1:

__( 'Post' )

应改为

__( 'Post', 'my-theme' )

例子 2:

_e( 'Post' )

应改为

_e( 'Post', 'my-theme' )

例子 3:

_n( '%s post', '%s posts', $count )

应改为

_n( '%s post', '%s posts', $count, 'my-theme' )

文本域应该作为一个字符串传递给本地化函数,而不是一个变量。它允许解析工具区分不同的文本域。错误的例子:

__( 'Translate me.' , $text_domain );

 

载入翻译

WordPress中的翻译被保存在.po.mo文件中,需要被加载。它们可以通过使用函数load_theme_textdomain()load_child_theme_textdomain()来加载。这将从主题的基本目录中加载{locale}.mo或从/wp-content/languages/themes/的WordPress主题语言文件夹中加载{text-domain}-{locale}.mo

从4.6版开始,WordPress会自动检查wp-content中的语言目录是否有来自translate.wordpress.org的翻译。这意味着通过translate.wordpress.org翻译的插件不再需要load_plugin_textdomain()了。
如果你不想在你的插件中加入load_plugin_textdomain()的调用,你应该把readme.txt中的Requires at least:字段设置为4.6。

要了解更多关于不同语言和国家代码的信息,请参阅语言列表

注意

  • 如果将翻译添加到主题文件夹中,将你的MO文件命名为{locale}.mo(例如:de_DE.po & de_DE.mo)。
  • 如果你要把翻译添加到WordPress主题语言文件夹中,把你的MO文件命名为{text-domain}-{locale}.mo(例如my-theme-de_DE.po & my-theme-de_DE.mo)。

示例

function my_theme_load_theme_textdomain() {
    load_theme_textdomain( 'my-theme', get_template_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'my_theme_load_theme_textdomain' );

这个函数最好是在主题的function.php中运行。

语言包

如果你对语言包和导入translate.wordpress.org的工作方式感兴趣,请阅读关于翻译的Meta手册页面

 

国际化你的主题

现在你的翻译已经加载,你可以开始在主题中用国际化函数编写每个字符串。

请查看通用API手册国际化页面,了解更多信息和最佳实践。