Làm thế nào để có được một chuỗi traslated từ một ngôn ngữ khác với ngôn ngữ hiện tại?


9

Tôi đã đi lang thang ... Tất cả các chức năng dịch ( __(), _e(), _x()vân vân) sử dụng ngôn ngữ hiện tại / hoạt động. Có cách nào để có được một bản dịch từ ngôn ngữ khác hơn ngôn ngữ hiện tại không? Ví dụ: tôi đang ở trang tiếng Pháp và tôi muốn dịch tiếng Anh: làm thế nào?

Câu trả lời:


3

Để tìm câu trả lời cho câu hỏi này, bạn chỉ cần xem cách WordPress truy xuất các bản dịch. Cuối cùng, đó là load_textdomain()chức năng thực hiện điều này. Khi chúng ta xem nguồn của nó, chúng ta thấy rằng nó tạo ra một MOđối tượng và tải các bản dịch từ một .motệp vào nó. Sau đó, nó lưu trữ đối tượng đó trong một biến toàn cục được gọi $l10n, đó là một mảng được khóa bởi miền văn bản.

Để tải một miền địa phương khác cho một tên miền cụ thể, chúng ta chỉ cần gọi load_textdomain()với đường dẫn đến .motệp cho miền địa phương đó:

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

Để tìm hiểu logic nào WordPress sử dụng để xác định nơi tìm .motệp cho plugin (như cách lấy ngôn ngữ hiện tại), hãy xem nguồn gốc của load_plugin_textdomain().


Nhưng $ textdomain đầu tiên đến từ đâu?
Luca Reghellin

Thật vậy, nó đến từ đâu? Ví dụ: một trong những hành động / bộ lọc của tôi sẽ không nhận được ngôn ngữ chính xác, khi những người khác làm. Làm thế nào để tìm ra cái này? Ví dụ như hook "chờ_to_publish" ... nếu tôi muốn gửi email ở đó, chúng luôn ở một ngôn ngữ được xác định trong khi trong hook "trans_post_status" thì ngôn ngữ đó có ngôn ngữ chính xác. Có suy nghĩ gì không?
đào tạo

@trainoocation Tôi đã cập nhật ví dụ để hiển thị các giá trị mẫu, nhưng bạn có thể xem cách lấy ngôn ngữ hiện tại từ nguồn load_plugin_textdomain().
JD

Tôi đã cập nhật mã dưới đây, vì tôi phát hiện ra rằng đôi khi $l10n[$textdomain]không được giải quyết, ngay cả sau khi tải tên miền văn bản trong một after_setup_themehành động.
Luca Reghellin

0

Vì vậy, nhờ có JD, cuối cùng tôi đã kết thúc với mã này:

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

Bây giờ, tôi biết nó không nên, theo bài viết nổi tiếng này:

http://ottopress.com/2012/i quốc tế hóa-youre-probossible-doing-it-wrong/

Nhưng, tôi không biết, nó hoạt động ... Và phần thưởng: giả sử bạn muốn sử dụng nó trong quản trị viên, vì ngôn ngữ quản trị viên là x, nhưng bạn muốn nhận / lưu dữ liệu trong lang y và bạn đang sử dụng polylang . Vì vậy, tức là quản trị viên của bạn là người Anh, nhưng bạn đang dịch bài tiếng Tây Ban Nha và bạn cần lấy dữ liệu tiếng Tây Ban Nha từ địa phương chủ đề của mình:

global $polylang;
$p_locale = $polylang->curlang->locale; // will be es_ES
_e2('your string', 'yourtextdomain', $p_locale)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.