Código

Published on May 3rd, 2011

1

Aplicaciones PHP Multilingües

En el ámbito global no podemos darnos el lujo de desarrollar una aplicación web que no tenga la posibilidad de encajar en lo posible en cualquier región del planeta, por ello es indispensable brindar al usuario de nuestras aplicaciones la posibilidad de personalizar cada aplicación web para que esta muestre el idioma de su preferencia.

Al proceso de “traducir” aplicaciones en varios idiomas se le denomina Internacionalización, sin embargo solo traducir líneas de texto no es suficiente en algunas ocasiones en las que algún idioma tiene más de tres formas plurales tal cual pasa con el idioma Ruso, es ahí donde entra la Regionalización de una aplicación.

Más información de i18n, l10n y g11n en WikiPedia – Internacionalización y localización.

Entrando de lleno a PHP hay que tener en cuenta que existen muchas opciones para “Internacionalizar” tu aplicación PHP, sin embargo en este caso (como es mi tradición) voy a enfocarme en la mejor de todas las opciones, la función integrada en PHP denominada “funciones gettext“.

Las razones que me llevaron a elegir esta opción son objetivas y contundentes:

  • Velocidad: Las cadenas de texto son extraídas de un archivo binario el cual es agresivamente guardado en un cache por apache.
  • Solidez: gettext ha sido el estándar por defecto desde hace años y se utiliza en una amplia variedad de sistemas de forma fiable.
  • Facilidad: Debido a sus años y el uso generalizado, el archivo .po que se distribuye a los localizadores (traductores) es ampliamente reconocido y tiene varias aplicaciones para ayudar en la traducción.
  • Además: Hay programas de línea de comandos para crear y combinar archivos gettext actualmente así como una gran variedad de utilidades disponibles en línea de forma libre y gratuita.

Software

Para seguir esta guía es necesario que tengas el siguiente software a la mano:

  • Un servidor de pruebas local Apache-PHP – Te recomiendo XAMPP por ser práctico y multiplataforma.
  • Un editor de texto preferiblemente con soporte a PHP, XHTML, JavaSript, etc. te recomiendo Aptana por ser multiplataforma y enfocado en PHP.
  • El editor de archivos .po Poedit el cual es el mejor editor de estos archivos hasta el momento además de ser multiplataforma.

gettext() en PHP

Una vez tengas todo el software instalado y listo para ser usado crearemos una carpeta llamada gettext en nuestra raíz de nuestro servidor web y creamos un archivo PHP que contenga varias cadenas de texto de relleno en inglés, utilizaré un archivo llamado index.php, es recomendado que desarrolles tu aplicación utilizando como idioma por defecto el Inglés ya que es un idioma universal y facilita la traducción a varios idiomas ya que la mayoría de traductores saben este idioma.

Como consejo, desarrolla toda tu aplicación en inglés y hasta que esté completa inicia el proceso de traducción, esto te ahorrará bastante el tiempo de desarrollo.

Gettext es fácil de implementar, solo requiere una leve modificación al código al encerrar a cada cadena de texto en inglés dentro de la función de gettext:

[php]echo “Hello World”;[/php]
[php]echo gettext(“Hello World”);[/php]

Para facilitar su utilización gettext y reducir la cantidad de código este tiene una funcion alías la cual es un guion bajo.

[php]gettext() = _()[/php]

Sin embargo el solo agregar la función de gettext no hará la traducción si no inicializamos su configuración y elegimos una configuración local, esta configuración local debe variar según el idioma que se desee desplegar al usuario , por ello inicialmente debemos declarar el lenguaje que deseamos utilizar en la traducción, el dominio de texto, su disposición en el sistema de archivos y el codeset y extra a esto crear los archivos con las traducciones, primero creemos el código de carga de gettext:

[php]
// Idioma
$lang = ‘es_ES’;

// Dominio
$text_domain = ‘my_project_name’;

// Dependiendo de tu OS putenv/setlocale configurarán tu idioma.
putenv(‘LC_ALL=’.$lang);
setlocale(LC_ALL, $lang);

// La ruta a los archivos de traducción
bindtextdomain($text_domain, ‘./locale’ );

// El codeset del textdomain
bind_textdomain_codeset($text_domain, ‘UTF-8’);

// El Textdomain
textdomain($text_domain);

// Cadena de texto de prueba
echo _(“Hello World”);
[/php]

Descarga el código fuente de este artículo.

Estructura de carpetas

También es necesario crear la siguiente estructura de directorios creando un directorio para cada idioma:

gettext structure

Poedit

Una vez creada la estructura de carpetas y agregado el código PHP crearemos un nuevo archivo .po con Poedit:

Poedir new catalog

Poedit te solicitará que llenes ciertos campos para tu proyecto, los campos indispensables de llenar son los de formas plurales, la ruta al proyecto, y las funciones adicionales o keyword que explicaré más adelante:

Poedit Project Info
Poedit Project Paths
Poedit Project Keywords

Una vez termines de ingresar la información de tu proyecto Poedit te pedirá que salves tu archivo de traducción, guardalo dentro de la carpeta “LC_MESSAGES” que se localiza en el idioma que deseas traducir:

Poedit Save

Una vez salvado tu archivo .po Poedit analizará el código fuente de tu aplicación y te mostrará las palabras que encontró:

Poedit Update summary

Presiona el botón de “OK” e inicia a traducir tu proyecto, para ello seleccionas la línea que deseas traducir y Poedit te dará dos casillas debajo, una con el texto original y otra para que ingreses la traducción:

Poedit Translating

Salva tu archivo .po y Poedit automáticamente creará el archivo .mo el cual es el archivo en formato binario leído por PHP para las traducciones, prueba entonces ver el resultado de tu archivo PHP accediendo a el vía web:

gettext spanish

Listo, la traducción funciona, ahora probemos cambiar la variable de idioma en el archivo PHP de español de España a portuges de Brasil siempre y cuando ya hayamos creado su traducción en Poedit:

[php]$lang = ‘pt_BR’;[/php]
gettext Brazil

Plurales y singulares

La función de manejo de plurales es ngettext() y requiere ciertos parámetros, originalmente esta sería una línea de código PHP para manejo de plurales:

[php]

// Valor singular
echo sprintf(ngettext(“You have %d message”, “You have %d messages”, 1), 1);

// Valor plural
echo sprintf(ngettext(“You have %d message”, “You have %d messages”, 25), 25);
[/php]

Sin embargo para facilitar el manejo de cadenas de texto con plurales agregaremos una función más corta y práctica que no solo hace más fácil trabajar con estos casos si no que también previene el problema de plutales al usar el valor “-1”:

[php]
function _p($singular,$plural,$number) {
return sprintf(ngettext($singular, $plural, abs($number)), $number);
}
[/php]

Con esta función el código para manejo de plurales sería el siguiente:

[php]
// Valor singular
echo _p(“You have %d message”,”You have %d messages”,1);

// Valor plural
echo _p(“You have %d message”,”You have %d messages”,25);
[/php]

Es por ello que es importante agregar en nuestro proyecto de Poedit las palabras claves y las formas de plurales para que este esté al tanto de qué líneas de texto deben de ser traducidas con funciones que no son el estándar de PHP.

Para poder traducir estas cadenas de texto debemos de actualizar nuestro proyecto en Poedit:

poedit update
poedit update summary

Luego de que se actualiza nuestro proyecto en Poedit traducimos las formas singulares y plurales de nuestra cadena de texto:

poedit singular
poedit plurals

Salvamos nustro proyecto y lo ponemos a prueba…

Nota Importante – Caché: Debido a lo agresivo del caché de las cadenas de texto del archivo de traducción es muy probable que luego de cambiar la traducción no te muestre los cambios efectuados en el navegador, lamentablemente no hay otra solución más que la de reiniciar el servidor web para que borre el caché.

gettext results

Nota Importante – Artículos y géneros: Gettext no tiene una forma directa para resolver géneros de los artículos, si en una traducción tenemos una palabra dinámica, por ejemplo “aguacate” en la frase “usted ha comprado el aguacate” y lo remplazamos por “piña” la frase sería “usted ha comprado el piña“, por ello es muy importante ser creativo en la forma en la que se trabajen las frases para que sus traducciones resulten sencillas.

Con esto concluye la introducción a gettext para la internacionalización y regionalización de aplicaciones Web con PHP, existen algunos trucos extra como el del remplazo de palabras clave fijas en un CMS o el ahorrar código con una función que automáticamente haga un “echo” de alguna traducción tal cual sucede en WordPress con la función “_e();” es por ello que estas funciones están agregadas a nuestros “keywords” en Poedit, sin embargo queda a discreción del desarrollador la creación y utilización de estos métodos.

Próximamente estaré publicando un método más práctico para utilizar Gettext en Codeigniter.

Fuentes





One Response to Aplicaciones PHP Multilingües

  1. Edwin says:

    Útil e importante, tnks por el tip.

Back to Top ↑