我在徘徊...所有翻译功能(__(), _e(), _x()
等等)都使用当前/当前语言。有没有一种方法可以从当前语言之外的另一种语言获得翻译?例如,我在法语页面上,我想要英文翻译:怎么办?
我在徘徊...所有翻译功能(__(), _e(), _x()
等等)都使用当前/当前语言。有没有一种方法可以从当前语言之外的另一种语言获得翻译?例如,我在法语页面上,我想要英文翻译:怎么办?
Answers:
要找到此问题的答案,您只需要查看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/
但是,我不知道,它的工作原理...还有一个好处:说您想在admin中使用它,因为admin语言是x,但是您想要以lang y获取/保存数据,并且您正在使用polylang 。因此,即您的管理员是英语的,但是您正在翻译帖子的西班牙语,因此您需要从主题语言环境中获取西班牙语数据:
global $polylang;
$p_locale = $polylang->curlang->locale; // will be es_ES
_e2('your string', 'yourtextdomain', $p_locale)