web-dev-qa-db-ja.com

現在の言語以外の言語からtraslated文字列を取得する方法

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

8
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言語はxなのでadminでそれを使いたい、しかしlang yでデータを取得/保存したい、そしてあなたはpolylangを使っていると言いなさい。つまり、あなたの管理者は英語ですが、あなたは記事のスペイン語翻訳をしています、そしてあなたはあなたのテーマロケールからスペイン語データを得る必要があります:

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

この質問に対する答えを見つけるためには、WordPressがどのように翻訳を取得するのかを調べる必要があります。結局のところ、これを行うのは load_textdomain() 関数です。そのソースを見てみると、それがMOオブジェクトを作成し、.moファイルからそれへの翻訳をロードしていることがわかります。次に、そのオブジェクトを$l10nというグローバル変数に格納します。これは、textdomainをキーとする配列です。

特定のドメインに異なるロケールをロードするには、そのロケールの.moファイルへのパスを指定してload_textdomain()を呼び出すだけです。

$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() のソースを調べてください。

2
J.D.