Fazer com que o modelo principal do magento use o arquivo de tradução do meu módulo

15

Em uma extensão em que estou trabalhando, tenho um XML de layout adicionado via config.xml do módulo. Este layout tem algumas modificações no frontend. Alguns desses blocos, no entanto, pertencem aos módulos principais do Magento. Todos os modelos estão sendo exibidos corretamente conforme o esperado.

Os modelos que empacotei com o próprio módulo estão usando os arquivos de tradução do meu próprio módulo. Os modelos empacotados com o núcleo Magento são mostrados não traduzidos. Se eu adicionar um arquivo de tradução para o respectivo módulo principal, ele será usado e o modelo será traduzido.

Existe uma maneira de fazer o Magento usar o arquivo de tradução do meu módulo se ele não encontrar nenhum arquivo de tradução para o módulo principal do Magento? Há mais alguma coisa que eu possa fazer aqui?

Mridul Aggarwal
fonte
Você pode adicionar suas traduções ao arquivo de tradução de temas atual ou usar a interface de tradução embutida no back-end.
Dmytro Zavalkin
Queria empacotar traduções com a própria extensão, o que precede exigiria a adição de instruções para quem a instalar. Existe alguma opção em que eu possa fazer isso a partir do código?
Mridul Aggarwal
4
Depende de como a tradução é usada no tempalte, $this->__()ou Mage::helper('...')->__(). No primeiro caso, você pode forçar o bloqueio a usar seu auxiliar de tradução. Mas acredito que, em geral, a única opção é a atualização de dados para a core_translatetabela. Aqui, as perguntas de internacionalização são descritas em detalhes: blog.belvg.com/… .
Dmytro Zavalkin
Consulte também Evite a perda de tradução ao substituir um bloco para obter uma solução prática mais fácil.
hakre

Respostas:

20

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_namepropriedade 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_namepropriedade é (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_namepropriedade 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_nameparâ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_Catalogmó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_Catalogassegurar 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.

benmarks
fonte
@Francesco Deveria. Limpar cache de tradução? Se parece não funcionar, publique isso como uma nova pergunta (e faça o link aqui para posteridade).
benmarks
Confirmo que ele funciona $ this> _ e com helper. você está certo, a culpa foi minha (eu removi comentário errônea anterior)
Fra