Aquí os dejo un tutorial para internacionalizar un sitio con php, para ello usaremos los ficheros .po y .mo que usan proyectos open source como wordpress.
Estructura ficheros
Tenemos que seguir la siguiente estructura para que php pueda acceder a los ficheros de traducción, para ello en la raíz de nuestra web creamos las siguientes carpetas:
locale
locale/en_US
Ficheros de traducción
Para las traducciones se usan dos ficheros uno con extensión .po donde se ven las frases en texto plano y uno con extensión .mo que sólo es legible por el servidor.
Para empezar creamos un fichero locale/en_US/messages.po y seguimos la siguiente estructura con las frase originales y las traducciones:
Para conseguir el fichero .mo usaremos poedit, para usarlo basta con abrir el fichero .po y pulsar el botón guardar para exportar el fichero .mo en la misma carpeta que el fichero .po.
Si hay algún error, por ejemplo una frase duplicada nos mostará un log.
Nota: cada vez que hagas un cambio y quieras exportar el .mo, abre de nuevo el fichero o verás como tus cambios no quedarán guardados.
Subiendo los ficheros .mo y .po en el servidor
Cada vez que actualicemos los ficheros .mo en el servidor, tenemos que reiniciar apache para que se puedan acceder a las nuevas frases:
/etc/init.d/apache2 reload
Usar las traducciones en PHP con gettext
Para usar el sistema de traducciones tenemos que iniciar un fichero .php con las siguientes lineas:
// traducir cadenas de texto sencillas
echo gettext("Nombre"); // mostaría el texto Name
echo _("Nombre"); // es lo mismo que la función gettext pero más corto
// traducir frases complejas con una subcadena
$nombre = "miquel camps";
echo sprintf(_("Bienvenido %s"), $nombre); // mostaría el texto Welcome miquel camps
// traducir frases complejas con un número
$online = 100;
echo sprintf(_("Usuarios online %d"), $online); // mostaría el texto 100 Online users
A los efectos de internalización y localización gettext puede utilizar esta herramienta en línea: https://poeditor.com/. Ayuda mucho en el proceso de traducción y tiene una lista de alrededor de 200 idiomas.
Gracias, me ha servido de ayuda hasta que me dio error. Es super complicado en realidad, mirad este artículo y la de pegas que tiene la traducción web : https://www.intertext.es/desarrollo-traduccion-web-dos-mundos-paralelos/
Estructura ficheros
Tenemos que seguir la siguiente estructura para que php pueda acceder a los ficheros de traducción, para ello en la raíz de nuestra web creamos las siguientes carpetas:
locale
locale/en_US
Ficheros de traducción
Para las traducciones se usan dos ficheros uno con extensión .po donde se ven las frases en texto plano y uno con extensión .mo que sólo es legible por el servidor.
Para empezar creamos un fichero locale/en_US/messages.po y seguimos la siguiente estructura con las frase originales y las traducciones:
msgid "Nombre"
msgstr "Name"
msgid "Bienvenido %s"
msgstr "Welcome %s"
msgid "Usuarios online %d"
msgstr "%d Online users"
Exportar ficheros .po a .mo
Para conseguir el fichero .mo usaremos poedit, para usarlo basta con abrir el fichero .po y pulsar el botón guardar para exportar el fichero .mo en la misma carpeta que el fichero .po.
Si hay algún error, por ejemplo una frase duplicada nos mostará un log.
Nota: cada vez que hagas un cambio y quieras exportar el .mo, abre de nuevo el fichero o verás como tus cambios no quedarán guardados.
Subiendo los ficheros .mo y .po en el servidor
Cada vez que actualicemos los ficheros .mo en el servidor, tenemos que reiniciar apache para que se puedan acceder a las nuevas frases:
/etc/init.d/apache2 reload
Usar las traducciones en PHP con gettext
Para usar el sistema de traducciones tenemos que iniciar un fichero .php con las siguientes lineas:
// inicializar idioma
$locale = 'en_US'; // o es_ES
putenv('LANG=' . $locale);
setlocale(LC_ALL, $locale.'.UTF-8');
// traducir cadenas de texto sencillas
echo gettext("Nombre"); // mostaría el texto Name
echo _("Nombre"); // es lo mismo que la función gettext pero más corto
// traducir frases complejas con una subcadena
$nombre = "miquel camps";
echo sprintf(_("Bienvenido %s"), $nombre); // mostaría el texto Welcome miquel camps
// traducir frases complejas con un número
$online = 100;
echo sprintf(_("Usuarios online %d"), $online); // mostaría el texto 100 Online users
Enlaces de interés
- Documentación gettext en PHP
- Documentación sprintf en PHP
- Internacionalizar un sitio web de forma colaborativa
23/01/2014 14:45
14/06/2018 16:07