Eu tenho uma configuração de pacote de design assim:
design/frontend/package_name/theme_name/locale/
sob o qual eu tenho
de_DE
, en_GB
etc, nos quais tenho translate.csv
arquivos correspondentes com as várias strings:"Key", "Translation"
Eu estou tentando implementar várias seqüências de caracteres no meu tema usando echo $this->__('Text')
No entanto, parece não funcionar (só vejo a string dentro da ('Text')
tela exibida). Eu acho que estou perdendo algum entendimento fundamental de quando o Magento extrai strings do CSV para ser traduzido. Alguém pode explicar como fazer com que esses arquivos csv funcionem?
Respostas:
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):
core_translate
tabela)translate.csv
arquivo do temaapp/locale/*/*.csv
arquivosComo é construída a matriz de tradução?
Traduções de módulos
Primeiro, todos os arquivos
app/locale/*/*.csv
mencionados nosetc/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:E nesse arquivo, a seguinte tradução é especificada para o código do idioma configurado para a exibição atual da loja:
Nessas circunstâncias, o Magento cria os seguintes registros na matriz de conversão:
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:É 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: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 tipoMage_Core_Block_Template
, o Magento primeiro procurará umMage_Core::AAA
registro. Se não o encontrar, retornará à tradução da chaveAAA
.No cenário de exemplo, isso resultará na tradução
DDD
(dotranslate.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çãoMage_Catalog::AAA
e encontraria a traduçãoAAA
.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:translate.csv
arquivo está realmente no fallback de tema da loja atual? (Solução: corrija a configuração do tema)core_translate
tabela? (Solução: remova o registro conflitante decore_translate
)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 comoDDD
através da tradução do tema, você pode fazer isso no seutranslate.csv
: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=""
argumentosconfig.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, ocore/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.
core_translate
registrosFaça uma pergunta separada, se mais informações forem necessárias.
fonte
__()
função funciona.Fontes de tradução
As traduções são mescladas de diferentes fontes: traduções de módulo dos respectivos arquivos XML, traduções de temas do
translate.csv
tema atual e traduções embutidas do banco de dados.As traduções podem ser estritamente específicas do módulo (válidas apenas dentro de um módulo), esse é sempre o caso das traduções inline e, opcionalmente, das traduções dos temas. Para conseguir isso, você deve defini-los com o prefixo do módulo no translate.csv:
As traduções dos módulos (como
Mage_Catalog.csv
) são estritamente específicas do módulo, se o DEVELOPER MODE estiver ativado. Caso contrário, a tradução do primeiro módulo carregado é usada globalmente para todos os módulos que não têm sua própria tradução para o texto.Eu montei um fluxograma que mostra como cada texto de diferentes fontes é mesclado na matriz de tradução:
data
é a matriz de traduçãoEvil Edge Case
Se a sequência traduzida for igual à sequência não traduzida, a tradução será ignorada. Parece uma otimização útil à primeira vista, mas dessa maneira você não pode traduzir facilmente uma string inalterada em um módulo e alterada em outro módulo, porque a tradução alterada será a única e se tornará global.
Pesquisa de tradução
Para qual módulo a tradução é procurada, depende do módulo da classe, no qual o método
__()
foi chamado. Em seguida, a pesquisa na matriz de conversão é a seguinte:data
é a matriz de traduçãoDefinição de escopo
Existem possibilidades de alterar o módulo para uma classe, o que é especialmente útil para blocos e auxiliares. A melhor prática é sempre definir o nome do módulo explicitamente ao reescrever uma classe principal. Como funciona, varia entre auxiliares, blocos e controladores (a partir do Magento CE 1.9.1)
Exemplo para um bloco:
Para blocos, você também pode definir o
module_name
parâmetro no XML do layout:Exemplo para um ajudante:
Para controladores de front-end, você pode definir a propriedade
_realModuleName
, para controladores de administrador,_usedModuleName
(yay por consistência)Outros métodos de tradução
Nos arquivos XML (config.xml, system.xml, layout), você pode especificar se os nós devem ser traduzidos com o
translate
atributo Você também deve adicionar omodule
atributo para especificar o escopo, mas aqui o valor deve ser o alias auxiliar , não o nome do módulo, como acima.Em JavaScript, você pode usar o
Translator
objeto que está disponível globalmente:mas você precisa disponibilizar as traduções que deseja usar em JavaScript para o objeto tradutor. Isso é feito através de
jstranslator.xml
arquivos nosetc
diretórios dos módulos.loading
pode ser qualquer string, mas deve ser globalmente exclusivo. Os atributostranslate
emodule
são usados como em outros arquivos XML. O valor demessage
e sua conversão são adicionados ao objeto JS Translator.Solução de problemas
Mesmo que você conheça todas as regras complicadas, às vezes é difícil perceber por que algumas traduções estão funcionando como estão (ou não). Para facilitar, desenvolvi um módulo "Translation Hints", que mostra de onde vêm as traduções:
Com base nos meus posts e slides sobre o tópico:
fonte
Você limpou seu cache?
Seu sistema está definido para o código do idioma do arquivo que você está testando?
O Magento pode encontrar o arquivo que está procurando quando carrega a tradução do tema (algumas
var_dump
instruções temporárias ; exit; exit devem ajudar.O
_getTranslatedString
método pode encontrar o que está procurando na matriz de dados?fonte
translate.csv
traduz adequadamente em/app/design/frontend/package_name/default/template/catalog/product/view.phtml
, mas não em/app/design/frontend/package_name/default/template/page/html/topmenu.phtml