Symfony2具有特定规则的复数翻译(当数字以特定数字结尾时)

时间:2013-04-04 09:50:46

标签: symfony translation plural

我正在尝试将结果数转换为立陶宛语,并且有一些特定的规则。我会试着解释一下:

  • 所有以零(0,10,20 ... 1050,1060 ......)结尾以及12& 19包括(12 ... 19)
  • 所有以1结尾的计数,除了以11结尾(1,21,31 ... 1221,1231 ......但不是11,111,211 ...... 2311,2411)
  • 上面未列出的所有其他内容(包括2 ... 9和超过21以上规则不适用)

我尝试过这样的事情(使用YAML),但偶数40与规则不符:

'%count% Results, ': '{0,*0}%count% rezultatų |{1,*1}%count% rezultatas |]1,10[%count% rezultatai |]10,20[%count% rezultatų '

甚至可以使用YAML做类似的事情吗?通过上面的例子,我得到了:

  

在渲染模板期间抛出了异常   (“无法选择”{0,* 0}%count%rezultatų的翻译   | {1,* 1}%count%rezultatas |] 1,10 [%count%rezultatai |] 10,20 [%count%   rezultatų“with locale”lt“。仔细检查这个翻译有   正确的复数选项(例如“有一个苹果|有%计数%   苹果 “)。”)

2 个答案:

答案 0 :(得分:4)

Symfony2的翻译仅支持ISO 31-11 notation。该格式没有您正在使用的*野外图。现在,Symfony2无法实现您的目标。

但是,您可以扩展Symfony的Translator并添加此功能。您可以通过覆盖Symfony\Component\Translation\MessageSelector类,添加功能然后将服务参数translator.selector.class更改为您的类名来实现。例如:

// src/Acme/TranslationExtraBundle/Translation/MessageSelector.php
namespace Acme\TranslationExtraBundle\Translation;

use Symfony\Component\Translation\MessageSelector as BaseMessageSelector;

class MessageSelector extends BaseMessageSelector
{
    public function choose($message, $number, $locale)
    {
        // ... your special logic

        return parent::choose($message, $number, $locale);
    }
}
parameters:
    translator.selector.class: Acme\TranslationExtraBundle\Translation\MessageSelector

答案 1 :(得分:3)

所以我试图在Wouters回答后解决我的问题,发现有Symfony\Component\Translation\PluralizationRules并且立陶宛语已经存在。我所要做的就是从我的翻译行中删除间隔,它现在按预期工作。

'%count% Results, ': '%count% rezultatas |%count% rezultatai |%count% rezultatų '