Bagaimana membuat string dari template diterjemahkan pada semua halaman yang muncul?

14

Saya memiliki beberapa panggilan ke t()file * .tpl.php. Sebagai contoh, katakanlah saya sedang berbicara tentang produk dan file product.tpl.php.

String dalam template tidak dikenali sampai pertama kali mereka benar-benar digunakan. Ada utas di Drupal.org tentang itu dan saya menemukannya akurat. Sayangnya, jika saya pergi ke, katakanlah, http://example.com/pl/product/200 , maka string tersebut akan disimpan dalam {locales_source}tabel dengan locationbidang yang disetel ke /pl/product/200.

Saya membutuhkan pengguna saya untuk dapat menerjemahkan menggunakan alat terjemahan on-site modul klien pelokalan , sehingga mereka benar-benar dapat melihat apa yang mereka terjemahkan, memilikinya dalam konteks yang tepat. Dengan lokasi sumber diatur ke /pl/product/200, produk dengan ID 200 adalah satu-satunya di mana string ditampilkan untuk diterjemahkan. Dan jauh lebih buruk, jika saya dapat memaksa pengguna untuk menerjemahkan produk tertentu, saya membutuhkan mereka juga untuk dapat menerjemahkan ke bahasa Rusia, dan tidak ada produk dengan lokasi yang diatur /ru/product/PID.

Apakah ada cara untuk memformat ulang string lokasi dalam basis data, untuk membuat semua string terlihat di semua produk, semua bahasa di alat l10n_client?

Saya mencoba mengaturnya ke:

  • ; sites/default/themes/mytheme/product.tpl.php,
  • sites/default/themes/mytheme/product.tpl.php,
  • sites/default/modules/mymodule/mymodule.module (modul yang menghasilkan data bertema)

Tetapi itu hanya membuat mereka tidak terlihat untuk alat terjemahan.

Saya cukup yakin itu bukan bug di klien Pelokalan , ini menunjukkan string di mana ia memberi tahu string ini terjadi. Dan sepertinya itu "hanya cara kerjanya" untuk sistem terjemahan Drupal 7, juga - telah dibahas dan dilaporkan, dan tidak ada yang berubah. Jadi ini bukan laporan bug, saya hanya bertanya bagaimana bekerja dengan apa yang harus kita kerjakan.


Saya berbicara tentang teks yang tidak ada hubungannya dengan modul data yang beroperasi. Saya tidak ingin menerjemahkan produk, hanya string templat yang tidak ada hubungannya dengan produk itu sendiri, seperti Sebelumnya - Selanjutnya pada templat galeri gambar produk.

Sebagai contoh, modul mengembalikan 15 thumbnail, dan merupakan tugas tema untuk menampilkan 5 waktu. Dan kebutuhan tautan alt/ titleatribut sebelumnya / berikutnya . Diterjemahkan. Tapi modul saya tidak tahu itu. Dan seharusnya tidak perlu.

Mołot
sumber
Saya tidak yakin apakah saya sepenuhnya mengerti apa yang Anda inginkan, tetapi apakah merayapi situs dalam semua bahasa sudah cukup? Anda bisa menggunakan mis. xmlsitemap untuk menghasilkan tautan dalam berbagai bahasa dan kemudian menggunakan wgetatau apa pun. Meretas, tetapi Anda memang mengatakan bahwa itu diizinkan (:
Andy
@Andy Lokalisasi Klien memungkinkan pengguna untuk membuka bilah di bagian bawah halaman dan menerjemahkan teks yang muncul di halaman itu secara langsung, ketika mereka melihatnya. Saya bisa mengekspor semua teks dengan benar, tapi bukan itu intinya.
Mołot
1
Saya ingat dari drupal_set_message () dan dpm (), bahwa pesan-pesan ini akan diantrikan untuk permintaan berikutnya, jika dipanggil misalnya dari page.tpl.php. Ini karena templat biasanya diproses agak terlambat dalam permintaan, setelah pesan diproses. Hal serupa mungkin terjadi dengan t () dan klien pelokalan.
donquixote
Pertanyaan yang bagus Masalah bagus
amatir barista
Hanya saran ... jika Anda ingin pengguna Anda dapat menerjemahkan string tpl t () kapan saja dalam bahasa apa pun, Anda dapat mengekstraksi string ini dengan extractor templat Terjemahan ( drupal.org/project/potx ) dan memberi mereka asli .po, yang dapat mereka terjemahkan dengan alat seperti Poedit? ( poedit.net ). Saat Anda menyajikan string ini sebagai beberapa statis, pekerjaan akan dilakukan pada satu waktu oleh masing-masing penerjemah ...
Kojo

Jawaban:

5

Persyaratan Anda:
Agar situs saya berfungsi dalam berbagai bahasa
sebagai pengguna yang diautentikasi,
saya harus dapat menerjemahkan sekaligus semua dan semua panggilan terjemahan yang ditemukan dalam basis kode situs saya yang dilakukan dengan fungsi t ().

Apakah deskripsi persyaratan itu mendekati apa yang Anda minta?


Perayap

Seperti kata seseorang - perayap secara teoritis dapat menelusuri seluruh situs untuk memaksa pendaftaran semua panggilan t (). Tapi 1) crawler tidak tahu halaman mana yang harus dijelajahi; 2) kami tidak mencari untuk mempertahankan daftar halaman yang akan dirayapi, oleh karena itu; 3) kami tidak ingin menggunakan crawler, titik. Eww. Baru saja. Baik?


Masalah

  1. Kami tidak memiliki daftar semua string terjemahan.
  2. Drupal / PHP adalah bahasa yang dinamis tidak seperti C yang dikompilasi. Jadi kita tidak bisa pergi dan mengatakan misalnya: kompilasi seluruh basis kode ini, lalu temukan semua instance dari fungsi ini t(), kemudian daftarkan instance-instance itu dalam database, kemudian terjemahkan semua instance terdaftar itu t()dalam sekali jalan. Saya tidak berpikir adalah pilihan yang kami miliki di meja kami.
  3. Alat analisis kode statis akan tidak berdaya karena alasan yang sama crawler tidak berdaya. Saya menemukan ini t()di file ini. Bagus! Di mana URL itu digunakan? Apa konteksnya?

Menyerang masalah dengan alat saat ini (Drupal, dan beberapa modul contrib), dan dengan kendala saat ini (bergantung pada panggilan tema waktu nyata -> file templat -> t()panggilan), tampak seperti lorong keluar di sini. Kita mungkin perlu berpikir sedikit di luar kebiasaan.


Apa yang kita butuhkan

  1. Kami membutuhkan sumber data, model, yang memberi tahu saya string terjemahan mana yang kami miliki saat ini, dan apa konteksnya -
  2. Model data proaktif. Model data saat ini adalah reaktif (model akan diperbarui setiap kali terjadi panggilan t()). Kami membutuhkan model data proaktif - model di mana aplikasi berhati-hati dalam mencari t()contoh sebelum mereka benar-benar dieksekusi oleh pelanggan.
  3. Kami membutuhkan konteks. t()sendiri tidak memotongnya - karena - kita tidak tahu kita menerjemahkan 'foo', tetapi bahasa target yang kita terjemahkan tergantung pada URL tempat t()terjadinya. Bahkan jika kami dapat mengubah kode bahasa target ke t()panggilan, katakanlah, menggunakan panggilan wrapper, itu tidak akan berfungsi untuk tujuan Anda.

Saya telah mengidentifikasi beberapa alat yang - jika kita memilikinya - akan membantu masalah kita. Dengan alat-alat ini kita bisa masuk ke dalam model data dan berkata: beri saya semua string t()yang belum diisi. Sekarang masukkan terjemahan ini. Terima kasih.

Dan pada saat pelanggan datang, terjemahan ada di sana.

Bagaimana kita ... membangun alat-alat ini?


Kendala

  1. Bahasa target tidak boleh ada di templat, yang ditentukan oleh URL. Dengan asumsi string harus mendukung bahasa apa pun.
  2. String yang diterjemahkan tidak boleh ada di templat. Terjemahan akan berada di database.

Sekarang saya telah memikirkan masalah lebih lanjut, dan mengidentifikasi beberapa tantangan dan kendala, saya dapat berpikir tentang melihat solusi apa pun yang tersedia di luar sana, atau membuat solusi kustom apa pun.

Brainstorm solusi

Saya membutuhkan sesuatu yang mengikat "segalanya" bersama. Bagaimana dengan ... entitas?

  • Suatu entitas dapat menampung produk yang perlu diterjemahkan.
  • Entitas dapat memberikan hubungan - perekat - antara produk yang perlu diterjemahkan, dan konteksnya.
  • Entitas dapat menentukan katakanlah, di bidang, lokasi URL default produk.
  • Token dapat digunakan untuk menentukan lokasi alternatif (bahasa?) Tempat produk akan muncul.
  • Entitas memberi kita model data proaktif yang kita butuhkan, dan konteksnya. Yang pada gilirannya memungkinkan kita untuk melakukan hal seperti: masuk ke database, ambil semua entitas produk, dan jika tidak memiliki string terjemahan untuk bidang X, Y, dan Z, buat string terjemahan itu.

Ketika pelanggan kemudian mengambil /pl/product/200, Anda melakukan perjalanan ke db, mencari produk 200, dan ambil terjemahan yang sudah ada pl. Anda memiliki bidang judul dan teks untuk produk itu juga? Terjemahan juga harus ada di sana.

Perhatikan bahwa saya menjadi sangat kabur dan generik di sini dalam hal modul terjemahan apa yang Anda gunakan. Anda bisa saja menggunakan modul terjemahan Anda sendiri - kemungkinan besar inilah masalahnya. Semua model terjemahan yang saya lihat di Drupal sejauh ini (pada D7, belum melihat D8) adalah reaktif, bukan proaktif.

Pendeknya

Secara teori, alat untuk membangun apa yang Anda butuhkan ada di sana, entitas menjadi komponen kunci yang akan menyatukan semuanya: - data (string terjemahan), - bahasa target. Tidak harus berada di Entitas itu sendiri, lebih disukai kosakata taksonomi, katakanlah untuk bahasa produk. atau mungkin taksonomi generik untuk entitas lain juga. - Konteks. URL tempat entitas muncul. URL akan berisi token, dan token pada gilirannya akan merujuk taksonomi bahasa target.

Dengan tiga bahan yang bisa Anda katakan: Raih semua productentitas, pergi ke URL aliaslapangan, dapatkan token taksonomi, siklus melalui semua kombinasi istilah yang mungkin, sajikan semua kombinasi kepada pengguna saat ini menggunakan bentuk jelek yang sangat besar - atau, AJAX - dan formulir multi-langkah (sesuatu seperti itu), dan ketika pengguna yang saat ini masuk menerjemahkan berbagai bahasa untuk produk 200, simpan yang ada di suatu tempat ke dalam basis data

Di suatu tempat di dalam basis data bisa menjadi bidang API Bidang dalam entitas, bidang pengaturan milik masing-masing entitas (tidak persis API Bidang, tetapi masih dapat menyimpan data), atau tabel terpisah yang Anda gunakan untuk ini. Saya pikir menyimpan data ke Entitas akan membuat kode dan data lebih rapi dan lebih mudah.


Membangunnya: Kemungkinan solusi

  • D8MI (Drupal 8 Multilingual Initiative)
  • Kode khusus: terjemahan "indeks" dibuat tersedia dalam templat oleh t () dengan secara terprogram meminta dan merender bundel yang tersedia dan implementasi kait tema yang terkait.

Kodesemu

Entitas entitas depan (tipe x),
Temukan semua bahasa (taksonomi atau bahasa inti yang terkait dengan produk),
Render entitas,
- untuk mendeteksi t () string terjemahan
- render panggilan tema (), yang menangani lapisan presentasi multibahasa dari produk, bukan model data produk itu sendiri.

Hasil:
- Panggilan pertama untuk merender templat entitas di setiap bahasa mengembalikan implementasi bahasa default untuk setiap panggilan.
- Parameter t () pada template sekarang di-cache dalam Drupal dan siap untuk terjemahan (untuk setiap instance bahasa, tidak setiap instance produk).
- Pengguna dengan peran "penerjemah" sekarang dapat pergi ke antarmuka terjemahan dan menerjemahkan semua parameter t () yang tersedia, untuk setiap bahasa.
- Pemilik situs tidak perlu menunggu pelanggan untuk mengunjungi setiap halaman produk, atau mengunjungi setiap halaman produk secara manual, karena ini dilakukan secara terprogram untuknya.

Pertanyaan terbuka:
- Apa konteksnya? Jika saya melakukan panggilan programatik ke tema () untuk setiap bundel entitas "produk", apakah ia merekam lokasi dari mana panggilan itu dibuat? Apakah ini merekam URL node? Bisakah "konteks" diubah? Di mana konteksnya dicatat? Apa yang terjadi ketika Anda memiliki template "dinamis" - yaitu, ketika Anda memiliki lebih dari satu template per produk dan bagaimana Anda mendeteksi variasi-variasi itu?

Seperti biasa, berteori dan kodesemu hanya baik untuk brainstorming. Tetapi dalam pengembangan kita tidak akan tahu apa yang sebenarnya kita hadapi sampai kita mulai membuat prototipe. Jadi, setelah membuat beberapa kendala, solusi yang mungkin, dan kemungkinan masalah atau pertanyaan - sekarang saya dapat melanjutkan untuk menerapkan bukti konsep atau prototipe kerja. Beberapa pertanyaan terbuka di atas hanya dapat dijawab dengan cara ini, dan prototipe kami yang paling awal (terlepas dari keberhasilan atau kegagalan), kami dapat mulai menjawab beberapa pertanyaan itu - atau mengubah pendekatan secara bersamaan. Tetap disini ~

barista amatir
sumber
1
Bahkan tanpa membaca seluruh tulisan, jawaban seperti itu patut mendapat
dukungan
Intinya adalah - alat yang mengklaim sedang melakukan apa yang saya butuhkan untuk Drupal 7 sudah ada. Itu hanya masalah dengan Drupal menyimpan string ini dengan metadata buruk. Tapi saya bisa mengubah kata metadata dalam db setelah string dikumpulkan, tidak ada masalah. Saya hanya perlu tahu apa yang mengatur mereka, sehingga alat itu bisa melihatnya. Atau setidaknya saya percaya itu yang saya butuhkan. Dan yang paling penting: Saya tidak ingin menerjemahkan produk, hanya string templat yang tidak ada hubungannya dengan produk itu sendiri, seperti Sebelumnya - Selanjutnya pada template galeri gambar produk.
Mołot
2

Oke, habiskan lebih banyak waktu dengan modul terjemahan klien Pelokalan & entitas untuk mereproduksi skenario yang sama. Karena jawaban ini sangat berbeda dari jawaban saya sebelumnya, menambahkan sebagai komentar terpisah:

  1. Terjemahan yang ditambahkan untuk bahasa dalam satu / simpul pertama tersedia untuk semua node.

    Berikut ini sebuah contoh:

    • Jika saya menambahkan produk baru dengan tipe yang sama dengan nid 200 dan mengunjungi terjemahan pl simpul baru (katakanlah pl / produk / 204), saya akan melihat string terjemahan yang sama di pl / produk / 200.

    • Satu-satunya perbedaan adalah itu tidak muncul di klien Lokalisasi. Kami dapat meminta fitur ini dalam antrian masalah modul, namun akan menimbulkan lebih banyak kebingungan karena terjemahan tidak spesifik untuk halaman saat ini dan akan mempengaruhi semua halaman (yaitu, baik pl / produk / 200 & pl / produk / 204).

    • Jika dua node dibuat oleh dua orang yang berbeda, dan yang kedua ingin mengubah terjemahan, maka mereka harus menggunakan terjemahan antarmuka.

  2. String tersedia di klien Pelokalan untuk bahasa pertama yang Anda kunjungi untuk simpul yang sama

    Berikut ini sebuah contoh:

    • Jika saya menambahkan produk baru nid 199 dan membuat terjemahan untuk bahasa 'pl' (nid 200) dan terjemahan untuk bahasa 'rs' (nid 201), Anda dapat melihat string hanya di halaman 'pl', bukan di halaman 'rs'. Sekali lagi, ini terlihat seperti pembatasan dalam modul klien Pelokalan.
vijaycs85
sumber
1

Pendekatan Anda untuk menambahkan string terjemahan pada tingkat file templat atau modul mungkin berfungsi untuk UI terjemahan antarmuka, tetapi tidak untuk klien Pelokalan.

Jelas ketika Anda memiliki versi Rusia dari produk 200, itu akan menjadi simpul baru, misalnya misalnya / ru / produk / 201 di mana Anda dapat menerjemahkan menggunakan klien Pelokalan.

Pikirkan saja: Cari string yang dapat diterjemahkan untuk semua bahasa di antarmuka terjemahan UI dan minta pelanggan untuk menerjemahkan level produk ketika itu benar-benar diperlukan. Berikut ini sebuah contoh:

"Ini adalah produk dari bilah kategori"

dan jika kami yakin bahwa selain 'foo' & 'bar' dapat menjadi hal yang umum, kami dapat menambahkan

$vars['product_title'] = t('This is product @product of category @category')

dalam preprocess.

dan file .tpl.php akan menjadi

<?php t($product_title, array('@product' => t('foo'),  '@category' => t('bar')); ?>
vijaycs85
sumber
Ini lebih lanjut tentang titleteks untuk panah di rotator gambar. Modul saya tidak peduli bagaimana tema akan menampilkan 15 gambar. Dan tema menampilkan 5 setiap kali, dengan panah "prev" dan "next" yang perlu altdan title, dan perlu diterjemahkan. Mengubah modul setiap kali front-end saya akan berubah adalah mungkin, tetapi tentu saja tidak diperlukan. String ini tidak ada hubungannya dengan modul itu sendiri. Terakhir tetapi tidak kalah pentingnya, saya mungkin hanya string tidak sadar dalam tema berubah. Atau tidak tersedia untuk memigrasikannya ke dalam modul.
Mołot
IMHO, kasus ini harus ditangani di UI terjemahan antarmuka alih-alih klien Pelokalan.
vijaycs85
Klien pelokalan bertujuan untuk memungkinkan "memperbaiki terjemahan di situs Anda saat Anda melihat masalahnya." - mengapa itu tidak berlaku untuk file templat? String dalam tpl bahkan lebih sensitif terhadap konteks mereka muncul, jika ada.
Mołot
1

AFAIK dengan ekstraktor templat Terjemahan Anda dapat mengekstraksi string dalam semua panggilan Anda ke t()fungsi.

Penerjemah templat Terjemahan menyediakan antarmuka ekstraksi templat terjemahan terjemahan Gettext berbasis web untuk Drupal serta API yang dapat digunakan kembali untuk mencari string yang dapat diterjemahkan dan kesalahan translatabilitas. Alat ini digunakan di bawah tenda di http://localize.drupal.org/ juga untuk berfungsi sebagai mesin pengurai untuk rilis proyek Drupal.org.

Baca ini Bagaimana Menerjemahkan modul?

Adrian Cid Almaguer
sumber