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

ngettext doesn't work in the native langage (PHP)

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

如果我编码:

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

它会 return 英语(母语):

0 articles avalaible

但 return 正确的法语形式(用 poedit 翻译):

0 article disponible

我不明白为什么....

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

在法语中,当我们有一个 0 时,我们不必把这个词变成复数形式。 在英语中,对于零项,我们必须将项置于复数形式。

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

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

Unicode 的 CLDR 复数规则倾向于被编辑 PO 和编译 MO 文件的软件遵守。 e.g. for French 表明对于基数复数(我们用于数量的复数),"one" 形式仅适用于整数 01

您将在您的法语 PO 和 MO 文件中看到 Plural-Forms header 有一个根据 n(即数量)的等式。当 n(传递到 ngettext )大于 1 时,它可能是 (n > 1) 或导致偏移量 1(意思是 msgstr[1])的类似方程式。

如果你把这个 header 改成 (n != 1) 你会得到像英语和德语这样的复数形式,其中 "one" 永远是 1.

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

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