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_translateTisch)
- Die
translate.csvThemendatei
- Die
app/locale/*/*.csvDateien
Wie ist das Übersetzungsarray aufgebaut?
Modul Übersetzungen
Zuerst werden alle Dateien von app/locale/*/*.csvaktiven Modulen etc/config.xmlanalysiert , auf die verwiesen wird . Hier ist eine exemplarische Vorgehensweise:
Angenommen, Magento findet den folgenden config.xmlAbschnitt:
<!-- 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.csvder Ü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.csversetzen 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.csvDatensatz "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.csvmit neuen Übersetzungsschlüsseln einfach zum Array hinzugefügt.
Datenbank-Übersetzungen
Übersetzungen aus der core_translateTabelle 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::AAADatensatz. 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.csvDatei).
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::AAAsuchen 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.csvDatei nicht verwendet wird, folgen Sie dieser Checkliste:
- Ist der Übersetzungscache deaktiviert / aktualisiert? (Lösung: Cache leeren)
- Befindet sich die
translate.csvDatei wirklich im Theme-Fallback für den aktuellen Store? (Lösung: Themenkonfiguration korrigieren)
- Gibt es in der
core_translateTabelle 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 AAAso ü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_translateTabelle 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.xmlund 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 moduleim XML kein Argument angegeben ist, wird der core/dataHelper 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_translateDatensätze
- Vor- und Nachteile der verschiedenen Übersetzungsmethoden
Bitte stellen Sie eine separate Frage, wenn Sie weitere Informationen benötigen.