Независимо от того, как вы к этому подходите, ваша проблема требует «творческого» решения, достойного заметки разработчика для использования последующими разработчиками / сопровождающими. Во- первых, некоторые фон, а затем записку, а затем легко и я думаю , что разумное решение в конечной <--
ТЛ; дг .
Как указывал Зява , перевод зависит от модуля, выполняющего перевод. Шаблоны отображаются в экземплярах блоков, а экземпляры блоков имеют module_name
свойство, которое используется при вызове перевода; ссылка Mage_Core_Block_Abstract::__()
:
public function __()
{
$args = func_get_args();
$expr = new Mage_Core_Model_Translate_Expr(array_shift($args), $this->getModuleName());
array_unshift($args, $expr);
return Mage::app()->getTranslator()->translate($args);
}
module_name
Свойство (обычно) , полученный по требованию и на основе имени класса (исх. ::getModuleName()
):
public function getModuleName()
{
$module = $this->getData('module_name');
if (is_null($module)) {
$class = get_class($this);
$module = substr($class, 0, strpos($class, '_Block'));
$this->setData('module_name', $module);
}
return $module;
}
Таким образом, если module_name
свойство уже установлено, применяется перевод этого модуля. Для существующих блоков из основного макета это свойство может быть установлено с помощью XML макета; например:
<default>
<action block="root" method="setModuleName">
<name>Your_Module</name>
</action>
</default>
Вуаля! Ваш модуль CSV владеет переводом для этого экземпляра. Это может быть подходом. Конечно, все еще существует неприятная ситуация, когда трансляция других модулей применяется через специфичный для модуля помощник в экземплярах блоков (включая, конечно, файлы шаблонов), и это всегда верно для переводов XML макета. Кроме того, этот подход нарушит поведение Disable Modules Output, в котором используется module_name
параметр.
Решение
Оказывается, для модуля можно указать несколько файлов перевода. Это не сделано в ядре (каждый модуль объявляет только один файл .csv ), но функциональность есть в Mage_Core_Model_Translate
:
public function getModulesConfig()
{
if (!Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')) {
return array();
}
$config = Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')->children();
if (!$config) {
return array();
}
return $config;
}
и
protected function _loadModuleTranslation($moduleName, $files, $forceReload=false)
{
foreach ($files as $file) {
$file = $this->_getModuleFilePath($moduleName, $file);
$this->_addData($this->_getFileData($file), $moduleName, $forceReload);
}
return $this;
}
Поскольку содержимое файлов объединено (я проверял), можно указать только те строки, которые вы хотите переопределить в ваших пользовательских CSV. Например, если вы хотите перевести строку « Дополнительная информация» на странице продукта (переведенную Mage_Catalog
модулем), сработает следующее:
app / locale / Custom.csv :
"Additional Information","More Info, Dude"
В вашем модуле конфигурации - который должен <depends />
на , Mage_Catalog
чтобы обеспечить его содержание сливаться после - следующая будет вызывать Custom.csv пару переводческого слияние поверх оригинала:
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<additional>Custom.csv</additional>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
Хорошая особенность этого подхода заключается в том, что вы можете собрать свои основные переводы ядра в один файл.