ngettext在本地语言中不起作用(PHP)

时间:2018-01-30 21:32:44

标签: php localization internationalization printf gettext

在PHP中,ngettext在本地语言中不起作用。

如果我编码:

printf( ngettext( '%d article avalaible', '%d articles avalaible', 0), 0);

它将以英文返回(本地语言):

  

0篇 s avalaible

但是用法语返回正确的表格(用poedit翻译):

  

0篇文章

我不明白为什么......

2 个答案:

答案 0 :(得分:1)

好吧没有问题,只是我的错误。

在法语中,当我们得到0时,我们不必将该词复数形式。 在英语中,零项目,我们必须把项目复数。

答案 1 :(得分:0)

我知道你已回答了自己的问题,但我想我会添加一些技术性的Gettext信息。

MO文件规定了多个规则,根据Unicode标准,您的示例对于法语是正确的。

Unicode的CLDR复数规则趋势由编辑PO并编译MO文件的软件观察。 e.g. for French表示对于基数复数(我们用于数量的复数),“一”形式仅适用于整数01

您会在法语PO和MO文件中看到Plural-Forms标题有n(数量)方程式。当n(传入ngettext)大于1时,它可能是(n > 1)或导致偏移1(意味着msgstr[1])的类似方程式。

如果您要将此标题更改为(n != 1),您将获得复数,例如英语和德语,其中“one”只是1

这是一个不完美的系统,因为在英语中我们可能会说“没有可用的文章”为零。但Gettext只支持源语言中的两种形式。此外,这些规则必须适用于整个文件,这意味着单个字符串不能有自己的规则。

如果复杂的复数在您的应用程序中很重要,我可能会建议使用更具表现力的复数逻辑的系统,例如Symfony's implementation