处理单身/复数最优雅的方式?

Cli*_*ote 10 code-readability

假设您正在制作博客软件,并希望显示条目获得的评论数量.你可以这样做:

[Entry title]
[Content........]
[ <?php print($numComments;) ?> Comments]
Run Code Online (Sandbox Code Playgroud)

这可能导致:

[Entry title]
[Content........]
5 Comments
Run Code Online (Sandbox Code Playgroud)

但如果一个条目只有1个评论,我希望该行说"评论"而不是"评论".并且内联if/elses是丑陋和重复的.

处理这个问题的最佳方法是什么?

Mar*_*ler 13

请使用此ngettext功能.它允许您一劳永逸地正确处理英语和其他语言的复数形式.你这样使用它:

printf(ngettext("%d Comment", "%d Comments", $numComments), $numComments);
Run Code Online (Sandbox Code Playgroud)

如果只有一个注释,该ngettext函数将返回第一个格式字符串("%d Comment"),如果有更多,则返回第二个格式字符串("%d Comments").printf然后该函数将数字放入字符串中.

这可能看起来像很多工作,但它非常强大:它适用于具有多个复数形式(!)的语言 - 它们实际存在.PHP手册给出了一个"窗口"这个词的例子,它变成了"1 okno","2 okna"和" 5 oken",用一些我不认识的外来语言......

如果您使用的话ngettext,那么来自遥远国家的未来用户将非常感谢您:-)

编辑:正如评论中所建议的,有一个功能可以执行上述操作:

function pluralize($num, $singleWord, $pluralWord) {
    return printf(ngettext($singleWord, $pluralWord, $num), $num);
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,xgettext不会识别此新功能,但您可以使用该--keyword标志添加它.给定一个文件test.php

echo ngettext("foo", "foos", 1);
echo pluralize(2, "bar", "bars");
Run Code Online (Sandbox Code Playgroud)

你可以用.提取字符串

xgettext --keyword=pluralize:2,3 test.php 
Run Code Online (Sandbox Code Playgroud)

生成的messages.po文件包含以下条目:

#: test.php:7
msgid "foo"
msgid_plural "foos"
msgstr[0] ""
msgstr[1] ""

#: test.php:8
msgid "bar"
msgid_plural "bars"
msgstr[0] ""
msgstr[1] ""
Run Code Online (Sandbox Code Playgroud)

翻译人员将填写每个复数形式,并在消息目录标题中使用正确形成的"Plural-Forms"行,您将能够支持所有语言.