Незалежно від того, як ви підходите до цього, ваша проблема потребує "креативного" рішення, гідного примітки розробника для наступних розробників / технічного обслуговування. По-перше, деяка інформація, а потім примітка, а потім легке і, на мою думку, розумне рішення в кінці кінців <--
tl; dr .
Як зазначив Зява , переклад підлягає модулю, який здійснює переклад. Шаблони відображаються в екземплярах блоків, а екземпляри блоків мають 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. Крім того, такий підхід порушить поведінку вимкнутих модулів виведення, яка використовує 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>
Приємна річ у цьому підході - це те, що ви можете зібрати переважаючі основні переклади в одному файлі.