本文属于WordPress主题翻译教学系列,文章列表:
继昨天的如何翻译WordPress主题之后,我又参考了一些文章,觉得有必要再补充一些东西,整个WordPress主题翻译教学系列才算完整。今天要讲的主要是一些设计主题时要注意的地方,以使翻译可以更完美。
设立文字命名空间(Text Domain)
文字命名空间(Text Domain)是为了避免本主题的翻译文字和其他主题或WordPress本身的文字发生冲突而设立的,它的意思就像一个文件夹,将本主题的文字都放在里面,需要这个主题的文字时,WordPress就会直接来到这里找,这样就不怕跟其他主题的文字弄乱了。
设立文字命名空间的方法很简单,假设我们要加入zack_theme作为Text Domain,只要在functions.php的开头加入以下程式码:
load_theme_textdomain(‘zack_theme’);
我在之前的文章里提过,要使用__()或_e()来标示需要翻译的文字,加入了Text Domain之后,有一点小变化:
- __($text, $domain):原本只需填入$text作为参数,现在要把Text Domain也加入作为第二参数。
- _e($text, $domain):同上。
这样WordPress知道文字是需于哪个Domain的,就能快速地找到相应翻译。
带参数的文字翻译
这种情况,我有稍微讲过,再来看一个例子,强化一下:
title="Permanent Link to <?php the_title(); ?>"
这个例子应该不陌生吧,这是标题连结的title设定,很明显"Permanent Link to"需要翻译,很多人第一反应就会想到这样做:
<?php _e('Permanent Link to', 'zack_theme') ?> <?php the_title(); ?>
这样做的问题是,只翻译"Permanent Link to",在其他语言中,句子未必通顺,甚至不成立。例如,以中文来讲,我会希望这句翻译出来的结果是:"第一篇文章的永久连结",就是把"Permanent Link to"放在了标题的后面,顺序完全相反了。所以这句话我们要把整句抽出来翻译:
<?php printf(__('Permanent Link to %s', 'zack_theme'), get_the_title())?>
现在我们用printf()来完成这个输出,这样做就能把标题插入到%s这个位置上。中文翻译时就是:"%s的永久连结"。出来的结果就是我上面希望的样子。把the_title()改为get_the_title()是因为,the_title()会把文字直接输出到网页,而get_the_title()则把文字返回给程式使用。情况跟_e()和__()一模一样。
日期与时间的翻译
日期跟时间的翻译有够烦的,单是中文(2010年01月22日)跟英文(22/01/2010)就已经差很多了。不过,WordPress使用PHP的Date()方法来处理日期与时间,因此我们可以直接使用PHP Date()的格式来翻译,就算在要翻译的文字未出现的格式代号也可以使用,例如:
<?php the_time(__(‘l, j F Y’, ‘zack_theme’)) ?>
跟据原文,我们只要翻译’l,j F Y’,但其实我们可以翻译成’Y年n月j日’;这样就可以得到年月日的格式了。如果你不太清楚Y,n,j,这些各代表什么或是想知道其他的代号,可以查看PHP Date()的说明。
翻译的文字顺序
这种情况出现在要翻译句子中有两个参数的时候:
Hi, I am %s, Welcome to %s
这句话的完整版是:Hi, I am Zack, Welcome to ZackLive,其中ZackLive是网志名称。这在中文跟英文都似乎很通顺,但在其他语言却可能会要把两个%s调换位置,两个都是%s,怎么区别?我们可以这样做:
Hi, I am %1$s, Welcome to %2$s
如此更改后,我们就能任意的调整位置了。
JavaScript中的文字翻译
要翻译JavaScript中的文字并不如想像中那么难,只是有点烦。我们可以把所文JavaScript中的文字改为变量,并对变量进行翻译。请看以下例子:
function show_msg ()
{
alert('This is You message');
}
我们先将这里改为:
function show_msg () { alert(your_msg); }
然后在HTML头部,也就是<head>与</head>之间,加入:
<script type="text/javascript" charset="utf-8"> var your_msg = '<?php _e('This is your message', 'zack_theme'); ?>'; </script>
翻译中单复数的处理
关于这一部分,我也还未完全弄明白,只是把我所知道的,跟大家分享一下,若你有更深入的见解,欢迎指教。我们要看的例子是显示留言数:
<?php comments_popup_link('No Comments »',
'1 Comment »',
'% Comments »'); ?>
这里考虑了英文中的三种情况:没有回覆,一个回覆跟多个回覆。而中文则是这三种情况的翻译都一样。但是在其他语言,两个回覆跟三个回覆的写法,都不一样,据说__ngettext()能解决这个问题。先来看__ngettext()的用法:
<?php __ngettext($single, $plural, $number, $domain); ?>
__ngettext有四个参数,其中$domain就是Text Domain,另外三个分别是:
- $single:当$number等于1时,使用这个翻译;
- $plural:当$number大于1时,使用这个翻译;
- $number:具体的数目。
我在网上看到的解决方法是这样的:
<?php comments_popup_link(__('No Comments »', 'kubrick'),
__('1 Comment »', 'kubrick'),
__ngettext('% comment', '% comments',
get_comments_number (),
'kubrick')); ?>
没有回覆跟一个回覆是正常的做法,多个回覆那边,我也不太能够理解,有哪位高手可以详细讲解一下吗?
数字与货币的翻译
数字与货币要注意的是要将数字与货币符号整个标示以供翻译,数字格式可使用number_format()来处理。
总结
研究下来才知道光是翻译主题就要考虑这么多东西,设计主题时,要注意的地方又增加了不少。我想,我们没有办法考虑到所有语言的情况,只能够通过用户的反馈,不断地改进。
[参考:Urban Giraffe]






hi,看了你写的教程有以下疑问
1,我编译好语言包要放到什么地方才可以让程序识别
2,需要在某个文件内告诉程序我这套主题有语言包以便于程序翻译么,要在那里?怎么写?我现在用的那套主题识别系统的语言包,自动汉化了一部分
3,感觉最简单的地方才是出问题的地方……掐死我的快感
@myflos
谢谢你的问题,确实我应该说明一下,有时间再写一篇补充教学:
1.语言包放在你的主题文件夹里的languages文件夹里,你可以自己创建一个languages文件夹.
2.要设定WordPress的语言,请打开config.php,找到:
define (‘WPLANG’, ”);
这是语言设定,简体中文请改为:
define (‘WPLANG’, ‘zh_CN’);
然后WordPress就会自行寻找简体中文的语言包,包括主题的。
3.还有什么问题,欢迎提出,学生知无不言。
我最近也打算自己翻译下自己喜欢的主题,通过搜索引擎找到了你自己,看到了你的文章,对我很有帮助。你的主题做的很棒。还有你的自我简介很幽默哈。