Зробіть шаблон magento core за допомогою файлу перекладу мого модуля


15

У розширенні, над яким я працюю, я додав XML-макет через config.xml модуля. Цей макет має деякі модифікації фронту. Однак деякі з цих блоків належать до основних модулів Magento. Усі шаблони відображаються правильно, як очікувалося.

Шаблони, які я спакував із самим модулем, використовують файли перекладу власного модуля. Шаблони, упаковані з ядром Magento, показують неперекладені. Якщо я додаю файл перекладу до відповідного основного модуля, тоді використовується цей файл перекладу, а шаблон показує перекладений.

Чи є спосіб змусити Magento використовувати файл перекладу мого модуля, якщо він не може знайти жодного файлу перекладу для основного модуля Magento? Чи можна ще щось тут зробити?


Ви можете або додати свої переклади до поточного файлу перекладу теми або використовувати інтерфейс вбудованого перекладу в бекенді.
Дмитро Завалкін

Я хотів упакувати переклади з самим розширенням, вищезазначене вимагає додати інструкції для всіх, хто його встановлює. Чи є якийсь варіант, де я можу це зробити з коду?
Mridul Aggarwal

4
Це залежить від того, як використовується переклад у tempalte, $this->__()або Mage::helper('...')->__(). У першому випадку ви можете змусити блок використовувати ваш помічник перекладу. Але я вважаю, що в цілому єдиним варіантом є оновлення даних для core_translateтаблиці. Тут детально описані питання інтернаціоналізації: blog.belvg.com/… .
Дмитро Завалкін,

Дивіться також: Уникайте втрати перекладу, перезаписуючи блок для більш простого рішення.
хакре

Відповіді:


20

Незалежно від того, як ви підходите до цього, ваша проблема потребує "креативного" рішення, гідного примітки розробника для наступних розробників / технічного обслуговування. По-перше, деяка інформація, а потім примітка, а потім легке і, на мою думку, розумне рішення в кінці кінців <--tl; dr .

Як зазначив Зява , переклад підлягає модулю, який здійснює переклад. Шаблони відображаються в екземплярах блоків, а екземпляри блоків мають module_nameвластивість, яка використовується при виклику перекладу; посилання 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);
}

module_nameВластивість (зазвичай) , отриманий на вимогу і на основі імені класу (вих. ::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;
}

Отже, якщо module_name майно вже встановлено, що модуль переклад застосовується. Для існуючих блоків з основного макета цю властивість можна встановити за допомогою макета XML; наприклад:

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

Вуаля! Ваш модуль CSV володіє перекладом для цього примірника. Це може бути підхід. Звичайно, все ще існує клейка ситуація перекладу інших модулів, що застосовується через специфічний модуль-помічник у блокових екземплярах (включаючи файли шаблонів, звичайно), і це завжди справедливо для макетних перекладів XML. Крім того, такий підхід порушить поведінку вимкнутих модулів виведення, яка використовує module_nameпарам.

Рішення

Як виявляється, для модуля можна вказати кілька файлів перекладу. Це не робиться в ядрі (кожен модуль оголошує лише один .csv файл), але функціонал є в ньому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;
}

і

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

Оскільки вміст файлів об'єднано (я тестував), можна вказати лише ті рядки, які ви хочете змінити у своїх спеціальних CSV-адресах. Наприклад, якщо ви хочете перевести рядок " Додаткова інформація" на сторінку продукту (перекладений Mage_Catalogмодулем), буде працювати наступне:

app / locale / Custom.csv :

"Additional Information","More Info, Dude"

У вашому модулі конфігурації - який повинен <depends />на , Mage_Catalogщоб забезпечити його утримання зливатися після - наступний буде викликати Custom.csv пару перекладацького злиття поверх оригіналу:

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

Приємна річ у цьому підході - це те, що ви можете зібрати переважаючі основні переклади в одному файлі.


@Francesco Це повинно. Очистити кеш перекладу? Якщо це, здається, не працює, опублікуйте це як нове запитання (і посилання тут для нащадків).
орієнтири

Я підтверджую, що це працює як $ this> _, так і з помічником. Ви маєте рацію, це була моя вина (я видалив попередній помилковий коментар)
Від
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.