Cada vez es más grande la comunidad de desarrolladores de themes, incluso de habla hispana, y una funcionalidad que debería ser básica es ofrecer la internacionalización de los themes, algo vital para la difusión de los themes WordPress.
Pues bien, en este tutorial, que he traducido de una guía de Cats who code, tienes el proceso completo, para hacer un theme traducible, desde el principio.
Índice de contenidos
1 – Añade las funciones necesarias
Para empezar con lo básico copia las líneas siguientes en el archivo functions.php de tu theme.
load_theme_textdomain( 'Nombre de mi theme', TEMPLATEPATH.'/languages' ); $locale = get_locale(); $locale_file = TEMPLATEPATH."/languages/$locale.php"; if ( is_readable($locale_file) ) require_once($locale_file);
En la línea 1 verás la función load_theme_textdomain(). Esta función te permite cargar un Text Domain. Elige cualquier nombre, pero recuerda que tiene que ser único. Lo ideal sería usar el nombre de tu theme
.
2 – Internacionaliza tu theme
Para traducir nuestro theme WordPress usaremos las funciones PHP gettext.
GetText tiene dos funciones: _e y __ (ambas con guión bajo).
La función «_e» se usa para imprimir texto «simple», y la función __ se usa cuando el texto a mostrar ya está envuelto en tags PHP.
EJEMPLOS:
<?php _e("La página que buscas no existe", "Nombre de mi theme"); ?>
<?php the_content(__('Sigue leyendo...', "Nombre de mi theme")); ?>
Date cuenta de nuevo que el nombre del text domain (Nombre de mi theme). Recuerda que debe ser el mismo que en el fichero functions.php
.
La parte aburrida es en la que tienes que reemplazar cada cadena simple por la función necesaria. Dependiendo e cuantas cadenas (strings) tenga tu theme esto puede ser una tarea realmente tediosa (de ahí que se internacionalicen tan pocos themes). Parece que hay algunas herramientas GNU que facilitan la tarea de extraer cadenas de los archivos de manera sencilla. Si quieres puedes buscar en Google por xgettext.
3 – Crea tu archivo .po
A partir de este momento tu theme WordPress ya puede traducirse fácilmente a cualquier idioma. Pero para mostrar los textos en un idioma distinto al tuyo tienes que añadir un archivo .po.
Los archivos .po significan Objeto Portátil (Portable Object). Básicamente, estos archivos contienen una cadena, y su traducción en otro idioma. Por ejemplo, si traduces la versión española de WordPress, tendrás un fichero es_ES.po dentro de la carpeta /wp-content/languages/
. Este archivo contiene todas las traducciones para que tu theme «hable» Español, para que tu theme diga Bienvenido en vez de Welcome.
Pero hay buenas noticias, no tienes que buscar en los archivos de tu theme cada línea a traducir. Hay una herramienta online llamada icanlocalize.com que puede escanear archivos PHP y crear ficheros .po por ti. ICanLocalize extraerá todas las cadenas envueltas en llamadas __(«txt», «domain») y _e(«txt», «domain»). Las cadenas pueden cerrarse con comillas dobles(«) o comillas simples(‘) y con cualesquiera caracteres de codificación.
Luego, los archivos Po pueden editarse con PoEdit, un software gratuito especialmente diseñado para esta tarea:
Como ya habrás imaginado, tienes que traducir cada cadena. Una vez hayas traducido todo guarda el archivo .po. PoEdit también creará un archivo .mo, que es una versión compilada del fichero .po.
4 – Puesta en marcha
Ahora que ya has hecho la parte más «difícil» del trabajo lo único que queda es definir tu «locale» en WordPress.
Para conseguirlo, lo primero es hacerte con tu código de idioma y país. Por ejemplo, si tu idioma es el Español y vives en Argentina, tu código será es_AR. El manual de GNU gettext tiene páginas para ayudarte a encontrar los códigos de tu país y idioma.
Una vez tengas tus códigos, abre el archivo wp-config.php y busca la constante WPLANG. Si existe, simplemente reemplaza el código existente por el tuyo. Si no existe, pues pega la siguiente línea (con tu propio código de país e idioma, por supesto)
define ('WPLANG', 'es_AR');
Fuentes
En los siguientes artículos encontrarás la documentación empleada para la elaboración de este post.
- Artículo original en inglés
- Making it Translatable – Internationalize / Localize WP Themes
- Premium themes are translatable themes
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!
No entiendo esta cadena:
<code>languages/$locale.php</code>
¿Seguro que no es '.mo' en lugar de '.php'? ¿O ese es otra cosa que nosotros no debemos meter mano?
__('…'): devuelve una cadena traducida.
_e('…'): imprime (echo) la cadena traducida.
¡¡¡ PHP no tiene Tags !!!, solo funciones.
el "tag" (yo dirá macro) <?php … ? > es para indicar que lo que hay dentro es código PHP…
Esto:
<?php __("…") ? >
no haría nada.
Un saludo.
perdón, no me di cuenta que se podían modificar los mensaje… borra este.
Todos los themes se deberían hacer así, su traducción es muy sencilla y ayuda a expandir el producto.
saludos
Gracias ! muy buen aporte, me ha sido de gran utilidad
pues no me funciona a mi, donde saco el Es_es.php?
tegno
$locale_file = TEMPLATEPATH."/languages/$locale.php";
if ( is_readable($locale_file) )
require_once($locale_file);
wp-content/themes/CorporateSandbox/languages/es_ES.php -> no existe
donde consigo ese archivo?
lo realizas en php es se puede hacer median xml con cadenas traducidas de tus lineas
Como siempre, genial! pero… tengo una duda y es que IcanLocalize no encuentra las lineas de los comentarios para traducir:
Cómo se 'programa' esta linea para pode ser traducida?
Una cosa importante:
Ojo con las etiquetas html en la traducción .PO tienen que estar las sintáxis perfectas, de lo contrario el Theme lo pilla mal.
Cierto, buen apunte, una etiqueta mal cerrada y se puede destrozar el admin, el theme, de todo.
Que buen post… la verdad lo explicaste muy bien. Felicidades.
Hola.
Me sirvio sin problemas, pero tengo una duda. ¿cual es la mejor forma de trabajar los plurales?
Como creo un archivo .po e incluir mis propias palabras ???
y si deseo realizar un tema el cual use un plugin como Polylang, el uso de _e(» «) seria de utilidad a la hora de realizar la traducción. gracias!
Hola Fernando!!!,
Quería preguntarte una duda respecto a las traducciones. Estoy traduciendo un tema, lo tengo ya todo menos unas frases que no aparecen en el .po. Debe ser porque no tienen el formato adecuado para que se pueda leer. Entonces me gustaría saber si existe alguna manera de traducir esto sin tocar los archivos .php, es decir, que esas cadenas aparezcan para ser leídas y traducibles en los archivos .po.
El códgo donde está la frase a traducir es el siguiente:
$related = new WP_Query($args);
if($related->have_posts() && $related->found_posts >= 1):
$out.=»;
$out.=».__(‘Related Portfolios ‘, ‘corporative’).»;
$out.=»;
$count=1;
while($related->have_posts()): $related->the_post();
$gallery = $videoURL = $format = »;
if(get_field( ‘portfolio_gallery’ )){$gallery = get_field( ‘portfolio_gallery’ );}
if(get_field( ‘portfolio_video’ )){$videoURL = get_field( ‘portfolio_video’ );}
if(get_field(‘portfolio_format’)==’video’): $format = ‘Video’;
elseif(get_field(‘portfolio_format’)==’gallery’): $format = ‘Gallery’;
else: $format = ‘Standard’;
endif;
$out .= »;
$out .= mediaholder_caption(»,$format,515,369,’portfolio’, $videoURL, », $gallery );
$out .= ‘‘.get_the_title().’‘;
$out .= »;
if($count%4==0){$out .=»;}
$count++;
endwhile;
$out.=»;
$out.=»;
Muchas Gracias. Saludos
Hola Fernando!!!,
Quería comentarte una duda que me ha surgido al ir a hacer la traducción de un sitio web. Está en castellano e inglés. Se ha utilizado WPML para ello. Se han traducido también los plugins. Para la plantilla he utilizado el archivo .mo, pero aún han quedado ciertas frases sin traducir. No quiero tocar los .php porque cambia pero no traduce para ambos idiomas. Por eso quewría saber si existe algún metodo para poder hacer que el archivo .mo pueda leer esas frases, se les puede dar formato cambiando el código de alguna forma?.
Muchas gracias, Saludos