gettext()中有多种复数形式


Multiple plural forms in gettext()

参见_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();函数来支持它。

首先,您的区域设置文件需要有复数的定义。正如你在问题上补充的那样,在波兰的情况下,你可能会看到

"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文件中的类似定义。

然后,您需要为"%"准备翻译d注释"%d评论";在.po文件中。例如,

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

请将.po文件编译为.mo文件,并放在适当的文件夹中。(例如languages/(domain_name)-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');

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

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

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