Tengo una configuración de paquete de diseño como esta:
design/frontend/package_name/theme_name/locale/
bajo el cual tengo
de_DE, en_GBetc., bajo el cual tengo los translate.csvarchivos correspondientes con las diferentes cadenas:"Key", "Translation"
Estoy tratando de implementar varias cadenas en mi tema usando echo $this->__('Text')
Sin embargo, no parece funcionar (solo veo la cadena dentro de la que se ('Text')muestra). Creo que me falta una comprensión fundamental de cuándo Magento extrae cadenas del CSV para traducirlas. ¿Alguien puede explicar cómo hacer que estos archivos csv funcionen?

Respuestas:
TL; DR
Si no está interesado en los detalles de cómo funciona la traducción, salte el contenido a la sección
Qué verificar si su traducción no funciona a continuación, especialmente la subsección
Solución para conflictos de traducción del alcance del módulo .
Descripción general de la traducción de Magento
Magento prioriza las fuentes de traducción (de mayor a menor):
core_translatemesa)translate.csvarchivo de temaapp/locale/*/*.csvarchivos¿Cómo se construye la matriz de traducción?
Traducciones de módulos
Primero se analizan todos los archivos a partir de los archivos de
app/locale/*/*.csvmódulos activosetc/config.xml. Aquí hay un tutorial del proceso:Suponga que Magento encuentra la siguiente
config.xmlsección:Y en ese archivo, se especifica la siguiente traducción para la configuración regional configurada para la vista de la tienda actual:
En estas circunstancias, Magento crea los siguientes registros en la matriz de traducción:
El segundo valor es la Traducción del alcance del módulo . El nombre del módulo prefijado se toma del nodo XML de configuración que contiene la declaración del archivo de traducción.
Si la misma traducción es especificada nuevamente por un segundo archivo de módulo , por ejemplo, en
Some_Module.csvla traducción es"AAA","CCC", NO SOBRESCRIBIRÁ la"AAA"configuración. En cambio, solo agregará un nuevo registro con el segundo nombre del módulo"Some_Module::AAA" => "CCC".Si el modo desarrollador está habilitado, incluso desarmará el
"AAA"registro si encuentra un segundo registro con la misma clave en la traducción de otro módulo. Esto hace que sea más fácil detectar conflictos de traducción de módulos durante el desarrollo.Traducciones de temas
En segundo lugar, las traducciones cargadas desde el primer
translate.csvarchivo en la reserva de temas para la configuración regional actual simplemente reemplazan los registros existentes en la matriz de traducción.Continuando con el ejemplo anterior, un
translate.csvregistro"AAA","DDD"llevaría a los siguientes datos de traducción:Por supuesto, los registros en las
translate.csvnuevas claves de traducción simplemente se agregan a la matriz.Traducciones de bases de datos
Las traducciones de la
core_translatetabla se fusionan básicamente en la matriz de traducción al igual que las traducciones de temas.Las claves existentes del módulo o las traducciones de temas se sobrescriben con los registros de la base de datos, y se agregan otras nuevas.
Búsqueda de traducción
Cuando
__()se llama al método, Magento primero busca una traducción en una matriz que coincida con el módulo actual.El módulo actual está determinado por el nombre de la clase en la que
__()se llama la clase. Por ejemplo, en bloques, el método responsable se ve así:Los métodos en Helpers and Controllers funcionan de manera correspondiente.
Ejemplos de escenarios de búsqueda
Por ejemplo, digamos que
$this->__('AAA')se llama en un archivo de plantilla. Si el bloque asociado tiene el tipoMage_Core_Block_Template, Magento primero buscará unMage_Core::AAAregistro. Si no lo encuentra, recurrirá a la traducción de la claveAAA.En el escenario de ejemplo, esto dará como resultado la traducción
DDD(deltranslate.csvarchivo).En un escenario diferente, el bloque asociado podría ser
Mage_Catalog_Block_Product_View. En este caso, Magento primero buscaría un registro de traducciónMage_Catalog::AAAy buscaría la traducciónAAA.En efecto, las traducciones del alcance del módulo tienen una prioridad más alta que cualquier traducción genérica . La traducción utilizada depende del módulo de la clase desde que se llama al
__()método.Qué verificar si su traducción no funciona
Si
translate.csvno está utilizando su traducción de un archivo, siga esta lista de verificación:translate.csvarchivo realmente en el tema de reserva para la tienda actual? (Solución: arreglar la configuración del tema)core_translatetabla? (Solución: elimine el registro conflictivo decore_translate)Solución para conflictos de traducción del alcance del módulo
Si encuentra que el caso final es verdadero, simplemente agregue la traducción por segunda vez
translate.csvcon el alcance del módulo que realiza la traducción.En el ejemplo, si siempre quiso
AAAser traducido como aDDDtravés de la traducción del tema, puede hacerlo en sutranslate.csv:En la práctica, solo agrego el alcance del módulo a la traducción si hay un conflicto, es decir, si una traducción no funciona.
Notas adicionales
Traducción en línea
La función de traducción en línea de Magento también agrega las traducciones personalizadas a la
core_translatetabla utilizando el prefijo de alcance del módulo.Compatibilidad con versiones anteriores
La prioridad de las traducciones de temas solía ser mayor que las traducciones de la base de datos hasta la versión 1.3 de Magento más o menos.
Traducción XML
Magento veces evaluar
translate=""argumentos enconfig.xml,system.xmly XML diseño para traducir los valores de nodo secundario.Se puede especificar una clase auxiliar en esos casos utilizando el
module=""argumento para especificar el módulo para el alcance de la traducción.Si no
modulese especifica ningún argumento en el XML, elcore/dataayudante se utiliza para traducir los valores del nodo secundario.Más información
Confieso que pasé por alto algunos detalles del proceso de traducción de Magento en esta publicación, pero solo porque no quiero demasiada información.
core_translateregistrosHaga una pregunta por separado si se requiere más información.
fuente
__()funciona la función.Fuentes de traducción
Las traducciones se fusionan de diferentes fuentes: traducciones de módulos de los archivos XML respectivos, traducciones de
translate.csvtemas del tema actual y traducciones en línea de la base de datos.Las traducciones pueden ser estrictamente específicas del módulo (solo válidas dentro de un módulo), ese es siempre el caso para las traducciones en línea y opcionalmente para las traducciones de temas. Para lograr esto, debe definirlos con el prefijo del módulo en el translate.csv:
Las traducciones de módulos (como
Mage_Catalog.csv) solo son estrictamente específicas del módulo, si el MODO DESARROLLADOR está activado. De lo contrario, la traducción del primer módulo cargado se usa globalmente para todos los módulos que no tienen su propia traducción para el texto.Reuní un diagrama de flujo que muestra cómo cada texto de las diferentes fuentes se fusiona en la matriz de traducción:
dataes la matriz de traducciónEvil Edge Case
Si la cadena traducida es igual a la cadena no traducida, la traducción se ignora. A primera vista, parece una optimización útil, pero de esta manera no se puede traducir fácilmente una cadena sin cambios en un módulo y modificada en otro módulo, porque la traducción modificada será la única y se volverá global.
Búsqueda de traducción
Para qué módulo se busca la traducción, depende del módulo de la clase, en el que
__()se ha llamado al método . Entonces, la búsqueda en la matriz de traducción es la siguiente:dataes la matriz de traducciónDefinicion del alcance
Hay posibilidades de cambiar el módulo para una clase, lo cual es especialmente útil para bloques y ayudantes. La mejor práctica es establecer siempre el nombre del módulo explícitamente al reescribir una clase principal. Cómo funciona, varía entre Helpers, Blocks y Contollers (a partir de Magento CE 1.9.1)
Ejemplo para un bloque:
Para los bloques, también puede establecer el
module_nameparámetro en el diseño XML:Ejemplo para un ayudante:
Para los controladores frontend, puede establecer la propiedad
_realModuleName, para los controladores de administrador_usedModuleName(sí , por coherencia)Otros métodos de traducción
En los archivos XML (config.xml, system.xml, layout) puede especificar si los nodos deben traducirse con el
translateatributo. También debe agregar elmoduleatributo para especificar el alcance, pero aquí el valor debe ser el alias auxiliar , no el nombre del módulo como se indicó anteriormente.En JavaScript puede usar el
Translatorobjeto que está disponible globalmente:pero debe hacer que las traducciones que desea utilizar en JavaScript estén disponibles para el objeto traductor. Esto se hace a través de
jstranslator.xmlarchivos en losetcdirectorios de módulos.loadingpuede ser cualquier cadena pero debe ser globalmente único. Los atributostranslateymodulese utilizan como en otros archivos XML. El valor demessagey su traducción se agrega al objeto JS Translator.Solución de problemas
Incluso si conoce todas las reglas complicadas, a veces es difícil ver por qué algunas traducciones funcionan como están (o no). Para facilitar esto, desarrollé un módulo de "Sugerencias de traducción" que muestra de dónde provienen las traducciones:
Según las publicaciones y diapositivas de mi blog sobre el tema:
fuente
¿Has borrado tu caché?
¿Está su sistema configurado en la configuración regional del archivo que está probando?
¿Puede Magento encontrar el archivo que está buscando cuando carga la traducción del tema (algunos temporales
var_dump; salir; las declaraciones deberían ayudar.¿Puede el
_getTranslatedStringmétodo encontrar lo que está buscando en la matriz de datos?fuente
translate.csvtraduce correctamente/app/design/frontend/package_name/default/template/catalog/product/view.phtmlpero no en/app/design/frontend/package_name/default/template/page/html/topmenu.phtml