Bagaimana menerapkan terjemahan dalam paket template desain CSV? Bagaimana cara echo $ this -> __ ('Text') berfungsi?

29

Saya memiliki pengaturan paket desain seperti:

design/frontend/package_name/theme_name/locale/

di bawah yang saya miliki

de_DE, en_GBdll, di mana saya memiliki translate.csvfile 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?

wafel
sumber
Magento versi apa yang Anda jalankan?
philwinkle
Saya menggunakan Magento v: 1.7.0.2
waffl
Apakah Anda memanggil ini di luar file templat magento normal? Mungkin Anda perlu memanggil kelas helper dan membuatnya menjadi seperti <? Php echo Mage :: helper ('core') -> __ ('Text'); ?> Juga coba aktifkan "Terjemahkan Inline" di Frontend di System> Configuration> Developer
SaveTheMage

Jawaban:

84

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):

  1. DB ( core_translatetabel)
  2. Tema translate.csvFile
  3. app/locale/*/*.csvFile - file

Bagaimana susunan terjemahan dibangun?

Modul Terjemahan

Pertama semua file dari app/locale/*/*.csvyang direferensikan dari modul modul aktif etc/config.xmldiuraikan. Berikut adalah langkah-langkah prosesnya:
Asumsikan Magento menemukan bagian berikut config.xml:

<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
    <translate>
        <modules>
            <Mage_Catalog>
                <files>
                    <default>Mage_Catalog.csv</default>
                </files>
            </Mage_Catalog>
        </modules>
    </translate>
</frontend>

Dan dalam file itu, terjemahan berikut ditentukan untuk lokal yang dikonfigurasi untuk tampilan toko saat ini:

"AAA","BBB"

Dalam keadaan ini, Magento membuat catatan berikut dalam array terjemahan:

array(
    "AAA" => "BBB",
    "Mage_Catalog::AAA" => "BBB"
)

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.csvterjemahan 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.csvfile pertama dalam fallback tema untuk lokal saat ini cukup ganti catatan yang ada di array terjemahan.
Jadi melanjutkan contoh sebelumnya, sebuah translate.csvcatatan "AAA","DDD"akan mengarah pada data terjemahan berikut:

array(
    "AAA" => "DDD", // This is overwritten by the translate.csv file
    "Mage_Catalog::AAA" => "BBB",
    "Some_Module::AAA" => "CCC"
)

Tentu saja catatan dalam translate.csv dengan kunci terjemahan baru ditambahkan ke array.

Terjemahan Database

Terjemahan dari core_translatetabel 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:

// Excerpt from Mage/Core/Block/Abstract.php
public function getModuleName()
{
    $module = $this->getData('module_name');
    if (is_null($module)) {
        $class = get_class($this);
        $module = substr($class, 0, strpos($class, '_Block'));
        $this->setData('module_name', $module);
    }
    return $module;
}

Metode dalam Helpers and Controllers bekerja secara bersamaan.

Contoh Skenario Pencarian

Sebagai contoh, katakanlah $this->__('AAA')dipanggil dalam file templat. Jika blok terkait memiliki tipe Mage_Core_Block_Template, Magento akan terlebih dahulu memeriksa Mage_Core::AAAcatatan. Jika tidak menemukannya, maka akan kembali ke terjemahan untuk kunci AAA.
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 terjemahan Mage_Catalog::AAA, dan akan menemukan terjemahannya AAA.

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.csvfile tidak digunakan, ikuti daftar ini:

  1. Apakah cache terjemahan dimatikan / di-refresh? (Solusi: kosongkan cache)
  2. Apakah translate.csvfile benar-benar dalam fallback tema untuk toko saat ini? (Solusi: memperbaiki konfigurasi tema)
  3. Apakah ada catatan yang bertentangan untuk terjemahan dalam core_translatetabel? (Solusi: hapus data yang bertentangan dari core_translate)
  4. Jika semua poin sebelumnya bukan penyebabnya, pasti ada terjemahan yang bertentangan dari modul yang berbeda. (Solusi: lihat di bawah)

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 AAAditerjemahkan DDDmelalui terjemahan tema, Anda dapat melakukannya di translate.csv:

"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"

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_translatetabel 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 dalam config.xml, system.xmldan 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 moduleargumen yang ditentukan dalam XML, core/datahelper 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.

  • Beberapa detail teknis saat susunan terjemahan dibuat
  • Kemungkinan untuk menggunakan file terjemahan tambahan untuk modul
  • Simpan cakupan tampilan untuk core_translatecatatan
  • Pro dan kontra menggunakan berbagai metode terjemahan

Silakan tanyakan pertanyaan terpisah jika diperlukan informasi lebih lanjut.

Vinai
sumber
1
Oke, saya benar-benar minta maaf semua orang, tetapi orang lain menyalakan cache tanpa memberi tahu saya ... Mungkin saat saya mulai mengerjakan terjemahan. Mendesah. Informasi ini sangat membantu untuk pemahaman saya tentang proses penerjemahan di Magento. Terima kasih banyak, ini pasti menjawab semua pertanyaan saya tentang bagaimana__() fungsi ini bekerja.
waffl
Gambaran yang cukup bagus tentang arsitektur terjemahan Magento juga dapat ditemukan di sini: gist.github.com/antonmakarenko/7538216
thdoan
@ Vinai, jawaban yang bagus. Itu benar-benar membantu saya untuk menyelesaikan masalah terjemahan yang saya posting pertanyaan di sini . Anehnya Mage_Tax bertentangan dengan terjemahan tema saya yang tampaknya bertentangan dengan bagaimana Magento dimaksudkan untuk memprioritaskan terjemahan
Holly
14

Sumber Terjemahan

Terjemahan digabung dari berbagai sumber: Terjemahan modul dari masing-masing file XML, terjemahan tema dari translate.csvtema 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:

"Mage_Catalog::Add to cart","In die Einkaufstüte legen"

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:

Penggabungan Terjemahan data adalah array terjemahan

Wadah 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:

Pencarian Terjemahan data adalah array terjemahan

Definisi 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:

class IntegerNet_AwesomeModule_Block_Catalog_Product extends Mage_Catalog_Block_Product
{
    public function getModuleName()
    {
        return 'Mage_Catalog';
    }
}

Untuk blok, Anda juga dapat mengatur module_nameparameter dalam tata letak XML:

<block type="integernet_awesomemodule/catalog_product" name="test" module_name="Mage_Catalog" />

Contoh Untuk Pembantu:

class IntegerNet_AwesomeModule_Helper_Catalog extends Mage_Catalog_Helper_Data
{
    protected $_moduleName = 'Mage_Catalog';
}

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 translateatribut. Anda juga harus menambahkan moduleatribut untuk menentukan ruang lingkup, tetapi di sini nilainya harus menjadi penolong alias , bukan nama modul seperti di atas.

<one_column module="page" translate="label">
    <label>1 column</label>
    <template>page/1column.phtml</template>
    <layout_handle>page_one_column</layout_handle>
    <is_default>1</is_default>
</one_column>

Dalam JavaScript Anda dapat menggunakan Translatorobjek yang tersedia secara global:

Translator.translate('Please wait, loading...');

tetapi Anda harus membuat terjemahan yang ingin Anda gunakan dalam JavaScript tersedia untuk objek penerjemah. Ini dilakukan melalui jstranslator.xmlfile di etcdirektori modul.

<?xml version="1.0"?>
<jstranslator>
    <loading translate="message" module="core">
        <message>Please wait, loading...</message>
    </loading>
</jstranslator>

loadingdapat berupa string apa pun tetapi harus unik secara global. The translatedan moduleatribut 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:

Dapatkan di sini: https://github.com/schmengler/TranslationHints

Tangkapan layar: Petunjuk Terjemahan


Berdasarkan pada posting blog saya dan slide pada topik:

Fabian Schmengler
sumber
2
Saya harap saya tidak melakukan spamming dengan menyebutkan bahwa modul Yireo EmailOverride gratis saya akan memungkinkan file modul CSV khusus untuk ditempatkan di tema juga. Bukan hanya translate.csv.
Jisse Reitsma
6

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.

#File: app/code/core/Mage/Core/Model/Translate.php
protected function _loadThemeTranslation($forceReload = false)
{
    $file = Mage::getDesign()->getLocaleFileName('translate.csv');
    $this->_addData($this->_getFileData($file), false, $forceReload);
    return $this;
}

Bisakah _getTranslatedStringmetode menemukan apa yang dicari dalam array data?

#File: app/code/core/Mage/Core/Model/Translate.php
protected function _getTranslatedString($text, $code)
{
    $translated = '';
    if (array_key_exists($code, $this->getData())) {
        $translated = $this->_data[$code];
    }
    elseif (array_key_exists($text, $this->getData())) {
        $translated = $this->_data[$text];
    }
    else {
        $translated = $text;
    }
    return $translated;
}
Alan Storm
sumber
Tidak ada cache yang aktif, saya tidak yakin apakah sistem saya diatur ke lokal, tetapi terjemahan bekerja dalam file templat tertentu sesuai (dengan mengubah toko). Sebagai contoh, sebuah string dalam translate.csvterjemahan saya benar /app/design/frontend/package_name/default/template/catalog/product/view.phtmltetapi tidak di/app/design/frontend/package_name/default/template/page/html/topmenu.phtml
waffl
Anda benar, seseorang menyalakan cache tanpa memberi tahu saya. Ups, permintaan maaf saya dan terima kasih atas informasinya!
waffl
3
@waffl Tidak perlu meminta maaf - Saya pikir setiap pengembang Magento melakukan itu setidaknya seminggu sekali.
Alan Storm