{"id":6837,"date":"2025-03-01T22:34:45","date_gmt":"2025-03-01T20:34:45","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=6837"},"modified":"2025-03-20T09:29:29","modified_gmt":"2025-03-20T07:29:29","slug":"magento-2-ajouter-un-fallback-de-traduction","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2025\/03\/01\/magento-2-ajouter-un-fallback-de-traduction\/","title":{"rendered":"Magento 2 : Ajouter un fallback de traduction"},"content":{"rendered":"\n<p>Dans le cadre de la cr\u00e9ation de sites localis\u00e9s sous Magento 2 , il peut arriver que plusieurs sites utilisent une langue similaire, mais pas la m\u00eame locale au niveau de Magento.<br><br>C&rsquo;est notamment le cas si vous avez un :<\/p>\n<ul>\n<li>Un site fran\u00e7ais utilisant la locale fr_FR<\/li>\n<li>Un site Suisse utilisant la locale fr_CH<\/li>\n<\/ul>\n<p>Dans le cadre de la traduction du site il sera donc n\u00e9cessaire nativement de mettre les m\u00eames traductions \u00e0 la fois dans les fichiers de traductions fr_FR.csv et dans les fichier fr_CH.csv<\/p>\n<p>Nous allons voir comment optimiser ce fonctionnement.<br>L&rsquo;id\u00e9e \u00e9tant la suivante :<\/p>\n<ul>\n<li>La locale fr_CH doit reprendre l&rsquo;int\u00e9gralit\u00e9 des traductions fr_FR<\/li>\n<li>Il doit rester possible de surcharger les traductions sp\u00e9cifiquement pour la locale fr_CH si on le souhaite.<\/li>\n<\/ul>\n<p>Pour mettre cela en oeuvre c&rsquo;est relativement facile, mais cela n\u00e9cessite tout de m\u00eame une pr\u00e9f\u00e9rence de la classe&nbsp; : <strong>\\Magento\\Framework\\Translate<\/strong><br><br>Le module s&rsquo;appellera Hhennes_Translate, je ne d\u00e9taille pas les \u00e9tapes n\u00e9cessaires pour l&rsquo;initialiser.<br><br>On d\u00e9clare la pr\u00e9f\u00e9rence :<br>Si on souhaite l&rsquo;appliquer uniquement sur le frontend on peut le faire dans le fichier <strong>frontend\/di.xml<\/strong> de notre module<\/p>\n\n\n\n<pre lang=\"xml\">\n<?xml version=\"1.0\"?>\n<config xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n        xsi:noNamespaceSchemaLocation=\"urn:magento:framework:ObjectManager\/etc\/config.xsd\">\n    <preference for=\"Magento\\Framework\\Translate\" type=\"Hhennes\\Translation\\Preferences\\Framework\\Translate\"\/>\n<\/config>\n<\/pre>\n\n\n\n<p>Ensuite dans notre pr\u00e9f\u00e9rence, qui sera dans le fichier <strong>Preferences\/Framework\/Translation.php <\/strong>, de notre module.<br>On va juste surcharger la m\u00e9thode de gestion des traductions pour charger l&rsquo;ensemble des traductions fr_FR AVANT les fr_CH<br>Tous les commentaires sont dans le code.<\/p>\n\n\n\n<pre lang=\"php\">\n\n<?php\n\ndeclare(strict_types=1);\n\nnamespace Hhennes\\Translation\\Preferences\\Framework;\n\nuse Magento\\Framework\\Translate as BaseTranslate;\n\nclass Translate extends BaseTranslate\n{\n\n    \/**\n     * Charger les donn\u00e9es de traduction\n     *\n     * @param string|null $area\n     * @param bool $forceReload\n     * @return $this\n     * @throws LocalizedException\n     *\/\n    public function loadData($area = null, $forceReload = false)\n    {\n        $this->_data = [];\n        if ($area === null) {\n            $area = $this->_appState->getAreaCode();\n        }\n        $this->setConfig(\n            [\n                self::CONFIG_AREA_KEY => $area,\n            ]\n        );\n\n        if (!$forceReload) {\n            $data = $this->_loadCache();\n            if (false !== $data) {\n                $this->_data = $data;\n                return $this;\n            }\n        }\n\n\n        \/\/ Avant de charger la traduction de base (fr_CH), on change la locale pour la locale de fr_FR et on charge les traductions associ\u00e9es\n        if ($this->getLocale() == 'fr_CH') {\n            $this->setLocale('fr_FR');\n            $this->_loadModuleTranslation();\n            $this->_loadThemeTranslation();\n            $this->_loadDbTranslation();\n            \/\/ Apr\u00e8s, on remettons la locale \u00e0 la locale d'origine, pour permettre de remplacer les traductions fr_FR par les fr_CH si besoin\n            $this->setLocale('fr_CH');\n        }\n\n        $this->_loadModuleTranslation();\n        $this->_loadPackTranslation();\n        $this->_loadThemeTranslation();\n        $this->_loadDbTranslation();\n\n        if (!$forceReload) {\n            $this->_saveCache();\n        }\n\n        return $this;\n    }\n\n}\n\n<\/pre>\n\n\n\n<p>La logique est en place et fonctionnelle \ud83d\ude42<br \/>C&rsquo;est en dur pour montrer le fonctionnement et il est bien \u00e9videment possible de faire des tableaux de mapping et de la configuration pour optimiser tout \u00e7a<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans le cadre de la cr\u00e9ation de sites localis\u00e9s sous Magento 2 , il peut arriver que plusieurs sites utilisent une langue similaire, mais pas la m\u00eame locale au niveau de Magento. C&rsquo;est notamment le cas si vous avez un : Un site fran\u00e7ais utilisant la locale fr_FR Un site Suisse utilisant la locale fr_CH [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[246],"tags":[482,248,616],"class_list":["post-6837","post","type-post","status-publish","format-standard","hentry","category-magento-2","tag-magento-2","tag-traductions","tag-translations"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/6837","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=6837"}],"version-history":[{"count":3,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/6837\/revisions"}],"predecessor-version":[{"id":6926,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/6837\/revisions\/6926"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=6837"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=6837"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=6837"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}