Gutenberg xử lý các bản dịch trong React như thế nào?


11

Tôi đã xem qua mã nguồn của Gutenberg, ví dụ như điều này và không thể hiểu cách họ xử lý các bản dịch ...

Họ nhập cái này import { __ } from '@wordpress/i18n'và sau đó trong mã nguồn họ sử dụng cái này speak( __( 'Block settings closed' ) );.

Ai đó có thể cho tôi biết cách họ quản lý các bản dịch này trong ReactJS để được thu thập trong tệp .po bình thường không?

Tôi cho rằng họ có một số quy trình xây dựng đi qua tất cả các tệp, bao gồm cả JS và thu thập chúng, nhưng không chắc chắn.

Câu trả lời:


6

Trong kho GitHub của Gutenberg, bạn có thể thấy nguồn của gói i18n được sử dụng. Trong nguồn này, bạn sẽ thấy Jed được nhập (dòng 4 của gutenberg / gói / i18n / src / index.js) và sau đó được sử dụng cho hầu hết các tác vụ dịch thuật trong phần mềm.

Jed giới thiệu "Gettext Style i18n cho các ứng dụng JavaScript hiện đại" (hoặc ít nhất là như vậy trên trang web của họ).

Câu hỏi của bạn là dành cho các tập tin .po. Jed giải thích trên trang web của họ:

Có khá nhiều bộ chuyển đổi .po sang .json có sẵn. Các tệp Gettext .po là đầu ra tiêu chuẩn từ hầu hết các công ty dịch thuật tốt, vì đây là một tiêu chuẩn cũ.

Tôi hiện đang sử dụng: po2json

Tuy nhiên, tôi muốn thêm chức năng này vào một mô-đun Jed riêng trong phiên bản tương lai.

Tuy nhiên, điều này dường như không áp dụng ở đây.

Đào sâu hơn hóa ra, setLocaleData( data: Object, domain: string )được sử dụng để vượt qua các bản dịch, theo cách như vậy :

$locale_data = gutenberg_get_jed_locale_data( 'gutenberg' );
wp_add_inline_script(
    'wp-i18n',
    'wp.i18n.setLocaleData( ' . json_encode( $locale_data ) . ' );'
);

( gutenberg_get_jed_locale_data( $domain )ít nhiều là một trình bao bọc cho get_translations_for_domain( $domain ))

Vì vậy, có vẻ như WordPress lấy dữ liệu dịch qua PHP và sau đó chuyển nó cho Jed. Bản thân Jed dường như không tải bất kỳ tập tin dịch nào.

Readme của gói cũng giải thích cách tạo đúng tệp .pot chứa các chuỗi được bản địa hóa.

Gói này cũng bao gồm một pot-to-phptập lệnh được sử dụng để tạo tệp php chứa các thông báo được liệt kê trong tệp .pot. Điều này rất hữu ích để lừa phát hiện chuỗi dịch WordPress.org vì hiện tại, WordPress.org không có khả năng phân tích chuỗi trực tiếp từ các tệp JavaScript.

npx pot-to-php languages/myplugin.pot languages/myplugin-translations.php text-domain

Điều đó có nghĩa là Gutenberg lưu trữ các bản dịch trong một số thuộc windowtính dưới dạng JSON được tải wp_add_inline_scriptbởi PHP và sau đó lấy nó về phía React và chuyển nó cho Jed? ... và Jed còn làm phép thuật nữa?
Bologer

@Bologer Không nhất thiết là một windowtài sản, nhưng có. PHP truy xuất các giá trị và chuyển chúng đến JS thông quawp_add_inline_script
kero

2
bạn nên mở rộng bạn trả lời với thông tin bạn đã thêm trong bình luận để khai thác. Nhận xét đó thực sự có vẻ phù hợp hơn với những gì OP tìm kiếm
Mark Kaplun

2

Ít nhất là bây giờ, miễn là không có quy trình tự động tốt hơn, tôi sẽ đề nghị không tạo các tệp .pot từ JS.

Như @kero giải thích trong câu trả lời của anh ấy ngay bây giờ, bản dịch GB đang được chuyển qua dưới dạng một mảng blob từ tệp .mo sang JS. Quy trình công việc này sẽ phá vỡ tất cả các plugin giả mạo nội địa hóa dựa trên việc lọc kết quả __và các cộng sự. Một quy trình công việc tốt hơn sẽ có một thế hệ rõ ràng của mảng blob từ các chuỗi được dịch bằng __các cuộc gọi, tương tự như cách bạn sẽ thực hiện dịch thuật JS trong ngữ cảnh không GB. Điều này cũng sẽ giải quyết vấn đề tạo tệp .pot.

Điều còn thiếu ở đây là một số quy trình tự động sẽ chạy trên các tệp JS và tạo ra mã PHP có liên quan, đến lượt nó có thể được phân tích bằng các công cụ như poedit.



1
Điểm khởi đầu tốt đẹp, chỉ còn lại một phần là tự động tạo cuộc gọi đến wp_add_inline_script, vì hiện tại nó có thể chỉ tạo php chỉ vì lợi ích của việc tạo pot, nhưng thực tế không sử dụng nó (tôi đoán)
Mark Kaplun
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.