# Utiliser une traduction dans un programme PHP

# Utiliser une forme simple

La fonction fournie en standard par PHP est la fonction gettext.
Cette fonction permet de rechercher dans un catalogue la traduction correspondante au texte donné en paramètre.

// texte simple
print gettext("Redaction");
// texte avec une partie variable
printf(gettext("An error : [%s]"), $errorText);

Note

La fonction _ de PHP est un alias de gettext.

// écriture plus lisible en utilisant l'alias.
print _("Redaction");
printf(_("An error : [%s]"), $errorText);

Attention

La fonction gettext doit avoir comme argument un texte non vide. Si le texte est une chaîne vide alors c'est la description du catalogue qui est retournée.

Le texte à traduire est généralement écrit en anglais (ASCII) et ne comporte pas de caractère accentué.
Ceci permet d'éviter les problèmes d'encodage lors de la génération du catalogue.
Il est cependant possible de mettre des textes à traduire avec des accents.

Dans l'exemple précédent, le texte est très commun et il peut être défini dans un autre module avec une traduction différente.

Deux possibilités permettent de diminuer ce risque de doublon :

  • Utiliser un préfixe:
print _("MyCatalog:Redaction");
  • Utiliser un contexte:
print ___("Redaction", "MyContext");

Le contexte est explicitement indiqué dans le catalogue contrairement au préfixe qui est pris comme un texte simple.
La fonction ___ est un alias de la fonction pgettext. Si le contexte est vide, cela est équivalent à l'utilisation de la fonction standard _.
Ces fonctions ne sont pas natives de PHP, elles sont ajoutées par Anakeen Platform.

# Utiliser une forme plurielle

Les traductions des formes plurielles sont prises en compte par la bibliothèque gettext.

La forme plurielle est indiquée à l'aide la fonction php standard ngettext ou de la fonction npgettext et son alias n___ qui gèrent aussi les contextes.

printf(n___("%d document processed", "%d documents processed", $num, "MyContext"), $num);

Limitations

La localisation des formes plurielles fonctionne de manière partielle avec les nombres décimaux. En effet, la variable numérique de choix de la traduction doit être un entier.
Pour un nombre décimal, seule la partie entière est prise en compte. Ainsi, les nombres 1.3 et 1.6 seront pris comme 1. Cela sera correct pour le français qui considère que tout nombre compris entre ]-2,2[ comme singulier.
Mais cela sera incorrect en anglais qui considère que tout nombre différent de 1 ou -1 n'est pas singulier.