Pytanie w sprawie translate, csv, magento – Jak działa tłumaczenie Magento?

6

Chcę przetłumaczyć frontendowy sklep Magento, używając tylko jednego pliku csv. Zrobiłem to:

Stworzyłem niestandardowy moduł o nazwie Translator. W pliku config.xml umieściłem te linie:

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

</config>
</code>

Następnie utworzyłem domyślny pomocnik Data.php w moim folderze Helper.

Następnie w app / locale / de_DE utworzyłem plik MyPackage_Translator.csv, w którym umieściłem wszystkie moje łańcuchy.

Teraz, jeśli w pliku phtml (niezależnie od modułu), zrobię coś takiego:

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

działa całkiem dobrze. Ale jestem ciekaw, dlaczego Magento wygląda w MyPackage_Translator.csv dla ciągu?

Zauważyłem też, że jeśli używam $ this -> __ ('some string'); w module Customer Magento będzie najpierw wyglądał w pliku app / locale / de_DE / Mage_Customer.csv dla łańcucha, a jeśli nie znajdzie tam łańcucha, to przejdzie do mojego pliku MyPackage_Translator.csv. Dlaczego? Dlaczego na przykład nie wygląda w pliku Enterprise_Customer.csv?

Czy ktoś może wyjaśnić mi przepływ pracy, który robi Magento, gdy szuka pliku tłumaczenia?

Twoja odpowiedź

1   odpowiedź
11

Możesz zacząć od obejrzeniaMage_Core_Helper_Abstract

<code>/**
 * 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);
}
</code>

Następne jestMage_Core_Model_App

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

Który jest przekazywanyMage_Core_Model_Translate

<code>/**
 * 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;
}
</code>

który zwraca wynikowy tekst. Jest to szybki spacer po tym, jak wszystko zostanie obsłużone, powinieneś zobaczyć same klasy, aby uzyskać głębsze zrozumienie.

Może możesz przetłumaczyć bezpośrednio na Mage_Core.csv Ricardo Martins
Nie poleciłbym takiej akcji, ponieważ nie zaleca się zmiany jakichkolwiek plików podstawowych dostarczanych przez Magento. Nie byłby to dowód na uaktualnienie. Zmierzał we właściwym kierunku, przeciążając klasę podstawową Tłumacza Vern Burton
Znaczy, użyj Mage_Core.csv w swoim języku. Nie nadpisuje oryginalnego. Ricardo Martins

Powiązane pytania