Magento如何翻译工作



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

我创建了一个名为翻译器的自定义模块。在其配置中.xml我放置了以下行:

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

然后,我在我的助手文件夹中创建了默认的 数据.php 助手。

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

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

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

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

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

有人可以解释一下Magento在寻找翻译文件时所做的工作流程吗?

当你调用$this->__('一些文本');

你可以从看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;
}

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

最新更新