Warum verwenden Klassen anstelle von $ this einen Helfer für die Übersetzung?

27

In Kernmodulen und manchmal Vorlagen werden Hilfsklassen für die Übersetzung verwendet:

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

Warum ist dies vorzuziehen, um:

$this->__('translate me');
Brendan Falkowski
quelle
Hey Brendan, diese Frage ist außergewöhnlich gut und ich weiß deine Mühe zu schätzen. +1 dafür. Alanstorm gibt Ihnen jedoch eine gültige Antwort auf Ihre Frage. Es wäre also schön, eine Antwort von den verfügbaren Antworten zu akzeptieren. Danke :-)
Rajeev K Tomy
Mehr Kraft für deinen Bruder :-)
Rajeev K Tomy

Antworten:

24

Nur theoretisieren, aber wenn Sie anrufen

$this->__('Foo')

Mit welcher CSV-Übersetzungsdatei übersetzt Magento Foo in einer Vorlage?

Es ist nicht immer klar, welcher Übersetzungshelfer des Moduls Magento letztendlich aufruft, um die Zeichenfolge / den Schlüssel zu übersetzen. Da Sie in Magento denselben Schlüssel in verschiedenen Modulen für verschiedene Zeichenfolgen verwenden können, ist es häufig wichtig zu wissen, welche Übersetzungsdaten des Moduls Sie verwenden. In der Tat, wenn eine Vorlage über mehrere Module hinweg verwendet wird, verwenden Sie$this->__() als "schädlich" eingestuft werden, da je nach Blockkontext, in dem das Layout-System die Vorlage verwendet, unterschiedliche Werte zurückgegeben werden.

Ich vermute, dass die Convenience-Helfer im Vorfeld hinzugefügt wurden, aber die Entwickler, die die Vorlagen schnell erstellten und mit der Instantiierung begannen, wussten, welche Übersetzungsdatei des Moduls eine Zeichenfolge übersetzen würde, und dass sich dieses Muster auf den Test des Frameworks auswirkte. Diese Codezeile ist für sich genommen mehrdeutig.

$this->__('Foo');

Sie können jedoch sicher sein, dass diese Codezeile die Mage_CatalogLokalisierungsinformationen verwendet.

Mage::helper('catalog')->__('Foo')
Alan Storm
quelle
Hmm, ich verstehe diese Logik. In der Praxis habe ich nur CSVs gesehen, die im Frontend-Paket für das aktive Thema als /locale/{xyz}/translate.csv (nicht pro Modul) erstellt wurden. Ich hatte das Problem "String existiert in verschiedenen Modulen und benötigt unterschiedliche Übersetzungen", aber auch "dieser String hat mehrere Instanzen in diesem Modul und benötigt unterschiedliche Übersetzungen", die die Helfer nicht lösen. Im Allgemeinen kann ich mich wahrscheinlich an $ this und eine CSV pro Thema halten.
Brendan Falkowski
@BrendanFalkowski Ja, es scheint eine "Modulentwickler" vs. "Theme-Entwickler" Sache zu sein. Ich würde sagen, Sie finden die eingebauten Helfer.
Alan Storm
@AlanStorm ist definitiv eine positive Bewertung für Sie.
MTM
20

Weil Sie ein explizites Modul verwenden möchten.

Wenn Sie $this->__()in einem Blockkontext verwenden, wird das Modul des Blocks für die Übersetzung verwendet. Wenn Sie also ein spezielles Modul verwenden möchten, müssen Sie es verwendenMage::helper('mymodule')->__()

Fabian Blechschmidt
quelle
1
In allen Fällen sind Übersetzungen an ein bestimmtes Modul gebunden. Wenn Sie nur $ this aufrufen, beziehen Sie sich auf das aktuelle Modul, und wenn Sie den langen Mage :: helper ('mymodule') -> __ () aufrufen, übersetzen Sie das Wort mit diesem Modul, genau wie eine CSV aus einem Modul anstelle von die Standard-CSV.
mbalparda
Richtig. Wenn Sie einen Helfer verwenden, machen Sie es explizit.
Fabian Blechschmidt
1
Was ist der Vorteil, wenn man explizit ist? Übersetzungs-CSVs unterscheiden nicht zwischen Modulen, oder? Habe noch nichts von einem Hierarchie- / Vererbungsfallback für sie gehört.
Brendan Falkowski
Nein, alle CSVs werden zusammengeführt. Aufgrund der Mage_Checkout::My CartSyntax können Sie jedoch zwei verschiedene Speicherorte festlegen. Und so ist es wichtig, welches Modul für die Übersetzung verwendet wird
Fabian Blechschmidt
1
Aha, also machen Helfer für Module viel mehr Sinn als für Frontend-Pakete, mit denen nur ihre eigene CSV den Kern überschreibt.
Brendan Falkowski
9

Grundsätzlich werde ich dasselbe sagen wie die anderen.
Wenn du benutztMage::helper(...) , stellen Sie sicher, dass ein bestimmter Helfer für die Übersetzung verwendet wird.

Nehmen wir zum Beispiel die Mage_Adminhtml_Block_Catalog_Product_Grid Block.

Für die Spaltenüberschriften gibt es diese: 'header'=> Mage::helper('catalog')->__('Name'),. Wenn anstelle des Katalog-Helfers $this->__das verwendet worden wäre, wäre der Text mit dem übersetzt wordenMage_Adminhtml Modul übersetzt worden.

Dies ist jedoch ein Fall, in dem die Logik der Verwendung benannter Helfer sinnvoll ist.

Ich wollte nur einen Fall zeigen, wo mit $this->__('..') anstelle des Hilfsansatzes zu Problemen führen kann. Ich spreche aus Erfahrung.

Nehmen wir den Block Mage_Catalog_Block_Breadcrumbs. Es gibt eine Linie , dass das sieht aus wie: Mage::helper('catalog')->__('Home').

Sie würden denken, dass Sie im catalogModul sind, also könnten Sie $thisstattdessen verwenden. Aber was ist, wenn Sie den Block durch Ihren aufgerufenen Block überschreiben Namespace_Module_Block_Breadcrumbs?

Wenn verwendet $thiswurde, dann wäre das Modul, das für die Übersetzung verwendet wird, Namespace_Moduleund das möchten Sie wahrscheinlich nicht.

Um dies zu vermeiden, gibt es zwei Möglichkeiten. Verwenden Sie entweder einen benannten Helfer, wie er bereits für die meisten Kernblöcke verwendet wird.

Oder Sie als Entwickler können dies in der Blockklasse hinzufügen:

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

Dann sind Sie sicher, dass alle Texte, die $this->__aus Ihrem Block verwendet werden (Vorlagen, die den Block auch rendern), mit dem Katalogmodul übersetzt werden.

Marius
quelle
Nett. Die Breadcrumb-Theorie war fantastisch. Ich habe es geliebt. +1 dafür :-)
Rajeev K Tomy
2

Ein Grund (das ist nur meine Wahrnehmung): Wenn Sie helper verwenden, sind Sie spezifischer in Bezug auf die Übersetzungsdatei, Mage::helper('catalog')da der Satz in der Katalogdatei gefunden wird, und wenn Sie es verwenden $this, werden alle Übersetzungsdateien nach dem Zufallsprinzip durchsucht. Das ist was ich denke.

MTM
quelle