Magento 2 : Ajouter un fallback de traduction

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *