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):
- DB (
core_translatetabela)
- Tematem
translate.csvplik
- te
app/locale/*/*.csvpliki
Jak zbudowana jest tablica tłumaczeń?
Tłumaczenia modułów
Najpierw parsowane są wszystkie pliki, do app/locale/*/*.csvktórych istnieją odniesienia z etc/config.xmlplików aktywnych modułów . Oto przewodnik po tym procesie:
Załóżmy, że Magento znajduje następującą config.xmlsekcję:
<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<default>Mage_Catalog.csv</default>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
W tym pliku podano następujące tłumaczenie dla ustawień regionalnych skonfigurowanych dla bieżącego widoku sklepu:
"AAA","BBB"
W tych okolicznościach Magento tworzy w tablicy tłumaczeń następujące rekordy:
array(
"AAA" => "BBB",
"Mage_Catalog::AAA" => "BBB"
)
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.csvtł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.csvpliku 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.csvzapis "AAA","DDD"prowadziłby do następujących danych tłumaczenia:
array(
"AAA" => "DDD", // This is overwritten by the translate.csv file
"Mage_Catalog::AAA" => "BBB",
"Some_Module::AAA" => "CCC"
)
Oczywiście rekordy translate.csvz nowymi kluczami do tłumaczenia są po prostu dodawane do tablicy.
Tłumaczenia bazy danych
Tłumaczenia z core_translatetabeli 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:
// 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;
}
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 typ Mage_Core_Block_Template, Magento najpierw sprawdzi Mage_Core::AAArekord. Jeśli go nie znajdzie, wróci do tłumaczenia klucza AAA.
W przykładowym scenariuszu spowoduje to tłumaczenie DDD(z translate.csvpliku).
W innym scenariuszu skojarzonym blokiem może być Mage_Catalog_Block_Product_View. W takim przypadku Magento najpierw sprawdzi rekord tłumaczenia Mage_Catalog::AAAi znajdzie tłumaczenie AAA.
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.csvpliku nie jest używane, postępuj zgodnie z poniższą listą kontrolną:
- Czy pamięć podręczna tłumaczenia jest wyłączona / odświeżona? (Rozwiązanie: wyczyść pamięć podręczną)
- Czy
translate.csvplik naprawdę zawiera kreację zastępczą dla bieżącego sklepu? (Rozwiązanie: napraw konfigurację motywu)
- Czy w
core_translatetabeli występuje sprzeczny zapis tłumaczenia ? (Rozwiązanie: usuń sprzeczny rekord z core_translate)
- Jeśli wszystkie poprzednie punkty nie są przyczyną, musi istnieć sprzeczne tłumaczenie z innego modułu. (Rozwiązanie: patrz poniżej)
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ś AAAbyć tłumaczony za DDDpomocą tłumaczenia motywu, możesz to zrobić w translate.csv:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
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_translatetabeli 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=""argumenty config.xml, system.xmli 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 modulew pliku XML nie podano żadnego argumentu, core/datapomocnik 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.
- Niektóre szczegóły techniczne podczas budowania tablicy translacji
- Możliwość użycia dodatkowych plików tłumaczeń dla modułów
- Przechowuj zakres widoku dla
core_translaterekordów
- Plusy i minusy za pomocą różnych metod tłumaczenia
Jeśli potrzebujesz więcej informacji, zadaj osobne pytanie.