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_translate
mesa)
- El
translate.csv
archivo de tema
- Los
app/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 activos etc/config.xml
. Aquí hay un tutorial del proceso:
Suponga que Magento encuentra la siguiente config.xml
secció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.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:
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.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í:
// 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::AAA
registro. 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.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ón Mage_Catalog::AAA
y 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.csv
no 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.csv
archivo 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_translate
tabla? (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 AAA
ser traducido como a DDD
travé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_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 en config.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, el core/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.
- 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_translate
registros
- Pros y contras utilizando los diferentes métodos de traducción.
Haga una pregunta por separado si se requiere más información.