GNU gettext III - Ejemplo en PHP
Llegamos al último de los documentos dedicados a gettext, centrándonos en el API que nos proporciona
PHP. Como se verá a continuación, su uso es muy similar al caso del lenguaje C, por lo que
si se consiguió hacer funcionar el ejemplo en dicho lenguaje, no deberíamos tener muchas
dificultades.
Pasos previos
Debemos disponer de una instalación de PHP con soporte para gettext. Si lo instalamos desde
las fuentes, a la hora de ejecutar el ./configure, deberemos usar el parámetro --with-gettext.
Si lo hemos instalado a partir de un paquete, existe un método que nos permitirá saber
si la persona que lo creó incluyó el soporte para gettext. Deberemos crear un archivo .php
cuyo único contenido sea:
<? phpinfo(); ?>
Visualizando este archivo con el navegador (hay que tener en cuenta que deberemos disponer de un
servidor web con soporte para PHP), podremos saber las opciones que se usaron con el ./configure
obervando la entrada Configure Command.
Si el soporte para gettext está incluido, ningún problema. En caso contrario, la única
alternativa que tendremos será la instalación a partir de código fuente.
El ejemplo
Consideramos que se ha leido y entendido el documento
GNU gettex2 - un ejemplo en C, con lo que sin más preámbulos, abordamos un sencillo
ejemplo (tal como se puede obervar entre los comentarios de la parte del manual
de PHP dedicada a gettext, auqnue con alguna pequeña modificación):
// cambiamos el lenguaje al español
$language = 'es';
putenv("LANG=$language");
setlocale("LC_ALL", "");
// cambiamos el textdomain
$domain = 'ejemplo';
bindtextdomain("$domain", "./locale");
textdomain("$domain");
echo gettext("Hello world!");
¿Cuáles serían los pasos siguientes? Pues exactamente los mismos que en los programas
en c. Supongamos que el archivo con el ejemplo anterior es ejemplo.php. Creamos el archivo .po
colocándonos en el directorio donde se encuentre el script y tecleando:
xgettext ejemplo.php -o ejemplo.po
Se nos mostrará un mensaje de warning, indicándonos que no se reconoce la extensión
y que se actuará como si fuera un archivo en c, lo cual es correcto. Como resultado
obtenemos el archivo ejemplo.po, que modificamos de la siguiente forma:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2002-03-04 22:31+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ejemplo.php:12
msgid "Hello world!"
msgstr "Hola mundo!"
Creamos el archivo .mo de la siguiente forma:
msgfmt ejemplo.po -o ejemplo.mo
y lo movemos al directorio ./locales/es/LC_MESSAGES/. Tras recargar la página veremos
el resultado :). No hace falta cambiar la variable de entorno LANG manualmente, como en el caso de los
programas en C, ya que de eso se encarga el propio script.
Posibles problemas
Pongámonos en la situación de que hemos seguido los pasos anteriores y que
el texto no aparece traducido. Una de las primeras cosas que deberemos comprobar es el valor
devuelto por setlocale. Si devuelve null, querrá decir que el valor de LANG
especificado no está soportado y que por lo tanto no es correcto.
$resultado = setlocale(LC_ALL, "");
if ($resultado == null)
echo "ERROR";
En /usr/share/locale/locale.alias tendremos un fichero con los posibles valores que se le podrán
dar a la variable LANG. Asimismo, podemos usar los códigos de lenguaje que se encuentren
en /usr/share/locale/. Además de todas estas comprobaciones, deberemos asegurarnos
de que el locale correspondiente ha sido generado. En un sistema debian, por ejemplo, consultamos
el contenido del fichero /etc/locale.gen, pudiéndose utilizar solo los valores de LANG allí
encontrados. En el caso del autor de este documento, al utilizar LANG=es, setlocale devolvía
el valor null. Sin embargo, tras comprobar el fichero /etc/locale.gen, se observó que el único valor
que se podía usar era es_ES@euro.
Otra posible causa de error se puede dar por el directorio indicado en bindtextdomain. Debemos asegurarnos
de que el script se ejecuta en el direcotrio adecuado, ya que el direcotrio indicado en la función anterior
es relativo a la situación de la página PHP. Podemos comprobar esto de la siguiente forma:
$path = dirname(getenv(SCRIPT_FILENAME));
echo $path;
[VOLVER]