【问题标题】:How to translate a string containing multiple plurals?如何翻译包含多个复数的字符串?
【发布时间】:2014-11-25 22:42:27
【问题描述】:

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

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

可能的状态(0-cases被有意遗漏):

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

我认为ngettext() 将是_() 的合适替代品,但将其与我的示例结合起来让我无法理解。

【问题讨论】:

    标签: php localization gettext php-gettext


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我知道,这正是我寻找使用gettext 解决此问题的方法的原因。在最坏的情况下,我会简单地使用许多 if 语句来做到这一点。
      猜你喜欢
      • 2017-05-11
      • 2014-05-21
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 2019-09-24
      相关资源
      最近更新 更多