@intlayer/docs 7.3.13 → 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.
- package/blog/ar/intlayer_with_i18next.md +3 -0
- package/blog/ar/intlayer_with_next-i18next.md +3 -0
- package/blog/ar/intlayer_with_next-intl.md +3 -0
- package/blog/ar/intlayer_with_react-i18next.md +3 -0
- package/blog/ar/intlayer_with_react-intl.md +3 -0
- package/blog/ar/intlayer_with_vue-i18n.md +3 -0
- package/blog/de/intlayer_with_i18next.md +3 -0
- package/blog/de/intlayer_with_next-i18next.md +3 -0
- package/blog/de/intlayer_with_next-intl.md +3 -0
- package/blog/de/intlayer_with_react-i18next.md +3 -0
- package/blog/de/intlayer_with_react-intl.md +3 -0
- package/blog/de/intlayer_with_vue-i18n.md +3 -0
- package/blog/en/intlayer_with_i18next.md +7 -0
- package/blog/en/intlayer_with_next-i18next.md +3 -0
- package/blog/en/intlayer_with_next-intl.md +7 -0
- package/blog/en/intlayer_with_react-i18next.md +3 -0
- package/blog/en/intlayer_with_react-intl.md +3 -0
- package/blog/en/intlayer_with_vue-i18n.md +3 -0
- package/blog/en-GB/intlayer_with_i18next.md +3 -0
- package/blog/en-GB/intlayer_with_next-i18next.md +3 -0
- package/blog/en-GB/intlayer_with_next-intl.md +3 -0
- package/blog/en-GB/intlayer_with_react-i18next.md +3 -0
- package/blog/en-GB/intlayer_with_react-intl.md +3 -0
- package/blog/en-GB/intlayer_with_vue-i18n.md +3 -0
- package/blog/es/intlayer_with_i18next.md +3 -0
- package/blog/es/intlayer_with_next-i18next.md +3 -0
- package/blog/es/intlayer_with_next-intl.md +3 -0
- package/blog/es/intlayer_with_react-i18next.md +3 -0
- package/blog/es/intlayer_with_react-intl.md +3 -0
- package/blog/es/intlayer_with_vue-i18n.md +3 -0
- package/blog/fr/intlayer_with_i18next.md +3 -0
- package/blog/fr/intlayer_with_next-i18next.md +3 -0
- package/blog/fr/intlayer_with_next-intl.md +3 -0
- package/blog/fr/intlayer_with_react-i18next.md +3 -0
- package/blog/fr/intlayer_with_react-intl.md +3 -0
- package/blog/fr/intlayer_with_vue-i18n.md +3 -0
- package/blog/hi/intlayer_with_i18next.md +3 -0
- package/blog/hi/intlayer_with_next-i18next.md +3 -0
- package/blog/hi/intlayer_with_next-intl.md +3 -0
- package/blog/hi/intlayer_with_react-i18next.md +3 -0
- package/blog/hi/intlayer_with_react-intl.md +3 -0
- package/blog/hi/intlayer_with_vue-i18n.md +3 -0
- package/blog/id/intlayer_with_i18next.md +3 -0
- package/blog/id/intlayer_with_next-i18next.md +3 -0
- package/blog/id/intlayer_with_next-intl.md +3 -0
- package/blog/id/intlayer_with_react-i18next.md +3 -0
- package/blog/id/intlayer_with_react-intl.md +3 -0
- package/blog/id/intlayer_with_vue-i18n.md +3 -0
- package/blog/it/intlayer_with_i18next.md +3 -0
- package/blog/it/intlayer_with_next-i18next.md +3 -0
- package/blog/it/intlayer_with_next-intl.md +3 -0
- package/blog/it/intlayer_with_react-i18next.md +3 -0
- package/blog/it/intlayer_with_react-intl.md +3 -0
- package/blog/it/intlayer_with_vue-i18n.md +3 -0
- package/blog/ja/intlayer_with_i18next.md +3 -0
- package/blog/ja/intlayer_with_next-i18next.md +3 -0
- package/blog/ja/intlayer_with_next-intl.md +3 -0
- package/blog/ja/intlayer_with_react-i18next.md +3 -0
- package/blog/ja/intlayer_with_react-intl.md +3 -0
- package/blog/ja/intlayer_with_vue-i18n.md +3 -0
- package/blog/ko/intlayer_with_i18next.md +3 -0
- package/blog/ko/intlayer_with_next-i18next.md +3 -0
- package/blog/ko/intlayer_with_next-intl.md +3 -0
- package/blog/ko/intlayer_with_react-i18next.md +3 -0
- package/blog/ko/intlayer_with_react-intl.md +3 -0
- package/blog/ko/intlayer_with_vue-i18n.md +3 -0
- package/blog/pl/intlayer_with_i18next.md +3 -0
- package/blog/pl/intlayer_with_next-i18next.md +3 -0
- package/blog/pl/intlayer_with_next-intl.md +3 -0
- package/blog/pl/intlayer_with_react-i18next.md +3 -0
- package/blog/pl/intlayer_with_react-intl.md +3 -0
- package/blog/pl/intlayer_with_vue-i18n.md +3 -0
- package/blog/pt/intlayer_with_i18next.md +3 -0
- package/blog/pt/intlayer_with_next-i18next.md +3 -0
- package/blog/pt/intlayer_with_next-intl.md +3 -0
- package/blog/pt/intlayer_with_react-i18next.md +3 -0
- package/blog/pt/intlayer_with_react-intl.md +3 -0
- package/blog/pt/intlayer_with_vue-i18n.md +3 -0
- package/blog/ru/intlayer_with_i18next.md +3 -0
- package/blog/ru/intlayer_with_next-i18next.md +3 -0
- package/blog/ru/intlayer_with_next-intl.md +3 -0
- package/blog/ru/intlayer_with_react-i18next.md +3 -0
- package/blog/ru/intlayer_with_react-intl.md +3 -0
- package/blog/ru/intlayer_with_vue-i18n.md +3 -0
- package/blog/tr/intlayer_with_i18next.md +3 -0
- package/blog/tr/intlayer_with_next-i18next.md +3 -0
- package/blog/tr/intlayer_with_next-intl.md +3 -0
- package/blog/tr/intlayer_with_react-i18next.md +3 -0
- package/blog/tr/intlayer_with_vue-i18n.md +3 -0
- package/blog/vi/intlayer_with_i18next.md +3 -0
- package/blog/vi/intlayer_with_next-i18next.md +3 -0
- package/blog/vi/intlayer_with_next-intl.md +3 -0
- package/blog/vi/intlayer_with_react-i18next.md +3 -0
- package/blog/vi/intlayer_with_react-intl.md +3 -0
- package/blog/vi/intlayer_with_vue-i18n.md +3 -0
- package/blog/zh/intlayer_with_i18next.md +3 -0
- package/blog/zh/intlayer_with_next-i18next.md +3 -0
- package/blog/zh/intlayer_with_next-intl.md +3 -0
- package/blog/zh/intlayer_with_react-i18next.md +3 -0
- package/blog/zh/intlayer_with_react-intl.md +3 -0
- package/blog/zh/intlayer_with_vue-i18n.md +3 -0
- package/docs/ar/intlayer_with_lynx+react.md +1 -1
- package/docs/ar/intlayer_with_vite+react.md +99 -331
- package/docs/ar/plugins/sync-json.md +3 -0
- package/docs/de/intlayer_with_lynx+react.md +1 -1
- package/docs/de/intlayer_with_vite+react.md +116 -380
- package/docs/de/plugins/sync-json.md +3 -0
- package/docs/en/intlayer_with_vite+react.md +6 -10
- package/docs/en/plugins/sync-json.md +3 -0
- package/docs/en-GB/intlayer_with_vite+react.md +62 -74
- package/docs/en-GB/plugins/sync-json.md +3 -0
- package/docs/es/intlayer_with_vite+react.md +101 -333
- package/docs/es/plugins/sync-json.md +3 -0
- package/docs/fr/intlayer_with_vite+react.md +101 -357
- package/docs/fr/plugins/sync-json.md +3 -0
- package/docs/hi/intlayer_with_vite+react.md +120 -333
- package/docs/hi/plugins/sync-json.md +3 -0
- package/docs/id/intlayer_with_vite+react.md +7 -13
- package/docs/id/plugins/sync-json.md +3 -0
- package/docs/it/intlayer_with_lynx+react.md +1 -1
- package/docs/it/intlayer_with_vite+react.md +121 -393
- package/docs/it/plugins/sync-json.md +3 -0
- package/docs/ja/intlayer_with_vite+react.md +106 -378
- package/docs/ja/plugins/sync-json.md +3 -0
- package/docs/ko/intlayer_with_lynx+react.md +1 -1
- package/docs/ko/intlayer_with_vite+react.md +90 -322
- package/docs/ko/plugins/sync-json.md +3 -0
- package/docs/pl/intlayer_with_vite+react.md +25 -21
- package/docs/pl/plugins/sync-json.md +3 -0
- package/docs/pt/intlayer_with_vite+react.md +96 -328
- package/docs/pt/plugins/sync-json.md +3 -0
- package/docs/ru/intlayer_with_lynx+react.md +1 -1
- package/docs/ru/intlayer_with_vite+react.md +109 -362
- package/docs/ru/plugins/sync-json.md +3 -0
- package/docs/tr/intlayer_with_vite+react.md +132 -366
- package/docs/tr/plugins/sync-json.md +3 -0
- package/docs/vi/intlayer_with_vite+react.md +16 -19
- package/docs/vi/plugins/sync-json.md +3 -0
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/intlayer_with_vite+react.md +91 -374
- package/docs/zh/plugins/sync-json.md +3 -0
- package/frequent_questions/ar/customized_locale_list.md +1 -1
- package/frequent_questions/de/customized_locale_list.md +1 -1
- package/frequent_questions/en/customized_locale_list.md +1 -1
- package/frequent_questions/en-GB/customized_locale_list.md +1 -1
- package/frequent_questions/es/customized_locale_list.md +1 -1
- package/frequent_questions/fr/customized_locale_list.md +1 -1
- package/frequent_questions/hi/customized_locale_list.md +1 -1
- package/frequent_questions/id/customized_locale_list.md +1 -1
- package/frequent_questions/it/customized_locale_list.md +1 -1
- package/frequent_questions/ja/customized_locale_list.md +1 -1
- package/frequent_questions/ko/customized_locale_list.md +1 -1
- package/frequent_questions/pl/customized_locale_list.md +1 -1
- package/frequent_questions/pt/customized_locale_list.md +1 -1
- package/frequent_questions/ru/customized_locale_list.md +1 -1
- package/frequent_questions/tr/customized_locale_list.md +1 -1
- package/frequent_questions/vi/customized_locale_list.md +1 -1
- package/frequent_questions/zh/customized_locale_list.md +1 -1
- package/package.json +10 -9
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-03-07
|
|
3
|
-
updatedAt:
|
|
4
|
-
title: Comment traduire votre Vite
|
|
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
|
-
#
|
|
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
|
|
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
|
-
|
|
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: "
|
|
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
|
-
|
|
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`)
|
|
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/
|
|
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
|
-
//
|
|
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
|
-
{
|
|
727
|
-
|
|
728
|
-
(
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
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
|
-
//
|
|
757
|
-
import {
|
|
758
|
-
|
|
759
|
-
import {
|
|
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
|
-
{
|
|
838
|
-
|
|
839
|
-
(
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
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
|
-
//
|
|
868
|
-
const
|
|
869
|
-
const { IntlayerProvider
|
|
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
|
|
884
|
-
* Il
|
|
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
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
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
|
|
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/
|
|
1250
|
-
> - [`getLocaleName` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/
|
|
1251
|
-
> - [`getLocalizedUrl` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/
|
|
1252
|
-
> - [`getHTMLTextDir` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/
|
|
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
|
|
1255
|
-
> - [`dir` attribute
|
|
1256
|
-
> - [`aria-current` attribute
|
|
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
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
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
|
-

|
|
1606
1351
|
|
|
1607
|
-

|
|
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&origin=http://intlayer.org&controls=0&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.
|