@intlayer/docs 5.8.0-canary.0 → 5.8.1-canary.0
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_next-i18next.md +2 -2
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +96 -219
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +88 -129
- package/blog/ar/vue-i18n_vs_intlayer.md +268 -0
- package/blog/de/intlayer_with_next-i18next.md +2 -2
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/de/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/de/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en/intlayer_with_next-i18next.md +2 -2
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +88 -120
- package/blog/en/vue-i18n_vs_intlayer.md +276 -0
- package/blog/en-GB/intlayer_with_next-i18next.md +2 -2
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +85 -218
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +80 -130
- package/blog/en-GB/vue-i18n_vs_intlayer.md +258 -0
- package/blog/es/intlayer_with_next-i18next.md +2 -2
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/es/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/es/vue-i18n_vs_intlayer.md +268 -0
- package/blog/fr/intlayer_with_next-i18next.md +2 -2
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/fr/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/fr/vue-i18n_vs_intlayer.md +269 -0
- package/blog/hi/intlayer_with_next-i18next.md +2 -2
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +97 -220
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/hi/vue-i18n_vs_intlayer.md +268 -0
- package/blog/it/intlayer_with_next-i18next.md +2 -2
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/it/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ja/intlayer_with_next-i18next.md +2 -2
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ja/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ko/intlayer_with_next-i18next.md +2 -2
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +95 -217
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/ko/vue-i18n_vs_intlayer.md +268 -0
- package/blog/pt/intlayer_with_next-i18next.md +2 -2
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/pt/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ru/intlayer_with_next-i18next.md +2 -2
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +94 -217
- package/blog/ru/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ru/vue-i18n_vs_intlayer.md +268 -0
- package/blog/zh/intlayer_with_next-i18next.md +2 -2
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/zh/vue-i18n_vs_intlayer.md +269 -0
- package/dist/cjs/generated/blog.entry.cjs +41 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +41 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/docs/ar/formatters.md +417 -31
- package/docs/ar/how_works_intlayer.md +2 -4
- package/docs/ar/interest_of_intlayer.md +7 -10
- package/docs/ar/intlayer_CMS.md +2 -3
- package/docs/ar/intlayer_visual_editor.md +2 -3
- package/docs/ar/intlayer_with_tanstack.md +1 -1
- package/docs/ar/introduction.md +4 -4
- package/docs/de/formatters.md +444 -34
- package/docs/de/introduction.md +2 -2
- package/docs/en/dictionary/enumeration.md +2 -2
- package/docs/en/dictionary/function_fetching.md +2 -2
- package/docs/en/dictionary/get_started.md +2 -2
- package/docs/en/dictionary/translation.md +2 -2
- package/docs/en/formatters.md +383 -15
- package/docs/en/how_works_intlayer.md +2 -4
- package/docs/en/interest_of_intlayer.md +48 -29
- package/docs/en/intlayer_CMS.md +2 -3
- package/docs/en/intlayer_visual_editor.md +2 -3
- package/docs/en/intlayer_with_create_react_app.md +2 -2
- package/docs/en/intlayer_with_express.md +2 -2
- package/docs/en/intlayer_with_tanstack.md +1 -1
- package/docs/en/introduction.md +4 -4
- package/docs/en/packages/express-intlayer/index.md +2 -2
- package/docs/en/packages/intlayer/getConfiguration.md +2 -3
- package/docs/en/packages/intlayer/getEnumeration.md +2 -7
- package/docs/en/packages/intlayer/getHTMLTextDir.md +2 -4
- package/docs/en/packages/intlayer/getLocaleLang.md +2 -4
- package/docs/en/packages/intlayer/getLocaleName.md +2 -3
- package/docs/en/packages/intlayer/getLocalizedUrl.md +2 -8
- package/docs/en/packages/intlayer/getMultilingualUrls.md +2 -7
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +2 -3
- package/docs/en/packages/intlayer/getTranslation.md +2 -4
- package/docs/en/packages/intlayer/index.md +2 -2
- package/docs/en/packages/next-intlayer/index.md +2 -2
- package/docs/en/packages/next-intlayer/t.md +2 -2
- package/docs/en/packages/next-intlayer/useDictionary.md +2 -2
- package/docs/en/packages/next-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/next-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-intlayer/index.md +2 -2
- package/docs/en/packages/react-intlayer/t.md +2 -2
- package/docs/en/packages/react-intlayer/useI18n.md +2 -2
- package/docs/en/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/react-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-scripts-intlayer/index.md +2 -2
- package/docs/en/packages/solid-intlayer/index.md +2 -2
- package/docs/en/packages/vite-intlayer/index.md +2 -2
- package/docs/en-GB/formatters.md +402 -16
- package/docs/en-GB/how_works_intlayer.md +2 -4
- package/docs/en-GB/interest_of_intlayer.md +7 -10
- package/docs/en-GB/intlayer_with_tanstack.md +1 -1
- package/docs/en-GB/introduction.md +2 -2
- package/docs/es/formatters.md +438 -28
- package/docs/es/how_works_intlayer.md +2 -4
- package/docs/es/interest_of_intlayer.md +7 -10
- package/docs/es/intlayer_with_tanstack.md +1 -1
- package/docs/es/introduction.md +2 -2
- package/docs/fr/formatters.md +438 -28
- package/docs/fr/how_works_intlayer.md +2 -4
- package/docs/fr/interest_of_intlayer.md +7 -10
- package/docs/fr/intlayer_with_tanstack.md +1 -1
- package/docs/fr/introduction.md +2 -2
- package/docs/hi/formatters.md +430 -39
- package/docs/hi/how_works_intlayer.md +2 -4
- package/docs/hi/interest_of_intlayer.md +7 -10
- package/docs/hi/intlayer_with_tanstack.md +1 -1
- package/docs/hi/introduction.md +2 -2
- package/docs/it/formatters.md +438 -30
- package/docs/it/how_works_intlayer.md +2 -4
- package/docs/it/interest_of_intlayer.md +7 -10
- package/docs/it/intlayer_with_tanstack.md +1 -1
- package/docs/it/introduction.md +2 -2
- package/docs/ja/formatters.md +435 -47
- package/docs/ja/how_works_intlayer.md +2 -4
- package/docs/ja/interest_of_intlayer.md +7 -10
- package/docs/ja/intlayer_with_tanstack.md +1 -1
- package/docs/ja/introduction.md +2 -2
- package/docs/ko/formatters.md +432 -41
- package/docs/ko/how_works_intlayer.md +2 -4
- package/docs/ko/interest_of_intlayer.md +7 -10
- package/docs/ko/intlayer_with_tanstack.md +1 -1
- package/docs/ko/introduction.md +2 -2
- package/docs/pt/formatters.md +416 -30
- package/docs/pt/how_works_intlayer.md +2 -4
- package/docs/pt/intlayer_with_tanstack.md +1 -1
- package/docs/pt/introduction.md +2 -2
- package/docs/ru/autoFill.md +2 -2
- package/docs/ru/configuration.md +1 -40
- package/docs/ru/formatters.md +438 -28
- package/docs/ru/how_works_intlayer.md +5 -7
- package/docs/ru/index.md +1 -1
- package/docs/ru/interest_of_intlayer.md +8 -11
- package/docs/ru/intlayer_CMS.md +7 -8
- package/docs/ru/intlayer_cli.md +4 -7
- package/docs/ru/intlayer_visual_editor.md +5 -6
- package/docs/ru/intlayer_with_angular.md +1 -1
- package/docs/ru/intlayer_with_create_react_app.md +5 -5
- package/docs/ru/intlayer_with_lynx+react.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +3 -3
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +1 -1
- package/docs/ru/intlayer_with_react_native+expo.md +2 -2
- package/docs/ru/intlayer_with_tanstack.md +3 -3
- package/docs/ru/intlayer_with_vite+preact.md +3 -3
- package/docs/ru/intlayer_with_vite+react.md +3 -3
- package/docs/ru/intlayer_with_vite+solid.md +1 -1
- package/docs/ru/intlayer_with_vite+svelte.md +1 -1
- package/docs/ru/intlayer_with_vite+vue.md +2 -2
- package/docs/ru/introduction.md +5 -5
- package/docs/ru/locale_mapper.md +1 -1
- package/docs/ru/packages/@intlayer/api/index.md +2 -2
- package/docs/ru/packages/@intlayer/chokidar/index.md +1 -1
- package/docs/ru/packages/@intlayer/cli/index.md +2 -2
- package/docs/ru/packages/@intlayer/config/index.md +2 -2
- package/docs/ru/packages/@intlayer/core/index.md +2 -2
- package/docs/ru/packages/@intlayer/design-system/index.md +2 -2
- package/docs/ru/packages/@intlayer/dictionary-entry/index.md +2 -2
- package/docs/ru/packages/@intlayer/editor/index.md +1 -1
- package/docs/ru/packages/@intlayer/editor-react/index.md +1 -1
- package/docs/ru/packages/@intlayer/webpack/index.md +1 -1
- package/docs/ru/packages/angular-intlayer/index.md +1 -1
- package/docs/ru/packages/express-intlayer/index.md +3 -3
- package/docs/ru/packages/express-intlayer/t.md +1 -1
- package/docs/ru/packages/intlayer/getEnumeration.md +3 -8
- package/docs/ru/packages/intlayer/getTranslation.md +3 -5
- package/docs/ru/packages/intlayer/getTranslationContent.md +1 -3
- package/docs/ru/packages/intlayer/index.md +3 -3
- package/docs/ru/packages/intlayer-cli/index.md +1 -1
- package/docs/ru/packages/intlayer-editor/index.md +2 -2
- package/docs/ru/packages/lynx-intlayer/index.md +1 -1
- package/docs/ru/packages/next-intlayer/index.md +4 -4
- package/docs/ru/packages/next-intlayer/t.md +4 -4
- package/docs/ru/packages/next-intlayer/useLocale.md +3 -3
- package/docs/ru/packages/nuxt-intlayer/index.md +1 -1
- package/docs/ru/packages/preact-intlayer/index.md +1 -1
- package/docs/ru/packages/react-intlayer/index.md +4 -4
- package/docs/ru/packages/react-intlayer/t.md +4 -4
- package/docs/ru/packages/react-native-intlayer/index.md +1 -1
- package/docs/ru/packages/react-scripts-intlayer/index.md +3 -3
- package/docs/ru/packages/solid-intlayer/index.md +3 -3
- package/docs/ru/packages/svelte-intlayer/index.md +1 -1
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/packages/vue-intlayer/index.md +1 -1
- package/docs/ru/per_locale_file.md +1 -1
- package/docs/ru/roadmap.md +3 -5
- package/docs/ru/vs_code_extension.md +1 -1
- package/docs/zh/formatters.md +446 -38
- package/docs/zh/how_works_intlayer.md +2 -4
- package/docs/zh/interest_of_intlayer.md +7 -10
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/introduction.md +2 -2
- package/frequent_questions/ar/domain_routing.md +1 -1
- package/frequent_questions/en/domain_routing.md +1 -1
- package/frequent_questions/en-GB/domain_routing.md +1 -1
- package/frequent_questions/es/domain_routing.md +1 -1
- package/frequent_questions/fr/domain_routing.md +1 -1
- package/frequent_questions/hi/domain_routing.md +1 -1
- package/frequent_questions/it/domain_routing.md +1 -1
- package/frequent_questions/ko/domain_routing.md +1 -1
- package/frequent_questions/pt/domain_routing.md +1 -1
- package/frequent_questions/ru/domain_routing.md +1 -1
- package/frequent_questions/ru/get_locale_cookie.md +4 -4
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -1
- package/package.json +9 -11
- package/src/generated/blog.entry.ts +42 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt:
|
|
3
|
-
updatedAt: 2025-
|
|
2
|
+
createdAt: 2025-08-23
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
4
|
title: next-i18next vs next-intl vs Intlayer
|
|
5
|
-
description:
|
|
5
|
+
description: Comparaison de next-i18next avec next-intl et Intlayer pour l'internationalisation (i18n) d'une application Next.js
|
|
6
6
|
keywords:
|
|
7
7
|
- next-intl
|
|
8
8
|
- next-i18next
|
|
@@ -17,269 +17,146 @@ slugs:
|
|
|
17
17
|
- next-i18next-vs-next-intl-vs-intlayer
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
# next-i18next VS next-intl VS
|
|
20
|
+
# next-i18next VS next-intl VS intlayer | Internationalisation (i18n) Next.js
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Ce guide compare trois options i18n largement utilisées pour **Next.js** : **next-intl**, **next-i18next** et **Intlayer**.
|
|
23
|
+
Nous nous concentrons sur **Next.js 13+ App Router** (avec **React Server Components**) et évaluons :
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
1. **Architecture** (garder les traductions près de leurs composants)
|
|
27
|
-
2. **Support TypeScript**
|
|
25
|
+
1. **Architecture & organisation du contenu**
|
|
26
|
+
2. **TypeScript & sécurité**
|
|
28
27
|
3. **Gestion des traductions manquantes**
|
|
29
|
-
4. **
|
|
30
|
-
5. **
|
|
31
|
-
6. **
|
|
28
|
+
4. **Routage & middleware**
|
|
29
|
+
5. **Performance & comportement de chargement**
|
|
30
|
+
6. **Expérience développeur (DX), outils & maintenance**
|
|
31
|
+
7. **SEO & scalabilité pour les grands projets**
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
> **En résumé** : Les trois solutions peuvent localiser une application Next.js. Si vous souhaitez un **contenu scoped par composant**, des **types TypeScript stricts**, des **vérifications des clés manquantes à la compilation**, des **dictionnaires optimisés par tree-shaking**, ainsi que des **helpers App Router et SEO de première classe**, **Intlayer** est le choix le plus complet et moderne.
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
37
|
-
##
|
|
38
|
-
|
|
39
|
-
### 1. next-intl
|
|
37
|
+
## Positionnement général
|
|
40
38
|
|
|
41
|
-
|
|
39
|
+
- **next-intl** - Formatage de messages léger et simple avec un bon support Next.js. Les catalogues centralisés sont courants ; l’expérience développeur est simple, mais la sécurité et la maintenance à grande échelle restent principalement de votre responsabilité.
|
|
40
|
+
- **next-i18next** - i18next habillé pour Next.js. Écosystème mature et fonctionnalités via des plugins (par exemple, ICU), mais la configuration peut être verbeuse et les catalogues ont tendance à se centraliser à mesure que les projets grandissent.
|
|
41
|
+
- **Intlayer** - Modèle de contenu centré sur les composants pour Next.js, **typage TS strict**, **vérifications à la compilation**, **tree-shaking**, **middleware intégré et helpers SEO**, **éditeur visuel/CMS** optionnel, et **traductions assistées par IA**.
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
- **Support TypeScript** : Intégration TypeScript basique. Certaines définitions de types existent, mais elles ne sont pas fortement centrées sur l'auto-génération de définitions TypeScript à partir de vos fichiers de traduction.
|
|
45
|
-
- **Traductions manquantes** : Mécanisme de repli basique. Par défaut, se repli sur une clé ou une chaîne de locale par défaut. Pas d'outils robustes dès la sortie de la boîte pour des vérifications avancées des traductions manquantes.
|
|
46
|
-
- **Support des Composants Serveur** : Fonctionne avec Next.js 13+ en général, mais le modèle est moins spécialisé pour une utilisation server-side profonde (par exemple, composants serveur avec routage dynamique complexe).
|
|
47
|
-
- **Routage & Middleware** : Le support de middleware est possible mais limité. Dépend généralement de `Middleware` de Next.js pour la détection de locale, ou de la configuration manuelle pour la réécriture des chemins de locale.
|
|
48
|
-
- **Simplicité de configuration** : Très simple. Un minimum de boilerplate est nécessaire.
|
|
43
|
+
---
|
|
49
44
|
|
|
50
|
-
|
|
45
|
+
## Comparaison des fonctionnalités côte à côte (axée sur Next.js)
|
|
46
|
+
|
|
47
|
+
| Fonctionnalité | `next-intlayer` (Intlayer) | `next-intl` | `next-i18next` |
|
|
48
|
+
| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
49
|
+
| **Traductions Près des Composants** | ✅ Oui, contenu collé avec chaque composant | ❌ Non | ❌ Non |
|
|
50
|
+
| **Intégration TypeScript** | ✅ Avancée, types stricts générés automatiquement | ✅ Bonne | ⚠️ Basique |
|
|
51
|
+
| **Détection des Traductions Manquantes** | ✅ Mise en évidence des erreurs TypeScript et erreur/avertissement à la compilation | ⚠️ Repli à l'exécution | ⚠️ Repli à l'exécution |
|
|
52
|
+
| **Contenu Riche (JSX/Markdown/composants)** | ✅ Support direct | ❌ Non conçu pour des nœuds riches | ⚠️ Limité |
|
|
53
|
+
| **Traduction assistée par IA** | ✅ Oui, supporte plusieurs fournisseurs d'IA. Utilisable avec vos propres clés API. Prend en compte le contexte de votre application et la portée du contenu | ❌ Non | ❌ Non |
|
|
54
|
+
| **Éditeur Visuel** | ✅ Oui, éditeur visuel local + CMS optionnel ; peut externaliser le contenu de la base de code ; intégrable | ❌ Non / disponible via des plateformes de localisation externes | ❌ Non / disponible via des plateformes de localisation externes |
|
|
55
|
+
| **Routage Localisé** | ✅ Oui, supporte les chemins localisés nativement (fonctionne avec Next.js & Vite) | ✅ Intégré, App Router supporte le segment `[locale]` | ✅ Intégré |
|
|
56
|
+
| **Génération Dynamique de Routes** | ✅ Oui | ✅ Oui | ✅ Oui |
|
|
57
|
+
| **Pluriels** | ✅ Modèles basés sur des énumérations | ✅ Bon | ✅ Bon |
|
|
58
|
+
| **Formatage (dates, nombres, devises)** | ✅ Formatteurs optimisés (Intl en interne) | ✅ Bon (helpers Intl) | ✅ Bon (helpers Intl) |
|
|
59
|
+
| **Format de contenu** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml en cours de développement) | ✅ .json, .js, .ts | ⚠️ .json |
|
|
60
|
+
| **Support ICU** | ⚠️ En cours de développement | ✅ Oui | ⚠️ Via plugin (`i18next-icu`) |
|
|
61
|
+
| **Aides SEO (hreflang, sitemap)** | ✅ Outils intégrés : aides pour sitemap, robots.txt, métadonnées | ✅ Bon | ✅ Bon |
|
|
62
|
+
| **Écosystème / Communauté** | ⚠️ Plus petite mais en croissance rapide et réactive | ✅ Taille moyenne, axée sur Next.js | ✅ Taille moyenne, axée sur Next.js |
|
|
63
|
+
| **Rendu côté serveur & Composants Serveur** | ✅ Oui, optimisé pour SSR / Composants Serveur React | ⚠️ Pris en charge au niveau de la page mais nécessite de passer les fonctions t dans l’arbre des composants pour les composants serveurs enfants | ⚠️ Pris en charge au niveau de la page mais nécessite de passer les fonctions t dans l’arbre des composants pour les composants serveurs enfants |
|
|
64
|
+
| **Tree-shaking (chargement uniquement du contenu utilisé)** | ✅ Oui, par composant au moment de la compilation via les plugins Babel/SWC | ⚠️ Partiel | ⚠️ Partiel |
|
|
65
|
+
| **Chargement paresseux** | ✅ Oui, par locale / par dictionnaire | ✅ Oui (par route / par locale), nécessite une gestion des espaces de noms | ✅ Oui (par route / par locale), nécessite une gestion des espaces de noms |
|
|
66
|
+
| **Purge du contenu inutilisé** | ✅ Oui, par dictionnaire au moment de la compilation | ❌ Non, peut être géré manuellement avec la gestion des espaces de noms | ❌ Non, peut être géré manuellement avec la gestion des espaces de noms |
|
|
67
|
+
| **Gestion des grands projets** | ✅ Encourage la modularité, adapté aux design-systems | ✅ Modulaire avec configuration | ✅ Modulaire avec configuration |
|
|
51
68
|
|
|
52
69
|
---
|
|
53
70
|
|
|
54
|
-
|
|
71
|
+
## Comparaison approfondie
|
|
55
72
|
|
|
56
|
-
|
|
73
|
+
### 1) Architecture et évolutivité
|
|
57
74
|
|
|
58
|
-
- **
|
|
59
|
-
- **
|
|
60
|
-
- **Traductions manquantes** : i18next offre des interpolations/replis. Cependant, la détection des traductions manquantes nécessite généralement une configuration supplémentaire ou des plugins tiers.
|
|
61
|
-
- **Support des Composants Serveur** : L'utilisation de base avec Next.js 13 est documentée, mais une utilisation avancée (par exemple, intégration profonde avec les composants serveur, génération de routes dynamiques) peut être fastidieuse.
|
|
62
|
-
- **Routage & Middleware** : Dépend fortement de `Middleware` de Next.js et des réécritures pour les sous-chemins de locale. Pour des configurations plus complexes, vous pourriez avoir besoin de plonger dans la configuration avancée d'i18next.
|
|
63
|
-
- **Simplicité de configuration** : Approche familière pour ceux qui sont habitués à i18next. Cependant, cela peut devenir plus lourd en boilerplate lorsque des fonctionnalités avancées de l'i18n sont nécessaires (noms de namespaces, plusieurs locales de repli, etc.).
|
|
75
|
+
- **next-intl / next-i18next** : Par défaut, utilise des **catalogues centralisés** par locale (plus les **espaces de noms** dans i18next). Fonctionne bien au début, mais devient souvent une grande surface partagée avec un couplage croissant et une forte rotation des clés.
|
|
76
|
+
- **Intlayer** : Encourage les dictionnaires **par composant** (ou par fonctionnalité) **co-localisés** avec le code qu’ils servent. Cela réduit la charge cognitive, facilite la duplication/migration des éléments UI, et diminue les conflits entre équipes. Le contenu inutilisé est naturellement plus facile à repérer et à purger.
|
|
64
77
|
|
|
65
|
-
**
|
|
78
|
+
**Pourquoi c’est important :** Dans les grandes bases de code ou les configurations de design-systems, le **contenu modulaire** évolue mieux que les catalogues monolithiques.
|
|
66
79
|
|
|
67
80
|
---
|
|
68
81
|
|
|
69
|
-
###
|
|
70
|
-
|
|
71
|
-
**Focus principal** : Une bibliothèque i18n moderne, open-source, spécifiquement conçue pour Next.js **App Router** (12, 13, 14 et 15) avec un support intégré pour **Server Components** et **Turbopack**.
|
|
82
|
+
### 2) TypeScript & sécurité
|
|
72
83
|
|
|
73
|
-
|
|
84
|
+
- **next-intl** : Support solide de TypeScript, mais les **clés ne sont pas strictement typées par défaut** ; vous devrez maintenir manuellement les patterns de sécurité.
|
|
85
|
+
- **next-i18next** : Typages de base pour les hooks ; la **typage strict des clés nécessite des outils/configurations supplémentaires**.
|
|
86
|
+
- **Intlayer** : **Génère des types stricts** à partir de votre contenu. L’**autocomplétion dans l’IDE** et les **erreurs à la compilation** détectent les fautes de frappe et les clés manquantes avant le déploiement.
|
|
74
87
|
|
|
75
|
-
|
|
88
|
+
**Pourquoi c’est important :** Le typage fort déplace les erreurs vers la **gauche** (CI/build) au lieu de la **droite** (exécution).
|
|
76
89
|
|
|
77
|
-
|
|
78
|
-
- Cela rend votre code plus **modulaire et maintenable**, surtout dans de grandes bases de code.
|
|
79
|
-
|
|
80
|
-
2. **Support TypeScript**
|
|
81
|
-
|
|
82
|
-
- **Définitions de types auto-générées** : Dès que vous définissez votre contenu, Intlayer génère des types qui alimentent l'auto-complétion et attrapent les erreurs de traduction.
|
|
83
|
-
- Minimise les erreurs d'exécution comme les clés manquantes et offre une **auto-complétion** avancée directement dans votre IDE.
|
|
84
|
-
|
|
85
|
-
3. **Gestion des Traductions Manquantes**
|
|
90
|
+
---
|
|
86
91
|
|
|
87
|
-
|
|
88
|
-
- Cela garantit que vous ne shippez jamais accidentellement avec du texte manquant dans vos langues.
|
|
92
|
+
### 3) Gestion des traductions manquantes
|
|
89
93
|
|
|
90
|
-
|
|
94
|
+
- **next-intl / next-i18next** : Dépendent des **solutions de secours à l’exécution** (par exemple, afficher la clé ou la locale par défaut). La compilation ne plante pas.
|
|
95
|
+
- **Intlayer** : **Détection à la compilation** avec des **avertissements/erreurs** pour les locales ou clés manquantes.
|
|
91
96
|
|
|
92
|
-
|
|
93
|
-
- Fournit des fournisseurs spécialisés (`IntlayerServerProvider`, `IntlayerClientProvider`) pour **isoler le contexte serveur** (vital lors du traitement avec Next.js 13+).
|
|
97
|
+
**Pourquoi c’est important :** Détecter les lacunes lors de la compilation évite les « chaînes mystères » en production et s’aligne avec des règles strictes de publication.
|
|
94
98
|
|
|
95
|
-
|
|
99
|
+
---
|
|
96
100
|
|
|
97
|
-
|
|
98
|
-
- Gère dynamiquement les chemins localisés (par ex., `/en-US/about` contre `/fr/about`) avec une configuration minimale.
|
|
99
|
-
- Offre des méthodes d'assistance comme `getMultilingualUrls` pour générer des liens en langues alternatives (idéal pour le **SEO**).
|
|
101
|
+
### 4) Routage, middleware & stratégie d’URL
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
- Un plugin-wrapper `withIntlayer(nextConfig)` qui **injecte** toutes les variables d'environnement et les observateurs pour votre contenu.
|
|
104
|
-
- **Pas de grandes configurations de repli**, le système est conçu pour « fonctionner tout simplement » avec un minimum de friction.
|
|
103
|
+
- Les trois fonctionnent avec le **routage localisé Next.js** sur l’App Router.
|
|
104
|
+
- **Intlayer** va plus loin avec un **middleware i18n** (détection de la locale via les headers/cookies) et des **helpers** pour générer des URLs localisées et des balises `<link rel="alternate" hreflang="…">`.
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
**Pourquoi c’est important :** Moins de couches de liaison personnalisées ; **expérience utilisateur cohérente** et **SEO propre** à travers les locales.
|
|
107
107
|
|
|
108
108
|
---
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
| **Fonctionnalité** | **next-intl** | **next-i18next** | **Intlayer** |
|
|
113
|
-
| ------------------------------------------------- | -------------------------------------------- | --------------------------------------------------------------- | ----------------------------------------------------- |
|
|
114
|
-
| **Conserver les traductions près des composants** | Partiel – généralement un dossier de locales | Pas par défaut – souvent `public/locales` | **Oui – recommandé & facile** |
|
|
115
|
-
| **TypeScript Auto-généré** | Définition TS de base | Support TS de base | **Oui – avancé dès la sortie de la boîte** |
|
|
116
|
-
| **Détection des traductions manquantes** | Principalement des chaînes de repli | Principalement des chaînes de repli | **Oui – vérifications au moment de la construction** |
|
|
117
|
-
| **Support des Composants Serveur** | Fonctionne mais pas spécialisé | Supporté mais peut être verbeux | **Support complet avec des fournisseurs spécialisés** |
|
|
118
|
-
| **Routage & Middleware** | Intégré manuellement avec Next middleware | Fournie via la réécriture de config | **Middleware i18n dédié + hooks avancés** |
|
|
119
|
-
| **Complexité de Configuration** | Simple, configuration minimale | Traditionnelle, peut être verbeuse pour une utilisation avancée | **Un fichier de config & plugin** |
|
|
120
|
-
|
|
121
|
-
---
|
|
110
|
+
### 5) Alignement avec les Server Components (RSC)
|
|
122
111
|
|
|
123
|
-
|
|
112
|
+
- **Tous** supportent Next.js 13+.
|
|
113
|
+
- **Intlayer** facilite la **frontière serveur/client** avec une API cohérente et des providers conçus pour RSC, évitant ainsi de passer des formateurs ou des fonctions t à travers les arbres de composants.
|
|
124
114
|
|
|
125
|
-
|
|
115
|
+
**Pourquoi c’est important :** Modèle mental plus clair et moins de cas limites dans les arbres hybrides.
|
|
126
116
|
|
|
127
|
-
|
|
117
|
+
---
|
|
128
118
|
|
|
129
|
-
|
|
119
|
+
### 6) Performance et comportement de chargement
|
|
130
120
|
|
|
131
|
-
|
|
121
|
+
- **next-intl / next-i18next** : Contrôle partiel via les **espaces de noms** et les **découpages au niveau des routes** ; risque d’inclure des chaînes inutilisées si la discipline n’est pas respectée.
|
|
122
|
+
- **Intlayer** : Effectue du **tree-shaking** à la compilation et **charge paresseusement par dictionnaire/locale**. Le contenu inutilisé n’est pas inclus.
|
|
132
123
|
|
|
133
|
-
|
|
124
|
+
**Pourquoi c’est important :** Des bundles plus petits et un démarrage plus rapide, surtout sur des sites multi-locales.
|
|
134
125
|
|
|
135
|
-
|
|
126
|
+
---
|
|
136
127
|
|
|
137
|
-
|
|
128
|
+
### 7) Expérience développeur, outils et maintenance
|
|
138
129
|
|
|
139
|
-
|
|
130
|
+
- **next-intl / next-i18next** : Vous connecterez généralement des plateformes externes pour les traductions et les flux éditoriaux.
|
|
131
|
+
- **Intlayer** : Propose un **éditeur visuel gratuit** et un **CMS optionnel** (compatible Git ou externalisé). Plus une **extension VSCode** pour la rédaction de contenu et des **traductions assistées par IA** utilisant vos propres clés de fournisseur.
|
|
140
132
|
|
|
141
|
-
|
|
142
|
-
- Un middleware standard `intlayerMiddleware` ne nécessite pas de réécritures personnalisées approfondies.
|
|
133
|
+
**Pourquoi c’est important :** Réduit les coûts opérationnels et raccourcit la boucle entre les développeurs et les auteurs de contenu.
|
|
143
134
|
|
|
144
|
-
|
|
135
|
+
---
|
|
145
136
|
|
|
146
|
-
|
|
147
|
-
- Utilisation claire et directe pour les composants **serveur** et **client** via `IntlayerServerProvider` et `IntlayerClientProvider`.
|
|
137
|
+
## Quand choisir quoi ?
|
|
148
138
|
|
|
149
|
-
|
|
150
|
-
|
|
139
|
+
- **Choisissez next-intl** si vous souhaitez une solution **minimale**, que vous êtes à l’aise avec des catalogues centralisés, et que votre application est de taille **petite à moyenne**.
|
|
140
|
+
- **Choisissez next-i18next** si vous avez besoin de **l’écosystème de plugins d’i18next** (par exemple, des règles ICU avancées via des plugins) et que votre équipe connaît déjà i18next, acceptant une **configuration plus importante** pour plus de flexibilité.
|
|
141
|
+
- **Choisissez Intlayer** si vous valorisez le **contenu scoped par composant**, un **TypeScript strict**, des **garanties à la compilation**, le **tree-shaking**, et des outils de routage/SEO/édition **tout-en-un** - particulièrement pour le **Next.js App Router** et les **bases de code larges et modulaires**.
|
|
151
142
|
|
|
152
143
|
---
|
|
153
144
|
|
|
154
|
-
##
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
1. **Installer & Configurer**
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
npm install intlayer next-intlayer
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
```ts
|
|
168
|
-
// intlayer.config.ts
|
|
169
|
-
import { Locales, type IntlayerConfig } from "intlayer";
|
|
170
|
-
|
|
171
|
-
const config: IntlayerConfig = {
|
|
172
|
-
internationalization: {
|
|
173
|
-
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
174
|
-
defaultLocale: Locales.ENGLISH,
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
export default config;
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
2. **Utiliser le Plugin**
|
|
181
|
-
|
|
182
|
-
```ts
|
|
183
|
-
// next.config.mjs
|
|
184
|
-
import { withIntlayer } from "next-intlayer/server";
|
|
185
|
-
|
|
186
|
-
/** @type {import('next').NextConfig} */
|
|
187
|
-
const nextConfig = {};
|
|
188
|
-
|
|
189
|
-
export default withIntlayer(nextConfig);
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
3. **Ajouter le Middleware**
|
|
193
|
-
|
|
194
|
-
```ts
|
|
195
|
-
// src/middleware.ts
|
|
196
|
-
export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
|
|
197
|
-
|
|
198
|
-
export const config = {
|
|
199
|
-
matcher:
|
|
200
|
-
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
201
|
-
};
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
4. **Créer une Mise en Page Localisée**
|
|
205
|
-
|
|
206
|
-
```tsx
|
|
207
|
-
// src/app/[locale]/layout.tsx
|
|
208
|
-
import { getHTMLTextDir } from "intlayer";
|
|
209
|
-
import { NextLayoutIntlayer } from "next-intlayer";
|
|
210
|
-
|
|
211
|
-
const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
212
|
-
const { locale } = params;
|
|
213
|
-
return (
|
|
214
|
-
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
215
|
-
<body>{children}</body>
|
|
216
|
-
</html>
|
|
217
|
-
);
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
export { generateStaticParams } from "next-intlayer";
|
|
221
|
-
export default LocaleLayout;
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
5. **Déclarer & Utiliser le Contenu**
|
|
225
|
-
|
|
226
|
-
```tsx
|
|
227
|
-
// src/app/[locale]/page.content.ts
|
|
228
|
-
import { t } from "intlayer";
|
|
229
|
-
|
|
230
|
-
export default {
|
|
231
|
-
key: "page",
|
|
232
|
-
content: {
|
|
233
|
-
getStarted: {
|
|
234
|
-
main: t({
|
|
235
|
-
en: "Get started by editing",
|
|
236
|
-
fr: "Commencez par éditer",
|
|
237
|
-
es: "Comience por editar",
|
|
238
|
-
}),
|
|
239
|
-
pageLink: "src/app/page.tsx",
|
|
240
|
-
},
|
|
241
|
-
},
|
|
242
|
-
};
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
```tsx
|
|
246
|
-
// src/app/[locale]/page.tsx
|
|
247
|
-
import { IntlayerServerProvider } from "next-intlayer/server";
|
|
248
|
-
import { IntlayerClientProvider, useIntlayer } from "next-intlayer";
|
|
249
|
-
|
|
250
|
-
const PageContent = () => {
|
|
251
|
-
const { content } = useIntlayer("page");
|
|
252
|
-
return (
|
|
253
|
-
<>
|
|
254
|
-
<p>{content.getStarted.main}</p>
|
|
255
|
-
<code>{content.getStarted.pageLink}</code>
|
|
256
|
-
</>
|
|
257
|
-
);
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
export default function Page({ params }) {
|
|
261
|
-
return (
|
|
262
|
-
<IntlayerServerProvider locale={params.locale}>
|
|
263
|
-
<IntlayerClientProvider locale={params.locale}>
|
|
264
|
-
<PageContent />
|
|
265
|
-
</IntlayerClientProvider>
|
|
266
|
-
</IntlayerServerProvider>
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
</details>
|
|
145
|
+
## Notes pratiques de migration (next-intl / next-i18next → Intlayer)
|
|
146
|
+
|
|
147
|
+
- **Commencez par fonctionnalité** : Déplacez une route ou un composant à la fois vers des **dictionnaires locaux**.
|
|
148
|
+
- **Conservez les anciens catalogues en parallèle** : Assurez une transition progressive ; évitez un changement brutal.
|
|
149
|
+
- **Activez les vérifications strictes** : Laissez la détection à la compilation révéler les lacunes tôt.
|
|
150
|
+
- **Adoptez middleware et helpers** : Standardisez la détection de la locale et les balises SEO sur tout le site.
|
|
151
|
+
- **Mesurez les bundles** : Attendez-vous à des **réductions de taille des bundles** grâce à la suppression du contenu inutilisé.
|
|
272
152
|
|
|
273
153
|
---
|
|
274
154
|
|
|
275
155
|
## Conclusion
|
|
276
156
|
|
|
277
|
-
|
|
157
|
+
Les trois bibliothèques réussissent la localisation de base. La différence réside dans **la quantité de travail nécessaire** pour obtenir une configuration robuste et évolutive dans **Next.js moderne** :
|
|
278
158
|
|
|
279
|
-
- **
|
|
280
|
-
-
|
|
281
|
-
- Offrant une **puissante auto-génération TypeScript** pour un code plus sûr
|
|
282
|
-
- Gérant les **traductions manquantes** au moment de la construction
|
|
283
|
-
- Fournissant une approche de **configuration simplifiée et unique** avec un routage et un middleware avancés
|
|
159
|
+
- Avec **Intlayer**, le **contenu modulaire**, le **TS strict**, la **sécurité à la compilation**, les **bundles optimisés par tree-shaking**, ainsi que un **App Router et des outils SEO de première classe** sont des **paramètres par défaut**, et non des corvées.
|
|
160
|
+
- Si votre équipe valorise la **maintenabilité et la rapidité** dans une application multi-locale pilotée par composants, Intlayer offre aujourd’hui l’expérience la **plus complète**.
|
|
284
161
|
|
|
285
|
-
|
|
162
|
+
Consultez le document ['Pourquoi Intlayer ?'](https://intlayer.org/doc/why) pour plus de détails.
|