Gettext es uno de los sistemas mas utilizados para internacionalizar aplicaciones. Básicamente, un programa (xgettext) analiza el código fuente de los archivos de la aplicación, extrae las cadenas y genera un catálogo que permite al usuario realizar la traducción usando una aplicación, como por ejemplo Poedit. Luego el catálogo (archivo .po) se compila y se crea un archivo binario con extensión .mo, el cual posee todas las traducciones en un formato optimizado.
Lamentablemente, el comando xgettext carece de soporte para Javascript. El intérprete de Python es lo mas cercano posible, pero a mi no me ha funcionado correctamente porque no analiza bien las expresiones regulares y algunas cadenas.
Hasta ahora la forma mas común de internacionalizar una aplicación en Javascript era identificar cada una de las frases con una clave o variable, pero el problema de esta técnica es que hay que agregar las frases manualmente.
He decidido desarrollar un pequeño script en PHP que se utiliza en conjunto con Poedit y facilita esta tarea. Éste funciona como intérprete Javascript y analiza el código fuente para extraer las cadenas y generar un catálogo, luego se utiliza otro script para convertirlo a formato JSON, el cual se incluye en nuestra página como un archivo externo. De esta manera tenemos disponible las frases traducidas en una variable global.
El intérprete es lo suficientemente inteligente para detectar cadenas con o sin comillas escapadas y excluir las expresiones regulares y comentarios.
Para utilizarlo, primero debemos instalar Poedit.
- Abrimos la aplicación, vamos a Archivo -> Nuevo catálogo y completamos los datos.
- Cambiamos a la solapa Rutas y agregamos la ruta de la carpeta que contiene nuestros archivos Javascript.
- Cambiamos a la última solapa y agregamos los nombres de las funciones que usaremos para invocar una traducción. En este caso usamos el guión bajo y como alias “jsgettext”
- La magia ocurre cuando agregamos el nuevo intérprete. Vamos a Editar -> Preferencias, seleccionamos la solapa de intérpretes y hacemos clic en “Agregar”.
- Luego simplemente debemos actualizar el catálogo haciendo click en el botón “Actualizar catálogo” y nos aparecerán las frases extraídas de los archivos JS. Nos tomamos el trabajo de traducirlas y guardamos el catálogo.
- Descartamos el archivo .mo que nos genera el programa ya que a continuación vamos a transformar el archivo .po en un .js usando la utilidad po2json.php:
php /ruta/a/jsgettext/po2json.php -i catalog.po -o l10n.js -k l10n
- Eso nos genera un archivo con la variable global “l10n”, cuyo valor es un objeto que contiene las frases traducidas.
Podemos acceder a una traducción usando la función “_”:
function _(s) {
return typeof l10n[s] != 'undefined' ? l10n[s] : s;
}
alert(_("Hello world"))
El código esta alojado en Google Code: http://code.google.com/p/jsgettext/
Pueden reportar bugs o enviar alguna sugerencia o mejora 🙂
Deja un comentario