@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, другой бандл"
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
+ - Размер бандла
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, другой бандл
30
+
31
+ `@intlayer/i18next`, `@intlayer/react-i18next` и `@intlayer/next-i18next` - это адаптеры совместимости. Они предоставляют API `i18next`, который уже использует ваш код (`useTranslation`, `t()`, `<Trans>`, `i18n.changeLanguage()`, `getFixedT`, `serverSideTranslations`...), и передают данные из словарей, скомпилированных Intlayer. Компоненты не меняются. Меняется среда выполнения (runtime) под ними.
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/ru/blog/i18next-vs-intlayer). Этот материал посвящен тому, что именно меняет адаптер, если вы оставляете свой код в исходном виде.
34
+
35
+ <TOC/>
36
+
37
+ > **tl;dr**: В одном и том же приложении Next.js замена `next-i18next` на `@intlayer/next-i18next` уменьшила объем JavaScript на страницу с **218.5 КБ до 150.7 КБ** gzip (базовая конфигурация) и превзошла полностью оптимизированную конфигурацию `next-i18next` (163.4 КБ) на **12.7 КБ**. Средний компонент уменьшился с **78.5 КБ до 9.7 КБ**, утечка строк других страниц упала с **~90% до 0%**, гидратация ускорилась с **15.6 мс до 11.3 мс**, а runtime сократился с **19.7 КБ до 9.4 КБ**. Ни один компонент не редактировался; изменился только файл провайдера. Плагины `i18next` (бэкенды, детекторы языка) принимаются, но ничего не делают: во время выполнения больше нечего загружать или определять.
38
+
39
+ ## Что такое `@intlayer/i18next`
40
+
41
+ `i18next` - это рантайм. Вызов `i18n.init({ resources })` или бэкенд-плагин загружает `locales/{lng}/{ns}.json` в глобальный экземпляр; вызов `useTranslation("about")` подписывает компонент на него; `t("title")` ищет ключ во время рендеринга. Пространства имен (namespaces), ленивая загрузка, списки пространств имен для каждой страницы и строгая типизация полностью остаются на вашей стороне для настройки и поддержки.
42
+
43
+ Адаптеры сохраняют API и заменяют глобальный экземпляр:
44
+
45
+ 1. **Алиасы импорта.** Функция `createNextI18nPlugin()` из `@intlayer/next-i18next/plugin` (или `withI18next`) оборачивает `withIntlayer` и добавляет алиасы Webpack / Turbopack, благодаря чему `next-i18next`, `react-i18next` и `i18next` разрешаются в соответствующие пакеты `@intlayer/*`. В Vite `reactI18nextVitePlugin()` из `@intlayer/react-i18next/plugin` выполняет ту же задачу. Ни один импорт не переименовывается.
46
+ 2. **JSON как единственный источник истины.** Плагин `syncJSON` считывает существующие файлы `locales/{lng}/{ns}.json` с параметром `format: "i18next"` (поэтому `{{name}}`, вложенность `$t()`, суффиксы `_one` / `_other` и контекстные суффиксы разбираются корректно) и записывает переводы обратно, когда CLI или CMS обновляют их.
47
+ 3. **Связывание на месте вызова.** Этап оптимизации Intlayer переписывает `useTranslation("about")` в вызов, который напрямую получает словарь `about` в активной локали. Компонент больше не обращается к глобальному хранилищу.
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
+ | API `i18next` | С `@intlayer/*` |
74
+ | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
75
+ | `useTranslation("ns")`, `useTranslation("ns", { keyPrefix })` | ✅ Сохранено. Привязывается к словарю `ns` во время сборки; ключи типизированы по вашему контенту |
76
+ | `t("key", { name })`, `{{interpolation}}`, вложенность `$t(key)` | ✅ Сохранено |
77
+ | Формы множественного числа `key_one` / `key_other`, контекст `key_male`, `returnObjects` | ✅ Сохранено. Множественные числа рассчитываются через `Intl.PluralRules` |
78
+ | `<Trans>` с `components`, нумерованными тегами `<1>...</1>`, `values` | ✅ Сохранено |
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` **игнорируется** с предупреждением в dev-режиме; удалите импорты JSON для снижения веса бандла |
84
+ | `I18nextProvider i18n={i18n}` | ⚠️ Рендерит `IntlayerProvider`; проп `i18n` игнорируется. В App Router передайте локаль (см. ниже) |
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 страниц** (главная, о нас, блог, карьера, контакты, FAQ, цены, продукты, настройки, команда), **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` и файле провайдера. У него нет ручного режима "scoped": компилятор изолирует контент для каждого компонента автоматически.
97
+
98
+ Для каждой сборки фиксируются показатели:
99
+
100
+ - **Размер библиотеки**: gzip-размер пустого компонента, который импортирует только библиотеку i18n.
101
+ - **JS на страницу**: средний объем gzip JavaScript, загружаемый на страницу по всем маршрутам и локалям.
102
+ - **% утечки локали**: доля строк в загруженном JS, относящаяся к языку, который пользователь в данный момент **не** просматривает.
103
+ - **% утечки страницы**: доля строк в загруженном JS, относящаяся к странице, на которой пользователь в данный момент **не** находится.
104
+ - **Средний вес компонента**: средний gzip-размер каждого изолированно скомпилированного компонента.
105
+ - **E2E-реактивность**: реальное время между выбором новой локали и обновлением атрибута `html[lang]` в DOM (Playwright, 5 итераций).
106
+ - **Гидратация**: продолжительность фазы гидратации React.
107
+
108
+ > Приведенные ниже цифры получены в прогоне от **12.09.2026** с версиями `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
+ | Конфигурация | Стратегия | Размер либы (gz) | JS стр сред (gz) | Утечка локали | Утечка стр | Комп сред (gz) | E2E-реактивность | Гидратация |
113
+ | ---------------------------- | -------------- | ---------------: | ---------------: | ------------: | ---------: | -------------: | ---------------: | ----------: |
114
+ | **base** (без i18n) | - | 0.0 КБ | 141.0 КБ | 0.0% | 0.0% | 0.9 КБ | 13.4 мс | 11.8 мс |
115
+ | `next-i18next` | static | 19.7 КБ | 218.5 КБ | 0.0% | 89.8% | 78.5 КБ | 16.4 мс | 15.6 мс |
116
+ | `next-i18next` | dynamic | 19.7 КБ | 169.5 КБ | 50.0% | 89.8% | 26.1 КБ | 15.4 мс | 27.7 мс |
117
+ | `next-i18next` | scoped-static | 19.7 КБ | 220.1 КБ | 0.0% | 89.8% | 78.9 КБ | 16.4 мс | 14.7 мс |
118
+ | `next-i18next` | scoped-dynamic | 19.7 КБ | 163.4 КБ | 0.0% | 0.0% | 27.1 КБ | 15.9 мс | 15.1 мс |
119
+ | **`@intlayer/next-i18next`** | static | **9.4 КБ** | **150.7 КБ** | **0.0%** | **0.0%** | **9.7 КБ** | **10.7 мс** | **11.3 мс** |
120
+ | **`@intlayer/next-i18next`** | dynamic | **9.4 КБ** | **150.7 КБ** | **0.0%** | **0.0%** | **9.7 КБ** | **11.9 мс** | **10.6 мс** |
121
+ | `next-intlayer` (native) | static | 5.5 КБ | 141.3 КБ | 0.0% | 0.0% | 8.5 КБ | 15.5 мс | 16.9 мс |
122
+ | `next-intlayer` (native) | dynamic | 5.5 КБ | 141.3 КБ | 0.0% | 0.0% | 6.9 КБ | 15.3 мс | 15.9 мс |
123
+
124
+ **Как читать эти данные**
125
+
126
+ - **На 68 КБ меньше на страницу по сравнению с базовым подходом.** Подход `resources: { en, fr, ... }` отправляет каждую локаль и каждое пространство имен на каждую страницу: **218.5 КБ**. Сборка с адаптером для тех же компонентов составляет **150.7 КБ**. Она также обходит лучшую конфигурацию `next-i18next` (163.4 КБ, одно пространство имен на маршрут с ленивой загрузкой) на 12.7 КБ, поскольку только рантайм `i18next` весит 19.7 КБ против 9.4 КБ.
127
+ - **Утечка снижается до 0% без правки компонентов.** Любая конфигурация `next-i18next`, кроме полностью изолированной вручную, отправляет ~90% строк посторонних страниц. Строка `dynamic` на практике проигрывает: она не устраняет утечку страниц и добавляет **50% утечки локалей**, так как бэкенд для локали вытягивает всё пространство имен `translation`. Адаптер обеспечивает 0% / 0% сразу на исходном коде.
128
+ - **Компоненты легче в 8 раз.** Компонент с `useTranslation()`, скомпилированный изолированно, весит в среднем **78.5 КБ** с инлайновыми `resources` и **26-27 КБ** с бэкендом, так как `t` жестко связан с глобальным хранилищем. С адаптером его вес падает до **9.7 КБ**.
129
+ - **Быстрее гидратация и переключение локали.** Гидратация ускоряется с 15.6 мс до **11.3 мс** (и с 27.7 мс в конфигурации `dynamic`, где запрос бэкенда блокирует критический путь). Переключение языка ускоряется с 15-16 мс до **11-12 мс**.
130
+ - **Адаптер не равен нативному рантайму.** `next-intlayer` весит **141.3 КБ**, всего на +0.3 КБ больше базового приложения без i18n. Адаптер несет поверх ядра Intlayer всю поверхность API `i18next` (синтаксис интерполяции, суффиксы чисел и контекста, разбор тегов `<Trans>`): 9.4 КБ и +9.4 КБ на страницу относительно нативного решения. Это промежуточный мост, а не конечная точка.
131
+
132
+ > Адаптер `react-i18next` на Vite / TanStack Start не входил в этот тестовый прогон. Базовые замеры для `react-i18next` на TanStack Start можно найти в статье [i18next vs Intlayer](https://intlayer.org/ru/blog/i18next-vs-intlayer): 127-184 КБ на страницу и 123-185 мс задержки переключения языка при отложенном бэкенде.
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` превращает каждый файл пространства имен в словарь; оптимизатор передает компоненту только запрошенный словарь в виде импорта, который сборщик может отследить и разделить по страницам и локалям.
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 КБ.
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` на локаль (дефолтный namespace в 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
+ В App Router клиентские компоненты получают локаль из сегмента `[locale]`. Адаптер `I18nextProvider` не принимает проп локали, поэтому замените его единожды в файле провайдера:
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 плагин `i18nextVitePlugin()` из `@intlayer/i18next/plugin` алиасит только `i18next`.
273
+
274
+ </Tab>
275
+ </Tabs>
276
+
277
+ </Step>
278
+ </Steps>
279
+
280
+ ### Что можно удалить после перехода
281
+
282
+ | Файл / шаблон | Причина |
283
+ | ------------------------------------------------------ | ----------------------------------------------------------------------------------- |
284
+ | `resources: { en, fr, ... }` и импорты JSON | Игнорируются адаптером. Именно здесь крылись 68 КБ |
285
+ | `i18next-http-backend`, `i18next-resources-to-backend` | В рантайме больше нечего запрашивать по сети |
286
+ | `i18next-browser-languagedetector` | Определение языка выполняет маршрутизация Intlayer (префикс URL, cookie, заголовок) |
287
+ | `serverSideTranslations()` в `getStaticProps` | Возвращает пустую структуру; безвредно, но не нужно |
288
+ | `next-i18next.config.js` | Не считывается. Локали настраиваются в `intlayer.config.ts` |
289
+ | Списки `ns: [...]` для каждой страницы | Компилятор связывает пространства имен с каждым компонентом автоматически |
290
+
291
+ ### Что вы получаете помимо байтов
292
+
293
+ - **Типизированные ключи.** `useTranslation("about")` типизируется по скомпилированному словарю `about`; опечатка вроде `t("does.not.exist")` вызывает ошибку TypeScript, а не возврат строки ключа.
294
+ - **`npx intlayer test`** прерывает CI при отсутствии перевода в любой локали. **`npx intlayer fill`** переводит недостающие ключи через ваш API-ключ (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)` просто вызывает `init` плагина. Если ваше приложение рассчитывало на подгрузку переводов из CMS при каждом запросе, эта схема больше не работает; используйте CMS Intlayer или команды `intlayer pull` / `push`.
301
+ - **`resources` игнорируется, а не объединяется.** В отличие от некоторых адаптеров, `@intlayer/i18next` не использует инлайновые `resources` как запасной вариант. Каждый ключ обязан существовать в синхронизированных словарях, что проверяется командой `intlayer test`.
302
+ - **App Router требует правки провайдера.** Всего один файл, показанный выше. Pages Router с `appWithTranslation` не требует никаких правок.
303
+ - **`next-i18next.config.js` игнорируется.** Настройки `localePath`, `fallbackLng`, `reloadOnPrerender` и аналогичные не действуют; локали и запасные варианты берутся из `intlayer.config.ts`.
304
+ - **Адаптер не бесплатный.** 9.4 КБ в рантайме и +9.4 КБ на страницу относительно `next-intlayer`. Когда все компоненты мигрируют на `useIntlayer`, адаптер можно отключить.
305
+
306
+ ## Когда что выбирать?
307
+
308
+ - **Оставайтесь на `i18next`**, если приложение жестко зависит от сетевых бэкендов в рантайме (раздача переводов из CMS по запросу), экосистемы сторонних плагинов или окружения вне React, которое адаптеры не поддерживают.
309
+ - **Используйте `@intlayer/*`**, если вы работаете с `react-i18next` / `next-i18next` и хотите выиграть 68 КБ, сделать компоненты в 8 раз легче, устранить утечки (0%), получить типизацию ключей и проверки в CI без переписывания кодовой базы. Это лучший путь модернизации существующего проекта на `i18next`.
310
+ - **Переходите на нативный `next-intlayer` / `react-intlayer`** для новых проектов или после завершения этапа адаптера. Это самое быстрое и легкое решение (5.5 КБ, +0.3 КБ на страницу), открывающее синхронные серверные компоненты и изолированные файлы контента `.content.ts`.
311
+
312
+ ## Связанные сравнения
313
+
314
+ - [i18next vs Intlayer](https://intlayer.org/ru/blog/i18next-vs-intlayer) (сравнение библиотек, тот же бенчмарк)
315
+ - [next-intl vs @intlayer/next-intl](https://intlayer.org/ru/blog/next-intl-vs-intlayer-next-intl) (та же серия адаптеров)
316
+ - [Lingui vs @intlayer/lingui](https://intlayer.org/ru/blog/lingui-vs-intlayer-lingui) (та же серия адаптеров)
317
+ - [vue-i18n vs @intlayer/vue-i18n](https://intlayer.org/ru/blog/vue-i18n-vs-intlayer-vue-i18n) (та же серия адаптеров)
318
+ - Руководства по миграции: [i18next](https://intlayer.org/ru/doc/migration/i18next), [react-i18next](https://intlayer.org/ru/doc/migration/react-i18next), [next-i18next](https://intlayer.org/ru/doc/migration/next-i18next)
319
+ - Документация адаптеров: [i18next](https://intlayer.org/ru/doc/compatibility/i18next), [react-i18next](https://intlayer.org/ru/doc/compatibility/react-i18next), [next-i18next](https://intlayer.org/ru/doc/compatibility/next-i18next)
320
+
321
+ ## Заключение
322
+
323
+ `i18next` оказался самым тяжелым рантаймом в этом бенчмарке, а адаптеры снимают подавляющую часть его нагрузки, сохраняя привычный API. На одном и том же приложении Next.js это дает **на 68 КБ меньше на страницу** по сравнению с наивной настройкой, **на 12.7 КБ меньше**, чем в самой оптимизированной ручной сборке, **в 8 раз более компактные компоненты**, **0% утечек** и **на 4 мс более быструю гидратацию** ценой одного конфига, одной строки плагина и замены провайдера. Бэкенды и детекторы становятся неактивными, `resources` игнорируется, а нативный `next-intlayer` остается еще на 9 КБ легче.
324
+
325
+ Все сырые данные, тестовые приложения и скрипты опубликованы в [репозитории Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom).
326
+
327
+ Подробности смотрите в документе [Почему Intlayer?](https://intlayer.org/ru/doc/why).