TL; DR
Se você não estiver interessado nos detalhes de como a tradução funciona, pule o conteúdo até a seção
O que verificar se a sua tradução não está funcionando abaixo, especialmente a subseção
Solução para tradução do escopo do módulo .
Visão Geral da Tradução Magento
O Magento prioriza as fontes de tradução (do mais alto para o mais baixo):
- DB (a
core_translate
tabela)
- O
translate.csv
arquivo do tema
- Os
app/locale/*/*.csv
arquivos
Como é construída a matriz de tradução?
Traduções de módulos
Primeiro, todos os arquivos app/locale/*/*.csv
mencionados nos etc/config.xml
arquivos dos módulos ativos são analisados. Aqui está uma explicação passo a passo do processo:
Suponha que o Magento encontre a seguinte config.xml
seção:
<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<default>Mage_Catalog.csv</default>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
E nesse arquivo, a seguinte tradução é especificada para o código do idioma configurado para a exibição atual da loja:
"AAA","BBB"
Nessas circunstâncias, o Magento cria os seguintes registros na matriz de conversão:
array(
"AAA" => "BBB",
"Mage_Catalog::AAA" => "BBB"
)
O segundo valor é a conversão do escopo do módulo . O nome do módulo prefixado é obtido do nó XML de configuração que contém a declaração do arquivo de conversão.
Se a mesma tradução for especificada novamente por um segundo arquivo de módulo , por exemplo, na Some_Module.csv
tradução "AAA","CCC"
, NÃO SUBSTITUIRÁ a "AAA"
configuração. Em vez disso, ele adicionará apenas um novo registro com o segundo nome do módulo "Some_Module::AAA" => "CCC"
.
Se o modo de desenvolvedor é habilitado, ele mesmo irá resetar o "AAA"
registro se ele encontra um segundo disco com a mesma chave em outra tradução módulo. Isso facilita identificar conflitos de conversão de módulos durante o desenvolvimento.
Traduções Temáticas
Segundo, as traduções carregadas do primeiro translate.csv
arquivo no fallback de tema para o código do idioma atual simplesmente substituem os registros existentes na matriz de conversão.
Portanto, continuando o exemplo anterior, um translate.csv
registro "AAA","DDD"
levaria aos seguintes dados de conversão:
array(
"AAA" => "DDD", // This is overwritten by the translate.csv file
"Mage_Catalog::AAA" => "BBB",
"Some_Module::AAA" => "CCC"
)
É claro que os registros nas translate.csv
novas chaves de conversão são simplesmente adicionados à matriz.
Traduções de banco de dados
As traduções da core_translate
tabela são basicamente mescladas na matriz de tradução, assim como as traduções do tema.
As chaves existentes das traduções do módulo ou do tema são substituídas pelos registros do banco de dados, novas são adicionadas.
Pesquisa de tradução
Quando o __()
método é chamado, o Magento primeiro procura uma tradução em array que corresponda ao módulo atual.
O módulo atual é determinado pelo nome da classe em que a __()
classe é chamada. Por exemplo, em blocos, o método responsável se parece com isso:
// Excerpt from Mage/Core/Block/Abstract.php
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;
}
Os métodos em auxiliares e controladores funcionam de maneira correspondente.
Cenários de pesquisa de exemplo
Por exemplo, digamos que $this->__('AAA')
seja chamado em um arquivo de modelo. Se o bloco associado tiver o tipo Mage_Core_Block_Template
, o Magento primeiro procurará um Mage_Core::AAA
registro. Se não o encontrar, retornará à tradução da chave AAA
.
No cenário de exemplo, isso resultará na tradução DDD
(do translate.csv
arquivo).
Em um cenário diferente, o bloco associado poderia estar Mage_Catalog_Block_Product_View
. Nesse caso, o Magento primeiro procuraria um registro de tradução Mage_Catalog::AAA
e encontraria a tradução AAA
.
Portanto, as traduções do escopo do módulo têm uma prioridade mais alta que as traduções genéricas . Qual tradução é usada depende de qual módulo a classe está chamando o __()
método.
O que verificar se sua tradução não está funcionando
Se sua tradução de um translate.csv
arquivo não estiver sendo usada, siga esta lista de verificação:
- O cache de tradução está desativado / atualizado? (Solução: limpe o cache)
- O
translate.csv
arquivo está realmente no fallback de tema da loja atual? (Solução: corrija a configuração do tema)
- Existe um registro conflitante para a tradução na
core_translate
tabela? (Solução: remova o registro conflitante de core_translate
)
- Se todos os pontos anteriores não forem a causa, deve haver uma tradução conflitante de um módulo diferente. (Solução: veja abaixo)
Solução para conflitos de conversão de escopo de módulo
Se você achar que o caso final é verdadeiro, basta adicionar a tradução uma segunda vez ao seu translate.csv
com o escopo do módulo que está fazendo a tradução.
No exemplo, se você sempre quis AAA
ser traduzido como DDD
através da tradução do tema, você pode fazer isso no seu translate.csv
:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
Na prática, apenas adiciono o escopo do módulo à tradução se houver um conflito, ou seja, se uma tradução não estiver funcionando.
Notas Adicionais
Tradução Inline
O recurso de tradução em linha do Magento também adiciona as traduções personalizadas à core_translate
tabela usando o prefixo do escopo do módulo.
Compatibilidade com versões anteriores
A prioridade das traduções do tema costumava ser maior que as traduções do banco de dados até o Magento versão 1.3 ou mais.
Tradução XML
Magento, por vezes, avaliar translate=""
argumentos config.xml
, system.xml
e XML disposição para traduzir valores nó filho.
Uma classe auxiliar pode ser especificada nesses casos usando o module=""
argumento para especificar o módulo para o escopo da conversão.
Se nenhum module
argumento for especificado no XML, o core/data
auxiliar será usado para converter os valores do nó filho.
Outras informações
Confesso que encobri alguns detalhes do processo de tradução do Magento neste post, mas apenas porque não quero muita informação.
- Alguns detalhes técnicos enquanto a matriz de tradução é criada
- A possibilidade de usar arquivos de tradução adicionais para módulos
- Escopo da visualização da loja para
core_translate
registros
- Prós e contras usando os diferentes métodos de tradução
Faça uma pergunta separada, se mais informações forem necessárias.