Não importa como você o aborda, seu problema exige uma solução "criativa", digna de uma nota do desenvolvedor para desenvolvedores / mantenedores subsequentes usarem. Primeiro, alguns antecedentes, seguidos de uma nota, seguidos de uma solução fácil e acho razoável no final <--
tl; dr .
Como Zyava apontou , a tradução está sujeita ao módulo que faz a tradução. Os modelos são renderizados em instâncias de bloco e as instâncias de bloco têm uma module_name
propriedade usada ao chamar a tradução; ref 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);
}
A module_name
propriedade é (normalmente) derivada sob demanda e com base no nome da classe (ref. ::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;
}
Portanto, se a module_name
propriedade já estiver configurada, essa conversão de módulo será aplicada. Para blocos existentes do layout principal, essa propriedade pode ser configurada via XML do layout; por exemplo:
<default>
<action block="root" method="setModuleName">
<name>Your_Module</name>
</action>
</default>
Voilà! O seu CSV do módulo possui a tradução para essa instância. Esta poderia ser uma abordagem. Obviamente, ainda existe a situação complicada da tradução de outros módulos sendo aplicada via auxiliar específico do módulo em instâncias de bloco (incluindo arquivos de modelo, é claro), e sempre é verdade para traduções XML de layout. Além disso, essa abordagem interromperá o comportamento Desativar módulos de saída, que usa o module_name
parâmetro
Solução
Como se vê, é possível especificar vários arquivos de tradução para um módulo. Isso não é feito no núcleo (cada módulo declara apenas um arquivo .csv ), mas a funcionalidade está presente em 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;
}
e
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;
}
Como o conteúdo dos arquivos é mesclado (eu testei), é possível especificar apenas as strings que você deseja substituir nos seus CSVs personalizados. Por exemplo, se você deseja converter a cadeia de informações adicionais na página do produto (traduzida pelo Mage_Catalog
módulo), o seguinte funcionaria:
app / locale / Custom.csv :
"Additional Information","More Info, Dude"
Em seu módulo de configuração - o que deve <depends />
em Mage_Catalog
assegurar o seu conteúdo fundir depois - a seguir fará com que os Custom.csv pares de tradução para fundir em cima do original:
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<additional>Custom.csv</additional>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
O bom dessa abordagem é que você pode coletar suas traduções principais em um arquivo.