MicroComo: Python + gettext
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
Se asumen conocimientos de programación en C y Python, necesarios para entender los documentos: Partimos del fichero 'saludos.py' que simplemente imprime el mensaje de "Good moorning!", en inglés. Haremos que este mensaje sea traducible al español. La versión internacionalizada de saludos.py será saludos-int.py.


  1. Importamos el módulo gettext con la línea:
    	import gettext
    


  2. Marcamos las cadenas que queramos dejar traducibles con la función _(), es decir, la línea
    	print "Good moorning!"
    
    quedaría:
    	print _("Good moorning!")
    
    Que yo sepa, en Python podemos marcar todas las cadenas que queramos, incluidas las opciones por defecto de funciones, las respuestas permitidas a preguntas, las usadas en comparaciones, las declaradas como variables globales (para usarlas como constantes), e incluso las cadenas de documentación de las funciones. Los comentarios del código son obviamente ignorados.

  3. Extraemos las cadenas marcadas con el comando 'pygettext' (sustituto de 'xgettext'), lo que genera un fichero llamado <dominio>.pot que contiene las cadenas traducibles. . En nuestro ejemplo el dominio se llama 'saludos' y el fichero .pot generado es 'saludos.pot'. El comando para la ocasión es:
    	$ pygettext -d saludos -o saludos.pot saludos-int.py
    


  4. Editamos el fichero 'saludos.pot' para definir algunas variables relativas a la traducción. Luego creamos el directorio para las traducciones ('es' para el español) y copiamos el fichero 'saludos.pot' en 'es/saludos.pox', que es el contendrá las traducciones. En el fichero es.pox se mantienen las tracucciones más recientes, pero no es el que se utiliza para generar los catálogos.

  5. Traducimos los mensajes en el fichero 'es/saludos.pox' con el editor favorito. Este fichero también requiere algunas redefiniciones, como nombre y dirección de contacto del traductor, etc.

  6. Una vez alcanzado un estado estable en la traducción, copiamos el fichero 'es/saludos.pox' en 'es/saludos.po', que es el fichero de traducción oficial.

  7. Creamos el subdirectorio 'es/LC_MESSAGES' y generamos el catálogo ' es/LC_MESSAGES/saludos.mo' a partir del fichero es.po con el comando 'msgfmt' de las utilidades de GNU gettext. Antes de generar el catálogo es conveniente editar el fichero 'es.po' para definir la variable po-revision-date al valor del momento actual.
    	$ msgfmt -o es/LC_MESSAGES/saludos.mo es/saludos.po
    


  8. Gracias al árbol de directorio 'es/LC_MESSAGES' podemos utilizar el catálogo desde el directorio actual utilizando el argumento localedir de gettext.translations(), apuntando este al directorio ., o bien podemos instalar el catálogo 'es/LC_MESSAGES/saludos.mo' en el directorio de locales del sistema apropiado para el lenguaje en cuestión, en nuestro caso podría ser: /usr/share/locale/es/LC_MESSAGES/

  9. En el comienzo de la ejecución del programa o módulo, crear una traducción e instalarla. Esto se hace con las siguientes dos líneas:
    	t = gettext.translation('saludos','.')
    	t.install()
    
    Pero al intentar cargar una traducción que no exista saltará una excepción que detendrá la ejecución. Para controlar esto y asegurarnos de que la función _() está definida siempre usamos una estructura try: (ver saludos-int.py).

  10. Supongamos ahora que queremos añadir otro mensaje al programa, introducimos en saludos-int.py la línea
    	print _("Good night!")
    
    Ahora tenemos que crear de nuevo la plantilla para la traducción (saludos.pot) y mezclarla con la ya existente mediante el programa 'msgmerge'. Una forma de hacerlo es la siguiente:
    	$ mv saludos.pot saludos.pot.old
    	$ pygettext -d saludos -o saludos.pot.new saludos-int.py
    	$ msgmerge -o saludos.pot saludos.pot.old saludos.pot.new
    


  11. Una vez creada la nueva plantilla de traducción, la copiamos para cada idioma y la mezclamos con las traducciones ya realizadas en el idioma en cuestión. Esto también se hace con 'msgmerge':
    	$ mv es/saludos.pox es/saludos.pox.old
    	$ cp saludos.pot es/saludos.pox.new
    	$ msgmerge -o es/saludos.pox es/saludos.pox.old es/saludos.pox.new
    
    Con esto tenemos en el nuevo fichero 'es/saludos.pox' las traducciones anteriores mezcladas con las cadenas nuevas aún no traducidas. Editamos el fichero para traducir "Good night!", generamos el nuevo catálogo y lo instalamos. A partir de la próxima ejecución del programa la nueva cadena estará traducida.

  12. Análogamente podemos crear traducciones para francés, alemán o el idioma deseado. La función gettext.translation() buscará la traducción adecuada para el idioma que esté definido en la variable de entorno $LANGUAGE, de modo que cambiando esta variable y ejecutando el script veremos las distintas traducciones: