Сделать шаблон ядра magento, используя файл перевода моего модуля

15

В расширении, над которым я работаю, у меня есть макет XML, добавленный через файл config.xml модуля. Этот макет имеет некоторые модификации внешнего интерфейса. Однако некоторые из этих блоков относятся к основным модулям Magento. Все шаблоны отображаются правильно, как и ожидалось.

Шаблоны, которые я упаковал с самим модулем, используют файлы перевода моего собственного модуля. Шаблоны, упакованные с ядром Magento, не переведены. Если я добавлю файл перевода для соответствующего основного модуля, то этот файл перевода будет использован и шаблон покажет переведенный.

Есть ли способ заставить Magento использовать файл перевода моего модуля, если он не может найти файлы перевода для основного модуля Magento? Есть ли что-нибудь еще, что я могу сделать здесь?

Мридул Аггарвал
источник
Вы можете добавить свои переводы в текущий файл перевода темы или использовать встроенный интерфейс перевода в бэкэнде.
Дмитрий Завалкин
Я хотел упаковать переводы с самим расширением, для вышеизложенного потребуется добавить инструкции для тех, кто его устанавливает. Есть ли вариант, где я могу сделать это из кода?
Мридул Аггарвал
4
Это зависит от того, как перевод используется в tempalte, $this->__()или Mage::helper('...')->__(). В первом случае вы можете заставить блок использовать ваш помощник по переводу. Но я считаю, что в общем случае единственным вариантом является обновление данных для core_translateтаблицы. Здесь подробно описаны вопросы интернационализации: blog.belvg.com/… .
Дмитрий Завалкин
Смотрите также Избегайте потери перевода при перезаписи блока для более простого практического решения.
hakre

Ответы:

20

Независимо от того, как вы к этому подходите, ваша проблема требует «творческого» решения, достойного заметки разработчика для использования последующими разработчиками / сопровождающими. Во- первых, некоторые фон, а затем записку, а затем легко и я думаю , что разумное решение в конечной <--ТЛ; дг .

Как указывал Зява , перевод зависит от модуля, выполняющего перевод. Шаблоны отображаются в экземплярах блоков, а экземпляры блоков имеют 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 макета. Кроме того, этот подход нарушит поведение Disable Modules Output, в котором используется 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>

Хорошая особенность этого подхода заключается в том, что вы можете собрать свои основные переводы ядра в один файл.

benmarks
источник
@ Франция Должно. Очистить кеш перевода? Если кажется, что это не работает, пожалуйста, опубликуйте это как новый вопрос (и ссылку здесь для потомков).
отметки
Я подтверждаю, что это работает как $ this> _, так и с помощником. Вы правы, это была моя вина (я удалил предыдущий ошибочный комментарий)
Fra