Eric @ EricBess WebHome

一味思考而不行动,将在不知不觉中变得无意义

Chinese (Simplified) flagItalian flagKorean flagPortuguese flagEnglish flagGerman flagFrench flagSpanish flagJapanese flagArabic flagRussian flagGreek flagDutch flagBulgarian flagCzech flagCroat flagDanish flagFinnish flagHindi flagPolish flagRumanian flagSwedish flagNorwegian flagCatalan flagFilipino flagHebrew flagIndonesian flagLatvian flagLithuanian flagSerbian flagSlovak flagSlovenian flagUkrainian flagVietnamese flag
By N2H

WordPress 插件\主题 本地化

一旦你的插件编程工作已结束,另一个值得考虑的方面就是怎样将你的插件国际化(当然,这是建立在你想把你的作品发布给公众的前提上)。“国际化”就是一个建设你的软件使之能被本地化的过程;而“本地化”就是将你软件显示文本翻译成各种语言的过程。WordPress 已被来自全世界各个地方的爱好者使用,所以它以将国际化和本地化功能融入其结构,包括插件程序的本地化功能。想了解更多的 GNU gettext 本地化的背景知识,请参照翻译 WordPress

极力推荐你将你的插件进行国际化,这样来自五湖四海的用户名都可以本地化它。而且这整个过程也是十分直接明了:

  • 先给你的插件选一个翻译用的“文本域”名称。这一般同你的插件文件名称相同,当然不包括.php后缀名,而且必须是具有唯一性,至少保证不要同使用者已安装的其他插件同名。
  • 不管任何时候你的插件要使用文字来显示给网页读者(也即“信息文”),都尽量将它们嵌入在如下两个 WordPress gettext 函数程序段的任一之中。记住,不同于 WordPress 核心代码,在你插件里的国际化函数里你应该使用第二个参数来传递你自选的文本域。而在 WordPress 核心代码,这个参数默认为空。

__() 用来将 message 作为一个参数传递给另外一个函数。 _e() 用来直接把 message 写到页面上。

__($message, $domain) : 用本地化的语言为 $domain 翻译 $message 。输出的字符串可以继续被其他函数调用。
_e($message, $domain) :用本地化的语言为 $domain 翻译 $message ,然后显示到用户的屏幕。如果你的文字将直接显示给读者,就可以使用该函数。
  • 为你的插件创建一个 POT 文件 (这个一个列有所有文字条的翻译条目文件),随你的插件一起发布。插件用户将需要生成一个翻译本地化好的 MO 文件,然后把它放在你插件的同一文件夹里。并且这个 mo 文件的取名也有讲究,应该是象 domain-ll_CC.mo,这里 ll_CC 就是本地国家和语言代码(如 zh_CN)。参照 翻译 WordPress 上更多关于 POT 文件、MO 文件及本地化的信息。
  • 在你插件里加入一个 load_plugin_textdomain 子程序用以调用你的插件翻译。这个子程序一定需要在你 gettext 函数的前面,但最好是越晚越好(因为一些多语言插件在调用时会改变一些地域设置)。一个可行的方法就是在你所有插件的子程序前面增加一个初始子程序。例如,假设你的文本域叫 "fabfunc",则:

1
2
3
4
5
6
7
8
9
10
11
$fabfunc_domain = 'fabfunc';
$fabfunc_is_setup = 0;
 
function fabfunc_setup()
{
   global $fabfunc_domain, $fabfunc_is_setup;
   if($fabfunc_is_setup) {
      return;
   }
   load_plugin_textdomain($fabfunc_domain, 'wp-content/plugins');
}
假如你的插件是放在它自己的目录里,则你应该把它的目录名加到 load_plugin_textdomain 函数的第二个参数里。

插件和主题模板的 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 的话。

同样的道理是做好的 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 文件里:

1
2
3
4
5
6
7
<!--p
add_action (’init’, ‘my_plugin_init’);
function my_plugin_init ()
{
load_plugin_textdomain (’superit’,'wp-content/plugins/superit’);
}
-->

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

1
2
3
4
5
6
7
<!--p
add_action (’init’, ‘my_theme_init’);
function my_theme_init ()
{
load_theme_textdomain (’superit’);
}
-->

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

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...
-欢迎为本文评级

相关日志

本文读者也关心以下内容:

  • N/A

10月 27th, 2008 作者: eric | WordPress, Wordpress Programming, 网站技术 | Trackback ? | 无评论| Email This Post Print This Post | 53 views

Add a Comment

Leave a reply

No Comments