Magento: Fehlende Übersetzungen

Schon mal einen Block per Rewrite überschrieben und plötzlich wurden die Übersetzungen für diesen Block nicht mehr korrekt angezeigt?
Ursache dafür ist ein aktiver DeveloperMode. Dieser verhindert zuverlässig, dass die richtigen Übersetzungen gefunden werden.

Der Grund steckt in der Funktion zum Laden der Übersetzungen. Normalerweise ist jede Übersetzung mindestens 2 x im Array der Übersetzungen vertreten. Hier ein Beispiel für „Add to Cart“:

„Add to Cart“ => „In den Warenkorb“
„Mage_Catalog::Add to Cart“ => „In den Warenkorb“
„Mage_Checkout::Add to Cart“ => „In den Warenkorb“
„Mage_Reports::Add to Cart“ => „In den Warenkorb“
„Mage_Tag::Add to Cart“ => „In den Warenkorb“
usw.

Das erste Pärchen ist die allgemeine Übersetzung ohne Modulbezug und dann kommen Übersetzungen für bestimmte Module. Dadurch könnte man im Checkout („Mage_Checkout::Add to Cart“) dem Button eine andere Übersetzung geben als im Rest der Anwendung. Wenn Magento eine Übersetzung sucht, wird also erst geschaut ob es eine modulbasierte Übersetzung gibt und falls nicht, wird die allgemeine Übersetzung ausgegeben. Soweit so gut. Wenn der DeveloperMode aktiv ist, werden aber alle allgemeinen Übersetzungen gelöscht und es gibt nur noch modulbezogene Übersetzungen.

Da sich bei überschriebenen Blöcken der Modulbezug (Scope) ändert, werden die vorherigen modulbezogenen Übersetzungen nicht mehr gefunden, denn es gibt ja keinen Eintrag „Eigener_Block::Add to Cart“. Die allgemeine Übersetzung „Add to Cart“ wurde auch gelöscht und somit gibt es keine Übersetzung.

Auszug aus Mage_Core_Model_Translate, siehe Zeile 20-22:

protected function _addData($data, $scope, $forceReload=false)
{
    foreach ($data as $key => $value) {
        if ($key === $value) {
            continue;
        }
        $key    = $this->_prepareDataString($key);
        $value  = $this->_prepareDataString($value);
        if ($scope && isset($this->_dataScope[$key]) && !$forceReload ) {
            /**
             * Checking previos value
             */
            $scopeKey = $this->_dataScope[$key] . self::SCOPE_SEPARATOR . $key;
            if (!isset($this->_data[$scopeKey])) {
                if (isset($this->_data[$key])) {
                    $this->_data[$scopeKey] = $this->_data[$key];
                    /**
                     * Not allow use translation not related to module
                     */
                    if (Mage::getIsDeveloperMode()) {
                        unset($this->_data[$key]);
                    }
                }
            }
            $scopeKey = $scope . self::SCOPE_SEPARATOR . $key;
            $this->_data[$scopeKey] = $value;
        }
        else {
            $this->_data[$key]     = $value;
            $this->_dataScope[$key]= $scope;
        }
    }
    return $this;
}

Wer tiefer in die Übersetzungsmechanik von Magento einsteigen möchte, dem ist der wie immer hervorragende Artikel von Vinai Kopp auf StackExchange empfohlen.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: