【问题标题】:Translate phrase with more than 1 singular/plural value翻译超过 1 个单/复数的短语
【发布时间】:2015-05-01 17:40:19
【问题描述】:

我有以下短语,想翻译一下。

$lifeTime = 'Expires in '.$days.($days == 1 ? ' day ':' days ' ).$h.(($h == 1 ? ' hour ':' hours ' ));

我的问题是:我需要拆分短语,翻译分开并连接它们吗?有没有办法让__n() 函数接受多个单数/复数“实例”,它们各自在一个短语上的计数?

有点混乱。一个清楚的例子:

__('I have %s eggs and %s milk boxes', $eggs, $milk)

这不会有单数和复数形式。我可以让它翻译整个短语而不必将其拆分为两个__n() 函数调用吗?

【问题讨论】:

    标签: php internationalization cakephp-2.0 multiple-value


    【解决方案1】:

    如果您事先知道字符串中可能包含哪些单词,您可以执行以下操作:

    // the preperation/setup
    $translations = Array();
    $translations['hours']['search'] = "%hour";
    $translations['hours']['inflections'] = Array("hour", "hours");
    
    $translations['milk']['search'] = "%milk";
    $translations['milk']['inflections'] = Array("milk bottle", "bottles of milk");
    // add what else you might need
    
    function replaceWithPlurals($heystack, $translations) {
      foreach ($translations as $key => $vals) {
        $heystack = str_replace($vals['search'], $vals['cnt']." ".$vals['inflections'][usePlural($vals['cnt'])], $heystack);      
      }
      return $heystack;
    }
    
    function usePlural($cnt) {
      if($cnt==1) return 0;
      else return 1;
    }
    
    
    // dynamic vars
    $heystack = "I drank %milk in %hour";
    $hours = 1;
    $milk = 2;
    $translations['hours']['cnt'] = $hours;
    $translations['milk']['cnt'] = $milk;
    
    // the actual usage
    echo replaceWithPlurals($heystack, $translations);
    

    总的来说,如果您只需要 4 个特定场合的准备工作,那就是相当多的准备工作了。但如果你经常使用它,我希望这会有所帮助。

    【讨论】:

    • 我想这会起作用,但这样一来,翻译将通过代码进行。由于我使用 i18n 翻译和 .po 文件,我很好奇是否可以以 i18n 方式执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2021-06-28
    • 2015-10-11
    • 2013-08-20
    • 2011-10-04
    相关资源
    最近更新 更多