Loupe

Ajouter des traductions dans votre app React avec i18n !

Bonjour à tous ! 

Aujourd'hui nous allons voir comment rajouter facilement un système de traduction dans votre app React pour traduire tous vos contenus textuels (textes, boutons etc ... !) à l'aide du package i18n ! 

lang-switch.gif

Commençons par installer nos 3 dépendances :

npm install i18next react-i18next i18next-browser-languagedetector

À la racine de votre projet dans 'src', vous allez créer le fichier i18n.js qui contiendra le code suivant :

import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import LanguageDetector from 'i18next-browser-languagedetector';
import { Language } from "./enums/Language";
import translationEN from './i18n/en.json';
import translationFR from './i18n/fr.json';

let defaultLanguage = Language.FR;

// the translations
const resources = {
  en: {
    translation: translationEN
  },
  fr: {
    translation: translationFR
  }
};

i18n
  .use(LanguageDetector)
  .use(initReactI18next) // passes i18n down to react-i18next
  .init({
    resources,
    lng: defaultLanguage,

    keySeparator: ".",  // to support nested translations

    interpolation: {
      escapeValue: false // react already safes from xss
    }
  });

  export default i18n;

Ce fichier est le cœur de la logique de traduction où l'on paramètre l'instance i18n.

Nous allons créer un fichier enum 'Language.ts' qui énumérera les différentes langues de notre application:

export enum Language {
    FR = "fr",
    EN = "en",
}

Vous pouvez maintenant créer un dossier 'i18n' dans 'src' qui contiendra nos fichiers de traductions ! 

Pour cet exemple, on aura fr.json et en.json :

{
	"common": {
        "translate-button": "FR",
        "translated-text": "C'est du français"
    }
}
{
	"common": {
        "translate-button": "EN",
        "translated-text": "This is english"
    }
}

Maintenant, nous allons indiquer à toute notre app que nous utilisons la traduction i18n en rajoutant dans le fichier 'index.tsx' l'import du dossier contenant nos traductions fr.json et en.json : 

import './i18n';

Pour tester notre traduction, je vous invite à créer un composant 'Lang.tsx' qui s'occupera de switcher de langue ! 

import React, { ChangeEvent, useState } from "react"
import { useTranslation } from 'react-i18next';
import { Language } from '../../enums/Language';

const Lang = () => {
    const { i18n } = useTranslation();
    const [lang, setLang] = useState<Language>(i18n.language as Language);

    let changeLanguage = (event: ChangeEvent<HTMLSelectElement>) => {
        let language = event.target.value;

        switch (language) {
            case Language.EN:
                setLang(Language.EN);
                i18n.changeLanguage(Language.EN);
                break;
            case Language.FR:
            default:
                setLang(Language.FR);
                i18n.changeLanguage(Language.FR);
                break;
        }
    }

    return (
        <div>
            <div>
                <select value={lang} name="language" onChange={changeLanguage}>
                    <option value={Language.FR}>FR</option>
                    <option value={Language.EN}>EN</option>
                </select>
            </div>
        </div>
    )
}

export default Lang;

Essayons-le dans notre application : pour ce faire, je vais l'appeler dans mon composant App.tsx (mais dans votre cas il sera probablement appelé dans vos propres composants) :

import React from 'react';
import logo from './logo.svg';
import './App.css';
import { useTranslation } from "react-i18next";
import Lang from "./components/basics/Lang";

function App() {
  
  const { t } = useTranslation();

  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />

        <Lang />
        <p>{t('common.translated-text')}</p>

      </header>
    </div>
  );
}
export default App;

Vous pouvez ainsi voir qu'à l'aide de 'useTranslation()' nous pouvons indiquer le chemin de traduction dans notre balise '<p>' et qu' i18n se chargera d'aller chercher la traduction correspondante dans nos fichiers en.json/fr.json selon la langue choisie ! 

J'espère que tout fonctionne pour vous et si vous avez des questions, vous disposez de l'espace commentaire où l'on s'occupera de vous répondre rapidement ! :) 

Happy Coding ! 

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus