设计国际化的主题: WordPress主题翻译教学

wordpress translation 设计国际化的主题: WordPress主题翻译教学

WordPress是以英文为主的网志系统,插件主题也是英文版为多,但随着WordPress在全球范围地流行,越来越多不同国家,说着不同语言的人加入WordPress的大家庭。会出现这一情况,其中一个原因就是WordPress本身具国际化概念的设计。WordPress本身有多国语言版本(包括简体及繁体中文),所有的插件及主题亦能轻易地被翻译成其他语言。插件及主题设计师在设计时亦应该考虑翻译的问题,本篇将讨论如何设计出适合翻译的插件或主题。

首先我们要了解WordPress所使用的翻译系统:GNU gettext。这应是目前最流行的翻译框架(Framework),尤其在开源软件的世界中,大多数支援国际化的程式都使用GNU gettext。这个系统能让程式员在编写程式时,标示出需要翻译的文字,这些文字能轻易地被提取出来,让翻译员进行翻译,翻译完成后,系统就能直接使用新语言代替程式中的文字。

要标示出需要翻译的文字,主要有以下三种方式:

  1. __($text) : 这句程式表示$text需要翻译,然后返回翻译结果
  2. _e($text) : 这句程式表示$text需要翻译,然后输出翻译结果到网页,相当于:echo __($text)
  3. __ngettext($single, $plural, $number) : 当$number等于1时,使用$single的翻译,当$number大于1时,使用$plural的翻译

很明显,第三项是为了解决单复数的问题。

再来我们要想的是:哪些文字需要被翻译?答案是直接从主题或插件输出到网页的文字,而不是从数据库(如文章)或后台设定(如网志名称)取得的资料。详细的情况,你只要多试几次就会明白。

现在我们来看看实际的使用情况。最简单的情况是,我们在设计主题时,会写一句,如果找不到任何文章即输出:Not Found,之类的字样,一般的做法是:

<h2>Not Found</h2>

这两个字很明显会直接输出到网页,需要翻译,由于是输出到网页,我们使用_e():

<h2><?php _e(‘Not Found’); ?></h2>

_e()是PHP程式码要用<?php 及 ?>包住。

接着我们来看第二个例子,我们常常需要在主题中显示有多少个回覆,会使用以下程式:

<?php comments_number(‘No Responses’, ‘One Response’, ‘% Responses’ );?>

程式会先判断有多少个回覆,再输出:没有回覆(No Responses),还是一个回覆(One Response)或者多个回覆(% Responses)。这里三个回覆都需要翻译,但不是直接显示到网页,而是返回给程式使用,所以我们使用__():

<?php comments_number(__( 'No Responses'), __('One Response'), __('% Responses'));?>

还有一种情况是,我们需要将整句话翻译,但句子里包含有其他参数。例如,要显示由谁谁谁写的,我们会用:

by <?php the_author(); ?>

如果这里只翻译by的话,可能有些语言的句子会不通顺,就以中文来讲,我们可能想要显示:由谁谁谁撰写,之类的,加了一些文字在the_author()后面。这个时候,我们可以用以下方法:

<?php printf(__(‘by %s’), the_author()); ?>

我们通过__(‘by %s’)标示整句需要翻译,然后用PHP的printf()将the_author()插入句子中并输出到网页。

如果你要留意上面回覆部分的程式码,你发现,其实WordPress在设计就有考虑到一些单复数的问题,所以我们很少会用到__ngettext()。

在这一篇,我们讨论了怎么设计出一个适合翻译的主题或插件,下次我会写一下怎样去实作翻译。

, , , , ,

5 Comments

留下评论

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>