159 人查看过本文  1 条留言  发布日期:2010年04月15日   文章位于: WP相关  

wordpress主题模版制作教程(六)

本文转载自zacklive,共有四篇文章

设立文字命名空间(Text Domain)

文字命名空间(Text Domain)是为了避免本主题的翻译文字和其他主题或WordPress本身的文字发生冲突而设立的,它的意思就像一个文件夹,将本主题的文字都放在里面,需要这个主题的文字时,WordPress就会直接来到这里找,这样就不怕跟其他主题的文字弄乱了。

设立文字命名空间的方法很简单,假设我们要加入zack_theme作为Text Domain,只要在functions.php的开头加入以下程式码:

load_theme_textdomain(‘zack_theme’);

我在之前的文章里提过,要使用__()或_e()来标示需要翻译的文字,加入了Text Domain之后,有一点小变化:

  1. __($text, $domain):原本只需填入$text作为参数,现在要把Text Domain也加入作为第二参数。
  2. _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 &#187;',
                          '1 Comment &#187;',
                          '% Comments &#187;'); ?>

这里考虑了英文中的三种情况:没有回覆,一个回覆跟多个回覆。而中文则是这三种情况的翻译都一样。但是在其他语言,两个回覆跟三个回覆的写法,都不一样,据说__ngettext()能解决这个问题。先来看__ngettext()的用法:

<?php __ngettext($single, $plural, $number, $domain); ?>
__ngettext有四个参数,其中$domain就是Text Domain,另外三个分别是:
  1. $single:当$number等于1时,使用这个翻译;
  2. $plural:当$number大于1时,使用这个翻译;
  3. $number:具体的数目。

我在网上看到的解决方法是这样的:

<?php comments_popup_link(__('No Comments &#187;', 'kubrick'),
                          __('1 Comment &#187;', 'kubrick'),
                          __ngettext('% comment', '% comments',
                                      get_comments_number (),
                                      'kubrick')); ?>

没有回覆跟一个回覆是正常的做法,多个回覆那边,我也不太能够理解,有哪位高手可以详细讲解一下吗?

数字与货币的翻译

数字与货币要注意的是要将数字与货币符号整个标示以供翻译,数字格式可使用number_format()来处理。

总结

研究下来才知道光是翻译主题就要考虑这么多东西,设计主题时,要注意的地方又增加了不少。我想,我们没有办法考虑到所有语言的情况,只能够通过用户的反馈,不断地改进。

相关文章

此文章有 1 条留言

  1. 网络赌博 说:

    I cannot believe this will work!

发表评论

(例如:http://erdaoo.cn)