Einige Komponenten möchte man möglichst unverändert lassen. Will man aber Texte aus Core-Modulen in eine andere Sprache übersetzen, so steht man vor einem Problem: Wie können Texte aus Magento-Core-Modulen übersetzt werden, ohne dabei die Core-Dateien zu verändern? Der Antwort auf diese Frage sind wir nachgegangen und haben eine verblüffend einfache Lösung gefunden.
Beispiel: Umbenennen „Wishlist“ aus Magento-Core in „Anfragekorb“
Im folgenden Beispiel möchten wir „Wishlist“ mit „Anfragekorb“ übersetzen (um in einem Projekt einen zusätzlichen Warenkorb für Anfragen bereitzustellen). Dabei wird das Magento-Core-Modul Mage_Wishlist benutzt. Der Dateiname soll hier von „My Wishlist“ in „Mein Anfragekorb“ übersetzt werden. Dazu wird zunächst ein neues Modul mit der gewünschten Übersetzung anlegt und die zugehörige Übersetzungsdatei um folgende Zeilen erweitert:
"Mage_Wishlist::My Wishlist", "Mein Anfragekorb"
Die übersetzten Passagen findet man, indem man in den Admin-Einstellungen „Translate Inline“ aktiviert. Durch Schweben mit dem Mauszeiger über den Modulen, erscheinen kleine Buchsymbole auf der aktuellen Seite:
Klickt man diese Bücher an, so öffnet sich ein Kasten in dem man die Übersetzungsdaten findet. In diesem werden sowohl das Modul, als auch der Originaltext zu jedem String eingeblendet. Dies ermöglicht es auch, die Übersetzung direkt in die Datenbank einzutragen:
Lösung: Reihenfolge der Übersetzungen aus dem Magento-Core nutzen
Die Reihenfolge, in der Magento Übersetzungsdateien bearbeitet, erlaubt eine problemlose Umbenennung von Dateien. In unserem Beispiel wurde die Übersetzung des Texts im Core-Modul geändert, ohne das Modul umzubauen.
Beim Start erzeugt jede Magento-Anwendung das $_data array, welches durch Aufrufen der Methode _addData() bei der Initialisierung der Mage_Core_Model_Translate Klasse aufgebaut wird. Die _addData()-Funktion wird dabei mehrfach aufgerufen, um die Übersetzungsausgaben aller Module, Themes und Datenbanken zu erstellen. Im Folgenden ist ein Code-Ausschnitt zu sehen, der dies zeigt:
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; }
Für unser Beispiel ist es nun wichtig, sich zu merken, dass Core-Modul-Übersetzungen vor anderen Modul-Übersetzungen generiert werden. Abgerufen werden alle Übersetzungen durch die folgende Methode in der Mage_Core_Model_Translate Klasse. Diese sucht in den Übersetzungsarrays nach der Übersetzung von Modulen und gibt diese zurück:
protected function _getTranslatedString($text, $code) { $translated = ''; if (array_key_exists($code, $this->getData())) { $translated = $this->_data[$code]; } elseif (array_key_exists($text, $this->getData())) { $translated = $this->_data[$text]; } else { $translated = $text; } return $translated; }
Sie enthält $code, welches ein wirkungsvolles Magento-Werkzeug ist, das vielen Magento-Entwicklern unbekannt ist. Mithilfe von $code können wir Modulen unterschiedliche Übersetzungen zuordnen – es sieht im Quellcode folgendermaßen aus:
"Mage_Wishlist::My Wishlist"
In diesem Beispiel haben wir also nun eine Übersetzungsdatei und ein Übersetzungsarray für alle Module erstellt. $code ermöglicht es nun Magento, die gewünschte Übersetzung zum Modul im Übersetzungsarray zu finden.
Es ist wichtig, dass das neue Modul „Mage_Wishlist::My Wishlist“ enthält, denn somit wird der zuvor erzeugte Eintrag zum Core-Modul im Übersetzungsarray überschrieben. Im Normalfall würde dieser unüberschrieben ausgelesen und die Übersetzung des Core-Moduls ausgegeben. Nun aber gibt die Übersetzungsfunktion die neue Übersetzung aus, und die Core-Datei bleibt dabei unangetastet. Sucht das Programm nun nach der passenden Übersetzung zu „My Wishlist“, so wird „Mein Anfragekorb“ ausgegeben.
Diese Methode erlaubt es auch, einem String in unterschiedlichen Modulen verschiedene Übersetzungen zuzuordnen und ist damit sehr wirkungsvoll.
Fazit: Auch Core-Texte lassen sich einfach anders übersetzen
Zusammenfassend lässt sich sagen, dass sich auch ohne Core-Modul-Änderungen Übersetzungen in Magento-Module einbringen lassen. Da Übersetzungen an vielen Stellen in der Magento-Entwicklung gewünscht sind, kann diese Methode vielseitig eingesetzt werden. Sie funktioniert in dieser Art und Weise leider nicht im Entwicklungsmodus, wohl aber im Live-System. Dazu kann man einfach ein neues Modul mit der gewünschten Übersetzung erstellen und dieses mithilfe von $code auslesen. Durch die festgelegte Auslese-Reihenfolge der Übersetzungsdateien, werden so beliebige Ausgaben erzeugt.