gettext() 中的多个复数形式

请参阅以下函数示例 (http://codex.wordpress.org/Function_Reference/_n):_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();


答案 1

首先,您的区域设置文件需要具有复数的定义。正如您在问题中添加的那样,在波兰语中,您可能会看到

"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 注释”/“%d 注释”准备翻译。例如

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

请将 .po 文件编译为 .mo 文件并放置到适当的文件夹中。(例如语言/(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 />";

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

define ('WPLANG', 'pl');

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


答案 2

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

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


推荐