No importa cómo lo aborde, su problema requiere una solución "creativa", digna de una nota del desarrollador para que los desarrolladores / desarrolladores posteriores la usen. Primero, algunos antecedentes, seguidos de una nota, seguida de una solución fácil y creo que es razonable al final <--
tl; dr .
Como señaló Zyava , la traducción está sujeta al módulo que realiza la traducción. Las plantillas se representan en instancias de bloque, y las instancias de bloque tienen una module_name
propiedad que se utiliza al invocar la traducción; ref Mage_Core_Block_Abstract::__()
:
public function __()
{
$args = func_get_args();
$expr = new Mage_Core_Model_Translate_Expr(array_shift($args), $this->getModuleName());
array_unshift($args, $expr);
return Mage::app()->getTranslator()->translate($args);
}
La module_name
propiedad se deriva (normalmente) según demanda y se basa en el nombre de la clase (ref. ::getModuleName()
):
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;
}
Entonces, si el module_name
propiedad ya está establecida, se aplica la traducción de ese módulo. Para los bloques existentes del diseño principal, esta propiedad se puede establecer a través del diseño XML; por ejemplo:
<default>
<action block="root" method="setModuleName">
<name>Your_Module</name>
</action>
</default>
Voilà! Su módulo CSV posee la traducción para esa instancia. Esto podría ser un enfoque. Por supuesto, todavía existe la situación difícil de que la traducción de otros módulos se aplique a través del asistente específico del módulo en instancias de bloque (incluidos los archivos de plantilla, por supuesto), y siempre es cierto para las traducciones XML de diseño. Además, este enfoque interrumpirá el comportamiento de Salida de los módulos deshabilitados, que utiliza el module_name
parámetro.
Solución
Como resultado, es posible especificar múltiples archivos de traducción para un módulo. No se hace en el núcleo (cada módulo solo declara un archivo .csv ), pero la funcionalidad está ahí Mage_Core_Model_Translate
:
public function getModulesConfig()
{
if (!Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')) {
return array();
}
$config = Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')->children();
if (!$config) {
return array();
}
return $config;
}
y
protected function _loadModuleTranslation($moduleName, $files, $forceReload=false)
{
foreach ($files as $file) {
$file = $this->_getModuleFilePath($moduleName, $file);
$this->_addData($this->_getFileData($file), $moduleName, $forceReload);
}
return $this;
}
Debido a que el contenido de los archivos se fusionó (probé), es posible especificar solo aquellas cadenas que desea anular en sus CSV personalizados. Por ejemplo, si desea traducir la cadena de Información adicional en la página del producto (traducida por el Mage_Catalog
módulo), lo siguiente funcionaría:
app / locale / Custom.csv :
"Additional Information","More Info, Dude"
En su configuración del módulo - que debe <depends />
de Mage_Catalog
asegurar su contenido se fusionan después - la siguiente hará que el Custom.csv pares de traducción de fusión en la parte superior del original:
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<additional>Custom.csv</additional>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
Lo bueno de este enfoque es que puede recopilar sus principales traducciones principales en un solo archivo.