Вопрос по – Как работает Magento translate?

6

Я хочу перевести внешний магазин Magento, используя только один CSV-файл. Итак, я сделал это:

Я создал специальный модуль под названием «Переводчик». В его config.xml я поместил эти строки:

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

</config>
</code>

Затем я создал помощник по умолчанию Data.php в своей папке Helper.

Затем в app / locale / de_DE я создал файл MyPackage_Translator.csv, в который я положил все свои строки.

Теперь, если в файле phtml (независимо от модуля), если я делаю что-то вроде:

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

это работает довольно хорошо. Но мне интересно, почему Magento ищет строку в MyPackage_Translator.csv?

Я также заметил, что, если я использую $ this- & gt; __ ('некоторая строка'); в модуле Customer Magento будет сначала искать строку в файле app / locale / de_DE / Mage_Customer.csv, а если строка там не найдена, то он будет выглядеть в моем файле MyPackage_Translator.csv. Это почему? Почему он не выглядит, например, в файле Enterprise_Customer.csv?

Может ли кто-нибудь объяснить мне, как работает Magento, когда он ищет файл перевода?

Ваш Ответ

1   ответ
11

Вы можете начать с просмотра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. Это не будет доказательством обновления. Он двигался в правильном направлении с перегрузкой основного класса для Translate
Я имею в виду, используйте Mage_Core.csv на вашем конкретном языке. Не переопределяя оригинал.

Похожие вопросы