使magento核心模板使用我模块的翻译文件


15

在我正在开发的扩展中,我通过模块的config.xml添加了布局XML。此布局对前端进行了一些修改。但是,其中一些模块属于Magento核心模块。模板都按预期正确显示。

我与模块本身打包在一起的模板正在使用我自己模块的翻译文件。Magento核心打包的模板未翻译。如果我为相应的核心模块添加翻译文件,则将使用该翻译文件并且模板显示已翻译。

如果无法找到Magento核心模块的任何翻译文件,是否可以使Magento使用模块的翻译文件?我还能在这里做什么?


您可以将翻译添加到当前主题翻译文件中,也可以在后端使用嵌入式翻译界面。
Dmytro Zavalkin

我想使用扩展本身来打包翻译,以上要求向安装它的任何人添加说明。有什么我可以从代码中做到的选择吗?
Mridul Aggarwal

4
这取决于在tempalte $this->__()或中如何使用翻译Mage::helper('...')->__()。在第一种情况下,您可以强制阻止使用翻译助手。但是我相信在一般情况下,唯一的选择是对core_translate表进行数据升级。这里的国际化qestions详细描述:blog.belvg.com/...
Dmytro Zavalkin

另请参见避免在覆盖块时失去翻译,以简化动手解决方案。
hakre 2015年

Answers:


20

无论您如何处理,您的问题都需要一个“创造性”的解决方案,值得开发人员注意以供后续的开发人员/维护人员使用。首先是一些背景,其次是注释,其次是<--tl; dr的简单且我认为合理的解决方案。

正如Zyava所指出的,翻译受翻译模块的约束。模板在块实例中呈现,并且块实例具有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应该。清除翻译缓存?如果它似乎不起作用,请将其作为新问题发布(并在此处链接以供后代参考)。
benmarks 2013年

我确认它既可以在$ this> _上也可以在帮助程序下正常工作。您是对的,这是我的错(我已删除了先前的错误评论)
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.