Bagaimana cara saya menerjemahkan string ke dalam Drupal.locale.strings?

9

Jadi saya mencoba menggunakan fungsi Drupal.t () di beberapa kode Javascript khusus saya (dalam tema saya).

Bagaimana cara mendapatkan string yang saya butuhkan terisi dalam objek Drupal.locale.strings? Saya melihat beberapa string di sana, tetapi tentu saja seluruh basis data tidak dapat dimuat. Apa cara terbaik untuk menambahkannya? Saya ingin menggunakan fungsi PHP t () sehingga string yang ditambahkan dapat diedit di antarmuka Translate.

JonMcL
sumber

Jawaban:

8

Drupal menangani mempopulasikan string yang diperlukan ke objek javascript. Sama seperti seluruh kumpulan string tidak dimuat pada setiap halaman, hanya string yang dibutuhkan yang ditambahkan ke JavaScript.

Saya percaya ini dilakukan dengan melintasi file skrip sebelum mereka benar-benar ditambahkan ke halaman.

Jadi, jika Anda menambahkan Drupal.t('Some string');kode JavaScript Anda, Anda harus bisa menerjemahkannya di antarmuka terjemahan.

googletorp
sumber
Kalau begitu itu tidak terjadi. (lintasan skrip untuk menemukan panggilan Drupal.t ()). Saya menambahkan skrip melalui file .info tema (skrip [] = skrip / script.js). Mungkin saya harus menambahkan melalui drupal_add_js ()?
JonMcL
Anda benar. Saya harus menelusuri untuk mendapatkan pemahaman sepenuhnya, tetapi itu memang terjadi secara otomatis. Dalam Drupal 7, fungsinya adalah locale_js_alter () (dalam locale.module). Ini menggunakan daftar lengkap file Javascript dan mem-parsing masing-masing di _locale_parse_js_file (). Hati-hati untuk memastikan bahwa file_get_contents () dapat memuat file JS Anda dengan path yang disediakan (yaitu jangan memulai path Anda dengan a / jika ada di folder tema Anda). Anda dapat menggunakan drupal_add_js atau pengaturan skrip [] dalam file .info tema Anda. Tentu saja, pastikan untuk menghapus cache dan menerjemahkan string! :)
JonMcL
6

Baru saja mengalami masalah yang sama hari ini dan merisetnya lebih sedikit. Chris di atas memiliki komentar yang baik, tetapi pada akhirnya tidak benar. Anda tidak perlu menggunakan Drupal. Perilaku agar bisa berfungsi.

Seperti dicatat oleh JonMcL sendiri dalam komentar terakhirnya, fungsi _locale_parse_js_file di locale.inc bertanggung jawab atas penguraian pola Drupal.t ("somestring") mulai dari baris 1493 (dalam Drupal 7.22):

preg_match_all('~
[^\w]Drupal\s*\.\s*t\s*                       # match "Drupal.t" with whitespace
\(\s*                                         # match "(" argument list start
(' . LOCALE_JS_STRING . ')\s*                 # capture string argument
(?:,\s*' . LOCALE_JS_OBJECT . '\s*            # optionally capture str args
  (?:,\s*' . LOCALE_JS_OBJECT_CONTEXT . '\s*) # optionally capture context
?)?                                           # close optional args
[,\)]                                         # match ")" or "," to finish
~sx', $file, $t_matches);

Ini hanya fungsi parsing "bodoh" yang tidak peduli dengan semantik dan hanya menemukan semua contoh Drupal.t ("sesuatu") dalam file apa pun yang diterimanya.

Apa yang bisa menjadi gotcha umum adalah bahwa Anda harus memiliki seluruh string dalam kode sumber Anda dalam bentuk Drupal.t ("translateme"), karena (jelas) tidak ada javascript yang dieksekusi ketika file dibuka melalui file_get_contents di php. Itu berarti Anda tidak pernah dapat melakukan Drupal.t (somevariable) dan berharap Drupal akan menangkap semua variabel javascript yang berisi string yang Anda lemparkan ke Drupal.t.

Jika Anda ingin menerjemahkan "wanita" untuk bagan dan memberikan konteks pada string, sintaksinya adalah:

Drupal.t("women", {}, {context: "charts"}

Juga, jika Anda telah menginstal drush, verifikasi file js Anda diuraikan dengan perintah;

drush vget javascript_parsed

Kemudian Anda dapat membersihkan cache dengan

drush cc all

... dan ulangi perintah vget di atas untuk memverifikasi daftar file yang sudah diuraikan kosong. Dengan cara ini file Anda akan mendapatkan reparasi jalankan berikutnya (verifikasi juga).

pengguna19814
sumber
1
Terima kasih untuk drush vget javascript_parsed! Cara yang lebih cepat untuk memaksa membangun kembali file skrip terjemahan adalah dengan hanya menghapus file CSS dan JS yang digunakan drush @sitealias cc css-js.
lmeurs
0

Pasangan yang saya temui saat menerapkan JS multibahasa dalam Drupal 7:

  1. Pertama, pastikan file JS Anda tidak termasuk inline . Pada Drupal 7.22, Drupal.locale.stringstampaknya tidak secara otomatis memperbarui sendiri jika Anda inlining file JavaScript di Drupal . Antarmuka terjemahan masih mengambil string, menambah kebingungan saya.

  2. Kedua, pastikan Anda menggunakan Drupal.behaviors untuk melampirkan JS Anda ke halaman. Penutupan JS reguler tidak akan memicu parsing Drupal.t()doa "ajaib" Drupal . Secara teknis ini adalah sesuatu yang seharusnya Anda lakukan;)

Dari sana itu benar-benar tidak menyakitkan. Cukup gunakan Drupal.t()sekitar teks yang ingin Anda terjemahkan, kosongkan cache Anda setiap kali Anda memperbarui file, dan penerjemah Anda akan melihat string baru di antarmuka di /admin/config/regional/translate/translate. Cukup bagus setelah Anda membuatnya berfungsi.

Chris Ruppel
sumber