SmarMaker - Documentation
Docs» front:traductions

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
front:traductions [2025/09/29 17:10] – [Configurer i18next] paolofront:traductions [Date inconnue] (Version actuelle) – supprimée - modification externe (Date inconnue) 127.0.0.1
Ligne 1: Ligne 1:
-# Traductions 
  
-Documentation [i18next](https://www.i18next.com/)   
-Documentation [react-i18next](https://react.i18next.com/)   
-Documenation [Intl](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Intl) 
- 
-Vous souhaitez développer une application traduites en plusieures langues. Aucun problème, **react-i18next** met à dispoistion un système qui gére des fichiers de traduction. Il permet de traduire directement du texte dans vos composants et de gérer dans des cas plus complexes des formats (date, nombre, ...). 
- 
-Nous vous invitons à consulter également l'objet natif ''Intl'' de **JavaScript** pour gérer tout type de formats 
-. 
-### Stocker un fichier de traduction 
- 
-Les fichiers de traductions sont des fichiers JSON. Il y a deux moyens de les stocker selon la façon des les charger: 
- 
-  * Dans le dossier ''public'', ils sont chargés dynamiquement et peuvent être modifiés sans rebuild. 
-  * Dans le dossier ''src'', ils sont chargés statiquement. 
- 
-Nous ne traiterons ici la méthode "dynamique". Pour la méthode "statique", veuillez référer à la documentation de l'astuce **Fichiers de traductions statiques**. 
-### Faire un fichier de traduction 
- 
-Encore une fois, il y a deux méthodes pour organiser ses fichiers de traductions: 
- 
-  * un fichier par locale (''en.json'', ''fr.json'', ...). 
-  * un dossier par locale (''en'', ''fr'', ...) contenant des fichiers "namespace" (''login-page.json'', ''home-page.json'', ...) 
- 
-Nous ne traiterons ici la première méthode. Pour la seconde, veuillez vous référer la documentation de l'astuce **Faire des fichiers de traductions "namespace"**. 
- 
-Comme nous avons un fichier par langue qui doit potentiellement gérer plusieures pages, plusieurs composants, il s'agirait de bien s'organiser. Essayons avec notre page **Login**. 
- 
-``` 
-// public/locales/en.json 
- 
-{ 
-    "loginPage": { 
-        "emailInput": { 
-            "label": "Email address", 
-            "placeholder": "Write your email address here ..." 
-        }, 
-        "passwordInput": { 
-            "label": "Password", 
-            "placeholder": "●●●●●●●●"  
-        }, 
-        "button": "Login" 
-    } 
-} 
-``` 
- 
-``` 
-// public/locales/fr.json 
- 
-{ 
-    "loginPage": { 
-        "emailInput": { 
-            "label": "Adresse email", 
-            "placeholder": "Tapez votre adresse email ici..." 
-        }, 
-        "passwordInput": { 
-            "label": "Mot de passe", 
-            "placeholder": "●●●●●●●●"  
-        }, 
-        "button": "Connexion" 
-    } 
-} 
-``` 
-### Configurer i18next 
- 
-Pour cela, nous devons: 
- 
-  * Créer un fichier de configuration dans lequel nous avons besoin d'utiliser ''HttpBackend'' pour charger les fichiers de traductions du dossier ''public'' et de ''initReactI18next'' qui joue le rôle de plugin pour **react-i18next**. 
- 
-``` 
-// src/i18n/index.js 
- 
-import i18n from "i18next"; 
-import { initReactI18next } from "react-i18next"; 
-import HttpBackend from "i18next-http-backend"; 
- 
-i18n 
-  .use(HttpBackend) 
-  .use(initReactI18next) 
-  .init({ 
-    interpolation: { 
-      escapeValue: false, 
-    }, 
-    backend: { 
-      loadPath: "/locales/{{lng}}.json", 
-    }, 
-  }); 
- 
-export { i18n }; 
-``` 
- 
-  * Passer cette configuration au ''Provider'' de react-i18next. Pour rester propre, nous allons créer un composant ''I18nextProvider''. 
- 
-``` 
-// src/components/app/I18nextProvider/index.jsx 
- 
-import { I18nextProvider as Provider } from "react-i18next"; 
-import { useEffect } from "react"; 
-import { i18n } from "../../../i18n"; 
-import { useSelector } from "react-redux"; 
- 
-export const I18nextProvider = (props) => { 
-    const { children } = props; 
- 
-    const settings = useSelector(state => state.settings.data) ?? {}; 
-    const { lng } = settings;   
- 
-    useEffect(() => { 
-        i18n.changeLanguage(lng); 
-    }, [lng]); 
- 
-    return ( 
-        <Provider i18n={i18n}> 
-            {children} 
-        </Provider> 
-    ); 
-}; 
-``` 
- 
-Comme nous sommes au sein du ''ReduxProvider'', nous pouvons utiliser l'état global pour stocker des paramètres et notamment la langue. On doit alors créer un slice pour les paramètres, définir un état initial et des actions pour pouvoir les modifier. A vous de jouer ! 
- 
-``` 
-// src/App.jsx 
- 
-import { Router } from "./components/app/Router"; 
-import { ReduxProvider } from "./components/app/ReduxProvider"; 
-import { I18nextProvider } from "./components/app/I18nextProvider"; 
- 
-export const App = () => { 
-    return ( 
-        <ReduxProvider> 
-            <I18nextProvider> 
-                <Router /> 
-            </I18nextProvider> 
-        </ReduxProvider> 
-    ); 
-}; 
-``` 
- 
-Désormais les traductions sont accessibles dans n'importe quel fichier utilisé au sein du ''I18nextProvider''. 
-. 
-### Utiliser les traductions 
- 
-Pour traduire directement dans un composant, nous pouvons utiliser le hook ''useTranslation''. 
- 
-``` 
-// src/components/pages/Login/index.jsx 
- 
-import { Input } from "../form/Input"; 
-import { useDispatch } from "react-redux"; 
-import { setSession } from "../../../redux"; 
-import { API_URL } from "../../../utils/constants/vite"; 
-import { useTranslation } from "react-i18next";  
- 
-export const Login = () => { 
-    const { t } = useTranslation(); 
- 
-    const dispatch = useDispatch(); 
-     
-    const handleFormOnSubmit = (e) => { 
-        // request 
-    }; 
-     
-    return ( 
-        <div className="fixed inset-0 bg-white flex justify-center items-center p-10"> 
-            <form 
-                onSubmit={handleFormOnSubmit} 
-                className="flex flex-col gap-6" 
-            > 
-                <Input 
-                    id="email" 
-                    name="email" 
-                    label={t("LoginPage.emailInput.label")} 
-                    type="email" 
-                    placeholder={t("LoginPage.emailInput.placeholder")} 
-                /> 
-                <Input 
-                    id="password" 
-                    name="password" 
-                    label={t("LoginPage.passwordInput.label")} 
-                    type="password" 
-                    placeholder={t("LoginPage.emailInput.placeholder")} 
-                /> 
-                <button className="shadow-md bg-blue-500 text-white font-semibold text-xl uppercase tracking-wide rounded-full px-8 py-4 active:brightness-90 duration-100"> 
-                    {t("LoginPage.button")} 
-                </button> 
-            </form> 
-        </div> 
-    ); 
-}; 
-``` 
- 
-Pour ne pas à réécrire à chaque fois ''loginPage'', vous pouvez utiliser le système de prefix. Pour cela, veuillez vous référer à la documentaton de l'astuce **Utiliser les prefix avec useTranslation** 
Made with ❤ by CAP-REL · SmartMaker · GNU AGPL v3+
Code source · Faire un don
SmarMaker - Documentation

Table of Contents

  • SmartAuth
  • SmartMaker - Back (PHP)
    • Mapping Dolibarr - React
  • SmartMaker - Front (React)
    • Animations de pages
    • Architecture
    • Astuces
    • Calendar
    • Composants et pages
    • Configuration du Provider
    • Debug et Logs
    • Hooks SmartCommon
    • PWA (Progressive Web App)
    • Requêtes API
    • Routage
    • SmartCommon
    • Stockage de données
    • Synchronisation offline
    • Thèmes
    • Traductions
  • HowTo - Pas à pas - Votre première application
    • Développement PHP (back)
    • Développement React (front)
    • Première étape : Module Builder Dolibarr
    • SmartAuth
    • SmartBoot : Un squelette prêt à l'emploi
  • Formation SmartMaker
    • Module 1 : Fondamentaux JavaScript ES6+
      • Chapitre 1 : Variables et Scope
      • Chapitre 2 : Fonctions
      • Chapitre 3 : Programmation Asynchrone
      • Chapitre 4 : Modules ES6
    • Module 2 : Introduction à React
      • Chapitre 1 : Philosophie React
      • Chapitre 2 : JSX
      • Chapitre 3 : Composants
    • Module 3 : Hooks React Fondamentaux
      • Chapitre 1 : useState
      • Chapitre 2 : useEffect
      • Chapitre 3 : useRef
      • Chapitre 4 : useContext
    • Module 4 : React Avancé
      • Chapitre 1 : useCallback et useMemo
      • Chapitre 2 : Custom Hooks
      • Chapitre 3 : Redux et Redux Toolkit
    • Module 5 : Architecture SmartMaker
      • Chapitre 1 : Structure du projet
      • Chapitre 2 : Configuration
      • Chapitre 3 : Flux de données
    • Module 6 : SmartCommon - Composants
      • Chapitre 1 : Mise en page
      • Chapitre 2 : Navigation
      • Chapitre 3 : Formulaires
      • Chapitre 4 : Affichage
    • Module 7 : SmartCommon - Hooks
      • Chapitre 1 : useApi
      • Chapitre 2 : Gestion d'état
      • Chapitre 3 : Hooks utilitaires
      • Chapitre 4 : Synchronisation Offline
    • Module 8 : Backend API (PHP)
      • Chapitre 1 : Routage
      • Chapitre 2 : Controllers
      • Chapitre 3 : Mappers
      • Extrafields et formulaires dynamiques
    • Module 9 : Intégration complète
      • Chapitre 1 : Backend
      • Chapitre 2 : Frontend
      • Chapitre 3 : Déploiement
    • Module 10 : Fonctionnalités avancées
      • Chapitre 1 : Mode offline
      • Chapitre 2 : Internationalisation (i18n)
      • Chapitre 3 : Autres fonctionnalités
    • Module 11 : Bonnes pratiques
  • Démonstration
  • Start
  • Composants et pages