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 location
bidang 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
/ title
atribut sebelumnya / berikutnya . Diterjemahkan. Tapi modul saya tidak tahu itu. Dan seharusnya tidak perlu.
wget
atau apa pun. Meretas, tetapi Anda memang mengatakan bahwa itu diizinkan (:Jawaban:
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
t()
, kemudian daftarkan instance-instance itu dalam database, kemudian terjemahkan semua instance terdaftar itut()
dalam sekali jalan. Saya tidak berpikir adalah pilihan yang kami miliki di meja kami.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
t()
). Kami membutuhkan model data proaktif - model di mana aplikasi berhati-hati dalam mencarit()
contoh sebelum mereka benar-benar dieksekusi oleh pelanggan.t()
sendiri tidak memotongnya - karena - kita tidak tahu kita menerjemahkan 'foo', tetapi bahasa target yang kita terjemahkan tergantung pada URL tempatt()
terjadinya. Bahkan jika kami dapat mengubah kode bahasa target ket()
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
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?
Ketika pelanggan kemudian mengambil
/pl/product/200
, Anda melakukan perjalanan ke db, mencari produk 200, dan ambil terjemahan yang sudah adapl
. 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
product
entitas, pergi keURL alias
lapangan, 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 dataDi 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
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 ~
sumber
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:
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.
String tersedia di klien Pelokalan untuk bahasa pertama yang Anda kunjungi untuk simpul yang sama
Berikut ini sebuah contoh:
sumber
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
dalam preprocess.
dan file .tpl.php akan menjadi
sumber
title
teks 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 perlualt
dantitle
, 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.AFAIK dengan ekstraktor templat Terjemahan Anda dapat mengekstraksi string dalam semua panggilan Anda ke
t()
fungsi.Baca ini Bagaimana Menerjemahkan modul?
sumber