Ir al contenido

Traducción de aplicacion con gettext (parte 2)

En la publicación anterior vimos una introducción a los conceptos de internacionalización (i18n) y localización (l10n) y en esta segunda parte explicaré los conceptos que utiliza la herramienta gettext para permitirnos realizar dicha tarea en nuestro software además cubriré temas como la instalación y configuración de dicha herramienta. Para este demo estaremos usando Linux y PHP pero en realidad gettext y las demás herramientas que usaremos como PoEdit pueden ser utilizadas en cualquier sistema operativo y con cualquiera de los lenguajes de programación mas populares.

Instalación y configuración de GetText y PoEdit

El primer paso para poder internacionalizar nuestro software es obviamente tener las herramientas instaladas. Aunque gettext es parte de las herramientas GNU que solo están usualmente disponibles en sistemas operativos Linux es muy fácil instalarlo tanto en Windows como en macOS.

Instalación en Linux

La mayoría de las distribuciones de Linux ya tendrán instalada la herramienta gettext ya que como he comentado es parte de las herramientas de la distribución GNU, sin embargo, si por alguna razón no se cuenta con la herramienta se puede instalar con el administrador de paquetes. La manera más fácil de saber si tenemos instalado gettext es utilizando el comando which que nos permite saber el path o ruta completa de un binario, esto lo hacemos de la siguiente manera:

which gettext

Si obtenemos una ruta al binario la salida sería algo similar a esto:

/usr/bin/gettext

Si por el contrario obtenemos algún mensaje parecido al siguiente:

/usr/bin/which: no gettext in...

Probablemente significa que no está instalado. Para ese caso deberemos utilizar nuestro administrador de paquetes y buscarlo e instalarlo. En mi caso utilizo Fedora Linux y el comando para instarlo es el siguiente (o para cualquier distribución derivada de redhat):

sudo dnf install gettext

Para el caso de Debian o sus derivados (Ubuntu, Mint, etc.) lo instalamos de la siguiente manera:

sudo apt-get install gettext

Otra de las herramientas que mencioné fue PoEdit, de nuevo, la mayoría de las distribuciones de Linux cuentan con esta aplicación en sus administradores de paquetes así que para instalarlo basta con realizar los pasos anteriores pero reemplazando gettext por poedit.

Instalación en macOS

Aunque el sistema operativo de Apple está basado en Unix (Darwin) este no contiene por default las herramientas de GNU. Lo más probable es que ya cuentes con homebrew instalado que es un administrador de paquetes para dicho sistema. Si no es así, instalalo primero. Una vez que homebrew esté instalado simplemente instalamos la “formula” para gettext:

brew install gettext

Brew no enlaza el binario al path automaticamente así que debemos hacerlo manualmente:

brew link gettext --force

Una vez enlazado verificamos que está instalado:

which gettext

Y debería darnos el path del ejecutable. Finalmente, para instalar PoEdit en macOS simplemente descargamos el instalador desde su sitio oficial el cual contiene la aplicación ya lista que simplemente movemos a /Applications. Como nota importante: PoEdit en macOS (al igual que en windows) ya contiene las herramientas de gettext integradas así que si utilizamos este frontend la instalación de gettext por medio de brew es opcional.

Instalación en Windows

Windows no es un sistema operativo particularmente amigable con las herramientas de GNU, y aunque en versiones recientes de Windows 10 Profesional se puede instalar el “Subsistema de Linux” nativamente la manera más facil de utilizar gettext en este sistema es simplemente descargar PoEdit que ya contiene las herramientas necesarias en su instalador. De igual forma que con macOS simplemente descargamos el instalador del sitio oficial.

Catálogos, locales y plantillas

El concepto más importante dentro de gettext es el de los catálogos. Un catálogo en gettext es simplemente un archivo que contiene las traducciones o localizaciones de nuestra aplicación para un lenguaje definido o mejor dicho para un “locale” específico.

Locales

Un locale es la definición de una configuración cultural. Decimos cultural y no de lenguaje ya que a veces dentro de una misma lengua existen diferencias, por ejemplo, el español utilizado en España no suele ser el mismo al que utilizamos en México, incluso en Latinoamérica existen diferencias culturales entre el español usado en Argentina y México. Por ejemplo:

Argentina:

Vos tenés que ir a laburar

México:

Tu tienes que ir a trabajar

En ambos casos utilizamos el español pero cada una de las regiones de nuestro bello continente tienen diferencias entre países. Pero no solamente existen diferencias entre las oraciones simples como las anteriores sino en toda la semántica de la aplicación de lenguajes como la simbolización de tipos de cambio. Por ejemplo, si quisieramos definir un precio de algún producto el símbolo para diferentes países:

País España Guatemala México Venezuela
Representación €250 Q250 $250 Bs. 250

Son precisamente estas diferencias a lo que se les llama “locales“. Existen muchas variaciones del español (y de otros lenguajes) y es por eso que a veces es necesario regionalizarlas aunque esto no es imperativo, de hecho, existen locales denominadas “neutrales” por ejemplo, es muy común ver en muchas aplicaciones al seleccionar el lenguaje de la misma opciones como “Español Latinoamericano” o simplemente “Español” donde se definen palabras comunes en un lenguaje entendible para cualquier país de habla hispana.

De hecho Linux es usualmente uno de los sistemas operativos que mejores localizaciones tiene. Por ejemplo, en mi versión de Fedora Linux y en la mayoría de las demás distribuciones estas localizaciones se guardan en el siguiente path o ruta:

/usr/share/locale

Si vamos a ese directorio veremos bastantes directorios. Haciendo un filtrado por al término “es” vemos lo siguiente:

Nautilus Locales

Cada uno de estos folders representa una localización regionalizada. Si ponemos atención tenemos al inicio un directorio “es” correspondiente a Español “neutral”, posteriormente vemos más directorios con Español para cada región o país definida con su código ISO-3166 o de dos dígitos por ejemplo AR para Argentina, CL para Chile, MX para México, etc.

Catálogos

Ahora que entendemos el concepto de locales podemos analizar los catálogos. Un catálogo no es mas que un archivo que contiene las traducciones o localizaciones para cada uno de los locales. En el caso de gettext existen dos tipos de archivos para estos catálogos:

  1. Archivos PO o portable object, que son archivos de catálogo con texto legible
  2. Archivos MO o machine object, que es el catálogo pero compilado

Podemos pensar en los archivos PO como las fuentes de las traducciones y los archivos MO como las versiones compiladas. De hecho, los archivos que editamos para actualizar las traducciones son los PO mientras que los que distribuimos con nuestra aplicación son los archivos MO.

Si volvemos al folder /usr/share/locale/es_MX que contiene las localizaciones en español para México vemos el siguiente directorio:

Folder con traducciones

Este folder denominado LC_MESSAGES contendrá usualmente los archivos de localizaciones, uno para cada aplicación. Si entramos a este directorio veremos lo siguiente:

Traducciones en español mexicano

Particularmente tengo seleccionado el archivo inkscape.mo, que es el catálogo de traducciones en Español mexicano para la aplicación de diseño vectorial Inkscape. Esto quiere decir que si cambiara la configuración del sistema operativo que actualmente tengo definida como Inglés de Estados Unidos a Español de México, Inkscape se mostraría en Español con las particularidades del idioma en México. Como se ve en la imagen solo existen archivos .mo ya que son los archivos compilados que la aplicación utiliza para “inyectar” las traducciones en donde sea que sean necesarias.

Plantillas

Aunque ya hablamos de los catálogos una duda que probablemente tenemos al tratar de entender como funciona gettext es ¿Cómo mantendríamos actualizados los archivos para los diferentes lenguajes que queremos soportar en nuestra aplicación? Y la respuesta es con plantillas. Supongamos que nuestra aplicación utilizará como base el idioma inglés neutral, y queremos soportar los siguientes lenguajes:

  • Español
  • Francés

En este caso tendríamos que generar dos catálogos para cada uno de los lenguajes anteriores. La duda es, si nuestro código fuente cambia, ¿Cómo mantendríamos al día los mapeos entre los mensajes originales de la aplicación y los demás lenguajes? Pues resulta que la plantilla, que sería la base para todos los demás lenguajes, se autogenera en base al código fuente por medio de introspección y comparando la plantilla contra los demás catálogos es como gettext nos dice que partes de la aplicación para cada lenguaje tenemos que actualizar.

Una plantilla de gettext utiliza la extensión .pot, de portable object template, es decir, es un archivo legible al igual que un archivo .po pero no define ningún lenguaje específico sino que contiene las cadenas de texto que queremos traducir.

Ahora que hemos entendido los conceptos de gettext en la tercera y última parte de este tutorial haremos un demo práctico utilizando PoEdit y una simple aplicación de PHP para demostrar la internacionalización y localización en acción.

Publicado enprogramación

Un comentario

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Anti-spam (comprueba que eres humano!) * Tiempo de espera expiró. Por favor recarga el CAPTCHA.