【问题标题】:How does Magento translate works?Magento 翻译是如何工作的?
【发布时间】:2012-04-20 03:16:26
【问题描述】:

我想只使用一个 csv 文件来翻译前端 Magento 存储。所以我这样做了:

我创建了一个名为 Translator 的自定义模块。在它的 config.xml 中,我写了以下几行:

<config>
....
<translate>
<modules>
<MyPackage_Translator>
<files>
<default>MyPackage_Translator.csv</default>
</files>
</MyPackage_Translator>
</modules>
</translate>

</config>

然后我在 Helper 文件夹中创建了默认的 Data.php 助手。

然后在 app/locale/de_DE 中,我创建了 MyPackage_Translator.csv 文件,我将所有字符串都放在其中。

现在,如果在 phtml(无论模块)文件中,如果我执行以下操作:

echo $this->__('My string'); 

效果很好。但我很好奇为什么 Magento 会在 MyPackage_Translator.csv 中查找字符串?

我还注意到,如果我使用 $this->__('some string');在 Customer 模块中,Magento 将首先在 app/locale/de_DE/Mage_Customer.csv 文件中查找字符串,如果在那里找不到该字符串,那么它将在我的 MyPackage_Translator.csv 文件中查找。这是为什么?例如,为什么它不在 Enterprise_Customer.csv 文件中?

谁能解释一下 Magento 在寻找翻译文件时的工作流程?

【问题讨论】:

    标签: magento csv translate


    【解决方案1】:

    当你调用 $this->__('some text');

    您可以先查看Mage_Core_Helper_Abstract

    /**
     * Translate
     *
     * @return string
     */
    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);
    }
    

    接下来是Mage_Core_Model_App

    /**
     * Retrieve translate object
     *
     * @return Mage_Core_Model_Translate
     */
    public function getTranslator()
    {
        if (!$this->_translator) {
            $this->_translator = Mage::getSingleton('core/translate');
        }
        return $this->_translator;
    }
    

    交给Mage_Core_Model_Translate

    /**
     * Translate
     *
     * @param   array $args
     * @return  string
     */
    public function translate($args)
    {
        $text = array_shift($args);
    
        if (is_string($text) && ''==$text
            || is_null($text)
            || is_bool($text) && false===$text
            || is_object($text) && ''==$text->getText()) {
            return '';
        }
        if ($text instanceof Mage_Core_Model_Translate_Expr) {
            $code = $text->getCode(self::SCOPE_SEPARATOR);
            $module = $text->getModule();
            $text = $text->getText();
            $translated = $this->_getTranslatedString($text, $code);
        }
        else {
            if (!empty($_REQUEST['theme'])) {
                $module = 'frontend/default/'.$_REQUEST['theme'];
            } else {
                $module = 'frontend/default/default';
            }
            $code = $module.self::SCOPE_SEPARATOR.$text;
            $translated = $this->_getTranslatedString($text, $code);
        }
    
        //array_unshift($args, $translated);
        //$result = @call_user_func_array('sprintf', $args);
    
        $result = @vsprintf($translated, $args);
        if ($result === false) {
            $result = $translated;
        }
    
        if ($this->_translateInline && $this->getTranslateInline()) {
            if (strpos($result, '{{{')===false || strpos($result, '}}}')===false || strpos($result, '}}{{')===false) {
                $result = '{{{'.$result.'}}{{'.$translated.'}}{{'.$text.'}}{{'.$module.'}}}';
            }
        }
    
        return $result;
    }
    

    返回结果文本。这是如何处理所有内容的快速浏览,您应该查看类本身以获得更深入的理解。

    【讨论】:

    • 或许你可以直接在 Mage_Core.csv 翻译
    • 我不建议这样做,因为不建议更改 Magento 提供的任何核心文件。它不会是升级证明。他正朝着正确的方向前进,重载了翻译的核心类
    • 我的意思是,使用您特定语言的 Mage_Core.csv。不覆盖原来的。
    猜你喜欢
    • 2015-01-22
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多