什么是国际化
国际化是主题开发的流程,使它可以很容易地被翻译成其他语言。国际化(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/
文本域名必须使用破折号,而不是下划线,并且要小写。例如,如果在style.css中定义的主题的名称是My Theme,或者它包含在一个叫做my-theme的文件夹中,那么文本域应该是my-theme。
文本域被用在三个不同的地方:
- 在
style.css
的头部 - 作为本地化函数中的一个参数
- 作为使用
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手册页面。
国际化你的主题
现在你的翻译已经加载,你可以开始在主题中用国际化函数编写每个字符串。