Bagaimana cara mendapatkan string traslated dari bahasa selain yang sekarang?

9

Saya mengembara ... Semua fungsi terjemahan ( __(), _e(), _x()dan sebagainya) menggunakan bahasa saat ini / aktif. Apakah ada cara untuk mendapatkan terjemahan dari bahasa lain dari yang sekarang? Sebagai contoh, saya di halaman Perancis dan saya ingin terjemahan bahasa Inggris: bagaimana caranya?

Luca Reghellin
sumber

Jawaban:

3

Untuk menemukan jawaban untuk pertanyaan ini, Anda hanya perlu melihat bagaimana WordPress mengambil terjemahan. Pada akhirnya itu adalah load_textdomain()fungsi yang melakukan ini. Ketika kita melihat sumbernya, kita menemukan bahwa ia menciptakan MOobjek dan memuat terjemahan dari .mofile ke dalamnya. Kemudian ia menyimpan objek itu dalam variabel global yang disebut $l10n, yaitu array yang diketik oleh textdomain.

Untuk memuat lokal yang berbeda untuk domain tertentu, kita hanya perlu memanggil load_textdomain()dengan path ke .mofile untuk lokal itu:

$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;

Untuk mengetahui logika apa yang digunakan WordPress untuk menentukan di mana mencari .mofile untuk sebuah plugin (seperti cara mendapatkan lokasi saat ini), lihat sumbernya load_plugin_textdomain().

JD
sumber
Tapi dari mana $ textdomain pertama berasal?
Luca Reghellin
Memang, dari mana asalnya? Sebagai contoh, salah satu tindakan / filter saya tidak akan mendapatkan lokal yang benar, ketika orang lain melakukannya. Bagaimana cara mengetahuinya? Ini "pending_to_publish" hook misalnya ... jika saya ingin mengirim email di sana, mereka selalu dalam bahasa yang ditentukan sedangkan di "transition_post_status" hook itu mendapatkan bahasa yang benar. Adakah pikiran?
trainoasis
@trainoasis Saya telah memperbarui contoh untuk menampilkan nilai contoh, tetapi Anda dapat melihat cara mendapatkan lokal saat ini dari sumber load_plugin_textdomain().
JD
Saya memperbarui kode di bawah ini, karena saya menemukan bahwa kadang-kadang $l10n[$textdomain]tidak diselesaikan, bahkan setelah memuat domain teks dalam suatu after_setup_themetindakan.
Luca Reghellin
0

Jadi terima kasih kepada JD, saya akhirnya mendapatkan kode ini:

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);
}

Sekarang, saya tahu seharusnya tidak, sesuai dengan artikel terkenal ini:

http://ottopress.com/2012/internationalization-youre-probably-doing-it-wrong/

Tapi, saya tidak tahu, itu berfungsi ... Dan bonus: katakan Anda ingin menggunakannya di admin, karena bahasa admin adalah x, tetapi Anda ingin mendapatkan / menyimpan data dalam bahasa, dan Anda menggunakan polylang . Jadi, mis. Admin Anda adalah bahasa Inggris, tetapi Anda berada di terjemahan bahasa Spanyol dari sebuah pos, dan Anda perlu mendapatkan data bahasa Spanyol dari tema lokal Anda:

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