Localisation des pluriels

Bonjour,

Cette discussion est au sujet d'une fonctionnalité que vous pouvez ajouter à vos extensions. Et si elle est très utilisé, peut-être qu'elle un jour sera acceptée dans le cœur de PluXML.


Il était une fois un développeur qui voulait afficher un nom en fonction d'un nombre variable. Dans cette situation, on arrive rapidement à trouver le code "if nombre > 1" qui permet d'afficher le pluriel du nom. Tout se passe comme prévu, on obtient "1 année" et "2 années" avec le "s" bien présent et on réutilise plusieurs fois ce code sans se douter du piège qui se prépare dans l'ombre.

Notre développeur se frotte maintenant à une application qui a besoin de présenter un résultat localisé et souvent c'est la langue internationale du moment, l'anglais, qui entre en jeu.
On fini par traduire "année" par "year" et "années" par "years", on a donc "1 year" et "2 years" et on est content. Mais la joie est de courte durée quand quelqu'un nous apprend que "0 year" n'est pas correct puisqu'en anglais (comme par exemple, en allemand ou en esperanto), l'accord avec 0 prend la marque du pluriel !
Dans la précipitation, on tente un "if" imbriqué mais avec un peu de recul on commence à chercher comment gérer cette différence de grammaire pour pouvoir gérer n'importe quel langue.

Et là c'est la drame ! On apprend non seulement que certaines langues suivent des règles d'accord encore différentes de celles déjà rencontrées mais qu'en plus, au lieu d'avoir 2 formes du nom (singulier et pluriel), certaines langues utilisent 6 formes différentes ! Par exemple le russe, qui sera probablement la prochaine langue internationale, utilise 3 formes :
+ une 1re forme pour les nombres qui se terminent par 1 mais pas par 11
+ une 2e forme pour les nombres qui finissent par 2, 3, 4 mais pas par 12, 13 ou 14
+ et une 3e forme pour les autres cas


Heureusement, plusieurs générations de développeurs polyglottes se sont déjà arrachés les cheveux pour résoudre ce casse-tête et je vous propose ici la solution utilisée par les outils "gettext" qui consiste à définir une règle qui indique, pour chaque langue, la forme à utiliser en fonction du nombre.

En mettant cette règle dans le fichier de la langue, ça peut donner le contenu suivant par exemple pour l'allemand :
https://github.com/mathieu269/NumerojLingvo/blob/master/lang/de.php

Et ensuite dans le code de l'extension, vous ajoutez le code suivant (celui qui est surligné) :
https://github.com/mathieu269/NumerojLingvo/blob/master/NumerojLingvo.php#L17-L25

Et on obtient bien le résultat voulu :
exemple-NumerojLingvo.png

Vous pouvez allez voir le code du fichier admin.php pour voir comment produire ce résultat.


Comme indiqué en commentaire, le code fonctionne seulement à partir de PHP 5.3 puisque cela utilise une fonction anonyme. Cela ne peux donc pas être intégré dans le cœur actuel de PluXML puisqu'il doit pouvoir fonctionner à partir de PHP 5.0.
Mais de plus en plus d'hébergeur ne plus propose plus de version inférieure donc si vous êtes dans la minorité des cas, vous pouvez par exemple donner un nom à la fonction (un nom unique entre toute les extensions et toutes les langues) et indiquer ce nom dans le tableau de la langue.

Et si vous avez besoin de connaitre les règles de choix de la forme dans d'autres langues, vous pouvez en trouver ici :
http://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html?id=l10n/pluralforms

Réponses

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Intéressante remarque.

    Cela me fait penser à scenario en italien qui donne scenarii au pluriel.
    Avant de passer au pluriel, il faut raccourcir le singulier.
    Mais l'Académie française a tranché: cela sera scénarios car scénario est un mot considéré comme français

    Quant aux versions de PHP, je crois qu'il va falloir se fixer des limites. Mon principe est : on se limite aux 3 versions téléchargeables sur php.net. Pour l'instant on fera une exception à la 5.4 puisque la 7.0 vient juste de bouleverser l'ordre établi. De plus, il semble qu'il y a encore dans la nature quelques serveurs qui tournent sous Debian/wheezy et donc PHP 5.4.

    A++
Connectez-vous ou Inscrivez-vous pour répondre.