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.
- 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.
- 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);
- 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.
- 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
- 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’);
} - 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:
- Más información sobre internalización y localización en WordPress.
- Cómo optimizar xlanguage para los buscadores.
Imagen de ButterflySha (vía Flickr). Licencia CC-by
Interesante… por mi parte, el vencedor ha sido WPML… Por comentar….
Muy muy muy interesante, muchas gracias 😉
@MaY: pero por comentar… cuente por qué ha seleccionado WPML 😉
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.
Muchas gracias Lorena, estaba pensando en poner Barriblog también en inglés y me viene estupendo tu post que me guardo como oro en paño en del.icio.us
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
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
@javier: pues sí que es tan sencillo como comentas. Nosotros, en Kulturklik, tenemos el RSS para contenidos en castellano y el RSS para contenidos en euskera, por ejemplo.
Vale, pues sí. Resulta que tenía a Feedburner por ahí bloqueando la cosa. Jeje, ays….
Mil gracias por abrirme los ojos 🙂
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!
@antonio: pues supongo que haciendo uso de la herramienta de google translate para webs. Yo no conozco otra manera :-S
Gracias lorena,.. eso me temia.. Enhorabuena por el blog. saludos
menuo pollo!!! yo lo siento mucho pero me he rendido… pasare de wordpress no sierve para multi idioma…
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.
xlanguage no funciona en las últimas versiones de WordPress y han abandonado su desarrollo. No es una opción.
WPML es de pago!!!
Efectivamente hace un mes descubrí que xlanguage estaba muerto (hay que dar las gracias a los desarrolladores por habernos ofrecido este trabajo hasta ahora). Nosotros estamos empezando a trabajar con qTranslate
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.
@luis: con qtranslate, cuando editas cada una de las etiquetas, tiene una caja por idioma
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
@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
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
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!
Hola Noa,
qtranslate ya ofrece la posibilidad de tener una url diferente por cada idioma. Lo de la cookies aún no está resuelto 🙁
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
Hola Roberto,
La gente de Librezale se encarga de traducir WordPress al euskera.
Un saludo
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.
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!!!
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
Ok. Gracias. Sí, había puesto en Locale lo de eu_EU al modo del resto de idiomas, pero sobraba el _EU.
Un saludo