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

时间:2014-11-25 22:42:27

标签: php localization gettext php-gettext

我想翻译一个列出文件夹内容的脚本。包含文件,文件夹和显示的总大小的摘要。到目前为止,我使用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千字节
  • 1个文件夹和2个文件,总共200千字节
  • 2个文件夹和1个文件,总共100千字节
  • 2个文件夹和2个文件,总共200千字节

我认为ngettext()将是_()的合适替代品,但将此与我的例子结合起来就是我的头脑。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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');