@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,445 @@
1
+ ---
2
+ createdAt: 2026-09-13
3
+ updatedAt: 2026-09-13
4
+ title: "i18next проти Intlayer: бенчмарк та детальне порівняння 2026"
5
+ description: "Порівняння react-i18next та next-i18next з Intlayer на Next.js та TanStack Start. Розмір bundle, витік контенту, швидкість перемикання мови та досвід розробника."
6
+ keywords:
7
+ - i18next
8
+ - react-i18next
9
+ - next-i18next
10
+ - Intlayer
11
+ - Інтернаціоналізація
12
+ - i18n
13
+ - Бенчмарк
14
+ - Розмір bundle
15
+ - Блог
16
+ - Next.js
17
+ - TanStack Start
18
+ - JavaScript
19
+ - React
20
+ slugs:
21
+ - blog
22
+ - i18next-vs-intlayer
23
+ author: aymericzip
24
+ ---
25
+
26
+ # i18next проти Intlayer | Бенчмарк інтернаціоналізації (i18n) для React та Next.js
27
+
28
+ `i18next` - найпопулярніший фреймворк інтернаціоналізації (i18n) в екосистемі JavaScript. Через `react-i18next` та `next-i18next` він використовується у величезній кількості додатків React та Next.js. Intlayer - це сучасна альтернатива на основі компілятора з ізольованою областю видимості для кожного компонента.
29
+
30
+ У цій статті порівнюються дві бібліотеки на основі реальних вимірювань, а не просто переліку функцій. Усі показники отримані з [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) - відкритого набору тестів, який збирає однаковий додаток з кожною бібліотекою та фіксує те, що браузер реально завантажує по мережі.
31
+
32
+ <TOC/>
33
+
34
+ > **Короткий підсумок (tl;dr)**: `i18next` виявився найважчим runtime у тесті: він додає **+77 KB gzip на сторінку** у Next.js при базовій конфігурації, і **+22 KB** навіть після повної оптимізації просторів імен та лінивого завантаження (lazy-loading). Intlayer додає лише **+0.3 KB**. Усі конфігурації `i18next`, крім повністю ізольованої (scoped), передають **близько 90% рядків з інших сторінок**; Intlayer за замовчуванням передає **0%**. Перемикання мови з бекендом лінивого завантаження тривало **123-185 ms** з `react-i18next` проти **3-4 ms** з Intlayer. Адаптер сумісності `@intlayer/next-i18next` зберігає API `i18next` і зменшив розмір сторінки з **218.5 KB** до **150.7 KB**.
35
+
36
+ ## Коротко про головне
37
+
38
+ - **i18next / react-i18next / next-i18next** - Зрілий, багатий на плагіни, незалежний від фреймворку інструмент. Підтримує простори імен, детектори мови, бекенди, ICU через плагіни та компонент `<Trans>` для розміченого контенту. Переклади зберігаються централізовано у `locales/{lng}/{ns}.json`. Дуже потужний, але кожна оптимізація (розділення просторів імен, завантаження для конкретної сторінки, типобезпека) потребує ручного налаштування та постійної підтримки.
39
+ - **Intlayer** - Модель контенту, орієнтована на компоненти. Словники `.content.ts` розташовані безпосередньо поруч із компонентом, який вони обслуговують; компілятор під час збірки виконує tree-shaking та ліниве завантаження окремо для кожного компонента й мови, суворі типи TypeScript генеруються автоматично з вмісту, а відсутні переклади спричиняють помилку збірки. Включає middleware, утиліти для SEO, візуальний редактор / CMS та переклад за допомогою штучного інтелекту.
40
+
41
+ | Бібліотека | Зірки на GitHub | Всього комітів | Останній коміт | Перша версія | Версія NPM | Завантаження NPM за місяць |
42
+ | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
43
+ | `aymericzip/intlayer` | [![GitHub Repo stars](https://img.shields.io/github/stars/aymericzip/intlayer?style=for-the-badge&label=%E2%AD%90%20stars)](https://github.com/aymericzip/intlayer/stargazers) | [![GitHub commit activity](https://img.shields.io/github/commit-activity/t/aymericzip/intlayer?style=for-the-badge&label=commits)](https://github.com/aymericzip/intlayer/commits) | [![Last Commit](https://img.shields.io/github/last-commit/aymericzip/intlayer?style=for-the-badge)](https://github.com/aymericzip/intlayer/commits) | Квітень 2024 | [![npm](https://img.shields.io/npm/v/intlayer?style=for-the-badge)](https://www.npmjs.com/package/intlayer) | [![npm downloads](https://img.shields.io/npm/dm/intlayer?style=for-the-badge)](https://www.npmjs.com/package/intlayer) |
44
+ | `i18next/i18next` | [![GitHub Repo stars](https://img.shields.io/github/stars/i18next/i18next?style=for-the-badge&label=%E2%AD%90%20stars)](https://github.com/i18next/i18next/stargazers) | [![GitHub commit activity](https://img.shields.io/github/commit-activity/t/i18next/i18next?style=for-the-badge&label=commits)](https://github.com/i18next/i18next/commits) | [![Last Commit](https://img.shields.io/github/last-commit/i18next/i18next?style=for-the-badge)](https://github.com/i18next/i18next/commits) | Січень 2012 | [![npm](https://img.shields.io/npm/v/i18next?style=for-the-badge)](https://www.npmjs.com/package/i18next) | [![npm downloads](https://img.shields.io/npm/dm/i18next?style=for-the-badge)](https://www.npmjs.com/package/i18next) |
45
+ | `i18next/react-i18next` | [![GitHub Repo stars](https://img.shields.io/github/stars/i18next/react-i18next?style=for-the-badge&label=%E2%AD%90%20stars)](https://github.com/i18next/react-i18next/stargazers) | [![GitHub commit activity](https://img.shields.io/github/commit-activity/t/i18next/react-i18next?style=for-the-badge&label=commits)](https://github.com/i18next/react-i18next/commits) | [![Last Commit](https://img.shields.io/github/last-commit/i18next/react-i18next?style=for-the-badge)](https://github.com/i18next/react-i18next/commits) | Грудень 2015 | [![npm](https://img.shields.io/npm/v/react-i18next?style=for-the-badge)](https://www.npmjs.com/package/react-i18next) | [![npm downloads](https://img.shields.io/npm/dm/react-i18next?style=for-the-badge)](https://www.npmjs.com/package/react-i18next) |
46
+ | `i18next/next-i18next` | [![GitHub Repo stars](https://img.shields.io/github/stars/i18next/next-i18next?style=for-the-badge&label=%E2%AD%90%20stars)](https://github.com/i18next/next-i18next/stargazers) | [![GitHub commit activity](https://img.shields.io/github/commit-activity/t/i18next/next-i18next?style=for-the-badge&label=commits)](https://github.com/i18next/next-i18next/commits) | [![Last Commit](https://img.shields.io/github/last-commit/i18next/next-i18next?style=for-the-badge)](https://github.com/i18next/next-i18next/commits) | Листопад 2018 | [![npm](https://img.shields.io/npm/v/next-i18next?style=for-the-badge)](https://www.npmjs.com/package/next-i18next) | [![npm downloads](https://img.shields.io/npm/dm/next-i18next?style=for-the-badge)](https://www.npmjs.com/package/next-i18next) |
47
+
48
+ > Значки оновлюються автоматично. Показники з часом змінюються.
49
+
50
+ ## Порівняння функціональності
51
+
52
+ | Можливість | Intlayer (`react-intlayer` / `next-intlayer`) | i18next (`react-i18next` / `next-i18next`) |
53
+ | ------------------------------------------------ | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
54
+ | **Переклади поруч із компонентами** | ✅ Так, `.content.ts` розміщується поруч із кожним компонентом | ❌ Ні, централізовано у `locales/{lng}/{ns}.json` |
55
+ | **Інтеграція з TypeScript** | ✅ Суворі типи створюються автоматично на основі вмісту | ⚠️ Базова; суворі ключі вимагають розширення `CustomTypeOptions` |
56
+ | **Виявлення пропущених перекладів** | ✅ Помилка TypeScript + помилка/попередження під час збірки | ⚠️ Заглушка в runtime (`saveMissing`, повернення самого ключа) |
57
+ | **Розмічений контент (JSX / Markdown)** | ✅ Пряма нативна підтримка | ⚠️ Через `<Trans>` з індексованими маркерами |
58
+ | **Підтримка ICU** | ⚠️ В процесі розробки | ⚠️ Через плагін (`i18next-icu`) |
59
+ | **Множина (Pluralization)** | ✅ Чіткі шаблони на основі переліків (Enum) | ✅ Суфікси `_one` / `_other` (Intl.PluralRules) |
60
+ | **Форматування (дати, числа, валюти)** | ✅ `useNumber`, `useDate`, ... (вбудований Intl) | ⚠️ Форматери інтерполяції або ручний виклик `Intl.*` |
61
+ | **Локалізована маршрутизація та middleware** | ✅ Вбудований проксі/middleware, `getMultilingualUrls` | ⚠️ Не входить у ядро; потрібні сторонні рішення або власний код |
62
+ | **SEO-помічники (hreflang, sitemap, robots)** | ✅ Вбудовані інструменти | ❌ Ручне налаштування |
63
+ | **Синхронні серверні компоненти (RSC)** | ✅ `useIntlayer` з `next-intlayer/server` працює у будь-якому серверному компоненті | ⚠️ `getFixedT` на рівні сторінки та передача `t` через Props |
64
+ | **Tree-shaking (лише потрібний вміст)** | ✅ Для кожного компонента та мови автоматично компілятором | ⚠️ Вручну: простори імен + список `ns` на сторінку + бекенд |
65
+ | **Ліниве завантаження (Lazy loading)** | ✅ `importMode: 'dynamic'` (один рядок конфігурації) | ✅ Через плагіни бекенда (`i18next-resources-to-backend` тощо) |
66
+ | **Очищення невикористаного вмісту (Purge)** | ✅ Невикористані словники відсікаються під час збірки | ❌ Немає вбудованої підтримки |
67
+ | **Тестування відсутніх рядків (CLI / CI)** | ✅ `npx intlayer content test` | ⚠️ `i18next-parser` або сторонні утиліти |
68
+ | **Переклад за допомогою ШІ** | ✅ Вбудований, використовує ваші власні API-ключі | ❌ Немає (Locize є окремим платним сервісом) |
69
+ | **Візуальний редактор / CMS** | ✅ Безкоштовний візуальний редактор + опціональна CMS | ❌ Немає (Locize або зовнішні платформи) |
70
+ | **Сервер MCP та навички агентів (Agent Skills)** | ✅ Підтримується | ❌ Не підтримується |
71
+ | **Екосистема та спільнота** | ⚠️ Новіша, але стрімко розвивається | ✅ Найбільша та найбільш перевірена часом |
72
+
73
+ ## Тестування продуктивності (Benchmark)
74
+
75
+ ### Що вимірювалося
76
+
77
+ Пакет тестів [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) збирає **один і той самий додаток** з кожною бібліотекою: **10 сторінок** (головна, про нас, блог, кар'єра, контакти, FAQ, ціни, продукти, налаштування, команда), **10 мов** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), однакові компоненти та ідентичний вміст. Сторінки тестувалися англійською (`en`) та французькою (`fr`) мовами. Кожна бібліотека перевірялася у чотирьох **стратегіях завантаження**:
78
+
79
+ | Стратегія | Опис | Типовий сценарій використання |
80
+ | ------------------ | -------------------------------------------------------------------------------------- | ------------------------------------------- |
81
+ | **static** | Усі мови та сторінки запаковані разом (`resources` вбудовані прямо в `init()`) | Швидкі прототипи, код, згенерований ШІ |
82
+ | **dynamic** | Тільки активна мова завантажується через бекенд, але всі простори імен одночасно | Більшість звичайних проєктів |
83
+ | **scoped-static** | Один простір імен на маршрут, усе запаковано заздалегідь | Рідкісні конфігурації |
84
+ | **scoped-dynamic** | Простір імен на маршрут + ліниве завантаження. Тільки поточна сторінка та поточна мова | Проєкти із жорстким бюджетом продуктивності |
85
+
86
+ Intlayer не потребує окремого варіанту "scoped": компілятор автоматично ізолює контент **на рівні кожного компонента**, тому його конфігурації `static` та `dynamic` уже максимально оптимізовані.
87
+
88
+ Для кожної збірки фіксувалися такі показники:
89
+
90
+ - **Lib size**: gzip-розмір порожнього компонента, який імпортує лише бібліотеку i18n (постійна вага runtime).
91
+ - **Page JS**: середній обсяг JavaScript gzip, що завантажується на сторінку (усереднений по всіх сторінках і мовах).
92
+ - **Locale leak %**: частка перекладених рядків у завантаженому JS, що належать мові, яку користувач **не** переглядає.
93
+ - **Page leak %**: частка перекладених рядків у завантаженому JS, що належать сторінці, на якій користувач **не** перебуває.
94
+ - **Component avg**: середній gzip-розмір кожного компонента, скомпільованого окремо.
95
+ - **E2E reactivity**: реальний час від вибору нової мови до оновлення `html[lang]` у DOM (Playwright, середнє за 5 ітерацій).
96
+ - **Hydration**: тривалість етапу гідратації React.
97
+
98
+ > Подані нижче дані отримані під час тестування від **2026-09-12** з версіями `next-i18next` 16.3.0, `react-i18next` 17.0.13 та `intlayer` 9.5.1. Тестовий додаток навмисно компактний, тому відсотки витоку показують **закономірність**: витоки зростають разом із контентом, тоді як накладні витрати runtime залишаються фіксованими.
99
+
100
+ ### Результати на Next.js (`next-i18next`)
101
+
102
+ | Бібліотека | Стратегія | Вага Lib (gz) | Сер. JS сторінки (gz) | Витік мов | Витік сторінок | Сер. вага комп. (gz) | Реактивність E2E | Час гідратації |
103
+ | ---------------------------------- | -------------- | ------------: | --------------------: | --------: | -------------: | -------------------: | ---------------: | -------------: |
104
+ | **base** (без i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
105
+ | `next-i18next` | static | 19.7 KB | 218.5 KB | 0.0% | 89.8% | 78.5 KB | 16.4 ms | 15.6 ms |
106
+ | `next-i18next` | dynamic | 19.7 KB | 169.5 KB | 50.0% | 89.8% | 26.1 KB | 15.4 ms | 27.7 ms |
107
+ | `next-i18next` | scoped-static | 19.7 KB | 220.1 KB | 0.0% | 89.8% | 78.9 KB | 16.4 ms | 14.7 ms |
108
+ | `next-i18next` | scoped-dynamic | 19.7 KB | 163.4 KB | 0.0% | 0.0% | 27.1 KB | 15.9 ms | 15.1 ms |
109
+ | **`next-intlayer`** | static | **5.5 KB** | **141.3 KB** | **0.0%** | **0.0%** | **8.5 KB** | **15.5 ms** | 16.9 ms |
110
+ | **`next-intlayer`** | dynamic | **5.5 KB** | **141.3 KB** | **0.0%** | **0.0%** | **6.9 KB** | **15.3 ms** | 15.9 ms |
111
+ | `@intlayer/next-i18next` (адаптер) | static | 9.4 KB | 150.7 KB | 0.0% | 0.0% | 9.7 KB | 10.7 ms | 11.3 ms |
112
+ | `@intlayer/next-i18next` (адаптер) | dynamic | 9.4 KB | 150.7 KB | 0.0% | 0.0% | 9.7 KB | 11.9 ms | 10.6 ms |
113
+
114
+ **Аналіз результатів**
115
+
116
+ - **Вага середовища виконання**: ядро `i18next` разом із `react-i18next` є найважчим runtime у тесті: **19.7 KB gzip** для порожнього компонента, порівняно з 5.5 KB у `next-intlayer`.
117
+ - **Базова конфігурація дуже громіздка**: вбудовування `resources` в `init()` створює **218.5 KB на сторінку** (+77.5 KB до базового додатку). Кожна сторінка завантажує абсолютно всі простори імен.
118
+ - **Оптимізація вручну потребує зусиль**: перехід на бекенд (`dynamic`) заощаджує 49 KB, але **все одно пропускає 90% рядків інших сторінок**, а половина завантаженого тексту належить іншій мові. Лише поділ на простори імен по маршрутах (`scoped-dynamic`) позбавляє витоків при вазі **163.4 KB**, що однаково на **+22.4 KB на сторінку більше**, ніж у Intlayer (141.3 KB), який не потребує ручного налаштування.
119
+ - **Розмір компонентів**: компонент із викликом `useTranslation()` компілюється у 26-79 KB; той самий компонент з `useIntlayer()` важить усього 6.9 KB.
120
+ - **Гідратація уповільнюється**: час гідратації зростає до 27.7 ms у конфігурації `dynamic`, оскільки екземпляр i18next має ініціалізуватися й отримати дані з бекенда на клієнті до того, як React завершить гідратацію.
121
+
122
+ ### Результати на TanStack Start (`react-i18next`)
123
+
124
+ Той самий додаток на TanStack Start із чистим `react-i18next` для виключення специфіки Next.js:
125
+
126
+ | Бібліотека | Стратегія | Вага Lib (gz) | Сер. JS сторінки (gz) | Витік мов | Витік сторінок | Сер. вага комп. (gz) | Реактивність E2E | Час гідратації |
127
+ | ------------------- | -------------- | ------------: | --------------------: | --------: | -------------: | -------------------: | ---------------: | -------------: |
128
+ | **base** (без i18n) | - | 0.0 KB | 111.0 KB | 0.0% | 0.0% | 0.7 KB | 8.1 ms | 21.6 ms |
129
+ | `react-i18next` | static | 18.4 KB | 180.3 KB | 50.0% | 89.8% | 24.3 KB | 12.9 ms | 85.1 ms |
130
+ | `react-i18next` | dynamic | 18.4 KB | 136.4 KB | 23.1% | 89.8% | 24.8 KB | 123.1 ms | 32.9 ms |
131
+ | `react-i18next` | scoped-static | 18.4 KB | 184.2 KB | 50.7% | 89.8% | 25.3 KB | 185.1 ms | 25.2 ms |
132
+ | `react-i18next` | scoped-dynamic | 18.4 KB | 127.2 KB | 0.0% | 0.0% | 26.7 KB | 17.6 ms | 11.3 ms |
133
+ | **`intlayer`** | static | **5.0 KB** | **125.8 KB** | 50.0% | **0.0%** | **8.1 KB** | **3.2 ms** | 11.5 ms |
134
+ | **`intlayer`** | dynamic | **5.0 KB** | **118.6 KB** | **0.0%** | **0.0%** | **6.3 KB** | **3.6 ms** | 14.1 ms |
135
+
136
+ **Аналіз результатів**
137
+
138
+ - Простий додаток `react-i18next` завантажує на **+69 KB на сторінку більше**, ніж додаток без i18n, а гідратація триває **85 ms** (вчетверо довше), оскільки все дерево ресурсів обробляється та реєструється на клієнті перед першим рендером.
139
+ - **Затримка лінивого завантаження при зміні мови**: при завантаженні за вимогою перемикання мови вимагає мережевого запиту до оновлення `html[lang]`: **123 ms** у `dynamic` та **185 ms** у `scoped-static`. Intlayer оновлює DOM за **3-4 ms** в обох режимах: перемикання відбувається миттєво і не залежить від мережі.
140
+ - Складна ручна оптимізація `scoped-dynamic` дозволяє дійти до 127.2 KB, що все одно на **+8.6 KB важче** за Intlayer у режимі `dynamic`, вимагаючи при цьому маппінгу маршрутів та меж Suspense.
141
+ - Режим `static` у Intlayer за замовчуванням має **0% витоку сторінок**, оскільки до бандла потрапляють лише словники, задіяні компонентами поточної сторінки. А увімкнення `importMode: 'dynamic'` повністю ліквідує витік мов.
142
+ - **Розмір компонентів**: 24-27 KB у `react-i18next` проти 6-8 KB в Intlayer. `useTranslation()` завжди прив'язує кожен компонент до глобального екземпляра i18next.
143
+
144
+ ## Звідки така різниця? Глобальний екземпляр проти скомпільованих словників
145
+
146
+ `i18next` створювався у 2012 році як середовище виконання: єдиний глобальний об'єкт містить базу ресурсів, плагіни доповнюють його, а функція `t()` шукає ключі під час рендерингу. Це забезпечує високу гнучкість, але призводить до відчутного навантаження:
147
+
148
+ ```bash
149
+ .
150
+ ├── i18n.ts # createInstance().use(...).use(...).init({...})
151
+ └── src
152
+ ├── locales
153
+ │ ├── en
154
+ │ │ ├── common.json
155
+ │ │ ├── home.json
156
+ │ │ └── about.json
157
+ │ └── fr
158
+ │ ├── common.json
159
+ │ ├── home.json
160
+ │ └── about.json
161
+ ├── components
162
+ │ └── Counter.tsx # useTranslation("about") + t("counter.label")
163
+ └── app
164
+ └── [locale]
165
+ └── about
166
+ └── page.tsx # повинна знати, що потрібні ["common", "about"]
167
+ ```
168
+
169
+ Глобальний екземпляр не знає заздалегідь, які ключі знадобляться конкретному компоненту; він завантажує весь переданий простір імен. Оптимізація вимагає, щоб **ви** розбивали каталоги, **ви** вказували простори імен для кожної сторінки та **ви** стежили за актуальністю цього списку при змінах. Як зазначається у [звіті бенчмарку](https://github.com/intlayer-org/benchmark-bloom/blob/main/report/NOTE.md): "Підтримувати типобезпеку і точно знати, який простір імен додати на кожну сторінку - це справжній кошмар".
170
+
171
+ Intlayer повністю позбувається глобального екземпляра. Контент оголошується безпосередньо поруч із компонентом, а компілятор розв'язує дерево залежностей під час збірки:
172
+
173
+ ```bash
174
+ .
175
+ ├── intlayer.config.ts
176
+ └── src
177
+ ├── components
178
+ │ └── Counter
179
+ │ ├── index.tsx # useIntlayer("counter")
180
+ │ └── index.content.ts
181
+ └── app
182
+ └── [locale]
183
+ └── about
184
+ ├── page.tsx
185
+ └── page.content.ts
186
+ ```
187
+
188
+ `@intlayer/swc` / `@intlayer/babel` визначає, який компонент використовує який словник, упаковує лише їх і лише для активної мови, а невикористаний контент видаляє. Патерн "scoped-dynamic" стає автоматичним підсумком збірки, а не складним регламентом розробки.
189
+
190
+ > Щоб отримати показники рядка `dynamic`, вкажіть `dictionary.importMode: 'dynamic'` у файлі `intlayer.config.ts`. Детальніше дивіться у [документації з оптимізації bundle](https://intlayer.org/uk/doc/concept/bundle-optimization).
191
+
192
+ ## Досвід розробника (DX)
193
+
194
+ ### Налаштування конфігурації
195
+
196
+ **next-i18next (App Router)**
197
+
198
+ ```ts fileName="src/app/i18n/server.ts"
199
+ import { createInstance } from "i18next";
200
+ import { initReactI18next } from "react-i18next/initReactI18next";
201
+ import resourcesToBackend from "i18next-resources-to-backend";
202
+ import { defaultLocale } from "@/i18n.config";
203
+
204
+ const backend = resourcesToBackend(
205
+ (locale: string, namespace: string) =>
206
+ import(`../../locales/${locale}/${namespace}.json`)
207
+ );
208
+
209
+ export const initI18next = async (
210
+ locale: string,
211
+ namespaces: string[] = ["common"]
212
+ ) => {
213
+ const i18n = createInstance();
214
+ await i18n
215
+ .use(initReactI18next)
216
+ .use(backend)
217
+ .init({
218
+ lng: locale,
219
+ fallbackLng: defaultLocale,
220
+ ns: namespaces,
221
+ defaultNS: "common",
222
+ interpolation: { escapeValue: false },
223
+ react: { useSuspense: false },
224
+ });
225
+ return i18n;
226
+ };
227
+ ```
228
+
229
+ Додатково потрібно налаштувати клієнтський `I18nProvider`, `generateStaticParams` та вручну вказувати масив `namespaces` на кожній сторінці.
230
+
231
+ **Intlayer**
232
+
233
+ ```ts fileName="intlayer.config.ts"
234
+ import { type IntlayerConfig, Locales } from "intlayer";
235
+
236
+ const config: IntlayerConfig = {
237
+ internationalization: {
238
+ locales: [Locales.ENGLISH, Locales.FRENCH],
239
+ defaultLocale: Locales.ENGLISH,
240
+ },
241
+ };
242
+
243
+ export default config;
244
+ ```
245
+
246
+ ```tsx fileName="src/app/[locale]/layout.tsx"
247
+ import { getHTMLTextDir } from "intlayer";
248
+ import { IntlayerClientProvider, type NextLayoutIntlayer } from "next-intlayer";
249
+
250
+ const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
251
+ const { locale } = await params;
252
+
253
+ return (
254
+ <html lang={locale} dir={getHTMLTextDir(locale)}>
255
+ <body>
256
+ <IntlayerClientProvider locale={locale}>
257
+ {children}
258
+ </IntlayerClientProvider>
259
+ </body>
260
+ </html>
261
+ );
262
+ };
263
+
264
+ export default LocaleLayout;
265
+ ```
266
+
267
+ ### Клієнтський компонент
268
+
269
+ **react-i18next**
270
+
271
+ ```json fileName="src/locales/en/about.json"
272
+ {
273
+ "counter": {
274
+ "label": "Counter",
275
+ "increment": "Increment"
276
+ }
277
+ }
278
+ ```
279
+
280
+ ```tsx fileName="src/components/Counter.tsx"
281
+ "use client";
282
+
283
+ import { useState } from "react";
284
+ import { useTranslation } from "react-i18next";
285
+
286
+ export const Counter = () => {
287
+ const { t, i18n } = useTranslation("about");
288
+ const [count, setCount] = useState(0);
289
+ const numberFormat = new Intl.NumberFormat(i18n.language);
290
+
291
+ return (
292
+ <div>
293
+ <p>{numberFormat.format(count)}</p>
294
+ <button
295
+ aria-label={t("counter.label")}
296
+ onClick={() => setCount((c) => c + 1)}
297
+ >
298
+ {t("counter.increment")}
299
+ </button>
300
+ </div>
301
+ );
302
+ };
303
+ ```
304
+
305
+ > Сторінка, на якій відображається цей компонент, зобов'язана підвантажити namespace `about`, а виклик `t("counter.label")` залишається простим нетипізованим рядком, якщо не розширювати `CustomTypeOptions`.
306
+
307
+ **Intlayer**
308
+
309
+ ```ts fileName="src/components/Counter/index.content.ts"
310
+ import { t, type Dictionary } from "intlayer";
311
+
312
+ const counterContent = {
313
+ key: "counter",
314
+ content: {
315
+ label: t({ en: "Counter", fr: "Compteur" }),
316
+ increment: t({ en: "Increment", fr: "Incrémenter" }),
317
+ },
318
+ } satisfies Dictionary;
319
+
320
+ export default counterContent;
321
+ ```
322
+
323
+ ```tsx fileName="src/components/Counter/index.tsx"
324
+ "use client";
325
+
326
+ import { useState } from "react";
327
+ import { useIntlayer } from "next-intlayer";
328
+ import { useNumber } from "next-intlayer/format";
329
+
330
+ export const Counter = () => {
331
+ const { label, increment } = useIntlayer("counter");
332
+ const number = useNumber();
333
+ const [count, setCount] = useState(0);
334
+
335
+ return (
336
+ <div>
337
+ <p>{number(count)}</p>
338
+ <button aria-label={label} onClick={() => setCount((c) => c + 1)}>
339
+ {increment}
340
+ </button>
341
+ </div>
342
+ );
343
+ };
344
+ ```
345
+
346
+ Поля `label` та `increment` суворо типізовані; будь-яка помилка друку викличе помилку TypeScript, а відсутність французького перекладу зупинить процес збірки.
347
+
348
+ ### Синхронний серверний компонент (RSC)
349
+
350
+ **next-i18next**
351
+
352
+ ```tsx fileName="src/components/ServerCounter.tsx"
353
+ type ServerCounterProps = {
354
+ t: (key: string) => string;
355
+ locale: string;
356
+ count: number;
357
+ };
358
+
359
+ export const ServerCounter = ({ t, locale, count }: ServerCounterProps) => (
360
+ <div>
361
+ <p>{new Intl.NumberFormat(locale).format(count)}</p>
362
+ <button aria-label={t("counter.label")}>{t("counter.increment")}</button>
363
+ </div>
364
+ );
365
+ ```
366
+
367
+ Сторінка повинна викликати `i18n.getFixedT(locale, "about")` і спускати `t` та `locale` вниз через props.
368
+
369
+ **Intlayer**
370
+
371
+ ```tsx fileName="src/components/ServerCounter.tsx"
372
+ import { useIntlayer } from "next-intlayer/server";
373
+ import { useNumber } from "next-intlayer/server/format";
374
+
375
+ export const ServerCounter = ({ count }: { count: number }) => {
376
+ const { label, increment } = useIntlayer("counter");
377
+ const number = useNumber();
378
+
379
+ return (
380
+ <div>
381
+ <p>{number(count)}</p>
382
+ <button aria-label={label}>{increment}</button>
383
+ </div>
384
+ );
385
+ };
386
+ ```
387
+
388
+ ## Збережіть API i18next, отримайте швидкодію Intlayer
389
+
390
+ Вам не потрібно переписувати всі компоненти, щоб скористатися перевагами бенчмарку. Адаптери `@intlayer/i18next`, `@intlayer/react-i18next` та `@intlayer/next-i18next` підключаються як пряма заміна: виклики `useTranslation`, `t()`, `<Trans>`, форми множини та суфікси контексту продовжують працювати, транслюючись зі словників, скомпільованих Intlayer.
391
+
392
+ ```ts fileName="next.config.ts"
393
+ import type { NextConfig } from "next";
394
+ import { createNextI18nPlugin } from "@intlayer/next-i18next/plugin";
395
+
396
+ const withIntlayer = createNextI18nPlugin();
397
+
398
+ const nextConfig: NextConfig = {};
399
+
400
+ export default withIntlayer(nextConfig);
401
+ ```
402
+
403
+ ```ts fileName="vite.config.ts"
404
+ import { defineConfig } from "vite";
405
+ import { reactI18nextVitePlugin } from "@intlayer/react-i18next/plugin";
406
+
407
+ export default defineConfig({
408
+ plugins: [reactI18nextVitePlugin()],
409
+ });
410
+ ```
411
+
412
+ У бенчмарку адаптерний білд того самого додатку Next.js зменшив обсяг сторінки з **218.5 KB до 150.7 KB**, середній компонент з **78.5 KB до 9.7 KB**, витік сторінок скоротився з **~90% до 0%**, а час гідратації скоротився з 15.6 ms до 11.3 ms без зміни коду компонентів. Наявні файли `locales/{lng}/{ns}.json` можуть залишатися основним джерелом даних через плагін синхронізації JSON.
413
+
414
+ Дивіться посібники з міграції: [i18next](https://intlayer.org/uk/doc/migration/i18next), [react-i18next](https://intlayer.org/uk/doc/migration/react-i18next), [next-i18next](https://intlayer.org/uk/doc/migration/next-i18next).
415
+
416
+ ## Що і коли обирати?
417
+
418
+ - **Обирайте i18next**: якщо вам критично необхідна його екосистема плагінів (специфічні детектори, кастомні бекенди, ICU, Locize), ви реалізуєте переклад поза React (сервіси Node, чистий JS, інші фреймворки), команда вже має значний досвід, або зовнішня платформа вимагає структури `locales/{lng}/{ns}.json`. Але виділіть ресурси на підтримку просторів імен та маршрутів, якщо швидкість має значення.
419
+ - **Обирайте Intlayer**: якщо вам потрібні **контент у структурі компонентів**, **сувора типізація TypeScript**, **виявлення пропущених перекладів під час збірки**, **автоматичний tree-shaking та ліниве завантаження без зусиль**, миттєва зміна мови, синхронні серверні компоненти та вбудовані інструменти (візуальний редактор, CMS, переклад ШІ, сервер MCP). Ідеально для модульних проєктів та дизайн-систем.
420
+ - **Обирайте адаптери `@intlayer/*-i18next`**: якщо у вас уже є готовий проєкт на i18next і ви хочете швидко зменшити розмір бандла та покращити швидкість відгуку без масштабного рефакторингу.
421
+
422
+ ## Схожі порівняння
423
+
424
+ - [next-intl проти Intlayer](https://intlayer.org/uk/blog/next-intl-vs-intlayer) (той самий бенчмарк)
425
+ - [Lingui проти Intlayer](https://intlayer.org/uk/blog/lingui-vs-intlayer) (той самий бенчмарк)
426
+ - [vue-i18n проти Intlayer: бенчмарк](https://intlayer.org/uk/blog/vue-i18n-vs-intlayer-benchmark) (той самий бенчмарк)
427
+ - [next-i18next проти next-intl та Intlayer](https://intlayer.org/uk/blog/next-i18next-vs-next-intl-vs-intlayer)
428
+ - [react-i18next проти react-intl та Intlayer](https://intlayer.org/uk/blog/react-i18next-vs-react-intl-vs-intlayer)
429
+ - [Чи застарів i18next?](https://intlayer.org/uk/blog/is-i18next-outdated)
430
+
431
+ ## Зірки на GitHub
432
+
433
+ Зірки на GitHub є чітким свідченням популярності проєкту, довіри спільноти та його довгострокової життєздатності. Хоча вони не вимірюють безпосередньо якість коду, вони показують, скільки розробників вважають інструмент корисним і обирають його для своїх проєктів.
434
+
435
+ [![Графік історії зірок](https://api.star-history.com/chart?repos=i18next%2Fi18next%2Ci18next%2Freact-i18next%2Ci18next%2Fnext-i18next%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://star-history.com/#i18next/i18next&i18next/react-i18next&i18next/next-i18next&aymericzip/intlayer)
436
+
437
+ ## Висновок
438
+
439
+ `i18next` заслужив свій статус: він працює всюди, має плагіни для будь-яких завдань і підтримується понад 10 років. Проте бенчмарк демонструє високу ціну такої орієнтованої на runtime архітектури. Звичайна збірка додає **+70-77 KB gzip на кожну сторінку**, **пропускає близько 90% контенту сторонніх сторінок**, а зміна мови з лінивим завантаженням триває **понад 100 ms**. Позбутися витоків можливо, але це вимагає складного ручного адміністрування, і результат все одно буде **на 9-22 KB важчим** за Intlayer.
440
+
441
+ Intlayer перекладає всю цю роботу на компілятор. Словники для кожного компонента, ліниве завантаження за мовами та очищення зайвого контенту стають природним результатом процесу збірки. На тому самому додатку: **лише +0.3 KB на сторінку**, **0% витоків**, компоненти **у 3-10 разів компактніші**, а зміна мови відбувається за **3-4 ms**.
442
+
443
+ Усі необроблені дані, тестові додатки та скрипти опубліковані у [репозиторії Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Ви можете запустити їх і переконатися самостійно.
444
+
445
+ Дізнайтеся більше у документації ['Чому Intlayer?'](https://intlayer.org/uk/doc/why).
@@ -70,7 +70,7 @@ author: aymericzip
70
70
  | `i18next` core | 2 626 | **259** | Невеликі патчі |
71
71
  | Intlayer | 7 156 | **4 343** | Компілятор, інструменти IDE та ШІ-рушій |
72
72
 
73
- [![Star History Chart](https://api.star-history.com/chart?repos=i18next%2Fi18next%2Ci18next%2Freact-i18next%2Ci18next%2Fnext-i18next%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://www.star-history.com/#i18next/i18next&i18next/react-i18next&i18next/next-i18next&aymericzip/intlayer)
73
+ [![Star History Chart](https://api.star-history.com/chart?repos=i18next%2Fi18next%2Ci18next%2Freact-i18next%2Ci18next%2Fnext-i18next%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://star-history.com/#i18next/i18next&i18next/react-i18next&i18next/next-i18next&aymericzip/intlayer)
74
74
 
75
75
  Невелика бібліотека може бути стабільною. Але засоби i18n змінюються: сучасні збирачі видаляють непотрібний контент під час збірки, нейромережі перекладають безпосередньо в CI, а редактори підключають Language Server (LSP) та ШІ-агентів. Модель i18next, побудована виключно на runtime, не дозволяє легко впроваджувати ці рішення.
76
76
 
@@ -66,7 +66,7 @@ author: aymericzip
66
66
  - `amannn/next-intl`: **187 комітів** (оновлення залежностей і локальні правки).
67
67
  - `aymericzip/intlayer`: **4 343 коміти** (активний розвиток компілятора, розширень для IDE, серверів MCP і механізмів перекладу).
68
68
 
69
- [![Star History Chart](https://api.star-history.com/chart?repos=amannn%2Fnext-intl%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://www.star-history.com/#amannn/next-intl&aymericzip/intlayer)
69
+ [![Star History Chart](https://api.star-history.com/chart?repos=amannn%2Fnext-intl%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://star-history.com/#amannn/next-intl&aymericzip/intlayer)
70
70
 
71
71
  Стабільна бібліотека має свої переваги. Проте підходи до i18n суттєво оновилися: компілятори вилучають невикористані рядки під час збірки, LLM автоматизують локалізацію в CI, а середовища розробки використовують сервери мов (LSP) та розумних помічників. Архітектура, прив'язана до runtime, з труднощами переймає ці можливості.
72
72
 
@@ -64,7 +64,7 @@ author: aymericzip
64
64
  - `intlify/vue-i18n`: **259 комітів** (регулярні виправлення для Vue 3 і Nuxt).
65
65
  - `aymericzip/intlayer`: **4 343 коміти** (активна розробка оптимізацій компілятора, LSP-інструментів та інтеграцій для ШІ).
66
66
 
67
- [![Star History Chart](https://api.star-history.com/chart?repos=intlify%2Fvue-i18n%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://www.star-history.com/#intlify/vue-i18n&aymericzip/intlayer)
67
+ [![Star History Chart](https://api.star-history.com/chart?repos=intlify%2Fvue-i18n%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://star-history.com/#intlify/vue-i18n&aymericzip/intlayer)
68
68
 
69
69
  Зріла бібліотека забезпечує передбачуваність. Проте сучасні фронтенд-рішення застосовують AST-трансформації на етапі збірки, очищення мертвого коду та автоматизацію за допомогою ШІ. Системі, орієнтованій виключно на виконання у браузері, складно переймати ці переваги.
70
70