¿Cómo traducir programas libres? Introducción (Parte I)
Siempre que alguien comienza el desarrollo de un software, sobre todo si éste está en la nube, debe pensar en la internacionalización del mismo. Aparte de estudiar otros aspectos como los textos RTL (Right to left, de derecha a izquierda), la codificación de los caracteres, el formato de la fechas o el de los números (no es lo mismo 1.000,50€ que $ 1000.50) el aspecto más básico es proveer el software con su contenido traducido a cada idioma.
Pero, ¿cómo traducimos un programa? Tenemos tantas alternativas como se nos ocurran. Una relativamente popular pero un tanto ineficaz es mantener una variable que indique, qué idioma es el utilizado y en cada momento en el que se muestra información, hacer un condicional, como se muestra a continuación:
si(idioma == "Español") imprime("Hola"); si(idioma == "Inglés") imprime("Hello);
Sin lugar a dudas, esta opción funciona pero es verdaderamente ineficaz. La solución que se aplica de forma casi estándar en el software libre es la que se va a describir a continuación, está basada en la librería GNU para la internalización y localización, GNU gettext. Veamos cómo se implementa esta técnica en PHP.
Cadenas internacionalizadas en PHP
En PHP sólo deberemos poner delante de nuestras cadenas dos barras bajas “__” y encuadrarla dentro de unos paréntesis: __(“cadena”) para indicarle al intérprete que la cadena no es una cadena como tal, sino un identificador que deberá ser sustituido por su respectiva traducción, en función del idioma en el que estemos trabajando.
El identificador será la traducción del idioma “raíz”, que normalmente es el inglés, por lo que podemos encontrarnos, por ejemplo en muchos sistemas gestores de contenido, sentencias como la siguiente:
echo __('Comments')
Esta función es en realidad el alias de la función gettext, que consulta un mensaje en el dominio actual:
echo gettext('Comments')
La pregunta ahora es, ¿cómo sabe el intérprete dónde están las traducciones? ¿Qué mecanismos hay para acelerar el proceso de búsqueda en los ficheros que las contienen? Esa parte la explicaremos en la segunda parte de esta entrada, pero ya os adelanto que veremos los ficheros .po, .mo y .pot que seguro que habréis visto en más de una ocasión.