@intlayer/docs 7.3.14 → 7.3.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/blog/ar/intlayer_with_i18next.md +3 -0
  2. package/blog/ar/intlayer_with_next-i18next.md +3 -0
  3. package/blog/ar/intlayer_with_next-intl.md +3 -0
  4. package/blog/ar/intlayer_with_react-i18next.md +3 -0
  5. package/blog/ar/intlayer_with_react-intl.md +3 -0
  6. package/blog/ar/intlayer_with_vue-i18n.md +3 -0
  7. package/blog/de/intlayer_with_i18next.md +3 -0
  8. package/blog/de/intlayer_with_next-i18next.md +3 -0
  9. package/blog/de/intlayer_with_next-intl.md +3 -0
  10. package/blog/de/intlayer_with_react-i18next.md +3 -0
  11. package/blog/de/intlayer_with_react-intl.md +3 -0
  12. package/blog/de/intlayer_with_vue-i18n.md +3 -0
  13. package/blog/en/intlayer_with_i18next.md +7 -0
  14. package/blog/en/intlayer_with_next-i18next.md +3 -0
  15. package/blog/en/intlayer_with_next-intl.md +7 -0
  16. package/blog/en/intlayer_with_react-i18next.md +3 -0
  17. package/blog/en/intlayer_with_react-intl.md +3 -0
  18. package/blog/en/intlayer_with_vue-i18n.md +3 -0
  19. package/blog/en-GB/intlayer_with_i18next.md +3 -0
  20. package/blog/en-GB/intlayer_with_next-i18next.md +3 -0
  21. package/blog/en-GB/intlayer_with_next-intl.md +3 -0
  22. package/blog/en-GB/intlayer_with_react-i18next.md +3 -0
  23. package/blog/en-GB/intlayer_with_react-intl.md +3 -0
  24. package/blog/en-GB/intlayer_with_vue-i18n.md +3 -0
  25. package/blog/es/intlayer_with_i18next.md +3 -0
  26. package/blog/es/intlayer_with_next-i18next.md +3 -0
  27. package/blog/es/intlayer_with_next-intl.md +3 -0
  28. package/blog/es/intlayer_with_react-i18next.md +3 -0
  29. package/blog/es/intlayer_with_react-intl.md +3 -0
  30. package/blog/es/intlayer_with_vue-i18n.md +3 -0
  31. package/blog/fr/intlayer_with_i18next.md +3 -0
  32. package/blog/fr/intlayer_with_next-i18next.md +3 -0
  33. package/blog/fr/intlayer_with_next-intl.md +3 -0
  34. package/blog/fr/intlayer_with_react-i18next.md +3 -0
  35. package/blog/fr/intlayer_with_react-intl.md +3 -0
  36. package/blog/fr/intlayer_with_vue-i18n.md +3 -0
  37. package/blog/hi/intlayer_with_i18next.md +3 -0
  38. package/blog/hi/intlayer_with_next-i18next.md +3 -0
  39. package/blog/hi/intlayer_with_next-intl.md +3 -0
  40. package/blog/hi/intlayer_with_react-i18next.md +3 -0
  41. package/blog/hi/intlayer_with_react-intl.md +3 -0
  42. package/blog/hi/intlayer_with_vue-i18n.md +3 -0
  43. package/blog/id/intlayer_with_i18next.md +3 -0
  44. package/blog/id/intlayer_with_next-i18next.md +3 -0
  45. package/blog/id/intlayer_with_next-intl.md +3 -0
  46. package/blog/id/intlayer_with_react-i18next.md +3 -0
  47. package/blog/id/intlayer_with_react-intl.md +3 -0
  48. package/blog/id/intlayer_with_vue-i18n.md +3 -0
  49. package/blog/it/intlayer_with_i18next.md +3 -0
  50. package/blog/it/intlayer_with_next-i18next.md +3 -0
  51. package/blog/it/intlayer_with_next-intl.md +3 -0
  52. package/blog/it/intlayer_with_react-i18next.md +3 -0
  53. package/blog/it/intlayer_with_react-intl.md +3 -0
  54. package/blog/it/intlayer_with_vue-i18n.md +3 -0
  55. package/blog/ja/intlayer_with_i18next.md +3 -0
  56. package/blog/ja/intlayer_with_next-i18next.md +3 -0
  57. package/blog/ja/intlayer_with_next-intl.md +3 -0
  58. package/blog/ja/intlayer_with_react-i18next.md +3 -0
  59. package/blog/ja/intlayer_with_react-intl.md +3 -0
  60. package/blog/ja/intlayer_with_vue-i18n.md +3 -0
  61. package/blog/ko/intlayer_with_i18next.md +3 -0
  62. package/blog/ko/intlayer_with_next-i18next.md +3 -0
  63. package/blog/ko/intlayer_with_next-intl.md +3 -0
  64. package/blog/ko/intlayer_with_react-i18next.md +3 -0
  65. package/blog/ko/intlayer_with_react-intl.md +3 -0
  66. package/blog/ko/intlayer_with_vue-i18n.md +3 -0
  67. package/blog/pl/intlayer_with_i18next.md +3 -0
  68. package/blog/pl/intlayer_with_next-i18next.md +3 -0
  69. package/blog/pl/intlayer_with_next-intl.md +3 -0
  70. package/blog/pl/intlayer_with_react-i18next.md +3 -0
  71. package/blog/pl/intlayer_with_react-intl.md +3 -0
  72. package/blog/pl/intlayer_with_vue-i18n.md +3 -0
  73. package/blog/pt/intlayer_with_i18next.md +3 -0
  74. package/blog/pt/intlayer_with_next-i18next.md +3 -0
  75. package/blog/pt/intlayer_with_next-intl.md +3 -0
  76. package/blog/pt/intlayer_with_react-i18next.md +3 -0
  77. package/blog/pt/intlayer_with_react-intl.md +3 -0
  78. package/blog/pt/intlayer_with_vue-i18n.md +3 -0
  79. package/blog/ru/intlayer_with_i18next.md +3 -0
  80. package/blog/ru/intlayer_with_next-i18next.md +3 -0
  81. package/blog/ru/intlayer_with_next-intl.md +3 -0
  82. package/blog/ru/intlayer_with_react-i18next.md +3 -0
  83. package/blog/ru/intlayer_with_react-intl.md +3 -0
  84. package/blog/ru/intlayer_with_vue-i18n.md +3 -0
  85. package/blog/tr/intlayer_with_i18next.md +3 -0
  86. package/blog/tr/intlayer_with_next-i18next.md +3 -0
  87. package/blog/tr/intlayer_with_next-intl.md +3 -0
  88. package/blog/tr/intlayer_with_react-i18next.md +3 -0
  89. package/blog/tr/intlayer_with_vue-i18n.md +3 -0
  90. package/blog/vi/intlayer_with_i18next.md +3 -0
  91. package/blog/vi/intlayer_with_next-i18next.md +3 -0
  92. package/blog/vi/intlayer_with_next-intl.md +3 -0
  93. package/blog/vi/intlayer_with_react-i18next.md +3 -0
  94. package/blog/vi/intlayer_with_react-intl.md +3 -0
  95. package/blog/vi/intlayer_with_vue-i18n.md +3 -0
  96. package/blog/zh/intlayer_with_i18next.md +3 -0
  97. package/blog/zh/intlayer_with_next-i18next.md +3 -0
  98. package/blog/zh/intlayer_with_next-intl.md +3 -0
  99. package/blog/zh/intlayer_with_react-i18next.md +3 -0
  100. package/blog/zh/intlayer_with_react-intl.md +3 -0
  101. package/blog/zh/intlayer_with_vue-i18n.md +3 -0
  102. package/docs/ar/intlayer_with_lynx+react.md +1 -1
  103. package/docs/ar/intlayer_with_vite+react.md +99 -331
  104. package/docs/ar/plugins/sync-json.md +3 -0
  105. package/docs/de/intlayer_with_lynx+react.md +1 -1
  106. package/docs/de/intlayer_with_vite+react.md +116 -380
  107. package/docs/de/plugins/sync-json.md +3 -0
  108. package/docs/en/intlayer_with_vite+react.md +6 -10
  109. package/docs/en/plugins/sync-json.md +3 -0
  110. package/docs/en-GB/intlayer_with_vite+react.md +62 -74
  111. package/docs/en-GB/plugins/sync-json.md +3 -0
  112. package/docs/es/intlayer_with_vite+react.md +101 -333
  113. package/docs/es/plugins/sync-json.md +3 -0
  114. package/docs/fr/intlayer_with_vite+react.md +101 -357
  115. package/docs/fr/plugins/sync-json.md +3 -0
  116. package/docs/hi/intlayer_with_vite+react.md +120 -333
  117. package/docs/hi/plugins/sync-json.md +3 -0
  118. package/docs/id/intlayer_with_vite+react.md +7 -13
  119. package/docs/id/plugins/sync-json.md +3 -0
  120. package/docs/it/intlayer_with_lynx+react.md +1 -1
  121. package/docs/it/intlayer_with_vite+react.md +121 -393
  122. package/docs/it/plugins/sync-json.md +3 -0
  123. package/docs/ja/intlayer_with_vite+react.md +106 -378
  124. package/docs/ja/plugins/sync-json.md +3 -0
  125. package/docs/ko/intlayer_with_lynx+react.md +1 -1
  126. package/docs/ko/intlayer_with_vite+react.md +90 -322
  127. package/docs/ko/plugins/sync-json.md +3 -0
  128. package/docs/pl/intlayer_with_vite+react.md +25 -21
  129. package/docs/pl/plugins/sync-json.md +3 -0
  130. package/docs/pt/intlayer_with_vite+react.md +96 -328
  131. package/docs/pt/plugins/sync-json.md +3 -0
  132. package/docs/ru/intlayer_with_lynx+react.md +1 -1
  133. package/docs/ru/intlayer_with_vite+react.md +109 -362
  134. package/docs/ru/plugins/sync-json.md +3 -0
  135. package/docs/tr/intlayer_with_vite+react.md +132 -366
  136. package/docs/tr/plugins/sync-json.md +3 -0
  137. package/docs/vi/intlayer_with_vite+react.md +16 -19
  138. package/docs/vi/plugins/sync-json.md +3 -0
  139. package/docs/zh/intlayer_with_tanstack.md +1 -1
  140. package/docs/zh/intlayer_with_vite+react.md +91 -374
  141. package/docs/zh/plugins/sync-json.md +3 -0
  142. package/frequent_questions/ar/customized_locale_list.md +1 -1
  143. package/frequent_questions/de/customized_locale_list.md +1 -1
  144. package/frequent_questions/en/customized_locale_list.md +1 -1
  145. package/frequent_questions/en-GB/customized_locale_list.md +1 -1
  146. package/frequent_questions/es/customized_locale_list.md +1 -1
  147. package/frequent_questions/fr/customized_locale_list.md +1 -1
  148. package/frequent_questions/hi/customized_locale_list.md +1 -1
  149. package/frequent_questions/id/customized_locale_list.md +1 -1
  150. package/frequent_questions/it/customized_locale_list.md +1 -1
  151. package/frequent_questions/ja/customized_locale_list.md +1 -1
  152. package/frequent_questions/ko/customized_locale_list.md +1 -1
  153. package/frequent_questions/pl/customized_locale_list.md +1 -1
  154. package/frequent_questions/pt/customized_locale_list.md +1 -1
  155. package/frequent_questions/ru/customized_locale_list.md +1 -1
  156. package/frequent_questions/tr/customized_locale_list.md +1 -1
  157. package/frequent_questions/vi/customized_locale_list.md +1 -1
  158. package/frequent_questions/zh/customized_locale_list.md +1 -1
  159. package/package.json +6 -6
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  createdAt: 2024-03-07
3
- updatedAt: 2024-03-07
4
- title: Comment traduire votre Vite and React – guide i18n 2025
3
+ updatedAt: 2025-12-10
4
+ title: Comment traduire votre application Vite et React – guide i18n 2025
5
5
  description: Apprenez à ajouter l'internationalisation (i18n) à votre application Vite et React en utilisant Intlayer. Suivez ce guide pour rendre votre application multilingue.
6
6
  keywords:
7
7
  - Internationalisation
@@ -16,23 +16,19 @@ slugs:
16
16
  - environment
17
17
  - vite-and-react
18
18
  applicationTemplate: https://github.com/aymericzip/intlayer-vite-react-template
19
- youtubeVideo: https://www.youtube.com/watch?v=dS9L7uJeak4---
19
+ youtubeVideo: https://www.youtube.com/watch?v=dS9L7uJeak4
20
20
  history:
21
21
  - version: 5.5.10
22
22
  date: 2025-06-29
23
23
  changes: Historique initial
24
24
  ---
25
25
 
26
- # Prise en main de l'internationalisation (i18n) avec Intlayer, Vite et React
26
+ # Traduisez votre site web Vite et React en utilisant Intlayer | Internationalisation (i18n)
27
27
 
28
28
  ## Table des matières
29
29
 
30
30
  <TOC/>
31
31
 
32
- <iframe title="The best i18n solution for Vite and React? Discover Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/dS9L7uJeak4?si=VaKmrYMmXjo3xpk2"/>
33
-
34
- Voir le [Modèle d'application](https://github.com/aymericzip/intlayer-vite-react-template) sur GitHub.
35
-
36
32
  ## Qu'est-ce qu'Intlayer ?
37
33
 
38
34
  **Intlayer** est une bibliothèque d'internationalisation (i18n) innovante et open-source conçue pour simplifier la prise en charge multilingue dans les applications web modernes.
@@ -42,12 +38,33 @@ Avec Intlayer, vous pouvez :
42
38
  - **Gérez facilement les traductions** en utilisant des dictionnaires déclaratifs au niveau des composants.
43
39
  - **Localisez dynamiquement les métadonnées**, les routes et le contenu.
44
40
  - **Assurez la prise en charge de TypeScript** avec des types générés automatiquement, améliorant l'autocomplétion et la détection des erreurs.
45
- - **Bénéficiez de fonctionnalités avancées**, comme la détection dynamique de la langue et le changement de locale.
41
+ - **Bénéficiez de fonctionnalités avancées**, comme la détection dynamique de la locale et le changement de langue.
46
42
 
47
43
  ---
48
44
 
49
45
  ## Guide étape par étape pour configurer Intlayer dans une application Vite et React
50
46
 
47
+ <Tab defaultTab="video">
48
+ <TabItem label="Video" value="video">
49
+
50
+ <iframe title="The best i18n solution for Vite and React? Discover Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/dS9L7uJeak4?si=VaKmrYMmXjo3xpk2"/>
51
+
52
+ </TabItem>
53
+ <TabItem label="Code" value="code">
54
+
55
+ <iframe
56
+ src="https://stackblitz.com/github/aymericzip/intlayer-vite-react-template?embed=1&ctl=1&file=intlayer.config.ts"
57
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
58
+ title="Demo CodeSandbox - How to Internationalize your application using Intlayer"
59
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
60
+ loading="lazy"
61
+ />
62
+
63
+ </TabItem>
64
+ </Tab>
65
+
66
+ Voir le [Modèle d'application](https://github.com/aymericzip/intlayer-vite-react-template) sur GitHub.
67
+
51
68
  ### Étape 1 : Installer les dépendances
52
69
 
53
70
  Installez les paquets nécessaires en utilisant npm :
@@ -68,8 +85,7 @@ yarn add vite-intlayer --save-dev
68
85
  ```
69
86
 
70
87
  - **intlayer**
71
-
72
- Le paquet principal qui fournit des outils d'internationalisation pour la gestion de la configuration, la traduction, la [déclaration de contenu](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/get_started.md), la transpilation, et les [commandes CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_cli.md).
88
+ Le paquet principal qui fournit des outils d'internationalisation pour la gestion de la configuration, la traduction, la [déclaration de contenu](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md), la transpilation, et les [commandes CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
73
89
 
74
90
  - **react-intlayer**
75
91
  Le paquet qui intègre Intlayer avec une application React. Il fournit des fournisseurs de contexte et des hooks pour l'internationalisation dans React.
@@ -211,7 +227,7 @@ const appContent = {
211
227
  edit: t<ReactNode>({
212
228
  en: (
213
229
  <>
214
- Éditez <code>src/App.tsx</code> et enregistrez pour tester HMR
230
+ Edit <code>src/App.tsx</code> and save to test HMR
215
231
  </>
216
232
  ),
217
233
  fr: (
@@ -227,7 +243,7 @@ const appContent = {
227
243
  }),
228
244
 
229
245
  readTheDocs: t({
230
- en: "Cliquez sur les logos Vite et React pour en savoir plus",
246
+ en: "Click on the Vite and React logos to learn more",
231
247
  fr: "Cliquez sur les logos Vite et React pour en savoir plus",
232
248
  es: "Haga clic en los logotipos de Vite y React para obtener más información",
233
249
  }),
@@ -339,7 +355,7 @@ const appContent = {
339
355
  ),
340
356
  es: (
341
357
  <>
342
- Editez <code>src/App.tsx</code> et enregistrez pour tester HMR
358
+ Edita <code>src/App.tsx</code> y guarda para probar HMR
343
359
  </>
344
360
  ),
345
361
  },
@@ -412,9 +428,9 @@ module.exports = appContent;
412
428
  }
413
429
  ```
414
430
 
415
- > Vos déclarations de contenu peuvent être définies n'importe où dans votre application dès qu'elles sont incluses dans le répertoire `contentDir` (par défaut, `./src`). Et correspondent à l'extension de fichier de déclaration de contenu (par défaut, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
431
+ > Vos déclarations de contenu peuvent être définies n'importe où dans votre application dès qu'elles sont incluses dans le répertoire `contentDir` (par défaut, `./src`) et correspondent à l'extension de fichier de déclaration de contenu (par défaut, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
416
432
 
417
- > Pour plus de détails, consultez la [documentation sur la déclaration de contenu](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/get_started.md).
433
+ > Pour plus de détails, consultez la [documentation sur la déclaration de contenu](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md).
418
434
 
419
435
  > Si votre fichier de contenu inclut du code TSX, vous devriez envisager d'importer `import React from "react";` dans votre fichier de contenu.
420
436
 
@@ -639,82 +655,10 @@ Exemple :
639
655
  Pour ajouter un routage localisé à votre application, vous pouvez créer un composant `LocaleRouter` qui enveloppe les routes de votre application et gère le routage basé sur la locale. Voici un exemple utilisant [React Router](https://reactrouter.com/home) :
640
656
 
641
657
  ```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
642
- // Importation des dépendances et fonctions nécessaires
643
- import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // Fonctions utilitaires et types provenant de 'intlayer'
658
+ import { localeMap } from "intlayer"; // Fonctions utilitaires et types provenant de 'intlayer'
644
659
  import type { FC, PropsWithChildren } from "react"; // Types React pour composants fonctionnels et props
645
660
  import { IntlayerProvider } from "react-intlayer"; // Fournisseur pour le contexte d'internationalisation
646
- import {
647
- BrowserRouter,
648
- Routes,
649
- Route,
650
- Navigate,
651
- useLocation,
652
- } from "react-router-dom"; // Composants du routeur pour gérer la navigation
653
-
654
- // Déstructuration de la configuration depuis Intlayer
655
- const { internationalization, middleware } = configuration;
656
- const { locales, defaultLocale } = internationalization;
657
-
658
- /**
659
- * Un composant qui gère la localisation et enveloppe les enfants avec le contexte de locale approprié.
660
- * Il gère la détection et la validation de la locale basée sur l'URL.
661
- */
662
- const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
663
- children,
664
- locale,
665
- }) => {
666
- const { pathname, search } = useLocation(); // Obtenir le chemin URL actuel
667
-
668
- // Déterminer la locale actuelle, en revenant à la locale par défaut si non fournie
669
- const currentLocale = locale ?? defaultLocale;
670
-
671
- // Supprimer le préfixe de la locale du chemin pour construire un chemin de base
672
- const pathWithoutLocale = getPathWithoutLocale(
673
- pathname // Chemin URL actuel
674
- );
675
-
676
- /**
677
- * Si middleware.prefixDefault est vrai, la locale par défaut doit toujours être préfixée.
678
- */
679
- if (middleware.prefixDefault) {
680
- // Valider la locale
681
- if (!locale || !locales.includes(locale)) {
682
- // Rediriger vers la locale par défaut avec le chemin mis à jour
683
- return (
684
- <Navigate
685
- to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
686
- replace // Remplace l'entrée actuelle de l'historique par la nouvelle
687
- />
688
- );
689
- }
690
-
691
- // Envelopper les enfants avec IntlayerProvider et définir la locale actuelle
692
- return (
693
- <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
694
- );
695
- } else {
696
- /**
697
- * Lorsque middleware.prefixDefault est faux, la locale par défaut n'est pas préfixée.
698
- * Assurez-vous que la locale actuelle est valide et n'est pas la locale par défaut.
699
- */
700
- if (
701
- currentLocale.toString() !== defaultLocale.toString() &&
702
- !locales
703
- .filter(
704
- (locale) => locale.toString() !== defaultLocale.toString() // Exclure la locale par défaut
705
- )
706
- .includes(currentLocale) // Vérifie si la locale actuelle fait partie de la liste des locales valides
707
- ) {
708
- // Redirige vers le chemin sans préfixe de locale
709
- return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
710
- }
711
-
712
- // Enveloppe les enfants avec IntlayerProvider et définit la locale actuelle
713
- return (
714
- <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
715
- );
716
- }
717
- };
661
+ import { BrowserRouter, Route, Routes } from "react-router-dom"; // Composants du routeur pour gérer la navigation
718
662
 
719
663
  /**
720
664
  * Un composant de routeur qui configure les routes spécifiques à chaque locale.
@@ -723,256 +667,81 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
723
667
  export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
724
668
  <BrowserRouter>
725
669
  <Routes>
726
- {locales
727
- .filter(
728
- (locale) => middleware.prefixDefault || locale !== defaultLocale
729
- )
730
- .map((locale) => (
731
- <Route
732
- // Modèle de route pour capturer la locale (par exemple, /en/, /fr/) et correspondre à tous les chemins suivants
733
- path={`/${locale}/*`}
734
- key={locale}
735
- element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Enveloppe les enfants avec la gestion de la locale
736
- />
737
- ))}
738
-
739
- {
740
- // Si le préfixe de la locale par défaut est désactivé, rendre les enfants directement à la racine
741
- !middleware.prefixDefault && (
742
- <Route
743
- path="*"
744
- element={
745
- <AppLocalized locale={defaultLocale}>{children}</AppLocalized>
746
- } // Enveloppe les enfants avec la gestion de la locale
747
- />
748
- )
749
- }
670
+ {localeMap(({ locale, urlPrefix }) => (
671
+ <Route
672
+ // Modèle de route pour capturer la locale (par exemple, /en/, /fr/) et correspondre à tous les chemins suivants
673
+ path={`${urlPrefix}/*`}
674
+ key={locale}
675
+ element={
676
+ <IntlayerProvider locale={locale}>{children}</IntlayerProvider>
677
+ } // Enveloppe les enfants avec la gestion de la locale
678
+ />
679
+ ))}
750
680
  </Routes>
751
681
  </BrowserRouter>
752
682
  );
753
683
  ```
754
684
 
755
685
  ```jsx fileName="src/components/LocaleRouter.mjx" codeFormat="esm"
756
- // Importation des dépendances et fonctions nécessaires
757
- import { configuration, getPathWithoutLocale } from "intlayer"; // Fonctions utilitaires et types de 'intlayer'
758
- // Fonctions utilitaires et types de 'intlayer'
759
- import { IntlayerProvider } from "react-intlayer"; // Fournisseur pour le contexte d'internationalisation
760
- import {
761
- BrowserRouter,
762
- Routes,
763
- Route,
764
- Navigate,
765
- useLocation,
766
- } from "react-router-dom"; // Composants du routeur pour gérer la navigation
767
-
768
- // Déstructuration de la configuration depuis Intlayer
769
- const { internationalization, middleware } = configuration;
770
- const { locales, defaultLocale } = internationalization;
771
-
772
- /**
773
- * Un composant qui gère la localisation et enveloppe les enfants avec le contexte de locale approprié.
774
- * Il gère la détection et la validation de la locale basée sur l'URL.
775
- */
776
- const AppLocalized = ({ children, locale }) => {
777
- const { pathname, search } = useLocation(); // Obtenir le chemin URL actuel
778
-
779
- // Déterminer la locale actuelle, en revenant à la locale par défaut si non fournie
780
- const currentLocale = locale ?? defaultLocale;
781
-
782
- // Supprimer le préfixe de la locale du chemin pour construire un chemin de base
783
- const pathWithoutLocale = getPathWithoutLocale(
784
- pathname // Chemin URL actuel
785
- );
786
-
787
- /**
788
- * Si middleware.prefixDefault est vrai, la locale par défaut doit toujours être préfixée.
789
- */
790
- if (middleware.prefixDefault) {
791
- // Valider la locale
792
- if (!locale || !locales.includes(locale)) {
793
- // Rediriger vers la locale par défaut avec le chemin mis à jour
794
- return (
795
- <Navigate
796
- to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
797
- replace // Remplace l'entrée actuelle de l'historique par la nouvelle
798
- />
799
- );
800
- }
801
-
802
- // Envelopper les enfants avec IntlayerProvider et définir la locale actuelle
803
- return (
804
- <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
805
- );
806
- } else {
807
- /**
808
- * Lorsque middleware.prefixDefault est faux, la locale par défaut n'est pas préfixée.
809
- * Assurez-vous que la locale actuelle est valide et n'est pas la locale par défaut.
810
- */
811
- if (
812
- currentLocale.toString() !== defaultLocale.toString() &&
813
- !locales
814
- .filter(
815
- (locale) => locale.toString() !== defaultLocale.toString() // Exclure la locale par défaut
816
- )
817
- .includes(currentLocale) // Vérifie si la locale actuelle fait partie de la liste des locales valides
818
- ) {
819
- // Redirige vers le chemin sans préfixe de locale
820
- return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
821
- }
822
-
823
- // Enveloppe les enfants avec IntlayerProvider et définit la locale actuelle
824
- return (
825
- <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
826
- );
827
- }
828
- };
686
+ import { localeMap } from 'intlayer'; // Fonctions utilitaires et types provenant de 'intlayer'
687
+ import type { FC, PropsWithChildren } from 'react'; // Types React pour composants fonctionnels et props
688
+ import { IntlayerProvider } from 'react-intlayer'; // Fournisseur pour le contexte d'internationalisation
689
+ import { BrowserRouter, Route, Routes } from 'react-router-dom'; // Composants du routeur pour gérer la navigation
829
690
 
830
691
  /**
831
- * Un composant routeur qui configure les routes spécifiques à chaque locale.
692
+ * Un composant de routeur qui configure les routes spécifiques à chaque locale.
832
693
  * Il utilise React Router pour gérer la navigation et rendre les composants localisés.
833
694
  */
834
- export const LocaleRouter = ({ children }) => (
695
+ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
835
696
  <BrowserRouter>
836
697
  <Routes>
837
- {locales
838
- .filter(
839
- (locale) => middleware.prefixDefault || locale !== defaultLocale
840
- )
841
- .map((locale) => (
842
- <Route
843
- // Modèle de route pour capturer la locale (par exemple, /en/, /fr/) et correspondre à tous les chemins suivants
844
- path={`/${locale}/*`}
845
- key={locale}
846
- element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Enveloppe les enfants avec la gestion de la locale
847
- />
848
- ))}
849
-
850
- {
851
- // Si le préfixe de la locale par défaut est désactivé, rendre les enfants directement à la racine
852
- !middleware.prefixDefault && (
853
- <Route
854
- path="*"
855
- element={
856
- <AppLocalized locale={defaultLocale}>{children}</AppLocalized>
857
- } // Enveloppe les enfants avec la gestion de la locale
858
- />
859
- )
860
- }
698
+ {localeMap(({ locale, urlPrefix }) => (
699
+ <Route
700
+ // Modèle de route pour capturer la locale (par exemple, /en/, /fr/) et correspondre à tous les chemins suivants
701
+ path={`${urlPrefix}/*`}
702
+ key={locale}
703
+ element={
704
+ <IntlayerProvider locale={locale}>{children}</IntlayerProvider>
705
+ } // Enveloppe les enfants avec la gestion de la locale
706
+ />
707
+ ))}
861
708
  </Routes>
862
709
  </BrowserRouter>
863
710
  );
864
711
  ```
865
712
 
866
713
  ```jsx fileName="src/components/LocaleRouter.cjx" codeFormat="commonjs"
867
- // Importation des dépendances et fonctions nécessaires
868
- const { configuration, getPathWithoutLocale } = require("intlayer"); // Fonctions utilitaires et types de 'intlayer'
869
- const { IntlayerProvider, useLocale } = require("react-intlayer"); // Fournisseur pour le contexte d'internationalisation
870
- const {
871
- BrowserRouter,
872
- Routes,
873
- Route,
874
- Navigate,
875
- useLocation,
876
- } = require("react-router-dom"); // Composants du routeur pour gérer la navigation
877
-
878
- // Déstructuration de la configuration depuis Intlayer
879
- const { internationalization, middleware } = configuration;
880
- const { locales, defaultLocale } = internationalization;
714
+ const { localeMap } = require("intlayer"); // Fonctions utilitaires et types provenant de 'intlayer'
715
+ const React = require("react"); // Importer React
716
+ const { IntlayerProvider } = require("react-intlayer"); // Fournisseur pour le contexte d'internationalisation
717
+ const { BrowserRouter, Route, Routes } = require("react-router-dom"); // Composants du routeur pour gérer la navigation
881
718
 
882
719
  /**
883
- * Un composant qui gère la localisation et enveloppe les enfants avec le contexte de locale approprié.
884
- * Il gère la détection et la validation de la locale basée sur l'URL.
720
+ * Un composant de routeur qui configure les routes spécifiques à chaque locale.
721
+ * Il utilise React Router pour gérer la navigation et rendre les composants localisés.
885
722
  */
886
- const AppLocalized = ({ children, locale }) => {
887
- const { pathname, search } = useLocation(); // Obtenir le chemin URL actuel
888
-
889
- // Déterminer la locale actuelle, en revenant à la locale par défaut si non fournie
890
- const currentLocale = locale ?? defaultLocale;
891
-
892
- // Supprimer le préfixe de la locale du chemin pour construire un chemin de base
893
- const pathWithoutLocale = getPathWithoutLocale(
894
- pathname // Chemin URL actuel
723
+ const LocaleRouter = ({ children }) =>
724
+ React.createElement(
725
+ BrowserRouter,
726
+ {},
727
+ React.createElement(
728
+ Routes,
729
+ {},
730
+ localeMap(({ locale, urlPrefix }) =>
731
+ React.createElement(Route, {
732
+ path: `${urlPrefix}/*`,
733
+ key: locale,
734
+ element: React.createElement(IntlayerProvider, { locale }, children),
735
+ })
736
+ )
737
+ )
895
738
  );
896
739
 
897
- /**
898
- * Si middleware.prefixDefault est vrai, la locale par défaut doit toujours être préfixée.
899
- */
900
- if (middleware.prefixDefault) {
901
- // Valider la locale
902
- if (!locale || !locales.includes(locale)) {
903
- // Rediriger vers la locale par défaut avec le chemin mis à jour
904
- return (
905
- <Navigate
906
- to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
907
- replace // Remplace l'entrée actuelle de l'historique par la nouvelle
908
- />
909
- );
910
- }
911
-
912
- // Envelopper les enfants avec IntlayerProvider et définir la locale actuelle
913
- return (
914
- <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
915
- );
916
- } else {
917
- /**
918
- * Lorsque middleware.prefixDefault est faux, la locale par défaut n'est pas préfixée.
919
- * Assurez-vous que la locale actuelle est valide et n'est pas la locale par défaut.
920
- */
921
- if (
922
- currentLocale.toString() !== defaultLocale.toString() &&
923
- !locales
924
- .filter(
925
- (locale) => locale.toString() !== defaultLocale.toString() // Exclure la locale par défaut
926
- )
927
- .includes(currentLocale) // Vérifier si la locale actuelle est dans la liste des locales valides
928
- ) {
929
- // Rediriger vers le chemin sans préfixe de locale
930
- return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
931
- }
932
-
933
- // Envelopper les enfants avec IntlayerProvider et définir la locale courante
934
- return (
935
- <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
936
- );
937
- }
938
- };
939
-
940
- /**
941
- * Un composant de routeur qui configure des routes spécifiques à la locale.
942
- * Il utilise React Router pour gérer la navigation et rendre des composants localisés.
943
- */
944
- const LocaleRouter = ({ children }) => (
945
- <BrowserRouter>
946
- <Routes>
947
- {locales
948
- .filter(
949
- (locale) => middleware.prefixDefault || locale !== defaultLocale
950
- )
951
- .map((locale) => (
952
- <Route
953
- // Modèle de route pour capturer la locale (ex. : /en/, /fr/) et correspondre à tous les chemins suivants
954
- path={`/${locale}/*`}
955
- key={locale}
956
- element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Enveloppe les enfants avec la gestion de la locale
957
- />
958
- ))}
959
-
960
- {
961
- // Si le préfixe pour la locale par défaut est désactivé, rendre les enfants directement à la racine
962
- !middleware.prefixDefault && (
963
- <Route
964
- path="*"
965
- element={
966
- <AppLocalized locale={defaultLocale}>{children}</AppLocalized>
967
- } // Enveloppe les enfants avec la gestion de la locale
968
- />
969
- )
970
- }
971
- </Routes>
972
- </BrowserRouter>
973
- );
740
+ exports.LocaleRouter = LocaleRouter;
974
741
  ```
975
742
 
743
+ > Note : Si vous utilisez `routing.mode: 'no-prefix' | 'search-params'`, vous n'avez probablement pas besoin d'utiliser la fonction `localeMap`.
744
+
976
745
  Ensuite, vous pouvez utiliser le composant `LocaleRouter` dans votre application :
977
746
 
978
747
  ```tsx fileName="src/App.tsx" codeFormat="typescript"
@@ -1014,6 +783,8 @@ const App = () => (
1014
783
 
1015
784
  En parallèle, vous pouvez également utiliser le `intlayerProxy` pour ajouter un routage côté serveur à votre application. Ce plugin détectera automatiquement la locale actuelle en fonction de 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 linguistiques du navigateur de l'utilisateur. Si aucune locale n'est détectée, il redirigera vers la locale par défaut.
1016
785
 
786
+ > Notez que pour utiliser le `intlayerProxy` en production, vous devez déplacer le paquet `vite-intlayer` de `devDependencies` vers `dependencies`.
787
+
1017
788
  ```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
1018
789
  import { defineConfig } from "vite";
1019
790
  import react from "@vitejs/plugin-react-swc";
@@ -1049,7 +820,7 @@ module.exports = defineConfig({
1049
820
 
1050
821
  ### (Optionnel) Étape 8 : Modifier l'URL lorsque la langue change
1051
822
 
1052
- Pour modifier l'URL lorsque la langue change, vous pouvez utiliser la propriété `onLocaleChange` fournie par le hook `useLocale`. Parallèlement, vous pouvez utiliser les hooks `useLocation` et `useNavigate` de `react-router-dom` pour mettre à jour le chemin de l'URL.
823
+ Pour modifier l'URL lorsque la locale change, vous pouvez utiliser la propriété `onLocaleChange` fournie par le hook `useLocale`. Parallèlement, vous pouvez utiliser les hooks `useLocation` et `useNavigate` de `react-router-dom` pour mettre à jour le chemin de l'URL.
1053
824
 
1054
825
  ```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
1055
826
  import { useLocation, useNavigate } from "react-router-dom";
@@ -1246,14 +1017,14 @@ const LocaleSwitcher = () => {
1246
1017
 
1247
1018
  > Références de la documentation :
1248
1019
  >
1249
- > - [`useLocale` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/packages/react-intlayer/useLocale.md)
1250
- > - [`getLocaleName` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/packages/intlayer/getLocaleName.md)
1251
- > - [`getLocalizedUrl` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/packages/intlayer/getLocalizedUrl.md)
1252
- > - [`getHTMLTextDir` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/packages/intlayer/getHTMLTextDir.md)
1020
+ > - [`useLocale` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/react-intlayer/useLocale.md)
1021
+ > - [`getLocaleName` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/intlayer/getLocaleName.md)
1022
+ > - [`getLocalizedUrl` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/intlayer/getLocalizedUrl.md)
1023
+ > - [`getHTMLTextDir` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/intlayer/getHTMLTextDir.md)
1253
1024
  > - [`hrefLang` attribute](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr)
1254
- > - [`lang` attribute`](https://developer.mozilla.org/fr/docs/Web/HTML/Global_attributes/lang)
1255
- > - [`dir` attribute`](https://developer.mozilla.org/fr/docs/Web/HTML/Global_attributes/dir)
1256
- > - [`aria-current` attribute`](https://developer.mozilla.org/fr/docs/Web/Accessibility/ARIA/Attributes/aria-current)
1025
+ > - [`lang` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)
1026
+ > - [`dir` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir)
1027
+ > - [`aria-current` attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)
1257
1028
 
1258
1029
  Voici la **Étape 9** mise à jour avec des explications supplémentaires et des exemples de code affinés :
1259
1030
 
@@ -1425,31 +1196,6 @@ En appliquant ces modifications, votre application va :
1425
1196
  - Ajuster la **direction du texte** (`dir`) selon la locale, améliorant la lisibilité et l'utilisabilité pour les langues avec des ordres de lecture différents.
1426
1197
  - Fournir une expérience plus **accessible**, car les technologies d'assistance dépendent de ces attributs pour fonctionner de manière optimale.
1427
1198
 
1428
- ### (Optionnel) Étape 10 : Créer un composant de lien localisé
1429
-
1430
- ```tsx fileName="src/App.tsx" codeFormat="typescript"
1431
- // Appliquer le hook pour mettre à jour les attributs lang et dir de la balise <html> en fonction de la locale.
1432
- useI18nHTMLAttributes();
1433
-
1434
- // ... Le reste de votre composant
1435
- };
1436
-
1437
- const App = () => (
1438
- <IntlayerProvider>
1439
- <AppContent />
1440
- </IntlayerProvider>
1441
- );
1442
-
1443
- module.exports = App;
1444
-
1445
- ```
1446
-
1447
- En appliquant ces modifications, votre application va :
1448
-
1449
- - S'assurer que l'attribut **lang** reflète correctement la locale actuelle, ce qui est important pour le SEO et le comportement des navigateurs.
1450
- - Ajuster la **direction du texte** (`dir`) selon la locale, améliorant la lisibilité et l'utilisabilité pour les langues avec des ordres de lecture différents.
1451
- - Offrir une expérience plus **accessible**, car les technologies d'assistance dépendent de ces attributs pour fonctionner de manière optimale.
1452
-
1453
1199
  ### (Optionnel) Étape 10 : Créer un composant Link localisé
1454
1200
 
1455
1201
  Pour garantir que la navigation de votre application respecte la locale actuelle, vous pouvez créer un composant `Link` personnalisé. Ce composant préfixe automatiquement les URL internes avec la langue courante. Par exemple, lorsqu’un utilisateur francophone clique sur un lien vers la page "À propos", il est redirigé vers `/fr/about` au lieu de `/about`.
@@ -1471,11 +1217,10 @@ import {
1471
1217
  } from "react";
1472
1218
  import { useLocale } from "react-intlayer";
1473
1219
 
1474
- export interface LinkProps
1475
- extends DetailedHTMLProps<
1476
- AnchorHTMLAttributes<HTMLAnchorElement>,
1477
- HTMLAnchorElement
1478
- > {}
1220
+ export interface LinkProps extends DetailedHTMLProps<
1221
+ AnchorHTMLAttributes<HTMLAnchorElement>,
1222
+ HTMLAnchorElement
1223
+ > {}
1479
1224
 
1480
1225
  /**
1481
1226
  * Fonction utilitaire pour vérifier si une URL donnée est externe.
@@ -1602,9 +1347,9 @@ En intégrant ce composant `Link` dans toute votre application, vous maintenez u
1602
1347
 
1603
1348
  Intlayer utilise l’augmentation de module pour tirer parti de TypeScript et renforcer votre base de code.
1604
1349
 
1605
- ![texte alternatif](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png)
1350
+ ![Autocomplétion](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true)
1606
1351
 
1607
- ![texte alternatif](https://github.com/aymericzip/intlayer/blob/main/docs/assets/translation_error.png)
1352
+ ![Erreur de traduction](https://github.com/aymericzip/intlayer/blob/main/docs/assets/translation_error.png?raw=true)
1608
1353
 
1609
1354
  Assurez-vous que votre configuration TypeScript inclut les types générés automatiquement.
1610
1355
 
@@ -1625,6 +1370,7 @@ Il est recommandé d'ignorer les fichiers générés par Intlayer. Cela vous per
1625
1370
  Pour ce faire, vous pouvez ajouter les instructions suivantes dans votre fichier `.gitignore` :
1626
1371
 
1627
1372
  ```plaintext
1373
+ # Ignore the files generated by Intlayer
1628
1374
  .intlayer
1629
1375
  ```
1630
1376
 
@@ -1648,5 +1394,3 @@ Pour plus de détails sur l'utilisation de l'extension, consultez la [documentat
1648
1394
  ### Aller plus loin
1649
1395
 
1650
1396
  Pour aller plus loin, vous pouvez implémenter l’[éditeur visuel](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_visual_editor.md) ou externaliser votre contenu en utilisant le [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_CMS.md).
1651
-
1652
- ---
@@ -22,6 +22,7 @@ slugs:
22
22
  - doc
23
23
  - plugin
24
24
  - sync-json
25
+ youtubeVideo: https://www.youtube.com/watch?v=MpGMxniDHNg
25
26
  history:
26
27
  - version: 6.1.6
27
28
  date: 2025-10-05
@@ -30,6 +31,8 @@ history:
30
31
 
31
32
  # Sync JSON (ponts i18n)
32
33
 
34
+ <iframe title="Comment garder vos traductions JSON synchronisées avec Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/MpGMxniDHNg?autoplay=0&amp;origin=http://intlayer.org&amp;controls=0&amp;rel=1"/>
35
+
33
36
  Utilisez Intlayer comme un complément à votre pile i18n existante. Ce plugin maintient vos messages JSON synchronisés avec les dictionnaires Intlayer afin que vous puissiez :
34
37
 
35
38
  - Conserver i18next, next-intl, react-intl, vue-i18n, next-translate, nuxt-i18n, Solid-i18next, svelte-i18n, etc.