Internacionalización

Tabla de contenidos

Internacionalización de aplicaciones

Internacionalización de aplicaciones

Si se desea que la aplicación esté disponible en diferentes idiomas, es necesario internacionalizarla, de tal forma de separar todas las cadenas de textos que aparecen en la aplicación y que puedan ser manipuladas por el equipo de traducción respectivo. El proceso de internacionalizar una aplicación también se conoce como i18n. A su vez, el proceso de traducir mensajes de un programa se conoce como l10n.

La idea básica de i18n es marcar aquellas cadenas de texto para que puedan ser traducidas. Para ello existen funciones especiales, donde la más conocida es gettext.

intltool

La utilidad gettext es la que permite extraer cadenas desde programas, sin embargo,intltool es una herramienta que extiende su funcionalidad, permitiendo la traducción de archivos desktop (empleados en el menú), glade, gconf, xml, entre otros. Es posible escribir programas traducibles sin emplear intltool, pero es mucho más cómodo utilizar la infraestructura existente en GNOME, aunque se utilice para proyectos no GNOME.

Intltool permite:

  1. Detectar las herramientas necesarias para la configuración y construcción de la aplicación.

  2. Extraer las cadenas a traducir

  3. Mezclar las traducciones en la aplicación final

Cambios en la estructura de directorios

Se debe añadir el directorio "po", donde se ubicarán el archivo con todas las cadenas traducibles (hola-mundo.pot) y los archivos en cada idioma (es.po, fr.po, etc.). Los archivos esenciales dentro de este directorio son:

POTFILES.in,

contiene una lista de todos los archivos en el proyecto que contienen cadenas a traducir.

POTFILES.skip,

contiene una lista de los archivos que no deben ser considerados como traducibles. Es útil cuando hay archivos de programas que están siendo usados, pero que aún permanecen en el proyecto y así evitar esfuerzo innecesario por parte del equipo de traductores.

ChangeLog,

un registro de todos los cambios efectuados en el manejo de i18n y l10n.

A través de intltool-update se puede obtener los nombres de los archivos que tienen cadenas a traducir, lo cual se detalla en la sección.

Cambios en configure.in

Para añadir soporte de i18n con intltool se requiere añadir algunas macros al archivo configure.in[5], las cuales se muestran en el listado \ref{configure.in-i18n}. Lo primero es añadir la macro AC_PROG_INTLTOOL, que indica que se hara uso de esta herramienta y, en forma particular, se requiere al menos de la versión 0.23.

Ejemplo 1. configure.in con soporte i18n

 	   

Entre la línea 11 y 13 se muestra la forma para definir símbolos al preprocesador de C. La línea 11 asigna un valor de texto a la variable GETTEXT_PACKAGE, la macro AC_DEFINE_UNQUOTED se encarga de dejar disponible el valor para GETTEXT_PACKAGE para los programas, en términos de programación, será equivalente a:

\lstinputlisting{define.c}

el cual se registrará en el archivo config.h. La macro AC_SUBST permite que se pueda emplear @GETTEXT_PACKAGE@ dentro de los archivos Makefile.am y puedan acceder a su valor. En este caso, será útil para el Makefile que se generará en el directorio "po"

Posteriormente, en la línea 15, se ha definido una cadena vacía para ALL_LINGUAS, debido a que aún no hay idiomas disponibles. Normalmente contendrá los códigos de los idiomas separados por espacios, por ejemplo:

\lstinputlisting{configure-i18n.in}

En la línea 16, la macro AM_GLIB_GNU_GETTEXT se encarga de realizar las verificaciones necesarias para el uso de gettext. Además se encarga de definir los símbolos HAVE_GETTEXT y ENABLE_NLS en el archivo config.h. La macro AM_GLIB_GNU_GETTEXT es propia del entorno de desarrollo GTK+, sin embargo es bastante. Si se quiere evitar su uso, puede ser reemplazada por AM_GNU_GETTEXT, con prestaciones menores.

Finalmente, línea 22, se ha añ¡¤©do un nuevo archivo de salida: po/Makefile.in.

Cambios en Makefile.am

Se añ el directorio "po" en la lista de subdirectorios en los cuales make debe ingresar. Además, se han añadido las utilidades de intltool como archivos extras.

Ejemplo 2. Makefile.am con soporte i18n

 	   
 	   

También es necesario modificar el archivo Makefile.am en el directorio src. Allí se añadir la variable INCLUDES, en donde se define el lugar donde residirán las cadenas traducidas. El símbolo allí indicado será utilizado dentro del programa.

Además, se añade un nuevo archivo dentro de los programas fuentes: hola-mundo-i18n.h, descrito más adelante.

Ejemplo 3. Makefile.am con soporte i18n

 	   
 	   

Cambios en el código fuente

Como se indicó en la sección, se ha añadido un archivo de cabecera, cuya línea esencial es la 9, donde se asocia _() como un sinónimo de la función gettext() y de esta manera simplificar la lectura de los programas respecto a las cadenas que se han marcado como traducibles.

Ejemplo 4. hola-mundo-i18n.h

 	   
 	   

En caso que no este disponible el conjunto de herramientas de internacionalización, se ha definido de tal forma que no provoque problemas en compilar.

El programa hola-mundo.c también sufre modificaciones:

Ejemplo 5. hola-mundo-i18n.c con soporte i18n

 	   
 	   

Como se aprecia, se usa la ENABLE_NLS para comprobar si se está compilando con soporte i18n, en cuyo caso define el dominio o ámbito de las traducciones, normalmente reducido al dominio del programa y que se encuentra definido en GETTEXT_PACKAGE, el cual fue declarado previamente en el archivo configure.in (ver listado \ref{configure.in-i18n} en la sección. También se especifica el directorio donde se encuentran las traducciones, la cual fue definida en el archivo src/Makefile.am. Además, se especifica el conjunto de caracteres a emplear, en este caso UTF-8.

Finalmente, en la línea 18, se puede apreciar que la cadena ha sido marcada para ser traducida al colocarla dentro de la función _(). Desde el punto de vista de programación, no recarga con nombres de función largos ni distrae la lectura para lo que es una tarea rutinaria en proyectos grandes.

El texto de la función printf ahora aparece en inglés, lo cual es lo recomendable, pueso que es mucho más sencillo encontrar traductores de inglés a otro idioma que de español a otro idioma.

Preparación del ambiente

Dentro de la sencuencia de comandos, es necesario añadir glib-gettextize[6], que crea el archivo po/Makefile.in.in, e intltoolize, para disponer de las herramientas para manejar las cadenas a traducir.

Ejemplo 6.

 	   
 	   

Con esto se dispone de la infraestructura básica para tener una aplicación disponible en distintos idiomas. Sin embargo, aún falta un trabajo que realizar en el directorio "po", y que consiste en determinar el contenido del archivo POTFILES.in. Para ello, dentro de dicho directorio basta invocar el comando:

Ejemplo 7.

 	   
 	   

el cual mostrará los archivos que tienen cadenas a traducir y que no se encuentran en el archivo POTFILES.in. Para facilitar el trabajo, también se genera un archivo llamado "missing"[7] que puede ser añ¡¤©do al final de POTFILES.in.

En estos momentos ya es posible ejecutar el script configure y compilar la aplicación.

Últimos pasos: traducir las cadenas

A estas alturas se dispone de toda la infraestructura para poder comenzar a traducir la aplicación. Por lo tanto, es necesario generar el archivo maestro que contiene todas las cadenas a traducir y que puede ser empleado para comenzar el soporte para un nuevo idioma. Dentro del directorio "po" basta ejecutar:

Ejemplo 8.

 	   
 	   

De esta forma se generará el archivo hola-mundo.pot[8] que es una plantilla, el cual empleamos para comenzar la traducción al español (es.po). Para que las cadenas se actualicen de acuerdo a como cambia la aplicación y que además se distribuya, es necesario agregar "es" en la variable ALL_LINGUAS del archivo configure.in.

Finalmente, tras ejecuta make distcheck, se tendrá la versión 0.2 del programa hola-mundo.

Un proyecto GTK+/GNOME. pkg-config


[5] Se ha cambiado la versión a 0.2 para esta versión "internacional".

[6] En caso que no se disponga, se puede emplear gettexttize que es más limitado.

[7] Este archivo puede ser borrado, porque solo es para informar en un instante dado.

[8] El nombre hola-mundo se obtiene de la definición de GETTEXT_PACKAGE en el archivo configure.in.