現在の言語以外の言語から翻訳された文字列を取得する方法は?


9

私はさまよっていました...すべての翻訳機能(__(), _e(), _x()など)は現在/アクティブな言語を使用します。現在の言語以外の言語から翻訳を取得する方法はありますか?たとえば、私はフランス語のページで、英語の翻訳が必要です。

回答:


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はどこから来たのですか?
Luca Reghellin 2017

実際、それはどこから来たのですか?たとえば、私のアクション/フィルターの1つが他のロケールと同じように正しいロケールを取得しません。これを理解する方法は?それは例えば「pending_to_publish」フックです...私がそこにメールを送信したい場合、それらは常に定義された言語ですが、「transition_post_status」フックでは正しい言語を取得します。何かご意見は?
trainoasis 2018年

@trainoasis例の値を表示するように例を更新しましたが、のソースから現在のロケールを取得する方法を確認できますload_plugin_textdomain()
JD

以下のコードを更新しました。これ$l10n[$textdomain]は、after_setup_themeアクションでテキストドメインを読み込んだ後でも、設定されないことがあることがわかったためです。
Luca Reghellin、2018

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/

しかし、私は知りません、それは機能します...そしてボーナス:管理言語はxであるため、管理で使用したいが、lang yでデータを取得/保存したい、そしてあなたはpolylangを使用していると言います。つまり、管理者は英語ですが、スペイン語の投稿を翻訳していて、テーマのロケールからスペイン語のデータを取得する必要があります。

global $polylang;
$p_locale = $polylang->curlang->locale; // will be es_ES
_e2('your string', 'yourtextdomain', $p_locale)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.