В основных модулях и иногда в шаблонах я вижу вспомогательные классы, используемые для перевода:
Mage::helper('someModule')->__('translate me');
Почему это предпочтительнее:
$this->__('translate me');
В основных модулях и иногда в шаблонах я вижу вспомогательные классы, используемые для перевода:
Mage::helper('someModule')->__('translate me');
Почему это предпочтительнее:
$this->__('translate me');
Ответы:
Просто теоретизирую, но когда вы звоните
$this->__('Foo')
в шаблоне, какой файл перевода CSV модуля будет использовать Magento для перевода Foo?
Не всегда ясно, какой помощник по переводу модуля Magento в конечном итоге вызовет для перевода строки / ключа. Поскольку Magento позволяет использовать один и тот же ключ в разных модулях для разных строк, часто важно знать, какие данные перевода модуля вы используете. Фактически, если шаблон используется в нескольких модулях, использование $this->__()может считаться «вредным», поскольку он будет возвращать различные значения в зависимости от контекста блока, в котором система макета использовала шаблон.
Я предполагаю, что вспомогательные средства были добавлены заранее, но разработчики, быстро создающие шаблоны, помогают создавать экземпляры, чтобы они знали, какой файл перевода модуля переведет строку, и этот шаблон распространился на тест платформы. Эта строка кода сама по себе неоднозначна.
$this->__('Foo');
Но вы можете быть уверены, что эта строка кода будет использовать Mage_Catalogинформацию о локализации.
Mage::helper('catalog')->__('Foo')
Потому что вы хотите использовать явный модуль.
Если вы используете $this->__()в контексте блока, модуль блока используется для перевода. Так что если вы хотите использовать специальный модуль, то вы должны использоватьMage::helper('mymodule')->__()
Mage_Checkout::My Cartсинтаксиса у вас может быть два разных местоположения . И поэтому важно, какой модуль используется для перевода
По сути, я собираюсь сказать то же самое, что и другие парни.
Если вы используете 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->__из вашего блока (шаблоны, которые отображают блок, также включены) будут переведены с использованием модуля каталога.
Одна из причин (которая является только моим восприятием), когда вы используете помощник, вы более конкретно относитесь к файлу перевода, например, Mage::helper('catalog')он найдет предложение в файле каталога, а при использовании $thisон будет случайным образом искать во всех файлах перевода. Это то, что я думаю.