Comment implémenter les traductions dans le package de modèle de conception CSV? Comment fonctionne echo $ this -> __ ('Text')?


29

J'ai une configuration de package de conception comme ceci:

design/frontend/package_name/theme_name/locale/

sous lequel j'ai

de_DE, en_GBetc, sous lequel j'ai des translate.csvfichiers correspondants avec les différentes chaînes:"Key", "Translation"

J'essaie d'implémenter différentes chaînes dans mon thème en utilisant echo $this->__('Text')

Cependant, cela ne semble pas fonctionner (je ne vois que la chaîne à l'intérieur de l' ('Text')affichage). Je pense que je manque une compréhension fondamentale du moment où Magento extrait des chaînes du CSV pour être traduit. Quelqu'un peut-il expliquer comment faire fonctionner ces fichiers csv?


Quelle version de Magento utilisez-vous?
philwinkle

J'utilise Magento v: 1.7.0.2
waffl

Appelez-vous cela en dehors d'un fichier de modèle magento normal? Peut-être que vous devez appeler la classe d'assistance et en faire quelque chose comme <? Php echo Mage :: helper ('core') -> __ ('Text'); ?> Essayez également d'activer "Traduire en ligne" sur l'interface dans Système> Configuration> Développeur
SaveTheMage

Réponses:


84

TL; DR

Si vous n'êtes pas intéressé par les détails du fonctionnement de la traduction, passez le contenu à la section
Que vérifier si votre traduction ne fonctionne pas ci-dessous, en particulier la sous-section
Solution pour les conflits de traduction de la portée du module .

Présentation de la traduction de Magento

Magento priorise les sources de traductions (du plus haut au plus bas):

  1. DB (la core_translatetable)
  2. Le translate.csvdossier thématique
  3. Les app/locale/*/*.csvfichiers

Comment est construit le tableau de traduction?

Traductions de module

Tout d'abord, tous les fichiers app/locale/*/*.csvqui sont référencés à partir des etc/config.xmlfichiers des modules actifs sont analysés. Voici une procédure pas à pas du processus:
Supposons que Magento trouve la config.xmlsection suivante :

<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
    <translate>
        <modules>
            <Mage_Catalog>
                <files>
                    <default>Mage_Catalog.csv</default>
                </files>
            </Mage_Catalog>
        </modules>
    </translate>
</frontend>

Et dans ce fichier, la traduction suivante est spécifiée pour les paramètres régionaux configurés pour la vue de magasin actuelle:

"AAA","BBB"

Dans ces circonstances, Magento crée les enregistrements suivants dans le tableau de traduction:

array(
    "AAA" => "BBB",
    "Mage_Catalog::AAA" => "BBB"
)

La deuxième valeur est la traduction de la portée du module . Le nom du module préfixé provient du nœud XML de configuration contenant la déclaration du fichier de traduction.

Si la même traduction est spécifiée à nouveau par un deuxième fichier de module , par exemple dans Some_Module.csvla traduction "AAA","CCC", elle n'écrasera PAS le "AAA"paramètre. Au lieu de cela, il n'ajoutera qu'un nouvel enregistrement avec le deuxième nom de module "Some_Module::AAA" => "CCC".

Si le mode développeur est activé, il supprimera même l' "AAA"enregistrement s'il trouve un deuxième enregistrement avec la même clé dans une autre traduction de module. Cela facilite la détection des conflits de traduction de modules pendant le développement.

Traductions thématiques

Deuxièmement, les traductions chargées à partir du premier translate.csvfichier dans le repli du thème pour les paramètres régionaux actuels remplacent simplement les enregistrements existants dans le tableau de traduction.
Ainsi, en poursuivant l'exemple précédent, un translate.csvenregistrement "AAA","DDD"entraînerait les données de traduction suivantes:

array(
    "AAA" => "DDD", // This is overwritten by the translate.csv file
    "Mage_Catalog::AAA" => "BBB",
    "Some_Module::AAA" => "CCC"
)

Bien sûr, les enregistrements translate.csvavec les nouvelles clés de traduction sont simplement ajoutés au tableau.

Traductions de bases de données

Les traductions de la core_translatetable sont fondamentalement fusionnées dans le tableau de traduction, tout comme les traductions de thème.
Les clés existantes des traductions du module ou du thème sont écrasées par les enregistrements de la base de données, de nouvelles sont ajoutées.

Recherche de traduction

Lorsque la __()méthode est appelée, Magento recherche d'abord une traduction dans le tableau correspondant au module actuel.
Le module actuel est déterminé par le nom de classe sur lequel la __()classe est appelée. Par exemple, en blocs, la méthode responsable ressemble à ceci:

// Excerpt from Mage/Core/Block/Abstract.php
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;
}

Les méthodes des Assistants et Contrôleurs fonctionnent en conséquence.

Exemples de scénarios de recherche

Pour un exemple, disons $this->__('AAA')est appelé dans un fichier modèle. Si le bloc associé a le type Mage_Core_Block_Template, Magento recherchera d'abord un Mage_Core::AAAenregistrement. S'il ne le trouve pas, il reviendra à la traduction de la clé AAA.
Dans l'exemple de scénario, cela entraînera la traduction DDD(à partir du translate.csvfichier).

Dans un scénario différent, le bloc associé pourrait être Mage_Catalog_Block_Product_View. Dans ce cas, Magento vérifierait d'abord un enregistrement de traduction Mage_Catalog::AAAet trouverait la traduction AAA.

Ainsi, en effet, les traductions de la portée du module ont une priorité plus élevée que les traductions génériques . La traduction utilisée dépend du module utilisé par la classe pour appeler la __()méthode.

Que vérifier si votre traduction ne fonctionne pas

Si votre traduction à partir d'un translate.csvfichier n'est pas utilisée, suivez cette liste de contrôle:

  1. Le cache de traduction est-il désactivé / actualisé? (Solution: vider le cache)
  2. Le translate.csvfichier est-il vraiment dans le thème de remplacement du magasin actuel? (Solution: correction de la configuration du thème)
  3. Y a-t-il un enregistrement contradictoire pour la traduction dans le core_translatetableau? (Solution: supprimez l'enregistrement en conflit de core_translate)
  4. Si tous les points précédents ne sont pas la cause, il doit y avoir une traduction en conflit à partir d'un module différent. (Solution: voir ci-dessous)

Solution pour les conflits de traduction de la portée du module

Si vous trouvez que le cas final est vrai, ajoutez simplement la traduction une deuxième fois à votre translate.csv avec la portée du module du module faisant la traduction.
Dans l'exemple, si vous avez toujours voulu AAAêtre traduit comme DDDvia la traduction du thème, vous pouvez le faire dans votre translate.csv:

"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"

En pratique, j'ajoute la portée du module à la traduction uniquement en cas de conflit, c'est-à-dire si une traduction ne fonctionne pas.

Notes complémentaires

Traduction en ligne

La fonction de traduction en ligne de Magento ajoute également les traductions personnalisées au core_translatetableau à l'aide du préfixe de portée du module.

Rétrocompatibilité

La priorité des traductions de thème était plus élevée que les traductions de base de données jusqu'à la version 1.3 de Magento.

Traduction XML

Magento évaluer parfois des translate=""arguments dans config.xml, system.xmlet XML de mise en page pour traduire les valeurs de nœud enfant.
Une classe d'assistance peut être spécifiée dans ces cas en utilisant l' module=""argument pour spécifier le module pour la portée de traduction.
Si aucun moduleargument n'est spécifié dans le XML, l' core/dataassistant est utilisé pour traduire les valeurs du nœud enfant.

Plus d'informations

J'avoue avoir passé sous silence certains détails du processus de traduction de Magento dans ce post, mais uniquement parce que je ne veux pas trop d'informations.

  • Quelques détails techniques lors de la construction du tableau de traduction
  • La possibilité d'utiliser des fichiers de traduction supplémentaires pour les modules
  • Étendue de la vue de magasin pour les core_translateenregistrements
  • Avantages et inconvénients des différentes méthodes de traduction

Veuillez poser une question distincte si plus d'informations sont nécessaires.


1
D'accord, je suis vraiment désolé pour tout le monde, mais quelqu'un d'autre a ouvert les caches sans me le dire ... Probablement au moment où j'ai commencé à travailler sur les traductions. Soupir. Ces informations ont été incroyablement utiles pour ma compréhension du processus de traduction dans Magento. Merci beaucoup, cela répond définitivement à toutes les questions que j'avais sur le __()fonctionnement de la fonction.
waffl

Un assez bon aperçu de l'architecture de traduction de Magento peut également être trouvé ici: gist.github.com/antonmakarenko/7538216
thdoan

@Vinai, excellente réponse. Cela m'a vraiment aidé à résoudre un problème de traduction sur lequel j'ai posté une question ici . Étonnamment, Mage_Tax était en conflit avec les traductions de mon thème, ce qui semble contraire à la façon dont Magento est censé prioriser les traductions
Holly

14

Sources de traduction

Les traductions sont fusionnées à partir de différentes sources: traductions de module à partir des fichiers XML respectifs, traductions de thème à partir du translate.csvthème actuel et traductions en ligne à partir de la base de données.

Les traductions peuvent être strictement spécifiques au module (uniquement valables dans un module), c'est toujours le cas pour les traductions en ligne et éventuellement pour les traductions de thèmes. Pour ce faire, vous devez les définir avec le préfixe du module dans le translate.csv:

"Mage_Catalog::Add to cart","In die Einkaufstüte legen"

Les traductions des modules (comme Mage_Catalog.csv) ne sont strictement spécifiques au module que si le MODE DÉVELOPPEUR est activé. Sinon, la traduction du premier module chargé est utilisée globalement pour tous les modules qui n'ont pas leur propre traduction pour le texte.

J'ai assemblé un organigramme qui montre comment chaque texte des différentes sources est fusionné dans le tableau de traduction:

Fusion de traduction data est le tableau de traduction

Étui Evil Edge

Si la chaîne traduite est égale à la chaîne non traduite, la traduction est ignorée. Cela semble être une optimisation utile à première vue, mais de cette façon, vous ne pouvez pas facilement traduire une chaîne inchangée dans un module et modifiée dans un autre module, car la traduction modifiée sera la seule et deviendra globale.

Recherche de traduction

Pour quel module la traduction est recherchée, cela dépend du module de la classe, sur laquelle la méthode __()a été appelée. Ensuite, la recherche dans le tableau de traduction est la suivante:

Recherche de traduction data est le tableau de traduction

Définition de la portée

Il existe des possibilités de changer le module pour une classe, ce qui est particulièrement utile pour les blocs et les assistants. La meilleure pratique consiste à toujours définir explicitement le nom du module lors de la réécriture d'une classe principale. Comment cela fonctionne, varie entre les assistants, les blocs et les contrôleurs (à partir de Magento CE 1.9.1)

Exemple pour un bloc:

class IntegerNet_AwesomeModule_Block_Catalog_Product extends Mage_Catalog_Block_Product
{
    public function getModuleName()
    {
        return 'Mage_Catalog';
    }
}

Pour les blocs, vous pouvez également définir le module_nameparamètre dans la disposition XML:

<block type="integernet_awesomemodule/catalog_product" name="test" module_name="Mage_Catalog" />

Exemple pour un assistant:

class IntegerNet_AwesomeModule_Helper_Catalog extends Mage_Catalog_Helper_Data
{
    protected $_moduleName = 'Mage_Catalog';
}

Pour les contrôleurs frontaux, vous pouvez définir la propriété _realModuleName, pour les contrôleurs d'administration, _usedModuleName(oui pour la cohérence)

Autres méthodes de traduction

Dans les fichiers XML (config.xml, system.xml, layout), vous pouvez spécifier si les nœuds doivent être traduits avec l' translateattribut. Vous devez également ajouter l' moduleattribut pour spécifier la portée, mais ici, la valeur doit être l' alias d'assistance , pas le nom du module comme ci-dessus.

<one_column module="page" translate="label">
    <label>1 column</label>
    <template>page/1column.phtml</template>
    <layout_handle>page_one_column</layout_handle>
    <is_default>1</is_default>
</one_column>

En JavaScript, vous pouvez utiliser l' Translatorobjet qui est globalement disponible:

Translator.translate('Please wait, loading...');

mais vous devez rendre les traductions que vous souhaitez utiliser en JavaScript disponibles pour l'objet traducteur. Cela se fait via des jstranslator.xmlfichiers dans les etcrépertoires des modules.

<?xml version="1.0"?>
<jstranslator>
    <loading translate="message" module="core">
        <message>Please wait, loading...</message>
    </loading>
</jstranslator>

loadingpeut être n'importe quelle chaîne mais doit être globalement unique. Les attributs translateet modulesont utilisés comme dans d'autres fichiers XML. La valeur de messageet sa traduction est ajoutée à l'objet JS Translator.

Dépannage

Même si vous connaissez toutes les règles compliquées, il est parfois difficile de voir pourquoi certaines traductions fonctionnent telles quelles (ou ne fonctionnent pas). Pour faciliter cela, j'ai développé un module "Conseils de traduction" qui montre d'où viennent les traductions:

Obtenez-le ici: https://github.com/schmengler/TranslationHints

Capture d'écran: Conseils de traduction


Basé sur mes articles de blog et diapositives sur le sujet:


2
J'espère que je ne spamme pas en mentionnant que mon module gratuit Yireo EmailOverride permettra également de placer des fichiers de module CSV personnalisés dans le thème. Pas seulement translate.csv.
Jisse Reitsma

6

Avez-vous vidé votre cache?

Votre système est-il défini sur les paramètres régionaux du fichier que vous testez?

Magento peut-il trouver le fichier qu'il recherche lorsqu'il charge la traduction du thème (certaines var_dumpinstructions temporaires ; exit; devraient aider.

#File: app/code/core/Mage/Core/Model/Translate.php
protected function _loadThemeTranslation($forceReload = false)
{
    $file = Mage::getDesign()->getLocaleFileName('translate.csv');
    $this->_addData($this->_getFileData($file), false, $forceReload);
    return $this;
}

La _getTranslatedStringméthode peut-elle trouver ce qu'elle recherche dans le tableau de données?

#File: app/code/core/Mage/Core/Model/Translate.php
protected function _getTranslatedString($text, $code)
{
    $translated = '';
    if (array_key_exists($code, $this->getData())) {
        $translated = $this->_data[$code];
    }
    elseif (array_key_exists($text, $this->getData())) {
        $translated = $this->_data[$text];
    }
    else {
        $translated = $text;
    }
    return $translated;
}

Aucun des caches n'est actif, je ne sais pas si mon système est réglé sur les paramètres régionaux, mais les traductions fonctionnent en conséquence dans certains fichiers de modèle (en changeant la boutique). Par exemple, une chaîne dans mon se translate.csvtraduit correctement dans /app/design/frontend/package_name/default/template/catalog/product/view.phtmlmais pas dans/app/design/frontend/package_name/default/template/page/html/topmenu.phtml
waffl

Vous aviez raison, quelqu'un a ouvert la cache sans me le dire. Oups, mes excuses et merci pour l'information!
waffl

3
@waffl Pas besoin de s'excuser - je pense que chaque développeur Magento le fait au moins une fois par semaine.
Alan Storm
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.