Preparar su proyecto

En las instrucciones a continuación se asumirá que no usará gettext directamente, sino intltool, que se ha escrito específicamente para GNOME. intltool usa gettext, que extrae cadenas del código fuente, pero intltool también puede combinar cadenas de otros archivos, por ejemplo desde los detalles del menú del escritorio y archivos de recursos de la IGU como archivos Glade, en archivos gettext.pot/.po estándar.

También se asume que está usando autotools (por ejemplo, automake y autoconf) para construir su proyecto, y que está usando ./autogen.sh desde gnome-common, que, entre otras cosas, se ocupa de parte de la inicialización de intltool.

Cree una subcarpeta llamada po en la carpeta raíz de su proyecto. Esta carpeta eventualmente contendrá todas sus traducciones. Dentro de ella, cree un archivo llamado LINGUAS y otro llamado POTFILES.in. Es práctica común crear también un archivo ChangeLog en la carpeta po para que los traductores puedan rastrear los cambios de las traducciones.

LINGUAS contains an alphabetically sorted list of codes identifying the languages for which your program is translated (comment lines starting with a # are ignored). Each language code listed in the LINGUAS file must have a corresponding .po file. So, if your program has German and Japanese translations, your LINGUAS file would look like this:

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

(In addition, you'd have the files ja.po and de.po in your po directory which contain the German and Japanese translations, respectively.)

POTFILES.in is a list of paths to all files which contain strings marked up for translation, starting from the project root directory. So for example, if your project sources were located in a subdirectory named src, and you had two files that contained strings that should be translated, your POTFILES.in file might look like this:

src/main.cc
src/other.cc

If you are using gettext directly, you can only mark strings for translation if they are in source code file. However, if you use intltool, you can mark strings for translation in a variety of other file formats, including Glade UI files, xml, .desktop files and several more. So, if you have designed some of the application UI in Glade then also add your .glade files to the list in POTFILES.in.

Now that there is a place to put your translations, you need to initialize intltool and gettext. Add the following code to your configure.ac, substituting 'programname' with the name of your program:

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_GLIB_GNU_GETTEXT

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

This PROGRAMNAME_LOCALEDIR variable will be used later in the Makefile.am file, to define a macro that will be used when you initialize gettext in your source code.

In the top-level Makefile.am:

  • Añada po a la variable SUBDIRS. Sin esto, las traducciones no se construirán al construir el programa.
  • Define INTLTOOL_FILES as:
    INTLTOOL_FILES = intltool-extract.in \
                     intltool-merge.in \
                     intltool-update.in
  • Añada INTLTOOL_FILES a la lista de archivos EXTRA_DIST. Esto asegura que cuando hace un make dist, este comando se incluya en el archivo fuente.
  • Update your DISTCLEANFILES:
    DISTCLEANFILES = ... intltool-extract \
                     intltool-merge \
                     intltool-update \
                     po/.intltool-merge-cache

In your src/Makefile.am, update your AM_CPPFLAGS to add the following preprocessor macro definition:

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

This macro will be used when you initialize gettext in your source code.