php - gettext() 中的多个复数形式

标签 php wordpress internationalization 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 文件中的类似定义。

然后,您需要在.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');

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

关于php - gettext() 中的多个复数形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12121515/

相关文章:

php - 我的 wordpress 网站未在 google 中列出

php - .htaccess 重写托管在 Bitnami/EC2 上的 Wordpress 主机

php - 自动加载语言代码点火器

php - 正则表达式抓取最后一场比赛之后的所有文本

php - 突出显示 sql 结果集中的数据值

wordpress - WP 中 CPT 自定义菜单位置的问题

ruby-on-rails - 在 Active Admin 中将 bool 值显示为 'Yes' 和 'No'

c++ - Qt:图像国际化

javascript - 如何在 javascript 中将读卡器数据从 fr-FR 转换为 en-US

php - 将使用 PayPal 支付的 Magento 中不接受的货币转换为美元