Как получить перенесенную строку с языка, отличного от текущего?


9

Я бродил ... Все функции перевода ( __(), _e(), _x()и так далее) используют текущий / активный язык. Есть ли способ получить перевод с другого языка, кроме текущего? Например, я на французской странице и хочу и английский перевод: как?

Ответы:


3

Чтобы найти ответ на этот вопрос, вам просто нужно посмотреть, как WordPress получает переводы. В конечном итоге это load_textdomain()функция, которая делает это. Когда мы посмотрим на его источник, мы обнаружим, что он создает MOобъект и загружает переводы из .moфайла в него. Затем он сохраняет этот объект в глобальной переменной, называемой $l10nмассивом с ключом textdomain.

Чтобы загрузить другую локаль для определенного домена, нам просто нужно вызвать load_textdomain()путь к .moфайлу для этой локали:

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

Чтобы узнать, какую логику использует WordPress, чтобы определить, где искать .moфайл для плагина (например, как получить текущую локаль), взгляните на источник load_plugin_textdomain().


Но откуда взялся первый $ textdomain?
Лука Регеллин,

Действительно, откуда это? Например, одно из моих действий / фильтров не получит правильную локаль, в отличие от других. Как понять это? Это хук "pending_to_publish", например ... если я хочу отправлять туда электронные письма, они всегда на определенном языке, тогда как в хуке "transition_post_status" он получает правильный язык. Какие-нибудь мысли?
trainoasis

@trainoasis Я обновил пример, чтобы показать значения примеров, но вы можете увидеть, как получить текущую локаль из источника load_plugin_textdomain().
JD

Я обновил код ниже, потому что я обнаружил, что иногда $l10n[$textdomain]не устанавливается, даже после загрузки текстового домена в after_setup_themeдействии.
Лука Регеллин

0

Так что благодаря JD я наконец-то получил этот код:

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

Теперь, я знаю, что это не должно быть, согласно этой известной статье:

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

Но, я не знаю, это работает ... И бонус: скажем, вы хотите использовать его в админке, потому что админский язык x, но вы хотите получать / сохранять данные в lang y, и вы используете polylang , То есть твой админ английский, но ты на испанском переводе поста, и тебе нужно получить испанские данные из локали твоей темы:

global $polylang;
$p_locale = $polylang->curlang->locale; // will be es_ES
_e2('your string', 'yourtextdomain', $p_locale)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.