- Importamos el módulo gettext con la línea:
import gettext
- 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.
- 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
- 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.
- 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.
- 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.
- 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
- 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/
- 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).
- 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
- 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.
- 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: