dimanche 24 janvier 2010

CakePHP et internationalisation - Partie 2

Il y a principalement deux fonctionnalités intéressantes que nous allons utiliser. Tout d'abord, la possibilité de "marquer" des chaînes de caractères comme étant traduisible. En fait, on écrit une clé à la place de la phrase, et CakePHP va automatiquement chercher la traduction correspondante à la langue en cours, dans le fichier adéquat.

Ceci va être utile pour toutes les chaînes de caractères qui composent les parties "statiques" de notre application. Pour les contenus stockés dans la base de données, il y a un "comportement" (Behavior) fourni par Cake qui va en fait déplacer les champs de nos modèles qui doivent être traduits vers une table spécialement créée à cet effet. De la même façon que précédemment, lorsqu'on demandera un contenu, il ira rechercher la traduction correspondante à la langue en cours dans la table qui contient les traductions.

Fonctions gettext()

Nous y voilà. Voici à quoi ressemble un champ de formulaire, avec son label :

Maintenant, ajoutons la petite fonction qui va faire en sorte que la magie opère...

Et voilà ! La fonction __(); prend deux paramètres. Le premier est la fameuse clé à chercher dans les fichiers de traductions. Le second est à false par défaut, ce qui a pour effet d'envoyer le résultat vers la sortie écran, de faire un echo en somme... Donc, si vous avez besoin d'afficher directement un texte traduit, écrivez simplement __('mon texte'). Sinon, mettez le deuxième paramètre à true pour retourner le résultat plutôt que de l'imprimer !

Les traductions se trouvent dans des fichiers default.po. Pour le français par exemple, le fichier se trouvera dans le dossier app/locale/fre/LC_MESSAGES/. Le code langue à 3 lettres suit la norme ISO639-2. Pour une liste des codes, c'est par ici :
Liste des codes ISO639-2

Si Cake ne trouve pas le fichier correspondant à la langue en cours, il affiche simplement le texte de la clé. Ce qui est très utile ! En effet, vous pouvez simplement utiliser les chaînes en français dans les fonctions gettext. C'est donc celles-ci qui s'afficheront par défaut. Vous n'aurez plus qu'à les traduire dans les autres langues.
Les fichiers *.po ont une structure particulière qui est la suivante :
msgid="Clé de la chaîne à traduire"
msgstr="Chaîne traduite"
Il vous faudra ce couple pour chaque chaîne, dans un fichier texte. Attention, le fichier devra utiliser l'encodage UTF-8 ! Pour plus de facilité, il existe un logiciel nommé PoEdit. Je vous le recommande chaudement...
Dispo ici : PoEdit
Bien entendu, CakePHP dispose d'un outil permettant d'extraire en une fois toutes les chaînes à traduire de votre application. Rien de plus simple ! Tapez dans une console cake i18n extract. Cela va créer un catalogue default.pot que vous pourrez ensuite ouvrir avec PoEdit, et créer enfin les fichiers *.po dont vous avez besoin.

Plus tard dans ce tutoriel, je vous expliquerai comment je génère les fichiers *.po et comment j'en gère les traductions directement depuis une interface d'administration.

1 commentaire:

  1. Si vous travaille avec des fichiers .po et vous aves besoin de les traduire, mon suggestion est d'evaluer un outil de traduction comme https://poeditor.com

    RépondreSupprimer