如何从当前语言以外的语言中获取翻译字符串?


Answers:


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是从哪里来的呢?
卡·雷格尔林'17

确实,它来自哪里?例如,我的动作/过滤器之一不会获得正确的语言环境,而其他人却可以。如何弄清楚这一点?例如,它是“ pending_to_publish”钩子……如果我想在那儿发送电子邮件,它们总是使用已定义的语言,而在“ transition_post_status”钩子中,它将获取正确的语言。有什么想法吗?
Trainoasis

@trainoasis我已经更新了示例以显示示例值,但是您可以看到如何从的源获取当前语言环境load_plugin_textdomain()
JD

我更新了以下代码,因为我发现有时$l10n[$textdomain]即使在将文本域加载到after_setup_theme动作中后,有时也未设置。
卡·雷格尔林18'Aug

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/

但是,我不知道,它的工作原理...还有一个好处:说您想在admin中使用它,因为admin语言是x,但是您想要以lang y获取/保存数据,并且您正在使用polylang 。因此,即您的管理员是英语的,但是您正在翻译帖子的西班牙语,因此您需要从主题语言环境中获取西班牙语数据:

global $polylang;
$p_locale = $polylang->curlang->locale; // will be es_ES
_e2('your string', 'yourtextdomain', $p_locale)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.