Faire en sorte que le modèle de base de Magento utilise le fichier de traduction de mon module


15

Dans une extension sur laquelle je travaille, j'ai une mise en page XML ajoutée via le module config.xml. Cette disposition a quelques modifications au frontend. Cependant, certains de ces blocs appartiennent aux modules principaux de Magento. Les modèles s'affichent tous correctement comme prévu.

Les modèles que j'ai fournis avec le module lui-même utilisent les fichiers de traduction de mon propre module. Les modèles fournis avec le noyau Magento ne sont pas traduits. Si j'ajoute un fichier de traduction pour le module de base respectif, alors ce fichier de traduction est utilisé et le modèle affiche traduit.

Existe-t-il un moyen de faire en sorte que Magento utilise le fichier de traduction de mon module s'il ne trouve aucun fichier de traduction pour le module principal de Magento? Puis-je faire autre chose ici?


Vous pouvez soit ajouter vos traductions au fichier de traduction du thème actuel, soit utiliser l'interface de traduction en ligne dans le backend.
Dmytro Zavalkin

Je voulais emballer les traductions avec l'extension elle-même, ce qui précède nécessiterait l'ajout d'instructions pour toute personne qui l'installe. Y a-t-il une option où je peux le faire à partir du code?
Mridul Aggarwal

4
Cela dépend de la façon dont la traduction est utilisée dans tempalte, $this->__()ou Mage::helper('...')->__(). Dans le premier cas, vous pouvez forcer le blocage à utiliser votre assistant de traduction. Mais je crois que dans le cas général, la seule option est la mise à niveau des données pour la core_translatetable. Ici, les questions d'internationalisation sont décrites en détail: blog.belvg.com/… .
Dmytro Zavalkin

Voir aussi Évitez la perte de traduction lors du remplacement d'un bloc pour une solution pratique plus simple.
2015

Réponses:


20

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_nameproprié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_nameproprié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_nameproprié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_Catalogmodule), ce qui suit fonctionnerait:

app / locale / Custom.csv :

"Additional Information","More Info, Dude"

Dans votre configuration du module - qui devrait <depends />sur Mage_Catalogpour 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.


@Francesco Cela devrait. Vider le cache de traduction? Si cela ne semble pas fonctionner, veuillez poster ceci comme une nouvelle question (et le lien ici pour la postérité).
benmarks

Je confirme que cela fonctionne à la fois $ this> _ et avec helper. vous avez raison, c'était de ma faute (j'ai supprimé le commentaire erroné précédent)
Fra
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.