Marcar cadenas para traducir
Las cadenas literales deben introducirse en el código fuente en inglés, pero deben rodearse por una llamada a la función gettext(). Estas cadenas se extraerán para traducción y las traducciones podrán usarse en tiempo de ejecución en lugar de las cadenas originales en inglés.
El paquete GNU gettext le permite marcar cadenas en el código fuente, extraer esas cadenas para su traducción, y usar las cadenas traducidas en su aplicación.
Sin embargo, Glib define macros de soporte de gettext() que son contenedores más pequeños en una forma fácil de usar. Para usar estas macros, incluya <glibmm/i18n.h>, y luego, por ejemplo, substituya
display_message("Getting ready for i18n.");
display_message(_("Getting ready for i18n."));
A manera de referencia, es posible generar un archivo que contenga todas las cadenas que aparecen en su código, incluso si no están marcadas para traducción, junto con las referencias al nombre de archivo y al número de línea. Para generar un archivo así llamado my-strings, ejecute el siguiente comando, dentro de la carpeta del código fuente:
xgettext -a -o my-strings --omit-header *.cc *.h
Finalmente, para dejar que su programa use la traducción de la localización actual, añádale este código al inicio de su archivo main.cc, para inicializar gettext.
bindtextdomain(GETTEXT_PACKAGE, PROGRAMNAME_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE);
- 27.2.1. Cómo funciona gettext
- 27.2.2. Comprobar y añadir las traducciones
- 27.2.3. Recursos
27.2.1. Cómo funciona gettext
El script intltool / xgettext extrae las cadenas y las pone en un archivo mypackage.pot. Los traductores de su aplicación crean sus traducciones primero copiando este archivo .pot a un archivo localename.po. Una localización identifica a un lenguaje y una codificación para ese lenguaje, incluyendo formatos de fecha y numéricos. Más tarde, cuando el texto en su código fuente haya cambiado, el script msmerge se usará para actualizar los archivos localename.po del archivo .pot regenerado.
En tiempo de instalación, los archivos .po se convierten a formato binario (con la extensión .mo) y se ponen en una carpeta de sistema para archivos de localización, por ejemplo /usr/share/locale/.
Cuando la aplicación se ejecuta, la biblioteca gettext verifica la carpeta de sistema para comprobar si hay un archivo .mo para el entorno de localización del usuario (puede establecer la localización, por ejemplo, con «export LANG=de_DE.UTF-8» desde una consola bash). Más tarde, cuando el programa alcance una llamada a gettext, buscará la traducción de la cadena particular. Si no encuentra ninguna, usará la cadena original.
27.2.2. Comprobar y añadir las traducciones
Para convencerse de que ha hecho lo correcto, tal vez quiera añadir una traducción para una localización nueva. Para hacer eso, vaya a la subcarpeta po de su proyecto y ejecute el siguiente comando:
intltool-update --pot
Eso creará un archivo llamado programname.pot. Ahora, copie ese archivo a languagecode.po, como por ejemplo de.po o hu.po. También añada ese código de lenguaje a LINGUAS. El archivo .po contiene una cabecera y una lista de cadenas en inglés, con espacios para introducir las cadenas traducidas. Asegúrese de establecer la codificación del archivo .po (especificada en la cabecera, pero también en el contenido) a UTF-8.
Es posible que ciertas cadenas se marquen como fuzzy en el archivo .po. Estas traducciones no sustituirán la cadena original. Para hacerlas aparecer, simplemente elimine la etiqueta fuzzy.