如何翻译包含多个复数的字符串


How to translate a string containing multiple plurals?

我想翻译一个列出文件夹内容的脚本。其中包含的文件、文件夹和显示的总大小的摘要。到目前为止,我使用 gettext 翻译了所有字符串,但我被困在这里,并寻找一种优雅的方法来解决翻译可能包含多个复数的字符串的问题。可能不用说,但由于每种语言都不同,我想避免连接字符串。

$summary = sprintf(_('%1$s folders and %2$s files, %3$s %4$s in total'), $total_folders, $total_files, $total_size, $unit);

可能的状态(故意省略 0 个案例):

    1
  • 个文件夹和 1 个文件,共 100 KB
  • 1 个文件夹和 2 个文件,总计 200 KB
  • 2 个文件夹和 1 个文件,总计 100 KB
  • 2
  • 个文件夹和 2 个文件,共 200 KB

我认为ngettext()将是_()的合适替代品,但将其与我的例子相结合是让我难以置信的。

复数是翻译的一个基本问题。下面是一个可能对您有所帮助的实现示例: http://symfony.com/doc/current/components/translation/usage.html#pluralization

也许你应该考虑采用他们为symfony所做的翻译组件。

我有解决方案。但是,也许你不知道 - 许多语言都有三种形式的复数形式。

function plural($n, $f1, $f3, $f5)
{
    return $n%10==1&&$n%100!=11?$f1:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$f3:$f5);
}
// for english
echo plural($x, 'monkey', 'monkeys', 'monkeys');