Skip to Content

Foire Aux Questions - Internationalisation : Système de traduction Gettext dans Cartoweb

Auteur : Marie

L'internationalisation dans Cartoweb sert bien évidemment à traduire l'application dans différentes langues mais elle peut aussi être utilisée pour personnaliser l'application : par exemple, la traduction sert à développer un nom de champ peu explicite tel que "PARTPSAU" en un libellé clair et compréhensible, "Part des prairies dans la SAU (en %)" dans notre exemple.

Les chaînes à traduire et leur traduction sont regroupées dans des fichiers (une série de fichiers pour chaque langue et chaque projet). Pour changer une traduction, seuls les fichiers de traduction sont à modifier, il n'est pas necessaire de toucher les fichiers de modèles (template) ou de configuration. Ainsi, avec un minimum de fichiers à modifier, il est possible de créer une interface multilangue.

Auteur : Marie

Il existe deux scripts qui permettent de tester cela :

  • /scripts/testgettetxt.sh/ : cela compilera et lancera un petit programme en C qui testera xgettext et msgfmt
  • /scripts/testgettext.php/ : si gettext est correctement installé sur votre système, cela testera le fonctionnement correct de GetText avec PHP

Le script bash (.sh) doit être lancé en premier pour voir si GetText est correctement installé puis le script php pour voir si l'extension est chargée.
NB : Ces scripts nécessitent que les langues ait été correctement configurées. Ils ont été testés sous GNU/Linux avec une installation sous Debian.

On pourra également tester si le module GetText a été installé en chargeant une page php de cet type :

 <?php
 phpinfo();
 ?> 

On devrait alors voir dans la page :

 GetText Support  enabled
Auteur : Marie

Les chaînes traduites sont à chercher dans :

  • les fichiers de modèle (template, extension .tpl), les chaînes comprises entre les balises {t} {/t}
  • les fichiers de configuration des plugins côté client (par exemple la taille des cartes),
  • les fichiers de configuration des plugins côté serveur (par exemple l’étiquette des échelles),
  • le fichier mapfile.map (nom des classes),
  • le fichier layers.ini (étiquettes des couches et des groupes de couches),
  • le code PHP côté serveur et client : les chaînes traduites sont en argument de la fonction I18n::gt() et de la fonction I18nNoop::gt()
Auteur : Marie

Les fichiers po regroupent l'ensemble des chaînes à traduire et leur traduction sous cette forme :

 # Fichier d'origine de la chaîne
 msgid "chaine a traduire"
 msgstr "Chaîne traduite !" 


Les scripts client2pot et server2pot servent à générer les fichiers po. A chaque fois que ces scripts sont lancés les nouvelles chaînes à traduire trouvées sont ajoutées aux fichiers po sans écraser les anciennes déjà présentes dans ces fichiers.


Certains caractères spéciaux nécessitent une syntaxe particulière pour être interprêtés :

  • pour insérer un guillemet, il faut le faire précéder de \
  • pour insérer des sauts de lignes dans une chaîne traduite il faut rajoute \n en fin de ligne, ce qui donnera :
 # Fichier d'origine de la chaîne
 msgid "chaine a traduire" 
 msgstr "" 
 "Chaîne traduite \n" 
 "avec un saut de ligne !" 


Avec quoi éditer les fichiers po ?

  • "à la main" avec un éditeur de texte quelconque,
  • avec un logiciel spécialisé : poEdit ou KBabel par exemple.


Une fois les fichiers po complétés, ne pas oublier de lancer le script po2mo pour générer les fichiers mo interprétés par l'application. Si une même chaîne est présente deux fois dans les fichiers po et qu'elle est traduite de deux manières différentes, regardez dans le fichier po final généré par le script po2mo (au même endroit que les autres fichiers po mais non interprété par l'application), vous y verrez une ligne "#,fuzzy" suivie des chaînes dont la traduction est ambiguë. Il faut donc corriger cela dans les fichiers po sources.