Dans le cadre de la création de sites localisés sous Magento 2 , il peut arriver que plusieurs sites utilisent une langue similaire, mais pas la même locale au niveau de Magento.
C’est notamment le cas si vous avez un :
- Un site français utilisant la locale fr_FR
- Un site Suisse utilisant la locale fr_CH
Dans le cadre de la traduction du site il sera donc nécessaire nativement de mettre les mêmes traductions à la fois dans les fichiers de traductions fr_FR.csv et dans les fichier fr_CH.csv
Nous allons voir comment optimiser ce fonctionnement.
L’idée étant la suivante :
- La locale fr_CH doit reprendre l’intégralité des traductions fr_FR
- Il doit rester possible de surcharger les traductions spécifiquement pour la locale fr_CH si on le souhaite.
Pour mettre cela en oeuvre c’est relativement facile, mais cela nécessite tout de même une préférence de la classe : \Magento\Framework\Translate
Le module s’appellera Hhennes_Translate, je ne détaille pas les étapes nécessaires pour l’initialiser.
On déclare la préférence :
Si on souhaite l’appliquer uniquement sur le frontend on peut le faire dans le fichier frontend/di.xml de notre module
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Framework\Translate" type="Hhennes\Translation\Preferences\Framework\Translate"/> </config> |
Ensuite dans notre préférence, qui sera dans le fichier Preferences/Framework/Translation.php , de notre module.
On va juste surcharger la méthode de gestion des traductions pour charger l’ensemble des traductions fr_FR AVANT les fr_CH
Tous les commentaires sont dans le code.
<?php declare(strict_types=1); namespace Hhennes\Translation\Preferences\Framework; use Magento\Framework\Translate as BaseTranslate; class Translate extends BaseTranslate { /** * Charger les données de traduction * * @param string|null $area * @param bool $forceReload * @return $this * @throws LocalizedException */ public function loadData($area = null, $forceReload = false) { $this->_data = []; if ($area === null) { $area = $this->_appState->getAreaCode(); } $this->setConfig( [ self::CONFIG_AREA_KEY => $area, ] ); if (!$forceReload) { $data = $this->_loadCache(); if (false !== $data) { $this->_data = $data; return $this; } } // 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ées if ($this->getLocale() == 'fr_CH') { $this->setLocale('fr_FR'); $this->_loadModuleTranslation(); $this->_loadThemeTranslation(); $this->_loadDbTranslation(); // Après, on remettons la locale à la locale d'origine, pour permettre de remplacer les traductions fr_FR par les fr_CH si besoin $this->setLocale($this->getLocale()); } $this->_loadModuleTranslation(); $this->_loadPackTranslation(); $this->_loadThemeTranslation(); $this->_loadDbTranslation(); if (!$forceReload) { $this->_saveCache(); } return $this; } } |
La logique est en place et fonctionnelle 🙂
C’est en dur pour montrer le fonctionnement et il est bien évidement possible de faire des tableaux de mapping et de la configuration pour optimiser tout ça