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 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.

En el Makefile.am de nivel superior:

  • Añada po a la variable SUBDIRS. Sin esto, las traducciones no se construirán al construir el programa.
  • Defina INTLTOOL_FILES como:
    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 haga un make dist, este comando se incluya en el archivo fuente.
  • Actualice su 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.