1. Documentation
    2. Environnement
    3. Intlayer avec Vite et React

    Commencer à Internationaliser (i18n) avec Intlayer, Vite et React

    Qu'est-ce qu'Intlayer ?

    Intlayer est une bibliothèque d'internationalisation (i18n) open-source et innovante, conçue pour simplifier le support multilingue dans les applications web modernes.

    Avec Intlayer, vous pouvez :

    • Gérer facilement les traductions en utilisant des dictionnaires déclaratifs au niveau des composants.
    • Localiser dynamiquement les métadonnées, les routes et le contenu.
    • Assurer le support TypeScript avec des types auto-générés, améliorant l'autocomplétion et la détection des erreurs.
    • Bénéficier de fonctionnalités avancées, comme la détection dynamique de la langue et le changement.

    Guide étape par étape pour configurer Intlayer dans une application Vite et React

    Étape 1 : Installer les Dépendances

    Installez les packages nécessaires en utilisant npm :

    bash
    1npm install intlayer react-intlayer
    bash
    1yarn add intlayer react-intlayer
    bash
    1pnpm add intlayer react-intlayer

    Étape 2 : Configuration de votre projet

    Créer un fichier de configuration pour configurer les langues de votre application :

    typescript
    1// intlayer.config.ts 2 3import { Locales, type IntlayerConfig } from "intlayer"; 4 5const config: IntlayerConfig = { 6 internationalization: { 7 locales: [ 8 Locales.ENGLISH, 9 Locales.FRENCH, 10 Locales.SPANISH, 11 // Vos autres locales 12 ], 13 defaultLocale: Locales.ENGLISH, 14 }, 15}; 16 17export default config;

    Pour voir tous les paramètres disponibles, consultez la documentation de configuration ici.

    Étape 3 : Intégrer Intlayer dans votre Configuration Vite

    Ajoutez le plugin intlayer dans votre configuration.

    typescript
    1import { defineConfig } from "vite"; 2import react from "@vitejs/plugin-react-swc"; 3import { intLayerPlugin } from "react-intlayer/vite"; 4 5// https://vitejs.dev/config/ 6export default defineConfig({ 7 plugins: [react(), intLayerPlugin()], 8});

    Étape 4 : Déclarer Votre Contenu

    Créez et gérez vos dictionnaires de contenu :

    tsx
    1// src/app.content.tsx 2import { t, type DeclarationContent } from "intlayer"; 3import { type ReactNode } from "react"; 4 5const appContent = { 6 key: "app", 7 content: { 8 viteLogo: t({ 9 en: "Vite logo", 10 fr: "Logo Vite", 11 es: "Logo Vite", 12 }), 13 reactLogo: t({ 14 en: "React logo", 15 fr: "Logo React", 16 es: "Logo React", 17 }), 18 19 title: "Vite + React", 20 21 count: t({ 22 en: "count is ", 23 fr: "le compte est ", 24 es: "el recuento es ", 25 }), 26 27 edit: t<ReactNode>({ 28 // N'oubliez pas d'importer React si vous utilisez un React node dans votre contenu 29 en: ( 30 <> 31 Edit <code>src/App.tsx</code> and save to test HMR 32 </> 33 ), 34 fr: ( 35 <> 36 Éditez <code>src/App.tsx</code> et enregistrez pour tester HMR 37 </> 38 ), 39 es: ( 40 <> 41 Edita <code>src/App.tsx</code> y guarda para probar HMR 42 </> 43 ), 44 }), 45 46 readTheDocs: t({ 47 en: "Click on the Vite and React logos to learn more", 48 fr: "Cliquez sur les logos Vite et React pour en savoir plus", 49 es: "Haga clic en los logotipos de Vite y React para obtener más información", 50 }), 51 }, 52} satisfies DeclarationContent; 53 54export default appContent;

    Note : Si votre fichier de contenu inclut du code TSX, vous devriez envisager d'importer import React from "react"; dans votre fichier de contenu.

    Voir comment déclarer vos fichiers de déclaration Intlayer.

    Étape 5 : Utiliser Intlayer dans Votre Code

    Accédez à vos dictionnaires de contenu dans toute votre application :

    tsx
    1import { useState } from "react"; 2import reactLogo from "./assets/react.svg"; 3import viteLogo from "/vite.svg"; 4import "./App.css"; 5import { LocaleSwitcher } from "./components/LangSwitcherDropDown"; 6import { IntlayerProvider, useIntlayer } from "react-intlayer"; 7 8function AppContent() { 9 const [count, setCount] = useState(0); 10 const content = useIntlayer("app"); 11 12 return ( 13 <> 14 <div> 15 <a href="https://vitejs.dev" target="_blank"> 16 <img src={viteLogo} className="logo" alt={content.viteLogo.value} /> 17 </a> 18 <a href="https://react.dev" target="_blank"> 19 <img 20 src={reactLogo} 21 className="logo react" 22 alt={content.reactLogo.value} 23 /> 24 </a> 25 </div> 26 <h1>{content.title}</h1> 27 <div className="card"> 28 <button onClick={() => setCount((count) => count + 1)}> 29 {content.count} 30 {count} 31 </button> 32 <p>{content.edit}</p> 33 </div> 34 <p className="read-the-docs">{content.readTheDocs}</p> 35 <div className="absolute bottom-5 right-5 z-50"> 36 <LocaleSwitcher /> 37 </div> 38 </> 39 ); 40} 41 42function App() { 43 return ( 44 <IntlayerProvider> 45 <AppContent /> 46 </IntlayerProvider> 47 ); 48} 49 50export default App;

    Note : Si vous souhaitez utiliser votre contenu dans un attribut string, tel que alt, title, href, aria-label, etc., vous devez appeler la valeur de la fonction, comme :

    tsx
    1<img src={content.image.src.value} alt={content.image.value} />

    (Optionnel) Étape 6 : Changer la langue de votre contenu

    Pour changer la langue de votre contenu, vous pouvez utiliser la fonction setLocale fournie par le hook useLocale. Cette fonction vous permet de définir la locale de l'application et de mettre à jour le contenu en conséquence.

    tsx
    1import { Locales } from "intlayer"; 2import { useLocale } from "react-intlayer"; 3 4const LocaleSwitcher = () => { 5 const { setLocale } = useLocale(); 6 7 return ( 8 <button onClick={() => setLocale(Locales.English)}> 9 Change Language to English 10 </button> 11 ); 12};

    (Optionnel) Étape 7 : Ajouter un Routage localisé à votre application

    Le but de cette étape est de créer des routes uniques pour chaque langue. Cela est utile pour le SEO et les URL optimisées pour le SEO. Exemple :

    tsx
    1// /dashboard 2// /es/dashboard 3// /fr/dashboard

    Par défaut, les routes ne sont pas préfixées pour la locale par défaut. Si vous souhaitez préfixer la locale par défaut, vous pouvez définir l'option middleware.prefixDefault sur true dans votre configuration. Consultez la documentation de configuration pour plus d'informations.

    Pour ajouter un routage localisé à votre application, vous pouvez créer un composant LocaleRouter qui englobe les routes de votre application et gère le routage basé sur la locale. Voici un exemple utilisant React Router :

    tsx
    1// Importation des dépendances et fonctions nécessaires 2import { Locales, getConfiguration, getPathWithoutLocale } from "intlayer"; // Fonctions utilitaires et types de 'intlayer' 3import { FC, PropsWithChildren } from "react"; // Types React pour les composants fonctionnels et les props 4import { IntlayerProvider } from "react-intlayer"; // Fournisseur pour le contexte d'internationalisation 5import { 6 BrowserRouter, 7 Routes, 8 Route, 9 useParams, 10 Navigate, 11 useLocation, 12} from "react-router-dom"; // Composants Router pour gérer la navigation 13 14// Destructuration de la configuration d'Intlayer 15const { internationalization, middleware } = getConfiguration(); 16const { locales, defaultLocale } = internationalization; 17 18/** 19 * Un composant qui gère la localisation et enveloppe les enfants avec le contexte de locale approprié. 20 * Il gère la détection et la validation de la locale basée sur l'URL. 21 */ 22const AppLocalized: FC<PropsWithChildren> = ({ children }) => { 23 const path = useLocation().pathname; // Obtenir le chemin de l'URL actuelle 24 const { locale } = useParams<{ locale: Locales }>(); // Extraire le paramètre de locale de l'URL 25 26 // Déterminer la locale actuelle, en revenant à la locale par défaut si non fournie 27 const currentLocale = locale ?? defaultLocale; 28 29 // Supprimer le préfixe de locale du chemin pour construire un chemin de base 30 const pathWithoutLocale = getPathWithoutLocale( 31 path // Chemin de l'URL actuelle 32 ); 33 34 /** 35 * Si middleware.prefixDefault est vrai, la locale par défaut doit toujours être préfixée. 36 */ 37 if (middleware.prefixDefault) { 38 // Valider la locale 39 if (!locale || !locales.includes(locale)) { 40 // Rediriger vers la locale par défaut avec le chemin mis à jour 41 return ( 42 <Navigate 43 to={`/${defaultLocale}/${pathWithoutLocale}`} 44 replace // Remplacer l'entrée actuelle de l'historique par la nouvelle 45 /> 46 ); 47 } 48 49 // Envelopper les enfants avec le IntlayerProvider et définir la locale actuelle 50 return ( 51 <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider> 52 ); 53 } else { 54 /** 55 * Lorsque middleware.prefixDefault est faux, la locale par défaut n'est pas préfixée. 56 * Assurez-vous que la locale actuelle est valide et n'est pas la locale par défaut. 57 */ 58 if ( 59 currentLocale.toString() !== defaultLocale.toString() && 60 !locales 61 .filter( 62 (locale) => locale.toString() !== defaultLocale.toString() // Exclure la locale par défaut 63 ) 64 .includes(currentLocale) // Vérifier si la locale actuelle est dans la liste des locales valides 65 ) { 66 // Rediriger vers le chemin sans préfixe de locale 67 return <Navigate to={pathWithoutLocale} replace />; 68 } 69 70 // Envelopper les enfants avec le IntlayerProvider et définir la locale actuelle 71 return ( 72 <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider> 73 ); 74 } 75}; 76 77/** 78 * Un composant de routage qui met en place des routes spécifiques à la locale. 79 * Il utilise React Router pour gérer la navigation et rendre des composants localisés. 80 */ 81export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => ( 82 <BrowserRouter> 83 <Routes> 84 <Route 85 // Modèle de route pour capturer la locale (par exemple, /en/, /fr/) et correspondre à tous les chemins ultérieurs 86 path="/:locale/*" 87 element={<AppLocalized>{children}</AppLocalized>} // Enveloppe les enfants avec la gestion de la locale 88 /> 89 90 { 91 // Si le préfixage de la locale par défaut est désactivé, rendre les enfants directement à la racine 92 !middleware.prefixDefault && ( 93 <Route 94 path="*" 95 element={<AppLocalized>{children}</AppLocalized>} // Enveloppe les enfants avec la gestion de la locale 96 /> 97 ) 98 } 99 </Routes> 100 </BrowserRouter> 101);

    En parallèle, vous pouvez également utiliser le intLayerMiddlewarePlugin pour ajouter un routage côté serveur à votre application. Ce plugin détectera automatiquement la locale actuelle basée sur l'URL et définira le cookie de locale approprié. Si aucune locale n'est spécifiée, le plugin déterminera la locale la plus appropriée en fonction des préférences de langue du navigateur de l'utilisateur. Si aucune locale n'est détectée, il redirigera vers la locale par défaut.

    ts
    1import { defineConfig } from "vite"; 2import react from "@vitejs/plugin-react-swc"; 3import { intLayerPlugin, intLayerMiddlewarePlugin } from "react-intlayer/vite"; 4 5// https://vitejs.dev/config/ 6export default defineConfig({ 7 plugins: [react(), intLayerPlugin(), intLayerMiddlewarePlugin()], 8});

    (Optionnel) Étape 8 : Changer l'URL lorsque la locale change

    Pour changer l'URL lorsque la locale change, vous pouvez utiliser la prop onLocaleChange fournie par le hook useLocale. En parallèle, vous pouvez aussi utiliser les hooks useLocation et useNavigate de react-router-dom pour mettre à jour le chemin de l'URL.

    tsx
    1import { Locales, getLocalizedUrl } from "intlayer"; 2import { useLocale } from "react-intlayer"; 3import { useLocation, useNavigate } from "react-router-dom"; 4 5const LocaleSwitcher = () => { 6 const location = useLocation(); // Obtenir le chemin de l'URL actuelle. Exemple : /fr/about 7 const navigate = useNavigate(); 8 9 const changeUrl = (locale: Locales) => { 10 // Construire l'URL avec la locale mise à jour 11 // Exemple : /es/about avec la locale définie sur Espagnol 12 const pathWithLocale = getLocalizedUrl(location.pathname, locale); 13 14 // Mettre à jour le chemin de l'URL 15 navigate(pathWithLocale); 16 }; 17 18 const { setLocale } = useLocale({ 19 onLocaleChange: changeUrl, 20 }); 21 22 return ( 23 <button onClick={() => setLocale(Locales.English)}> 24 Change Language to English 25 </button> 26 ); 27};

    Configurer TypeScript

    Intlayer utilise l'augmentation de module pour bénéficier de TypeScript et rendre votre codebase plus solide.

    alt text

    alt text

    Assurez-vous que votre configuration TypeScript inclut les types auto-générés.

    json5
    1// tsconfig.json 2 3{ 4 // votre configuration personnalisée 5 include: [ 6 "src", 7 "types", // <- Inclure les types auto-générés 8 ], 9}

    Configuration Git

    Il est recommandé d'ignorer les fichiers générés par Intlayer. Cela vous permet d'éviter de les engager dans votre dépôt Git.

    Pour ce faire, vous pouvez ajouter les instructions suivantes à votre fichier .gitignore :

    gitignore
    1# Ignorer les fichiers générés par Intlayer 2.intlayer

    Si vous avez une idée d’amélioration pour améliorer cette documentation, n’hésitez pas à contribuer en submitant une pull request sur GitHub.

    Lien GitHub de la documentation

    Dans cette page