Magazine

L10n, un début de globalisation sur cakephp

Publié le 21 novembre 2007 par David Epely

Bien sûr que c'est possible et plus facilement encore avec cakephp 1.2.

Ce que j'entends par globalisation :

  • Globalisation : rendre une application accessible dans différentes langues.
  • L10n (Localization) : le contenant (les éléments de présentation) sont traduits.
  • i18n (internationalization) : le contenu (les articles, etc.) sont traduits

De quoi est-il question ici :

Je ne vais pas montrer comment changer la langue sur une appli cake, celui-ci se charge très bien tout seul de trouver d'où vient l'utilisateur. Non, je vais essayer de présenter les outils pratiques pour démarrer une application ayant un support de langue ou nécessitant une telle mise à jours ou dans le cas comme le mien où on développe sa petite appli chez soi au fur et à mesure. Et je ne parlerai pour l'instant que du contenant (L10n). Dernière chose, je suis sur le système d'exploitation Ubuntu (pour ceux qui n'ont pas l'habitude d'écouter mes déblaterrations)... (ça aura sa petite importance plus tard).

1 - Quelque chose à traduire

Votre appli est déjà bien avancée et vous avez plein de messages (flash ou dans le style), là il n'existe pas beaucoup de solutions, il faut tous les entourer de la fontion "__('My text')". Notez bien qu'il y a 2 underscores (tiret-bas : _ ). Aussi je mets mon texte entre guillemets simples, j'imagine qu'il n'y aura pas de traitement serveur en plus. Ensuite mon texte contient des espaces, pourtant celui-ci est considéré comme identifiant (msgid) : peu importe cela fonctionne aussi et c'est plus agréable pendant la programmation. Mon texte est en anglais, et bien ça j'avais prévu le coup, on ne sait jamais avec qui on va bosser.

//file : app/controllers/pages_controller.php //[...]
function add(){
    if(!empty($this->data)){
 	$this->Page->save();
 	//La page a été sauvegardée
 	//"true" indique  que la chaîne a traduire n'est pas directement liée à un "echo"
 	$this->Session->setFlash(__('Page has been saved', true));
}
//[...]
?>
file : app/views/pages/index.ctp
// pas  besoin de "echo" ni de "true"
 __('Home');
// on peut ici integrer une variable dans la chaîne à traduire
// petite astuce qui peut être utilisé pour la pluralisation
 echo sprintf(__('Hello %s', true), $username);
?>

Ce n'est que le début !

Il faut indiquer à cake que l'on veut utiliser L10n. On peut soit le spécifier dans le controller en question (page) soit dans app_controller pour l'avoir n'importe où dans l'application :

//file : app/app_controller.php
uses('L10n');
class AppController extends Controller{
 //[...]
 }
 ?>

Ensuite pour que cake puisse traduire l'application, il nous faut un fichier contenant toutes les chaines de caractères. Pour ce faire il suffit de creer l'arborescence suivante :

app/locale/{LANG}/LC_MESSAGES/

{LANG} étant une des localisation que l'on veut traduire, cela peut être fr, fr_FR, fre, en, en_US, eng ... et c'est grand choix à faire parmis les multitudes de langues et des déclinaisons. la liste des déclinaisons est disponible dans l'API de cakephp.

Pour ma part j'ai choisis les localisation : "eng" et "fre" qui permet de passer de l'un à l'autre sans se prendre la tête selon ce que demande le navigateur et qui sied à la norme ISO-639-3. J'ai donc les arborescences suivantes:

  • app/locale/eng/LC_MESSAGES/
  • app/locale/fre/LC_MESSAGES/

Je mets de coté "eng" car l'appli est déjà en anglais. Il nous suffit maintenant de créer un fichier default.po qui contiendra nos traductions :

#file : app/locale/fre/LC_MESSAGE/default.po
msgid "Page has been saved"
msgstr "La page a été sauvée"

Et ça y est, la traduction fonctionne!

Ok, mais j'ai une centaine de messages à traduire!

[edit] Extract est bien intégré par défaut sur la pre-beta 1.2.0.5875 de cakephpC'est maintenant qu'on se marre. À l'heure où j'écris cette article, cakephp incorpore un outil qui permet d'extraire les chaînes à traduire.

D'abord il nous faut interpreteur php en ligne de commande pour pouvoir cuisiner (et non je ne pouvais pas mettre "bake" dans ma phrase).

Sur un OS à base de debian (Jor Ubuntu) :

[edit] En installant php5-cli vous n'aurez plus à faire modification sur le script de cake.

sudo apt-get install php5-cgi

On se place ensuite dans le dossier de scripts de cake et on lance le bake :

cd mon_appli/cake/console

Soit on a du bol et tout se lance sans problème et on accès à extract soit "yarien".

J'ai du modifier l'executable "cake" car il ne trouvait pas l'interpreteur php :

#file mon_appli/cake/console/cake
echo "Hello $USER,"
exec php-cgi -q ${LIB}cake.php -working "${APP}" "$@"

Cette modifications n'altère pas le fonctionnement de cake en principe néanmoins je décline toutes responsabilités ^^.

Lancez alors la manipulation suivante pour extraire dans un fichier .pot les messages à traduires :

./cake i18n
>[E]xtract POT file...
>Merge : y
>File Name : default
>[Q]uit

Mettre à jours les traductions.

Oui, on a commencé à traduire l'appli, on va pas le refaire.

Ceci peut être réalisé grâce à l'excellent poedit (que j'ai découvert il y a peu et qui me semble très pouissant).

sudo apt-get install poedit

poEdit est alors accessible dans le menu Application>Développement>poEdit. C'est grâce à lui que l'on va faire nos traductions. Je note parcontre qu'il enregistre par défaut les fichiers sur la norme iso-8859-1. Pour le modifier : menu "catalogue>configuration" Jeux de caractères : utf-8.

On ouvre notre premier fichier de traduction qui se trouve dans app/locale/fre/LC_MESSAGES/default.po et on découvre la première qui a été réalisé. Maintenant on peut le mettre à jours avec notre default.pot que extract a généré. Menu "Catalogue>Mettre à jours depuis fichier .POT" et lui donne notre app/locale/default.pot.

Et ... Il ne reste plus qu'à!

Bien sûr je suis ouvert quand aux astuces et autres améliorations, je viens tout juste de me mettre à la globalisation sur cake et comme je n'ai pas la science infuse, j'ai beaucoup de chance de passer à coté de pas mal de petits trucs bien pratiques. Enfin je dis ça commme ça.


Retour à La Une de Logo Paperblog

A propos de l’auteur


David Epely 3 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte