Ich habe ein Designpaket-Setup wie folgt:
design/frontend/package_name/theme_name/locale/
unter denen ich habe
de_DE
, en_GB
Usw., unter denen ich entsprechenden translate.csv
Dateien mit den verschiedenen Strings:"Key", "Translation"
Ich versuche, verschiedene Zeichenfolgen in mein Thema zu implementieren echo $this->__('Text')
Es scheint jedoch nicht zu funktionieren (ich sehe nur die Zeichenfolge in der ('Text')
angezeigten). Ich glaube, mir fehlt ein grundlegendes Verständnis, wann Magento Zeichenketten aus der CSV zieht, um sie zu übersetzen. Kann jemand bitte erklären, wie man diese csv Akten erhält, um zu arbeiten?
magento-1.7
theme
multistore
localisation
Waffel
quelle
quelle
Antworten:
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):
core_translate
Tisch)translate.csv
Themendateiapp/locale/*/*.csv
DateienWie ist das Übersetzungsarray aufgebaut?
Modul Übersetzungen
Zuerst werden alle Dateien von
app/locale/*/*.csv
aktiven Modulenetc/config.xml
analysiert , auf die verwiesen wird . Hier ist eine exemplarische Vorgehensweise:Angenommen, Magento findet den folgenden
config.xml
Abschnitt:In dieser Datei wird die folgende Übersetzung für das für die aktuelle Geschäftsansicht konfigurierte Gebietsschema angegeben:
Unter diesen Umständen erstellt Magento die folgenden Datensätze im Übersetzungsarray:
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: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: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 hatMage_Core_Block_Template
, sucht Magento zuerst nach einemMage_Core::AAA
Datensatz. Wenn es es nicht findet, greift es auf die Übersetzung für den Schlüssel zurückAAA
.Im Beispielszenario führt dies zur Übersetzung
DDD
(aus dertranslate.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 ÜbersetzungsdatensatzMage_Catalog::AAA
suchen und die Übersetzung findenAAA
.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:translate.csv
Datei wirklich im Theme-Fallback für den aktuellen Store? (Lösung: Themenkonfiguration korrigieren)core_translate
Tabelle einen widersprüchlichen Datensatz für die Übersetzung ? (Lösung: Entfernen Sie den Konfliktdatensatz aus.core_translate
)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 werdenDDD
über das Thema Übersetzung, könnten Sie tun dies in Ihremtranslate.csv
: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=""
Argumenteconfig.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 dercore/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.
core_translate
DatensätzeBitte stellen Sie eine separate Frage, wenn Sie weitere Informationen benötigen.
quelle
__()
Funktionsweise der Funktion hatte.Übersetzungsquellen
Übersetzungen werden aus verschiedenen Quellen zusammengeführt: Modulübersetzungen aus den jeweiligen XML-Dateien, Themenübersetzungen aus
translate.csv
dem aktuellen Thema und Inline-Übersetzungen aus der Datenbank.Übersetzungen können streng modulspezifisch sein (nur innerhalb eines Moduls gültig), das gilt immer für Inline-Übersetzungen und optional für Themenübersetzungen. Um dies zu erreichen, müssen Sie sie mit dem Modulpräfix in der translate.csv definieren:
Übersetzungen von Modulen (wie
Mage_Catalog.csv
) sind nur dann streng modulspezifisch, wenn der DEVELOPER MODE eingeschaltet ist. Andernfalls wird die Übersetzung des ersten geladenen Moduls global für alle Module verwendet, die keine eigene Übersetzung für den Text haben.Ich habe ein Flussdiagramm zusammengestellt, das zeigt, wie jeder Text aus den verschiedenen Quellen im Übersetzungsarray zusammengeführt wird:
data
ist das ÜbersetzungsarrayEvil Edge-Fall
Wenn die übersetzte Zeichenfolge der nicht übersetzten Zeichenfolge entspricht, wird die Übersetzung ignoriert. Das klingt auf den ersten Blick nach nützlicher Optimierung, aber auf diese Weise können Sie einen String nicht einfach unverändert in einem Modul übersetzen und in einem anderen Modul ändern, da die geänderte Übersetzung die einzige ist und global wird.
Übersetzungssuche
Für welches Modul die Übersetzung nachgeschlagen wird, hängt vom Modul der Klasse ab, auf der die Methode
__()
aufgerufen wurde. Dann lautet die Suche im Übersetzungsarray wie folgt:data
ist das ÜbersetzungsarrayBereich Definition
Es gibt die Möglichkeit, das Modul für eine Klasse zu ändern, was besonders für Blöcke und Helfer nützlich ist. Es wird empfohlen, den Modulnamen beim Umschreiben einer Kernklasse immer explizit festzulegen. Wie es funktioniert, variiert zwischen Helfern, Blöcken und Controllern (ab Magento CE 1.9.1)
Beispiel für einen Block:
Für Blöcke können Sie den
module_name
Parameter auch in Layout-XML festlegen :Beispiel für einen Helfer:
Für Frontend-Controller können Sie die Eigenschaft
_realModuleName
für Admin-Controller festlegen_usedModuleName
(yay für Konsistenz).Andere Übersetzungsmethoden
In XML-Dateien (config.xml, system.xml, layout) können Sie angeben, ob Knoten mit dem
translate
Attribut übersetzt werden sollen . Sie sollten auch dasmodule
Attribut hinzufügen , um den Bereich anzugeben, aber hier muss der Wert der Helfer-Alias und nicht der Modulname wie oben sein.In JavaScript können Sie das
Translator
global verfügbare Objekt verwenden:Sie müssen jedoch die Übersetzungen, die Sie in JavaScript verwenden möchten, für das Übersetzerobjekt verfügbar machen. Dies geschieht über
jstranslator.xml
Dateien in denetc
Verzeichnissen der Module.loading
kann eine beliebige Zeichenfolge sein, muss jedoch global eindeutig sein. Die Attributetranslate
undmodule
werden wie in anderen XML-Dateien verwendet. Der Wert vonmessage
und seine Übersetzung werden dem JS Translator-Objekt hinzugefügt.Fehlerbehebung
Selbst wenn Sie alle komplizierten Regeln kennen, ist es manchmal schwer zu verstehen, warum eine Übersetzung so funktioniert, wie sie ist (oder nicht). Um dies zu vereinfachen, habe ich ein Modul "Übersetzungshinweise" entwickelt, das zeigt, woher die Übersetzungen stammen:
Basierend auf meinen Blogbeiträgen und Folien zum Thema:
quelle
Hast du deinen Cache geleert?
Ist Ihr System auf das Gebietsschema der zu testenden Datei eingestellt?
Kann Magento die gesuchte Datei finden, wenn es die Theme-Übersetzung lädt (einige temporäre
var_dump
; Exit; Anweisungen sollten helfen)?Kann die
_getTranslatedString
Methode im Datenarray finden, wonach sie sucht?quelle
translate.csv
übersetzt richtig in ,/app/design/frontend/package_name/default/template/catalog/product/view.phtml
aber nicht in/app/design/frontend/package_name/default/template/page/html/topmenu.phtml