Internationalisation (i18n)

Le code source de Galette est intégralement localisé à l’aide de GNU Gettext. Toutes les chaînes à traduire dans le code doivent être en anglais..

Le dossier lang contient :

  • Makefile, make_lang_l12n.py, xgettext.py : utilitaires pour gérer les traductions,
  • *.pot : gabarit pour les traductions, un par domaine,
  • *.po : fichiers de traduction un par langue et par domaine.

Le cœur de Galette est traduit via la plateforme Weblate. La traduction de la documentation de Galette utilise encore la plateforme Zanata, mais migrera certainement vers Weblate aussi dans le futur.

Syntaxe

Deux différents types de syntaxes sont utilisés :

  • syntaxe PHP,
  • syntaxe Smarty.

PHP

Pour la syntaxe PHP, c’est la fonction _T qui est utilisée. Elle prend un second argument optionnel pour le domaine, dont le défaut est galette.

<?php
echo _T("Hello world!");
echo _T("Hello world!", "galette"); //galette is the default domain
?>

Note

Une autre méthode, __() est très similaire à _T(). Cette dernière ne marquera pas les chaînes non traduites.

C’était utilisé pour traduire les routes principalement, mais ce n’est désormais plus possible.

Souvent, vous aurez besoin d’utiliser des variables dans les chaînes à traduire. Pour cela, utilisez un élément de substitution et utilisez une fonction comme str_replace ou preg_replace pour effectuer le remplacement :

<?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")
);
?>

Note

Vous pouvez utiliser les mots que vous voulez en motif, essayez de rester simple pour les autres :) Il y a différents possibilités pour gérer des remplacements dans les chaînes, consultez la documentation de PHP.

Smarty

Les traduction dans les gabarits Smarty sont gérées par un plugin personnalisé :

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

Smarty founit des modifiers qui peuvent être utilisés pour effectuer des remplacements au sein de chaînes entre autres. Mais le remplacement est effectué avant que le texte ne soit envoyé au plugin, et donc la traduction ne peut être trouvée (les substitutions y sont déjà effectuées). Notre plugin Smarty peut prendre deux arguments optionnels pour gérer correctement ces remplacements :

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

Domaines de traduction

Nouveau dans la version 0.9.

Galette utilise des domaines de traduction pour éviter que les chaines ne soient remplacées par des sources externes. Le domaine par défaut (implicite si non défini) est galette.

Chaque plugin fournit son propre domaine.

Vous devez dire aux fonctions quel domaine vous souhaitez utiliser :

<?php
echo _T('Hello, you'); //uses default domain, french will be 'Bonjour, vous'
echo _T('Hello, you', 'another'); //use another doamin ; french will be 'Salut, toi'

Le même exemple, avec Smarty :

{_T string="Hello, you!"}
{_T string="Hello, you!" domain="another"}

Génération des fichiers de langue

Il y a plusieurs étapes pour mettre à jour les traductions de Galette :

  • extraire les chaînes depuis le code source et mettre à jour les gabarits de traductions (fichiers pot) (lacez make extract depuis le dossier lang et commiter les fichier POT mis à jour),
  • (laisser les traducteurs faire leur travail)
  • récupérer les fichiers traduits (PO) depuis la poateforme de traduciton
  • compiler les fichiers de traduction (MO)

Note

Il est possible de générer les fichier PO en local avec make po, mais tous les mécanismes partent du principe que la plateforme de traduction est utilisée.

Une fois le fichier POT à jour a été envoyé sur le miroir Github, une mise à jour est déclenchée sur la plateforme Weblate. Les traductions Weblate sont commitées dans un clone du dépôt Git, et doivent être mergées dans Galette :

$ git remote add weblate https://hosted.weblate.org/git/galette/galette/
$ git fetch weblate
$ git merge weblate/develop

Finalement, vous devez compiler les traductions (les fichiers compilés sont ceux qui seront utilisés) :

$ make mo

Pour rafraichir les langues connues, vous devrez vous déconnecter et vous reconnecter sur votre instance Galette. Vous devrez peut-être redémarrer le serveur PHP également.