¿Por qué las clases usan un ayudante para la traducción en lugar de $ this?

27

En los módulos principales y, a veces, en las plantillas, veo que se usan clases auxiliares para la traducción:

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

¿Por qué es preferible esto a:

$this->__('translate me');
Brendan Falkowski
fuente
Hola Brendan, esta pregunta es excepcionalmente buena y agradezco tu esfuerzo. +1 por eso. Sin embargo, Alanstorm le dará una respuesta válida para su pregunta. Por lo tanto, sería bueno aceptar una respuesta de las respuestas disponibles. Gracias :-)
Rajeev K Tomy
Más poder para tu hermano :-)
Rajeev K Tomy

Respuestas:

24

Solo teorizando, pero cuando llamas

$this->__('Foo')

en una plantilla, ¿qué archivo de traducción CSV de módulo utilizará Magento para traducir Foo?

No siempre está claro qué módulo de ayuda de traducción Magento llamará en última instancia para traducir la cadena / clave. Dado que Magento le permite usar la misma clave en diferentes módulos para diferentes cadenas, a menudo es importante saber qué datos de traducción de módulo está utilizando. De hecho, si se usa una plantilla en varios módulos, el uso $this->__()podría "considerarse dañino", ya que devolvería valores diferentes dependiendo del contexto de bloque en el que el sistema de diseño utilizó la plantilla.

Supongo que los ayudantes de conveniencia se agregaron por adelantado, pero los desarrolladores que construyen las plantillas rápidamente comenzando a crear instancias ayudan para que sepan qué archivo de traducción del módulo traduciría una cadena, y ese patrón se extendió a la prueba del marco. Esta línea de código, en sí misma, es ambigua.

$this->__('Foo');

Pero puede estar seguro de que esta línea de código utilizará la Mage_Cataloginformación de localización.

Mage::helper('catalog')->__('Foo')
Alan Storm
fuente
Hmm, entiendo esa lógica. En la práctica, solo he visto CSV creados dentro del paquete frontend para el tema activo como /locale/{xyz}/translate.csv (no por módulo). He tenido el problema "la cadena existe en diferentes módulos y necesita diferentes traducciones", pero también "esta cadena tiene varias instancias en este módulo y necesita diferentes traducciones" que los ayudantes no resuelven. En general, probablemente pueda seguir con $ this y un CSV por tema.
Brendan Falkowski
@BrendanFalkowski Sí, parece una cosa de "desarrollador de módulos" frente a "desarrollador de temas". Yo diría que te encuentras usando los ayudantes integrados.
Alan Storm
@AlanStorm definitivamente es un voto a favor para ti.
MTM
20

Porque quieres usar un módulo explícito.

Si lo usa $this->__()en un contexto de bloque, el módulo del bloque se usa para la traducción. Entonces, si desea usar un módulo especial, entonces debe usarMage::helper('mymodule')->__()

Fabian Blechschmidt
fuente
1
En todos los casos, las traducciones están vinculadas a un determinado módulo. Cuando llama solo $ this, se refiere al módulo actual y cuando llama al Mage :: helper largo ('mymodule') -> __ () está traduciendo la palabra con ese módulo, como un CSV desde un módulo en lugar de El CSV predeterminado.
mbalparda
Correcto. Si usa un ayudante, lo hace explícito.
Fabian Blechschmidt
1
Sin embargo, ¿cuál es la ventaja de ser explícito? Los CSV de traducción no distinguen entre módulos, ¿o sí? No he oído hablar de ninguna reserva jerárquica / herencia para ellos.
Brendan Falkowski
No, todos los CSV se fusionan, pero puede tener dos ubicaciones diferentes, debido a la Mage_Checkout::My Cartsintaxis. Por lo tanto, es importante qué módulo se utiliza para la traducción
Fabian Blechschmidt
1
Ajá, entonces los ayudantes tienen mucho más sentido para los módulos que en los paquetes frontend, que solo su propio CSV anula el núcleo con el que lidiar.
Brendan Falkowski
9

Básicamente voy a decir lo mismo que dijeron los otros chicos.
Si lo usa Mage::helper(...), asegúrese de que se use un ayudante específico para la traducción.

Por ejemplo, tomemos el Mage_Adminhtml_Block_Catalog_Product_Gridbloque.

Para los encabezados de columna no es lo siguiente: 'header'=> Mage::helper('catalog')->__('Name'),. si en lugar del asistente de catálogo $this->__se hubiera utilizado, el texto se habría traducido utilizando el Mage_Adminhtmlmódulo.

Pero este es un caso donde la lógica detrás del uso de ayudantes con nombre tiene sentido.

Solo quería mostrar un caso en el que el uso en $this->__('..')lugar del enfoque auxiliar puede generar problemas. Yo hablo por experiencia.

Tomemos el bloque Mage_Catalog_Block_Breadcrumbs. Hay una línea que tiene este aspecto: Mage::helper('catalog')->__('Home').

Pensaría que está en el catalogmódulo para poder usarlo $thisen su lugar. Pero, ¿qué pasa si anula el bloque por su bloque llamado Namespace_Module_Block_Breadcrumbs?

Si $thisse usó, entonces el módulo utilizado para la traducción sería Namespace_Moduley probablemente no lo desee.

Hay dos opciones para evitar esto. Ya sea usando un ayudante con nombre como ya sucede para la mayoría de los bloques principales.

O usted como desarrollador puede agregar esto en la clase de bloque:

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

Entonces está seguro de que todos los textos que se usan $this->__desde su bloque (las plantillas que también incluyen el bloque) se traducirán usando el módulo de catálogo.

Marius
fuente
Agradable. La teoría de Breadcrumb fue increíble, me encantó. +1 por eso :-)
Rajeev K Tomy
2

Una razón (que es solo mi percepción), cuando usa helper, es más específico sobre el archivo de traducción, Mage::helper('catalog')ya que encontrará la oración en el archivo de catálogo, mientras que cuando la use $thisbuscará aleatoriamente en todos los archivos de traducción. Eso es lo que pienso.

MTM
fuente