@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:相同的 API,截然不同的 Bundle"
5
+ description: 当 React 或 Next.js 应用保持其 i18next、react-i18next 和 next-i18next 调用不变,但改由 @intlayer/i18next 适配器提供服务时会发生什么变化。基于同一套代码测量的每页 JavaScript 体积、组件大小、文本泄漏与水合性能,以及适配器保留、忽略和无法替代的功能。
6
+ keywords:
7
+ - i18next
8
+ - react-i18next
9
+ - next-i18next
10
+ - "@intlayer/i18next"
11
+ - "@intlayer/react-i18next"
12
+ - "@intlayer/next-i18next"
13
+ - Intlayer
14
+ - 兼容适配器
15
+ - 迁移
16
+ - 国际化
17
+ - i18n
18
+ - 基准测试
19
+ - Bundle 大小
20
+ - 博客
21
+ - Next.js
22
+ - React
23
+ slugs:
24
+ - blog
25
+ - i18next-vs-intlayer-i18next
26
+ author: aymericzip
27
+ ---
28
+
29
+ # i18next VS @intlayer/i18next | 相同的 API,截然不同的 Bundle
30
+
31
+ `@intlayer/i18next`、`@intlayer/react-i18next` 和 `@intlayer/next-i18next` 是兼容适配器。它们暴露了你的代码已经在使用的 `i18next` API(`useTranslation`、`t()`、`<Trans>`、`i18n.changeLanguage()`、`getFixedT`、`serverSideTranslations` 等),并通过 Intlayer 编译好的字典来提供数据。组件不需要做任何更改,只是其底层的运行时发生了改变。
32
+
33
+ 本文在同一个 Next.js 应用程序上对比了这种替换:一次使用 `next-i18next` 构建,另一次使用 `@intlayer/next-i18next` 构建。测试数据来源于 [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom)。如需对比作为独立库的 `i18next` 与 Intlayer,请阅读 [i18next vs Intlayer](https://intlayer.org/zh/blog/i18next-vs-intlayer)。本文则专注于:当你保持原有代码不变时,适配器带来了哪些实际变化。
34
+
35
+ <TOC/>
36
+
37
+ > **核心摘要 (tl;dr)**:在同一个 Next.js 应用中,将 `next-i18next` 替换为 `@intlayer/next-i18next` 后,每页传输的 gzip JavaScript 体积从 **218.5 KB 降至 150.7 KB**(朴素初始配置),甚至比深度手动优化的 `next-i18next` 配置(163.4 KB)还要小 **12.7 KB**。组件平均大小从 **78.5 KB 骤降至 9.7 KB**,跨页无关文本泄漏从 **~90% 归零至 0%**,水合时间从 **15.6 ms 缩短至 11.3 ms**,运行时体积从 **19.7 KB 降至 9.4 KB**。无需修改任何组件代码,只需替换一个 Provider 文件。`i18next` 插件(后端加载器、语言检测器)被允许传入但不会执行任何逻辑:因为运行时已经没有任何多余内容需要加载或检测。
38
+
39
+ ## 什么是 `@intlayer/i18next`
40
+
41
+ `i18next` 是一个重运行时架构。`i18n.init({ resources })` 或后端插件将 `locales/{lng}/{ns}.json` 加载到全局单例中;`useTranslation("about")` 让组件订阅该单例;`t("title")` 在渲染时按键查找文本。命名空间拆分、按需懒加载、页面级命名空间列表以及类型安全,全部需要开发者手动配置与维护。
42
+
43
+ 适配器完整保留了 API,但彻底替换了底层的全局单例模式:
44
+
45
+ 1. **导入路径别名化。** `@intlayer/next-i18next/plugin` 中的 `createNextI18nPlugin()`(或 `withI18next`)包装了 `withIntlayer`,并注入 Webpack / Turbopack 别名,使 `next-i18next`、`react-i18next` 和 `i18next` 自动解析到对应的 `@intlayer/*` 模块。在 Vite 上,`@intlayer/react-i18next/plugin` 中的 `reactI18nextVitePlugin()` 执行相同的重定向。无需重命名代码中的任何 import 语句。
46
+ 2. **JSON 作为唯一真实数据源。** `syncJSON` 插件以 `format: "i18next"` 读取你现有的 `locales/{lng}/{ns}.json` 文件(确保 `{{name}}`、`$t()` 嵌套、`_one` / `_other` 与上下文后缀被正确解析),并在 CLI 或 CMS 更改文本时将翻译同步写回文件。
47
+ 3. **调用点精准绑定。** Intlayer 的编译优化通道会将 `useTranslation("about")` 重写为一个直接接收当前语言环境对应 `about` 字典的调用。组件彻底摆脱了对全局 Store 的依赖。
48
+
49
+ ```tsx fileName="components/About.tsx"
50
+ // 你的业务代码,原封不动
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="编译器生成的代码(概念简化展示)"
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
+ 正是这种编译时重写,使得组件体积与页面级文本泄漏数据在下文中展现出飞跃性的改善。
70
+
71
+ ## 适配器保留、忽略与无法替代的特性清单
72
+
73
+ | `i18next` API | 搭配 `@intlayer/*` 时的状态 |
74
+ | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
75
+ | `useTranslation("ns")`, `useTranslation("ns", { keyPrefix })` | ✅ 完整保留。构建期自动绑定到 `ns` 字典;键名根据实际内容提供精准 TypeScript 类型推导 |
76
+ | `t("key", { name })`, `{{interpolation}}`, `$t(key)` 嵌套 | ✅ 完整保留 |
77
+ | `key_one` / `key_other` 复数形式、`key_male` 上下文、`returnObjects` | ✅ 完整保留。复数规则通过原生 `Intl.PluralRules` 运算 |
78
+ | 带有 `components`、`<1>...</1>` 编号标签和 `values` 的 `<Trans>` | ✅ 完整保留 |
79
+ | `withTranslation`, `Translation`, `I18nContext` | ✅ 完整保留 |
80
+ | `i18n.changeLanguage()`, `i18n.language`, `i18n.dir()`, `on("languageChanged")` | ✅ 完整保留。`changeLanguage` 直接驱动 Intlayer 的语言切换 |
81
+ | `getFixedT(lng, ns, keyPrefix)`, `i18n.exists()`, `hasLoadedNamespace()` | ✅ 完整保留 |
82
+ | `i18n.use(Backend).use(LanguageDetector).init({...})` | ⚠️ `use()` 调用插件的 `init` 后直接返回;后端与检测器无多余内容需要加载或检测 |
83
+ | `init({ resources })`, `addResourceBundle()` | ⚠️ `resources` 参数会被**直接忽略**并在开发环境输出警告;需移除 JSON 硬编码导入以获得 Bundle 缩减红利 |
84
+ | `I18nextProvider i18n={i18n}` | ⚠️ 内部渲染 `IntlayerProvider`;`i18n` 属性被忽略。在 App Router 中直接传递 locale(详见下文) |
85
+ | `serverSideTranslations(locale, ["common"])` (next-i18next) | ⚠️ 返回预期的对象结构但无需额外加载。保留无害,删除亦可 |
86
+ | `appWithTranslation(App)` (next-i18next) | ✅ 完整保留 |
87
+ | `next-i18next.config.js` | ⚠️ 不会被读取。所有语言环境配置统一收敛至 `intlayer.config.ts` |
88
+ | 不传命名空间的裸 `useTranslation()` 调用 | ✅ 自动绑定到全量 `translation` 字典(`splitKeys: false`) |
89
+
90
+ ## 基准性能测试
91
+
92
+ ### 测试环境与度量标准
93
+
94
+ [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) 测试套件在每种方案下构建了**完全相同的应用**:包含 **10 个页面**(首页、关于、博客、招聘、联系、常见问题、定价、产品、设置、团队),涵盖 **10 种语言**(`en`、`fr`、`es`、`de`、`it`、`pt`、`zh`、`ja`、`ko`、`ru`),组件与内容保持绝对一致。指标在 `en` 与 `fr` 页面上进行基准采集。
95
+
96
+ `next-i18next` 测试了四种加载策略:从全语言 JSON 静态打包进 `resources`(`static`),到按路由拆分命名空间并通过后端动态懒加载(`scoped-dynamic`)。适配器则运行在**与朴素初学者方案完全一致的组件代码**上,仅更新了 `next.config.ts`、`intlayer.config.ts` 和 Provider 包装。无需任何人工的 "scoped" 繁琐配置:编译器天然支持组件级作用域隔离。
97
+
98
+ 每个构建版本记录的关键指标如下:
99
+
100
+ - **Lib 大小**:仅引入 i18n 基础库的空白组件的 gzip 大小。
101
+ - **每页 JS 均值**:跨所有页面和语言环境下,页面实际下载的 gzip JavaScript 平均体积。
102
+ - **语言包泄漏率 (Locale leak %)**:下载的 JS 中,属于用户**未选择浏览**的其它语言字符串所占的比例。
103
+ - **跨页文本泄漏率 (Page leak %)**:下载的 JS 中,属于用户**当前未访问**的其它页面文本所占的比例。
104
+ - **组件平均体积**:独立打包各组件时的平均 gzip 体积。
105
+ - **E2E 交互响应耗时**:从选择新语言到 DOM 中 `html[lang]` 完成更新的实际耗时(Playwright 测量,5 次循环平均)。
106
+ - **水合时间 (Hydration)**:React 客户端水合完成所耗费的毫秒数。
107
+
108
+ > 以下数据来源于 **2026-09-12** 的测试基准,采用 `next-i18next` 16.3.0(`react-i18next` 17.0.13, `i18next` 26.4.2)与 `@intlayer/next-i18next` 9.5.1。测试应用体积适中,因此泄漏比例揭示的是一种**宏观规律**:随着项目业务文本膨胀,泄漏的数据量会成倍增长,而运行时的固定开销则基本恒定。
109
+
110
+ ### Next.js 平台对比数据
111
+
112
+ | 方案 | 加载策略 | Lib 体积 (gz) | 每页 JS 均值 (gz) | 语言泄漏率 | 跨页泄漏率 | 组件均值 (gz) | E2E 响应耗时 | 水合耗时 |
113
+ | ---------------------------- | -------------- | ------------: | ----------------: | ---------: | ---------: | ------------: | -----------: | ----------: |
114
+ | **base** (无 i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
115
+ | `next-i18next` | static | 19.7 KB | 218.5 KB | 0.0% | 89.8% | 78.5 KB | 16.4 ms | 15.6 ms |
116
+ | `next-i18next` | dynamic | 19.7 KB | 169.5 KB | 50.0% | 89.8% | 26.1 KB | 15.4 ms | 27.7 ms |
117
+ | `next-i18next` | scoped-static | 19.7 KB | 220.1 KB | 0.0% | 89.8% | 78.9 KB | 16.4 ms | 14.7 ms |
118
+ | `next-i18next` | scoped-dynamic | 19.7 KB | 163.4 KB | 0.0% | 0.0% | 27.1 KB | 15.9 ms | 15.1 ms |
119
+ | **`@intlayer/next-i18next`** | static | **9.4 KB** | **150.7 KB** | **0.0%** | **0.0%** | **9.7 KB** | **10.7 ms** | **11.3 ms** |
120
+ | **`@intlayer/next-i18next`** | dynamic | **9.4 KB** | **150.7 KB** | **0.0%** | **0.0%** | **9.7 KB** | **11.9 ms** | **10.6 ms** |
121
+ | `next-intlayer` (原生) | static | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 8.5 KB | 15.5 ms | 16.9 ms |
122
+ | `next-intlayer` (原生) | dynamic | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 6.9 KB | 15.3 ms | 15.9 ms |
123
+
124
+ **深度数据解读**
125
+
126
+ - **相比朴素配置,每页立省 68 KB。** 在朴素配置中,`resources: { en, fr, ... }` 将所有语言和所有命名空间捆绑到每个页面,体积高达 **218.5 KB**。而在相同业务代码下接入适配器后,体积直接降至 **150.7 KB**。它甚至击败了 `next-i18next` 经过繁琐深度优化的最佳方案(163.4 KB)达 12.7 KB,因为仅 `i18next` 运行时本身就占据了 19.7 KB,而适配器仅占 9.4 KB。
127
+ - **无需改动业务组件,直接实现 0% 泄漏。** 除深度人工切分的方案外,`next-i18next` 普遍包含 ~90% 的无关页面文本。而 `dynamic` 策略的问题更为严峻:不仅没有解决跨页文本泄漏,还因为语言级后端默认拉取整个 `translation` 命名空间而引入了 **50% 的未选中语言泄漏**。适配器方案直接让老代码达成 0% / 0% 的极致纯净度。
128
+ - **组件体积缩小至 1/8。** 隔离打包时,传统的 `useTranslation()` 组件由于 `t` 强绑定于全局 Store,内联 `resources` 时平均重达 **78.5 KB**,即便挂载后端也有 **26-27 KB**。而通过适配器重定向后,平均仅为 **9.7 KB**。
129
+ - **更迅捷的水合与语言切换。** 水合耗时从 15.6 ms 降至 **11.3 ms**(对比 `dynamic` 方案中后端请求阻塞关键渲染路径导致的 27.7 ms 提升尤为显著)。语言实时切换耗时也从 15-16 ms 缩减至 **11-12 ms**。
130
+ - **适配器不等于原生极致架构。** 原生的 `next-intlayer` 仅有 **141.3 KB**,仅比无任何国际化逻辑的基础应用多了 0.3 KB。适配器为了维持 `i18next` API 的兼容性(插值语法、复数与上下文后缀解析、`<Trans>` 标签树解析),在 Intlayer 核心之上保留了一层 9.4 KB 的兼容垫片。它是迈向现代化的无缝桥梁,而非终点。
131
+
132
+ > 本次评测暂未包含 Vite / TanStack Start 上的 `react-i18next` 适配器。有关 TanStack Start 的基准表现可参考 [i18next vs Intlayer](https://intlayer.org/zh/blog/i18next-vs-intlayer):每页 127-184 KB,后端异步加载下的语言切换延迟约为 123-185 ms。
133
+
134
+ ## 性能巨幅提升的底层机理
135
+
136
+ 业务 `components/` 目录没有改动一行代码,所有性能收益完全归结于 `useTranslation` 到底绑定在什么载体上。
137
+
138
+ **在 `i18next` 中**,组件必须挂载到全局实例上。凡是预加载进该实例的内容(`static` 下的全部语种,或 `dynamic` 下当前语种的全部字典),都能被任何一个调用 `useTranslation()` 的组件直接访问。打包工具无法对实例内部的数据进行细粒度拆分,运行时也无法预知组件渲染时会访问哪些键名。
139
+
140
+ ```bash
141
+ .
142
+ ├── next-i18next.config.js
143
+ ├── public/locales
144
+ │ ├── en/translation.json # 塞满所有页面的庞大文本
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
+ **在 `@intlayer/next-i18next` 中**,组件直接与精简字典绑定。`syncJSON` 将每个命名空间文件解析并独立封装为字典;编译优化通道将组件精准重定向为对其声明字典的直接导入,这让打包工具能够像处理普通 JS 模块一样,按照页面和语言维度进行 Tree-shaking 与按需代码分割。
153
+
154
+ ```bash
155
+ .
156
+ ├── intlayer.config.ts # syncJSON({ format: "i18next", source: ... })
157
+ ├── public/locales
158
+ │ ├── en/translation.json # 维持原样,继续作为团队真实数据源
159
+ │ └── fr/translation.json
160
+ ├── .intlayer/ # 编译生成:按命名空间、按语言分割的独立字典
161
+ └── components
162
+ ├── AppProviders.tsx # <IntlayerClientProvider locale={locale}>
163
+ └── About.tsx # useTranslation(); t("about.title") ← 源码零修改
164
+ ```
165
+
166
+ 原有的 `i18n/i18n.ts` 及其引用的 `resources` 导入瞬间变为死代码,被打包器彻底剔除。这就是 68 KB 缩减的根源。
167
+
168
+ ## 三步极速迁移指南
169
+
170
+ <Steps>
171
+ <Step number={1} title="安装与初始化">
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
+ 该命令会自动检测项目中的 `i18next` / `react-i18next` / `next-i18next`,安装 `intlayer`、对应的框架包(`next-intlayer` 或 `react-intlayer`)、匹配的 `@intlayer/*` 适配器及 `@intlayer/sync-json-plugin`,并初始化 `intlayer.config.ts`。请保留原有依赖的安装状态:它们作为对等依赖(peer dependencies)并提供类型定义。
190
+
191
+ </Step>
192
+ <Step number={2} title="配置语言包文件源">
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
+ // i18next 方言:支持 {{name}}, $t(key), key_one / key_other, key_male
210
+ format: "i18next",
211
+ // 每个命名空间对应独立文件:`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
+ 如果每个语言仅有一个大而全的 `translation.json`(i18next 的默认命名空间),请配置 `splitKeys: false`,使得整个文件作为单一字典维系,无参数的裸 `useTranslation()` 即可正常工作。
222
+
223
+ </Step>
224
+ <Step number={3} title="挂载构建插件">
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
+ 在 Next.js App Router 下,客户端组件从 `[locale]` 动态路由段捕获当前语言。适配器的 `I18nextProvider` 不再接收手动传入的语言实例,只需在全局 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
+ 其下层的所有业务组件继续原汁原味地调用 `useTranslation()` 即可。
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()` 内部集成 `vite-intlayer` 并自动完成对 `react-i18next` 与 `i18next` 的无缝拦截重定向。若是非 React 项目,直接使用 `@intlayer/i18next/plugin` 的 `i18nextVitePlugin()` 即可。
273
+
274
+ </Tab>
275
+ </Tabs>
276
+
277
+ </Step>
278
+ </Steps>
279
+
280
+ ### 迁移完成后可安全删除的文件与逻辑
281
+
282
+ | 文件 / 代码模式 | 删除原因 |
283
+ | ------------------------------------------------------ | ------------------------------------------------------------------ |
284
+ | `resources: { en, fr, ... }` 与庞大的 JSON import | 适配器会忽略该注入;这正是 68 KB 冗余体积的来源 |
285
+ | `i18next-http-backend`, `i18next-resources-to-backend` | 运行时再无发起网络请求拉取翻译的必要 |
286
+ | `i18next-browser-languagedetector` | 语言探测已全面委托给 Intlayer 路由规则(URL 前缀、Cookie、Header) |
287
+ | `getStaticProps` 中的 `serverSideTranslations()` | 仅返回空结构占位;保留无害,但实属多余代码 |
288
+ | `next-i18next.config.js` | 不再被读取。所有国际化规范已由 `intlayer.config.ts` 集中管理 |
289
+ | 各页面繁琐的 `ns: [...]` 声明列表 | 编译器会根据组件上下文自动确定所依赖的命名空间 |
290
+
291
+ ### 字节瘦身之外的工程收益
292
+
293
+ - **严格的类型推导。** `useTranslation("about")` 会自动基于编译后的 `about` 字典进行类型检查;拼错的键名如 `t("does.not.exist")` 会直接触发 TypeScript 编译报错,而不再是默默返回错误字符串。
294
+ - **CI 自动化门禁。** 运行 **`npx intlayer test`** 可在持续集成流水线中针对任意语言缺失的键直接报错阻断。通过 **`npx intlayer fill`** 可配置自有模型密钥(OpenAI、Anthropic、Mistral、Gemini 等)自动补齐遗漏翻译并写回 `locales/{lng}/{ns}.json`。
295
+ - **可视化编辑器与专属 CMS。** 直接与同一个 JSON 底层同步,业务翻译人员可在可视化 UI 中直观编辑,保存即自动提交至 Git。
296
+ - **渐进式演进至 `.content.ts`。** 各组件可随时单独由 `useTranslation("about")` 平滑转变为搭配同级内容文件的 `useIntlayer("about")`。JSON 与 `.content.ts` 字典能够完美混用。
297
+
298
+ ## 启动迁移前必须明确的技术边界
299
+
300
+ - **运行时后端与动态探测器将不再生效。** `i18n.use(HttpBackend)` 仅会执行插件基础初始化,并不会在页面访问时动态拉取外部翻译接口。如果原应用依赖于请求发生时由 CMS 动态返回翻译,建议切换至 Intlayer 官方 CMS 或使用 `intlayer pull` / `push` 指令。
301
+ - **`resources` 参数被忽略而非智能合并。** 与部分轻度包装器不同,`@intlayer/i18next` 不会将内联的 `resources` 作为降级兜底方案。每一个键都必须真实存在于同步好的本地字典中(可通过 `intlayer test` 校验)。
302
+ - **App Router 需要且仅需要修改一次 Provider。** 即上述所示的一处微调。若采用 Pages Router 搭配 `appWithTranslation`,则连这处都不需要修改。
303
+ - **`next-i18next.config.js` 会被彻底跳过。** 原有的 `localePath`、`fallbackLng`、`reloadOnPrerender` 等选项不再生效;所有相关逻辑统一迁移至 `intlayer.config.ts`。
304
+ - **适配器自身具备少量固定体积。** 包含 9.4 KB 的运行时以及相比原生 `next-intlayer` 每页多出 9.4 KB。当项目所有组件都逐步平移至原生的 `useIntlayer` 后,即可直接卸载适配器。
305
+
306
+ ## 选型决策指南
307
+
308
+ - **继续坚守 `i18next` 原生方案**:如果你的系统高度依赖运行时接口后端(即每次请求必须动态拉取 CMS 最新内容)、强依赖特定三方插件生态,或者属于适配器尚未覆盖的非 React 运行时环境。
309
+ - **全面接入 `@intlayer/*` 兼容适配器**:如果你正在使用 `react-i18next` / `next-i18next`,希望在零业务代码重写的条件下立刻获得 68 KB 减重、8 倍更小的轻量组件、0% 文本泄漏、类型安全保障和 CI 自动化。这是既有 `i18next` 项目的最佳渐进式改造路径。
310
+ - **拥抱原生纯血架构 (`next-intlayer` / `react-intlayer`)**:适合全新启动的项目,或者已经通过适配器平稳完成过渡的团队。它拥有无与伦比的超轻量表现(5.5 KB,每页仅增加 0.3 KB),并彻底解锁同步 Server Components 与组件级 `.content.ts` 同构体验。
311
+
312
+ ## 相关对比与进阶文档
313
+
314
+ - [i18next vs Intlayer](https://intlayer.org/zh/blog/i18next-vs-intlayer)(库级别深度全方位基准测试)
315
+ - [next-intl vs @intlayer/next-intl](https://intlayer.org/zh/blog/next-intl-vs-intlayer-next-intl)(同系列适配器测评)
316
+ - [Lingui vs @intlayer/lingui](https://intlayer.org/zh/blog/lingui-vs-intlayer-lingui)(同系列适配器测评)
317
+ - [vue-i18n vs @intlayer/vue-i18n](https://intlayer.org/zh/blog/vue-i18n-vs-intlayer-vue-i18n)(同系列适配器测评)
318
+ - 迁移指引:[i18next](https://intlayer.org/zh/doc/migration/i18next), [react-i18next](https://intlayer.org/zh/doc/migration/react-i18next), [next-i18next](https://intlayer.org/zh/doc/migration/next-i18next)
319
+ - 适配器技术规范:[i18next](https://intlayer.org/zh/doc/compatibility/i18next), [react-i18next](https://intlayer.org/zh/doc/compatibility/react-i18next), [next-i18next](https://intlayer.org/zh/doc/compatibility/next-i18next)
320
+
321
+ ## 总结
322
+
323
+ `i18next` 是本次基准评测中最为笨重的运行时,而 `@intlayer` 适配器在不需要重构业务 API 的前提下剥离了绝大部分冗余负载。在同一个 Next.js 应用程序上,只需一个配置文件、一行构建插件和一处 Provider 微调,即可换来**每页节省 68 KB**、超越手写最高极限优化达 **12.7 KB**、**组件体积缩小 8 倍**、**无用文本泄漏归零**以及**水合耗时提速 4 ms** 的综合收益。
324
+
325
+ 所有未经加工的原始测试数据、可运行的示例工程与度量脚本均已在 [Benchmark Bloom 官方仓库](https://github.com/intlayer-org/benchmark-bloom) 开源。
326
+
327
+ 更多设计理念,请查阅 [为什么选择 Intlayer?](https://intlayer.org/zh/doc/why)。