GNU gettext con php5

GNU gettext es la biblioteca GNU de internacionalización (i18n) y es usada para escribir programas con interfaz en múltiples idiomas.
La internacionalización es el proceso de diseñar software de manera tal que pueda adaptarse a diferentes idiomas y regiones sin necesidad de cambios de ingeniería ni de código. La localización es el proceso de adaptar el software para una región específica mediante la adición de componentes específicos de un locale y la traducción de los textos, por lo que también se le puede denominar regionalización.
…
Es una práctica común en el idioma inglés (sobre todo en el ámbito de la computación), abreviar internationalization como “i18n”. Ello se debe a que entre la primera i y la última n de dicha palabra hay 18 letras. Lo mismo sucede con localization, que se abrevia “L10n”.
gettext en PHP
Existen dos formas de usar gettext en PHP: mediante la extensión gettext nativa de PHP o utilizando la librería PHP-gettext, escrita en PHP, que no necesita ninguna extensión.
La forma de usar gettext es
La función_(), alias degettext(), devolverá la cadena “hello world” en el lenguaje correspondiente, de acuerdo al locale que hayamos seleccionado.
Si ejecutamos el script obtendremos “hello world” como salida, puesto que no hemos indicado ningún locale, ni creado ningún catálogo de traducción. Necesitamos crear el archivocomments.pocon la traducción de la cadena “hello world”. Esto puede hacerse mediante el comandoxgettext, o mediante un editor gráfico como poEdit.
Creación del catálogo con poEdit
Ante todo debemos saber que la estructura de directorios para guardar los distintos catálogos tiene forma determinada. Por cada traducción se utiliza un directorio. Este generalmente se nombra usando dos letras minúsculas para el idioma, un guión bajo y dos mayúsculas para el país (es_AR, para español de Argentina). Dentro de este directorio debe existir otro con el nombre LC_MESSAGES, el cual será finalmente el directorio que contendrá el catálogo.
La estructura de nuestro ejemplo será
|-- locale
| `-- es_AR
| `-- LC_MESSAGES
| |-- messages.mo
| `-- messages.po
`-- index.php
El archivomessages.moes la versión compilada demessages.poy el que usará PHP para obtener la traducción.
Iniciemos poEdit. La primera vez nos preguntará por nuestro nombre y correo electrónico. Estos datos servirán para saber quién fue el último traductor que modificó el catálogo. Una vez en la ventana principal vamos a File -> New catalog. Seleccionamos el idioma (Español en este caso), el país y el código de caracteres tanto para el catálogo como para la fuente de datos desde la que obtendremos el listado de cadenas que requieren traducción. En la solapa Paths debemos colocar en ‘Base path’ la ruta completa al directorio base de archivos php (conteniendo las cadenas mencionadas anteriormente) y, debajo, en el cuadro ‘Paths’ agregar una entrada con ‘.’ indicando que se debe utilizar el directorio ingresado anteriormente. Al hacer click en OK aparecerá un cuadro de diálogo para guardar el nuevo catálogo. Navegamos hasta el directorio LC_MESSAGES y guardamos el archivo como messages.po. poEdit escaneará el directorio ingresado en Paths y extraerá todos las cadenas gettext. Ahora queda simplemente realizar la traducción y guardar el archivo. Al guardarlo, poEdit lo compilará y generará el .mo que finalmente usará PHP.
Ahora, modificaremos index.php para setear el locale
1 2 3 4 5 6 7 8 9 10 11 12 13 | # @file: index.php <?php $language = 'es_AR.UTF-8'; putenv("LANG=$language"); setlocale(LC_ALL, ""); $domain = "messages"; bindtextdomain($domain, "./locale"); bind_textdomain_codeset($domain, 'UTF-8'); textdomain($domain); print _("hello world"); ?> |
Aun nos queda un paso y es comprobar que tengamos dicho locale habilitado en nuestro sistema. Esto lo hacemos mirando la salida de
Si no tenemos habilitado el charset es_AR.UTF8, ejecutamos
En este punto la salida del script debería ser la traducción que hicimos al español.
Tip
Para casos en que la cadena a traducir contenga variables, podemos utilizar esta función:
1 2 3 4 5 6 7 8 9 10 | function __($string) { $arg = array(); for($i = 1 ; $i < func_num_args(); $i++) $arg[] = func_get_arg($i); return vsprintf(gettext($string), $arg); } $total = 400; print __("results %d - %d of about %d", 1, 20, $total); |
La traducción podría quedar





