Buat template inti magento menggunakan file terjemahan modul saya

15

Dalam ekstensi yang saya kerjakan, saya memiliki tata letak XML yang ditambahkan melalui config.xml modul. Layout ini memiliki beberapa modifikasi pada frontend. Namun beberapa blok ini termasuk dalam modul inti Magento. Semua templat ditampilkan dengan benar seperti yang diharapkan.

Template yang saya bungkus dengan modul itu sendiri menggunakan file terjemahan modul saya sendiri. Templat yang dipaket dengan inti Magento tidak diterjemahkan. Jika saya menambahkan file terjemahan untuk masing-masing modul inti, maka file terjemahan itu digunakan & template menunjukkan terjemahan.

Apakah ada cara untuk membuat Magento menggunakan file terjemahan modul saya jika tidak dapat menemukan file terjemahan untuk modul inti Magento? Apakah ada hal lain yang bisa saya lakukan di sini?

Mridul Aggarwal
sumber
Anda bisa menambahkan terjemahan Anda ke file terjemahan tema saat ini atau menggunakan antarmuka terjemahan inline di backend.
Dmytro Zavalkin
Saya ingin mengemas terjemahan dengan ekstensi itu sendiri, di atas akan membutuhkan instruksi tambahan bagi siapa saja yang menginstalnya. Apakah ada opsi di mana saya dapat melakukannya dari kode?
Mridul Aggarwal
4
Itu tergantung pada bagaimana terjemahan digunakan dalam tempalte, $this->__()atau Mage::helper('...')->__(). Dalam kasus pertama, Anda dapat memaksa blokir untuk menggunakan bantuan terjemahan Anda. Tapi saya percaya dalam kasus umum satu-satunya pilihan adalah peningkatan data untuk core_translatetabel. Berikut pertanyaan internasionalisasi dijelaskan secara rinci: blog.belvg.com/… .
Dmytro Zavalkin
Lihat juga Hindari hilangnya terjemahan saat menimpa blok untuk solusi langsung yang lebih mudah.
hakre

Jawaban:

20

Tidak peduli bagaimana Anda mendekatinya, masalah Anda membutuhkan solusi "kreatif", yang layak digunakan sebagai catatan pengembang untuk pengembang / pengelola berikutnya untuk digunakan. Pertama, beberapa latar belakang, diikuti oleh catatan, diikuti oleh solusi yang mudah dan saya pikir masuk akal di akhir <--tl; dr .

Seperti yang ditunjukkan Zyava , terjemahan tunduk pada modul yang melakukan terjemahan. Templat disajikan dalam contoh blok, dan contoh blok memiliki module_nameproperti yang digunakan saat memohon terjemahan; ref Mage_Core_Block_Abstract::__() :

public function __()
{
    $args = func_get_args();
    $expr = new Mage_Core_Model_Translate_Expr(array_shift($args), $this->getModuleName());
    array_unshift($args, $expr);
    return Mage::app()->getTranslator()->translate($args);
}

The module_nameproperti (biasanya) yang diperoleh pada permintaan dan berdasarkan nama kelas (ref. ::getModuleName()):

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;
}

Jadi, jika module_nameproperti sudah diatur, bahwa terjemahan modul berlaku. Untuk blok yang masih ada dari tata letak inti, properti ini dapat diatur melalui tata letak XML; sebagai contoh:

<default>
    <action block="root" method="setModuleName">
        <name>Your_Module</name>
    </action>
</default>

Voa! CSV modul Anda memiliki terjemahan untuk contoh itu. Ini bisa menjadi pendekatan. Tentu saja, masih ada situasi yang sulit dari terjemahan modul-modul lain yang diterapkan melalui pembantu khusus modul dalam contoh blok (termasuk file templat tentu saja), dan itu selalu berlaku untuk tata letak terjemahan XML. Juga, pendekatan ini akan memutus perilaku Disable Modul Output, yang menggunakanmodule_name param.

Larutan

Ternyata, dimungkinkan untuk menentukan beberapa file terjemahan untuk sebuah modul. Itu tidak dilakukan dalam inti (setiap modul hanya mendeklarasikan satu file .csv ), tetapi fungsinya ada di Mage_Core_Model_Translate:

public function getModulesConfig()
{
    if (!Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')) {
        return array();
    }

    $config = Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')->children();
    if (!$config) {
        return array();
    }
    return $config;
}

dan

protected function _loadModuleTranslation($moduleName, $files, $forceReload=false)
{
    foreach ($files as $file) {
        $file = $this->_getModuleFilePath($moduleName, $file);
        $this->_addData($this->_getFileData($file), $moduleName, $forceReload);
    }
    return $this;
}

Karena konten file digabung (saya uji), dimungkinkan untuk menentukan hanya string yang ingin Anda timpa dalam CSV khusus Anda. Misalnya, jika Anda ingin menerjemahkan string Informasi Tambahan pada halaman produk (diterjemahkan olehMage_Catalog modul), yang berikut ini akan berfungsi:

app / locale / Custom.csv :

"Additional Information","More Info, Dude"

Dalam konfigurasi modul Anda - yang seharusnya <depends />aktif Mage_Cataloguntuk memastikan kontennya bergabung setelah - yang berikut akan menyebabkan pasangan terjemahan Custom.csv bergabung di atas yang asli:

<frontend>
    <translate>
        <modules>
            <Mage_Catalog>
                <files>
                    <additional>Custom.csv</additional>
                </files>
            </Mage_Catalog>
        </modules>
    </translate>
</frontend>

Yang menyenangkan tentang pendekatan ini adalah Anda dapat mengumpulkan terjemahan inti utama Anda dalam satu file.

tanda batas
sumber
@ Francesco Seharusnya begitu. Hapus cache terjemahan? Jika tampaknya tidak berhasil, silakan posting ini sebagai pertanyaan baru (dan tautkan di sini untuk anak cucu).
tanda
Saya mengonfirmasi itu berfungsi baik $ this> _ dan dengan helper. Anda benar, itu salah saya (saya telah menghapus komentar salah sebelumnya)
Fra