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.

However, Glib defines gettext() support macros which are shorter wrappers in an easy-to-use form. To use these macros, include <glibmm/i18n.h>, and then, for example, substitute:

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

For reference, it is possible to generate a file which contains all strings which appear in your code, even if they are not marked for translation, together with file name and line number references. To generate such a file named my-strings, execute the following command, within the source code directory:

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

Finally, to let your program use the translation for the current locale, add this code to the beginning of your main.cc file, to initialize gettext.

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

XXV.II.I. Comment fonctionne gettext

The intltool-update or xgettext script extracts the strings and puts them in a mypackage.pot file. The translators of your application create their translations by first copying this .pot file to a localename.po file. A locale identifies a language and an encoding for that language, including date and numerical formats. Later, when the text in your source code has changed, the msgmerge or intltool-update script is used to update the localename.po files from the regenerated .pot file.

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.

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

To convince yourself that you've done well, you may wish to add a translation for a new locale. In order to do that, go to the po subdirectory of your project and execute the following command:

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.

XXV.II.III. Ressources

More information about what lies behind the internationalization and localization process is presented and demonstrated in: