Quelle que soit la façon dont vous l'abordez, votre problème nécessite une solution "créative", digne d'une note de développeur pour les développeurs / mainteneurs suivants. Tout d'abord, quelques informations de base, suivies d'une note, suivies d'une solution facile et je pense raisonnable à la fin <--
tl; dr .
Comme l'a souligné Zyava , la traduction est soumise au module qui effectue la traduction. Les modèles s'affichent dans des instances de bloc et les instances de bloc ont une module_name
propriété qui est utilisée lors de l'appel de la traduction; réf 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
propriété est (normalement) dérivée sur demande et basée sur le nom de la classe (réf. ::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;
}
Donc, si la module_name
propriété est déjà définie, cette traduction de module s'applique. Pour les blocs existants de la disposition principale, cette propriété peut être définie via XML de disposition; par exemple:
<default>
<action block="root" method="setModuleName">
<name>Your_Module</name>
</action>
</default>
Voilà! Votre module CSV possède la traduction de cette instance. Cela pourrait être une approche. Bien sûr, il y a toujours la situation délicate de la traduction d'autres modules appliquée via l'aide spécifique au module dans les instances de bloc (y compris les fichiers de modèle bien sûr), et c'est toujours vrai pour les traductions XML de mise en page. En outre, cette approche interrompra le comportement de sortie des modules désactivés, qui utilise la propriétémodule_name
paramètre.
Solution
Il s'avère qu'il est possible de spécifier plusieurs fichiers de traduction pour un module. Ce n'est pas fait dans le noyau (chaque module ne déclare qu'un seul fichier .csv ), mais la fonctionnalité est là dans 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;
}
et
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;
}
Étant donné que le contenu des fichiers est fusionné (j'ai testé), il est possible de spécifier uniquement les chaînes que vous souhaitez remplacer dans vos CSV personnalisés. Par exemple, si vous souhaitez traduire la chaîne d' informations supplémentaires sur la page du produit (traduite par le Mage_Catalog
module), ce qui suit fonctionnerait:
app / locale / Custom.csv :
"Additional Information","More Info, Dude"
Dans votre configuration du module - qui devrait <depends />
sur Mage_Catalog
pour assurer son contenu après fusion - ce qui suit provoque les Custom.csv paires de traduction pour la fusion au - dessus de l'original:
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<additional>Custom.csv</additional>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
La bonne chose à propos de cette approche est que vous pouvez collecter vos traductions principales de remplacement dans un fichier.