Como sabemos WordPress no viene preparado para sitios multilingue y es su punto débil, pero por suerte lo podemos solucionar, como todo, con plugins. Pero hay casos cuando instalar WPML u otros plugins complejos multilingue no es deseable por motivos de rendimiento o simplemente para mantener el número de archivos y la base de datos más pequeña. En mi práctica tuve que realizar un proyecto relativamente sencillo de un formulario de encuesta en dos idiomas y las páginas de gracias en cada idioma respectivamente. Uno de los requisitos era también guardar las respuestas recogidas por el cuestionario en una base de datos y poder descargarlos en CSV. Los proyectos de este tipo se pueden desarrollar sin ningún framework ni CMS pero decidí contar con WordPress para aprovechar su sistema de plantillas y su modelo de datos post. Así que vamos por pasos.

  1. Traducir las cadenas de texto. Las cadenas de texto son textos que están dentro de los archivos del tema o del plugin. Para traducirlas tenemos que generar archivos tipo MO. Esto podemos hacer con Poedit o, más sencillo, con Loco Translate. Deduzco que está tarea habeis hecho muchas veces porque es algo habitual si un tema o plugin no viene localizado para el idioma de nuestro sitio web o para un sitio multilingue como en este caso.
  2. Asignar idioma a las páginas. Necesitamos añadir un meta dato a las páginas de contenido para poder identificar el idioma y así cargar el archivo de localización de cadenas correspondiente. Esto lo podemos hacer con Custom Fields, desarrollar nuestro propio meta box o, más simple, instalando el plugin Meta Box como hice yo:
add_filter('rwmb_meta_boxes', 'aa_add_meta_boxes');
function aa_add_meta_boxes($meta_boxes){
	$prefix = 'aa_';

	$meta_boxes[] = array(
		'title' => __('Idioma', 'aleapp'),
		'post_types' => array('page'),
		'context' => 'side',
		'fields' => array(
			array(
				'id' => $prefix . 'post_lang',
				'type' => 'select',
				'options' => array('es' => 'ES', 'en' => 'EN')
			)
		)
	);
	
	return $meta_boxes;
}

Ahora tenemos que coger el meta dato que hemos añadido a la página y asegurarnos que wordpress carga el archivo .mo correctamente. Primero modificamos la local.

add_filter('locale', 'aa_set_locale');
function aa_set_locale($locale){
    global $post;

    $lang = null;
    if(isset($post)){
        $post_lang = get_post_meta($post->ID, 'aa_post_lang', true);
        if($post_lang !== false){
            $lang = $post_lang;
        }
    }
    if(isset($lang)){
        switch($lang){
            case 'en':
                $locale = 'en_GB';
                break;
        }
    }

    return $locale;
}

Si has cargado textdomain como lo recomienda wordpress con el action hook ‘after_setup_theme’ Wordpress todavía no ha formado el post y no podemos recuperar el idioma que hemos añadido a través del meta box. Pero vamos a dejar load_theme_texdomain con ese hook, que es importante para el propio Loco Translate y en el front cargamos el textdomain con ‘wp’:

add_action('after_setup_theme', 'aa_load_theme_textdomain');
add_action('wp', 'aa_load_theme_textdomain');
function aa_load_theme_textdomain(){
	load_theme_textdomain('aleapp', get_stylesheet_directory() . '/langs');
}

Si usas Loco Translate es posible que los archivos .mo no tengan incluida la locale completa en su nombre como en_GB.mo. Entonces lo que podemos hacer es especificar el archivo exacto que queremos cargar. En vez del código de arriba añadimos:

add_action('after_setup_theme', 'aa_load_theme_textdomain');
function aa_load_theme_textdomain(){
	load_theme_textdomain('aleapp', get_stylesheet_directory() . '/langs');
}

add_action('wp', 'aa_load_textdomain');
function aa_load_textdomain(){
    load_textdomain('aleapp', get_stylesheet_directory() . '/langs/' . substr(get_locale(), 0, 2) . '.mo');
}

Hay que decir que la solución que he presentado no sustituye al los plugins multilingue y solo vale para proyectos especificos. Un plugin multilingue permite gestionar más aspectos como traducción de taxonomias, vinculación de traducciones entre idiomas etc.

0 comentarios

Dejar un comentario

¿Quieres unirte a la conversación?
Siéntete libre de contribuir

Deja un comentario

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