¿Cómo obtener una cadena traducida de un idioma que no sea el actual?

9

Estaba deambulando ... Todas las funciones de traducción ( __(), _e(), _x()y así sucesivamente) usan el lenguaje actual / activo. ¿Hay alguna manera de obtener una traducción de otro idioma que no sea el actual? Por ejemplo, estoy en una página en francés y quiero una traducción al inglés: ¿cómo?

Luca Reghellin
fuente

Respuestas:

3

Para encontrar la respuesta a esta pregunta, solo necesita ver cómo WordPress recupera las traducciones. En última instancia, es la load_textdomain()función la que hace esto. Cuando miramos su fuente, encontramos que crea un MOobjeto y carga las traducciones de un .moarchivo en él. Luego almacena ese objeto en una variable global llamada $l10n, que es una matriz con clave de dominio de texto.

Para cargar una configuración regional diferente para un dominio particular, solo necesitamos llamar load_textdomain()con la ruta al .moarchivo para esa configuración regional:

$textdomain = 'your-textdomain';

// First, back up the default locale, so that we don't have to reload it.
global $l10n;

$backup = $l10n[ $textdomain ];

// Now load the .mo file for the locale that we want.
$locale  = 'en_US';
$mo_file = $textdomain . '-' . $locale . '.mo';

load_textdomain( $textdomain, $mo_file );

// Translate to our heart's content!
_e( 'Hello World!', $textdomain );

// When we are done, restore the translations for the default locale.
$l10n[ $textdomain ] = $backup;

Para averiguar qué lógica usa WordPress para determinar dónde buscar el .moarchivo para un complemento (como cómo obtener la configuración regional actual), eche un vistazo a la fuente de load_plugin_textdomain().

JD
fuente
¿Pero de dónde viene el primer $ textdomain?
Luca Reghellin
De hecho, ¿de dónde viene? Por ejemplo, una de mis acciones / filtros no obtendrá la configuración regional correcta, cuando otros sí. ¿Cómo resolver esto? Es el gancho "pendiente_de_publicación", por ejemplo ... si quiero enviar correos electrónicos allí, siempre están en un idioma definido, mientras que en el gancho "transition_post_status" se obtiene el idioma correcto. ¿Alguna idea?
trainoasis
@trainoasis He actualizado el ejemplo para mostrar valores de ejemplo, pero puede ver cómo obtener la configuración regional actual desde la fuente de load_plugin_textdomain().
JD
Actualicé el código a continuación, porque descubrí que a veces $l10n[$textdomain]no está configurado, incluso después de cargar el dominio de texto en una after_setup_themeacción.
Luca Reghellin
0

Entonces, gracias a JD, finalmente terminé con este código:

function __2($string, $textdomain, $locale){
  global $l10n;
  if(isset($l10n[$textdomain])) $backup = $l10n[$textdomain];
  load_textdomain($textdomain, get_template_directory() . '/languages/'. $locale . '.mo');
  $translation = __($string,$textdomain);
  if(isset($bkup)) $l10n[$textdomain] = $backup;
  return $translation;
}


function _e2($string, $textdomain, $locale){
  echo __2($string, $textdomain, $locale);
}

Ahora, sé que no debería ser, según este famoso artículo:

http://ottopress.com/2012/internationalization-youre-probably-doing-it-wrong/

Pero, no sé, funciona ... Y extra: digamos que quiere usarlo en admin, porque el lenguaje de administración es x, pero desea obtener / guardar datos en lang y, y está usando polylang . Entonces, es decir, su administrador es inglés, pero está en la traducción al español de una publicación y necesita obtener datos en español de las configuraciones regionales de su tema:

global $polylang;
$p_locale = $polylang->curlang->locale; // will be es_ES
_e2('your string', 'yourtextdomain', $p_locale)
Luca Reghellin
fuente