Como crear una extensión internacional para GNOME Shell

Este es uno de los capítulos del tutorial Crea tu propia extensión para GNOME Shell. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

¿Quieres que otros usuarios de otros países utilicen tus extensiones para GNOME Shell? La solución está en crear una extensión internacional. Es decir, que tu extensión esté disponible en varios idiomas.

Hasta el momento has hecho lo mas complicado. Has creado tu extensión para GNOME Shell. Además has creado una configuración de forma que el usurio final puede personalizar la extensión a tu gusto. Ahora, estás satisfecho con el resultado final, y has visto que este complemento es de utilidad. Ya tienes claro, que si esta extensión es útil para ti, también será útil para los demás, y has pensado en compartirla. En colaborar en el mundo del software libre, y pasar de ser un mero observador a participar de forma activa. Quieres compartir tu aplicación.

Una vez que has pensado en compartirla, ¿porque compartir tu extensión solo con aquellos que hablen tu mismo idioma?¿Porque no compartirla en otros idiomas? Este es precisamente el objetivo de este artículo, vamos a realizar la internacionalización de extensiones para que cualquiera pueda disfrutar de tu creación con independencia del idioma que hable.

Crear una extensión internacional o internacionalización de extensiones

Tal y como he mencionado en la introducción, una vez ya tienes claro que quieres compartir esa increíble extensión que has creado, lo mejor es que la compartas con todo el mundo. Claro, que para compartir tu extensión con todo el mundo, es necesario que esté en el idioma del usuario. Porque de otra manera no la va a poder utilizar (a menos que conozca tu idioma, claro). Así que como he indicado en la introducción vamsoa  a ver como crear una extensión internacional

Gettext

Al igual que sucede en Python, por ejemplo, para el desarrollo de extensiones en JavaScript se hace uso de gettext. Gettext es la librería GNU de internacionalización (i18n). Es la librería que se utiliza para escribir programas con interfaz en varios idiomas. Y es lo que utilizaremos para crear una extensión internacional.

Así para realizar la internacionalización de nuestro código, tan solo tenemos que utilizar la función gettext , y pasar como parámetro la cadena de texto que queremos internacionalizar. Lo mas habitual es sustituir gettext por _.

La plantilla

Una vez ya hemos implementado gettext en nuestro código, tenemos que utilizar algunas herramientas auxiliares para crear los archivos necesarios que nos permitan realizar la traducción. La primera de las herramientas es xgettext. Esta herramienta se ejecuta sobre el código de nuestra aplicación y generará la plantilla con todas las cadenas de texto que queremos traducir. Para obtener la plantilla ejecutaremos la siguiente orden,

xgettext --keyword=_ --language=JavaScript -o po/po.pot sample.js

Hay que tener en cuenta que en el caso de que el lenguaje sea compilado debes ejecutar xgettext sobre el código fuente. La plantilla generada por esta herramienta, es un archivo *.pot que tiene una estructura similar a esto,

#: src/sample.py:183
msgid "My name is %s.\n"
msgstr ""

La traducción

Una vez ya tenemos la plantilla del código fuente, el siguiente paso es crear los archivos que se utilizarán para traducir a cada uno de los idiomas. Para hacer esto, utilizaremos otra herramienta que es msginit . Para crear nuestra traducción al español, por ejemplo, ejecutaremos la siguiente orden,

msginit --input=po/po.pot --locale=es --output=po/es.po

Donde po.pot es el nombre de la plantilla que hemos generado anteriormente con la herramienta xgettext. De esta forma msginit nos crea un archivo muy similar a la plantilla. Una vez creado, ya podemos comenzar a traducir. Para esto, se puede utilizar un simple editor de texto o alguna herramienta expecífica como puede ser Poedit. Poedit es una herramienta multiplataforma disponible para Linux, MacOS y Windows. Seguro que la encontrarás en tu distribución favorita.

Mi recomendación es que al menos, inicialmente, utilices Poedit para tus traducciones, y cuando estés acostumbrado decidas.

Actualizando traducciones

Si modificas el códifo fuente de tu aplicación, es necesario que actualices por un lado la plantilla, y por otro lado que actualices las traducciones. Para actualizar la plantilla ejecutaremos la siguiente orden,

xgettext --join-existing --keyword=_ --language=JavaScript -o po/po.pot sample.js

El siguiente paso es actualizar las traducciones

msgmerge --update po/es.po po/po.pot

Compilando las traducciones

Una vez creada la traducción, y actualizada en su caso, nos queda como último paso compilarla. Para compilarlo tan solo tenemos que ejecutar la siguiente orden,

msgfmt --output-file=locale/es/app.mo po/es.po

El proceso completo

            xgettext             msginit             msgfmt
sample.js ----------> po/po.pot ---------> po/es.po --------> locale/es/app.mo
           xgettext -j              msgmerge              msgfmt
sample.js -------------> po/po.pot -----------> po/es.po --------> locale/es/app.mo

Un ayudante en forma de script …

Finalmente, esto es un proceso totalmente repetitivo como ya te puedes imaginar. Lo mas sencillo es tenerlo implementado en un script que se encargue de realizar todo el trabajo. El funcionamiento es muy sencillo si tienes en cuenta el esquema indicado mas arriba. Y dado que tu objetivo es crear una extensión internacional, que digo, crear todas tus extensiones internacionales, lo mejor es utilizar el sencillo script que puedes descargar del propio repositorio de GitLab.

El primer paso que realiza el script es comprobar que si existe o no existe la plantilla. En el caso de que exista la plantilla la actualiza, y en otro caso la crea. Para crear una traducción nueva, tan solo tienes que añadir un archivo vacío dentro del directorio po. Por ejemplo, si queremos crear la traducción a español, añadiremos el archivo es.po.

El script comprueba si es.po tiene un tamaño igual a cero o por el contrario mayor que cero. En el caso de que sea igual a cero, lo que hará el script es inicializar con msginit, mientras que si el tamaño es superior a cero, realizará un msgmerge.

El último paso que realiza nuestro script es compilar las traducciones.

Conclusión

Una de las ventajas de la internacionalización en cualquier distribución GNU/Linux, es que no necesita la intervención del usuario para seleccionar el idioma. Tan solo tiene que existir la traducción. Así el usuario podrá disfrutar de la aplicación en el idioma en que tenga instalada su distribución.

Por otro lado, incorporar las traducciones en cualquier extensión de GNOME Shell es sencillo. Tan solo tienes que añadirlas al directorio con los archivos compilados esté en el directorio de la correspondiente extensión. Y esto, con el script que tienes disponible desde el repositorio es algo realmente sencillo de hacer.

De esta forma, si no internacionalizas tu extensión es por que simplemente el pecado capital de la pereza te puede y no has podido sobreponerte al mismo. Así que haz el favor, levántate y anda. Pon remedio a la situación y empieza a compartir, y no solo con aquellos que hablan tu mismo idioma sino con todo el mundo.

Llegados a este punto, es posible que te preguntes, ¿quien va a traducir mi extensión a ruso o chino o japonés o…? Esto es una de los aspectos mas increíbles de la comunidad de software libre. Y es que hay mucha gente que colabora desinteresadamente. Y al igual que tu has creado una extensión y has sido capaz de compartirla, ellos invierten su tiempo en traducirla. Si, lo has leído bien, desinteresadamente. Y es que muchas veces, ni siquiera aparecen en los créditos.

¿Donde puedes encontrar una comunidad dispuesta a colaborar en las traducciones? Yo hasta el momento, siempre he trabajado con Launchpad.net. Donde he tenido la suerte de que traduzcan muchas de mis aplicaciones. Pero, no solo ahí, por ejemplo, hay personas que si es posible, directamente en GitHub, crean un fork de tu aplicación y la traducen.

Así, como he comentado en muchas ocasiones, pertenecer al mundo del software libre no solo se trata de saber código y desarrollar aplicaciones. También puedes compartir, ayudando en las traducciones. También puedes reportar errores, ó pedir y solicitar cambios. Otra opción es proponer ideas y soluciones. Incluso siempre es bienvenido, nuevos iconos u otro material gráfico, etc. Hay muchas posibilidades para compartir, solo depende de ti.


Más información,