Come ottenere una stringa tradotta da una lingua diversa da quella corrente?


9

Stavo vagando ... Tutte le funzioni di traduzione ( __(), _e(), _x()e così via) usano la lingua corrente / attiva. C'è un modo per ottenere una traduzione da un'altra lingua rispetto a quella corrente? Ad esempio, sono su una pagina francese e voglio una traduzione inglese: come?

Risposte:


3

Per trovare la risposta a questa domanda, devi solo guardare come WordPress recupera le traduzioni. Alla fine è la load_textdomain()funzione che fa questo. Quando diamo un'occhiata alla sua fonte troviamo che crea un MOoggetto e carica le traduzioni da un .mofile in esso. Quindi memorizza quell'oggetto in una variabile globale chiamata $l10n, che è un array codificato da textdomain.

Per caricare una locale diversa per un determinato dominio, dobbiamo solo chiamare load_textdomain()con il percorso del .mofile per quella locale:

$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;

Per scoprire quale logica utilizza WordPress per determinare dove cercare il .mofile per un plug-in (come come ottenere le impostazioni internazionali correnti), dai un'occhiata alla fonte di load_plugin_textdomain().


Ma da dove proviene il primo $ textdomain?
Luca Reghellin,

In effetti, da dove viene? Ad esempio, una delle mie azioni / filtri non otterrà la locale corretta, quando lo fanno gli altri. Come capire questo? Ad esempio, è l'hook "pending_to_publish" ... se voglio inviare e-mail lì, sono sempre in una lingua definita mentre nell'hook di "transizione_post_status" ottiene la lingua corretta. qualche idea?
trainoasi,

@trainoasis Ho aggiornato l'esempio per mostrare i valori di esempio, ma puoi vedere come ottenere la locale corrente dalla fonte di load_plugin_textdomain().
JD

Ho aggiornato il codice qui sotto, perché ho scoperto che a volte $l10n[$textdomain]non è impostato, anche dopo aver caricato il dominio di testo in after_setup_themeun'azione.
Luca Reghellin,

0

Quindi grazie a JD, ho finalmente finito con questo codice:

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);
}

Ora, so che non dovrebbe essere, come per questo famoso articolo:

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

Ma non lo so, funziona ... E bonus: supponiamo che tu voglia usarlo in admin, perché il linguaggio admin è x, ma vuoi ottenere / salvare i dati in un attimo e stai usando polylang . Quindi, ad esempio, il tuo amministratore è l'inglese, ma sei sulla traduzione spagnola di un post e devi ottenere dati spagnoli dalle tue aree tematiche:

global $polylang;
$p_locale = $polylang->curlang->locale; // will be es_ES
_e2('your string', 'yourtextdomain', $p_locale)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.