Maintenant que nous avons fini de préparer le terrain, nous allons pouvoir commencer à coder.
Pour afficher une traduction, il suffit de faire
echo gettext("La clé")
ou
echo _("La clé")
(c'est un alias). En faisant ceci, PHP ira chercher le fichier de traduction que nous aurons spécifié plus tôt dans le code et affichera la valeur (
msgstr
) correspondant à la clé entre guillemets (
msgid
).
Notre code sera très simple.
Nous créerons une page contenant 3 petits liens : français, anglais et allemand. En fonction du bouton sur lequel l'utilisateur aura cliqué, nous afficherons un message de bienvenue et nous lui dirons au revoir dans la langue souhaitée.
PHP fournit des fonctions permettant d'utiliser GetText. Voici celles que nous utiliserons :
Nous nous servirons également des fonctions
putenv()
et
setlocale()
qui permettent respectivement de modifier la valeur d'une
variable d'environnement et de changer les informations de localisation.
Je ne vais pas vous faire languir plus longtemps, voici le code entièrement commenté :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | <?php
if (!empty($_GET['lang'])) { // Si l'utilisateur a choisi une langue
switch ($_GET['lang']) { // En fonction de la langue, on crée une variable $langage qui contient le code
case 'fr':
$langage = 'fr_FR';
break;
case 'en':
$langage = 'en_US';
break;
case 'de':
$langage = 'de_DE';
break;
default:
$langage = 'fr_FR';
break;
}
putenv("LANG=$langage"); // On modifie la variable d'environnement
setlocale(LC_ALL, $langage); // On modifie les informations de localisation en fonction de la langue
$nomDesFichiersDeLangue = 'traductions'; // Le nom de nos fichiers .mo
bindtextdomain($nomDesFichiersDeLangue, "./locale"); // On indique le chemin vers les fichiers .mo
textdomain($nomDesFichiersDeLangue); // Le nom du domaine par défaut
/* On affiche les phrases traduites */
echo gettext('Bienvenue !');
echo '<br >';
echo _('Aurevoir !');
echo '<br /><br />';
}
/* On affiche les liens des différents langages */
echo '<a href="index.php?lang=fr">français</a><br />';
echo '<a href="index.php?lang=en">english</a><br />';
echo '<a href="index.php?lang=de">deutsch</a><br />';
?>
|
Ici, nous affichons trois liens correspondants à divers langages. Chacun d'eux envoie par l'URL une variable
$_GET['lang']
qui contient soit
fr
soit
en
soit
de
. Le script vérifie si cette variable existe (donc si l'utilisateur a choisi une langue) et si c'est le cas, en fonction de son contenu, il crée une variable
$langage
ayant pour valeur le code langage correspondant (
en
->
en_US,
fr
->
fr_FR,
de
->
de_DE). Les fonctions
putenv()
et
setlocale()
sont ensuite appelées avec comme attribut le contenu de
$variable
. Cela permet en gros de dire à PHP que l'utilisateur utilise telle langue. Puis nous indiquons le nom et l'emplacement de nos fichiers de traduction au moyen des fonctions
bindtextdomain()
et
textdomain()
. Enfin, nous affichons les phrases traduites avec
gettext()
qui prend en argument la clé du fichier de langue (
.mo) correspondant à la valeur traduite que l'on souhaite afficher. En fait, on dit à PHP le fichier qu'il doit aller chercher et la phrase qu'il doit trouver dans ce fichier.
Si vous testez ce code - et à condition que vous avez correctement suivi le tutoriel jusqu'ici - vous devriez voir que le texte est traduit en fonction du lien choisi.
C'est peut-être un peu flou pour le moment mais ne vous en faites pas, ça viendra avec la pratique.
Améliorons ce code
Le script que je vous ai donné était un exemple pour vous expliquer le fonctionnement de GetText. Il reste donc très basique et inutilisable de cette façon sur un vrai site web. Je ne suis pas là pour vous apprendre à coder mais voici quelques suggestions pour perfectionner votre système de traduction.
- Utilisez un cookie pour retenir la langue de l'utilisateur. Au prochain chargement, essayez de récupérer ce cookie pour afficher le site directement dans le langage préféré de l'utilisateur.
- Utilisez la superglobale $_SERVER["HTTP_ACCEPT_LANGUAGE"]
pour obtenir directement la langue favorite de l'utilisateur.
Pour le deuxième point, vous aurez besoin de traiter la valeur de
$_SERVER["HTTP_ACCEPT_LANGUAGE"]
. Voici une fonction trouvée sur le tutoriel original qui prend en argument la superglobale et qui renvoie un tableau contenant les langues préférées de l'utilisateur par ordre de préférence. Cette fonction retournant seulement les deux premières lettres (
en
,
fr
,
de
,
es
,
it
...), pensez à récupérer le code par la suite (
en_US,
fr_FR...).

Je ne m'attarderai pas sur ce code car ce n'est pas le but de mon tutoriel.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | <?php
function get_pref_language_array($str_http_languages)
{
$langs = explode(',',$str_http_languages);
$qcandidat = 0;
$nblang = count($langs);
for ($i=0; $i<$nblang; $i++)
{
for ($j=0; $j<count($langs); $j++) {
$lang = trim($langs[$j]);
if (!strstr($lang, ';') && $qcandidat != 1) {
$candidat = $lang;
$qcandidat = 1;
$indicecandidat = $j;
}
else {
$q = ereg_replace('.*;q=(.*)', '\\1', $lang);
if ($q > $qcandidat) {
$candidat = ereg_replace('(.*);.*', '\\1', $lang); ;
$qcandidat = $q;
$indicecandidat = $j;
}
}
}
$resultat[$i] = $candidat;
$qcandidat=0;
unset($langs[$indicecandidat]);
$langs = array_values($langs);
}
return $resultat;
}
?>
|
N'oubliez pas de toujours laisser le choix de la langue à l'utilisateur : avec cette fonction, un Français résidant aux USA ne pourra pas afficher votre site en français. Pensez donc à placer un lien ou un bouton vers les différentes langues.
