Aplicación PHP multilenguaje con locale
Crear una aplicación multilenguaje es simple gracias a la función gettext y todo el tema de ficheros mo. Se trata de crear un directorio con los ficheros de lenguaje, compilar esos ficheros y luego usarlos desde php o cualquier otro lenguaje. En este ejemplo tenemos un php y dentro de su directorio tenemos el directorio de locale, por cada lenguaje un directorio y luego un dominio de aplicación. Total:
./locale/es_ES/LC_MESSAGES/
Dentro de LC_MESSAGES tenemos los ficheros con las traducciones. Un ejemplo sería este:
Fichero message.po
# Fichero po
#, php-format
msgid "Translate this with gettext"
msgstr "Esto es una prueba de gettext"
msgid "Have a nice day"
msgstr "Que pacha nenaaaa"
msgid "%s is your name and you are %d years old"
msgstr "Tu nombre es %s y tienes %d años"
Como se aprecia, pueden meterse cadenas con parámetros. Ese fichero de texto hay que convertirlo a fichero .po.
Para eso hacemos:
msgfmt -o messages.mo messages.po
Y ya está. Este sería un ejemplo de uso de gettext desde php.
Hay que establecer una serie de parámetros antes de nada, como es lógico hay que elegir el idioma... es bastante simple.
<?php
// Solución multilingual
// Debemos crear un fichero
// mostramos locale actual
echo "Locale actual :".setlocale(LC_ALL, 0) . "<br />";
// Hay quien pone esto, pero en mi caso ha dado igual
//putenv ("LANG=es_ES");
// Aquí establecemos el locale
$language = 'es_ES';
$nuevoLocale =setlocale (LC_ALL, $language);
echo "Ahora el locale es: $nuevoLocale <br />";
// ahora debemos establecer el fichero .mo y el directorio.
// en nuestro caso esta en ./locale/es_ES/LC_MESSAGES/messages.mo
$domain = 'messages';
// Con estas dos llamadas terminamos de establecer la relación
bindtextdomain($domain, "./locale");
textdomain($domain);
// Podemos usar la función
echo gettext("Translate this with gettext"). "<br />";
// podemos usar el alias de gettext() que es _()
echo _("Translate this with gettext"). "<br />";
echo _("Have a nice day") . "<br />";
$nombre = "Cthulhu";
$edad = "23451";
// Con parámetros y todo:
echo sprintf(_("%s is your name and you are %d years old"),$nombre,$edad) . "<br />";
?>