用于复数名词的模块化方法

时间:2011-10-17 01:50:21

标签: php

我认为我们在应用程序说“剩余1分钟”或类似内容之前都遇到过这个问题。我认为这一观察证明了许多程序员忽略了这个问题。

在我的项目中,我通常在这些方面做了一些事情来解释复数名词:

$Count = count($Items);
$Noun = 'minute';
if ($Count != 1)
{
    $Noun .= 's';
}

echo sprintf('There are %u %s remaining.', $Count, $Noun);

我对这种方法有几个问题:

  1. 它将责任放在程序员身上,每次需要生成一个字符串时进行复数检查,因此代码永远不能被重用。
  2. 它不必要地破坏应用程序代码并抑制可读性。
  3. 这不是通用的。这个例子有效,因为“分钟”是“分钟”的复数。 “羊”,“牛”或“真菌”怎么样?
  4. 有没有人对通用的模块化方法有什么想法来解决这个问题?我很满意,不仅仅有一个答案。

3 个答案:

答案 0 :(得分:3)

通常实现一个接受数字和所有单数和复数形容词的函数。

所以样本调用可能是

echo 'There are ' $count . ' ' . pluralize($count, array('minute', 'minutes')) . ' remaining';

如果您决定将应用程序翻译成多种语言,此链接将有助于正确复数:http://translate.sourceforge.net/wiki/l10n/pluralforms

ps:如果您传递额外的第3个参数language,我将使用任何语言都可以正常使用,这将指定使用哪个复数公式。

答案 1 :(得分:2)

我认为使用一般方法会使性能过高,而不会影响这些小代码的实用性。为了实现通用方法,你应该使用dictonary或类似的东西,这与利益相比是非常不必要的。也许这样一个更简单的路线就是性能和实用性之间的正确权衡。

$Count = count($Items);
$Noun = 'minute';
echo sprintf('There are %u %s(s) remaining.', $Count, $Noun);

答案 2 :(得分:1)

处理这个问题的一个简单方法是创建一个带有三个参数的函数:数字,单词的单数拼写和单词的复数拼写。该函数返回单词的单数或复数形式,具体取决于值。它仍然把责任放在程序员身上,但它比你在这里展示的要清晰。