Frage an csv, magento, translate – Wie funktioniert die Magento-Übersetzung?

6

Ich möchte einen Frontend-Magento-Store mit nur einer CSV-Datei übersetzen. Also habe ich das gemacht:

Ich habe ein benutzerdefiniertes Modul namens Übersetzer erstellt. In seiner config.xml habe ich folgende Zeilen eingefügt:

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

</config>
</code>

Dann habe ich den standardmäßigen Data.php-Helfer in meinem Helper-Ordner erstellt.

Dann habe ich in app / locale / de_DE die Datei MyPackage_Translator.csv erstellt, in der ich alle meine Zeichenfolgen abgelegt habe.

Nun, wenn ich in einer phtml-Datei (unabhängig vom Modul) etwas mache wie:

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

es funktioniert ziemlich gut. Aber ich bin neugierig, warum Magento in MyPackage_Translator.csv nach dem String sucht.

Mir ist auch aufgefallen, dass, wenn ich $ this -> __ ('some string') verwende; Im Kundenmodul sucht Magento zuerst in der Datei app / locale / de_DE / Mage_Customer.csv nach dem String. Wenn der String dort nicht gefunden wird, wird er in der Datei MyPackage_Translator.csv gesucht. Warum das? Warum sieht es beispielsweise nicht in der Datei Enterprise_Customer.csv aus?

Kann mir jemand erklären, wie Magento bei der Suche nach der Übersetzungsdatei vorgeht?

Deine Antwort

1   die antwort
11

Wenn Sie $ this -> __ ('irgendein Text') aufrufen;

Sie können mit dem Betrachten beginnenMage_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>

Der nächste istMage_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>

Welcher wird übergebenMage_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>

Dies gibt den resultierenden Text zurück. Dies ist eine kurze Einführung in die Vorgehensweise. Sie sollten die Klassen selbst anzeigen, um ein besseres Verständnis zu erhalten.

Vielleicht kannst du direkt auf Mage_Core.csv übersetzen Ricardo Martins
Ich meine, benutze die Mage_Core.csv in deiner Sprache. Das Original nicht überschreiben. Ricardo Martins
Ich würde eine solche Aktion nicht empfehlen, da es nicht empfehlenswert ist, die von Magento bereitgestellten Kerndateien zu ändern. Es wäre kein Upgrade-Beweis. Er bewegte sich in die richtige Richtung, indem er die Kernklasse für Translate überlastete Vern Burton

Verwandte Fragen