# Notation des pluriels pour Translation

Depuis Zend Framework 1.9, Zend_Translate gère les pluriels. Comme presque tous les langages utilisent des pluriels, la traduction doit gérer celà.

Qu'est ce qu'un pluriel? En général, les pluriels sont des mots qui prennent en compte une contenance numérique. Cependant chaque langue a sa propre définition du pluriel. En anglais, par exemple, un seul pluriel par mot existe donc par exemple "car" donnera "cars" au pluriel. D'autres langages comme le russe proposent plusieurs pluriels et plusieurs règles de pluriels.

Lorsque vous voulez utiliser les pluriels avec Zend_Translate vous n'avez pas besoin de savoir comment ceux-ci sont définis, seul le traducteur sait. Vous devez juste savoir la langue dans laquelle traduire.

Il existe 2 manières d'utiliser les pluriels. La traditionnelle qui vous fait utiliser une méthode, la moderne, qui permet d'utiliser la même méthode pour plusieurs pluriels.

## Méthode traditionnelle

Les personnes connaissant gettext vont reconnaitre cette méthodologie. Il existe une seule méthode plural() qui rend le pluriel.

Exemple avec la méthode traditionnelle

La méthode plural() accepte 4 paramètres. Le premier est le messageId au singulier, le second est le messageId du pluriel, le troisième est le nombre ou la quantité.

La quantité va être utilisée pour détecter le pluriel à retourner. Le 4ème paramètre optionnel peut être utilisé pour spécifier une locale concernant la traduction.

    $translate = new Zend_Translate(
        array(
            'adapter' => 'gettext',
            'content' => '/path/to/german.mo',
            'locale'  => 'de'
        )
    );
    $translate->plural('Car', 'Cars', $number);

## Méthode moderne de traduction du pluriel

Utilisez la méthode translate() pour la traduction des pluriels.

Pour utiliser la traduction de pluriels avec translate(), passez un tableau comme messageId plutôt qu'une chaine. Ce tableau doit contenir le messageId original, celui du pluriel, une quantité et optionnellement une locale.

Exemple de la méthode moderne de traduction du pluriel

Pour traduire un pluriel avec la méthode moderne, agissez comme suit:

    $translate = new Zend_Translate(
        array(
            'adapter' => 'gettext',
            'content' => '/path/to/german.mo',
            'locale'  => 'de'
        )
    );
    $translate->translate(array('Car', 'Cars', $number));

Avec cette méthode, vous pouvez utiliser n'importe quelle langue comme messageId original.

Exemple de la méthode moderne de traduction du pluriel utilisant un langage source différent

Imaginons que nous voulions utiliser du russe et que le messageId est russe et non anglais.

    $translate = new Zend_Translate(
        array(
            'adapter' => 'gettext',
            'content' => '/path/to/german.mo',
            'locale'  => 'de'
        )
    );
    $translate->translate(array('Car',
                                'Cars first plural',
                                'Cars second plural',
                                $number,
                                'ru'));

Comme vous le voyez, vous pouvez donner plus d'un pluriel, mais il faut alors spécifier la langue pour que Zend_Translate puisse trouver les règles de pluriel appropriées.

Si vous omettez la langue, l'anglais sera utilisé et tout pluriel superflu sera ignoré.

## Fichiers sources de pluriels

Toutes les sources ne supportent pas les pluriels. Voyez la liste ci-après pour les détails:

Support du pluriel

Adaptateur | Pluriels supportés
--- | ---
Array | oui
Csv | oui
Gettext | oui
Ini | non
Qt | non
Tbx | non
Tmx | non
Xliff | non
XmlTm | non

Lisez la suite pour des exemples.

### Source tableau contenant des pluriels

Un tableau de traduction contenant des pluriels devrait ressembler à ceci:

    array(
        'plural_0' => array(
            'plural_0 (ru)',
            'plural_1 (ru)',
            'plural_2 (ru)',
            'plural_3 (ru)'
        ),
        'plural_1' => ''
    );

Dans cet exemple, "plural_0" et "plural_1" sont les définitions du pluriel depuis le code source. Le tableau à l'index "plural_0" possède les pluriels traduits. Regardez l'exemple suivant avec du vrai contenu et une traduction anglais - allemand.

    array(
        'Car' => array(
            'Auto',
            'Autos'
        ),
        'Cars' => ''
    );

Si votre langue supporte plusieurs pluriels, ajoutez les simplement dans le tableau à la suite du premier pluriel.

### Csv et pluriels

Un fichier csv gérant des pluriels ressemble à ceci:

    "plural_0";"plural_0 (ru)";"plural_1 (ru)";"plural_2 (ru)";"plural_3 (ru)"
    "plural_1";

Toutes les traductions des pluriels doivent être ajoutées après le premier pluriel et tout les pluriels suivants doivent être ajoutés après, mais sans traduction. Notez que le délimiteur est nécessaire pour les pluriels vides.

### Gettext et pluriels

Gettext supporte nativement les pluriels, les fichiers `*.mo` contiennent tout ce qui est nécessaire.

Notez que gettext ne gère pas les langues à plusieurs pluriels, utilisez un autre adaptateur dans ce cas là.

## Custom plural rules

In rare cases it could be useful to be able to define own plural rules. See chinese for example. This language defines two plural rules. Per default it does not use plurals. But in rare cases it uses a rule like (number == 1) ? 0 : 1.

Also when you want to use a language which has no known plural rules, and would want to define your own rules.

This can be done by using Zend_Translate_Plural::setRule(). The method expects two parameters which must be given. A rule, which is simply a callback to a self defined method. And a locale for which the rule will be used.

Your rule could look like this:

    public function MyRule($number) {
        return ($number == 10) ? 0 : 1;
    }

As you see, your rule must accept one parameter. It is the number which you will use to return which plural the translation has to use. In our example we defined that when we get a '10' the plural definition 0 has to be used, in all other cases we're using 1.

Your rules can be as simple or as complicated as you want. You must only return an integer value. The plural definition 0 stands for singular translation, and 1 stands for the first plural rule.

To activate your rule, and to link it to the wished locale, you have to call it like this:

    Zend_Translate_Plural::setPlural('MyPlural', 'zh');

Now we linked our plural definition to the chinese language.

You can define one plural rule for every language. But you should be aware that you set the plural rules before you are doing translations.

Define custom plurals only when needed

Zend_Translate defines plurals for most known languages. You should not define own plurals when you are not in need. The default rules work most of time.