Fai in modo che il modello principale di magento usi il file di traduzione del mio modulo


15

In un'estensione su cui sto lavorando, ho un XML di layout aggiunto tramite il modulo config.xml. Questo layout presenta alcune modifiche al frontend. Alcuni di questi blocchi, tuttavia, appartengono ai moduli core di Magento. Tutti i modelli vengono visualizzati correttamente come previsto.

I modelli che ho impacchettato con il modulo stesso stanno usando i file di traduzione del mio modulo. I modelli impacchettati con il core di Magento mostrano non tradotti. Se aggiungo un file di traduzione per il rispettivo modulo principale, viene utilizzato quel file di traduzione e il modello viene tradotto.

C'è un modo per fare in modo che Magento usi il file di traduzione del mio modulo se non riesce a trovare alcun file di traduzione per il modulo principale di Magento? C'è qualcos'altro che posso fare qui?


Puoi aggiungere le tue traduzioni al file di traduzione del tema corrente o utilizzare l'interfaccia di traduzione in linea nel backend.
Dmytro Zavalkin,

Volevo impacchettare le traduzioni con l'estensione stessa, quanto sopra avrebbe richiesto l'aggiunta di istruzioni per chiunque lo installasse. C'è qualche opzione in cui posso farlo dal codice?
Mridul Aggarwal,

4
Dipende da come viene usata la traduzione in tempalte $this->__()o Mage::helper('...')->__(). Nel primo caso puoi forzare il blocco a usare il tuo aiutante di traduzione. Ma credo in generale che l'unica opzione sia l'aggiornamento dei dati per la core_translatetabella. Qui le domande di internazionalizzazione sono descritte in dettaglio: blog.belvg.com/… .
Dmytro Zavalkin,

Vedi anche Evitare la perdita di traduzione durante la sovrascrittura di un blocco per una soluzione pratica più semplice.
Hakre,

Risposte:


20

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_nameproprietà 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_nameproprietà è (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_nameproprietà è 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_nameparametro

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_Catalogmodulo), funzionerebbe quanto segue:

app / locale / Custom.csv :

"Additional Information","More Info, Dude"

Nel modulo di configurazione - che dovrebbe <depends />su Mage_Catalogdi 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.


@Francesco Dovrebbe. Cancella cache di traduzione? Se sembra non funzionare, si prega di pubblicare questo come una nuova domanda (e link qui per i posteri).
benmarks

Confermo che funziona sia $ this> _ che con helper. hai ragione, è stata colpa mia (ho rimosso il precedente commento errato)
Fra
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.