Я бродил ... Все функции перевода ( __(), _e(), _x()
и так далее) используют текущий / активный язык. Есть ли способ получить перевод с другого языка, кроме текущего? Например, я на французской странице и хочу и английский перевод: как?
Я бродил ... Все функции перевода ( __(), _e(), _x()
и так далее) используют текущий / активный язык. Есть ли способ получить перевод с другого языка, кроме текущего? Например, я на французской странице и хочу и английский перевод: как?
Ответы:
Чтобы найти ответ на этот вопрос, вам просто нужно посмотреть, как 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()
.
load_plugin_textdomain()
.
$l10n[$textdomain]
не устанавливается, даже после загрузки текстового домена в after_setup_theme
действии.
Так что благодаря 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)