@intlayer/docs 5.8.0-canary.0 → 5.8.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 +89 -220
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +85 -123
- package/blog/en/vue-i18n_vs_intlayer.md +268 -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 +40 -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 +7 -7
- package/src/generated/blog.entry.ts +41 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-01-02
|
|
3
3
|
updatedAt: 2025-06-29
|
|
4
|
-
title: react-
|
|
5
|
-
description:
|
|
4
|
+
title: react-i18next vs react-intl vs Intlayer
|
|
5
|
+
description: Intégrer react-i18next avec next-intl et Intlayer pour l'internationalisation (i18n) d'une application React
|
|
6
6
|
keywords:
|
|
7
7
|
- next-intl
|
|
8
8
|
- react-i18next
|
|
@@ -17,178 +17,137 @@ slugs:
|
|
|
17
17
|
- react-i18next-vs-react-intl-vs-intlayer
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
#
|
|
20
|
+
# react-Intl VS react-i18next VS intlayer | Internationalisation React (i18n)
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Ce guide compare trois options i18n établies pour **React** : **react-intl** (FormatJS), **react-i18next** (i18next), et **Intlayer**.
|
|
23
|
+
Nous nous concentrons sur les applications **React pures** (par exemple, Vite, CRA, SPA). Si vous utilisez Next.js, consultez notre comparaison dédiée à Next.js.
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
## 1. Introduction
|
|
27
|
-
|
|
28
|
-
L'internationalisation (i18n) dans les applications React peut être réalisée de plusieurs manières. Les trois bibliothèques présentées ici ont différentes philosophies de conception, ensembles de fonctionnalités et support communautaire :
|
|
25
|
+
Nous évaluons :
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
- Architecture et organisation du contenu
|
|
28
|
+
- TypeScript et sécurité
|
|
29
|
+
- Gestion des traductions manquantes
|
|
30
|
+
- Contenu riche et capacités de formatage
|
|
31
|
+
- Performance et comportement de chargement
|
|
32
|
+
- Expérience développeur (DX), outils et maintenance
|
|
33
|
+
- SEO/routage (dépendant du framework)
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
> **En résumé** : Les trois solutions peuvent localiser une application React. 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 qu’un outil éditorial intégré (Éditeur Visuel/CMS + traduction IA optionnelle), **Intlayer** est le choix le plus complet pour des bases de code React modulaires.
|
|
35
36
|
|
|
36
37
|
---
|
|
37
38
|
|
|
38
|
-
##
|
|
39
|
-
|
|
40
|
-
### Vue d'ensemble
|
|
41
|
-
|
|
42
|
-
[**React-Intl**](https://formatjs.io/docs/react-intl/) fait partie de la suite [FormatJS](https://formatjs.io/). Elle fournit un ensemble puissant d'**APIs et de composants** pour gérer le formatage des messages, la pluralisation, le formatage de la date/heure et des nombres. React-Intl est largement utilisé dans les applications d'entreprise, principalement parce qu'il fait partie d'un écosystème qui standardise la syntaxe des messages et leur formatage.
|
|
43
|
-
|
|
44
|
-
### Fonctionnalités clés
|
|
45
|
-
|
|
46
|
-
- **Syntaxe de message ICU** : Offre une syntaxe complète pour l'interpolation des messages, la pluralisation, et plus encore.
|
|
47
|
-
- **Formatage localisé** : Utilitaires intégrés pour formater les dates, les heures, les nombres et les temps relatifs en fonction de la locale.
|
|
48
|
-
- **Composants déclaratifs** : Expose `<FormattedMessage>`, `<FormattedNumber>`, `<FormattedDate>`, etc., pour une utilisation transparente dans JSX.
|
|
49
|
-
- **Écosystème riche** : S'intègre bien avec les outils de FormatJS (par exemple, [babel-plugin-react-intl](https://formatjs.io/docs/tooling/babel-plugin/)) pour extraire, gérer et compiler les messages.
|
|
50
|
-
|
|
51
|
-
### Flux de travail typique
|
|
52
|
-
|
|
53
|
-
1. **Définir les catalogues de messages** (généralement des fichiers JSON par locale).
|
|
54
|
-
2. **Enveloppez votre application** dans `<IntlProvider locale="fr" messages={messages}>`.
|
|
55
|
-
3. **Utilisez** `<FormattedMessage id="myMessage" defaultMessage="Bonjour le monde" />` ou le hook `useIntl()` pour accéder aux chaînes de traduction.
|
|
56
|
-
|
|
57
|
-
### Avantages
|
|
58
|
-
|
|
59
|
-
- Bien établi et utilisé dans de nombreux environnements de production.
|
|
60
|
-
- Formatage de message avancé, y compris la pluralisation, le genre, les fuseaux horaires, et plus encore.
|
|
61
|
-
- Support d'outils fort pour l'extraction et la compilation des messages.
|
|
62
|
-
|
|
63
|
-
### Inconvénients
|
|
39
|
+
## Positionnement général
|
|
64
40
|
|
|
65
|
-
-
|
|
66
|
-
-
|
|
41
|
+
- **react-intl** - Formatage priorisant ICU, conforme aux standards (dates/nombres/pluriels) avec une API mature. Les catalogues sont généralement centralisés ; la sécurité des clés et la validation à la compilation dépendent en grande partie de vous.
|
|
42
|
+
- **react-i18next** - Extrêmement populaire et flexible ; namespaces, détecteurs, et de nombreux plugins (ICU, backends). Puissant, mais la configuration peut devenir complexe à mesure que les projets grandissent.
|
|
43
|
+
- **Intlayer** - Modèle de contenu centré sur les composants pour React, **typage TS strict**, **vérifications à la compilation**, **tree-shaking**, plus **éditeur visuel/CMS** et **traductions assistées par IA**. Fonctionne avec React Router, Vite, CRA, etc.
|
|
67
44
|
|
|
68
45
|
---
|
|
69
46
|
|
|
70
|
-
##
|
|
47
|
+
## Matrice des fonctionnalités (focus React)
|
|
48
|
+
|
|
49
|
+
| Fonctionnalité | `react-intlayer` (Intlayer) | `react-i18next` (i18next) | `react-intl` (FormatJS) |
|
|
50
|
+
| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
51
|
+
| **Traductions Près des Composants** | ✅ Oui, contenu collé avec chaque composant | ❌ Non | ❌ Non |
|
|
52
|
+
| **Intégration TypeScript** | ✅ Avancée, types stricts auto-générés | ⚠️ Basique ; configuration supplémentaire pour la sécurité | ✅ Bonne, mais moins stricte |
|
|
53
|
+
| **Détection des Traductions Manquantes** | ✅ Mise en évidence des erreurs TypeScript et erreur/avertissement à la compilation | ⚠️ Principalement des chaînes de secours à l'exécution | ⚠️ Chaînes de secours |
|
|
54
|
+
| **Contenu Riche (JSX/Markdown/composants)** | ✅ Support direct | ⚠️ Limité / interpolation uniquement | ⚠️ Syntaxe ICU, pas de vrai JSX |
|
|
55
|
+
| **Traduction alimentée par IA** | ✅ Oui, prend en charge 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 |
|
|
56
|
+
| **É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 |
|
|
57
|
+
| **Routage localisé** | ✅ Oui, prend en charge les chemins localisés nativement (fonctionne avec Next.js & Vite) | ⚠️ Pas intégré, nécessite des plugins (ex. `next-i18next`) ou une configuration personnalisée du routeur | ❌ Non, uniquement le formatage des messages, le routage doit être manuel |
|
|
58
|
+
| **Génération dynamique de routes** | ✅ Oui | ⚠️ Plugin/écosystème ou configuration manuelle | ❌ Non fourni |
|
|
59
|
+
| **Pluriel** | ✅ Modèles basés sur des énumérations | ✅ Configurable (plugins comme i18next-icu) | ✅ (ICU) |
|
|
60
|
+
| **Formatage (dates, nombres, devises)** | ✅ Formateurs optimisés (Intl en interne) | ⚠️ Via des plugins ou usage personnalisé d’Intl | ✅ Formateurs ICU |
|
|
61
|
+
| **Format de contenu** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml en cours de développement) | ⚠️ .json | ✅ .json, .js |
|
|
62
|
+
| **Support ICU** | ⚠️ En cours de développement | ⚠️ Via plugin (i18next-icu) | ✅ Oui |
|
|
63
|
+
| **Aides SEO (hreflang, sitemap)** | ✅ Outils intégrés : aides pour sitemap, robots.txt, métadonnées | ⚠️ Plugins communautaires / manuel | ❌ Pas dans le cœur |
|
|
64
|
+
| **Écosystème / Communauté** | ⚠️ Plus petit mais en croissance rapide et réactif | ✅ Le plus grand et mature | ✅ Important |
|
|
65
|
+
| **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 serveur enfants | ❌ Non pris en charge, nécessite de passer les fonctions t dans l'arbre des composants pour les composants serveur enfants |
|
|
66
|
+
| **Tree-shaking (chargement uniquement du contenu utilisé)** | ✅ Oui, par composant au moment de la compilation via les plugins Babel/SWC | ⚠️ Charge généralement tout (peut être amélioré avec des namespaces / découpage du code) | ⚠️ Charge généralement tout |
|
|
67
|
+
| **Chargement paresseux** | ✅ Oui, par locale / par dictionnaire | ✅ Oui (par exemple, backends/namespaces à la demande) | ✅ Oui (bundles de locale séparés) |
|
|
68
|
+
| **Purge du contenu inutilisé** | ✅ Oui, par dictionnaire au moment de la compilation | ❌ Non, uniquement via une segmentation manuelle des namespaces | ❌ Non, tous les messages déclarés sont inclus dans le bundle |
|
|
69
|
+
| **Gestion des grands projets** | ✅ Encourage la modularité, adapté aux design-systems | ⚠️ Nécessite une bonne discipline des fichiers | ⚠️ Les catalogues centraux peuvent devenir volumineux |
|
|
71
70
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
[**React-i18next**](https://react.i18next.com/) est une extension de React de [i18next](https://www.i18next.com/), l'un des frameworks JavaScript i18n les plus populaires. Il offre des **fonctionnalités étendues** pour les traductions en temps réel, le chargement paresseux, et la détection de langue, ce qui le rend extrêmement flexible pour une grande variété de cas d'utilisation.
|
|
75
|
-
|
|
76
|
-
### Fonctionnalités clés
|
|
77
|
-
|
|
78
|
-
- **Structure de traduction flexible** : Non lié à un format unique comme l'ICU. Vous pouvez stocker des traductions en JSON, utiliser l'interpolation, la pluralisation, etc.
|
|
79
|
-
- **Changement de langue dynamique** : Plugins de détection de langue intégrés et mises à jour en temps réel.
|
|
80
|
-
- **Traductions imbriquées et structurées** : Vous pouvez imbriquer facilement les traductions au sein du JSON.
|
|
81
|
-
- **Écosystème de plugins étendu** : Pour la détection (navigateur, chemin, sous-domaine, etc.), le chargement des ressources, la mise en cache, et plus encore.
|
|
82
|
-
|
|
83
|
-
### Flux de travail typique
|
|
84
|
-
|
|
85
|
-
1. **Installez `i18next` & `react-i18next`.**
|
|
86
|
-
2. **Configurez i18n** pour charger les traductions (JSON) et mettre en place la détection de langue ou les fallback.
|
|
87
|
-
3. **Enveloppez votre application** dans `I18nextProvider`.
|
|
88
|
-
4. **Utilisez le hook `useTranslation()`** ou le composant `<Trans>` pour afficher les traductions.
|
|
71
|
+
---
|
|
89
72
|
|
|
90
|
-
|
|
73
|
+
## Comparaison approfondie
|
|
91
74
|
|
|
92
|
-
|
|
93
|
-
- Communauté très active et grand écosystème de plugins.
|
|
94
|
-
- Facilité de **chargement dynamique** des traductions (par exemple, depuis un serveur, à la demande).
|
|
75
|
+
### 1) Architecture et évolutivité
|
|
95
76
|
|
|
96
|
-
|
|
77
|
+
- **react-intl / react-i18next** : La plupart des configurations maintiennent des **dossiers de locale centralisés** par langue, parfois divisés par **espaces de noms** (namespaces) (i18next). Cela fonctionne bien au début mais devient une surface partagée à mesure que les applications grandissent.
|
|
78
|
+
- **Intlayer** : Favorise les **dictionnaires par composant (ou par fonctionnalité)** **co-localisés** avec l’interface utilisateur qu’ils servent. Cela maintient une propriété claire, facilite la duplication/migration des composants, et réduit les changements de clés entre équipes. Le contenu inutilisé est plus facile à identifier et à supprimer.
|
|
97
79
|
|
|
98
|
-
|
|
99
|
-
- Si vous préférez des traductions fortement typées, vous aurez peut-être besoin de configurations TypeScript supplémentaires.
|
|
80
|
+
**Pourquoi c’est important :** Le contenu modulaire reflète une interface modulaire. Les grandes bases de code React restent plus propres lorsque les traductions vivent avec les composants auxquels elles appartiennent.
|
|
100
81
|
|
|
101
82
|
---
|
|
102
83
|
|
|
103
|
-
|
|
84
|
+
### 2) TypeScript & sécurité
|
|
104
85
|
|
|
105
|
-
|
|
86
|
+
- **react-intl** : Typages solides, mais **pas de typage automatique des clés** ; vous devez appliquer vous-même les bonnes pratiques de sécurité.
|
|
87
|
+
- **react-i18next** : Typages forts pour les hooks ; un **typage strict des clés** nécessite généralement une configuration supplémentaire ou des générateurs.
|
|
88
|
+
- **Intlayer** : **Génère automatiquement des types stricts** à partir de votre contenu. L’autocomplétion de l’IDE et les **erreurs à la compilation** détectent les fautes de frappe et les clés manquantes avant l’exécution.
|
|
106
89
|
|
|
107
|
-
|
|
90
|
+
**Pourquoi c’est important :** Déplacer les erreurs **en amont** (vers la compilation/CI) réduit les problèmes en production et accélère les boucles de retour pour les développeurs.
|
|
108
91
|
|
|
109
|
-
|
|
92
|
+
---
|
|
110
93
|
|
|
111
|
-
|
|
112
|
-
- **Routage & middleware intégrés** : Modules optionnels pour le routage localisé (par exemple, `/fr/about`, `/en/about`) et middleware serveur pour détecter la locale de l'utilisateur.
|
|
113
|
-
- **Types TypeScript auto-générés** : Assure la sécurité des types avec des fonctionnalités telles que l'autocomplétion et la détection d'erreurs à la compilation.
|
|
114
|
-
- **Traductions dynamiques et riches** : Peut inclure JSX/TSX dans les traductions pour des cas d'utilisation plus complexes (par exemple, liens, texte en gras, icônes dans les traductions).
|
|
94
|
+
### 3) Gestion des traductions manquantes
|
|
115
95
|
|
|
116
|
-
|
|
96
|
+
- **react-intl / react-i18next** : Par défaut, recours aux **solutions de repli à l’exécution** (répétition de la clé ou locale par défaut). Vous pouvez ajouter du linting/plugins, mais ce n’est pas garanti à la compilation.
|
|
97
|
+
- **Intlayer** : **Détection à la compilation** avec avertissements ou erreurs lorsque des locales/clés requises sont manquantes.
|
|
117
98
|
|
|
118
|
-
|
|
119
|
-
2. **Créez `intlayer.config.ts`** pour définir les locales disponibles et la locale par défaut.
|
|
120
|
-
3. **Utilisez l'CLI Intlayer** ou le plugin pour **transpiler** les déclarations de contenu.
|
|
121
|
-
4. **Enveloppez votre application** dans `<IntlayerProvider>` et récupérez le contenu avec `useIntlayer("keyName")`.
|
|
99
|
+
**Pourquoi c’est important :** Un CI qui échoue sur les chaînes manquantes empêche la fuite d’« anglais mystère » dans les interfaces non anglophones.
|
|
122
100
|
|
|
123
|
-
|
|
101
|
+
---
|
|
124
102
|
|
|
125
|
-
|
|
126
|
-
- Contenu **riche** possible (par exemple, passer des nœuds React comme traductions).
|
|
127
|
-
- **Routage localisé** prêt à l'emploi.
|
|
128
|
-
- Intégré aux outils de build populaires (CRA, Vite) pour une configuration facile.
|
|
103
|
+
### 4) Contenu riche & formatage
|
|
129
104
|
|
|
130
|
-
|
|
105
|
+
- **react-intl** : Excellente prise en charge de **ICU** pour les pluriels, sélections, dates/nombres et composition de messages. JSX peut être utilisé, mais le modèle mental reste centré sur le message.
|
|
106
|
+
- **react-i18next** : Interpolation flexible et **`<Trans>`** pour intégrer des éléments/composants ; ICU disponible via un plugin.
|
|
107
|
+
- **Intlayer** : Les fichiers de contenu peuvent inclure des **nœuds riches** (JSX/Markdown/composants) et des **métadonnées**. Le formatage utilise Intl en interne ; les modèles de pluriels sont ergonomiques.
|
|
131
108
|
|
|
132
|
-
|
|
133
|
-
- Accent plus fort sur une approche de "déclaration de contenu au niveau des composants" - peut être un changement par rapport aux catalogues .json typiques.
|
|
134
|
-
- Écosystème et communauté plus petits par rapport aux bibliothèques plus établies.
|
|
109
|
+
**Pourquoi c’est important :** Les textes UI complexes (liens, parties en gras, composants en ligne) sont plus faciles à gérer lorsque la bibliothèque intègre proprement les nœuds React.
|
|
135
110
|
|
|
136
111
|
---
|
|
137
112
|
|
|
138
|
-
|
|
113
|
+
### 5) Performance et comportement de chargement
|
|
114
|
+
|
|
115
|
+
- **react-intl / react-i18next** : Vous gérez généralement la **division des catalogues** et le **chargement paresseux** manuellement (espaces de noms/importations dynamiques). Efficace mais demande de la rigueur.
|
|
116
|
+
- **Intlayer** : Effectue un **tree-shaking** des dictionnaires inutilisés et prend en charge le **chargement paresseux par dictionnaire/par langue** prêt à l'emploi.
|
|
139
117
|
|
|
140
|
-
|
|
141
|
-
| ------------------------------- | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
142
|
-
| **Cas d'utilisation principal** | Traductions basées sur des chaînes, formatage de date/nombre, syntaxe de message ICU | i18n complet avec changement dynamique facile, imbrication, écosystème de plugins | Traductions type-safe avec un accent sur le contenu déclaratif, routage localisé & middleware serveur optionnel |
|
|
143
|
-
| **Approche** | Utilisez `<IntlProvider>` et les composants de message FormatJS | Utilisez `I18nextProvider` et le hook `useTranslation()` | Utilisez `<IntlayerProvider>` et le hook `useIntlayer()` avec des déclarations de contenu |
|
|
144
|
-
| **Format de localisation** | Chaînes basées sur ICU (catalogues JSON ou JavaScript) | Fichiers de ressources JSON (ou chargeurs personnalisés). Le format ICU est optionnel via i18next plugin | Déclarations `.content.[ts/js/tsx]` ou JSON ; peut contenir des chaînes ou des composants React |
|
|
145
|
-
| **Routage** | Géré à l'extérieur (pas de routage localisé intégré) | Géré à l'extérieur avec des plugins i18next (détection de chemin, sous-domaine, etc.) | Support de routage localisé intégré (par exemple, `/fr/about`, `/en/about`), plus un middleware serveur optionnel (pour SSR/Vite) |
|
|
146
|
-
| **Support TypeScript** | Bon (typages pour les packages officiels) | Bon mais configuration supplémentaire pour les traductions typées si vous voulez un contrôle strict | Excellent (définitions de type auto-générées pour les clés et traductions de contenu) |
|
|
147
|
-
| **Pluralisation & Formatage** | Avancé : Formatage intégré de date/heure/nombre, support de plural/gendre | Pluralisation configurable. Le formatage de date/heure est généralement réalisé via des bibliothèques externes ou le plugin i18next | Peut s'appuyer sur JavaScript Intl standard ou intégrer la logique dans le contenu. Ne pas aussi spécialisé que FormatJS, mais gère les cas typiques. |
|
|
148
|
-
| **Communauté & Écosystème** | Grand, partie de l'écosystème FormatJS | Très grand, très actif, beaucoup de plugins (détection, mise en cache, frameworks) | Plus petit mais en croissance ; approche moderne et open-source |
|
|
149
|
-
| **Courbe d'apprentissage** | Modérée (apprentissage de la syntaxe de message ICU, conventions FormatJS) | Faible à modérée (utilisation simple, mais la configuration avancée peut devenir verbeuse) | Modérée (concept de déclarations de contenu et étapes de construction spécialisées) |
|
|
118
|
+
**Pourquoi c'est important :** Des bundles plus petits et moins de chaînes inutilisées améliorent les performances au démarrage et lors de la navigation.
|
|
150
119
|
|
|
151
120
|
---
|
|
152
121
|
|
|
153
|
-
|
|
122
|
+
### 6) DX, outils & maintenance
|
|
154
123
|
|
|
155
|
-
|
|
124
|
+
- **react-intl / react-i18next** : Large écosystème communautaire ; pour les flux éditoriaux, vous adoptez généralement des plateformes de localisation externes.
|
|
125
|
+
- **Intlayer** : Propose un **éditeur visuel gratuit** et un **CMS optionnel** (conservez le contenu dans Git ou externalisez-le). Offre également une **extension VSCode** pour la rédaction de contenu et une **traduction assistée par IA** utilisant vos propres clés de fournisseur.
|
|
156
126
|
|
|
157
|
-
|
|
158
|
-
- Vous préférez une approche plus **basée sur les standards** pour les traductions.
|
|
159
|
-
- Vous n'avez pas besoin de routage localisé ou de clés de traduction fortement typées.
|
|
127
|
+
**Pourquoi c’est important :** Les outils intégrés raccourcissent la boucle entre les développeurs et les auteurs de contenu - moins de code de liaison, moins de dépendances externes.
|
|
160
128
|
|
|
161
|
-
|
|
129
|
+
---
|
|
162
130
|
|
|
163
|
-
|
|
164
|
-
- Vous souhaitez une détection de langage **basée sur des plugins** (par exemple, à partir de l'URL, des cookies, du stockage local) ou un cache avancé.
|
|
165
|
-
- Vous avez besoin du plus grand écosystème, avec de nombreuses intégrations existantes pour divers frameworks (Next.js, React Native, etc.).
|
|
131
|
+
## Quand choisir lequel ?
|
|
166
132
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- Vous exigez un **routage localisé intégré** ou vous souhaitez l'incorporer facilement dans votre configuration SSR ou Vite.
|
|
171
|
-
- Vous souhaitez une approche moderne ou voulez simplement une seule bibliothèque qui couvre à la fois la **gestion de contenu** (i18n) et le **routage** de manière sécurisée en termes de types.
|
|
133
|
+
- **Choisissez react-intl** si vous souhaitez un formatage de messages **priorisant ICU** avec une API simple et conforme aux standards, et que votre équipe est à l’aise pour maintenir manuellement les catalogues et les vérifications de sécurité.
|
|
134
|
+
- **Choisissez react-i18next** si vous avez besoin de **l’écosystème étendu d’i18next** (détecteurs, backends, plugin ICU, intégrations) et acceptez plus de configuration pour gagner en flexibilité.
|
|
135
|
+
- **Choisissez Intlayer** si vous valorisez le **contenu scoped par composant**, le **TypeScript strict**, les **garanties à la compilation**, le **tree-shaking**, et les outils éditoriaux **tout-en-un** - particulièrement pour les applications React **grandes et modulaires**.
|
|
172
136
|
|
|
173
137
|
---
|
|
174
138
|
|
|
175
|
-
##
|
|
176
|
-
|
|
177
|
-
Chaque bibliothèque offre une solution robuste pour internationaliser une application React :
|
|
178
|
-
|
|
179
|
-
- **React-Intl** excelle dans le formatage des messages et est un choix populaire pour les solutions d'entreprise axées sur la syntaxe des messages ICU.
|
|
180
|
-
- **React-i18next** fournit un environnement hautement flexible et piloté par des plugins pour des besoins i18n avancés ou dynamiques.
|
|
181
|
-
- **Intlayer** offre une approche **moderne et fortement typée** qui fusionne les déclarations de contenu, le routage localisé avancé et l'intégration pilotée par des plugins (CRA, Vite).
|
|
139
|
+
## Notes pratiques de migration (react-intl / react-i18next → Intlayer)
|
|
182
140
|
|
|
183
|
-
|
|
141
|
+
- **Migrez de manière incrémentale** : Commencez par une fonctionnalité ou une route ; conservez les catalogues hérités en parallèle pendant la transition.
|
|
142
|
+
- **Adoptez des dictionnaires par composant** : Placez le contenu au même endroit que les composants pour réduire le couplage.
|
|
143
|
+
- **Activez les vérifications strictes** : Laissez les erreurs à la compilation révéler tôt les clés/locales manquantes dans l’intégration continue.
|
|
144
|
+
- **Mesurez les bundles** : Attendez-vous à des réductions à mesure que les chaînes inutilisées sont éliminées.
|
|
184
145
|
|
|
185
146
|
---
|
|
186
147
|
|
|
187
|
-
|
|
148
|
+
## Conclusion
|
|
188
149
|
|
|
189
|
-
|
|
190
|
-
- [Documentation de React-i18next](https://react.i18next.com/)
|
|
191
|
-
- [Guide de démarrage Intlayer + CRA](/#) (de votre doc)
|
|
192
|
-
- [Guide de démarrage Intlayer + Vite & React](/#) (de votre doc)
|
|
150
|
+
Les trois bibliothèques permettent de localiser React efficacement. Ce qui fait la différence, c’est la quantité d’**infrastructure** que vous devez construire pour atteindre une configuration **sûre et évolutive** :
|
|
193
151
|
|
|
194
|
-
|
|
152
|
+
- Avec **Intlayer**, le **contenu modulaire**, la **typage strict en TS**, la **sécurité à la compilation**, les **bundles optimisés par tree-shaking** et les **outils éditoriaux** sont des standards - pas des corvées.
|
|
153
|
+
- Si votre équipe valorise la **maintenabilité et la rapidité** dans des applications React multi-langues et pilotées par composants, Intlayer offre aujourd’hui le flux de travail développeur et contenu le **plus complet**.
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-08-11
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
|
+
title: vue-i18n vs Intlayer
|
|
5
|
+
description: Comparaison de vue-i18n avec Intlayer pour l'internationalisation (i18n) dans les applications Vue/Nuxt
|
|
6
|
+
keywords:
|
|
7
|
+
- vue-i18n
|
|
8
|
+
- Intlayer
|
|
9
|
+
- Internationalisation
|
|
10
|
+
- i18n
|
|
11
|
+
- Blog
|
|
12
|
+
- Vue
|
|
13
|
+
- Nuxt
|
|
14
|
+
- JavaScript
|
|
15
|
+
slugs:
|
|
16
|
+
- blog
|
|
17
|
+
- vue-i18n-vs-intlayer
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# vue-i18n VS Intlayer | Internationalisation Vue (i18n)
|
|
21
|
+
|
|
22
|
+
Ce guide compare deux options i18n populaires pour **Vue 3** (et **Nuxt**) : **vue-i18n** et **Intlayer**.
|
|
23
|
+
Nous nous concentrons sur les outils modernes de Vue (Vite, Composition API) et évaluons :
|
|
24
|
+
|
|
25
|
+
1. **Architecture & organisation du contenu**
|
|
26
|
+
2. **TypeScript & sécurité**
|
|
27
|
+
3. **Gestion des traductions manquantes**
|
|
28
|
+
4. **Stratégie de routage & URL**
|
|
29
|
+
5. **Performance & comportement de chargement**
|
|
30
|
+
6. **Expérience développeur (DX), outils & maintenance**
|
|
31
|
+
7. **SEO & évolutivité pour les grands projets**
|
|
32
|
+
|
|
33
|
+
> **en résumé** : Les deux peuvent localiser des applications Vue. 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 intégrés pour le routeur/SEO** et en plus un **éditeur visuel & des traductions assistées par IA**, **Intlayer** est le choix le plus complet et moderne.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Positionnement général
|
|
38
|
+
|
|
39
|
+
- **vue-i18n** - La bibliothèque i18n de référence pour Vue. Formatage flexible des messages (style ICU), blocs SFC `<i18n>` pour les messages locaux, et un large écosystème. La sécurité et la maintenance à grande échelle dépendent principalement de vous.
|
|
40
|
+
- **Intlayer** - Modèle de contenu centré sur les composants pour Vue/Vite/Nuxt avec **typage TS strict**, **vérifications à la compilation**, **tree-shaking**, **helpers pour le routeur & SEO**, **éditeur visuel/CMS** optionnel, et **traductions assistées par IA**.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Comparaison des fonctionnalités côte à côte (axée sur Vue)
|
|
45
|
+
|
|
46
|
+
| Fonctionnalité | **Intlayer** | **vue-i18n** |
|
|
47
|
+
| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
48
|
+
| **Traductions proches des composants** | ✅ Oui, contenu collé par composant (ex. `MyComp.content.ts`) | ✅ Oui, via les blocs SFC `<i18n>` (optionnel) |
|
|
49
|
+
| **Intégration TypeScript** | ✅ Avancée, types **stricts** auto-générés & autocomplétion des clés | ✅ Bon typage ; **la sécurité stricte des clés nécessite une configuration/discipline supplémentaire** |
|
|
50
|
+
| **Détection des traductions manquantes** | ✅ Avertissements/erreurs **à la compilation** et remontée dans TS | ⚠️ Repli/exceptions à l'exécution |
|
|
51
|
+
| **Contenu enrichi (composants/Markdown)** | ✅ Support direct pour les nœuds enrichis et les fichiers de contenu Markdown | ⚠️ Limité (composants via `<i18n-t>`, Markdown via des plugins externes) |
|
|
52
|
+
| **Traduction assistée par IA** | ✅ Flux de travail intégrés utilisant vos propres clés de fournisseur IA | ❌ Non intégré |
|
|
53
|
+
| **Éditeur visuel / CMS** | ✅ Éditeur visuel gratuit & CMS optionnel | ❌ Non intégré (utilisez des plateformes externes) |
|
|
54
|
+
| **Routage localisé** | ✅ Aides pour Vue Router/Nuxt afin de générer des chemins localisés, des URLs et des `hreflang` | ⚠️ Pas natif (utiliser Nuxt i18n ou une configuration personnalisée de Vue Router) |
|
|
55
|
+
| **Génération dynamique de routes** | ✅ Oui | ❌ Non fourni (fourni par Nuxt i18n) |
|
|
56
|
+
| **Pluriels et formatage** | ✅ Modèles d'énumération ; formatteurs basés sur Intl | ✅ Messages au format ICU ; formatteurs Intl |
|
|
57
|
+
| **Formats de contenu** | ✅ `.ts`, `.js`, `.json`, `.md`, `.txt` (YAML en cours de développement) | ✅ `.json`, `.js` (plus blocs SFC `<i18n>`) |
|
|
58
|
+
| **Support ICU** | ⚠️ En cours de développement | ✅ Oui |
|
|
59
|
+
| **Aides SEO (sitemap, robots, métadonnées)** | ✅ Aides intégrées (indépendantes du framework) | ❌ Pas natif (Nuxt i18n/communauté) |
|
|
60
|
+
| **SSR/SSG** | ✅ Fonctionne avec Vue SSR et Nuxt ; ne bloque pas le rendu statique | ✅ Fonctionne avec Vue SSR/Nuxt |
|
|
61
|
+
| **Tree-shaking (livrer uniquement le contenu utilisé)** | ✅ Par composant au moment de la compilation | ⚠️ Partiel ; nécessite un découpage manuel du code/messages asynchrones |
|
|
62
|
+
| **Chargement paresseux** | ✅ Par locale / par dictionnaire | ✅ Messages de locale asynchrones supportés |
|
|
63
|
+
| **Purge du contenu inutilisé** | ✅ Oui (au moment de la compilation) | ❌ Non intégré |
|
|
64
|
+
| **Maintenabilité des grands projets** | ✅ Encourage une structure modulaire, adaptée aux design systems | ✅ Possible, mais nécessite une discipline stricte des fichiers/namespaces |
|
|
65
|
+
| **Écosystème / communauté** | ⚠️ Plus petite mais en forte croissance | ✅ Large et mature dans l'écosystème Vue |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Comparaison approfondie
|
|
70
|
+
|
|
71
|
+
### 1) Architecture et évolutivité
|
|
72
|
+
|
|
73
|
+
- **vue-i18n** : Les configurations courantes utilisent des **catalogues centralisés** par locale (optionnellement divisés en fichiers/namespaces). Les blocs SFC `<i18n>` permettent des messages locaux, mais les équipes reviennent souvent à des catalogues partagés à mesure que les projets grandissent.
|
|
74
|
+
- **Intlayer** : Favorise des **dictionnaires par composant** stockés à côté du composant qu'ils servent. Cela réduit les conflits entre équipes, maintient le contenu facilement accessible et limite naturellement la dérive/les clés inutilisées.
|
|
75
|
+
|
|
76
|
+
**Pourquoi c'est important :** Dans les grandes applications Vue ou les design systems, le **contenu modulaire** évolue mieux que les catalogues monolithiques.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
### 2) TypeScript & sécurité
|
|
81
|
+
|
|
82
|
+
- **vue-i18n** : Bon support TS ; la **typage strict des clés** nécessite généralement des schémas/génériques personnalisés et des conventions rigoureuses.
|
|
83
|
+
- **Intlayer** : **Génère des types stricts** à partir de votre contenu, offrant **l’autocomplétion dans l’IDE** et des **erreurs à la compilation** pour les fautes de frappe ou les clés manquantes.
|
|
84
|
+
|
|
85
|
+
**Pourquoi c’est important :** Le typage fort détecte les problèmes **avant** l’exécution.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### 3) Gestion des traductions manquantes
|
|
90
|
+
|
|
91
|
+
- **vue-i18n** : Avertissements/repli **à l’exécution** (par exemple, locale ou clé de repli).
|
|
92
|
+
- **Intlayer** : Détection **à la compilation** avec avertissements/erreurs sur les locales et les clés.
|
|
93
|
+
|
|
94
|
+
**Pourquoi c’est important :** L’application à la compilation garantit une interface utilisateur propre et cohérente en production.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### 4) Stratégie de routage et d’URL (Vue Router/Nuxt)
|
|
99
|
+
|
|
100
|
+
- **Les deux** peuvent fonctionner avec des routes localisées.
|
|
101
|
+
- **Intlayer** fournit des helpers pour **générer des chemins localisés**, **gérer les préfixes de locale**, et émettre des **`<link rel="alternate" hreflang>`** pour le SEO. Avec Nuxt, il complète le routage du framework.
|
|
102
|
+
|
|
103
|
+
**Pourquoi c’est important :** Moins de couches personnalisées et un **SEO plus propre** à travers les locales.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
### 5) Performance et comportement de chargement
|
|
108
|
+
|
|
109
|
+
- **vue-i18n** : Supporte les messages de locale asynchrones ; éviter le sur-emballage dépend de vous (divisez les catalogues avec soin).
|
|
110
|
+
- **Intlayer** : **Élimine le code mort** à la compilation et **charge paresseusement par dictionnaire/locale**. Le contenu inutilisé n’est pas embarqué.
|
|
111
|
+
|
|
112
|
+
**Pourquoi c’est important :** Des bundles plus petits et un démarrage plus rapide pour les applications Vue multi-locales.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### 6) Expérience développeur et outils
|
|
117
|
+
|
|
118
|
+
- **vue-i18n** : Documentation et communauté matures ; vous vous appuierez généralement sur des **plateformes de localisation externes** pour les flux éditoriaux.
|
|
119
|
+
- **Intlayer** : Propose un **éditeur visuel gratuit**, un **CMS** optionnel (compatible Git ou externalisé), une **extension VSCode**, des utilitaires **CLI/CI**, et des **traductions assistées par IA** utilisant vos propres clés de fournisseur.
|
|
120
|
+
|
|
121
|
+
**Pourquoi c’est important :** Réduction des coûts opérationnels et boucle dev–contenu plus courte.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### 7) SEO, SSR & SSG
|
|
126
|
+
|
|
127
|
+
- **Les deux** fonctionnent avec Vue SSR et Nuxt.
|
|
128
|
+
- **Intlayer** : Ajoute des **aides SEO** (sitemaps/métadonnées/`hreflang`) indépendantes du framework et compatibles avec les builds Vue/Nuxt.
|
|
129
|
+
|
|
130
|
+
**Pourquoi c’est important :** SEO international sans câblage personnalisé.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Pourquoi Intlayer ? (Problème & approche)
|
|
135
|
+
|
|
136
|
+
La plupart des stacks i18n (y compris **vue-i18n**) partent de **catalogues centralisés** :
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
.
|
|
140
|
+
├── locales
|
|
141
|
+
│ ├── en.json
|
|
142
|
+
│ ├── es.json
|
|
143
|
+
│ └── fr.json
|
|
144
|
+
└── src
|
|
145
|
+
└── components
|
|
146
|
+
└── MyComponent.vue
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Ou avec des dossiers par langue :
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
.
|
|
153
|
+
├── locales
|
|
154
|
+
│ ├── en
|
|
155
|
+
│ │ ├── footer.json
|
|
156
|
+
│ │ └── navbar.json
|
|
157
|
+
│ ├── fr
|
|
158
|
+
│ │ ├── footer.json
|
|
159
|
+
│ │ └── navbar.json
|
|
160
|
+
│ └── es
|
|
161
|
+
│ ├── footer.json
|
|
162
|
+
│ └── navbar.json
|
|
163
|
+
└── src
|
|
164
|
+
└── components
|
|
165
|
+
└── MyComponent.vue
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Cela ralentit souvent le développement à mesure que les applications grandissent :
|
|
169
|
+
|
|
170
|
+
1. **Pour un nouveau composant**, vous créez/modifiez des catalogues distants, configurez les espaces de noms, et traduisez (souvent via un copier/coller manuel depuis des outils d’IA).
|
|
171
|
+
2. **Lors de modifications de composants**, vous recherchez les clés partagées, traduisez, maintenez les locales synchronisées, supprimez les clés obsolètes, et alignez les structures JSON.
|
|
172
|
+
|
|
173
|
+
**Intlayer** scope le contenu **par composant** et le garde **à côté du code**, comme nous le faisons déjà avec le CSS, les stories, les tests et la documentation :
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
.
|
|
177
|
+
└── components
|
|
178
|
+
└── MyComponent
|
|
179
|
+
├── MyComponent.content.ts
|
|
180
|
+
└── MyComponent.vue
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Déclaration du contenu** (par composant) :
|
|
184
|
+
|
|
185
|
+
```ts fileName="./components/MyComponent/MyComponent.content.ts"
|
|
186
|
+
import { t, type Dictionary } from "intlayer";
|
|
187
|
+
|
|
188
|
+
// Contenu d'exemple pour le composant
|
|
189
|
+
const componentExampleContent = {
|
|
190
|
+
key: "component-example",
|
|
191
|
+
content: {
|
|
192
|
+
greeting: t({
|
|
193
|
+
en: "Hello World",
|
|
194
|
+
es: "Hola Mundo",
|
|
195
|
+
fr: "Bonjour le monde",
|
|
196
|
+
}),
|
|
197
|
+
},
|
|
198
|
+
} satisfies Dictionary;
|
|
199
|
+
|
|
200
|
+
export default componentExampleContent;
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Utilisation dans Vue** (Composition API) :
|
|
204
|
+
|
|
205
|
+
```vue fileName="./components/MyComponent/MyComponent.vue"
|
|
206
|
+
<script setup lang="ts">
|
|
207
|
+
import { useIntlayer } from "vue-intlayer"; // Intégration Vue
|
|
208
|
+
const { greeting } = useIntlayer("component-example");
|
|
209
|
+
</script>
|
|
210
|
+
|
|
211
|
+
<template>
|
|
212
|
+
<span>{{ greeting }}</span>
|
|
213
|
+
</template>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Cette approche :
|
|
217
|
+
|
|
218
|
+
- **Accélère le développement** (déclarez une fois ; autocomplétion IDE/IA).
|
|
219
|
+
- **Nettoie la base de code** (1 composant = 1 dictionnaire).
|
|
220
|
+
- **Facilite la duplication/migration** (copiez un composant et son contenu ensemble).
|
|
221
|
+
- **Évite les clés mortes** (les composants inutilisés n’importent pas de contenu).
|
|
222
|
+
- **Optimise le chargement** (les composants chargés à la demande apportent leur contenu avec eux).
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Fonctionnalités supplémentaires d’Intlayer (pertinentes pour Vue)
|
|
227
|
+
|
|
228
|
+
- **Support multi-framework** : Fonctionne avec Vue, Nuxt, Vite, React, Express, et plus encore.
|
|
229
|
+
- **Gestion de contenu pilotée par JavaScript** : Déclarez dans le code avec une flexibilité totale.
|
|
230
|
+
- **Fichier de déclaration par locale** : Initialisez toutes les locales et laissez les outils générer le reste.
|
|
231
|
+
- **Environnement typé sécurisé** : Configuration TS robuste avec autocomplétion.
|
|
232
|
+
- **Récupération de contenu simplifiée** : Un seul hook/composable pour récupérer tout le contenu d’un dictionnaire.
|
|
233
|
+
- **Codebase organisée** : 1 composant = 1 dictionnaire dans le même dossier.
|
|
234
|
+
- **Routage amélioré** : Helpers pour les chemins localisés et métadonnées de **Vue Router/Nuxt**.
|
|
235
|
+
- **Support Markdown** : Importez du Markdown distant/local par locale ; exposez le frontmatter au code.
|
|
236
|
+
- **Éditeur visuel gratuit & CMS optionnel** : Création de contenu sans plateforme de localisation payante ; synchronisation compatible Git.
|
|
237
|
+
- **Contenu tree-shakable** : Ne livre que ce qui est utilisé ; supporte le chargement paresseux.
|
|
238
|
+
- **Compatible rendu statique** : Ne bloque pas le SSG.
|
|
239
|
+
- **Traductions assistées par IA** : Traduisez en 231 langues en utilisant votre propre fournisseur IA/clé API.
|
|
240
|
+
- **Serveur MCP & extension VSCode** : Automatisez les workflows i18n et la rédaction directement dans votre IDE.
|
|
241
|
+
- **Interopérabilité** : Ponts avec **vue-i18n**, **react-i18next** et **react-intl** selon les besoins.
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Quand choisir quoi ?
|
|
246
|
+
|
|
247
|
+
- **Choisissez vue-i18n** si vous souhaitez l’**approche standard Vue**, que vous êtes à l’aise pour gérer vous-même les catalogues/namespaces, et que votre application est de taille **petite à moyenne** (ou si vous utilisez déjà Nuxt i18n).
|
|
248
|
+
- **Choisissez Intlayer** si vous valorisez le **contenu scoped par composant**, un **TypeScript strict**, des **garanties à la compilation**, le **tree-shaking**, et des outils intégrés pour le routage/SEO/éditeur - particulièrement pour des bases de code **Vue/Nuxt larges et modulaires**.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Notes pratiques de migration (vue-i18n → Intlayer)
|
|
253
|
+
|
|
254
|
+
- **Commencez par fonctionnalité** : Déplacez une route/vue/composant à la fois vers les dictionnaires locaux d’Intlayer.
|
|
255
|
+
- **Pont pendant la migration** : Gardez les catalogues vue-i18n en parallèle ; remplacez progressivement les recherches.
|
|
256
|
+
- **Activez les vérifications strictes** : Laissez la détection à la compilation révéler tôt les clés/locales manquantes.
|
|
257
|
+
- **Adoptez les helpers routeur/SEO** : Standardisez la détection de la locale et les balises `hreflang`.
|
|
258
|
+
- **Mesurez les bundles** : Attendez-vous à des **réductions de taille de bundle** à mesure que le contenu inutilisé est exclu.
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Conclusion
|
|
263
|
+
|
|
264
|
+
Les deux, **vue-i18n** et **Intlayer**, localisent bien les applications Vue. La différence réside dans **la quantité de travail que vous devez faire vous-même** pour obtenir une configuration robuste et évolutive :
|
|
265
|
+
|
|
266
|
+
- Avec **Intlayer**, le **contenu modulaire**, **TS strict**, la **sécurité à la compilation**, les **bundles optimisés par tree-shaking**, ainsi que les **outils pour le routeur/SEO/éditeur** sont disponibles **nativement**.
|
|
267
|
+
- Si votre équipe privilégie la **maintenabilité et la rapidité** dans une application Vue/Nuxt multi-locale et pilotée par composants, Intlayer offre aujourd’hui l’expérience la **plus complète**.
|
|
268
|
+
|
|
269
|
+
Consultez la documentation ['Pourquoi Intlayer ?'](https://intlayer.org/doc/why) pour plus de détails.
|