Mam taką konfigurację pakietu projektowego:
design/frontend/package_name/theme_name/locale/
pod którą mam
de_DE
, en_GB
Etc, w ramach której mają odpowiednie translate.csv
pliki z różnych ciągów:"Key", "Translation"
Próbuję zaimplementować różne ciągi w moim motywie echo $this->__('Text')
Jednak wydaje się, że to nie działa (widzę tylko ciąg wewnątrz ('Text')
wyświetlanego). Myślę, że brakuje mi pewnego podstawowego zrozumienia, kiedy Magento pobiera ciągi z pliku CSV do przetłumaczenia. Czy ktoś może wyjaśnić, jak uruchomić te pliki csv?
Odpowiedzi:
TL; DR
Jeśli nie jesteś zainteresowany szczegółami, w jaki sposób działa tłumaczenie, pomiń treść do sekcji
Co sprawdzić, czy tłumaczenie nie działa poniżej, szczególnie podsekcja
Rozwiązanie konfliktów w zakresie zakresu modułów .
Przegląd tłumaczeń Magento
Magento nadaje priorytet źródłom tłumaczeń (od najwyższego do najniższego):
core_translate
tabela)translate.csv
plikapp/locale/*/*.csv
plikiJak zbudowana jest tablica tłumaczeń?
Tłumaczenia modułów
Najpierw parsowane są wszystkie pliki, do
app/locale/*/*.csv
których istnieją odniesienia zetc/config.xml
plików aktywnych modułów . Oto przewodnik po tym procesie:Załóżmy, że Magento znajduje następującą
config.xml
sekcję:W tym pliku podano następujące tłumaczenie dla ustawień regionalnych skonfigurowanych dla bieżącego widoku sklepu:
W tych okolicznościach Magento tworzy w tablicy tłumaczeń następujące rekordy:
Druga wartość to tłumaczenie zakresu modułu . Prefiksowana nazwa modułu jest pobierana z węzła config XML zawierającego deklarację pliku tłumaczenia.
Jeśli to samo tłumaczenie jest określone ponownie przez drugiego pliku modułu , np
Some_Module.csv
tłumaczenie jest"AAA","CCC"
, to będzie Nie zastępuj na"AAA"
ustawienie. Zamiast tego doda tylko nowy rekord z nazwą drugiego modułu"Some_Module::AAA" => "CCC"
.Jeśli włączony jest tryb dewelopera, to nawet rozbroić ten
"AAA"
rekord, jeżeli stwierdzi drugi rekord z tym samym kluczem w innym tłumaczeniu modułu. Ułatwia to wykrywanie konfliktów translacji modułów podczas programowania.Tłumaczenia tematyczne
Po drugie, tłumaczenia wczytane z pierwszego
translate.csv
pliku w zastępczej kompozycji dla bieżących ustawień regionalnych po prostu zastępują istniejące rekordy w tablicy tłumaczeń.Kontynuując poprzedni przykład,
translate.csv
zapis"AAA","DDD"
prowadziłby do następujących danych tłumaczenia:Oczywiście rekordy
translate.csv
z nowymi kluczami do tłumaczenia są po prostu dodawane do tablicy.Tłumaczenia bazy danych
Tłumaczenia z
core_translate
tabeli są w zasadzie łączone w tablicę tłumaczeń, podobnie jak tłumaczenia motywów.Istniejące klucze z tłumaczenia modułu lub motywu są nadpisywane przez rekordy bazy danych, dodawane są nowe.
Wyszukiwanie tłumaczeń
Po
__()
wywołaniu metody Magento najpierw szuka tłumaczenia w tablicy pasującego do bieżącego modułu.Bieżący moduł jest określony przez nazwę klasy, na której
__()
klasa jest wywoływana. Na przykład w blokach odpowiedzialna metoda wygląda następująco:Metody w Pomocnikach i Kontrolerach działają odpowiednio.
Przykładowe scenariusze wyszukiwania
Na przykład, powiedzmy, że
$this->__('AAA')
jest wywoływany w pliku szablonu. Jeśli skojarzony blok ma typMage_Core_Block_Template
, Magento najpierw sprawdziMage_Core::AAA
rekord. Jeśli go nie znajdzie, wróci do tłumaczenia kluczaAAA
.W przykładowym scenariuszu spowoduje to tłumaczenie
DDD
(ztranslate.csv
pliku).W innym scenariuszu skojarzonym blokiem może być
Mage_Catalog_Block_Product_View
. W takim przypadku Magento najpierw sprawdzi rekord tłumaczeniaMage_Catalog::AAA
i znajdzie tłumaczenieAAA
.W efekcie tłumaczenia zakresu modułów mają wyższy priorytet niż wszelkie tłumaczenia ogólne . To, które tłumaczenie zostanie zastosowane, zależy od tego, który moduł klasy wywołuje
__()
metodę.Co sprawdzić, jeśli tłumaczenie nie działa
Jeśli tłumaczenie z
translate.csv
pliku nie jest używane, postępuj zgodnie z poniższą listą kontrolną:translate.csv
plik naprawdę zawiera kreację zastępczą dla bieżącego sklepu? (Rozwiązanie: napraw konfigurację motywu)core_translate
tabeli występuje sprzeczny zapis tłumaczenia ? (Rozwiązanie: usuń sprzeczny rekord zcore_translate
)Rozwiązanie konfliktów translacji zakresu modułów
Jeśli okaże się ostateczna przypadek jest prawdziwy, wystarczy dodać tłumaczeniu po raz drugi do Twojego
translate.csv
z zakresu modułu modułu robi tłumaczenia.W tym przykładzie, jeśli zawsze chciałeś
AAA
być tłumaczony zaDDD
pomocą tłumaczenia motywu, możesz to zrobić wtranslate.csv
:W praktyce dodam zakres modułu do tłumaczenia tylko wtedy, gdy występuje konflikt, to znaczy, jeśli tłumaczenie nie działa.
Dodatkowe uwagi
Tłumaczenie Inline
Funkcja tłumaczenia wbudowanego Magento dodaje również niestandardowe tłumaczenia do
core_translate
tabeli przy użyciu prefiksu zakresu modułu.Kompatybilność wsteczna
Priorytet tłumaczeń motywów był wyższy niż tłumaczenia baz danych aż do wersji Magento 1.3.
Tłumaczenie XML
Magento czasami ocenić
translate=""
argumentyconfig.xml
,system.xml
i układ XML do przeliczenia wartości węzłów potomnych.W takich przypadkach można określić klasę pomocnika, używając
module=""
argumentu do określenia modułu dla zakresu tłumaczenia.Jeśli
module
w pliku XML nie podano żadnego argumentu,core/data
pomocnik służy do tłumaczenia wartości węzłów potomnych.Dalsza informacja
Przyznaję, że w tym poście opisałem kilka szczegółów procesu tłumaczenia Magento, ale tylko dlatego, że nie chcę za dużo informacji.
core_translate
rekordówJeśli potrzebujesz więcej informacji, zadaj osobne pytanie.
źródło
__()
funkcji.Źródła tłumaczeń
Tłumaczenia są łączone z różnych źródeł: tłumaczenia modułów z odpowiednich plików XML, tłumaczenia motywów z
translate.csv
bieżącego motywu i tłumaczenia wbudowane z bazy danych.Tłumaczenia mogą być ściśle specyficzne dla modułu (ważne tylko w module), zawsze tak jest w przypadku tłumaczeń wbudowanych i opcjonalnie w przypadku tłumaczeń motywów. Aby to osiągnąć, musisz zdefiniować je z prefiksem modułu w translate.csv:
Tłumaczenia z modułów (podobnych
Mage_Catalog.csv
) są ściśle specyficzne dla modułu, tylko jeśli włączony jest TRYB DEWELOPERA. W przeciwnym razie tłumaczenie z pierwszego załadowanego modułu jest używane globalnie dla wszystkich modułów, które nie mają własnego tłumaczenia tekstu.Przygotowałem schemat blokowy, który pokazuje, jak każdy tekst z różnych źródeł jest scalany w tablicy tłumaczeń:
data
to tablica tłumaczeńSkrzynia Evil Edge
Jeśli przetłumaczony ciąg jest równy nieprzetłumaczonemu ciągowi, tłumaczenie jest ignorowane. Na pierwszy rzut oka to brzmi jak przydatna optymalizacja, ale w ten sposób nie można łatwo przetłumaczyć łańcucha bez zmian w jednym module i zmienionym w innym module, ponieważ zmienione tłumaczenie będzie jedynym i stanie się globalne.
Wyszukiwanie tłumaczeń
Dla którego modułu wyszukiwane jest tłumaczenie, zależy od modułu klasy, na której
__()
została wywołana metoda . Następnie wyszukiwanie w tablicy tłumaczeń wygląda następująco:data
to tablica tłumaczeńDefinicji zakresu
Istnieje możliwość zmiany modułu dla jednej klasy, co jest szczególnie przydatne dla bloków i pomocników. Najlepszą praktyką jest zawsze jawne ustawianie nazwy modułu podczas przepisywania klasy podstawowej. Jak to działa, różni się w zależności od pomocników, bloków i kontrolerów (od Magento CE 1.9.1)
Przykład bloku:
W przypadku bloków można również ustawić
module_name
parametr w układzie XML:Przykład dla pomocnika:
W przypadku kontrolerów interfejsu użytkownika można ustawić właściwość
_realModuleName
, w przypadku kontrolerów administracyjnych_usedModuleName
(dla zachowania spójności)Inne metody tłumaczenia
W plikach XML (config.xml, system.xml, layout) możesz określić, czy węzły powinny być tłumaczone za pomocą tego
translate
atrybutu. Należy również dodaćmodule
atrybut, aby określić zakres, ale tutaj wartością musi być alias pomocnika , a nie nazwa modułu, jak wyżej.W JavaScript możesz użyć
Translator
obiektu, który jest globalnie dostępny:ale musisz udostępnić tłumaczenia, których chcesz używać w JavaScript, dla obiektu translatora. Odbywa się to poprzez
jstranslator.xml
pliki wetc
katalogach modułów.loading
może być dowolnym ciągiem, ale musi być globalnie unikalny.translate
Imodule
atrybuty są wykorzystywane także w innych plikach XML. Wartośćmessage
i jej tłumaczenie jest dodawane do obiektu JS Translator.Rozwiązywanie problemów
Nawet jeśli znasz wszystkie skomplikowane reguły, czasem trudno jest zrozumieć, dlaczego niektóre tłumaczenia działają tak, jak działają (lub nie działają). Aby to ułatwić, opracowałem moduł „Wskazówki dotyczące tłumaczenia”, który pokazuje, skąd pochodzą tłumaczenia:
Na podstawie moich postów na blogu i slajdów na ten temat:
źródło
Czy wyczyściłeś pamięć podręczną?
Czy w Twoim systemie ustawiono ustawienia regionalne testowanego pliku?
Czy Magento może znaleźć plik, którego szuka, gdy ładuje tłumaczenie motywu (niektóre tymczasowe
var_dump
; zakończ; instrukcje powinny pomóc.Czy
_getTranslatedString
metoda może znaleźć to, czego szuka w tablicy danych?źródło
translate.csv
tłumaczeniu poprawnie tłumaczy w,/app/design/frontend/package_name/default/template/catalog/product/view.phtml
ale nie w/app/design/frontend/package_name/default/template/page/html/topmenu.phtml