Saya memiliki pengaturan paket desain seperti:
design/frontend/package_name/theme_name/locale/
di bawah yang saya miliki
de_DE
, en_GB
dll, di mana saya memiliki translate.csv
file yang sesuai dengan berbagai string:"Key", "Translation"
Saya mencoba menerapkan berbagai string dalam tema saya menggunakan echo $this->__('Text')
Namun, sepertinya tidak berfungsi (saya hanya melihat string di dalam yang ('Text')
ditampilkan). Saya pikir saya kehilangan beberapa pemahaman mendasar tentang kapan Magento menarik string dari CSV untuk diterjemahkan. Bisakah seseorang tolong jelaskan bagaimana cara agar file csv ini berfungsi?
Jawaban:
TL; DR
Jika Anda tidak tertarik dengan perincian cara kerja terjemahan, lewati konten ke bagian
Apa yang harus diperiksa jika terjemahan Anda tidak berfungsi di bawah ini, terutama
Solusi subbab untuk konflik Terjemahan Lingkup Modul .
Tinjauan Terjemahan Magento
Magento memprioritaskan sumber terjemahan (dari tertinggi ke terendah):
core_translate
tabel)translate.csv
Fileapp/locale/*/*.csv
File - fileBagaimana susunan terjemahan dibangun?
Modul Terjemahan
Pertama semua file dari
app/locale/*/*.csv
yang direferensikan dari modul modul aktifetc/config.xml
diuraikan. Berikut adalah langkah-langkah prosesnya:Asumsikan Magento menemukan bagian berikut
config.xml
:Dan dalam file itu, terjemahan berikut ditentukan untuk lokal yang dikonfigurasi untuk tampilan toko saat ini:
Dalam keadaan ini, Magento membuat catatan berikut dalam array terjemahan:
Nilai kedua adalah Terjemahan Lingkup Modul . Nama modul awalan diambil dari simpul XML konfigurasi yang berisi deklarasi file terjemahan.
Jika terjemahan yang sama ditentukan lagi oleh berkas modul kedua , misalnya dalam
Some_Module.csv
terjemahan adalah"AAA","CCC"
, itu akan tidak menimpa para"AAA"
pengaturan. Sebagai gantinya, itu hanya akan menambah catatan baru dengan nama modul kedua"Some_Module::AAA" => "CCC"
.Jika mode pengembang diaktifkan, bahkan akan diset dengan
"AAA"
catatan jika menemukan rekor kedua dengan tombol yang sama dalam terjemahan modul lain. Ini membuatnya lebih mudah untuk menemukan konflik terjemahan modul selama pengembangan.Terjemahan Tema
Kedua, terjemahan dimuat dari
translate.csv
file pertama dalam fallback tema untuk lokal saat ini cukup ganti catatan yang ada di array terjemahan.Jadi melanjutkan contoh sebelumnya, sebuah
translate.csv
catatan"AAA","DDD"
akan mengarah pada data terjemahan berikut:Tentu saja catatan dalam
translate.csv
dengan kunci terjemahan baru ditambahkan ke array.Terjemahan Database
Terjemahan dari
core_translate
tabel pada dasarnya digabungkan ke dalam array terjemahan seperti terjemahan tema.Kunci yang ada dari modul atau terjemahan tema ditimpa oleh catatan basis data, yang baru ditambahkan.
Pencarian Terjemahan
Ketika
__()
metode ini dipanggil, Magento pertama-tama mencari terjemahan dalam array yang cocok dengan modul saat ini.Modul saat ini ditentukan oleh nama
__()
kelas tempat kelas tersebut dipanggil. Misalnya, dalam blok, metode yang bertanggung jawab terlihat seperti ini:Metode dalam Helpers and Controllers bekerja secara bersamaan.
Contoh Skenario Pencarian
Sebagai contoh, katakanlah
$this->__('AAA')
dipanggil dalam file templat. Jika blok terkait memiliki tipeMage_Core_Block_Template
, Magento akan terlebih dahulu memeriksaMage_Core::AAA
catatan. Jika tidak menemukannya, maka akan kembali ke terjemahan untuk kunciAAA
.Dalam skenario contoh ini akan menghasilkan terjemahan
DDD
(daritranslate.csv
file).Dalam skenario yang berbeda, blok terkait bisa
Mage_Catalog_Block_Product_View
. Dalam hal ini Magento pertama-tama akan memeriksa catatan terjemahanMage_Catalog::AAA
, dan akan menemukan terjemahannyaAAA
.Jadi sebenarnya, terjemahan lingkup modul memiliki prioritas lebih tinggi daripada terjemahan generik . Terjemahan mana yang digunakan tergantung pada modul mana kelas dari memanggil
__()
metode.Apa yang harus diperiksa jika terjemahan Anda tidak berfungsi
Jika terjemahan Anda dari
translate.csv
file tidak digunakan, ikuti daftar ini:translate.csv
file benar-benar dalam fallback tema untuk toko saat ini? (Solusi: memperbaiki konfigurasi tema)core_translate
tabel? (Solusi: hapus data yang bertentangan daricore_translate
)Solusi untuk konflik Terjemahan Lingkup Modul
Jika Anda menemukan kasus akhir benar, cukup tambahkan terjemahan untuk yang kedua kalinya
translate.csv
dengan cakupan modul modul yang melakukan terjemahan.Dalam contoh, jika Anda selalu ingin
AAA
diterjemahkanDDD
melalui terjemahan tema, Anda dapat melakukannya ditranslate.csv
:Dalam praktiknya, saya hanya menambahkan cakupan modul ke terjemahan jika ada konflik, yaitu, jika terjemahan tidak berfungsi.
catatan tambahan
Terjemahan Inline
Fitur terjemahan inline Magento juga menambahkan terjemahan khusus ke
core_translate
tabel menggunakan awalan lingkup modul.Kompatibilitas terbalik
Prioritas terjemahan tema dulu lebih tinggi daripada terjemahan basis data hingga Magento versi 1.3 atau lebih.
Terjemahan XML
Magento kadang-kadang mengevaluasi
translate=""
argumen dalamconfig.xml
,system.xml
dan tata letak XML untuk menerjemahkan nilai-nilai simpul anak.Kelas helper dapat ditentukan dalam kasus-kasus tersebut menggunakan
module=""
argumen untuk menentukan modul untuk lingkup terjemahan.Jika tidak ada
module
argumen yang ditentukan dalam XML,core/data
helper digunakan untuk menerjemahkan nilai-nilai simpul anak.Informasi lebih lanjut
Saya akui saya membahas beberapa detail dari proses terjemahan Magento di posting ini, tetapi hanya karena saya tidak ingin terlalu banyak informasi.
core_translate
catatanSilakan tanyakan pertanyaan terpisah jika diperlukan informasi lebih lanjut.
sumber
__()
fungsi ini bekerja.Sumber Terjemahan
Terjemahan digabung dari berbagai sumber: Terjemahan modul dari masing-masing file XML, terjemahan tema dari
translate.csv
tema saat ini, dan terjemahan inline dari database.Terjemahan bisa sepenuhnya modul spesifik (hanya berlaku dalam modul), itu selalu terjadi untuk terjemahan inline dan opsional untuk terjemahan tema. Untuk mencapai ini, Anda harus mendefinisikannya dengan awalan modul di translate.csv:
Terjemahan dari modul (seperti
Mage_Catalog.csv
) hanya modul khusus, jika MODE PENGEMBANG aktif. Kalau tidak, terjemahan dari modul yang dimuat pertama digunakan secara global untuk semua modul yang tidak memiliki terjemahan sendiri untuk teks.Saya mengumpulkan diagram alur yang menunjukkan bagaimana setiap teks dari sumber yang berbeda digabungkan dalam array terjemahan:
data
adalah array terjemahanWadah Tepi Jahat
Jika string yang diterjemahkan sama dengan string yang tidak diterjemahkan, terjemahan tersebut diabaikan. Kedengarannya seperti optimasi yang bermanfaat pada pandangan pertama, tetapi dengan cara ini Anda tidak dapat dengan mudah menerjemahkan string yang tidak berubah dalam satu modul dan berubah dalam modul lain, karena terjemahan yang diubah akan menjadi satu-satunya dan menjadi global.
Pencarian Terjemahan
Untuk modul mana terjemahannya dicari, tergantung pada modul kelasnya, di mana metode tersebut
__()
ini dipanggil. Kemudian, pencarian dalam array terjemahan adalah sebagai berikut:data
adalah array terjemahanDefinisi Lingkup
Ada kemungkinan untuk mengubah modul untuk satu kelas, yang sangat berguna untuk blok dan pembantu. Praktik terbaik adalah untuk selalu menetapkan nama modul secara eksplisit ketika menulis ulang kelas inti. Bagaimana cara kerjanya, bervariasi antara Pembantu, Blok dan Contollers (pada Magento CE 1.9.1)
Contoh Untuk Blok:
Untuk blok, Anda juga dapat mengatur
module_name
parameter dalam tata letak XML:Contoh Untuk Pembantu:
Untuk pengontrol frontend, Anda dapat mengatur properti
_realModuleName
, untuk pengontrol admin,_usedModuleName
(yay untuk konsistensi)Metode Terjemahan Lainnya
Dalam file XML (config.xml, system.xml, layout) Anda dapat menentukan apakah node harus diterjemahkan dengan
translate
atribut. Anda juga harus menambahkanmodule
atribut untuk menentukan ruang lingkup, tetapi di sini nilainya harus menjadi penolong alias , bukan nama modul seperti di atas.Dalam JavaScript Anda dapat menggunakan
Translator
objek yang tersedia secara global:tetapi Anda harus membuat terjemahan yang ingin Anda gunakan dalam JavaScript tersedia untuk objek penerjemah. Ini dilakukan melalui
jstranslator.xml
file dietc
direktori modul.loading
dapat berupa string apa pun tetapi harus unik secara global. Thetranslate
danmodule
atribut yang digunakan sebagai dalam file XML lainnya. Nilai darimessage
dan terjemahannya ditambahkan ke objek JS Translator.Penyelesaian masalah
Bahkan jika Anda mengetahui semua aturan yang rumit, terkadang sulit untuk melihat mengapa beberapa terjemahan berfungsi sebagaimana mestinya (atau tidak berfungsi). Untuk mempermudah ini, saya mengembangkan modul "Petunjuk Terjemahan" yang menunjukkan dari mana terjemahan berasal:
Berdasarkan pada posting blog saya dan slide pada topik:
sumber
Sudahkah Anda membersihkan cache?
Apakah sistem Anda disetel ke lokal file yang Anda uji?
Bisakah Magento menemukan file yang dicari ketika memuat terjemahan tema (beberapa sementara
var_dump
; keluar; pernyataan harus membantu.Bisakah
_getTranslatedString
metode menemukan apa yang dicari dalam array data?sumber
translate.csv
terjemahan saya benar/app/design/frontend/package_name/default/template/catalog/product/view.phtml
tetapi tidak di/app/design/frontend/package_name/default/template/page/html/topmenu.phtml