クラスが翻訳のために$ thisの代わりにヘルパーを使用するのはなぜですか?


27

コアモジュールと場合によってはテンプレートで、翻訳に使用されているヘルパークラスを確認します。

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

なぜこれが望ましいのですか:

$this->__('translate me');

こんにちは、ブレンダン、この質問は例外的に良いものです。あなたの努力に感謝します。そのために+1。ただし、Alanstormは質問に対する有効な回答を提供します。したがって、利用可能な回答から回答を受け入れるといいでしょう。ありがとう:
ラジーエフKトミー

あなたの兄弟へのより多くの力:-)
ラジーエフKトミー

回答:


24

理論化するだけで

$this->__('Foo')

テンプレートでは、MagentoはFooの翻訳にどのモジュールのCSV翻訳ファイルを使用しますか?

どのモジュールの翻訳ヘルパーMagentoが最終的に文字列/キーを翻訳するために呼び出すかは、必ずしも明確ではありません。Magentoでは、異なる文字列に対して異なるモジュールで同じキーを使用できるため、使用しているモジュールの翻訳データを知ることが重要になることがよくあります。実際、テンプレートが複数のモジュールにわたって使用される$this->__()場合、レイアウトシステムがテンプレートを使用したブロックコンテキストに応じて異なる値を返すため、using は「有害と見なされる」可能性があります。

便利なヘルパーが事前に追加されたと思いますが、テンプレートを作成してすぐにインスタンス化を開始するテンプレートを作成する開発者は、どのモジュールの翻訳ファイルが文字列を翻訳するかを知っており、そのパターンはフレームワークのテストに広がっています。このコード行自体はあいまいです。

$this->__('Foo');

ただし、このコード行ではMage_Catalogローカライズ情報を使用することを確認できます。

Mage::helper('catalog')->__('Foo')

うーん、私はそのロジックを取得します。実際には、アクティブなテーマのフロントエンドパッケージ内で/locale/{xyz}/translate.csv(モジュールごとではない)として作成されたCSVのみを見ました。「文字列は異なるモジュールに存在し、異なる翻訳が必要」という問題がありましたが、「この文字列にはこのモジュールに複数のインスタンスがあり、異なる翻訳が必要です」ヘルパーは解決しません。通常、テーマごとに$ thisと1つのCSVを使用します。
ブレンダンファルコフスキー14

@BrendanFalkowskiええ、「モジュール開発者」対「テーマ開発者」のようです。ビルトインヘルパーを使用していると思います。
アランストーム14

@AlanStormは間違いなくあなたに賛成です。
MTM 14

20

明示的なモジュールを使用したいからです。

$this->__()ブロックコンテキストで使用する場合、ブロックのモジュールが変換に使用されます。したがって、特別なモジュールを使用する場合は、使用する必要がありますMage::helper('mymodule')->__()


1
すべての場合において、翻訳は特定のモジュールに関連付けられています。$ thisのみを呼び出すときは、現在のモジュールを参照し、長いMage :: helper( 'mymodule')-> __()を呼び出すときは、そのモジュールで単語を翻訳します。デフォルトのCSV。
mbalparda 14

正しい。ヘルパーを使用する場合は、明示的にします。
ファビアンBlechschmidt 14

1
ただし、明示的であることの利点は何ですか?翻訳CSVはモジュールを区別しませんか?階層/継承のフォールバックについて聞いたことがない。
ブレンダンファルコフスキー14

いいえ、すべてのCSVがマージされますが、Mage_Checkout::My Cart構文のために2つの異なる場所を持つことができます。そして翻訳のために使用されたモジュールが重要である
ファビアンBlechschmidt

1
ああ、ヘルパーはフロントエンドパッケージよりもモジュールの方がはるかに理にかなっています。フロントエンドパッケージは、競合するコアをオーバーライドする独自のCSVのみです。
ブレンダンファルコフスキー14

9

基本的に、他の人が言ったのと同じことを言います。
使用Mage::helper(...)する場合は、特定のヘルパーが翻訳に使用されていることを確認してください。

たとえば、Mage_Adminhtml_Block_Catalog_Product_Gridブロックを見てみましょう。

列ヘッダーの場合、次のとおり 'header'=> Mage::helper('catalog')->__('Name'),です。カタログヘルパーの代わりに$this->__使用される場合、テキストはMage_Adminhtmlモジュールを使用して翻訳されます。

しかし、これは名前付きヘルパーを使用する背後にあるロジックが理にかなっている場合です。

$this->__('..')ヘルパーアプローチの代わりに使用すると問題が発生するケースを示したかっただけです。私は経験から話しています。

ブロックを取りましょうMage_Catalog_Block_Breadcrumbs。次のような行が1つあります Mage::helper('catalog')->__('Home')

あなたはcatalogモジュールにいると思うので、$this代わりに使用できます。しかし、あなたのブロックによってブロックをオーバーライドするとNamespace_Module_Block_Breadcrumbsどうなりますか?

$thisが使用された場合、翻訳に使用されるモジュールはでNamespace_Moduleあり、おそらくそれは望ましくありません。

これを回避するには、2つのオプションがあります。ほとんどのコアブロックで既に行われている名前付きヘルパーを使用します。

または、開発者としてこれをブロッククラスに追加できます。

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

次に$this->__、ブロックから使用するすべてのテキスト(ブロックをレンダリングするテンプレートも含まれます)がカタログモジュールを使用して翻訳されることを確認します。


いいね パンくずの理論は素晴らしかったです。そのための+1 :-)
ラジーエフKトミー

2

1つの理由(これは単なる私の認識です)、ヘルパーを使用Mage::helper('catalog')すると、カタログファイル内の文を検索するように翻訳ファイルをより詳細に指定しますが、使用$thisするとすべての翻訳ファイルをランダムに検索します。それが私が思うことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.