TL; DR
Wenn Sie in den Details nicht interessiert sind , wie die Übersetzungsarbeiten, überspringen Sie den Inhalt bis zum
Was zu überprüfen , ob Ihre Übersetzung nicht funktioniert Abschnitt weiter unten, insbesondere den Unterabschnitt
Lösung für Module Scope Übersetzung Konflikte .
Magento-Übersetzungsübersicht
Magento priorisiert Übersetzungsquellen (von der höchsten zur niedrigsten):
- DB (der
core_translate
Tisch)
- Die
translate.csv
Themendatei
- Die
app/locale/*/*.csv
Dateien
Wie ist das Übersetzungsarray aufgebaut?
Modul Übersetzungen
Zuerst werden alle Dateien von app/locale/*/*.csv
aktiven Modulen etc/config.xml
analysiert , auf die verwiesen wird . Hier ist eine exemplarische Vorgehensweise:
Angenommen, Magento findet den folgenden config.xml
Abschnitt:
<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<default>Mage_Catalog.csv</default>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
In dieser Datei wird die folgende Übersetzung für das für die aktuelle Geschäftsansicht konfigurierte Gebietsschema angegeben:
"AAA","BBB"
Unter diesen Umständen erstellt Magento die folgenden Datensätze im Übersetzungsarray:
array(
"AAA" => "BBB",
"Mage_Catalog::AAA" => "BBB"
)
Der zweite Wert ist die Modulbereichsübersetzung . Der vorangestellte Modulname wird dem XML-Konfigurationsknoten entnommen, der die Deklaration der Übersetzungsdatei enthält.
Wird dieselbe Übersetzung erneut von einer zweiten Moduldatei angegeben , z. B. in Some_Module.csv
der Übersetzung "AAA","CCC"
, wird die Einstellung NICHT ÜBERSCHRIEBEN"AAA"
. Stattdessen wird nur ein neuer Datensatz mit dem zweiten Modulnamen hinzugefügt "Some_Module::AAA" => "CCC"
.
Wenn der Entwicklermodus aktiviert ist, wird der Datensatz sogar gelöscht"AAA"
, wenn in einer anderen Modulübersetzung ein zweiter Datensatz mit demselben Schlüssel gefunden wird. Dies erleichtert das Erkennen von Modulübersetzungskonflikten während der Entwicklung.
Themenübersetzungen
Zweitens translate.csv
ersetzen die aus der ersten Datei im Theme-Fallback für das aktuelle Gebietsschema geladenen Übersetzungen einfach vorhandene Datensätze im Übersetzungsarray.
Wenn Sie also das vorherige Beispiel fortsetzen, würde ein translate.csv
Datensatz "AAA","DDD"
zu den folgenden Übersetzungsdaten führen:
array(
"AAA" => "DDD", // This is overwritten by the translate.csv file
"Mage_Catalog::AAA" => "BBB",
"Some_Module::AAA" => "CCC"
)
Natürlich werden Datensätze translate.csv
mit neuen Übersetzungsschlüsseln einfach zum Array hinzugefügt.
Datenbank-Übersetzungen
Übersetzungen aus der core_translate
Tabelle werden im Grunde genommen genau wie die Themenübersetzungen in das Übersetzungsarray eingebunden.
Vorhandene Schlüssel aus dem Modul oder Themenübersetzungen werden durch Datenbankeinträge überschrieben, neue hinzugefügt.
Übersetzungssuche
Wenn die __()
Methode aufgerufen wird, sucht Magento zuerst nach einer Übersetzung in einem Array, die dem aktuellen Modul entspricht.
Das aktuelle Modul wird durch den Klassennamen bestimmt, unter dem die __()
Klasse aufgerufen wird. In Blöcken sieht die verantwortliche Methode beispielsweise so aus:
// Excerpt from Mage/Core/Block/Abstract.php
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;
}
Die Methoden in Helfern und Controllern funktionieren entsprechend.
Beispielszenarien für die Suche
Zum Beispiel heißt $this->__('AAA')
das in einer Vorlagendatei. Wenn der zugehörige Block den Typ hat Mage_Core_Block_Template
, sucht Magento zuerst nach einem Mage_Core::AAA
Datensatz. Wenn es es nicht findet, greift es auf die Übersetzung für den Schlüssel zurück AAA
.
Im Beispielszenario führt dies zur Übersetzung DDD
(aus der translate.csv
Datei).
In einem anderen Szenario könnte der zugehörige Block sein Mage_Catalog_Block_Product_View
. In diesem Fall würde Magento zuerst nach einem Übersetzungsdatensatz Mage_Catalog::AAA
suchen und die Übersetzung finden AAA
.
Tatsächlich haben die Übersetzungen des Modulbereichs eine höhere Priorität als alle generischen Übersetzungen. Welche Übersetzung verwendet wird, hängt davon ab, aus welchem Modul die Klasse die __()
Methode aufruft .
Was ist zu überprüfen, wenn Ihre Übersetzung nicht funktioniert?
Wenn Ihre Übersetzung aus einer translate.csv
Datei nicht verwendet wird, folgen Sie dieser Checkliste:
- Ist der Übersetzungscache deaktiviert / aktualisiert? (Lösung: Cache leeren)
- Befindet sich die
translate.csv
Datei wirklich im Theme-Fallback für den aktuellen Store? (Lösung: Themenkonfiguration korrigieren)
- Gibt es in der
core_translate
Tabelle einen widersprüchlichen Datensatz für die Übersetzung ? (Lösung: Entfernen Sie den Konfliktdatensatz aus. core_translate
)
- Wenn nicht alle vorherigen Punkte die Ursache sind, muss eine widersprüchliche Übersetzung aus einem anderen Modul vorliegen. (Lösung: siehe unten)
Lösung für Module Scope Translation-Konflikte
Wenn Sie feststellen, dass der letzte Fall zutrifft, fügen Sie die Übersetzung einfach ein zweites Mal translate.csv
mit dem Modulumfang des Moduls hinzu, das die Übersetzung durchführt.
In dem Beispiel, wenn Sie wollten schon immer AAA
so übersetzt werden DDD
über das Thema Übersetzung, könnten Sie tun dies in Ihrem translate.csv
:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
In der Praxis füge ich den Modulumfang nur dann der Übersetzung hinzu, wenn ein Konflikt vorliegt, dh wenn eine Übersetzung nicht funktioniert.
Zusätzliche Bemerkungen
Inline-Übersetzung
Die Inline-Übersetzungsfunktion von Magento fügt der core_translate
Tabelle auch die benutzerdefinierten Übersetzungen hinzu, die das Modulbereichspräfix verwenden.
Rückwärtskompatibilität
Die Priorität der Themenübersetzungen war früher höher als die der Datenbankübersetzungen bis Magento Version 1.3 oder so.
XML-Übersetzung
Magento bewertet manchmal translate=""
Argumente config.xml
, system.xml
und Layout - XML - Kind - Knotenwerte zu übersetzen.
In diesen Fällen kann eine Hilfsklasse angegeben werden, indem das module=""
Argument verwendet wird, um das Modul für den Übersetzungsbereich anzugeben.
Wenn module
im XML kein Argument angegeben ist, wird der core/data
Helper zum Übersetzen der Werte des untergeordneten Knotens verwendet.
Weitere Informationen
Ich gebe zu, ich habe in diesem Beitrag einige Details des Magento-Übersetzungsprozesses beschönigt, aber nur, weil ich nicht zu viele Informationen haben möchte.
- Einige technische Details, während das Übersetzungsarray erstellt wird
- Die Möglichkeit, zusätzliche Übersetzungsdateien für Module zu verwenden
- Speicheranzeigebereich für
core_translate
Datensätze
- Vor- und Nachteile der verschiedenen Übersetzungsmethoden
Bitte stellen Sie eine separate Frage, wenn Sie weitere Informationen benötigen.