Bagaimana Gutenberg menangani terjemahan dalam Bereaksi?

11

Saya sedang membaca kode sumber Gutenberg, untuk contoh ini dan tidak dapat mengerti bagaimana mereka menangani terjemahan ...

Mereka mengimpor ini import { __ } from '@wordpress/i18n'dan kemudian dalam kode sumber mereka menggunakan ini speak( __( 'Block settings closed' ) );.

Adakah yang bisa memberitahu saya bagaimana mereka mengelola terjemahan ini di dalam ReactJS untuk dikumpulkan dalam file .po yang normal?

Saya kira mereka memiliki beberapa proses membangun yang melewati semua file, termasuk JS dan mengumpulkan mereka, tetapi tidak yakin.

Bologer
sumber

Jawaban:

6

Dalam repositori Gitberg Gutenberg, Anda dapat melihat sumber paket i18n yang digunakan. Di sumber ini, Anda akan melihat Jed diimpor (baris 4 dari gutenberg / packages / i18n / src / index.js) dan kemudian digunakan untuk sebagian besar tugas terjemahan di bawah tenda.

Jed memperkenalkan "Gaya Gettext i18n untuk Aplikasi JavaScript Modern" (atau setidaknya seperti yang tertulis di situs mereka).

Pertanyaan Anda adalah untuk file .po. Jed menjelaskan di situs mereka:

Ada beberapa konverter .po to .json yang tersedia di luar sana. File .po Gettext adalah output standar dari sebagian besar perusahaan terjemahan yang layak, karena ini adalah standar lama.

Saat ini saya menggunakan: po2json

Namun, saya ingin menambahkan fungsionalitas ini ke modul Jed yang terpisah di versi yang akan datang.

Namun, ini sepertinya tidak berlaku di sini.

Penggalian lebih lanjut ternyata, setLocaleData( data: Object, domain: string )digunakan untuk lulus terjemahan, dengan cara seperti ini :

$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 )menjadi pembungkus lebih atau kurang untuk get_translations_for_domain( $domain ))

Jadi sepertinya WordPress mengambil data terjemahan melalui PHP dan kemudian meneruskannya ke Jed. Jed sendiri tampaknya tidak memuat file terjemahan apa pun.

Readme paket juga menjelaskan cara membuat file .pot yang berisi string lokal dengan benar.

Paket ini juga mencakup pot-to-phpskrip yang digunakan untuk menghasilkan file php yang berisi pesan yang tercantum dalam file .pot. Ini berguna untuk mengelabui penemuan string terjemahan WordPress.org karena saat ini, WordPress.org tidak mampu mengurai string langsung dari file JavaScript.

npx pot-to-php languages/myplugin.pot languages/myplugin-translations.php text-domain
kero
sumber
Apakah itu berarti bahwa Gutenberg menyimpan terjemahan di beberapa windowproperti sebagai JSON yang dimuat melalui wp_add_inline_scriptPHP dan kemudian mengambilnya di sisi Bereaksi dan meneruskannya ke Jed? ... dan Jed melakukan sihir lebih lanjut?
Bologer
@Bologer Belum tentu windowproperti, tapi ya. PHP mengambil nilai dan meneruskannya ke JS melaluiwp_add_inline_script
kero
2
Anda harus memperluas jawaban Anda dengan informasi yang Anda tambahkan di komentar ke tambang. Komentar itu tampaknya lebih sesuai dengan apa yang
dicari
2

Setidaknya untuk saat ini, selama tidak ada proses otomatis yang lebih baik, saya sarankan untuk tidak menghasilkan file .pot dari JS sama sekali.

Seperti @kero menjelaskan dalam jawabannya saat ini terjemahan GB disahkan sebagai semacam gumpalan array dari file .mo ke dalam JS. Alur kerja ini akan memecah semua plugin pengrusakan lokalisasi yang mengandalkan penyaringan hasil __dan rekan. Alur kerja yang lebih baik adalah memiliki generasi eksplisit dari array gumpalan dari string yang diterjemahkan dengan __panggilan, mirip dengan bagaimana Anda akan melakukan terjemahan JS dalam konteks non GB. Ini juga akan memecahkan masalah menghasilkan file .pot.

Yang hilang di sini adalah beberapa proses otomatis yang akan menjalankan lebih dari file JS dan menghasilkan kode PHP yang relevan, yang pada gilirannya dapat dianalisis dengan alat-alat seperti poedit.

Mark Kaplun
sumber
1
titik awal yang bagus, hanya sebagian yang tersisa adalah untuk secara otomatis menghasilkan panggilan ke wp_add_inline_script, karena saat ini mungkin hanya menghasilkan php hanya untuk kepentingan pembuatan pot, tetapi tidak benar-benar menggunakannya (tebakan saya)
Mark Kaplun