回答:
この質問に対する答えを見つけるには、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)