Verwenden Sie die Übersetzungsdatei meines Moduls als Vorlage für den Magento-Kern

15

In einer Erweiterung, an der ich arbeite, habe ich ein Layout-XML über die config.xml des Moduls hinzugefügt. Dieses Layout hat einige Änderungen am Frontend. Einige dieser Blöcke gehören jedoch zu Magento-Kernmodulen. Die Vorlagen werden alle wie erwartet korrekt angezeigt.

Die Vorlagen, die ich mit dem Modul selbst gepackt habe, verwenden die Übersetzungsdateien meines eigenen Moduls. Die mit dem Magento-Kern gelieferten Vorlagen werden nicht übersetzt angezeigt. Wenn ich eine Übersetzungsdatei für das jeweilige Kernmodul hinzufüge, wird diese Übersetzungsdatei verwendet und die Vorlage wird übersetzt angezeigt.

Kann Magento die Übersetzungsdatei meines Moduls verwenden, wenn keine Übersetzungsdateien für das Magento-Kernmodul gefunden werden? Kann ich hier noch etwas tun?

Mridul Aggarwal
quelle
Sie können Ihre Übersetzungen entweder zur aktuellen Theme-Übersetzungsdatei hinzufügen oder die Inline-Übersetzungsoberfläche im Backend verwenden.
Dmytro Zavalkin
Ich wollte Übersetzungen mit der Erweiterung selbst packen. Für die obigen Anweisungen müssten Anweisungen für jeden hinzugefügt werden, der sie installiert. Gibt es eine Option, wo ich es aus dem Code tun kann?
Mridul Aggarwal
4
Dies hängt davon ab, wie die Übersetzung in tempalte $this->__()oder verwendet wird Mage::helper('...')->__(). Im ersten Fall können Sie block zwingen, Ihren Übersetzungshelfer zu verwenden. Aber ich glaube im Allgemeinen ist die einzige Option ein Daten-Upgrade für die core_translateTabelle. Hier werden Internationalisierungsfragen ausführlich beschrieben: blog.belvg.com/… .
Dmytro Zavalkin
Siehe auch Vermeiden Sie den Verlust von Übersetzungen, wenn Sie einen Block überschreiben, um eine einfachere praktische Lösung zu erhalten.
hakre

Antworten:

20

Ganz gleich, wie Sie vorgehen, für Ihr Problem ist eine "kreative" Lösung erforderlich, die einen Hinweis für Entwickler verdient, damit nachfolgende Entwickler / Betreuer sie verwenden können. Zunächst einiger Hintergrund mit einer Note, gefolgt von einer einfachen und ich denke , vernünftige Lösung am Ende <--tl; dr .

Wie Zyava betonte , unterliegt die Übersetzung dem Modul, das die Übersetzung vornimmt . Vorlagen werden in Blockinstanzen gerendert, und Blockinstanzen verfügen über eine module_nameEigenschaft, die beim Aufrufen der Übersetzung verwendet wird. ref Mage_Core_Block_Abstract::__() :

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);
}

Die module_nameEigenschaft wird (normalerweise) nach Bedarf abgeleitet und basiert auf dem Klassennamen (Ref. ::getModuleName()):

public function getModuleName()
{
    $module = $this->getData('module_name');
    if (is_null($module)) {
        $class = get_class($this);
        $module = substr($class, 0, strpos($class, '_Block'));
        $this->setData('module_name', $module);
    }
    return $module;
}

Wenn also die module_nameEigenschaft bereits festgelegt ist , gilt diese Modulübersetzung. Für vorhandene Blöcke aus dem Core-Layout kann diese Eigenschaft über Layout-XML festgelegt werden. beispielsweise:

<default>
    <action block="root" method="setModuleName">
        <name>Your_Module</name>
    </action>
</default>

Voilà! Ihr Modul CSV besitzt die Übersetzung für diese Instanz. Dies könnte ein Ansatz sein. Natürlich bleibt die Situation, dass die Übersetzung anderer Module über einen modulspezifischen Helfer in Blockinstanzen (natürlich auch in Vorlagendateien) angewendet wird, unverändert, und dies gilt immer für Layout-XML-Übersetzungen. Außerdem wird durch diesen Ansatz das Verhalten " module_nameModulausgabe deaktivieren" , bei dem der Parameter verwendet wird, unterbrochen.

Lösung

Wie sich herausstellt, können für ein Modul mehrere Übersetzungsdateien angegeben werden. Es wird nicht im Kern ausgeführt (jedes Modul deklariert nur eine CSV- Datei), aber die Funktionalität ist in Folgendem enthalten Mage_Core_Model_Translate:

public function getModulesConfig()
{
    if (!Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')) {
        return array();
    }

    $config = Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')->children();
    if (!$config) {
        return array();
    }
    return $config;
}

und

protected function _loadModuleTranslation($moduleName, $files, $forceReload=false)
{
    foreach ($files as $file) {
        $file = $this->_getModuleFilePath($moduleName, $file);
        $this->_addData($this->_getFileData($file), $moduleName, $forceReload);
    }
    return $this;
}

Da der Inhalt der Dateien zusammengeführt wird (von mir getestet), können nur die Zeichenfolgen angegeben werden, die Sie in Ihren benutzerdefinierten CSVs überschreiben möchten. Wenn Sie beispielsweise die Zeichenfolge " Zusätzliche Informationen" auf der Produktseite (vom Mage_CatalogModul übersetzt) übersetzen möchten, funktioniert Folgendes:

app / locale / Custom.csv :

"Additional Information","More Info, Dude"

In Ihrem Modul Config - das sollte <depends />auf Mage_Catalogseinen Inhalt , um sicherzustellen , fusionieren nach - folgenden wird die verursachen Custom.csv Übersetzungspaare fusionieren oben auf das Original:

<frontend>
    <translate>
        <modules>
            <Mage_Catalog>
                <files>
                    <additional>Custom.csv</additional>
                </files>
            </Mage_Catalog>
        </modules>
    </translate>
</frontend>

Das Schöne an diesem Ansatz ist, dass Sie Ihre übergeordneten Kernübersetzungen in einer Datei zusammenfassen können.

benmarks
quelle
@Francesco Es sollte. Übersetzungs-Cache leeren? Wenn es nicht zu funktionieren scheint, poste dies bitte als neue Frage (und verlinke hier für die Nachwelt).
benmarks
Ich bestätige, dass es sowohl mit $ this> _ als auch mit helper funktioniert. Sie haben Recht, es war meine Schuld (ich habe vorherige fehlerhafte Kommentar entfernt)
Ab