Traducciones con
GettextHacer 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.
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> |
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).

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:

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".

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

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:

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

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

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.
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).
Autor: Bartolomé Sintes Marco