Dlaczego klasy używają pomocnika do tłumaczenia zamiast $ this?

27

W podstawowych modułach i czasami szablonach widzę klasy pomocnicze używane do tłumaczenia:

Mage::helper('someModule')->__('translate me');

Dlaczego jest to preferowane:

$this->__('translate me');
Brendan Falkowski
źródło
Cześć Brendan, to pytanie jest wyjątkowo dobre i doceniam twój wysiłek. +1 za to. Jednak Alanstorm daje prawidłową odpowiedź na twoje pytanie. Byłoby więc miło przyjąć odpowiedź z dostępnych odpowiedzi. Dzięki :-)
Rajeev K Tomy
Więcej mocy dla ciebie bracie :-)
Rajeev K Tomy

Odpowiedzi:

24

Teoretycznie, ale kiedy dzwonisz

$this->__('Foo')

w szablonie, który plik tłumaczenia CSV modułu użyje Magento do przetłumaczenia Foo?

Nie zawsze jest jasne, który moduł tłumaczący Magento ostatecznie zadzwoni, aby przetłumaczyć ciąg / klucz. Ponieważ Magento pozwala używać tego samego klucza w różnych modułach dla różnych ciągów, często ważne jest, aby wiedzieć, z których danych tłumaczeniowych korzystasz. W rzeczywistości, jeśli szablon jest używany w wielu modułach, użycie $this->__()może być „uważane za szkodliwe”, ponieważ zwróci różne wartości w zależności od kontekstu bloku, w którym układ używał szablonu.

Domyślam się, że pomocnicy zostali dodani z góry, ale programiści budujący szablony, szybko rozpoczynający tworzenie instancji, pomagają wiedzieć, który plik tłumaczenia modułu przetłumaczy ciąg, a ten wzorzec rozprzestrzenił się na test frameworka. Ten wiersz kodu sam w sobie jest niejednoznaczny.

$this->__('Foo');

Ale możesz być pewien, że ten wiersz kodu użyje Mage_Cataloginformacji o lokalizacji.

Mage::helper('catalog')->__('Foo')
Alan Storm
źródło
Hmm, rozumiem tę logikę. W praktyce widziałem tylko pliki CSV utworzone w pakiecie interfejsu użytkownika dla aktywnego motywu jako /locale/{xyz}/translate.csv (nie na moduł). Miałem problem „ciąg istnieje w różnych modułach i wymaga różnych tłumaczeń”, ale także „ciąg ten ma wiele wystąpień w tym module i potrzebuje różnych tłumaczeń”, których pomocnicy nie rozwiązują. Ogólnie rzecz biorąc, prawdopodobnie mogę trzymać się $ $ i jednego pliku CSV na motyw.
Brendan Falkowski
@BrendanFalkowski Tak, wygląda na to, że jest „twórcą modułów” vs. „twórcą motywów”. Powiedziałbym, że używasz wbudowanych pomocników.
Alan Storm,
@AlanStorm zdecydowanie jest dla ciebie pozytywny.
MTM,
20

Ponieważ chcesz użyć jawnego modułu.

Jeśli używasz $this->__()w kontekście bloku, moduł bloku służy do tłumaczenia. Więc jeśli chcesz użyć specjalnego modułu, musisz użyćMage::helper('mymodule')->__()

Fabian Blechschmidt
źródło
1
We wszystkich przypadkach tłumaczenia są powiązane z określonym modułem. Dzwoniąc tylko $ this, odnosisz się do bieżącego modułu, a dzwoniąc do długiego Mage :: helper ('mymodule') -> __ () tłumaczysz słowo za pomocą tego modułu, podobnie jak CSV z modułu zamiast domyślny CSV.
mbalparda
Poprawny. Jeśli używasz pomocnika, wyraźnie to zaznaczasz.
Fabian Blechschmidt
1
Jaka jest zaleta bycia wyraźnym? CSV w tłumaczeniach nie rozróżniają modułów, czy też? Nie słyszałem o żadnych rezerwach hierarchicznych / spadkowych.
Brendan Falkowski
Nie, wszystkie pliki CSV są scalone, ale możesz mieć dwie różne lokalizacje ze względu na Mage_Checkout::My Cartskładnię. Dlatego ważne jest, który moduł zostanie użyty do tłumaczenia
Fabian Blechschmidt,
1
Aha, więc pomocnicy mają dużo więcej sensu dla modułów niż w pakietach frontendowych, z którymi walczy tylko ich własny CSV.
Brendan Falkowski
9

Zasadniczo zamierzam powiedzieć to samo, co powiedzieli inni faceci.
Jeśli używasz Mage::helper(...), upewnij się, że do tłumaczenia używany jest konkretny pomocnik.

Na przykład weźmy Mage_Adminhtml_Block_Catalog_Product_Gridblok.

Dla nagłówków kolumn jest to: 'header'=> Mage::helper('catalog')->__('Name'),. gdyby zamiast pomocnika katalogu $this->__zostałby użyty, tekst zostałby przetłumaczony za pomocą Mage_Adminhtmlmodułu.

Ale jest to przypadek, w którym logika wykorzystywania nazwanych pomocników ma sens.

Chciałem tylko pokazać przypadek, w którym użycie $this->__('..')zamiast podejścia pomocnika może prowadzić do problemów. Mówię z doświadczenia.

Weźmy blok Mage_Catalog_Block_Breadcrumbs. Jest jedna linia, która wygląda następująco: Mage::helper('catalog')->__('Home').

Można by pomyśleć, że jesteś w catalogmodule, więc możesz użyć $thiszamiast tego. Ale co jeśli zastąpisz blok swoim blokiem o nazwie Namespace_Module_Block_Breadcrumbs?

Gdyby $thisbył używany, to byłby to moduł używany do tłumaczenia Namespace_Modulei prawdopodobnie tego nie chcesz.

Istnieją dwie opcje, aby tego uniknąć. Albo użycie nazwanego pomocnika, jak to już się dzieje w przypadku większości bloków podstawowych.

Lub jako programista możesz dodać to w klasie bloków:

public function getModuleName() {
    return 'Mage_Catalog';
}

Następnie masz pewność, że wszystkie teksty $this->__z Twojego bloku (szablony, które renderują blok również w zestawie) zostaną przetłumaczone za pomocą modułu katalogu.

Marius
źródło
Miły. Teoria Breadcrumb była niesamowita, uwielbiałem ją. +1 za to :-)
Rajeev K Tomy
2

Jednym z powodów (co jest po prostu moim zdaniem), kiedy używasz pomocnika, jesteś bardziej szczegółowy na temat pliku tłumaczenia, tak jak Mage::helper('catalog')znajdzie zdanie w pliku katalogu, a kiedy $thisgo użyjesz , będzie losowo wyszukiwał we wszystkich plikach tłumaczenia. Tak myślę.

MTM
źródło