Marquage des chaînes à traduire

Les chaînes littérales doivent être saisies dans le code source en anglais, mais elles doivent être incorporées dans un appel à la fonction gettext(). Ces chaînes seront extraites pour traduction et les traductions utilisées lors de l'exécution au lieu des chaînes originelles en anglais.

Le paquetage GNU gettext vous permet de marquer des chaînes dans le code source, de les extraire pour traduction et d'utiliser les chaînes traduites dans votre application.

Toutefois, Glib définit des macros de prise en charge de gettext() qui sont des enveloppes plus brèves et de forme plus commode à utiliser. Pour utiliser ces macros, incluez <glibmm/i18n.h>, puis, par exemple, remplacez :

display_message("Getting ready for i18n.");
par :
display_message(_("Getting ready for i18n."));

À titre de référence, il est possible de générer un fichier qui contienne toutes les chaînes apparaissant dans votre code, même si elles ne sont pas marquées pour la traduction, avec le nom du fichier et le numéro de la ligne où elles se situent. Pour générer ce fichier que nous appelons my-strings, exécutez la commande suivante dans le répertoire du code source :

xgettext -a -o my-strings --omit-header *.cc *.h

Pour terminer, pour permettre à votre programme d'utiliser la traduction pour l'adaptation locale en cours, ajoutez ce code au début de votre fichier main.cc pour initialiser gettext :

bindtextdomain(GETTEXT_PACKAGE, PROGRAMNAME_LOCALEDIR);
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);

XXVI.II.I. Comment fonctionne gettext

Le script intltool / xgettext extrait les chaînes et les place dans un fichier mon_paquet.pot. Les traducteurs de votre application créent leur traduction en faisant d'abord une copie du fichier .pot dans un fichier nom_de_locale.po. Une « locale » identifie une langue et un codage pour cette langue, y compris les formats numériques et de date. Ultérieurement, si le texte de votre code source a été modifié, le script msmerge sera utilisé pour mettre à jour les fichiers nom_de_locale.po à partir d'une nouvelle génération du fichier .pot.

Au moment de l'installation, les fichiers .po sont convertis dans un format binaire (avec l'extension .mo) et placés dans un répertoire système pour les fichiers d'environnement linguistique, par exemple /usr/share/locale/.

Quand l'application est lancée, la bibliothèque gettext vérifie dans le répertoire système s'il y a un fichier .mo pour l'environnement linguistique de l'utilisateur (environnement que vous pouvez définir avec, par exemple, « export LANG=de_DE.UTF-8 » à partir d'un terminal). Puis, quand le programme atteint un appel gettext, il examine s'il existe une traduction pour la chaîne donnée. Si aucune n'est trouvée, la chaîne d'origine est utilisée.

XXVI.II.II. Vérification et ajout de traductions

Pour vérifier que vous avez bien opéré, peut-être voudrez-vous ajouter une traduction pour un nouvel environnement linguistique. Pour réaliser cela, allez dans le sous-répertoire po de votre projet et exécutez les commandes suivantes :

intltool-update --pot

Cette commande crée un fichier nommé nom_du_programme.pot. Copiez ensuite ce fichier en lui donnant le nom code_langue.po, comme de.po ou hu.po. Ajoutez également ce code langue dans le fichier LINGUAS. Le fichier .po comporte un en-tête et une liste des chaînes en anglais, avec des emplacements pour les chaînes traduites à saisir. Assurez-vous que vous avez défini et utilisé UTF-8 comme codage du fichier .po (comme défini dans l'en-tête, mais utilisé dans le contenu).

Il est possible que certaines chaînes soient marquées fuzzy (approximatives) dans le fichier .po. Les traductions ainsi marquées ne se substituent pas à la chaîne originelle. Pour qu'elles apparaissent, enlevez simplement la marque fuzzy.

XXVI.II.III. Ressources

Des informations supplémentaires sur le processus d'internationalisation et de localisation sont présentées et commentées dans :