Préparation du projet

In the instructions below we will assume that you will not be using gettext directly, but intltool, which was written specifically for GNOME. intltool uses gettext(), which extracts strings from source code, but intltool can also combine strings from other files, for example from desktop menu details, and GUI resource files such as Glade files, into standard gettext .pot/.po files.

We also assume that you are using autotools (e.g. automake and autoconf) to build your project, and that you are using https://gitlab.gnome.org/GNOME/gnome-common/blob/master/autogen.sh or a similar autogen.sh file, which, among other things, takes care of some intltool initialization.

An alternative to gnome-common's autogen.sh may look like this:

#! /bin/sh -e
test -n "$srcdir" || srcdir=`dirname "$0"`
test -n "$srcdir" || srcdir=.

autoreconf --force --install --verbose --warnings=all "$srcdir"
echo "Running intltoolize --copy --force --automake"
intltoolize --copy --force --automake
test -n "$NOCONFIGURE" || "$srcdir/configure" "$@"

Créez un sous-répertoire nommé po dans le répertoire racine de votre projet. Ce répertoire contiendra en phase finale toutes les traductions. Dans celui-ci, créez un fichier nommé LINGUAS et un fichier nommé POTFILES.in. Il est aussi de pratique courante de créer un fichier ChangeLog dans le répertoire po pour que les traducteurs puissent garder trace des modifications de traduction.

LINGUAS contient une liste triée alphabétiquement des codes identifiant toutes les langues dans lesquelles votre programme est traduit (les lignes de commentaires débutant par # sont ignorées). Chaque code de langue listé dans LINGUAS doit avoir un fichier .po correspondant. Ainsi, si votre programme a des traductions en allemand et en japonais, le fichier LINGUAS ressemblera à :

# keep this file sorted alphabetically, one language code per line
de
ja

(en outre, vous devez avoir dans le dossier po des fichiers ja.po et de.po contenant respectivement la traduction japonaise et allemande).

POTFILES.in est une liste des chemins vers tous les fichiers contenant des chaînes marquées pour la traduction, à partir du répertoire racine du projet. Ainsi, par exemple, si les sources du projet sont situées dans un sous-répertoire nommé src et si vous avez deux fichiers contenant des chaînes à traduire, votre fichier POTFILES.in ressemble à quelque chose comme :

src/main.cc
src/other.cc

Si vous utilisez gettext directement, vous ne pouvez marquer pour traduction que les chaînes situées dans les fichiers de code source. Mais, si vous vous servez de intltool, vous pouvez marquer des chaînes pour traduction dans divers autres formats de fichier, y compris les fichiers d'interface utilisateur Glade, xml, .desktop et de nombreux autres. Donc si vous avez conçu une partie des interfaces utilisateur du projet à l'aide de Glade, ajoutez également vos fichiers .glade dans la liste du fichier POTFILES.in.

Maintenant que vous disposez d'un endroit où mettre vos traductions, il est nécessaire d'initialiser intltool et gettext. Ajoutez le code ci-après dans votre fichier configure.ac, en mettant le nom de votre programme à la place de « nom_programme » :

IT_PROG_INTLTOOL([0.35.0])

GETTEXT_PACKAGE=programname
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"],
                   [The domain to use with gettext])
AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.17])

PROGRAMNAME_LOCALEDIR=[${datadir}/locale]
AC_SUBST(PROGRAMNAME_LOCALEDIR)

La variable PROGRAMNAME_LOCALEDIR sera utilisée plus tard dans le fichier Makefile.am pour définir une macro utilisée quand vous initialisez gettext dans votre code source.

AM_GLIB_GNU_GETTEXT has been an alternative to AM_GNU_GETTEXT and AM_GNU_GETTEXT_VERSION, but AM_GLIB_GNU_GETTEXT is now deprecated, and shall not be used in new code.

In the top-level Makefile.am:

  • Add po to the SUBDIRS variable. Without this, your translations won't get built and installed when you build the program
  • Define INTLTOOL_FILES as:
    INTLTOOL_FILES = intltool-extract.in \
                     intltool-merge.in \
                     intltool-update.in
  • Add INTLTOOL_FILES to the EXTRA_DIST list of files. This ensures that when you do a make dist, these files will be included in the source tarball.
  • Update your DISTCLEANFILES:
    DISTCLEANFILES = ... intltool-extract \
                     intltool-merge \
                     intltool-update \
                     po/.intltool-merge-cache
  • Depending on the types of files that contain translatable strings, add code such as
    desktopdir = $(datadir)/applications
    desktop_in_files = programname.desktop.in
    desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
    @INTLTOOL_DESKTOP_RULE@

Dans votre src/Makefile.am, mettez à jour votre variable AM_CPPFLAGS en ajoutant la définition de macro préprocesseur suivante :

AM_CPPFLAGS = ... -DPROGRAMNAME_LOCALEDIR=\"${PROGRAMNAME_LOCALEDIR}\"

Cette macro sert quand vous initialisez gettext dans votre code source.