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" 形式仅适用于整数 0
和 1
。
您将在您的法语 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。
在 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" 形式仅适用于整数 0
和 1
。
您将在您的法语 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。