@intlayer/docs 8.9.4 → 8.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/docs/ar/benchmark/index.md +0 -3
  2. package/docs/ar/benchmark/nextjs.md +15 -6
  3. package/docs/ar/benchmark/solid.md +155 -0
  4. package/docs/ar/benchmark/svelte.md +148 -0
  5. package/docs/ar/benchmark/tanstack.md +12 -3
  6. package/docs/ar/benchmark/vue.md +160 -0
  7. package/docs/ar/configuration.md +16 -12
  8. package/docs/ar/dictionary/content_file.md +51 -1
  9. package/docs/ar/plugins/sync-po.md +0 -21
  10. package/docs/bn/configuration.md +16 -12
  11. package/docs/cs/configuration.md +16 -12
  12. package/docs/de/benchmark/index.md +0 -3
  13. package/docs/de/benchmark/nextjs.md +15 -6
  14. package/docs/de/benchmark/solid.md +155 -0
  15. package/docs/de/benchmark/svelte.md +148 -0
  16. package/docs/de/benchmark/tanstack.md +12 -3
  17. package/docs/de/benchmark/vue.md +160 -0
  18. package/docs/de/configuration.md +16 -12
  19. package/docs/de/dictionary/content_file.md +52 -2
  20. package/docs/de/plugins/sync-po.md +0 -22
  21. package/docs/en/benchmark/nextjs.md +11 -2
  22. package/docs/en/benchmark/solid.md +22 -4
  23. package/docs/en/benchmark/svelte.md +17 -5
  24. package/docs/en/benchmark/tanstack.md +18 -3
  25. package/docs/en/benchmark/vue.md +17 -11
  26. package/docs/en/configuration.md +16 -13
  27. package/docs/en/dictionary/content_file.md +51 -1
  28. package/docs/en/plugins/sync-po.md +0 -21
  29. package/docs/en-GB/benchmark/index.md +0 -3
  30. package/docs/en-GB/benchmark/nextjs.md +15 -6
  31. package/docs/en-GB/benchmark/solid.md +155 -0
  32. package/docs/en-GB/benchmark/svelte.md +148 -0
  33. package/docs/en-GB/benchmark/tanstack.md +12 -3
  34. package/docs/en-GB/benchmark/vue.md +160 -0
  35. package/docs/en-GB/configuration.md +15 -11
  36. package/docs/en-GB/dictionary/content_file.md +51 -1
  37. package/docs/en-GB/plugins/sync-po.md +0 -21
  38. package/docs/es/benchmark/index.md +0 -3
  39. package/docs/es/benchmark/nextjs.md +15 -6
  40. package/docs/es/benchmark/solid.md +155 -0
  41. package/docs/es/benchmark/svelte.md +148 -0
  42. package/docs/es/benchmark/tanstack.md +12 -3
  43. package/docs/es/benchmark/vue.md +160 -0
  44. package/docs/es/configuration.md +16 -12
  45. package/docs/es/dictionary/content_file.md +51 -1
  46. package/docs/es/plugins/sync-po.md +0 -21
  47. package/docs/fr/benchmark/index.md +0 -3
  48. package/docs/fr/benchmark/nextjs.md +15 -6
  49. package/docs/fr/benchmark/solid.md +155 -0
  50. package/docs/fr/benchmark/svelte.md +148 -0
  51. package/docs/fr/benchmark/tanstack.md +12 -3
  52. package/docs/fr/benchmark/vue.md +160 -0
  53. package/docs/fr/configuration.md +16 -12
  54. package/docs/fr/dictionary/content_file.md +51 -1
  55. package/docs/fr/plugins/sync-po.md +0 -21
  56. package/docs/hi/benchmark/nextjs.md +15 -6
  57. package/docs/hi/benchmark/solid.md +155 -0
  58. package/docs/hi/benchmark/svelte.md +148 -0
  59. package/docs/hi/benchmark/tanstack.md +12 -3
  60. package/docs/hi/benchmark/vue.md +160 -0
  61. package/docs/hi/configuration.md +16 -12
  62. package/docs/hi/dictionary/content_file.md +51 -1
  63. package/docs/hi/plugins/sync-po.md +0 -21
  64. package/docs/id/benchmark/index.md +0 -3
  65. package/docs/id/benchmark/nextjs.md +15 -6
  66. package/docs/id/benchmark/solid.md +155 -0
  67. package/docs/id/benchmark/svelte.md +148 -0
  68. package/docs/id/benchmark/tanstack.md +12 -3
  69. package/docs/id/benchmark/vue.md +160 -0
  70. package/docs/id/configuration.md +16 -12
  71. package/docs/id/dictionary/content_file.md +51 -1
  72. package/docs/id/plugins/sync-po.md +0 -21
  73. package/docs/it/benchmark/index.md +1 -4
  74. package/docs/it/benchmark/nextjs.md +15 -6
  75. package/docs/it/benchmark/solid.md +155 -0
  76. package/docs/it/benchmark/svelte.md +148 -0
  77. package/docs/it/benchmark/tanstack.md +12 -3
  78. package/docs/it/benchmark/vue.md +160 -0
  79. package/docs/it/configuration.md +16 -12
  80. package/docs/it/dictionary/content_file.md +51 -1
  81. package/docs/it/plugins/sync-po.md +0 -21
  82. package/docs/ja/benchmark/index.md +5 -5
  83. package/docs/ja/benchmark/nextjs.md +15 -6
  84. package/docs/ja/benchmark/solid.md +155 -0
  85. package/docs/ja/benchmark/svelte.md +148 -0
  86. package/docs/ja/benchmark/tanstack.md +12 -3
  87. package/docs/ja/benchmark/vue.md +160 -0
  88. package/docs/ja/configuration.md +16 -12
  89. package/docs/ja/dictionary/content_file.md +50 -2
  90. package/docs/ja/intlayer_with_nextjs_no_locale_path.md +4 -3
  91. package/docs/ja/plugins/sync-po.md +0 -21
  92. package/docs/ko/benchmark/nextjs.md +15 -6
  93. package/docs/ko/benchmark/solid.md +155 -0
  94. package/docs/ko/benchmark/svelte.md +148 -0
  95. package/docs/ko/benchmark/tanstack.md +12 -3
  96. package/docs/ko/benchmark/vue.md +160 -0
  97. package/docs/ko/configuration.md +16 -12
  98. package/docs/ko/dictionary/content_file.md +51 -1
  99. package/docs/ko/intlayer_with_nextjs_no_locale_path.md +3 -2
  100. package/docs/ko/plugins/sync-po.md +0 -21
  101. package/docs/nl/configuration.md +16 -12
  102. package/docs/pl/benchmark/index.md +0 -3
  103. package/docs/pl/benchmark/nextjs.md +15 -6
  104. package/docs/pl/benchmark/solid.md +155 -0
  105. package/docs/pl/benchmark/svelte.md +148 -0
  106. package/docs/pl/benchmark/tanstack.md +12 -3
  107. package/docs/pl/benchmark/vue.md +160 -0
  108. package/docs/pl/configuration.md +16 -12
  109. package/docs/pl/dictionary/content_file.md +51 -1
  110. package/docs/pl/plugins/sync-po.md +0 -21
  111. package/docs/pt/benchmark/index.md +0 -3
  112. package/docs/pt/benchmark/nextjs.md +16 -7
  113. package/docs/pt/benchmark/solid.md +155 -0
  114. package/docs/pt/benchmark/svelte.md +148 -0
  115. package/docs/pt/benchmark/tanstack.md +13 -4
  116. package/docs/pt/benchmark/vue.md +160 -0
  117. package/docs/pt/configuration.md +16 -12
  118. package/docs/pt/dictionary/content_file.md +51 -1
  119. package/docs/pt/plugins/sync-po.md +0 -21
  120. package/docs/ru/benchmark/nextjs.md +15 -6
  121. package/docs/ru/benchmark/solid.md +155 -0
  122. package/docs/ru/benchmark/svelte.md +148 -0
  123. package/docs/ru/benchmark/tanstack.md +12 -3
  124. package/docs/ru/benchmark/vue.md +160 -0
  125. package/docs/ru/configuration.md +16 -12
  126. package/docs/ru/dictionary/content_file.md +52 -2
  127. package/docs/ru/plugins/sync-po.md +0 -21
  128. package/docs/tr/benchmark/index.md +0 -3
  129. package/docs/tr/benchmark/nextjs.md +15 -6
  130. package/docs/tr/benchmark/solid.md +155 -0
  131. package/docs/tr/benchmark/svelte.md +148 -0
  132. package/docs/tr/benchmark/tanstack.md +12 -3
  133. package/docs/tr/benchmark/vue.md +160 -0
  134. package/docs/tr/configuration.md +16 -12
  135. package/docs/tr/dictionary/content_file.md +51 -1
  136. package/docs/tr/plugins/sync-po.md +0 -21
  137. package/docs/uk/benchmark/nextjs.md +15 -6
  138. package/docs/uk/benchmark/solid.md +155 -0
  139. package/docs/uk/benchmark/svelte.md +148 -0
  140. package/docs/uk/benchmark/tanstack.md +12 -3
  141. package/docs/uk/benchmark/vue.md +160 -0
  142. package/docs/uk/configuration.md +16 -12
  143. package/docs/uk/dictionary/content_file.md +51 -1
  144. package/docs/uk/plugins/sync-po.md +0 -21
  145. package/docs/ur/configuration.md +16 -12
  146. package/docs/vi/benchmark/index.md +0 -3
  147. package/docs/vi/benchmark/nextjs.md +15 -6
  148. package/docs/vi/benchmark/solid.md +155 -0
  149. package/docs/vi/benchmark/svelte.md +148 -0
  150. package/docs/vi/benchmark/tanstack.md +12 -3
  151. package/docs/vi/benchmark/vue.md +160 -0
  152. package/docs/vi/configuration.md +16 -12
  153. package/docs/vi/dictionary/content_file.md +51 -1
  154. package/docs/vi/intlayer_with_nextjs_15.md +10 -57
  155. package/docs/vi/plugins/sync-po.md +0 -21
  156. package/docs/zh/benchmark/nextjs.md +15 -6
  157. package/docs/zh/benchmark/solid.md +155 -0
  158. package/docs/zh/benchmark/svelte.md +148 -0
  159. package/docs/zh/benchmark/tanstack.md +12 -3
  160. package/docs/zh/benchmark/vue.md +160 -0
  161. package/docs/zh/configuration.md +16 -12
  162. package/docs/zh/dictionary/content_file.md +51 -3
  163. package/docs/zh/plugins/sync-po.md +0 -21
  164. package/frequent_questions/ar/intlayerNode.md +3 -3
  165. package/frequent_questions/de/intlayerNode.md +3 -3
  166. package/frequent_questions/en/intlayerNode.md +3 -3
  167. package/frequent_questions/en-GB/intlayerNode.md +3 -3
  168. package/frequent_questions/es/intlayerNode.md +3 -3
  169. package/frequent_questions/fr/intlayerNode.md +3 -3
  170. package/frequent_questions/hi/intlayerNode.md +3 -3
  171. package/frequent_questions/id/intlayerNode.md +3 -3
  172. package/frequent_questions/it/intlayerNode.md +3 -3
  173. package/frequent_questions/ja/intlayerNode.md +3 -3
  174. package/frequent_questions/ko/intlayerNode.md +3 -3
  175. package/frequent_questions/pl/intlayerNode.md +3 -3
  176. package/frequent_questions/pt/intlayerNode.md +3 -3
  177. package/frequent_questions/ru/intlayerNode.md +3 -3
  178. package/frequent_questions/tr/intlayerNode.md +3 -3
  179. package/frequent_questions/uk/intlayerNode.md +3 -3
  180. package/frequent_questions/vi/intlayerNode.md +3 -3
  181. package/frequent_questions/zh/intlayerNode.md +3 -3
  182. package/package.json +8 -8
@@ -0,0 +1,160 @@
1
+ ---
2
+ createdAt: 2026-04-20
3
+ updatedAt: 2026-04-21
4
+ title: La meilleure solution i18n pour Vue en 2026 - Rapport de Benchmark
5
+ description: Comparez les bibliothèques d'internationalisation (i18n) pour Vue comme vue-i18n, fluent-vue et Intlayer. Rapport de performance détaillé sur la taille du bundle, les fuites et la réactivité.
6
+ keywords:
7
+ - benchmark
8
+ - i18n
9
+ - intl
10
+ - vue
11
+ - performance
12
+ - intlayer
13
+ slugs:
14
+ - doc
15
+ - benchmark
16
+ - vue
17
+ author: Aymeric PINEAU
18
+ applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-vue-template
19
+ history:
20
+ - version: 8.7.12
21
+ date: 2026-01-06
22
+ changes: "Initialisation du benchmark"
23
+ ---
24
+
25
+ # Bibliothèques i18n Vue — Rapport de Benchmark 2026
26
+
27
+ Cette page est un rapport de benchmark pour les solutions i18n sur Vue.
28
+
29
+ ## Table des Matières
30
+
31
+ <Toc/>
32
+
33
+ ## Benchmark Interactif
34
+
35
+ <I18nBenchmark framework="vite-vue" vertical/>
36
+
37
+ ## Référence des résultats :
38
+
39
+ <iframe
40
+ src="https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_vue.md"
41
+ width="100%"
42
+ height="600px"
43
+ style="border:none;">
44
+ </iframe>
45
+
46
+ > https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_vue.md
47
+
48
+ Voir le dépôt complet du benchmark [ici](https://github.com/intlayer-org/benchmark-i18n/tree/main).
49
+
50
+ ## Introduction
51
+
52
+ Les solutions d'internationalisation figurent parmi les dépendances les plus lourdes d'une application Vue. Le risque principal est d'embarquer du contenu inutile : les traductions d'autres pages et d'autres locales dans le bundle d'une seule route.
53
+
54
+ À mesure que votre application grandit, ce problème peut rapidement faire exploser la quantité de JavaScript envoyée au client et ralentir la navigation.
55
+
56
+ En pratique, pour les implémentations les moins optimisées, une page internationalisée peut finir par être plusieurs fois plus lourde que la version sans i18n.
57
+
58
+ L'autre impact concerne l'expérience développeur (DX) : la façon dont vous déclarez le contenu, les types, l'organisation des namespaces, le chargement dynamique et la réactivité lors du changement de langue.
59
+
60
+ ## TL;DR
61
+
62
+ - **Intlayer** : La solution la plus légère (v8.7.12) avec découpage (scoping) et chargement dynamique natifs.
63
+ - **vue-i18n** : Le standard de l'industrie avec un riche écosystème, mais peut être nettement plus lourd et difficile à optimiser pour le code-splitting dans les grandes applications.
64
+ - **fluent-vue** : Organisation innovante des messages mais manque de sécurité de type et s'avère extrêmement lourd.
65
+
66
+ ## Testez votre application
67
+
68
+ Pour repérer rapidement les problèmes de fuite i18n, j'ai mis en place un scanner gratuit disponible [ici](https://intlayer.org/i18n-seo-scanner).
69
+
70
+ <iframe src="https://intlayer.org/i18n-seo-scanner" width="100%" height="600px" style="border:none;"/>
71
+
72
+ ## Le problème
73
+
74
+ Deux leviers sont essentiels pour limiter le coût d'une application multilingue :
75
+
76
+ - Découper le contenu par page / namespace afin de ne pas charger des dictionnaires entiers quand on n'en a pas besoin
77
+ - Charger la bonne locale dynamiquement, uniquement quand nécessaire
78
+
79
+ Comprendre les limitations techniques de ces approches :
80
+
81
+ **Chargement dynamique**
82
+
83
+ Sans chargement dynamique, la plupart des solutions gardent les messages en mémoire dès le premier rendu, ce qui ajoute un surcoût important pour les applications ayant beaucoup de routes et de langues.
84
+
85
+ Avec le chargement dynamique, vous acceptez un compromis : moins de JS initial, mais parfois une requête supplémentaire lors du changement de langue.
86
+
87
+ **Découpage du contenu (Splitting)**
88
+
89
+ Les syntaxes basées sur `const { t } = useI18n()` + `t('a.b.c')` sont très pratiques mais encouragent souvent la conservation de gros objets JSON au runtime. Ce modèle rend le tree-shaking difficile à moins que la bibliothèque ne propose une réelle stratégie de découpage par page.
90
+
91
+ ## Méthodologie
92
+
93
+ Pour ce benchmark, nous avons comparé les bibliothèques suivantes :
94
+
95
+ - `Base App` (Pas de bibliothèque i18n)
96
+ - `vue-intlayer` (v8.7.12)
97
+ - `vue-i18n` (v11.4.0)
98
+ - `fluent-vue` (v3.8.2)
99
+
100
+ Le framework utilisé est `Vue` avec une application multilingue de **10 pages** et **10 langues**.
101
+
102
+ Nous avons comparé **quatre stratégies de chargement** :
103
+
104
+ | Stratégie | Sans namespaces (global) | Avec namespaces (scoped) |
105
+ | :----------------------- | :------------------------------------------------ | :------------------------------------------------------------------- |
106
+ | **Chargement statique** | **Static** : Tout en mémoire au démarrage. | **Scoped static** : Divisé par namespace ; tout chargé au démarrage. |
107
+ | **Chargement dynamique** | **Dynamic** : Chargement à la demande par locale. | **Scoped dynamic** : Chargement granulaire par namespace et locale. |
108
+
109
+ ## Résumé des stratégies
110
+
111
+ - **Static** : Simple ; pas de latence réseau après le chargement initial. Inconvénient : taille de bundle importante.
112
+ - **Dynamic** : Réduit le poids initial (lazy-loading). Idéal lorsque vous avez de nombreuses locales.
113
+ - **Scoped static** : Organise bien le code (séparation logique) sans requêtes réseau supplémentaires complexes.
114
+ - **Scoped dynamic** : Meilleure approche pour le _code splitting_ et la performance. Minimise la mémoire en ne chargeant que ce dont la vue actuelle et la locale active ont besoin.
115
+
116
+ ### Ce que j'ai mesuré :
117
+
118
+ J'ai fait tourner la même application multilingue dans un vrai navigateur pour chaque stack, puis j'ai noté ce qui passait réellement sur le réseau et combien de temps cela prenait. Les tailles sont indiquées **après compression web normale**, car c'est plus proche de ce que les gens téléchargent réellement.
119
+
120
+ - **Taille de la bibliothèque d'internationalisation** : Après bundling, tree-shaking et minification, la taille de la bibliothèque i18n est la taille du code des providers + composables dans un composant vide. Cela n'inclut pas le chargement des fichiers de traduction. Cela montre à quel point la bibliothèque est "coûteuse" avant même que votre contenu n'entre en jeu.
121
+
122
+ - **JavaScript par page** : Pour chaque route du benchmark, quelle quantité de scripts le navigateur récupère pour cette visite, en moyenne sur les pages du test (et sur les locales). Les pages lourdes sont des pages lentes.
123
+
124
+ - **Fuite des autres locales (Leakage)** : C'est le contenu de la même page mais dans une autre langue qui serait chargé par erreur dans la page auditée. Ce contenu est inutile et doit être évité (ex: contenu de la page `/fr/about` dans le bundle de la page `/en/about`).
125
+
126
+ - **Fuite des autres routes** : Même idée pour les **autres écrans** de l'application : si leurs textes sont embarqués alors que vous n'avez ouvert qu'une seule page (ex: contenu de la page `/en/about` dans le bundle de la page `/en/contact`). Un score élevé indique un faible découpage ou des bundles trop larges.
127
+
128
+ - **Taille moyenne du bundle d'un composant** : Les éléments UI communs sont mesurés **un par un**, au lieu d'être cachés dans un seul chiffre global d'application. Cela montre si l'internationalisation gonfle discrètement les composants du quotidien. Par exemple, si votre composant se re-rend, il chargera toutes ces données depuis la mémoire. Attacher un JSON géant à n'importe quel composant revient à connecter un grand entrepôt de données inutilisées qui ralentira les performances de vos composants.
129
+
130
+ - **Réactivité du changement de langue** : Je change la langue via le contrôle de l'application et je mesure le temps nécessaire pour que la page ait clairement basculé, ce qu'un visiteur remarquerait.
131
+
132
+ - **Travail de rendu après un changement de langue** : Un indicateur plus précis : quel effort l'interface a fourni pour se redessiner dans la nouvelle langue une fois le changement lancé. Utile lorsque le temps "ressenti" et le coût du framework divergent.
133
+
134
+ - **Temps de chargement initial de la page** : De la navigation jusqu'au moment où le navigateur considère la page comme entièrement chargée pour les scénarios testés. Utile pour comparer les démarrages à froid.
135
+
136
+ - **Temps d'hydratation (Hydration)** : Temps que le client passe à transformer le HTML du serveur en interface interactive. Un tiret dans les tableaux signifie que l'implémentation n'a pas fourni de chiffre d'hydratation fiable dans ce test.
137
+
138
+ ## Résultats en détail
139
+
140
+ ### 1 — Solutions à éviter
141
+
142
+ > Aucune solution claire à éviter dans l'écosystème Vue.
143
+
144
+ ### 2 — Solutions acceptables
145
+
146
+ **(vue-i18n)** (`vue-i18n@11.4.0`) :
147
+
148
+ - **vue-i18n** est sans conteste la bibliothèque i18n la plus utilisée pour Vue, elle possède énormément de fonctionnalités et un immense écosystème. Mais sous le capot, la solution est assez lourde. Même si vue-i18n intègre le lazy loading des messages, il lui manque une fonctionnalité de découpage (scoping). Dans le cas d'une application Vue SPA classique, cela ne pose pas de problème, mais pour une application Nuxt utilisant @nuxt/i18n, cela conduit à inclure les messages de toutes les pages dans une seule. Pour une grosse application Nuxt de plus de 10 pages, cela peut devenir vraiment problématique.
149
+
150
+ Le paquet est très lourd (~24.3 Ko, soit environ 9× `vue-intlayer`).
151
+
152
+ **(fluent-vue)** (`fluent-vue@0.5.0`) :
153
+
154
+ - **fluent-vue** propose une tentative d'innovation via le format .ftl. L'organisation des messages est excellente, plus facile pour débuter. Mais en pratique, le manque de sécurité de type augmente le risque d'erreur et peut vite devenir chronophage à déboguer. De plus, cette solution charge les messages via un plugin vite qui force le chargement de tout le contenu dans toutes les langues dans chaque page. Enfin, c'est une solution extrêmement lourde (~92.7 Ko, soit environ 34× `vue-intlayer`).
155
+
156
+ ### 3 — Recommandations
157
+
158
+ **(Intlayer)** (`vue-intlayer@8.7.12`) :
159
+
160
+ Je ne jugerai pas personnellement `vue-intlayer` par souci d'objectivité, puisqu'il s'agit de ma propre solution.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2024-08-13
3
- updatedAt: 2026-04-08
3
+ updatedAt: 2026-05-12
4
4
  title: Configuration
5
5
  description: Apprenez à configurer Intlayer pour votre application. Comprenez les différents paramètres et options disponibles pour personnaliser Intlayer selon vos besoins.
6
6
  keywords:
@@ -14,6 +14,9 @@ slugs:
14
14
  - concept
15
15
  - configuration
16
16
  history:
17
+ - version: 8.9.4
18
+ date: 2026-05-12
19
+ changes: "Ajout du support pour le fournisseur LM Studio"
17
20
  - version: 8.7.0
18
21
  date: 2026-04-08
19
22
  changes: "Ajout des options `prune` et `minify` à la configuration de build"
@@ -350,7 +353,7 @@ const config: IntlayerConfig = {
350
353
  ai: {
351
354
  /**
352
355
  * Fournisseur d'IA à utiliser.
353
- * Options : 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai'
356
+ * Options : 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio'
354
357
  * Par défaut : 'openai'
355
358
  */
356
359
  provider: "openai",
@@ -919,16 +922,17 @@ Intlayer supporte plusieurs fournisseurs d'IA pour une flexibilité accrue. Les
919
922
  - **Groq**
920
923
  - **Amazon Bedrock**
921
924
  - **Together.ai**
922
-
923
- | Champ | Description | Type | Par défaut | Exemple | Note |
924
- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
925
- | `provider` | Le fournisseur à utiliser pour les fonctionnalités IA d'Intlayer. | `'openai'` &#124; <br/> `'anthropic'` &#124; <br/> `'mistral'` &#124; <br/> `'deepseek'` &#124; <br/> `'gemini'` &#124; <br/> `'ollama'` &#124; <br/> `'openrouter'` &#124; <br/> `'alibaba'` &#124; <br/> `'fireworks'` &#124; <br/> `'groq'` &#124; <br/> `'huggingface'` &#124; <br/> `'bedrock'` &#124; <br/> `'googleaistudio'` &#124; <br/> `'googlevertex'` &#124; <br/> `'togetherai'` | `undefined` | `'anthropic'` | Les différents fournisseurs nécessitent des clés API différentes et ont des tarifs variés. |
926
- | `model` | Le modèle à utiliser pour les fonctionnalités IA. | `string` | Aucun | `'gpt-4o-2024-11-20'` | Le modèle spécifique varie selon le fournisseur. |
927
- | `temperature` | Contrôle le caractère aléatoire des réponses de l'IA. | `number` | Aucun | `0.1` | Température plus élevée = plus créatif et moins prévisible. |
928
- | `apiKey` | Votre clé API pour le fournisseur sélectionné. | `string` | Aucun | `process.env.OPENAI_API_KEY` | Garder secret ; stocker dans les variables d'environnement. |
929
- | `applicationContext` | Contexte supplémentaire sur votre application pour aider l'IA à générer des traductions plus précises (domaine, audience, ton, terminologie). | `string` | Aucun | `'Mon contexte d'application'` | Peut être utilisé pour ajouter des règles (ex: `"Vous ne devez pas transformer les urls"`). |
930
- | `baseURL` | L'URL de base pour l'API IA. | `string` | Aucun | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | Peut pointer vers un point de terminaison d'API IA local ou personnalisé. |
931
- | `dataSerialization` | Format de sérialisation des données pour les fonctionnalités IA. | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | `'json'`: standard, fiable ; utilise plus de tokens.<br/>• `'toon'`: moins de tokens, moins cohérent.<br/>• Des paramètres supplémentaires sont passés au modèle comme contexte (effort de raisonnement, etc.). |
925
+ - **LM Studio**
926
+
927
+ | Champ | Description | Type | Par défaut | Exemple | Note |
928
+ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
929
+ | `provider` | Le fournisseur à utiliser pour les fonctionnalités IA d'Intlayer. | `'openai'` &#124; <br/> `'anthropic'` &#124; <br/> `'mistral'` &#124; <br/> `'deepseek'` &#124; <br/> `'gemini'` &#124; <br/> `'ollama'` &#124; <br/> `'openrouter'` &#124; <br/> `'alibaba'` &#124; <br/> `'fireworks'` &#124; <br/> `'groq'` &#124; <br/> `'huggingface'` &#124; <br/> `'bedrock'` &#124; <br/> `'googleaistudio'` &#124; <br/> `'googlevertex'` &#124; <br/> `'togetherai'` &#124; <br/> `'lmstudio'` | `undefined` | `'anthropic'` | Les différents fournisseurs nécessitent des clés API différentes et ont des tarifs variés. |
930
+ | `model` | Le modèle à utiliser pour les fonctionnalités IA. | `string` | Aucun | `'gpt-4o-2024-11-20'` | Le modèle spécifique varie selon le fournisseur. |
931
+ | `temperature` | Contrôle le caractère aléatoire des réponses de l'IA. | `number` | Aucun | `0.1` | Température plus élevée = plus créatif et moins prévisible. |
932
+ | `apiKey` | Votre clé API pour le fournisseur sélectionné. | `string` | Aucun | `process.env.OPENAI_API_KEY` | Garder secret ; stocker dans les variables d'environnement. |
933
+ | `applicationContext` | Contexte supplémentaire sur votre application pour aider l'IA à générer des traductions plus précises (domaine, audience, ton, terminologie). | `string` | Aucun | `'Mon contexte d'application'` | Peut être utilisé pour ajouter des règles (ex: `"Vous ne devez pas transformer les urls"`). |
934
+ | `baseURL` | L'URL de base pour l'API IA. | `string` | Aucun | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | Peut pointer vers un point de terminaison d'API IA local ou personnalisé. |
935
+ | `dataSerialization` | Format de sérialisation des données pour les fonctionnalités IA. | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | • `'json'`: standard, fiable ; utilise plus de tokens.<br/>• `'toon'`: moins de tokens, moins cohérent.<br/>• Des paramètres supplémentaires sont passés au modèle comme contexte (effort de raisonnement, etc.). |
932
936
 
933
937
  ---
934
938
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-02-07
3
- updatedAt: 2026-01-28
3
+ updatedAt: 2026-05-12
4
4
  title: Fichier de Contenu
5
5
  description: Apprenez à personnaliser les extensions pour vos fichiers de déclaration de contenu. Suivez cette documentation pour implémenter efficacement des conditions dans votre projet.
6
6
  keywords:
@@ -12,6 +12,9 @@ slugs:
12
12
  - concept
13
13
  - content
14
14
  history:
15
+ - version: 8.9.0
16
+ date: 2026-05-12
17
+ changes: "Ajouter le type de nœud de contenu `plural`"
15
18
  - version: 8.0.0
16
19
  date: 2026-01-28
17
20
  changes: "Ajout du type de nœud de contenu `html`"
@@ -63,6 +66,7 @@ import { type ReactNode } from "react";
63
66
  import {
64
67
  t,
65
68
  enu,
69
+ plural,
66
70
  cond,
67
71
  nest,
68
72
  md,
@@ -82,6 +86,7 @@ interface Content {
82
86
  };
83
87
  multilingualContent: string;
84
88
  quantityContent: string;
89
+ pluralContent: string;
85
90
  conditionalContent: string;
86
91
  markdownContent: never;
87
92
  htmlContent: never;
@@ -117,6 +122,10 @@ export default {
117
122
  ">5": "Quelques voitures",
118
123
  ">19": "Beaucoup de voitures",
119
124
  }),
125
+ pluralContent: plural({
126
+ one: "One car",
127
+ other: "{{count}} cars",
128
+ }),
120
129
  conditionalContent: cond({
121
130
  true: "La validation est activée",
122
131
  false: "La validation est désactivée",
@@ -171,6 +180,13 @@ export default {
171
180
  ">5": "Quelques voitures",
172
181
  ">19": "Beaucoup de voitures",
173
182
  },
183
+ "pluralContent": {
184
+ "nodeType": "plural",
185
+ "plural": {
186
+ "one": "One car",
187
+ "other": "{{count}} cars",
188
+ },
189
+ },
174
190
  },
175
191
  "conditionalContent": {
176
192
  "nodeType": "condition",
@@ -218,6 +234,7 @@ Les nœuds de contenu sont les éléments de base du contenu du dictionnaire. Il
218
234
  - **Valeurs primitives** : chaînes de caractères, nombres, booléens, null, undefined
219
235
  - **Nœuds typés** : Types de contenu spéciaux comme les traductions, conditions, markdown, etc.
220
236
  - **Fonctions** : Contenu dynamique pouvant être évalué à l'exécution [voir Récupération de fonctions](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/function_fetching.md)
237
+ - **Contenu Pluriel**: Voir Contenu Pluriel [Voir Contenu Pluriel](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/plural.md)
221
238
  - **Contenu imbriqué** : Références à d'autres dictionnaires
222
239
 
223
240
  #### Types de contenu
@@ -536,6 +553,8 @@ multilingualContent: t({
536
553
  });
537
554
  ```
538
555
 
556
+ > Voir [Contenu de traduction (`t`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/translation.md) pour plus d'informations.
557
+
539
558
  ### Contenu conditionnel (`cond`)
540
559
 
541
560
  Contenu qui change en fonction de conditions booléennes :
@@ -549,6 +568,8 @@ conditionalContent: cond({
549
568
  });
550
569
  ```
551
570
 
571
+ > Voir [Contenu conditionnel (`cond`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/condition.md) pour plus d'informations.
572
+
552
573
  ### Contenu d'énumération (`enu`)
553
574
 
554
575
  Contenu qui varie en fonction de valeurs énumérées :
@@ -563,6 +584,23 @@ statusContent: enu({
563
584
  });
564
585
  ```
565
586
 
587
+ > Voir [Contenu d'énumération (`enu`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/enumeration.md) pour plus d'informations.
588
+
589
+ ### Contenu Pluriel (`plural`)
590
+
591
+ Contenu qui varie selon les règles de pluriel :
592
+
593
+ ```typescript
594
+ import { plural } from "intlayer";
595
+
596
+ pluralContent: plural({
597
+ one: "One car",
598
+ other: "{{count}} cars",
599
+ });
600
+ ```
601
+
602
+ > Voir [Contenu Pluriel Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/plural.md) pour plus d'informations.
603
+
566
604
  ### Contenu d'insertion (`insert`)
567
605
 
568
606
  Contenu qui peut être inséré dans un autre contenu :
@@ -573,6 +611,8 @@ import { insert } from "intlayer";
573
611
  insertionContent: insert("Ce texte peut être inséré n'importe où");
574
612
  ```
575
613
 
614
+ > Voir [Contenu d'insertion (`insert`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/insertion.md) pour plus d'informations.
615
+
576
616
  ### Contenu imbriqué (`nest`)
577
617
 
578
618
  Références à d'autres dictionnaires :
@@ -583,6 +623,8 @@ import { nest } from "intlayer";
583
623
  nestedContent: nest("about-page");
584
624
  ```
585
625
 
626
+ > Voir [Contenu imbriqué (`nest`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/nesting.md) pour plus d'informations.
627
+
586
628
  ### Contenu Markdown (`md`)
587
629
 
588
630
  Contenu riche au format Markdown :
@@ -595,6 +637,8 @@ markdownContent: md(
595
637
  );
596
638
  ```
597
639
 
640
+ > Voir [Contenu Markdown (`md`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/markdown.md) pour plus d'informations.
641
+
598
642
  ### Contenu HTML (`html`)
599
643
 
600
644
  Contenu HTML riche pouvant utiliser des balises standard ou des composants personnalisés :
@@ -612,6 +656,8 @@ localizedHtmlContent: t({
612
656
  });
613
657
  ```
614
658
 
659
+ > Voir [Contenu HTML (`html`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/html.md) pour plus d'informations.
660
+
615
661
  ### Contenu selon le genre (`gender`)
616
662
 
617
663
  Contenu qui varie selon le genre :
@@ -626,6 +672,8 @@ genderContent: gender({
626
672
  });
627
673
  ```
628
674
 
675
+ > Voir [Contenu selon le genre (`gender`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/gender.md) pour plus d'informations.
676
+
629
677
  ### Contenu de fichier (`file`)
630
678
 
631
679
  Références à des fichiers externes :
@@ -636,6 +684,8 @@ import { file } from "intlayer";
636
684
  fileContent: file("./path/to/content.txt");
637
685
  ```
638
686
 
687
+ > Voir [Contenu de fichier (`file`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/file.md) pour plus d'informations.
688
+
639
689
  ## Création de fichiers de contenu
640
690
 
641
691
  ### Structure de base d’un fichier de contenu
@@ -160,30 +160,9 @@ syncPO({
160
160
  source: ({ key, locale }) => string, // requis
161
161
  location?: string, // étiquette optionnelle, défaut : "sync-po::path/to/source"
162
162
  priority?: number, // priorité optionnelle pour la résolution de conflits, défaut : 0
163
- format?: 'icu' | 'i18next' | 'vue-i18n', // optionnel, nécessaire uniquement lorsque vos valeurs msgstr utilisent une syntaxe d'interpolation spécifique
164
163
  });
165
164
  ```
166
165
 
167
- #### `format` ('icu' | 'i18next' | 'vue-i18n')
168
-
169
- Les fichiers PO sont toujours des fichiers Gettext Portable Object — c'est fixe. Cette option décrit uniquement la **syntaxe d'interpolation** utilisée à l'intérieur des valeurs `msgstr`, afin qu'Intlayer puisse les convertir dans son propre format au moment de l'analyse (via `formatDictionary`) et inversement lors de l'écriture de la sortie.
170
-
171
- - `undefined` _(défaut)_ : les valeurs `msgstr` sont traitées comme des chaînes de caractères simples — pas de transformation. Utilisez ceci pour la plupart des fichiers PO.
172
- - `'icu'` : les valeurs `msgstr` utilisent la syntaxe de message ICU (ex : `{count, plural, one {# item} other {# items}}`).
173
- - `'i18next'` : les valeurs `msgstr` utilisent la syntaxe d'interpolation i18next (ex : `{{variable}}`).
174
- - `'vue-i18n'` : les valeurs `msgstr` utilisent la syntaxe Vue I18n.
175
-
176
- > La transformation est appliquée par `formatDictionary` de `@intlayer/chokidar` au chargement, et inversée avec `formatDictionaryOutput` à l'écriture. Pour les règles complexes comme les pluriels ICU, la fidélité de l'aller-retour n'est pas garantie.
177
-
178
- **Exemple — les fichiers PO contiennent une interpolation de style i18next :**
179
-
180
- ```ts
181
- syncPO({
182
- source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
183
- format: "i18next",
184
- }),
185
- ```
186
-
187
166
  ### Sources PO multiples et priorité
188
167
 
189
168
  Vous pouvez ajouter plusieurs plugins `syncPO` pour synchroniser différentes sources PO. Ceci est utile lorsque vous avez plusieurs sources de traduction ou différentes structures PO dans votre projet.
@@ -61,6 +61,13 @@ i18n लाइब्रेरीज़ का एक अन्य प्रभ
61
61
 
62
62
  Intlayer इन सभी आयामों में अनुकूलन करने का प्रयास करता है।
63
63
 
64
+ ## TL;DR
65
+
66
+ - **Intlayer** और **next-translate**: Next.js परफॉरमेंस के लिए सर्वोत्तम विकल्प, जो सबसे छोटा फुटप्रिंट और बेहतरीन स्टेटिक रेंडरिंग सपोर्ट प्रदान करते हैं।
67
+ - **next-intl**: वर्तमान में सबसे ट्रेंडी विकल्प, लेकिन बड़ेप्लिकेशन्स के लिए अनुकूलित करना भारी और जटिल है।
68
+ - **next-i18next**: लोकप्रिय और प्लगइन्स से भरपूर, लेकिन बंडल का आकार काफी अधिक है (~3 गुना Intlayer)।
69
+ - **इनसे बचें**: गंभीर परफॉरमेंस समस्याओं, वेंडर लॉक-इन और बिल्ड को रोकने वाले बग्स के कारण **gt-next** और **lingo.dev** से बचें।
70
+
64
71
  ## अपने ऐप का परीक्षण करें
65
72
 
66
73
  इन समस्याओं को उजागर करने के लिए, मैंने एक मुफ़्त स्कैनर बनाया है जिसे आप [यहाँ](https://intlayer.org/i18n-seo-scanner) आज़मा सकते हैं।
@@ -99,14 +106,14 @@ Intlayer इन सभी आयामों में अनुकूलन क
99
106
  इस बेंचमार्क के लिए, हमने निम्नलिखित लाइब्रेरीज़ की तुलना की है:
100
107
 
101
108
  - `Base App` (कोई i18n लाइब्रेरी नहीं)
102
- - `next-intlayer` (v8.7.5)
109
+ - `next-intlayer` (v8.7.12)
103
110
  - `next-i18next` (v16.0.5)
104
111
  - `next-intl` (v4.9.1)
105
112
  - `@lingui/core` (v5.3.0)
106
113
  - `next-translate` (v3.1.2)
107
114
  - `next-international` (v1.3.1)
108
115
  - `@inlang/paraglide-js` (v2.15.1)
109
- - `tolgee` (v7.0.0)
116
+ - `@tolgee/react` (v7.0.0)
110
117
  - `@lingo.dev/compiler` (v0.4.0)
111
118
  - `wuchale` (v0.22.11)
112
119
  - `gt-next` (v6.16.5)
@@ -161,10 +168,10 @@ Intlayer इन सभी आयामों में अनुकूलन क
161
168
 
162
169
  **(General Translation)** (`gt-next@6.16.5`):
163
170
 
164
- - 110kb ऐप के लिए, `gt-react` 440kb से अधिक अतिरिक्त डेटा जोड़ता है।
171
+ - 110kb ऐप के लिए, `gt-next` 440kb से अधिक अतिरिक्त डेटा जोड़ता है।
165
172
  - जनरल ट्रांसलेशन के साथ पहले ही बिल्ड पर `Quota Exceeded, please upgrade your plan` संदेश।
166
173
  - अनुवाद रेंडर नहीं होते हैं; मुझे एरर मिलता है `Error: <T> used on the client-side outside of <GTProvider>` , जो लाइब्रेरी में एक बग लगता है।
167
- - **gt-tanstack-start-react** को लागू करने के दौरान, मुझे लाइब्रेरी के साथ एक [इश्यू](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) भी मिला: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser` एरर, जिससे एप्लिकेशन क्रैश हो रहा था। इस समस्या की रिपोर्ट करने के बाद, मेंटेनर ने इसे 24 घंटों के भीतर ठीक कर दिया।
174
+ - **gt-next** को लागू करने के दौरान, मुझे लाइब्रेरी के साथ एक [इश्यू](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) भी मिला: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser` एरर, जिससे एप्लिकेशन क्रैश हो रहा था। इस समस्या की रिपोर्ट करने के बाद, मेंटेनर ने इसे 24 घंटों के भीतर ठीक कर दिया।
168
175
  - लाइब्रेरी Next.js पेजों के स्टेटिक रेंडरिंग को ब्लॉक करती है।
169
176
 
170
177
  **(Lingo.dev)** (`@lingo.dev/compiler@0.4.0`):
@@ -186,9 +193,11 @@ Intlayer इन सभी आयामों में अनुकूलन क
186
193
  व्यक्तिगत रूप से मुझे हर पुश से पहले JS फ़ाइलों को दोबारा उत्पन्न करना पसंद नहीं है, जो PR के माध्यम से लगातार मर्ज संघर्ष का जोखिम पैदा करता है। यह टूल Next.js की तुलना में Vite पर अधिक केंद्रित लगता है।
187
194
  अंत में, अन्य समाधानों की तुलना में, Paraglide सामग्री रेंडर करने के लिए वर्तमान लोकेल को पुनः प्राप्त करने के लिए स्टोर (उदा. React context) का उपयोग नहीं करता है। पार्स किए गए प्रत्येक नोड के लिए, यह localStorage / कुकी आदि से लोकेल का अनुरोध करेगा। यह अनावश्यक तर्क के निष्पादन की ओर ले जाता है जो कंपोनेंट रिएक्टिविटी को प्रभावित करता है।
188
195
 
196
+ > Paraglide पर नोट: यह समाधान इम्पोर्ट के लिए आपके कोडबेस में कोड इंजेक्ट करता है, जिसके परिणामस्वरूप बेंचमार्क रिपोर्ट में 'लाइब्रेरी आकार' मीट्रिक लगभग 0 है। कोड जेनरेशन एक अच्छी चीज़ है, क्योंकि उपयोग किया जाने वाला फंक्शन केवल आवश्यक लॉजिक (सभी प्रीफ़िक्स बनाम कोई प्रीफ़िक्स नहीं, कुकीज़ बनाम स्टोरेज, आदि) शामिल करेगा। इसकी तुलना में, Intlayer बिल्ड में एनवायरनमेंट वेरिएबल इंजेक्शन के माध्यम से यह फ़िल्टरिंग करता है ताकि बंडलर को लॉजिक के आधार पर सामग्री को ट्री-शेक करने के लिए मजबूर किया जा सके। इसके कारण, paraglide और intlayer अंत में i18next या next-intl की तुलना में 6 से 10 गुना हल्के समाधान साबित होते हैं।
197
+
189
198
  ### 3 — स्वीकार्य समाधान
190
199
 
191
- **(Tolgee)** (`tolgee@7.0.0`):
200
+ **(Tolgee)** (`@tolgee/react@7.0.0`):
192
201
 
193
202
  `Tolgee` पहले उल्लेखित कई मुद्दों को संबोधित करता है। मुझे लगा कि इसे अपनाना समान उपकरणों की तुलना में कठिन है। यह टाइप सेफ्टी (type safety) प्रदान नहीं करता है, जिससे कंपाइल समय पर गायब कीज़ को पकड़ना भी कठिन हो जाता है। गायब-की पहचान जोड़ने के लिए मुझे Tolgee के फंक्शन्स को अपने फंक्शन्स के साथ रैप करना पड़ा।
194
203
 
@@ -216,7 +225,7 @@ Intlayer इन सभी आयामों में अनुकूलन क
216
225
 
217
226
  यदि आप `t()` स्टाइल की API पसंद करते हैं, तो `next-translate` मेरी मुख्य सिफारिश है। यह `next-translate-plugin` के माध्यम से सुंदर ढंग से काम करता है, जो Webpack / Turbopack लोडर के माध्यम से `getStaticProps` में नेमस्पेस लोड करता है। यह यहाँ सबसे हल्का विकल्प भी है (~2.5kb)। नेमस्पेसिंग के पार, कॉन्फ़िगरेशन में प्रति पेज या रूट नेमस्पेस परिभाषित करना अच्छी तरह से सोचा गया है और **next-intl** या **next-i18next** जैसे मुख्य विकल्पों की तुलना में बनाए रखना आसान है। वर्जन `3.1.2` में, मैंने पाया कि स्टेटिक रेंडरिंग काम नहीं करती थी; Next.js डायनेमिक रेंडरिंग पर वापस चला गया।
218
227
 
219
- **(Intlayer)** (`next-intlayer@8.7.5`):
228
+ **(Intlayer)** (`next-intlayer@8.7.12`):
220
229
 
221
230
  निष्पक्षता के लिए मैं व्यक्तिगत रूप से मेरे स्वयं के समाधान `next-intlayer` पर निर्णय नहीं दूँगा।
222
231