Como obter uma string traduzida de um idioma diferente do atual?


9

Eu estava vagando ... Todas as funções de tradução ( __(), _e(), _x()e assim por diante) usam o idioma atual / ativo. Existe uma maneira de obter uma tradução de outro idioma que não o atual? Por exemplo, estou em uma página em francês e quero uma tradução em inglês: como?

Respostas:


3

Para encontrar a resposta para essa pergunta, basta ver como o WordPress recupera as traduções. Em última análise, é a load_textdomain()função que faz isso. Quando olhamos para sua fonte, descobrimos que ele cria um MOobjeto e carrega as traduções de um .moarquivo para ele. Em seguida, ele armazena esse objeto em uma variável global chamada $l10n, que é uma matriz digitada pelo domínio de texto.

Para carregar um código de idioma diferente para um domínio específico, basta chamar load_textdomain()o caminho para o .moarquivo desse código de idioma:

$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 descobrir qual lógica o WordPress usa para determinar onde procurar o .moarquivo para um plug-in (como obter o código do idioma atual), dê uma olhada na fonte de load_plugin_textdomain().


Mas de onde vem o primeiro domínio $ text?
Luca Reghellin

De fato, de onde vem? Por exemplo, uma das minhas ações / filtros não obtém o local correto, quando outros o fazem. Como descobrir isso? É um gancho "pending_to_publish", por exemplo ... se eu quiser enviar e-mails para lá, eles sempre estão em um idioma definido, enquanto no gancho "transição_post_status" ele obtém o idioma correto. Alguma ideia?
trainoasis

@trainoasis Atualizei o exemplo para mostrar valores de exemplo, mas você pode ver como obter a localidade atual a partir da origem de load_plugin_textdomain().
JD

Atualizei o código abaixo, porque descobri que às vezes $l10n[$textdomain]não é definido, mesmo depois de carregar o domínio de texto em uma after_setup_themeação.
Luca Reghellin

0

Então, graças a JD, eu finalmente acabei com 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);
}

Agora, eu sei que não deveria ser, de acordo com este famoso artigo:

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

Mas, eu não sei, funciona ... E bônus: digamos que você queira usá-lo no admin, porque o idioma do admin é x, mas você deseja obter / salvar dados no idioma, e você está usando o polylang . Portanto, ou seja, seu administrador é inglês, mas você está na tradução de um post para o espanhol e precisa obter dados em espanhol dos locais dos temas:

global $polylang;
$p_locale = $polylang->curlang->locale; // will be es_ES
_e2('your string', 'yourtextdomain', $p_locale)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.