Чому класи використовують помічник для перекладу замість $ this?


27

У основних модулях та іноді шаблонах я бачу, що для перекладу використовуються допоміжні класи:

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

Чому це бажано:

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

Гей Брендан, це питання надзвичайно добре, і я ціную ваші зусилля. +1 для цього. Однак Alanstorm дасть вагому відповідь на ваше запитання. Тож було б непогано прийняти відповідь із доступних відповідей. Дякую :-)
Rajeev K Tomy

Більше влади для брата :-)
Радєєв К Томі

Відповіді:


24

Просто теоретизую, але коли ти дзвониш

$this->__('Foo')

у шаблоні, який файл перекладу CSV модуля буде використовувати Magento для перекладу Foo?

Не завжди зрозуміло, який помічник з перекладу модуля Magento в кінцевому підсумку покличе перекласти рядок / ключ. Оскільки Magento дозволяє використовувати один і той же ключ у різних модулях для різних рядків, часто важливо знати, який саме переклад даних, який ви використовуєте, використовується. Насправді, якщо шаблон використовується в декількох модулях, використання $this->__()може бути "вважається шкідливим", оскільки воно поверне різні значення залежно від контексту блоку, в якому використовувалась система компонування шаблону.

Я думаю, що помічники щодо зручності були додані наперед, але розробники, що створюють шаблони, швидко починаючи інстанціювання, допомагають, щоб вони знали, який файл перекладу модуля переведе рядок, і ця модель поширилася на тест фреймворку. Цей рядок коду, сам по собі, неоднозначний.

$this->__('Foo');

Але ви можете бути впевнені, що цей рядок коду використовуватиме Mage_Catalogінформацію про локалізацію.

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

Хм, я розумію таку логіку. На практиці я бачив лише CSV-файли, створені в пакеті фронтенду для активної теми як /locale/{xyz}/translate.csv (не на модуль). У мене була проблема "рядок існує в різних модулях і потребує різних перекладів", але також "ця рядок має кілька примірників у цьому модулі і потребує різних перекладів", які помічники не вирішують. Як правило, я, мабуть, можу дотримуватися $ цього і одного CSV на кожну тему.
Брендан Фальковський

@BrendanFalkowski Так, здається, що "розробник модулів" проти "розробник тем". Я б сказав, що ви знайдете використання вбудованих помічників.
Алан Шторм

@AlanStorm безумовно є нагородою для вас.
MTM

20

Тому що ви хочете використовувати явний модуль.

Якщо ви використовуєте $this->__()в контексті блоку, модуль блоку використовується для перекладу. Тож якщо ви хочете використовувати спеціальний модуль, тоді вам доведеться користуватисяMage::helper('mymodule')->__()


1
У всіх випадках переклади прив’язуються до певного модуля. Закликаючи лише $ this, ви посилаєтесь на поточний модуль, а при виклику довгого Mage :: helper ('mymodule') -> __ () ви перекладаєте слово з цим модулем, як і CSV з модуля замість CSV за замовчуванням
mbalparda

Правильно. Якщо ви використовуєте помічник, ви робите це явним.
Фабіан Блешшмідт

1
У чому перевага бути явним? CSV-файли для перекладу не розрізняють модулі, чи вони? Я не чув жодної ієрархічної / спадкової спадщини для них.
Брендан Фальковський

Ні, всі CSV файли об’єднані, але у вас може бути два різних місця через Mage_Checkout::My Cartсинтаксис. І тому важливо, який модуль використовується для перекладу
Fabian Blechschmidt

1
Ага, тому помічники мають набагато більше сенсу для модулів, ніж це для пакетних пакетів, з якими може боротися лише їх власний CSV.
Брендан Фальковський

9

В основному я говорю те саме, що й інші хлопці.
Якщо ви користуєтеся Mage::helper(...), переконайтеся, що певний помічник використовується для перекладу.

Наприклад, візьмемо Mage_Adminhtml_Block_Catalog_Product_Gridблок.

Для заголовків стовпців є це: 'header'=> Mage::helper('catalog')->__('Name'),. якби замість помічника каталогу $this->__був би використаний текст, текст був би перекладений за допомогою Mage_Adminhtmlмодуля.

Але це випадок, коли логіка використання названих помічників має сенс.

Я просто хотів показати випадок, коли використання $this->__('..')замість хелперського підходу може призвести до проблем. Я кажу з досвіду.

Візьмемо блок Mage_Catalog_Block_Breadcrumbs. Існує один рядок , яка виглядає наступним чином : Mage::helper('catalog')->__('Home').

Ви б могли подумати, що ви перебуваєте в catalogмодулі, щоб ви могли використовувати $thisзамість цього. Але що робити, якщо ви перекриєте блок, названий вашим блоком Namespace_Module_Block_Breadcrumbs?

Якщо $thisвін використовувався, то модуль, який використовується для перекладу, був би, Namespace_Moduleі ви, ймовірно, цього не хочете.

Є два варіанти цього уникнути. Або з використанням названого помічника, як це вже відбувається для більшості основних блоків.

Або ви як розробник можете додати це до класу блоків:

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

Тоді ви впевнені, що всі тексти, що використовуються $this->__з вашого блоку (шаблони, які також відображають блок, будуть переведені), будуть переведені за допомогою модуля каталогу.


Приємно. Теорія Breadcrumb була приголомшливою. Мені це сподобалось. +1 для цього :-)
Раєєв К Томі

2

Однією з причин (що є лише моїм сприйняттям), коли ви використовуєте helper, ви конкретніше стосуєтесь файлу перекладу, як-от Mage::helper('catalog')він знайде речення у каталожному файлі, тоді як при використанні $thisйого буде довільно шукати у всіх файлах перекладу. Це я думаю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.