Indipendentemente da come lo approcci, il tuo problema richiede una soluzione "creativa", degna di una nota per gli sviluppatori da utilizzare per gli sviluppatori / manutentori successivi. In primo luogo, alcuni retroscena, seguiti da una nota, seguiti da una soluzione facile e penso ragionevole alla fine <--
tl; dr .
Come ha sottolineato Zyava , la traduzione è soggetta al modulo che esegue la traduzione. I modelli vengono visualizzati in istanze di blocco e le istanze di blocco hanno una module_name
proprietà che viene utilizzata quando si richiama la traduzione; rif 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
proprietà è (normalmente) derivata su richiesta e in base al nome della classe (rif. ::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;
}
Quindi, se la module_name
proprietà è già impostato, che di traduzione modulo si applica. Per i blocchi esistenti dal layout principale, questa proprietà può essere impostata tramite XML layout; per esempio:
<default>
<action block="root" method="setModuleName">
<name>Your_Module</name>
</action>
</default>
Ecco! Il tuo modulo CSV possiede la traduzione per quell'istanza. Questo potrebbe essere un approccio. Ovviamente, esiste ancora la difficile situazione della traduzione di altri moduli applicata tramite l'helper specifico del modulo in istanze di blocco (compresi ovviamente i file modello), ed è sempre vero per le traduzioni XML di layout. Inoltre, questo approccio interromperà il comportamento Disable Modules Output, che utilizza il module_name
parametro
Soluzione
A quanto pare, è possibile specificare più file di traduzione per un modulo. Non è fatto nel core (ogni modulo dichiara solo un file .csv ), ma la funzionalità è presente in 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;
}
e
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;
}
Poiché i contenuti dei file sono uniti (ho testato), è possibile specificare solo le stringhe che si desidera sovrascrivere nei CSV personalizzati. Ad esempio, se si desidera tradurre la stringa di informazioni aggiuntive nella pagina del prodotto (tradotta dal Mage_Catalog
modulo), funzionerebbe quanto segue:
app / locale / Custom.csv :
"Additional Information","More Info, Dude"
Nel modulo di configurazione - che dovrebbe <depends />
su Mage_Catalog
di assicurare il suo contenuto si fondono dopo - il seguente farà sì che i Custom.csv coppie di traduzione a fusione in cima al originale:
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<additional>Custom.csv</additional>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
La cosa bella di questo approccio è che puoi raccogliere le tue traduzioni principali prevalenti in un unico file.