Gestionando varios idiomas con WordPress

Ando embarcada en varios proyectos sustentados por el gestor de contenidos WordPress y uno de los requisitos imprescindibles es la navegación multi-idioma. Así que dejaré por aquí mi experiencia, por si a alguien le sirve de ayuda o puede ser enriquecida por otras personas (y a ver si así podemos devolver algo de todo lo que nos ofrece este tipo de paquetes de software libre).

Lo primero de todo, necesitamos un plugin que consiga gestionar correctamente ese sistema multi-idioma. Para ello, y tras probar unos cuantos, el vencedor ha sido xlanguage. Las características que le hacen caballo ganador:

  • Se encarga de la administración de tantos idiomas como queramos manejar. Esa gestión afecta a los contenidos del blog (tanto posts como páginas estáticas), a las categorías, etiquetas, feeds, theme, etc, …
  • En el theme sólo será necesario contar con una carpeta donde almacenar los ficheros de idioma: un .mo con el nombre del idioma. Si tenemos plugins que generan contenidos, también podremos traducirlos y dejar aquí sus .mo.
  • Una funcionalidad muy interesante es que gestiona el cambio de idioma mediante cookies, así que si cambiamos el lenguaje que arranca por defecto, en próximas navegaciones recordará nuestra preferencia. También detecta el idioma del navegador, para mostrarnos directamente esa opción.
  • Por cada idioma genera una url diferente, lo que hace que los buscadores indexen los contenidos en todos los idiomas. Esa fue una de las razones por las que me decanté por xlanguage y no por qtranslate, que usa la misma dirección para todas las traducciones.

¿Y cómo conseguimos traducir nuestro theme y nuestros plugins? Sencillo: todas las llamadas php que muestren cadenas de texto, tendrán que ir con la función _e() o bien con la función __() (la diferencia entre ambas es que _e hace un echo de la cadena. Es decir, echo __(“Hola mundo”); es lo mismo que _e(“Hola Mundo”); ). De esta manera, con las herramientas que nos ofrece WordPress para la localización e internalización, podremos generar un .pot del theme donde introducir las traducciones pertinentes para luego generar el .mo que entenderá nuestro xlanguage.

  • .pot: este fichero se genera de manera automática y recoge todas las cadenas de texto que aparecen en nuestro site. Por cada una de ellas, aparece justo debajo el espacio donde se debe dejar su traducción. Este es un ejemplo donde aparece primero el lugar en el que está dentro del código, la cadena en sí y el espacio donde se dejará la traducción correspondiente:

    #: presentacion.php:36
    msgid “Hello World”
    msgstr “”

  • .po: es el fichero .pot con las traducciones ya incluidas. Siguiendo el ejemplo anterior:

    #: presentacion.php:36
    msgid “Hello World”
    msgstr “Hola Mundo”

  • .mo: fichero binario que entienden las máquinas generado a partir del .po.

Expliquemos el proceso paso por paso.

  1. Instalamos xlanguage y configuramos todos los idiomas en los que queremos que funcione nuestro blog. Mi recomendación es que usemos el código ISO3166 para identificar a cada uno.
  2. Tendremos que repasar todos nuestros plugins y el theme para identificar dónde se generan cadenas de texto y comprobar que se usa o la función _e() o __(). WordPress usa la librería de internacionalización (i18n) gettext. Si dentro de una cadena de texto aparece una variable, no podemos usar sin más _e(“Tenemos $num amigos”); pero sí printf(__(“Tenemos %d amigos.”), $num);
  3. Después de marcar todas las cadenas a traducir, ahora toca generar el .pot con ellas. Para ello, nos bajamos el script add-textdomain.php de WordPress. Lo lanzamos de la siguiente manera:

    php add-textdomain.php -i domain phpfile.php

    El domain marca el ámbito de lo que traducimos. Podemos poner default, por ejemplo, para el theme y el nombre del plugin para cada uno de ellos. Luego generamos el .pot mediante makepot.php:

    php makepot.php wp-theme el-directorio-del-theme languages/traduccion.pot

    En el caso de un plugin ponemos wp-plugin en vez de wp-theme. Para usar todas estas herramientas tenemos que tener el paquete gettext en nuestro servidor.

  4. Para optener el .mo (fichero binario que entienden las máquinas) del .po (fichero con texto que entendemos las personas), lanzamos el siguiente conjuro desde bash:

    msgfmt fichero_idioma.pot -o fichero_idioma.mo

  5. Ahora sólo falta que el theme sepa dónde encontrar esos ficheros .mo. Para ello usaremos el fichero de funciones de los themes de wordpress: functions.php. Allí agregaremos lo siguiente, teniendo en cuenta que hemos dejado los ficheros .mo en la carpeta languages y que el domain del theme es default:

    function theme_init(){
    load_theme_textdomain(‘default’, get_template_directory() . ‘/languages’);
    }

    Si además queremos traducir algún plugin:

    function theme_init(){
    load_theme_textdomain(‘default’, get_template_directory() . ‘/languages’);
    //Aquí ponemos el plugin cuyo domain es plugin1:
    load_theme_textdomain(‘plugin1’, get_template_directory() . ‘/languages/plugin1’);
    }

  6. Para introducir contenidos, en el título, las categorías y las etiquetas, se separa cada idioma con un carácter definido en la parte de administración de xlanguage. Por defecto se usa el carácter | (el pipe que está en la tecla del uno y la exclamación). Por ejemplo, publicaríamos “Etiketak|Etiquetas” para crear un contenido cuyo título en euskera sería Etiketak y Etiquetas en castellano (siempre se usa el orden de creación de los idiomas). En los contenidos, en el editor de WordPress tenemos unos botones para marcar el idioma de cada parte. Y si lo queremos manejar desde la parte html, sólo tendremos que marcarlo con la etiqueta <span lang=”idioma”></span> (una etiqueta estandarizada por el W3C)

Enlaces de interés:

Imagen de ButterflySha (vía Flickr). Licencia CC-by

Related Posts Plugin for WordPress, Blogger...

Lorena Fernández

Por el día, directora de identidad digital en la Universidad de Deusto. Por la noche, rompiendo techos de cristal en Doce Miradas. Y como dormir está sobrevalorado, colaboro en Radio Bilbao en la sección "De las ondas a la red" del programa Hoy por Hoy Bilbao. Puedes saber más de mí o echar un vistazo a mis publicaciones, cursos y participación en congresos.

33 thoughts on “Gestionando varios idiomas con WordPress

  1. Yo opté por WPML despues de probar casi todos. Me parece un poco mas completo y flexible. La forma de trabajar es similar al que aquí se explica. Habría que comparar punto por punto para ver cual es más completo, pero de entrada WPML está mejor documentado.

  2. voy a ver si me funciona, me hace bastante falta y ya he probado varias cosas, a ver si esta me funciona bien, si no ultilizare el traductor de google con banderitas y enlaces, pero lo que de verdad me interesa es que google indexe los resultados en varios idiomas

  3. Hola Lorena y compañeros,

    Tengo una consulta: ¿se puede generar un rss de cada idioma? En las pruebas que he hecho funciona el del idioma principal, pero no de los otros. Me explico: no es tan fácil como /lang/xx/feed/

    ¿Cómo has solucionado este tema? Si te doy mucho trabajo me puedes decir “no me des tanto trabajo” y es suficiente como respuesta 🙂

    Gracias

  4. Hola Lorena,

    genial el post porque buscaba información al respecto. Lo siento pero creo que no tengo tantos conocimientos y a partir de PHP ya no controlo lenguajes de servidor.

    ¿No se puede gestionar idiomas en worpress en modo “online”, simplemente desde la propia aplicación web (sin necesidad de server propio o conectividad con bbdd)?

    Muchas gracias desde ya!

  5. menuo pollo!!! yo lo siento mucho pero me he rendido… pasare de wordpress no sierve para multi idioma…

  6. Hola! Muchas muchas gracias por la información. Estoy haciendo una serie de vídeo artículos acerca de WordPress y este es justamente uno de los puntos que tocaré en el futuro. La categoría es “Desarmando WordPress” en http://www.orifichu.com.
    Una vez más gracias.

  7. Hola Lorena (y compañía)
    En primer lugar daros las gracias por vuestra aportación. Me parece fabulosa.
    Bien, mi duda es la siguiente: andamos haciendo una web en 2 idiomas (euskera y castellano) con qtraslate, pero no sé cómo poner las “tags” para que salgan en cada idioma (porque me salen todas en los 2 idiomas).
    ¿Conocéis alguna solución, a ser posible, sencilla? No controlo PHP, aunque me arriesgaría a lo que sea…
    Gracias por adelantado.

  8. gracias Lorena.

    Pues no sé qué me está pasando, porque me aparecen las etiquetas de ambos idiomas en castellano y en euskera; tanto en el gestor (para elegir la etqiueta que quiero incluir), como en la web (como etiquetas para seleccionar). He incluido el archivo .mo; he metido EU como idioma… ¿debia haber metido algo en php y no lo he hecho?
    Muchas gracias
    Luis

  9. @luis: ¿me puedes pasar una url donde pueda ver el comportamiento? No hay que tocar nada en php ni en los ficheros .mo porque qtranslate incorpora en la edición de etiquetas (menú de la administración “Entradas -> Etiquetas de las entradas”) tantos cajetines para el nombre como idiomas tengas configurados

  10. Ya he visto el error, Lorena:

    Las etiquetas hay que escribirlas en cada idioma en “Entradas -> Etiquetas de las entradas” y no en el cajetín que hay en la parte inferior derecha que sale cuando creas una nueva entrada. terrible error de novato.
    Perdona el trastorno y muchísimas gracias por la indicación, me has ahorrado otro montón de horas buscando la solución y de dolores de cabeza.
    Me lo grabo en la frente 😉
    Muchas gracias
    Luis

  11. Hola Lorena,

    Al principio del post comentabas:
    “- Una funcionalidad muy interesante es que gestiona el cambio de idioma mediante cookies, así que si cambiamos el lenguaje que arranca por defecto, en próximas navegaciones recordará nuestra preferencia. También detecta el idioma del navegador, para mostrarnos directamente esa opción.
    – Por cada idioma genera una url diferente, lo que hace que los buscadores indexen los contenidos en todos los idiomas. Esa fue una de las razones por las que me decanté por xlanguage y no por qtranslate, que usa la misma dirección para todas las traducciones.”

    Parece que el gtranslate no tiene ninguna de estas dos funcionalidades, verdad?
    Cómo habéis solucionado este tema, ahora que os habéis pasado al gtranslate?

    Saludos!

  12. Hola Lorena

    Muchas gracias por compartir tu experiencia.
    He instalado qtranslate en wordpress con budypress, y no encuentro de dónde bajarme los archivos .mo de euskera.
    ¿Me podrías dar el enlace al sitio oficial de la traducción?

    De nuevo muchas gracias.

    SAlu2

  13. Para un mejor trabajo de traducción recomiendo https://poeditor.com/, una herramienta de traducción en línea que hace un muy buen trabajo en la organización de proyectos de traducción multitud. Tiene muchas características útiles, como una memoria de traducción. Es una opción profesional más que google, en mi opinión.

  14. Hola Lorena
    Buscando información sobre cómo hacer bilingüe el blog he dado por fin con tu post, después de haber estado intentando otras opciones con la herramienta multisite, que no he logrado hacer que funcione de todas formas. Siguiendo los comentarios he instalado el plugin qtranslate sobre una instalación de wordpress en euskera. He copiado el archivo eu.mo de wp-content/languages a plugins/qtranslate/lang, cambiándole el nombre. La pega es que automáticamente me ha cambiado todo el escritorio del wp-admin a inglés, a pesar de haber creado el idioma euskera, ponerlo como predeterminado y eliminar, de hecho, el inglés. Ahora está en castellano y en euskera, pero mientras que en la versión en castellano me muestra todas las etiquetas en castellano, en la versión en euskera lo hace en inglés, y si voy a los widgets del tema y escribo las etiquetas en euskera las muestra así en las 2 versiones. ¿Es cosa del qtranslate o del tema? No creo que sea del archivo de idioma porque antes de hacer nada de esto sí mostraba todo el escritorio en euskera… ¿Alguna idea?
    Muchas gracias por la orientación de tu blog!!!

  15. Hola David:

    qtranslate lee el idioma en la carpeta wp-content/languages, no en plugins/qtranslate/lang. Y el nombre del .mo tiene que coincidir con la nomenclatura corta que le has dado en la configuración del idioma.

    Un saludo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *