如何从当前语言之外的其他语言获取翻译后的字符串?

时间:2016-07-07 作者:Luca Reghellin

我在徘徊。。。所有翻译功能(__(), _e(), _x() 等等)使用当前/活动语言。有没有办法从当前语言以外的其他语言获得翻译?例如,我在法语页面上,我想要英文翻译:如何?

2 个回复
最合适的回答,由SO网友:Luca Reghellin 整理而成

多亏了J.D.,我最终得到了以下代码:

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/

但是,我不知道,它是有效的。。。还有一个好处:假设您想在admin中使用它,因为admin语言是x,但您想在lang y中获取/保存数据,并且您正在使用polylang。也就是说,你的管理员是英语的,但你正在处理一篇文章的西班牙语翻译,你需要从你的主题地区获取西班牙语数据:

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

SO网友:J.D.

要找到这个问题的答案,您只需要看看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().