在PHP中,ngettext在本地语言中不起作用。
如果我编码:
printf( ngettext( '%d article avalaible', '%d articles avalaible', 0), 0);
它将以英文返回(本地语言):
0篇 s avalaible
但是用法语返回正确的表格(用poedit翻译):
0篇文章
我不明白为什么......
答案 0 :(得分:1)
好吧没有问题,只是我的错误。
在法语中,当我们得到0时,我们不必将该词复数形式。 在英语中,零项目,我们必须把项目复数。
答案 1 :(得分:0)
我知道你已回答了自己的问题,但我想我会添加一些技术性的Gettext信息。
MO文件规定了多个规则,根据Unicode标准,您的示例对于法语是正确的。
Unicode的CLDR复数规则趋势由编辑PO并编译MO文件的软件观察。 e.g. for French表示对于基数复数(我们用于数量的复数),“一”形式仅适用于整数0
和1
。
您会在法语PO和MO文件中看到Plural-Forms
标题有n
(数量)方程式。当n(传入ngettext)大于1时,它可能是(n > 1)
或导致偏移1
(意味着msgstr[1]
)的类似方程式。
如果您要将此标题更改为(n != 1)
,您将获得复数,例如英语和德语,其中“one”只是1
。
这是一个不完美的系统,因为在英语中我们可能会说“没有可用的文章”为零。但Gettext只支持源语言中的两种形式。此外,这些规则必须适用于整个文件,这意味着单个字符串不能有自己的规则。
如果复杂的复数在您的应用程序中很重要,我可能会建议使用更具表现力的复数逻辑的系统,例如Symfony's implementation。