Preparar su proyecto

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 http://git.gnome.org/browse/gnome-common/tree/autogen.sh, which, among other things, takes care of some intltool initialization.

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 contiene una lista ordenada alfabéticamente de códigos que identifican los idiomas a los que se traduce su programa (las líneas de comentarios que comienzan con # se ignoran). Cada código de idioma listado en el archivo LINGUAS debe tener un archivo .po correspondiente. Entonces, si su programa estuviera traducido al alemán y al japonés, su archivo LINGUAS se vería así:

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

(Además, tendría los archivos ja.po y de.po en su carpeta po que contendrían las traducciones al alemán y al japonés, respectivamente).

POTFILES.in es una lista de rutas a todos los archivos que contienen cadenas marcadas para traducción, comenzando desde la carpeta raíz del proyecto. Entonces, por ejemplo, si el código fuente de su proyecto estuviera en una subcarpeta llamda src, y si tuviera dos archivos conteniendo cadenas que deben traducirse, su archivo POTFILES.in se vería así:

src/main.cc
src/other.cc

Si está usando gettext directamente, sólo puede marcar cadenas para traducir si están en el archivo de código fuente. Sin embargo, si usa intltool, puede marcar cadenas para traducir en una variedad de otros formatos de archivo, incluyendo archivos de IU de Glade, xml, archivos .desktop y muchos más. Por lo tanto, si ha diseñado parte de la IU de la aplicación en Glade, entonces también añada sus archivos .glade a la lista en POTFILES.in.

Ahora que hay un lugar en el que poner sus traducciones, necesita inicializar intltool y gettext. Añádale el siguiente código a su configure.ac, substituyendo «programname» con el nombre de su programa:

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)

Esta variable PROGRAMNAME_LOCALEDIR se usará luego en el archivo Makefile.am, para definir una macro que se usará cuando inicialice gettext en su código fuente.

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 commands will be included in the source tarball.
  • Update your DISTCLEANFILES:
    DISTCLEANFILES = ... intltool-extract \
                     intltool-merge \
                     intltool-update \
                     po/.intltool-merge-cache

En su src/Makefile.am, actualice su AM_CPPFLAGS para añadir la siguiente definición de macro de preprocesador:

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

Esta macro se usará cuando inicialice gettext en su código fuente.