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):
- DB (la
core_translatemesa)
- El
translate.csvarchivo de tema
- Los
app/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 activos etc/config.xml. Aquí hay un tutorial del proceso:
Suponga que Magento encuentra la siguiente config.xmlsección:
<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<default>Mage_Catalog.csv</default>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
Y en ese archivo, se especifica la siguiente traducción para la configuración regional configurada para la vista de la tienda actual:
"AAA","BBB"
En estas circunstancias, Magento crea los siguientes registros en la matriz de traducción:
array(
"AAA" => "BBB",
"Mage_Catalog::AAA" => "BBB"
)
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:
array(
"AAA" => "DDD", // This is overwritten by the translate.csv file
"Mage_Catalog::AAA" => "BBB",
"Some_Module::AAA" => "CCC"
)
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í:
// Excerpt from Mage/Core/Block/Abstract.php
public function getModuleName()
{
$module = $this->getData('module_name');
if (is_null($module)) {
$class = get_class($this);
$module = substr($class, 0, strpos($class, '_Block'));
$this->setData('module_name', $module);
}
return $module;
}
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 tipo Mage_Core_Block_Template, Magento primero buscará un Mage_Core::AAAregistro. Si no lo encuentra, recurrirá a la traducción de la clave AAA.
En el escenario de ejemplo, esto dará como resultado la traducción DDD(del translate.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ón Mage_Catalog::AAAy buscaría la traducción AAA.
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:
- ¿El caché de traducción está apagado / actualizado? (Solución: borrar el caché)
- ¿Está el
translate.csvarchivo realmente en el tema de reserva para la tienda actual? (Solución: arreglar la configuración del tema)
- ¿Hay un registro conflictivo para la traducción en la
core_translatetabla? (Solución: elimine el registro conflictivo de core_translate)
- Si todos los puntos anteriores no son la causa, debe haber una traducción conflictiva de un módulo diferente. (Solución: ver abajo)
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 AAAser traducido como a DDDtravés de la traducción del tema, puede hacerlo en su translate.csv:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
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 en config.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, el core/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.
- Algunos detalles técnicos mientras se construye la matriz de traducción
- La posibilidad de utilizar archivos de traducción adicionales para módulos
- Alcance de la vista de la tienda para
core_translateregistros
- Pros y contras utilizando los diferentes métodos de traducción.
Haga una pregunta por separado si se requiere más información.