Volver al índiceTraducciones con Gettext


Qué es Gettext

Hacer un sitio web multilingüe, es decir, disponible en varios idiomas, no es fácil. Si el número de páginas es pequeño y el contenido no cambia a menudo, una solución es utilizar las funciones gettext incluidas en PHP. Gettext es un conjunto de utilidades creadas por Ulrich Drepper en 1995 y que forman parte del proyecto GNU y que facilita la traducción de programas.

Básicamente, la utilización de gettext en PHP es el siguiente:

La extensión Gettext está normalmente incluida en PHP (por ejemplo, lo está en XAMPP), aunque si no lo está, se puede utilizar la biblioteca php-gettext.

Volver al principio


Indicar las cadenas de texto a traducir

Supongamos que tenemos la siguiente página en castellano, pero también queremos que esté disponible en inglés:

<?php
print "<p>Esta página está en castellano</p>\n";
?>
<p>Esta página está en castellano</p>

El primer paso es marcar las cadenas a traducir. Las cadenas que se quieran traducir, deben enviarse a la función gettext($cadena), aunque normalmente se utiliza el alias _($cadena):

<?php
print "<p>".gettext("Esta página está en castellano")."</p>\n";
?>
<p>Esta página está en castellano</p>
<?php
print "<p>"._("Esta página está en castellano")."</p>\n";
?>
<p>Esta página está en castellano</p>

Volver al principio


Crear los ficheros .po

Poedit llama catálogos a los archivos .po. Cada archivo .po contiene la traducción de las cadenas a un idioma determinado. Para crear un nuevo catálogo, hay que elegir el menú File > New catalog.... y completar primero las preferencias del catálogo.


En la pestaña "Project info" deben rellenarse al menos los campos "Language" (idioma al que se van a traducir las cadenas de texto), "Country" (país en el que se utiliza el idioma anterior), "Charset" y "Source code charset" (juegos de caracteres del archivo .po y de la página, normalmente iso-8859-1 o utf-8).

poedit - Menú File > New catalog...

Para la página de ejemplo anterior, si queremos preparar la traducción al inglés, deberíamos indicar "English" en Language y "United Kingdom" en Country e "iso-8859-1" en los juegos de caracteres:

poedit - ejemplo Menú File > New catalog...


En la pestaña "Paths", debe incluirse en "Base path" el camino hasta la carpeta en la que se encuentra la página web y en "Paths" debe incluirse el camino . (el carácter punto hace que busque en el directorio indicado en Base path). Para añadir un camino hay que hacer clic en el botón "New item".

poedit - Menú File > New catalog...

Si la página de ejemplo se encuentra en el directorio c:\www\ejemplo_gettext, deberíamos indicar lo siguiente:

poedit - ejemplo Menú File > New catalog...


Al pulsar OK, poedit muestra un cuadro de diálogo para elegir dónde crear el archivo.po. El archivo .po debe crearse en el directorio "locale/XX-XX/LC_MESSAGES", situado en el mismo directorio donde se encuentre la página web, y el archivo debe llamarse "messages.po".

Inmediatamente, poedit analiza todos los archivos que se encuentran en los directorios indicados y muestra las cadenas marcadas para traducción. En el ejemplo anterior, mostraría lo siguiente:

poedit - Nuevas cadenas

Al pulsar OK, poedit vuelve a la ventana principal del programa mostrando las cadenas encontradas. En el ejemplo anterior, mostraría lo siguiente:

poedit - Traducir cadenas 1

La traducción debe escribirse en el cuadro inferior izquierda:

poedit - Traducir cadenas 2

Una vez traducidas las cadenas, hay que guardar el archivo (File > Save).

Nota: En mi ordenador, poedit 1.3.6 para Windows da un mensaje de error "Failed to convert file contents to Unicode" cuando se intenta guardar un archivo ya existente. La solución que he encontrado ha sido borrar el archivo antes de guardarlo. No sé si hay otra solución posible.


Con esto terminaría la creación del archivo de traducción al inglés. Si quisieramos preparar un archivo de traducción al francés, deberíamos repetir estos pasos teniendo en cuenta que el código de idioma para el idoma francés y el país Francia es fr-FR. Los códigos de idiomas y países se pueden consultar en la web de IANA.

Volver al principio


Utilizar el archivo .po

Para que los mensajes aparezcan traducidos habría que añadir el siguiente código a la página de ejemplo:

<?php
$language="en_GB";
putenv("LC_ALL=$language");
setlocale(LC_ALL, $language);
bindtextdomain("messages", "./locale");
textdomain("messages");

print "<p>"._("Esta página está en castellano")."</p>\n";
?>
<p>This page is in English</p>

Para que el usuario pudiera elegir el idioma de la página se podría, por ejemplo, añadir unos enlaces que llamaran a la página enviando el código del idioma:

<?php
$language=(isset($_REQUEST['language']))?trim(strip_tags($_REQUEST['language'])):"es_ES";
putenv("LC_ALL=$language");
setlocale(LC_ALL, $language);
bindtextdomain("messages", "./locale");
textdomain("messages");

print "<p><a href=\"".$_SERVER['PHP_SELF']."?language=en_GB\">English</a> -
  <a href=\"".$_SERVER['PHP_SELF']."?language=es_ES\">Español</a></p>\n";

print "<p>"._("Esta página está en castellano")."</p>\n";
?>
English - Español
This page is in English

Nota: En este caso se hace referencia al archivo de traducción al castellano, que no existe, así que las cadenas no se traducen (pero como están en castellano, el resultado es correcto).

Volver al principio

Autor: Bartolomé Sintes Marco
Última modificación de esta página: 26 de enero de 2007