16

请参阅此_n();函数示例(http://codex.wordpress.org/Function_Reference/_n):

sprintf( _n('%d comment.', '%d comments.', $number, 'text-domain'), $number );

用英语讲:

1 Comment
2 Comments

在波兰语等语言中,有不同的模式和多种复数形式:

1 Komentarz
2 Komentarze
3 Komentarze
4 Komentarze
5 Komentarzy
6 Komentarzy
...
21 Komentarzy
22 Komentarze
23 Komentarze
24 Komentarze
25 Komentarzy
...
31 Komentarzy
32 Komentarze
...
91 Komentarzy
92 Komentarze
...
111 Komentarzy
112 Komentarzy (!)
...
121 Komentarzy
122 Komentarze

如果他们的语言支持多种复数形式,我正在寻找某种方法使翻译人员能够设置自己的模式。你能想到任何创造性的 PHP 方法来做到这一点吗?

我能想到的一些解决方案(但翻译人员仍然无法设置任何模式):

if($number == 1){
    $message = __(‘1 Komentarz’ , ‘text-domain’);
}else if($number == 2){
    $message = __(‘2 Komentarze’ , ‘text-domain’);
}else if($number == 3){
    $message = __(‘3 Komentarze’ , ‘text-domain’);
}

编辑:我在波兰语的 PO 文件中找到了这个:"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"但我仍然不知道如何准备_n();函数来支持它。

4

2 回答 2

18

首先,您的语言环境文件需要具有复数的定义。正如您在问题中添加的那样,在波兰语的情况下,您可能会看到

"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"

或 (domain_name)-pl.po 文件中的类似定义。

然后,您需要为 .po 文件中的“%d Comment”/“%d Comments”准备翻译。例如,

msgid "%d Comment"
msgid_plural "%d Comments"
msgstr[0] "%d Komentarz"
msgstr[1] "%d Komentarze"
msgstr[2] "%d Komentarzy"

请将 .po 文件编译成 .mo 文件并放置到适当的文件夹中。(例如语言/(域名)-pl.mo

在您的 Wordpress(我假设的插件/主题)代码中,您可以这样称呼它,

for ($i=1;$i<15;$i++) {
  printf(_n("%d Comment", "%d Comments", $i, "(domain_name)"), $i);echo "<br />";
}
printf(_n("%d Comment", "%d Comments", 112, "(domain_name)"), 112);echo "<br />";

然后当然在 wp-config.php 中将 WordPress 的语言环境设置为波兰语,

define ('WPLANG', 'pl');

你应该看到正确的复数形式的结果。

于 2012-08-26T03:10:28.240 回答
0

我想我找到了一种方法来做我想做的事。POEdit 应用程序允许您使用可以在设置中指定的模式创建多个复数形式。

翻译者必须自己编写模式(请参阅我的问题中的波兰语模式)。我仍在研究该主题,但如果有人有类似的问题,那么这是一个很好的起点:http ://www.poedit.net/trac/wiki/Doc/PluralForms

于 2012-08-25T12:21:26.167 回答