Como ya sabe cualquier usuario avanzado de WordPress, el panel de control y algunas frases genéricas de este CMS se pueden traducir al español poniendo el archvio es_ES.mo en /wp-content/languages y definiendo en /wp-config.php la línea define(‘WPLANG’,’es_ES’);

Pero para traducir un tema en particular, es necesario poner todas las frases que se quieran traducir entre las funciones __() y _e(), generar el archivo .po a partir de una herramienta como gettext y traducir todas las expresiones con la ayuda de algún programa como PoEdit, que también genera el archivo .mo final. No es mi intención explicar este proceso en este artículo (más sobre la herramienta gettext), sino abordar un problema que se me ha planteado y me ha costado mucho de solucionar.

Cuando tenemos el archivo de traducción del tema al español es_ES.mo generado, suele ocurrir que al actualizarlo en Internet el tema sigue apareciendo en inglés. Después de buscar mucho por Internet y no hallar solución, me fijé en algunos temas ya traducidos como mandingo y encontré la causa del problema. Pensaba que por defecto cualquier tema buscaba en la carpeta raíz el archivo de traducción a partir del parámetro WPLANG (en nuestro caso ‘es_ES’), pero no es así, hay que indicárselo.

En primer lugar, hemos de cargar el archivo de localización .mo del tema y esto se hace con la función load_theme_textdomain(‘nombre_tema’), así que hay que poner en algún archivo que se cargue siempre (como header.php) la siguiente línea:

<?php load_theme_textdomain('nombre_tema'); ?>

A continuación, en todos los archivos php del tema donde se utilicen las funciones de traducción __() y _e(), hay que especificarle el tema en todas las llamadas a esas funciones, por ejemplo:

_e('This post was written by ');

cambia a

_e('This post was written by ','nombre_tema');

y eso es todo. Es un poco de trabajo adicional pero así conseguimos que funcione nuestra propia traducción del tema.

Para no tener que hacer esto con todas las llamadas a las funciones __() y _e(), pensé en ir a su definición y modificar directamente el $domain, que por defecto es ‘default’, es decir, en /wp-includes/l10n.php cambiar el tema por defecto:

function __($text, $domain = 'default')

cambia a

function __($text, $domain = 'nombre_tema')

pero esto hace que el panel de control de WordPress pierda la traducción, ya que deja de cargar el archivo es_ES.mo genérico de /wp-content/languages, así que no tendremos más remedio que modificar todas las llamadas a las funciones __() y _e().

Etiquetas: , , , , , , , ,
11 Respuestas a “Solucionado: El archivo .mo de traducción del tema de WordPress no funciona”
  1. Esteban dice:

    Hola, seguí tus pasos pero no he podido traducir la página, aver si estoy haciendo lo correcto:
    El theme que uso se llama atahualpa (es el nombre del directorio que lo contiene)
    entonces en header.php coloco la siguiente línea

    luego verifiqué el resto de los pasos y está todo ok.

    Alguna sugerencia?

    saludos.

  2. admin dice:

    Hola Esteban, gracias por comentar, la línea que comentas que has añadido no aparece, puede ser que el sistema la haya filtrado si contenía código…

    Por otro lado, asegúrate que utilizas

    _e(‘This post was written by ‘,’nombre_tema’);

    poniendo el nombre del tema al final, prueba a traducir una frase sola.

    Recuerda que has de generar el archivo .mo a partir del archivo de traducciones .po, con algún programa para ello como el POEdit, en Internet hay tutoriales de cómo utilizarlo.

    Un saludo.

  3. Pepe dice:

    Quizás el problema es que debes nombrar el .mo tal el WP_LANG que definiste.
    Si usaste define(‘WP_LANG’, ‘es_ES’) probá usar es_ES.mo a ver si te anda.

    Saludos!

  4. hermi dice:

    Hola, tengo el mismo problema que esteban con atahualpa333 habeis resuelto el problema? sabeis donde conseguir el archivo .mo ?
    Muchas gracias

  5. […] ya mencioné en el artículo sobre qué hacer cuando el archivo .mo de traducción del tema de WordPress no funciona, para traducir un tema de WordPress en primer lugar es necesario aplicar las funciones __() y _e() […]

  6. Araxiel dice:

    1 paso tener en tu equipo el Poedit (programa para editar la traduccion), bajarte el tema que quieres traducir a tu idioma.
    2 paso, poner delante de los textos a traducir o , en el caso que el texto a traducir ya este dentro de las etiquetas solo poner lo de dentro.
    3 paso abrir el poedit, darle a neuvo catalogo y añadir en la pestaña de carpetas, la carpeta donde tienes tu archivo de traduccion.
    4 modificar el archivo functions.php añadiendo en la segunda linea, justo debajo de <?php:

    // xili-language plugin check
    function init_language(){
    if (class_exists(‘xili_language’)) {
    define(‘THEME_TEXTDOMAIN’,’quietly-simple’);
    define(‘THEME_LANGS_FOLDER’,’/lang’);
    } else {
    load_theme_textdomain(‘quietly-simple’, get_template_directory() . ‘/lang’);
    }
    }
    add_action (‘init’, ‘init_language’);

    5 creamos una carpeta llamada lang en el raiz del themplate y colocamos los archivos de traduccion es_Es.po y .mo. Subimos el thema a nuesto blog y listo.

  7. luis razatroc dice:

    Gracias y felicidades por el blog.

    Estoy tratando de traducir una plantilla que ya tiene los archivos *.po y *.mo.

    Cada *.php de la plantilla tiene la funcion:
    _e(‘texto_sin_traducir’,’tema_en_que_se_traducira’);
    El tema en que se traducira tiene el nombre de ‘woothemes’.

    Incluí la declaración:

    en index.php y header.php

    Los archivos los tengo en /lang/, pero tengo la duda de su nombre, ya que tengo lo siguiente:

    premiumnews-es_Es.po
    premiumnews-es_Es.mo

    He probado a cambiarlos por:

    woothemes-es_Es.po
    woothemes-es_Es.mo

    Es decir, he probado que coincidan las declaraciones, pero no funciona.

    Estoy usando:

    http://www.woothemes.com/2007/11/premiumnews/

    ¿Me pueden ayudar?

    Saludos cordiales y gracias de antemano.

  8. Pablo dice:

    Gracias!! Me sirvió perfectamente tu solución! Buen trabajo.

  9. bqq dice:

    Luis En WP_includes busca el archivo l10n.php busca la linea:

    $mofile = “$path/$locale.mo”;

    y la sustituyes por:

    $mofile = “$path/lang/premiumnews-es_ES.mo”;

    Y ya esta todo traducido sin mas complicacion

  10. godie dice:

    De perlas, por esto no funcionaba jaja yo hechandole la culpa al poEdit, gracias por compartir la solucion :), ya mero termino la traduccion del tema. saludos =)

  11. Dan dice:

    Me has salvado la vida. Muchas grácias.

  12.  
Deja una Respuesta