Karmalakas
Karmalakas

Reputation: 1141

Symfony2 plural translation with specific rules (when number ends in specific digit)

I'm trying to translate results count to Lithuanian and there are some specific rules. I'll try to explain them:

I tried something like this (using YAML), but even number 40 doesn't match the rules:

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

Is it even possible to do something like that using YAML? With the above example I get:

An exception has been thrown during the rendering of a template ("Unable to choose a translation for "{0,*0}%count% rezultatų |{1,*1}%count% rezultatas |]1,10[%count% rezultatai |]10,20[%count% rezultatų " with locale "lt". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %count% apples").")

Upvotes: 1

Views: 1897

Answers (2)

Wouter J
Wouter J

Reputation: 41934

Symfony2's Translator only supports the ISO 31-11 notation. That format doesn't have the * wildchart you are using. What you are trying to do is not possible with Symfony2 at te moment.

However, you can extend Symfony's Translator and add this functionality. You can do that by overriding the Symfony\Component\Translation\MessageSelector class, adding the functionality and then change the service parameter translator.selector.class to your class name. For instance:

// 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

Upvotes: 4

Karmalakas
Karmalakas

Reputation: 1141

So I was trying to solve my problem following Wouters answer and found out that there is Symfony\Component\Translation\PluralizationRules and Lithuanian is already there. All I had to do is remove intervals from my translation line and it works as expected now.

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

Upvotes: 3

Related Questions