Ou comment créer un site multilingue grâce à PHP et GNU Gettext.
Ce dont vous avez besoin :
- Un serveur web avec PHP et le module PHP-Gettext
- les outils Gettext
- un bon IDE comme Quanta+
- un bon éditeur/gestionnaire de catalogue PO comme KBabel
Arborescence et code PHP
En tout premier lieu vous devez créer à la racine de votre site un arborescence du type locale/
code_langue
/LC_MESSAGES (ex: locale/fr/LC_MESSAGES). C'est là que sera placé la traduction pour la langue donnée.
Pensez que votre site doit être en anglais.
En début de chacune de vos pages contenants du texte à traduire vous aurez plusieurs paramètres à définir :
Code :
<?php
$language = le code langue qui peut être récupéré à partir du User Agent du navigateur
;
//correspondance entre le code langue sur 2 lettres et le code long
$locale['en'] = 'en_US';
$locale['fr'] = 'fr_FR';
$locale['de'] = 'de_DE';
$locale['es'] = 'es_ES';
//
putenv("LANG=$language");
setlocale(LC_ALL, $locale[$language]);
$domain = Utilisez ici le nom que vous avez donné à votre projet
;
bindtextdomain("$domain", "./locale");
textdomain($domain);
?>
Ensuite il faut que vos chaînes de texte à traduire soit entourées par la fonction
PHP gettext():
Code :
<?php echo gettext('my text to be translated.'); ?>
Création des catalogues et traduction
Une fois que toutes vos chaînes sont comprises dans des gettext() vous devez
lancer l'utilitaire xgettext qui récupère les chaînes et les stocke dans un
fichier pot :
Shell :
xgettext -D racine_du_site/ --keyword=gettext -L PHP --from-code=fr -p locale
-d domaine
-o racine_du_site/locale/domaine
.pot
après il vous suffit de copier le pot dans locale/fr/LC_MESSAGES/ pour une traduction en français, de changer l'extension en .po, l'ouvrir avec kbabel, faire la traduction et
générer le fichier .mo avec :
Shell :
msgfmt domaine
.po -o domaine
.mo
Si le texte original est mis à jours, il vous faudra relancer xgettext. Puis au
lieu de copier le fichier vous utiliserez msgmerge qui mettra votre .po à jours :
Shell :
msgmerge --backup=numbered -U racine_du_site/LC_MESSAGES/domaine
.po domaine
.pot
Le couteau suisse de l'i18n pour Quanta+
Pour vous aider dans cette tâche, j'ai mis au point une série de scripts et une barre d'outils pour Quanta+.
Installation
Téléchargez les scripts et décompressez l'archive dans ~/.kde/share/apps/quanta/scripts/
Téléchargez la barre d'outils et placez l'archive dans ~/.kde/share/apps/quanta/toolbars/html/
Voici un petit paquetage
RPM pour Mandriva 2006 (il peut être utilisé sur n'importe quelle distribution utilisant RPM)
Pour que la barre d'outils soit chargé automatiquement à l'ouverture d'un fichier php, il vous faut créer le dossier ~/.kde/share/apps/quanta/dtep/php puis créer des liens vers les fichiers .tag contenus dans /usr/share/apps/quanta/dtep/php et copier le fichier description.rc:
Shell :
# mkdir ~/.kde/share/apps/quanta/dtep/php
# ln -s /usr/share/apps/quanta/dtep/php/*.tag ~/.kde/share/apps/quanta/dtep/php/
# cp /usr/share/apps/quanta/dtep/php/description.rc ~/.kde/share/apps/quanta/dtep/php/
Éditez ensuite ce fichier et rajoutez :
Code :
[Toolbars]
Location = html
Names = i18n
Utilisation
Le premier bouton insère <?php print(gettext( ... )); ?> autour du texte sélectionné dans votre document courant.
Ensuite pour chaque langue, vous avez une série de deux boutons :
Celui avec le drapeau lance le script destiné à la création et la mise à jours du catalogue PO. À la première exécution un fichier blacklist.i18n sera créé et le script vous demandera si vous voulez l'éditer. Placez dans ce fichier la liste des dossiers de votre projet qui ne doivent pas être scannés à la recherche de fichier à traduire. La base de votre projet est ./ doncvotre listing doit avoir cette syntaxe:
Code :
./mon_dossier1_de_premier_niveau_Ã _blacklister
./mon_dossier2_de_premier_niveau/mon_dossier_de_second_niveau_Ã _blacklister
Dans cet exemple le dossier2 sera scanné mais pas le sous-dossier.
Une fois votre liste noire éditée, vous pouvez relancer le script.
Cette fois le script scanne votre projet et crée votre catalogue PO pour la langue sélectionnée ainsi qu'un fichier i18n.php contenant la déclaration de votre domaine (son nom est déduit du fichier webprj de Quanta+) ce qui réduit le code à mettre en début de vos pages à ceci :
Code :
<?php
$language = le code langue qui peut être récupéré à partir du User Agent du navigateur
;
//correspondance entre le code langue sur 2 lettres et le code long
$locale['en'] = 'en_US';
$locale['fr'] = 'fr_FR';
$locale['de'] = 'de_DE';
$locale['es'] = 'es_ES';
//
putenv("LANG=$language");
setlocale(LC_ALL, $locale[$language]);
include_once('i18n.php');
?>
Le bouton suivant vous permet d'éditer votre catalogue au moyen de KBabel, la longue phase de traduction commence.
Une fois toutes vos traductions finies, il ne vous reste plus qu'à cliquer sur le bouton rouge complètement à droite pour générer les fichiers .mo pour chaque langue.
Et voila votre site est internationalisé :)