J'ai une configuration de package de conception comme ceci:
design/frontend/package_name/theme_name/locale/
sous lequel j'ai
de_DE
, en_GB
etc, sous lequel j'ai des translate.csv
fichiers 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?
Réponses:
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):
core_translate
table)translate.csv
dossier thématiqueapp/locale/*/*.csv
fichiersComment 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 desetc/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 :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:
Dans ces circonstances, Magento crée les enregistrements suivants dans le tableau de traduction:
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: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: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 typeMage_Core_Block_Template
, Magento recherchera d'abord unMage_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 dutranslate.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 traductionMage_Catalog::AAA
et trouverait la traductionAAA
.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:translate.csv
fichier est-il vraiment dans le thème de remplacement du magasin actuel? (Solution: correction de la configuration du thème)core_translate
tableau? (Solution: supprimez l'enregistrement en conflit decore_translate
)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 commeDDD
via la traduction du thème, vous pouvez le faire dans votretranslate.csv
: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 dansconfig.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.
core_translate
enregistrementsVeuillez poser une question distincte si plus d'informations sont nécessaires.
la source
__()
fonctionnement de la fonction.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.csv
thè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:
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:
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:data
est le tableau de traductionDé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:
Pour les blocs, vous pouvez également définir le
module_name
paramètre dans la disposition XML:Exemple pour un assistant:
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'
translate
attribut. Vous devez également ajouter l'module
attribut pour spécifier la portée, mais ici, la valeur doit être l' alias d'assistance , pas le nom du module comme ci-dessus.En JavaScript, vous pouvez utiliser l'
Translator
objet qui est globalement disponible:mais vous devez rendre les traductions que vous souhaitez utiliser en JavaScript disponibles pour l'objet traducteur. Cela se fait via des
jstranslator.xml
fichiers dans lesetc
répertoires des modules.loading
peut être n'importe quelle chaîne mais doit être globalement unique. Les attributstranslate
etmodule
sont utilisés comme dans d'autres fichiers XML. La valeur demessage
et 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:
Basé sur mes articles de blog et diapositives sur le sujet:
la source
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_dump
instructions temporaires ; exit; devraient aider.La
_getTranslatedString
méthode peut-elle trouver ce qu'elle recherche dans le tableau de données?la source
translate.csv
traduit correctement dans/app/design/frontend/package_name/default/template/catalog/product/view.phtml
mais pas dans/app/design/frontend/package_name/default/template/page/html/topmenu.phtml