如何将你的 WordPress 插件、主题国际化或本地化你喜欢的主题、插件

WordPress今天刚好在WordPress中文文档站上修改、翻译了一篇关于如何将WP插件国际化的文章,认为对主题模板也很适用。再加上最近读到的一篇英文的关于中文化WP主题的博客文章,略有感触。所以想将一些这两篇文章没有提及的,但可能对制作和汉化主题模板又有帮助的写在这,仅供有兴趣的朋友做做参考。

如果你想先阅读我刚提到的这两篇文章,请分别点击下列连接:

  1. 插件国际化
  2. Localizing WordPress Themes and Plugins

我就不重复上述两篇文章提到的所有技术细节,主要想分享值得注意的两个细节。

一, 插件和主题模板的 mo 语言文件取名和该上传到什么地方。

大家知道,如果想汉化整个 WordPress,就是下载或自己生成一个叫 zh_CN.mo 的文件然后上传到 wp-content/languages 子目录里,然后修改 wp-config.php文件就行了。但在主题和插件的本地化中略有不同。

在插件中,.mo 文件的名字应该与插件国际化“文本域”名称有联系,格式是 $textdomain-ll-CC.mo。比方说,我的一个插件叫 superit,那么我的汉化文件名就应该取成 superit-zh_CN.mo。以此类推可知,$textdomain 是文本域, ll 是语言名, CC 是国家区域代号。注意:在文本域与语言、国家代码之间是小横线(-),而在语言和国家代码之间是下划线(_)。

然而主题中的 mo 文件仍可以取名为 zh_CN.mo 如果你用的函数是 load_theme_textdomain 的话。

为什么有这样的差别了,那时因为在你安装的 WordPress 的 wp-includes/l10n.php 文件里对 load_plugin_textdomain 和 load_theme_textdomain 是这样定义的。

function load_plugin_textdomain($domain, $path = false) {
$locale = get_locale();
if ( empty($locale) )
$locale = ‘en_US’;

if ( false === $path )
$path = PLUGINDIR;

$mofile = ABSPATH . “$path/$domain-$locale.mo”;
load_textdomain($domain, $mofile);
}

function load_theme_textdomain($domain) {
$locale = get_locale();
if ( empty($locale) )
$locale = ‘en_US’;

$mofile = get_template_directory() . “/$locale.mo”;
load_textdomain($domain, $mofile);
}

从上可以看出,插件使用本地化的语言mo文件是还加上了 load_plugin_textdomain 的第二个参数的值。而 load_theme_textdomain 并没有这样。

同样的道理是做好的 mo 文件上传的路径也不一样。

插件的还要取决于我在上面提到的那个 load_plugin_textdomain($domain, $path)函数中的第二个参数$path。假如我在我的插件 functions.php 文件用到的是 load_plugin_textdomain (‘superit’,’wp-content/plugins/superit’); 则我应该将我的 superit-zh_CN.mo 上传到我的插件子目录 wp-content/plugins/superit 里面。

如果我的函数写成是 load_plugin_textdomain (‘superit’,’wp-content/plugins’); 那将 .mo 文件上传到 wp-content/plugins 子目录里就行了,若不小心还是上传到 superit 插件子目录里,那这插件可能得不到汉化。所以,汉化时请注意你要用的插件里的 load_plugin_textdomain 路径参数。

而主题却不一样,汉化时只要把做好的 zh_CN.mo 上传到你使用的主题的那个子目录里然后保证你在 wp-config.php 里启用中文就行 了。

二、 怎样在插件和主题里调用 gettext 的函数子程序

按照 WP 官方文档的推荐,在插件和主题里应该生成独特的“文本域”来区分 WP 核心部分的本地化。

实现上述需求要用 load_plugin_textdomain ($domain, $path) 函数子程序。在这里,$domain 应该是你自己原选好的独特的“文本域”,一般是你插件或主题的名字。而$path就是语言 mo 文件所在的位置。

什么时候调用 load_plugin_textdomain ?基本原则是越晚越好,因为有些多语言的插件可以造成一些地域性属性值的改变,但它又需要在 __(), __e()这些函数被调用之前。

我在我一个叫 superit 插件(它自带文件夹)里使用的方法 是将下面这段代码放在 functions.php 文件里:

<?php
add_action (‘init’, ‘my_plugin_init’);

function my_plugin_init ()
{
load_plugin_textdomain (‘superit’,’wp-content/plugins/superit’);
}

?>

当然,在主题本地化中就是用 load_theme_textdomain($domain)了,理由见上。所以我的叫 superit 的主题应该有这样的代码:

<?php
add_action (‘init’, ‘my_theme_init’);

function my_theme_init ()
{
load_theme_textdomain (‘superit’);
}

?>

如果在使用过程中收到 header error 的错误信息,将这段代码取消就没事了。所以提醒大家注意这个load_plugin_textdomain 和 load_theme_textdomain 的位置。

4 Responses to “如何将你的 WordPress 插件、主题国际化或本地化你喜欢的主题、插件”

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload the CAPTCHA.