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):
- DB (la
core_translate
table)
- Le
translate.csv
dossier thématique
- Les
app/locale/*/*.csv
fichiers
Comment est construit le tableau de traduction?
Traductions de module
Tout d'abord, tous les fichiers app/locale/*/*.csv
qui sont référencés à partir des etc/config.xml
fichiers des modules actifs sont analysés. Voici une procédure pas à pas du processus:
Supposons que Magento trouve la config.xml
section 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.csv
la 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.csv
fichier 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.csv
enregistrement "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.csv
avec les nouvelles clés de traduction sont simplement ajoutés au tableau.
Traductions de bases de données
Les traductions de la core_translate
table 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::AAA
enregistrement. 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.csv
fichier).
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::AAA
et 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.csv
fichier n'est pas utilisée, suivez cette liste de contrôle:
- Le cache de traduction est-il désactivé / actualisé? (Solution: vider le cache)
- Le
translate.csv
fichier est-il vraiment dans le thème de remplacement du magasin actuel? (Solution: correction de la configuration du thème)
- Y a-t-il un enregistrement contradictoire pour la traduction dans le
core_translate
tableau? (Solution: supprimez l'enregistrement en conflit de core_translate
)
- 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 DDD
via 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_translate
tableau à 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.xml
et 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 module
argument n'est spécifié dans le XML, l' core/data
assistant 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_translate
enregistrements
- Avantages et inconvénients des différentes méthodes de traduction
Veuillez poser une question distincte si plus d'informations sont nécessaires.