Por que as classes usam um auxiliar para tradução em vez de $ this?

27

Nos módulos principais e, às vezes, nos modelos, vejo as classes auxiliares sendo usadas para tradução:

Mage::helper('someModule')->__('translate me');

Por que isso é preferível a:

$this->__('translate me');
Brendan Falkowski
fonte
Hey Brendan, esta pergunta é excepcionalmente boa e agradeço seu esforço. +1 para isso. No entanto, o Alanstorm fornece uma resposta válida para sua pergunta. Portanto, seria bom aceitar uma resposta das respostas disponíveis. Obrigado :-)
Rajeev K Tomy
Mais poder para você irmão :-)
Rajeev K Tomy

Respostas:

24

Apenas teorizando, mas quando você chama

$this->__('Foo')

em um modelo, qual arquivo de tradução CSV do módulo o Magento usará para traduzir o Foo?

Nem sempre é claro qual assistente de tradução do módulo o Magento chamará para traduzir a string / chave. Como o Magento permite que você use a mesma chave em módulos diferentes para strings diferentes, geralmente é importante saber quais dados de tradução do módulo você está usando. De fato, se um modelo for usado em vários módulos, o uso $this->__()poderá ser "considerado prejudicial", pois retornaria valores diferentes, dependendo do contexto do bloco no qual o sistema de layout usou o modelo.

Meu palpite é que os auxiliares de conveniência foram adicionados com antecedência, mas os desenvolvedores que criaram os modelos rapidamente iniciam a instanciação de ajuda, para que soubessem qual arquivo de tradução do módulo traduziria uma string e esse padrão se espalhou para o teste da estrutura. Essa linha de código, por si só, é ambígua.

$this->__('Foo');

Mas você pode ter certeza de que essa linha de código usará as Mage_Cataloginformações de localização.

Mage::helper('catalog')->__('Foo')
Alan Storm
fonte
Hmm, eu entendo essa lógica. Na prática, só vi CSVs criados no pacote frontend para o tema ativo como /locale/{xyz}/translate.csv (não por módulo). Eu tive o problema "a string existe em diferentes módulos e precisa de traduções diferentes", mas também "essa string tem várias instâncias neste módulo e precisa de traduções diferentes", que os ajudantes não resolvem. Geralmente, eu provavelmente posso ficar com $ this e um CSV por tema.
Brendan Falkowski
@BrendanFalkowski Sim, parece uma coisa de "desenvolvedor de módulos" vs. "desenvolvedor de temas". Eu diria que você encontra usando os auxiliares integrados.
Alan Storm
@AlanStorm definitivamente um voto positivo para você.
MTM
20

Porque você deseja usar um módulo explícito.

If you use $this->__() in a block context, the module of the block is used for translation. So if you want to use a special module, then you have to use Mage::helper('mymodule')->__()

Fabian Blechschmidt
fonte
11
Em todos os casos, as traduções estão vinculadas a um determinado módulo. Ao chamar apenas $ this, você está se referindo ao módulo atual e ao chamar o Mage :: helper longo ('mymodule') -> __ () está traduzindo a palavra com esse módulo, exatamente como um CSV de um módulo em vez de o CSV padrão.
Mbalparda
Corrigir. Se você usa um auxiliar, você o torna explícito.
Fabian Blechschmidt
11
Qual é a vantagem de ser explícito? Os CSVs de tradução não fazem distinção entre módulos, ou fazem? Não ouvi falar de nenhum substituto de hierarquia / herança para eles.
Brendan Falkowski
Não, todos os CSVs são mesclados, mas você pode ter dois locais diferentes, devido à Mage_Checkout::My Cartsintaxe. E por isso é importante que o módulo é utilizado para tradução
Fabian Blechschmidt
11
Ah, então os auxiliares fazem muito mais sentido para os módulos do que nos pacotes de front-end, os quais apenas seu próprio CSV substitui o núcleo com o qual lidar.
Brendan Falkowski
9

Basicamente, vou dizer a mesma coisa que os outros caras disseram.
Se você usar, Mage::helper(...)verifique se um auxiliar específico é usado para tradução.

Por exemplo, vamos pegar o Mage_Adminhtml_Block_Catalog_Product_Gridbloco.

Para os cabeçalhos das colunas não é o seguinte: 'header'=> Mage::helper('catalog')->__('Name'),. se ao invés do auxiliar de catálogo $this->__tivesse sido usado, o texto teria sido traduzido usando o Mage_Adminhtmlmódulo.

Mas este é um caso em que a lógica por trás do uso de ajudantes nomeados faz sentido.

Eu só queria mostrar um caso em que o uso, em $this->__('..')vez da abordagem auxiliar, pode levar a problemas. Eu falo por experiência própria.

Vamos pegar o bloco Mage_Catalog_Block_Breadcrumbs. Existe uma linha parecida com esta: Mage::helper('catalog')->__('Home').

Você pensaria que está no catalogmódulo para poder usá-lo $this. Mas e se você substituir o bloco pelo seu chamado Namespace_Module_Block_Breadcrumbs?

Se $thisfoi usado, o módulo usado para tradução seria Namespace_Modulee você provavelmente não quer isso.

Existem duas opções para evitar isso. Ou usando um auxiliar nomeado, como já acontece na maioria dos blocos principais.

Ou você, como desenvolvedor, pode adicionar isso na classe de bloco:

public function getModuleName() {
    return 'Mage_Catalog';
}

Então, você tem certeza de que todos os textos usados $this->__em seu bloco (modelos que também incluem o bloco) serão traduzidos usando o módulo de catálogo.

Marius
fonte
Agradável. A teoria da trilha de navegação era incrível. +1 para isso :-)
Rajeev K Tomy 04/02
2

Uma razão (que é apenas a minha percepção): quando você usa o helper, é mais específico sobre o arquivo de tradução, como se Mage::helper('catalog')ele encontrasse a frase no arquivo de catálogo, enquanto que quando você o usa $thispesquisaria aleatoriamente todos os arquivos de tradução. Isso é o que eu acho.

MTM
fonte