В основных модулях и иногда в шаблонах я вижу вспомогательные классы, используемые для перевода:
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
он будет случайным образом искать во всех файлах перевода. Это то, что я думаю.