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_GB
etc., bajo el cual tengo los translate.csv
archivos 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_translate
mesa)translate.csv
archivo de temaapp/locale/*/*.csv
archivos¿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/*/*.csv
módulos activosetc/config.xml
. Aquí hay un tutorial del proceso:Suponga que Magento encuentra la siguiente
config.xml
secció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.csv
la 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.csv
archivo 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.csv
registro"AAA","DDD"
llevaría a los siguientes datos de traducción:Por supuesto, los registros en las
translate.csv
nuevas claves de traducción simplemente se agregan a la matriz.Traducciones de bases de datos
Las traducciones de la
core_translate
tabla 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::AAA
registro. 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.csv
archivo).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::AAA
y 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.csv
no está utilizando su traducción de un archivo, siga esta lista de verificación:translate.csv
archivo realmente en el tema de reserva para la tienda actual? (Solución: arreglar la configuración del tema)core_translate
tabla? (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.csv
con el alcance del módulo que realiza la traducción.En el ejemplo, si siempre quiso
AAA
ser traducido como aDDD
travé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_translate
tabla 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.xml
y 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
module
se especifica ningún argumento en el XML, elcore/data
ayudante 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_translate
registrosHaga 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.csv
temas 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:
data
es 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:data
es 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_name
pará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
translate
atributo. También debe agregar elmodule
atributo 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
Translator
objeto 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.xml
archivos en losetc
directorios de módulos.loading
puede ser cualquier cadena pero debe ser globalmente único. Los atributostranslate
ymodule
se utilizan como en otros archivos XML. El valor demessage
y 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
_getTranslatedString
método encontrar lo que está buscando en la matriz de datos?fuente
translate.csv
traduce correctamente/app/design/frontend/package_name/default/template/catalog/product/view.phtml
pero no en/app/design/frontend/package_name/default/template/page/html/topmenu.phtml