(Página creada con '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 [http://wordpr...') |
m |
||
(No se muestra una edición intermedia del mismo usuario) | |||
Línea 4: | Línea 4: | ||
* 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. | * 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 [http://wordpress.org/extend/plugins/qtranslate/ qtranslate], que usa la misma dirección para todas las traducciones. | * 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 [http://wordpress.org/extend/plugins/qtranslate/ 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 | + | ¿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 [http://svn.automattic.com/wordpress-i18n/tools/trunk/ 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: | * '''.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: | ||
− | + | <pre> | |
− | # | + | # presentacion.php:36 |
− | + | msgid “Hello World” | |
− | + | msgstr “” | |
+ | </pre> | ||
* '''.po''': es el fichero .pot con las traducciones ya incluidas. Siguiendo el ejemplo anterior: | * '''.po''': es el fichero .pot con las traducciones ya incluidas. Siguiendo el ejemplo anterior: | ||
− | + | <pre> | |
− | # | + | # presentacion.php:36 |
− | + | msgid “Hello World” | |
− | + | msgstr “Hola Mundo” | |
+ | </pre> | ||
* '''.mo''': fichero binario que entienden las máquinas generado a partir del .po. | * '''.mo''': fichero binario que entienden las máquinas generado a partir del .po. | ||
Expliquemos el proceso paso por paso. | 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 [http://www.iso.org/iso/english_country_names_and_code_elements código ISO3166] para identificar a cada uno. | # Instalamos xlanguage y configuramos todos los idiomas en los que queremos que funcione nuestro blog. Mi recomendación es que usemos el [http://www.iso.org/iso/english_country_names_and_code_elements 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 | + | # 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) [http://es.wikipedia.org/wiki/Gettext 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 [http://svn.automattic.com/wordpress-i18n/tools/trunk/add-textdomain.php add-textdomain.php] de WordPress. Lo lanzamos de la siguiente manera: | # Después de marcar todas las cadenas a traducir, ahora toca generar el .pot con ellas. Para ello, nos bajamos el script [http://svn.automattic.com/wordpress-i18n/tools/trunk/add-textdomain.php add-textdomain.php] de WordPress. Lo lanzamos de la siguiente manera: | ||
: | : | ||
Línea 29: | Línea 31: | ||
: msgfmt fichero_idioma.pot -o fichero_idioma.mo | : 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: | # 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: | ||
− | + | <pre> | |
function theme_init(){ | function theme_init(){ | ||
− | + | load_theme_textdomain(‘default’, get_template_directory() . ‘/languages’); | |
− | + | } | |
+ | </pre> | ||
Si además queremos traducir algún plugin: | Si además queremos traducir algún plugin: | ||
+ | <pre> | ||
function theme_init(){ | 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′); | |
− | + | } | |
+ | </pre> | ||
# 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 [http://www.w3.org/TR/REC-html40/struct/dirlang.html estandarizada] por el W3C) | # 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 [http://www.w3.org/TR/REC-html40/struct/dirlang.html estandarizada] por el W3C) | ||
===Enlaces de interés:=== | ===Enlaces de interés:=== | ||
* [http://codex.wordpress.org/I18n_for_WordPress_Developers Más información] sobre internalización y localización en WordPress. | * [http://codex.wordpress.org/I18n_for_WordPress_Developers Más información] sobre internalización y localización en WordPress. | ||
* [http://hellosam.net/lang/en/project/xlanguage/3 Cómo optimizar xlanguage para los buscadores]. | * [http://hellosam.net/lang/en/project/xlanguage/3 Cómo optimizar xlanguage para los buscadores]. | ||
+ | |||
+ | [[Category:WordPress]] |
Revisión actual del 17:22 25 sep 2010
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 (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.