WordPress:Localizing WordPress

来自站长百科
跳转至: 导航、​ 搜索

国际化地方化是术语,用来描述使WordPress(和其它这样的项目)以英语以外的语言显示,供不同地区,持不同方言和地方特色的网民使用。

将这个程序本地化需要两个步骤。第一步是程序的开发者提供一个机制和方法来最终地翻译程序和接口来适合当地的特点和用户的语言。WordPress开发者已经完成了这个,因此从理论上来讲,WordPress可以在任何语言背景中使用。

第二步就是真正地本地化,网页上的文本和其它的设置都翻译好了,并且符合其它的语言和文化习惯,并且使用了软件开发者指定的构架。WordPress已经被本地化翻译为许多种语言(更多的信息,请看看英语外其它语言的WordPress)。

这篇文章解释了翻译者(双语或者多个语言的WordPress用户)怎样才能将WordPress本地化为更多的语言。

翻译 WordPress[ ]

在你开始翻译WordPress之前,查看英语外其它语言的WordPress (以及那里引用的资源)是否已有了将WordPress翻译为你的语言的版本。也有可能每个人或者(一个组)已经开始将WordPress翻译为你的母语,但是他们还没有翻译完。要找到这样的信息,订阅wp-polyglots mailing list,介绍你自己,并且问问有没有什么人正将WordPress翻译为你的母语。也有一个本地化小组正在形成的本地化小组列表,你可以查看这个列表看看翻译是不是正在进行。

资格[ ]

加入WordPress还没有翻译为你的语言或者有人正在翻译,你可能想要作为志愿者来一起将WordPress翻译为你的母语,下面是你所需要的资格:

  • 你必须是真正能够使用双语的—对英语和你要翻译成的语言非常熟练。对两种语言掌握不透,会使得翻译对你来讲变得很难,或者你翻译后的WordPress版本,本地人看不懂。
  • 你需要熟悉PHP,因为你有时候需要通读WordPress编码来领会翻译这个信息的最好的方法。
  • 你应该熟悉人类语言构造:名词,动词,冠词等等,每种词的不同类型,并且能够识别这些词在不同的英语语境中的意思。


关于本地化[ ]

本地化是指语言与当地方言之间的结合。一般来说,本地化是指国家本地化,如葡萄牙语(葡萄牙),葡萄牙语(巴西)。

你可以将WordPress翻译为任何国家的语言,甚至是其它种类的英语,如加拿大英语或者澳大利亚英语,来适应地方的拼写和习惯用法。

WordPress默认语言是美国英语。

本地化技术[ ]

WordPress的开发者选择使用GNU gettext本地化框架来提供WordPress本地化的基本结构。Gettext是一个成熟的,广泛使用的,软件翻译模框架,而且是免费软件领域/开放源码本地化的实际标准。

gettext使用消息标准的翻译—就是说,显示给用户的每个"消息"都是单个翻译的,不管这个消息是一段话还是一个单词。在WordPress中,WordPress PHP 文件通过两个PHP函数产生,翻译,并且使用这样的"消息"。当消息作为论证传给另一个函数的时候,会用到__();当直接在网页上写消息的时候,会用到_e()。更多的关于这两个函数的详细信息:

__($message)
搜索翻译$message的本地化模块,并且将翻译传递给PHP输出申明。如果没有找到$message的翻译,只会输出$message

注意如果你正将一个主题或者插件国际化,你应该使用一个"文本域"。更多关于怎样国际化一个插件的内容的信息,请看看编写一个插件;主题国际化的操作也类似。

Gettext框架照顾到了大部分的WordPress。但是,WordPress中的某些属性不能使用gettext—更多关于怎样翻译这些部分的信息,请看看关于直接翻译的文件

gettext 文件[ ]

Gettext翻译框架中使用了三种类型的文件。这些文件在翻译过程中,有翻译工具产生和/或者使用,如下:

POT(轻便目标模板)文件:本地化过程中的第一步是使用一个程序来搜索WordPress源代码并且找出通过__() or _e()函数的每个消息。这列英语消息被输进一个特别格式的模板文件(POT文件),这个文件形成了翻译的基础。一般来说,你可以为WordPress下载一个POT文件,这样你就不要制造一个自己的POT文件了。如果主题/插件开发者将所有的文本包含在__() 或者_e()函数中,主题和插件也可以使用分开的POT文件。

:PO(轻便对象)文件:本地化过程的第二步是翻译者将POT文件中的所有内容翻译为目标语言,并且在一个PO文件中保存英语和翻译好的内容。

MO(机器对象)文件:本地化过程的最后一步是处理一个程序并且将这个程序转变为最优化的机器可读的二进制文件(MO文件)。将翻译汇编为机器代码来使得本地化程序运行时候,能够更快地重新找到翻译。

翻译工具[ ]

有不同的工具能够辅助翻译。你可以使用任何你喜欢的翻译工具。

Launchpad
Ubuntu Linux项目有一个网站能够使你不看PO或者PO文件,就可以翻译内容,并且直接将翻译内容导出到一个MO。

注: 许多翻译人员发现Rosetta是个很好的出发点,但是如果要校正整个翻译内容,许多翻译者开始选择手工编辑PO文件或者使用一个程序像poEdit或者KBabel,因为Rosetta缺少一个搜索功能和其它对于校正和编辑来说至关重要的功能。

poEdit
Windows,Mac OS X的一个开放源码程序,提供一个便于使用的GUI来编辑PO文件并且产生MO文件。
KBabel
Linux上的KDE窗口管理器的另一个开放源码PO编辑程序。
GNU Gettext
官方的Gettext工具包包含了创建POTs,操作Pos,和产生MOs的命令行工具。那些适合于一个命令行shell。

用Launchpad翻译[ ]

我们有一个单独的页面关于在Lanchpad上翻译WordPress的指示说明。

用poEdit翻译[ ]

  1. 下载并且安装poEdit
  2. 下载官方 WordPress POT 文件 right|thumb|100px| poEdit 界面
  3. 在poEdit中打开文件。
  4. (看图像)标为(1)的框是来自POT文具的原始内容(英语写的)。标记为(2)的框是你添加翻译的框。标记为(3)和(4)的框是用来添加关于内容的评论。如果你与一组翻译人员合作,并且想在PO文件上交流看法,这些框迟早有用。
  5. 进入文件 → 保存 as…在一个PO文件中保存你的翻译。
  6. 当你完成翻译后,进入文件 → 保存 as…再次地产生一个MO文件。
  7. 或者你可以将你的poEdit设置为当点击文件 → 喜好来保存变化的时候,总是编译一个MO文件而且在编辑 符上选中在保存框中自动编辑.mo 文件

用KBabel 翻译[ ]

这个部分是不完善的。

  1. 下载官方的 WordPress POT 文件
  2. 在KBabel中打开文件

用 Gettext工具翻译[ ]

  1. 下载官方 WordPress POT文件
  2. 在你最喜爱的文本编辑器中打开文件。
  3. 更新标头信息
  4. 翻译内容
  5. 用一个.po文件扩展名来保存文件
  6. 发行msgfmt -o filename.mo filename.po


PO 文件标头[ ]

在PO文件的开始部分,称为标头。这个标头给出了翻译是关于那个版本的软件包的,翻译人员是谁,以及翻译是何时创建的。这个标头的某些部分对于所有的WordPress翻译应该是通用的:

  1. WordPress语言(本地化)翻译。
  2. 版权(C) YEAR WordPress 投稿者。
  3. 这个文件发行的许可证与WordPress软件包相同。
  4. 第一个作者 <EMAIL@ADDRESS>, YEAR.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-版本: WordPress 版本\n"
"Report-Msgid-Bugs-To: \n"
"POT-创建-日期: 2005-02-27 17:11-0600\n"
"PO-修订-日期: YEAR-MO-DA HO:MI+ZONE\n"
"最后的-翻译人员: 全名<EMAIL@ADDRESS>\n"
"语言-小组: 语言 <LL@li.org>\n"
"MIME-版本: 1.0\n"
"内容-形式: text/plain; charset=CHARSET\n"
"内容-翻译-编码: 8bit\n"

用适当值填上剩下的大些字母文本部分。

内容格式[ ]

文件的剩余部分会是以下的格式:

  1. wp-comments-post.php:13
msgid "对不起, 这篇文章不能够评论。"
msgstr ""
  1. wp-comments-post.php:29
msgid "对不起,你登录后,才能够发表评论。"
msgstr ""
  1. wp-comments-post.php:35
msgid "错误: 请填上必须的内容 (姓名,电子邮件)。"
msgstr ""

每个消息内容的第一行包括了这个内容在WordPress编码中处于什么位置。这些消息内容都位于wp-comments-post.php,分别在第13,29,和第35行。有时候,你看到一个消息内容,你需要查看这个内容的语境;查看WordPress核心中的某行或者某些行,你就会了解消息内容应该什么时候显示,显示在什么位置,甚至还知道使用你的网络浏览器来复制这个消息内容。有的消息内容会出现在同一个文本的多处;这样肯定有多行给出了一个文件和一行的位置。

下一行,msgid,是 消息。WordPress正是将这个命令行发送到__()或者 _e()函数,而且你需要翻译这个消息。 最后一行,msgstr,是一个空白的命令行,你需要在这个命令行上填上你的翻译。

下面是几个相同的行在翻译之后,是怎样的,使用法语 (法国) 本地化来作为一个例子:

  1. wp-comments-post.php:13
msgid "对不起,这篇文章不允许有评论。"
msgstr "L'ajout de commentaire n'est pas ou plus possible pour cet article."
  1. wp-comments-post.php:29
msgid "对不起,你登录后才能够发表评论。"
msgstr "Vous devez être connecté pour rédiger un commentaire."
  1. wp-comments-post.php:35
msgid "错误:请填上必须的内容 (姓名,电子邮件)。"
msgstr "Erreur : veuillez remplir les champs obligatoires vides (nom, e-mail)."
注: 请看看下面的 字符集编码HTML 字符集实体 关于怎样在翻译中使用 HTML 字符实体。

messages 的类型[ ]

标签[ ]

Labels通过用在HTML<label>, <legend>, <a>, 或者<select>标签中。这些标签通常是一个UI元素的简单而精确的描述符。这些有时候可能很难翻译,特别如果是单词的话,而且英语词可以被翻译为名词或者祈使句中的动词。拥有最多的labels的时候,你需要在编码中搜索一下,在找出编码在上下文中的用法,然后再决定合适地翻译编码。

因为这麽多的message是WordPress管理界面的一部分,Labels可能是翻译最频繁的message。

例子[ ]

msgid "Post" msgstr "Artikkeli"


"post"可以被翻译为一个命令式的动词,但是在这个语境中,它是一个名词。"post"在英语中的名词形式,翻译会比较难,一些翻译小组很难决定那个翻译最合适。许多翻译使用其英语的对等词"Article,"的确是这样的。(来自Finnish (Finland) 翻译。)

  1. wp-login.php:79 wp-login.php:233 wp-register.php:166
#: wp-includes/template-functions-general.php:46
msgid "Register"
msgstr "रजिस्टर"

来自北印度语 翻译。

#: wp-admin/admin-functions.php:357
msgid "- Select -"
msgstr " - Dewis -"

这个例子中的破折号可能会被删除或者取消,前提是这些破折号可能会是你的本地化用户感到疑惑,或者你的本地化有不同的使用惯例。来自 威尔士语言翻译。

Informational Messages[ ]

另一种通常的message形式,informational message通常是有完整的句子组成的,通常传递信息或者需要一个用户的执行活动。因为informational message比labels要长,这些message更容易翻译。然而,message越长,正式化(或者非正式化)的差别越大,翻译人员应该注意到这一点。

例子[ ]

  1. wp-login.php:146
msgid "你的新密码在邮件中。"
msgstr "Вашата нова парола е в електронната ви поща."

这个特别的 message包含了一个更改了的英语俗语 ("邮件中的check/支票"), 这导致了非正式性用语。 (来自 保加利亚语 (保加利亚)翻译。)

  1. wp-includes/functions.php:1636
msgid "<strong>Error</strong>: Incorrect password."
msgstr "<strong>FEL</strong>: Felaktigt lösenord."

错误信息因为更加简短精确,倾向于更加地正式。 (来自瑞典语 (瑞典) 翻译。)

  1. wp-includes/functions-post.php:467
msgid "对不起,你只能每隔十五秒才能够发表一个新的评论。慢点,伙计。 "

msgstr "Leider kannst du nur alle 15 Sekunden einen neuen Kommentar eingeben. Immer locker bleiben."

当然,并不是所有的。(来自德语(德国) 翻译。)

拥有描述的字符串[ ]

如果一个字符串包含有一个竖线|,|右边的部分是一个描述。这个描述的目的在于帮助你翻译字符串,将字符串放到每个语境中,或者提供额外的信息。

例子[ ]

  1. wp-includes/locale.php:186
msgid ""
"number_format_decimal_point|$dec_point argument for http://php.net/number_format, default is ."
msgstr ","

描述建议你如果要翻译字符串,就要查看一个网页。

时间和日期本地化设置[ ]

WordPress没有使用内置的本地化切换功能,大多数主题的许多语言多没有配置这个功能,WordPress使用了gettext翻译模块来完成时间和日期的翻译和格式。

WordPress翻译下面的内容:

月份名称[ ]

  1. wp-includes/locale.php:42 wp-includes/locale.php:57
msgid "五月"
msgstr "Květen"

(From the Czech (Czech Republic) translation.)


(来自捷克语 (捷克共和国) 翻译。)

月份缩写[ ]

  1. wp-includes/locale.php:57
msgid "五月_五月_缩写"
msgstr "Mag"

注意不寻常的 msgid。 这些messages 应该直译: 它们破解了英语中的一个事实,全名和缩略名是相同的, Gettext 可能错误地将两个结合在一篇文章中。(来自意大利语(意大利) 翻译。)

星期名称[ ]

  1. wp-includes/locale.php:7
#: wp-includes/locale.php:18
#: wp-includes/locale.php:31
msgid "星期二"
msgstr "火曜日"

(From the 日语 (日本)翻译。)

星期缩写[ ]

  1. wp-includes/locale.php:31
msgid "Tue"
msgstr "Уто"

(From the 塞尔维亚语言 (塞尔维亚) 翻译。)

星期词首大写[ ]

  1. wp-includes/locale.php:18
msgid "T_星期二_词首大写"
msgstr "ti"

星期首字母大写符合WordPress历法的特色,与月份缩略词使用同样的方法,以符合要求,因为在英语中星期二和星期四的首字母是一样的。并不是所有的本地化都是用对每个日期都使用单字母缩略词的形式:在这个例子中, 挪威语Bokmål使用一个额外的字母来区分 tirsdag (星期二)和torsdag (星期四)。(From the 挪威语 Bokmål (挪威) 翻译。)

日期格式字符串[ ]

这些是PHP 日期()格式字符串,而且这些字符串能够使你更改你的本地化的日期和时间的格式。 WordPress使用本地化文件其它地方的翻译来用于月份名称,星期名称,等等。这个特别的字符串可以选择哪个元素要包含在日期 &时间,和日期时间呈现的次序中。


theme.pot文件中取出这个msgid

  1. archive.php:40 search.php:19 single.php:22
msgid "l, F jS, Y"
msgstr ""

在英语中,这个的形式是:


Sunday, February 27th, 2005
星期天,二月27日,2005

然而,不同的本地化语言的日期形式是不同的,在丹麦语中,例如,日期写为:

søndag, 27. februar 2005

要达到这一点,上述的msgid应该被翻译为:

  1. archive.php:40 search.php:19 single.php:22
msgid "l, F jS, Y"
msgstr "l, j. F Y"

另一个例子,在汉语和日语中,日期的格式是:

2005年2月27日

翻译中可以达到这个要求:

  1. archive.php:40 search.php:19 single.php:22
msgid "l, F jS, Y"
msgstr "Y年n月j日"


最后,如果你的日期格式中需要包含字面意思的文字字符,就如西班牙语有时出现的那样,你可以在反斜线符号后面加上。

  1. archive.php:40 search.php:19 single.php:22
msgid "l, F jS, Y"
msgstr "l j \d\e F \d\e Y "


这回产出:

domingo 27 de febrero de 2005


通过WordPress-PHP 翻译[ ]

要翻译你的日期,例如,在你的插件中使用wp-函数mysql2date(Dateformat, Datestring)。这个使用月和星期翻译来返回你的日期。

占位符Messages[ ]

许多message包含特别的PHP格式的占位符,这个允许翻译后,插入不可翻译的动态内容到message。PHP占位符拥有两种不同的格式:

%s
只有一个占位符呈现的时候,会使用这个标记。
%1$s, %2$s, %3$s, …
有限的占位符,允许翻译来重新地组织字符串中占位符的顺序,同时保持每个占位符所代表的信息。

例子[ ]

  1. wp-login.php:116
msgid "这个电子邮件成功地发送到了 %s的电子邮件地址。"
msgstr "El 电子邮件 fue enviado satisfactoriamente a la dirección e-mail de %s"

这个 message 插入了用户的用户名,电子邮件正是发送到这个用户名。(来自 西班牙语 (西班牙) 翻译。)

  1. wp-admin/upload.php:96
#, php-format
msgid "File %1$s of type %2$s is not allowed."
msgstr "类型为%2$s的文件%1$s不允许被上传。"

这个message颠倒了顺序,翻译中文件名和类型是以这个顺序为基础的。(来自(中国)翻译。)


优秀的翻译小贴士[ ]

不要直译,要整体地翻译:要知道两个或者多个语言,毫无疑问你知道你所说的语言拥有不同的结构,韵律,语调和变形形式。翻译过的message不需要与英语语言结构相同:了解源语言的意思,然后以目标语言的习惯,将它以相同的意思表述出来。就如创建一个等同的message和一个对等的message之间的区别:不要复制原话,要翻译出来。即使message中有更多的结构内容,你要有创建性的思想,将这些结果更改,使其更加地适应你的本地化用户的习惯表述和逻辑。
试着保持同等级别的正式性(或者非正式性):每个message有一个不同级别的正式性或者非正式性。你的目标语言中需要使用什么样的正式性或者非正式性,你需要自己决定(或者与你的小组一起决定),但是WordPress messages(特别是informational messages)倾向于使用一种客气的非正式的语调。试着在目标语言的语境中找到对等的语调。
不要使用俚语或者针对特别用户的术语:一些术语需要用在博客中,但是不可以使用在"in"人群所用的口语中。如果外行的写博客的人要使用你的语言来安装WordPress,他们会知道这些术语的意思吗?单词像pingback, trackback, 和feed是这个规则的例外;这些是特别难以翻译的术语,许多翻译人员选择将这些术语保留英文。
阅读你的母语中其它的软件的本地化:如果你遇到了麻烦或者需要指导,试着阅读其它流行软件工具的翻译,来摸索一些那些术语是经常使用的,用语有多正式,等等。当然,WordPress拥有自己的语调和氛围,因此当你阅读其它的本地化翻译的时候,要牢记这一点,但是可以自由地查找UI术语等等来与你的母语的其它软件中这些术语的翻译保持一致。

WordPress 本地化知识库[ ]

http://svn.automattic.com/wordpress-i18n/上的WordPress 本地化知识库是一个子版本 知识库这里保存了官方的WordPress翻译。不同的小组一起合作将WordPress翻译为他们的母语,而且小组维护人员使得知识库保持更新和变化。

加入[ ]

任何人都可以加入这个知识库。只要订阅wp-polyglots mailing list,介绍你自己,让他人知道你想要翻译什么。如果已经有一个你的母语翻译的小组,他们会通知你,让你加入。如果没有这样的小组,你可以志愿成为你的母语翻译维护人员,或者本地化人员,或者只是付出你的本地化翻译,知识库维护人员会添加你的翻译。

指导方针和要求[ ]

注: 随着系统的升级,这些指导方针会受系统变化的支配;如果指导方针改变了,知识库维护人员会非常乐意帮助你来更新你储存在知识库中的文件。

字符编码[ ]

所有的本地化翻译应该至少有一个UTF-8版本,但是可能会随意地在本地化翻译受欢迎的其它字符编码中添加版本。

PHP不支持Byte Order Marker(BOMs),因此要确定你贡献的UTF-8编码的文件不包含有BOMs。

HTML 字符实体[ ]

除了一些例外(下面所列出的),所有的内容都应该逐字翻译,不应该跳过重音节单词或者HTML字符实体上特别的字符。


一些字符必须要避免与XHTML标记相冲突:尖括号(&lt; and &gt;), 和&符号 (&amp;)。此外,有一些更易于使用的字符,丢失了,例如non-breaking spaces(&nbsp;),angle quotes(&laquo; and &raquo;), curly apostrophes (&#8217;)和curly quotes。


关于更多的W3C的最好的关于字符编码和字符实体的做法,请看看下面的参考:

知识库文件结构[ ]

知识库包含了每个本地化翻译的目录,这些目录命名为如下:

在每个本地化翻译的目录中有正规的子版本译文目录:支部/, 标签/, 和枝干/。

在合适的译文目录内部有以下的子目录。

messages/[ ]
  • messages/
    • kubrick

这个目录包含了本地化翻译的Gettext MO 和 PO文件。Message文件命名在locale名之后。

kubrick文件夹中,你应该将i18n-ed的翻译放到(使用与以上相同的PO/MO文件名)default theme, residing at the wordpress-i18n svn 知识库。翻译默认主题还有另一种方式:

dist/[ ]

目录包含有所有的 WordPress 发行的,不能够被 Gettexted的文件,可以被翻译为本地化语言。

本地化翻译中只有一个文件的UTF-8翻译,dist/目录可能直接拥有许多内容,dist内部的结果应该反映wordpress根目录的结构:

  • dist/
    • license.html
    • readme.html
    • wp-config-sample.php
    • wp-admin/
      • install.php
      • upgrade.php

如果本地化翻译不止包含一个UTF-8字符编码,那么dist/应该包含每个编码的子目录:

  • dist/
    • UTF-8/
      • license.html
      • readme.html
      • wp-config-sample.php
      • wp-admin/
        • install.php
        • upgrade.php
    • ISO-8859-1/
主题/[ ]

最好翻译 i18n-ed kubrick (请看看上面的 messages/ 部分),而不是使用 主题/

与dist/dir类似,主题/包含很难翻译的主题文件。如果只呈现了一个UTF-8翻译,目录上可以有每个翻译好的主题的子目录。这些子目录包含了与原始主题相同的文件(只是这些文件已经翻译好了),而且与原始主题命名相同:

  • theme/
    • default/
      • 404.php
      • index.php
      • sidebar.php
      • images/

正如dist/目录,如果呈现了多个字符编码,主题/应该包含每个字符编码的子目录,依次包含关于有翻译好的每个主题的子目录。

使用本地化[ ]

为了要本地化安装你的wordpress,如果本地化还不存在,创建一个目录名为languages 而不是wp-includes。然后如上所述,从子版本知识库中提取一个适当的本地化文件。语言的main .mo文件应该在语言目录内部。在wp-config.php内部为你选择的语言,设置WPLANG。例如,如果你想使用法语,你就会有:

define ('WPLANG', 'fr_FR');

发现并解决问题[ ]

;Rosetta没有将我的翻译以一个MO文件导出。只是显示,"出现了一个系统错误。":你的翻译中有一个语法错误,阻止翻译汇编成一个MO。下载PO并且试着手工用msgfmt将它编译。这样你会得知那行出现了错误,这样你可以动手更改这些错误。如果你没有安装一个GNU Gettext软件包,你可以试着在poEdit或者 KBabel中打开PO文件,看看那这些文件能否帮助你来更改错误,或者你可以发送电子邮件到wp-polyglots mailing list让其他人来帮助你解决程序错误。

资源[ ]

Ryan Boren的插件和主题本地化
将WordPress翻译为英语外的其它语言 (主题和插件)