@intlayer/docs 9.5.2 → 9.5.3

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 (384) hide show
  1. package/README.md +1 -1
  2. package/blog/ar/i18next_vs_intlayer-i18next.md +327 -0
  3. package/blog/ar/i18next_vs_intlayer.md +445 -0
  4. package/blog/ar/is_i18next_outdated.md +1 -1
  5. package/blog/ar/is_next-intl_outdated.md +1 -1
  6. package/blog/ar/is_vue-i18n_outdated.md +1 -1
  7. package/blog/ar/lingui_vs_intlayer-lingui.md +304 -0
  8. package/blog/ar/lingui_vs_intlayer.md +381 -0
  9. package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  10. package/blog/ar/next-intl_vs_intlayer-next-intl.md +309 -0
  11. package/blog/ar/next-intl_vs_intlayer.md +397 -0
  12. package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  13. package/blog/ar/vue-i18n_vs_intlayer-vue-i18n.md +286 -0
  14. package/blog/ar/vue-i18n_vs_intlayer_benchmark.md +0 -0
  15. package/blog/de/i18next_vs_intlayer-i18next.md +327 -0
  16. package/blog/de/i18next_vs_intlayer.md +445 -0
  17. package/blog/de/is_i18next_outdated.md +1 -1
  18. package/blog/de/is_next-intl_outdated.md +1 -1
  19. package/blog/de/is_vue-i18n_outdated.md +1 -1
  20. package/blog/de/lingui_vs_intlayer-lingui.md +304 -0
  21. package/blog/de/lingui_vs_intlayer.md +381 -0
  22. package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  23. package/blog/de/next-intl_vs_intlayer-next-intl.md +309 -0
  24. package/blog/de/next-intl_vs_intlayer.md +415 -0
  25. package/blog/de/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  26. package/blog/de/vue-i18n_vs_intlayer_benchmark.md +355 -0
  27. package/blog/en/i18next_vs_intlayer-i18next.md +327 -0
  28. package/blog/en/i18next_vs_intlayer.md +445 -0
  29. package/blog/en/is_i18next_outdated.md +1 -1
  30. package/blog/en/is_next-intl_outdated.md +1 -1
  31. package/blog/en/is_vue-i18n_outdated.md +1 -1
  32. package/blog/en/lingui_vs_intlayer-lingui.md +304 -0
  33. package/blog/en/lingui_vs_intlayer.md +381 -0
  34. package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  35. package/blog/en/next-intl_vs_intlayer-next-intl.md +309 -0
  36. package/blog/en/next-intl_vs_intlayer.md +415 -0
  37. package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  38. package/blog/en/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  39. package/blog/en/vue-i18n_vs_intlayer.md +1 -1
  40. package/blog/en/vue-i18n_vs_intlayer_benchmark.md +361 -0
  41. package/blog/en-GB/i18next_vs_intlayer-i18next.md +327 -0
  42. package/blog/en-GB/i18next_vs_intlayer.md +445 -0
  43. package/blog/en-GB/is_i18next_outdated.md +1 -1
  44. package/blog/en-GB/is_next-intl_outdated.md +1 -1
  45. package/blog/en-GB/is_vue-i18n_outdated.md +1 -1
  46. package/blog/en-GB/lingui_vs_intlayer-lingui.md +304 -0
  47. package/blog/en-GB/lingui_vs_intlayer.md +381 -0
  48. package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  49. package/blog/en-GB/next-intl_vs_intlayer-next-intl.md +309 -0
  50. package/blog/en-GB/next-intl_vs_intlayer.md +415 -0
  51. package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  52. package/blog/en-GB/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  53. package/blog/en-GB/vue-i18n_vs_intlayer.md +1 -1
  54. package/blog/en-GB/vue-i18n_vs_intlayer_benchmark.md +245 -0
  55. package/blog/es/i18next_vs_intlayer-i18next.md +327 -0
  56. package/blog/es/i18next_vs_intlayer.md +445 -0
  57. package/blog/es/is_i18next_outdated.md +1 -1
  58. package/blog/es/is_next-intl_outdated.md +1 -1
  59. package/blog/es/is_vue-i18n_outdated.md +1 -1
  60. package/blog/es/lingui_vs_intlayer-lingui.md +304 -0
  61. package/blog/es/lingui_vs_intlayer.md +381 -0
  62. package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  63. package/blog/es/next-intl_vs_intlayer-next-intl.md +309 -0
  64. package/blog/es/next-intl_vs_intlayer.md +417 -0
  65. package/blog/es/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  66. package/blog/es/vue-i18n_vs_intlayer_benchmark.md +363 -0
  67. package/blog/fr/i18next_vs_intlayer-i18next.md +327 -0
  68. package/blog/fr/i18next_vs_intlayer.md +445 -0
  69. package/blog/fr/is_i18next_outdated.md +1 -1
  70. package/blog/fr/is_next-intl_outdated.md +1 -1
  71. package/blog/fr/is_vue-i18n_outdated.md +1 -1
  72. package/blog/fr/lingui_vs_intlayer-lingui.md +304 -0
  73. package/blog/fr/lingui_vs_intlayer.md +381 -0
  74. package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  75. package/blog/fr/next-intl_vs_intlayer-next-intl.md +309 -0
  76. package/blog/fr/next-intl_vs_intlayer.md +417 -0
  77. package/blog/fr/vue-i18n_vs_intlayer-vue-i18n.md +287 -0
  78. package/blog/fr/vue-i18n_vs_intlayer_benchmark.md +39 -0
  79. package/blog/hi/i18next_vs_intlayer-i18next.md +327 -0
  80. package/blog/hi/i18next_vs_intlayer.md +445 -0
  81. package/blog/hi/is_i18next_outdated.md +1 -1
  82. package/blog/hi/is_next-intl_outdated.md +1 -1
  83. package/blog/hi/is_vue-i18n_outdated.md +1 -1
  84. package/blog/hi/lingui_vs_intlayer-lingui.md +304 -0
  85. package/blog/hi/lingui_vs_intlayer.md +381 -0
  86. package/blog/hi/next-intl_vs_intlayer-next-intl.md +309 -0
  87. package/blog/hi/next-intl_vs_intlayer.md +397 -0
  88. package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  89. package/blog/hi/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  90. package/blog/hi/vue-i18n_vs_intlayer_benchmark.md +0 -0
  91. package/blog/id/i18next_vs_intlayer-i18next.md +327 -0
  92. package/blog/id/i18next_vs_intlayer.md +445 -0
  93. package/blog/id/is_i18next_outdated.md +1 -1
  94. package/blog/id/is_next-intl_outdated.md +1 -1
  95. package/blog/id/is_vue-i18n_outdated.md +1 -1
  96. package/blog/id/lingui_vs_intlayer-lingui.md +304 -0
  97. package/blog/id/lingui_vs_intlayer.md +381 -0
  98. package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  99. package/blog/id/next-intl_vs_intlayer-next-intl.md +310 -0
  100. package/blog/id/next-intl_vs_intlayer.md +397 -0
  101. package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  102. package/blog/id/vue-i18n_vs_intlayer-vue-i18n.md +36 -0
  103. package/blog/id/vue-i18n_vs_intlayer.md +1 -1
  104. package/blog/id/vue-i18n_vs_intlayer_benchmark.md +41 -0
  105. package/blog/it/i18next_vs_intlayer-i18next.md +327 -0
  106. package/blog/it/i18next_vs_intlayer.md +445 -0
  107. package/blog/it/is_i18next_outdated.md +1 -1
  108. package/blog/it/is_next-intl_outdated.md +1 -1
  109. package/blog/it/is_vue-i18n_outdated.md +1 -1
  110. package/blog/it/lingui_vs_intlayer-lingui.md +304 -0
  111. package/blog/it/lingui_vs_intlayer.md +381 -0
  112. package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  113. package/blog/it/next-intl_vs_intlayer-next-intl.md +309 -0
  114. package/blog/it/next-intl_vs_intlayer.md +418 -0
  115. package/blog/it/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  116. package/blog/it/vue-i18n_vs_intlayer_benchmark.md +34 -0
  117. package/blog/ja/i18next_vs_intlayer-i18next.md +327 -0
  118. package/blog/ja/i18next_vs_intlayer.md +447 -0
  119. package/blog/ja/is_i18next_outdated.md +1 -1
  120. package/blog/ja/is_next-intl_outdated.md +1 -1
  121. package/blog/ja/is_vue-i18n_outdated.md +1 -1
  122. package/blog/ja/lingui_vs_intlayer-lingui.md +304 -0
  123. package/blog/ja/lingui_vs_intlayer.md +381 -0
  124. package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  125. package/blog/ja/next-intl_vs_intlayer-next-intl.md +310 -0
  126. package/blog/ja/next-intl_vs_intlayer.md +422 -0
  127. package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  128. package/blog/ja/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  129. package/blog/ja/vue-i18n_vs_intlayer.md +1 -1
  130. package/blog/ja/vue-i18n_vs_intlayer_benchmark.md +0 -0
  131. package/blog/ko/i18next_vs_intlayer-i18next.md +327 -0
  132. package/blog/ko/i18next_vs_intlayer.md +447 -0
  133. package/blog/ko/is_i18next_outdated.md +1 -1
  134. package/blog/ko/is_next-intl_outdated.md +1 -1
  135. package/blog/ko/is_vue-i18n_outdated.md +1 -1
  136. package/blog/ko/lingui_vs_intlayer-lingui.md +304 -0
  137. package/blog/ko/lingui_vs_intlayer.md +381 -0
  138. package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  139. package/blog/ko/next-intl_vs_intlayer-next-intl.md +309 -0
  140. package/blog/ko/next-intl_vs_intlayer.md +397 -0
  141. package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  142. package/blog/ko/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  143. package/blog/ko/vue-i18n_vs_intlayer.md +1 -1
  144. package/blog/ko/vue-i18n_vs_intlayer_benchmark.md +366 -0
  145. package/blog/pl/i18next_vs_intlayer-i18next.md +327 -0
  146. package/blog/pl/i18next_vs_intlayer.md +445 -0
  147. package/blog/pl/is_i18next_outdated.md +1 -1
  148. package/blog/pl/is_next-intl_outdated.md +1 -1
  149. package/blog/pl/is_vue-i18n_outdated.md +1 -1
  150. package/blog/pl/lingui_vs_intlayer-lingui.md +304 -0
  151. package/blog/pl/lingui_vs_intlayer.md +381 -0
  152. package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  153. package/blog/pl/next-intl_vs_intlayer-next-intl.md +309 -0
  154. package/blog/pl/next-intl_vs_intlayer.md +397 -0
  155. package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  156. package/blog/pl/vue-i18n_vs_intlayer-vue-i18n.md +289 -0
  157. package/blog/pl/vue-i18n_vs_intlayer.md +1 -1
  158. package/blog/pl/vue-i18n_vs_intlayer_benchmark.md +0 -0
  159. package/blog/pt/i18next_vs_intlayer-i18next.md +327 -0
  160. package/blog/pt/i18next_vs_intlayer.md +445 -0
  161. package/blog/pt/is_i18next_outdated.md +1 -1
  162. package/blog/pt/is_next-intl_outdated.md +1 -1
  163. package/blog/pt/is_vue-i18n_outdated.md +1 -1
  164. package/blog/pt/lingui_vs_intlayer-lingui.md +304 -0
  165. package/blog/pt/lingui_vs_intlayer.md +381 -0
  166. package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  167. package/blog/pt/next-intl_vs_intlayer-next-intl.md +309 -0
  168. package/blog/pt/next-intl_vs_intlayer.md +411 -0
  169. package/blog/pt/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  170. package/blog/pt/vue-i18n_vs_intlayer_benchmark.md +0 -0
  171. package/blog/ru/i18next_vs_intlayer-i18next.md +327 -0
  172. package/blog/ru/i18next_vs_intlayer.md +445 -0
  173. package/blog/ru/is_i18next_outdated.md +1 -1
  174. package/blog/ru/is_next-intl_outdated.md +1 -1
  175. package/blog/ru/is_vue-i18n_outdated.md +1 -1
  176. package/blog/ru/lingui_vs_intlayer-lingui.md +304 -0
  177. package/blog/ru/lingui_vs_intlayer.md +381 -0
  178. package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  179. package/blog/ru/next-intl_vs_intlayer-next-intl.md +309 -0
  180. package/blog/ru/next-intl_vs_intlayer.md +417 -0
  181. package/blog/ru/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  182. package/blog/ru/vue-i18n_vs_intlayer_benchmark.md +54 -0
  183. package/blog/tr/i18next_vs_intlayer-i18next.md +327 -0
  184. package/blog/tr/i18next_vs_intlayer.md +445 -0
  185. package/blog/tr/is_i18next_outdated.md +1 -1
  186. package/blog/tr/is_next-intl_outdated.md +1 -1
  187. package/blog/tr/is_vue-i18n_outdated.md +1 -1
  188. package/blog/tr/lingui_vs_intlayer-lingui.md +304 -0
  189. package/blog/tr/lingui_vs_intlayer.md +381 -0
  190. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  191. package/blog/tr/next-intl_vs_intlayer-next-intl.md +309 -0
  192. package/blog/tr/next-intl_vs_intlayer.md +397 -0
  193. package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  194. package/blog/tr/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  195. package/blog/tr/vue-i18n_vs_intlayer.md +1 -1
  196. package/blog/tr/vue-i18n_vs_intlayer_benchmark.md +0 -0
  197. package/blog/uk/i18next_vs_intlayer-i18next.md +327 -0
  198. package/blog/uk/i18next_vs_intlayer.md +445 -0
  199. package/blog/uk/is_i18next_outdated.md +1 -1
  200. package/blog/uk/is_next-intl_outdated.md +1 -1
  201. package/blog/uk/is_vue-i18n_outdated.md +1 -1
  202. package/blog/uk/lingui_vs_intlayer-lingui.md +304 -0
  203. package/blog/uk/lingui_vs_intlayer.md +381 -0
  204. package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  205. package/blog/uk/next-intl_vs_intlayer-next-intl.md +309 -0
  206. package/blog/uk/next-intl_vs_intlayer.md +397 -0
  207. package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  208. package/blog/uk/vue-i18n_vs_intlayer-vue-i18n.md +270 -0
  209. package/blog/uk/vue-i18n_vs_intlayer.md +1 -1
  210. package/blog/uk/vue-i18n_vs_intlayer_benchmark.md +0 -0
  211. package/blog/vi/i18next_vs_intlayer-i18next.md +327 -0
  212. package/blog/vi/i18next_vs_intlayer.md +445 -0
  213. package/blog/vi/is_i18next_outdated.md +1 -1
  214. package/blog/vi/is_next-intl_outdated.md +1 -1
  215. package/blog/vi/is_vue-i18n_outdated.md +1 -1
  216. package/blog/vi/lingui_vs_intlayer-lingui.md +304 -0
  217. package/blog/vi/lingui_vs_intlayer.md +381 -0
  218. package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  219. package/blog/vi/next-intl_vs_intlayer-next-intl.md +309 -0
  220. package/blog/vi/next-intl_vs_intlayer.md +397 -0
  221. package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  222. package/blog/vi/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  223. package/blog/vi/vue-i18n_vs_intlayer.md +1 -1
  224. package/blog/vi/vue-i18n_vs_intlayer_benchmark.md +0 -0
  225. package/blog/zh/i18next_vs_intlayer-i18next.md +327 -0
  226. package/blog/zh/i18next_vs_intlayer.md +445 -0
  227. package/blog/zh/is_i18next_outdated.md +1 -1
  228. package/blog/zh/is_next-intl_outdated.md +1 -1
  229. package/blog/zh/is_vue-i18n_outdated.md +1 -1
  230. package/blog/zh/lingui_vs_intlayer-lingui.md +304 -0
  231. package/blog/zh/lingui_vs_intlayer.md +381 -0
  232. package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  233. package/blog/zh/next-intl_vs_intlayer-next-intl.md +309 -0
  234. package/blog/zh/next-intl_vs_intlayer.md +422 -0
  235. package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  236. package/blog/zh/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  237. package/blog/zh/vue-i18n_vs_intlayer.md +1 -1
  238. package/blog/zh/vue-i18n_vs_intlayer_benchmark.md +30 -0
  239. package/dist/cjs/generated/blog.entry.cjs +160 -0
  240. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  241. package/dist/cjs/generated/frequentQuestions.entry.cjs +20 -0
  242. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  243. package/dist/esm/generated/blog.entry.mjs +160 -0
  244. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  245. package/dist/esm/generated/frequentQuestions.entry.mjs +20 -0
  246. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  247. package/dist/types/generated/blog.entry.d.ts +8 -0
  248. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  249. package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
  250. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  251. package/docs/ar/benchmark/nextjs.md +1 -1
  252. package/docs/ar/benchmark/solid.md +1 -1
  253. package/docs/ar/benchmark/svelte.md +1 -1
  254. package/docs/ar/benchmark/tanstack.md +1 -1
  255. package/docs/ar/benchmark/vue.md +1 -1
  256. package/docs/ar/interest_of_intlayer.md +1 -1
  257. package/docs/bn/interest_of_intlayer.md +1 -1
  258. package/docs/cs/interest_of_intlayer.md +1 -1
  259. package/docs/de/benchmark/nextjs.md +1 -1
  260. package/docs/de/benchmark/solid.md +1 -1
  261. package/docs/de/benchmark/svelte.md +1 -1
  262. package/docs/de/benchmark/tanstack.md +1 -1
  263. package/docs/de/benchmark/vue.md +1 -1
  264. package/docs/de/interest_of_intlayer.md +1 -1
  265. package/docs/en/benchmark/nextjs.md +1 -1
  266. package/docs/en/benchmark/solid.md +1 -1
  267. package/docs/en/benchmark/svelte.md +1 -1
  268. package/docs/en/benchmark/tanstack.md +1 -1
  269. package/docs/en/benchmark/vue.md +1 -1
  270. package/docs/en/interest_of_intlayer.md +1 -1
  271. package/docs/en-GB/benchmark/nextjs.md +1 -1
  272. package/docs/en-GB/benchmark/solid.md +1 -1
  273. package/docs/en-GB/benchmark/svelte.md +1 -1
  274. package/docs/en-GB/benchmark/tanstack.md +1 -1
  275. package/docs/en-GB/benchmark/vue.md +1 -1
  276. package/docs/en-GB/interest_of_intlayer.md +1 -1
  277. package/docs/es/benchmark/nextjs.md +1 -1
  278. package/docs/es/benchmark/solid.md +1 -1
  279. package/docs/es/benchmark/svelte.md +1 -1
  280. package/docs/es/benchmark/tanstack.md +1 -1
  281. package/docs/es/benchmark/vue.md +1 -1
  282. package/docs/es/interest_of_intlayer.md +1 -1
  283. package/docs/fr/benchmark/nextjs.md +1 -1
  284. package/docs/fr/benchmark/solid.md +1 -1
  285. package/docs/fr/benchmark/svelte.md +1 -1
  286. package/docs/fr/benchmark/tanstack.md +1 -1
  287. package/docs/fr/benchmark/vue.md +1 -1
  288. package/docs/fr/interest_of_intlayer.md +1 -1
  289. package/docs/hi/benchmark/nextjs.md +1 -1
  290. package/docs/hi/benchmark/solid.md +1 -1
  291. package/docs/hi/benchmark/svelte.md +1 -1
  292. package/docs/hi/benchmark/tanstack.md +1 -1
  293. package/docs/hi/benchmark/vue.md +1 -1
  294. package/docs/hi/interest_of_intlayer.md +1 -1
  295. package/docs/id/benchmark/nextjs.md +1 -1
  296. package/docs/id/benchmark/solid.md +1 -1
  297. package/docs/id/benchmark/svelte.md +1 -1
  298. package/docs/id/benchmark/tanstack.md +1 -1
  299. package/docs/id/benchmark/vue.md +1 -1
  300. package/docs/id/interest_of_intlayer.md +1 -1
  301. package/docs/it/benchmark/nextjs.md +1 -1
  302. package/docs/it/benchmark/solid.md +1 -1
  303. package/docs/it/benchmark/svelte.md +1 -1
  304. package/docs/it/benchmark/tanstack.md +1 -1
  305. package/docs/it/benchmark/vue.md +1 -1
  306. package/docs/it/interest_of_intlayer.md +1 -1
  307. package/docs/ja/benchmark/nextjs.md +1 -1
  308. package/docs/ja/benchmark/solid.md +1 -1
  309. package/docs/ja/benchmark/svelte.md +1 -1
  310. package/docs/ja/benchmark/tanstack.md +1 -1
  311. package/docs/ja/benchmark/vue.md +1 -1
  312. package/docs/ja/interest_of_intlayer.md +1 -1
  313. package/docs/ko/benchmark/nextjs.md +1 -1
  314. package/docs/ko/benchmark/solid.md +1 -1
  315. package/docs/ko/benchmark/svelte.md +1 -1
  316. package/docs/ko/benchmark/tanstack.md +1 -1
  317. package/docs/ko/benchmark/vue.md +1 -1
  318. package/docs/ko/interest_of_intlayer.md +1 -1
  319. package/docs/nl/interest_of_intlayer.md +1 -1
  320. package/docs/pl/benchmark/nextjs.md +1 -1
  321. package/docs/pl/benchmark/solid.md +1 -1
  322. package/docs/pl/benchmark/svelte.md +1 -1
  323. package/docs/pl/benchmark/tanstack.md +1 -1
  324. package/docs/pl/benchmark/vue.md +1 -1
  325. package/docs/pl/interest_of_intlayer.md +1 -1
  326. package/docs/pt/benchmark/nextjs.md +1 -1
  327. package/docs/pt/benchmark/solid.md +1 -1
  328. package/docs/pt/benchmark/svelte.md +1 -1
  329. package/docs/pt/benchmark/tanstack.md +1 -1
  330. package/docs/pt/benchmark/vue.md +1 -1
  331. package/docs/pt/interest_of_intlayer.md +1 -1
  332. package/docs/ru/benchmark/nextjs.md +1 -1
  333. package/docs/ru/benchmark/solid.md +1 -1
  334. package/docs/ru/benchmark/svelte.md +1 -1
  335. package/docs/ru/benchmark/tanstack.md +1 -1
  336. package/docs/ru/benchmark/vue.md +1 -1
  337. package/docs/ru/interest_of_intlayer.md +1 -1
  338. package/docs/tr/benchmark/nextjs.md +1 -1
  339. package/docs/tr/benchmark/solid.md +1 -1
  340. package/docs/tr/benchmark/svelte.md +1 -1
  341. package/docs/tr/benchmark/tanstack.md +1 -1
  342. package/docs/tr/benchmark/vue.md +1 -1
  343. package/docs/tr/interest_of_intlayer.md +1 -1
  344. package/docs/uk/benchmark/nextjs.md +1 -1
  345. package/docs/uk/benchmark/solid.md +1 -1
  346. package/docs/uk/benchmark/svelte.md +1 -1
  347. package/docs/uk/benchmark/tanstack.md +1 -1
  348. package/docs/uk/benchmark/vue.md +1 -1
  349. package/docs/uk/interest_of_intlayer.md +1 -1
  350. package/docs/ur/interest_of_intlayer.md +1 -1
  351. package/docs/vi/benchmark/nextjs.md +1 -1
  352. package/docs/vi/benchmark/solid.md +1 -1
  353. package/docs/vi/benchmark/svelte.md +1 -1
  354. package/docs/vi/benchmark/tanstack.md +1 -1
  355. package/docs/vi/benchmark/vue.md +1 -1
  356. package/docs/vi/interest_of_intlayer.md +1 -1
  357. package/docs/zh/benchmark/nextjs.md +1 -1
  358. package/docs/zh/benchmark/solid.md +1 -1
  359. package/docs/zh/benchmark/svelte.md +1 -1
  360. package/docs/zh/benchmark/tanstack.md +1 -1
  361. package/docs/zh/benchmark/vue.md +1 -1
  362. package/docs/zh/interest_of_intlayer.md +1 -1
  363. package/docs/zh-TW/interest_of_intlayer.md +1 -1
  364. package/frequent_questions/ar/claude_code_token_consumption.md +152 -0
  365. package/frequent_questions/de/claude_code_token_consumption.md +152 -0
  366. package/frequent_questions/en/claude_code_token_consumption.md +152 -0
  367. package/frequent_questions/en-GB/claude_code_token_consumption.md +152 -0
  368. package/frequent_questions/es/claude_code_token_consumption.md +152 -0
  369. package/frequent_questions/fr/claude_code_token_consumption.md +152 -0
  370. package/frequent_questions/hi/claude_code_token_consumption.md +152 -0
  371. package/frequent_questions/id/claude_code_token_consumption.md +152 -0
  372. package/frequent_questions/it/claude_code_token_consumption.md +152 -0
  373. package/frequent_questions/ja/claude_code_token_consumption.md +152 -0
  374. package/frequent_questions/ko/claude_code_token_consumption.md +152 -0
  375. package/frequent_questions/pl/claude_code_token_consumption.md +152 -0
  376. package/frequent_questions/pt/claude_code_token_consumption.md +152 -0
  377. package/frequent_questions/ru/claude_code_token_consumption.md +152 -0
  378. package/frequent_questions/tr/claude_code_token_consumption.md +152 -0
  379. package/frequent_questions/uk/claude_code_token_consumption.md +152 -0
  380. package/frequent_questions/vi/claude_code_token_consumption.md +152 -0
  381. package/frequent_questions/zh/claude_code_token_consumption.md +152 -0
  382. package/package.json +6 -6
  383. package/src/generated/blog.entry.ts +160 -0
  384. package/src/generated/frequentQuestions.entry.ts +20 -0
@@ -0,0 +1,327 @@
1
+ ---
2
+ createdAt: 2026-09-13
3
+ updatedAt: 2026-09-13
4
+ title: "i18next vs @intlayer/i18next : Même API, Bundle Différent"
5
+ description: Ce qui change lorsqu'une application React ou Next.js conserve ses appels à i18next, react-i18next et next-i18next mais les exécute via les adaptateurs @intlayer/i18next. JavaScript par page, taille des composants, fuite de chaînes et hydratation mesurés sur le même code, ainsi que ce que les adaptateurs conservent, ignorent et ne peuvent pas remplacer.
6
+ keywords:
7
+ - i18next
8
+ - react-i18next
9
+ - next-i18next
10
+ - "@intlayer/i18next"
11
+ - "@intlayer/react-i18next"
12
+ - "@intlayer/next-i18next"
13
+ - Intlayer
14
+ - Adaptateur de compatibilité
15
+ - Migration
16
+ - Internationalisation
17
+ - i18n
18
+ - Benchmark
19
+ - Taille de bundle
20
+ - Blog
21
+ - Next.js
22
+ - React
23
+ slugs:
24
+ - blog
25
+ - i18next-vs-intlayer-i18next
26
+ author: aymericzip
27
+ ---
28
+
29
+ # i18next VS @intlayer/i18next | Même API, Bundle Différent
30
+
31
+ `@intlayer/i18next`, `@intlayer/react-i18next` et `@intlayer/next-i18next` sont des adaptateurs de compatibilité. Ils exposent l'API `i18next` que votre code utilise déjà (`useTranslation`, `t()`, `<Trans>`, `i18n.changeLanguage()`, `getFixedT`, `serverSideTranslations`...) et la distribuent à partir de dictionnaires compilés par Intlayer. Les composants ne changent pas. Le runtime sous-jacent, lui, change.
32
+
33
+ Cet article mesure ce remplacement sur la même application Next.js, construite une fois avec `next-i18next` et une fois avec `@intlayer/next-i18next`. Les chiffres proviennent de [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Pour comparer `i18next` et Intlayer en tant que bibliothèques distinctes, consultez [i18next vs Intlayer](https://intlayer.org/fr/blog/i18next-vs-intlayer). Celui-ci se concentre sur ce que l'adaptateur transforme lorsque vous conservez votre code tel quel.
34
+
35
+ <TOC/>
36
+
37
+ > **tl;dr** : Sur la même application Next.js, remplacer `next-i18next` par `@intlayer/next-i18next` fait passer le JavaScript par page de **218.5 Ko à 150.7 Ko** gzip (configuration naïve) et surpasse la configuration `next-i18next` entièrement optimisée (163.4 Ko) de **12.7 Ko**. Le composant moyen passe de **78.5 Ko à 9.7 Ko**, la fuite de chaînes vers d'autres pages passe de **~90% à 0%**, l'hydratation de **15.6 ms à 11.3 ms**, et le runtime de **19.7 Ko à 9.4 Ko**. Aucun composant n'a été modifié, un seul fichier de provider l'a été. Les plugins `i18next` (backends, détecteurs de langue) sont acceptés mais ne font rien : il n'y a plus rien à charger ni à détecter au runtime.
38
+
39
+ ## Ce qu'est `@intlayer/i18next`
40
+
41
+ `i18next` est un runtime. `i18n.init({ resources })` ou un plugin backend charge `locales/{lng}/{ns}.json` dans une instance globale ; `useTranslation("about")` y abonne le composant ; `t("title")` recherche la clé au moment du rendu. Les namespaces, le lazy loading, les listes de namespaces par page et la sécurité de typage sont entièrement à votre charge en matière de configuration et de maintenance.
42
+
43
+ Les adaptateurs conservent l'API et remplacent l'instance :
44
+
45
+ 1. **Alias d'importation.** `createNextI18nPlugin()` depuis `@intlayer/next-i18next/plugin` (ou `withI18next`) enveloppe `withIntlayer` et ajoute des alias Webpack / Turbopack pour que `next-i18next`, `react-i18next` et `i18next` renvoient vers leurs équivalents `@intlayer/*`. Sur Vite, `reactI18nextVitePlugin()` depuis `@intlayer/react-i18next/plugin` fait de même. Aucun import n'a besoin d'être renommé.
46
+ 2. **JSON comme source de vérité.** Le plugin `syncJSON` lit vos fichiers existants `locales/{lng}/{ns}.json` avec `format: "i18next"` (ainsi `{{name}}`, l'imbrication `$t()`, les suffixes `_one` / `_other` et de contexte sont correctement analysés) et réécrit les traductions lorsque le CLI ou le CMS les met à jour.
47
+ 3. **Liaison sur le site d'appel.** La passe d'optimisation d'Intlayer réécrit `useTranslation("about")` en un appel qui reçoit directement le dictionnaire `about`, dans la locale active. Le composant cesse d'interroger le store global.
48
+
49
+ ```tsx fileName="components/About.tsx"
50
+ // Votre code, inchangé
51
+ import { useTranslation } from "react-i18next";
52
+
53
+ const About = () => {
54
+ const { t } = useTranslation("about");
55
+ return <h1>{t("title")}</h1>;
56
+ };
57
+ ```
58
+
59
+ ```tsx fileName="Ce que le compilateur émet (simplifié)"
60
+ import _dicHash_about from "../.intlayer/dictionaries/about.mjs";
61
+ import { useDictionary as useTranslation } from "@intlayer/react-i18next";
62
+
63
+ const About = () => {
64
+ const { t } = useTranslation(_dicHash_about);
65
+ return <h1>{t("title")}</h1>;
66
+ };
67
+ ```
68
+
69
+ Cette réécriture est précisément ce qui fait basculer les colonnes de taille des composants et de fuite de page ci-dessous.
70
+
71
+ ## Ce que les adaptateurs conservent, ignorent et ne remplacent pas
72
+
73
+ | API `i18next` | Avec `@intlayer/*` |
74
+ | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
75
+ | `useTranslation("ns")`, `useTranslation("ns", { keyPrefix })` | ✅ Conservé. Lié au dictionnaire `ns` au moment du build ; clés typées selon votre contenu |
76
+ | `t("key", { name })`, `{{interpolation}}`, imbrication `$t(key)` | ✅ Conservé |
77
+ | Pluriels `key_one` / `key_other`, contexte `key_male`, `returnObjects` | ✅ Conservé. Pluriels évalués avec `Intl.PluralRules` |
78
+ | `<Trans>` avec `components`, balises numérotées `<1>...</1>`, `values` | ✅ Conservé |
79
+ | `withTranslation`, `Translation`, `I18nContext` | ✅ Conservé |
80
+ | `i18n.changeLanguage()`, `i18n.language`, `i18n.dir()`, `on("languageChanged")` | ✅ Conservé. `changeLanguage` pilote la locale d'Intlayer |
81
+ | `getFixedT(lng, ns, keyPrefix)`, `i18n.exists()`, `hasLoadedNamespace()` | ✅ Conservé |
82
+ | `i18n.use(Backend).use(LanguageDetector).init({...})` | ⚠️ `use()` appelle le `init` du plugin et s'arrête là ; les backends et détecteurs n'ont rien à charger ni à détecter |
83
+ | `init({ resources })`, `addResourceBundle()` | ⚠️ `resources` est **ignoré** avec un avertissement en dev ; supprimez les imports JSON pour obtenir les gains de bundle |
84
+ | `I18nextProvider i18n={i18n}` | ⚠️ Rend un `IntlayerProvider` ; la prop `i18n` est ignorée. Sur App Router, transmettez la locale (voir ci-dessous) |
85
+ | `serverSideTranslations(locale, ["common"])` (next-i18next) | ⚠️ Renvoie la structure attendue et ne charge rien. Inoffensif à garder, sûr à supprimer |
86
+ | `appWithTranslation(App)` (next-i18next) | ✅ Conservé |
87
+ | `next-i18next.config.js` | ⚠️ Non lu. Les locales proviennent de `intlayer.config.ts` |
88
+ | `useTranslation()` sans namespace spécifié | ✅ Fonctionne avec le dictionnaire global `translation` du fichier complet (`splitKeys: false`) |
89
+
90
+ ## Le benchmark
91
+
92
+ ### Ce qui a été mesuré
93
+
94
+ La suite [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) construit **la même application** avec chaque configuration : **10 pages** (accueil, à propos, blog, carrières, contact, FAQ, tarifs, produits, paramètres, équipe), **10 locales** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), des composants identiques et un contenu identique. Les pages sont mesurées en `en` et `fr`.
95
+
96
+ `next-i18next` a été testé avec quatre stratégies de chargement, depuis le JSON de chaque locale importé dans `resources` (`static`) jusqu'à un namespace par route, chargé paresseusement via un backend (`scoped-dynamic`). L'adaptateur a été construit sur **les mêmes composants que la configuration naïve**, avec uniquement `next.config.ts`, `intlayer.config.ts` et le fichier de provider modifiés. Il ne propose aucune variante "scopée" manuelle : le compilateur scope le contenu par composant.
97
+
98
+ Pour chaque build, la suite enregistre :
99
+
100
+ - **Taille de la lib** : taille gzip d'un composant vide qui n'importe que la bibliothèque i18n.
101
+ - **JS par page** : moyenne du JavaScript gzip téléchargé par page sur toutes les pages et locales.
102
+ - **% de fuite de locale** : part des chaînes traduites dans le JS téléchargé qui appartiennent à une locale que l'utilisateur **ne consulte pas**.
103
+ - **% de fuite de page** : part des chaînes traduites dans le JS téléchargé qui appartiennent à une page sur laquelle l'utilisateur **ne se trouve pas**.
104
+ - **Moyenne composant** : taille moyenne gzip de chaque composant compilé isolément.
105
+ - **Réactivité E2E** : temps réel mesuré entre le choix d'une nouvelle locale et la mise à jour de `html[lang]` dans le DOM (Playwright, 5 itérations).
106
+ - **Hydratation** : durée de la phase d'hydratation de React.
107
+
108
+ > Les chiffres ci-dessous proviennent de l'exécution du **12/09/2026** avec `next-i18next` 16.3.0 (`react-i18next` 17.0.13, `i18next` 26.4.2) et `@intlayer/next-i18next` 9.5.1. L'application de test est volontairement compacte (quelques dizaines de chaînes par locale), les pourcentages de fuite décrivent donc une **tendance** : ils croissent avec votre contenu tandis que le coût du runtime reste fixe.
109
+
110
+ ### Résultats sur Next.js
111
+
112
+ | Configuration | Stratégie | Taille lib (gz) | JS page moy (gz) | Fuite locale | Fuite page | Composant moy (gz) | Réactivité E2E | Hydratation |
113
+ | ---------------------------- | -------------- | --------------: | ---------------: | -----------: | ---------: | -----------------: | -------------: | ----------: |
114
+ | **base** (sans i18n) | - | 0.0 Ko | 141.0 Ko | 0.0% | 0.0% | 0.9 Ko | 13.4 ms | 11.8 ms |
115
+ | `next-i18next` | static | 19.7 Ko | 218.5 Ko | 0.0% | 89.8% | 78.5 Ko | 16.4 ms | 15.6 ms |
116
+ | `next-i18next` | dynamic | 19.7 Ko | 169.5 Ko | 50.0% | 89.8% | 26.1 Ko | 15.4 ms | 27.7 ms |
117
+ | `next-i18next` | scoped-static | 19.7 Ko | 220.1 Ko | 0.0% | 89.8% | 78.9 Ko | 16.4 ms | 14.7 ms |
118
+ | `next-i18next` | scoped-dynamic | 19.7 Ko | 163.4 Ko | 0.0% | 0.0% | 27.1 Ko | 15.9 ms | 15.1 ms |
119
+ | **`@intlayer/next-i18next`** | static | **9.4 Ko** | **150.7 Ko** | **0.0%** | **0.0%** | **9.7 Ko** | **10.7 ms** | **11.3 ms** |
120
+ | **`@intlayer/next-i18next`** | dynamic | **9.4 Ko** | **150.7 Ko** | **0.0%** | **0.0%** | **9.7 Ko** | **11.9 ms** | **10.6 ms** |
121
+ | `next-intlayer` (natif) | static | 5.5 Ko | 141.3 Ko | 0.0% | 0.0% | 8.5 Ko | 15.5 ms | 16.9 ms |
122
+ | `next-intlayer` (natif) | dynamic | 5.5 Ko | 141.3 Ko | 0.0% | 0.0% | 6.9 Ko | 15.3 ms | 15.9 ms |
123
+
124
+ **Comment l'interpréter**
125
+
126
+ - **68 Ko de moins par page par rapport à la configuration naïve.** `resources: { en, fr, ... }` expédie chaque locale et chaque namespace sur chaque page : **218.5 Ko**. Le build avec adaptateur pour les mêmes composants tombe à **150.7 Ko**. Il surpasse également la meilleure configuration de `next-i18next` (163.4 Ko, un namespace par route, chargé à la demande) de 12.7 Ko, car le runtime `i18next` pèse à lui seul 19.7 Ko contre 9.4 Ko.
127
+ - **La fuite passe à 0% sans toucher au moindre composant.** Chaque configuration de `next-i18next` sauf la version entièrement découpée expédie ~90% de chaînes d'autres pages. La ligne `dynamic` est plus pénalisante qu'il n'y paraît : elle n'élimine pas la fuite de page et introduit **50% de fuite de locale**, car le backend par locale rapatrie toujours l'intégralité du namespace `translation`. L'adaptateur atteint 0% / 0% directement sur le code d'origine.
128
+ - **Composants : 8x plus légers.** Un composant utilisant `useTranslation()` compilé isolément pèse en moyenne **78.5 Ko** avec `resources` inliné et **26-27 Ko** avec un backend, car `t` reste lié au store global. Avec l'adaptateur, il n'affiche plus que **9.7 Ko**.
129
+ - **Hydratation et basculement plus rapides.** L'hydratation passe de 15.6 ms à **11.3 ms** (et de 27.7 ms dans la configuration `dynamic`, où l'appel backend se situe sur le chemin critique). Le basculement de locale passe de 15-16 ms à **11-12 ms**.
130
+ - **L'adaptateur n'est pas le runtime natif.** `next-intlayer` atteint **141.3 Ko**, soit +0.3 Ko par rapport à l'application de base. L'adaptateur supporte la surface d'API de `i18next` (dialecte d'interpolation, résolution des pluriels et contextes, analyse des balises `<Trans>`) en surcouche du cœur d'Intlayer : 9.4 Ko et +9.4 Ko par page par rapport au natif. Il constitue une passerelle, non une fin en soi.
131
+
132
+ > L'adaptateur `react-i18next` sur Vite / TanStack Start n'a pas été inclus dans ce cycle de test. La référence pour `react-i18next` sur TanStack Start se trouve dans [i18next vs Intlayer](https://intlayer.org/fr/blog/i18next-vs-intlayer) : 127-184 Ko par page et 123-185 ms de temps de basculement de locale quand le backend est différé.
133
+
134
+ ## Pourquoi ces écarts de métriques
135
+
136
+ Rien n'a changé dans le dossier `components/` : les gains proviennent donc exclusivement de la cible à laquelle `useTranslation` est relié.
137
+
138
+ **Avec `i18next`**, la liaison s'établit avec l'instance globale. Tout ce qui y a été chargé (toutes les locales en `static`, l'ensemble du namespace de la locale active en `dynamic`) est accessible depuis chaque composant appelant `useTranslation()`. Le bundler ne peut pas découper plus finement que ce que l'instance retient, et le runtime ne peut pas anticiper les clés demandées au rendu.
139
+
140
+ ```bash
141
+ .
142
+ ├── next-i18next.config.js
143
+ ├── public/locales
144
+ │ ├── en/translation.json # toutes les chaînes de chaque page
145
+ │ └── fr/translation.json
146
+ ├── i18n/i18n.ts # i18n.use(initReactI18next).init({ resources })
147
+ └── components
148
+ ├── AppProviders.tsx # <I18nextProvider i18n={i18n}>
149
+ └── About.tsx # useTranslation(); t("about.title")
150
+ ```
151
+
152
+ **Avec `@intlayer/next-i18next`**, la liaison s'opère directement avec le dictionnaire. `syncJSON` convertit chaque fichier de namespace en dictionnaire ; la passe d'optimisation transmet au composant le dictionnaire correspondant sous forme d'un import que le bundler peut tracer et séparer par page et par locale.
153
+
154
+ ```bash
155
+ .
156
+ ├── intlayer.config.ts # syncJSON({ format: "i18next", source: ... })
157
+ ├── public/locales
158
+ │ ├── en/translation.json # inchangé, toujours source de vérité
159
+ │ └── fr/translation.json
160
+ ├── .intlayer/ # généré : un dictionnaire par namespace, par locale
161
+ └── components
162
+ ├── AppProviders.tsx # <IntlayerClientProvider locale={locale}>
163
+ └── About.tsx # useTranslation(); t("about.title") ← inchangé
164
+ ```
165
+
166
+ Le fichier `i18n/i18n.ts` et son import de `resources` deviennent du code mort. C'est là que résident les 68 Ko d'économie.
167
+
168
+ ## Migration en trois étapes
169
+
170
+ <Steps>
171
+ <Step number={1} title="Installation">
172
+
173
+ ```bash packageManager="npm"
174
+ npx intlayer init --interactive
175
+ ```
176
+
177
+ ```bash packageManager="pnpm"
178
+ pnpm dlx intlayer init --interactive
179
+ ```
180
+
181
+ ```bash packageManager="yarn"
182
+ yarn dlx intlayer init --interactive
183
+ ```
184
+
185
+ ```bash packageManager="bun"
186
+ bunx intlayer init --interactive
187
+ ```
188
+
189
+ La commande détecte `i18next` / `react-i18next` / `next-i18next`, installe `intlayer`, le package de framework (`next-intlayer` ou `react-intlayer`), l'adaptateur `@intlayer/*` correspondant ainsi que `@intlayer/sync-json-plugin`, et pré-remplit `intlayer.config.ts`. Laissez les packages d'origine installés : ils servent de peer dependencies et fournissent les définitions de types.
190
+
191
+ </Step>
192
+ <Step number={2} title="Pointer Intlayer vers vos fichiers de locales">
193
+
194
+ ```ts fileName="intlayer.config.ts"
195
+ import { Locales, type IntlayerConfig } from "intlayer";
196
+ import { syncJSON } from "@intlayer/sync-json-plugin";
197
+
198
+ const config: IntlayerConfig = {
199
+ internationalization: {
200
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
201
+ defaultLocale: Locales.ENGLISH,
202
+ },
203
+ dictionary: {
204
+ importMode: "dynamic",
205
+ format: "i18next",
206
+ },
207
+ plugins: [
208
+ syncJSON({
209
+ // dialecte i18next : {{name}}, $t(key), key_one / key_other, key_male
210
+ format: "i18next",
211
+ // Un fichier par namespace : `useTranslation("about")` → about.json
212
+ source: ({ locale, key }) => `./public/locales/${locale}/${key}.json`,
213
+ location: "public/locales",
214
+ }),
215
+ ],
216
+ };
217
+
218
+ export default config;
219
+ ```
220
+
221
+ Si vous disposez d'un unique fichier `translation.json` par locale (le namespace par défaut d'i18next), définissez `splitKeys: false` afin que le fichier complet reste un seul dictionnaire et qu'un appel simple à `useTranslation()` continue de fonctionner.
222
+
223
+ </Step>
224
+ <Step number={3} title="Ajouter le plugin">
225
+
226
+ <Tabs>
227
+ <Tab label="Next.js">
228
+
229
+ ```ts fileName="next.config.ts"
230
+ import type { NextConfig } from "next";
231
+ import { withI18next } from "@intlayer/next-i18next/plugin";
232
+
233
+ const nextConfig: NextConfig = {};
234
+
235
+ export default withI18next(nextConfig);
236
+ ```
237
+
238
+ Sur l'App Router, les composants clients obtiennent leur locale via le segment `[locale]`. L'`I18nextProvider` de l'adaptateur ne prenant aucune locale en paramètre, remplacez-le une seule fois dans votre fichier de provider :
239
+
240
+ ```tsx fileName="components/AppProviders.tsx"
241
+ "use client";
242
+
243
+ import { IntlayerClientProvider } from "next-intlayer";
244
+ import type { LocalesValues } from "intlayer";
245
+
246
+ export const AppProviders = ({
247
+ locale,
248
+ children,
249
+ }: {
250
+ locale: LocalesValues;
251
+ children: React.ReactNode;
252
+ }) => (
253
+ <IntlayerClientProvider locale={locale}>{children}</IntlayerClientProvider>
254
+ );
255
+ ```
256
+
257
+ Tous les composants enfants continuent d'appeler `useTranslation()` sans modification.
258
+
259
+ </Tab>
260
+ <Tab label="Vite / TanStack Start">
261
+
262
+ ```ts fileName="vite.config.ts"
263
+ import { defineConfig } from "vite";
264
+ import react from "@vitejs/plugin-react";
265
+ import { reactI18nextVitePlugin } from "@intlayer/react-i18next/plugin";
266
+
267
+ export default defineConfig({
268
+ plugins: [react(), reactI18nextVitePlugin()],
269
+ });
270
+ ```
271
+
272
+ `reactI18nextVitePlugin()` enveloppe `vite-intlayer` et crée les alias pour `react-i18next` et `i18next`. Pour un projet sans React, `i18nextVitePlugin()` depuis `@intlayer/i18next/plugin` crée l'alias pour `i18next` seul.
273
+
274
+ </Tab>
275
+ </Tabs>
276
+
277
+ </Step>
278
+ </Steps>
279
+
280
+ ### Ce que vous pouvez supprimer par la suite
281
+
282
+ | Fichier / modèle | Raison |
283
+ | ------------------------------------------------------ | ---------------------------------------------------------------------------------- |
284
+ | `resources: { en, fr, ... }` et les imports JSON | Ignorés par l'adaptateur. C'est ici que se trouvaient les 68 Ko |
285
+ | `i18next-http-backend`, `i18next-resources-to-backend` | Plus rien à récupérer au runtime |
286
+ | `i18next-browser-languagedetector` | La détection de locale dépend du routage d'Intlayer (préfixe URL, cookie, en-tête) |
287
+ | `serverSideTranslations()` dans `getStaticProps` | Renvoie une structure vide ; inoffensif, mais inutile |
288
+ | `next-i18next.config.js` | Non lu. Les locales sont déclarées dans `intlayer.config.ts` |
289
+ | Listes `ns: [...]` par page | Le compilateur sélectionne les namespaces par composant |
290
+
291
+ ### Ce que vous gagnez au-delà des octets
292
+
293
+ - **Clés typées.** `useTranslation("about")` est typé d'après le dictionnaire compilé `about` ; `t("does.not.exist")` déclenche une erreur TypeScript au lieu de renvoyer la chaîne de clé.
294
+ - **`npx intlayer test`** bloque la CI en cas de clé manquante dans n'importe quelle langue. **`npx intlayer fill`** traduit automatiquement les clés manquantes avec votre propre clé d'API (OpenAI, Anthropic, Mistral, Gemini...) et les réécrit dans `locales/{lng}/{ns}.json`.
295
+ - **Éditeur visuel et CMS** opèrent sur le même JSON, permettant aux équipes éditoriales de modifier le contenu via une interface pendant que les fichiers se mettent à jour.
296
+ - **Transition progressive vers `.content.ts`.** Chaque composant peut basculer indépendamment de `useTranslation("about")` à `useIntlayer("about")` avec un fichier de contenu dédié. Fichiers JSON et `.content.ts` coexistent naturellement.
297
+
298
+ ## Limites à connaître avant de démarrer
299
+
300
+ - **Backends et détecteurs sont inertes.** `i18n.use(HttpBackend)` exécute le `init` du plugin et rien de plus. Si votre application dépendait de traductions rapatriées depuis un CMS au moment de la requête, ce flux n'existe plus ; utilisez le CMS d'Intlayer ou les commandes `intlayer pull` / `push`.
301
+ - **`resources` est ignoré, non fusionné.** Contrairement à certains adaptateurs, `@intlayer/i18next` n'utilise pas `resources` inliné comme solution de repli. Chaque clé doit exister dans les dictionnaires synchronisés, ce que valide `intlayer test`.
302
+ - **L'App Router nécessite la retouche du provider.** Un seul fichier, présenté ci-dessus. Le Pages Router avec `appWithTranslation` ne nécessite aucun ajustement.
303
+ - **`next-i18next.config.js` n'est pas lu.** `localePath`, `fallbackLng`, `reloadOnPrerender` et équivalents n'ont pas d'effet direct ; les locales et le repli sont gérés dans `intlayer.config.ts`.
304
+ - **L'adaptateur a un coût résiduel.** 9.4 Ko de runtime et +9.4 Ko par page par rapport à `next-intlayer`. Lorsque tous vos composants seront passés à `useIntlayer`, retirez-le.
305
+
306
+ ## Quand choisir quelle solution ?
307
+
308
+ - **Restez sur `i18next`** si votre application nécessite impérativement des backends au runtime (traductions servies par un CMS à la volée), l'écosystème spécifique de plugins, ou une cible hors React non couverte par les adaptateurs.
309
+ - **Optez pour `@intlayer/*`** si vous utilisez `react-i18next` / `next-i18next` et souhaitez récupérer 68 Ko, obtenir des composants 8x plus légers, 0% de fuite, des clés typées et des contrôles en CI sans devoir tout réécrire. C'est le point d'entrée idéal pour une codebase `i18next` existante.
310
+ - **Passez au natif (`next-intlayer` / `react-intlayer`)** pour les nouveaux projets ou une fois l'adaptateur assimilé. C'est la formule la plus légère (5.5 Ko, +0.3 Ko par page) qui débloque les Server Components synchrones et les fichiers de contenu `.content.ts` par composant.
311
+
312
+ ## Comparatifs associés
313
+
314
+ - [i18next vs Intlayer](https://intlayer.org/fr/blog/i18next-vs-intlayer) (comparatif des bibliothèques, même benchmark)
315
+ - [next-intl vs @intlayer/next-intl](https://intlayer.org/fr/blog/next-intl-vs-intlayer-next-intl) (même série d'adaptateurs)
316
+ - [Lingui vs @intlayer/lingui](https://intlayer.org/fr/blog/lingui-vs-intlayer-lingui) (même série d'adaptateurs)
317
+ - [vue-i18n vs @intlayer/vue-i18n](https://intlayer.org/fr/blog/vue-i18n-vs-intlayer-vue-i18n) (même série d'adaptateurs)
318
+ - Guides de migration : [i18next](https://intlayer.org/fr/doc/migration/i18next), [react-i18next](https://intlayer.org/fr/doc/migration/react-i18next), [next-i18next](https://intlayer.org/fr/doc/migration/next-i18next)
319
+ - Références des adaptateurs : [i18next](https://intlayer.org/fr/doc/compatibility/i18next), [react-i18next](https://intlayer.org/fr/doc/compatibility/react-i18next), [next-i18next](https://intlayer.org/fr/doc/compatibility/next-i18next)
320
+
321
+ ## Conclusion
322
+
323
+ `i18next` constitue le runtime le plus lourd de ce benchmark, et les adaptateurs en retirent la majeure partie sans vous obliger à quitter son API. Sur la même application Next.js, cela représente **68 Ko de moins par page** par rapport à la configuration naïve, **12.7 Ko de moins** que la version la plus optimisée à la main, des **composants 8x plus légers**, **0% de fuite** et **4 ms d'hydratation**, le tout en échange d'un fichier de configuration, d'une ligne de plugin et d'un ajustement de provider. Les backends et détecteurs deviennent sans effet, `resources` est ignoré plutôt que fusionné, et le runtime natif `next-intlayer` conserve 9 Ko d'avance supplémentaire en légèreté.
324
+
325
+ L'ensemble des données brutes, des applications de test et des scripts est disponible dans le [dépôt Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Vous pouvez le reproduire vous-même.
326
+
327
+ Consultez le document [Pourquoi Intlayer ?](https://intlayer.org/fr/doc/why) pour en savoir plus.