Uno de los bugs críticos que tenía en Enjuéwemela era el de internacionalizarlo/localizarlo.
Este proceso (que tiene en inglés nombres tan complicados que se los refiere normalmente como i18n y l10n, deduzcan ustedes por qué) básicamente permite al programa mostrar todos los textos en el lenguaje del usuario.
Obviamente, para que todos los textos de un programa estén en varios idiomas, la gente tiene que traducirlos, y aparte el programa tiene que mostrar los textos correspondientes en el lugar adecuado, en función del idioma del usuario. La forma de hacer esto está establecida desde hace varios años, y está armada especialmente para facilitar que colaboradores creen nuevas traducciones y se agreguen al sistema.
Esta tecnología se conoce como Gettext, y se puede utilizar desde todos (o casi todos) los lenguajes existentes. Pero una cosa es utilizarlo, y otra es armar el programa para que pueda utilizarlo, y que se puedan agregar nuevas traducciones, etc.
Recuerdo que cuando lo hice para Typus Pocus no salió fácil, y tuve que leer bastante. Casi me pongo a pensar nuevamente como era, pero se me prendió la lamparita y me acordé que en su momento había escrito en ese proyecto un procedimiento_locale.txt, así que lo tomé y usé.
Para que estos pasos los puedan usar todos, los dejo acá. Pero ojo, no muestran como usar gettext desde tal o cual lenguaje (eso lo verán ustedes), sino cómo preparar los archivos y directorios para que luego puedan usar gettext desde sus programas. Por otro lado, los ejemplos son las lineas que tiré para Enjuéwemela, así que están orientados a Python, sepan adaptar.
Entonces...
Creamos el directorio para guardar nuestra estructura de traducciones:
mkdir locale
Editamos todos nuestros archivos y metemos todos los textos que queramos internacionalizar en la llamada a función _()
. O sea, que si teníamos el texto "click here"
y queremos que ese texto se internacionalice, tenemos que dejar _("click here")
. Esto es vital para el próximo paso, y para el funcionamiento luego, ya que _()
será la función de gettext que reemplazará lo que está escrito en el código con lo que se mostrará al usuario en función de su lenguaje.
Generamos el archivo .pot
con todos los textos que utilizamos en nuestro programa. Para ello utilizamos xgettext y le pasamos todos los .py
que usamos (esta utilidad revisará las fuentes y tomará los textos que tienen el _()
que agregamos antes):
xgettext *.py --output=locale/core.pot
Este .pot
es el archivo template que distribuiremos a todos aquellos que deseen traducir nuestro programa. Antes de distribuirlo, deberíamos abrirlo con un editor y completar ciertos campos que están listos para ser rellenados (título, autor, etc.).
La preparación propiamente dicha del sistema ya está completa, los pasos a continuación muestran qué hacer con el .pot
si queremos generar la traducción para un nuevo lenguaje.
Generamos el .po
, renombrando la base del archivo para incorporarle las dos letras del idioma que estamos utilizando. Si es la primera vez, sólo copiamos el .pot
al mismo...
cd locale cp core.pot core_es.po
..., pero si ya teníamos el .po
de antes y ahora tenemos un nuevo .pot
(porque aparecieron nuevos textos en el programa, o cambiaron los que estaban de antes), tenemos que mergear los archivos de la siguiente manera:
cd locale msgmerge core_es.po core.pot > /tmp/po_temporal mv /tmp/po_temporal core_es.po
El próximo paso es abrir el core_es.po
con un editor de texto y traducir todas las cadenas. Luego, tenemos que compilar el .po
al .mo
, que es el archivo que levantará realmente el sistema gettext
:
msgfmt core_es.po
Y finalmente, movemos el archivo compilado a un directorio que tiene que seguir la estructura preestablecida aquí mostrada (prestar atención al renombre del archivo en sí, y a que en el directorio está el idioma utilizado en la traducción):
mkdir -p es/LC_MESSAGES mv messages.mo es/LC_MESSAGES/core.mo
Como último detalle, quiero aclarar que hay muchos editores especializados que muestran los .po
y .pot
uno al lado del otro, especialmente útiles cuando los programas a traducir son muy grandes o contienen muchos textos, pero que realmente uno se puede arreglar con un editor de textos común y corriente.