Mandragor


Sélection du fichier de langue

Comme nous avons plusieurs fichiers de langue, nous devons commencer par sélectionner la langue dans laquelle envoyer nos documents au client, et ce en fonction des données envoyées par ce dernier (cookies, get, en-têtes http), et ensuite appeler un set de fonction pour indiquer à gettext dans quel fichier il va devoir rechercher nos chaînes traduites.

Choix de la langue

Le principe pour lequel j'ai opté pour le site avec lequel j'ai découvert les joies de gettext (Docs.eu.org) est le suivant; par défaut, on va traiter l'entête HTTP envoyé par le client, qu'on récupère sous la forme de la variable PHP $HTTP_ACCEPT_LANGUAGE ou $_SERVER["HTTP_ACCEPT_LANGUAGE"]. Cependant, comme je voulais qu'un utilisateur acceptant par défaut le francais puisse également à la version anglaise du site, ce dernier peut recevoir un cookie contenant la langue dans laquelle il souhaite voir le site. Ce cookie aura donc priorité sur le HTTP_ACCEPT_LANGUAGE.

En pratique, voila ce que ca donne; et c'est loin d'être aussi simple qu'on pourrait le croire dans un premier temps. En effet, la syntaxe du $HTTP_ACCEPT_LANGUAGE est la suivante (syntaxe tiré de la RFC 2616, dont vous trouverez une copie ici http://docs.mandragor.org/files/RFCs/26xx/2616):


Accept-Language = "Accept-Language" ":"
                  1#( language-range [ ";" "q" "=" qvalue ] )
language-range  = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )

Je vous traduit cette monstruosité infame: en gros, on peut avoir des code de langue, par exemple en ou fr, optionnellement suivi d'un ";q=valeur", valeur étant un nombre entre 0 et 1 indiquant l'ordre de préférence, celui ayant la plus forte valeur devant être préféré, le q valant 1 lorsqu'il n'est pas exprimé; ces codes de langue sont séparés par des ,. Bon, pour être plus clair, voila ce qu'envoie mon mozilla:

fr,en-us;q=0.7,en;q=0.3

Le fr n'a pas de q (q pour "quality value) défini, son "q" vaut donc 1, la langue à choisir par défaut est donc le français. Passe ensuite l'anglais "américain", avec une "quality value" de 0.7, et enfin l'anglais "pur" :). Ces codes de langue n'étant pas forcément rangés par ordre de préférence, il nous faut donc coder une petite fonction pour gérer tout ca. Pas de panique, ce travail je l'ai déjà fait, vous n'avez qu'a copier ceci.

Spécification de la langue

Pour commencer, vous devez fixer la variable d'environnement LANG à sa correcte valeur. Le format est langue_PAYS; par exemple pour le francais, on aura fr_FR, pour l'anglais en_EN, pour l'américain en_US... On utilisera pour cela la fonction putenv:

putenv("LANG=fr_FR"); , par exemple

Ensuite, appeler setlocale avec comme arguments LC_ALL, et la langue à sélectionner:

setlocale(LC_ALL, $language);

Enfin, vous devez définir un nouveau "domaine" de langues, et dire à gettext d'utiliser ce domaine. En fait, les fichiers de langues sont situés dans une arborescence bien précise, dont gettext a besoin de savoir le répertoire racine et le nom des fichiers de langue. On spécifie ces deux derniers avec la fonction bindtextdomain:

$domain = 'messages';
bindtextdomain("$domain", "/chemin/vers/le/repertoire/racine/du/domaine");
textdomain("$domain");  

Cela signifie que le nom de notre fichier de langue source sera messages.po, sa version compilée messages.mo, et qu'il se trouvera dans le domaine dont le répertoire racine sera "/chemin/vers/le/repertoire/racine/du/domaine".

- Ajouté par Bernard Massot le 31/12/2003 -
Si vous voulez avoir en sortie un codage de caractères différent de celui qu'on utilise par défaut (en général iso-8859-1), changer le nom du charset dans le Content-type du fichier de traduction n'est pas suffisant, il faut utiliser la fonction bind_textdomain_codeset. Par exemple pour obtenir de l'UTF-8 :

bind_textdomain_codeset("$domain", "UTF-8");

Arborescence de fichiers du domaine

Bon, voila le shéma de l'arborescence du domaine. Le répertoire racine sera le répertoire que vous aurez spécifié avec bindtextdomain. Commencez par créer dans ce répertoire un dossier nommé "locale". Dans ce répertoire locale, créez un répertoire pour chaque langue, avec pour nom le code de cette langue (par exemple, fr_FR ou en_US...). Maintenant, dans chacun de ces répertoires, créez un répertoire nommé LC_MESSAGES. Vous devriez maintenant obtenir quelque chose comme cela:

Nous allons maintenant passer au passage intéressant, à savoir la création et la compilation de ces fameux fichiers de langue.