Internationnalisation (i18n)

Le code de Galette est entièrement traduit à l’aide des possibilités offertes par GNU Gettext, quelque peu adapté aux besoins de la cause. L’intégralité des chaînes contenues dans le code source doivent être en anglais.

Dans le répertoire lang, un fichier Makefile permet la mise à jour des différents fichiers, en suivant plusieurs étapes :

  • extraction des chaînes à traduire (_T("My string to traduce") pour les fichiers php et {_T string="My string to traduce"} pour les templates Smarty (voir les détails sur la syntaxe ),
  • génération du messages.po, fichier de traduction qui contient toutes les chaînes à traduire,
  • concaténation du messages.po avec chacun des fichiers de langue prévus (actuellement fr_FR.utf8 et en_US),
  • génération de fichiers php contenant les traductions depuis les fichiers po et compilation des fichiers messages.mo dans les différents dossiers de langue.

Pour créer une nouvelle traduction, il suffit de copier le fichier messages.po vers codelangue.po (de_DE, es_ES, etc...). Si vous souhaitez intégrer un fichier de langue que vous avez traduit dans Galette, contactez la liste des développeurs de Galette, l’une des personnes ayant accès au dépôt vous fournira plus d’explications sur la procédure à suivre.

À compter de la 0.7, Galette supporte pleinement et uniquement l’encodage UTF-8 (norme UNICODE).

Les fonctionnalités de gettext sont désactivées par défaut dans Galette car ce système implique que getext et le module php adéquat soient installés sur le serveur ; mais aussi que les langues utilisées par Galette soient disponibles sur le serveur (il ne serait pas possible d’obtenir la traduction française de Galette via gettext si seul l’anglais est installé sur le serveur par exemple).

Si vous souhaitez activer gettext, il suffira de modifier la valeur de la variables $disable_gettext à false dans le fichier includes/i18n.inc.php :

<?php
$disable_gettext=false;
?>

Syntaxe

Deux types de syntaxes différentes peuvent être rencontrées :

  • la syntaxe PHP,
  • la syntaxe Smarty.

PHP

Pour la syntaxe PHP, on utilise la function « _T » :

<?php
echo _T("Hello world!");
?>

Note

Prenez bien garde à la syntaxe utilisée. Si par exemple vous utilisiez des guillemets simples au lieu de guillemets doubles, la chaîne ne pourrait pas être extraite du code pour traduction !

Il est souvent nécessaire d’utiliser des variables à remplacer dans les chaînes à traduire. Via PHP, on utilisera simplemnt une fonction du type str_replace ou preg_replace pour arriver à nos fins :

<?php
echo str_replace('%name', $adh->name, _T("Hello %name!"));
?>
<?php
$search = array(
   '/%name/',
   '/%surname/',
   '/%town/'
);
$replace = array(
   $adh->name,
   $adh->surname,
   $adh->town
);
echo preg_replace(
   $search,
   $replace,
   _T("Hello %name %surname from %town")
);
?>

Bien entendu, les patterns sont laissés à votre entière discrétion ; pensez seulement que la personne qui traduira pourra mieux contextualiser la chaîne si les variables à remplacer sont un minimum identifiée (nous aurions par exemple pu choisir %s au lieu de %name ; mais ça aurait été moins explicite :-) ).

Smarty

La syntaxe smarty se base sur un plugin développé pour la cause, on l’utilisera de la façon suivante :

<p>{_T string="Hello world!"}</p>

Smarty propose des modifiers pour par exemple effectuer des remplacements. Le problème ; c’est que le remplacement est effectué avant que le texte ait été récupéré, la traduction n’est donc jamais trouvée. Pour pallier à ce problème, notre plugin smarty prend en charge deux attributs supplémentaires : un pattern et une valeur de remplacement ; qui ne seront appliquées qu’une fois la chaîne traduite récupérée :

<p>{_T string="Hello %name!" pattern="/%name/" replace=$adh->name}</p>

La note concernant le nommage des patterns du précédent paragraphe s’applique ici aussi, bien entendu ;-)

Génération des fichiers de langue

La génération des fichiers de langue est gérée par le fichier Makefile du dossier lang. Lancez simplement make depuis le dossier lang, le script fera son office :-)

Dans un premier temps, il va extraire les chaînes à traduire depuis les fichiers source listés. Ces chaînes seront utilisées pour créer les fichiers .po. Le script va aussi compiler les fichiers .mo et générer les fichier de langue PHP.

Une fois les fichiers .po modifiés ; vous aurez à lancer de nouveau la commande make pour que tous les fichiers soient générés. Le processus est identique pour les fichiers de langue des plugins.