@intlayer/docs 9.5.6 → 9.5.7

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 (601) hide show
  1. package/blog/ar/i18next_vs_intlayer-i18next.md +122 -15
  2. package/blog/ar/i18next_vs_intlayer.md +130 -16
  3. package/blog/ar/lingui_vs_intlayer.md +122 -15
  4. package/blog/ar/next-intl_vs_intlayer-next-intl.md +124 -15
  5. package/blog/ar/next-intl_vs_intlayer.md +136 -20
  6. package/blog/ar/vue-i18n_vs_intlayer-vue-i18n.md +119 -17
  7. package/blog/ar/vue-i18n_vs_intlayer.md +193 -31
  8. package/blog/ar/vue-i18n_vs_intlayer_benchmark.md +361 -0
  9. package/blog/de/i18next_vs_intlayer-i18next.md +122 -15
  10. package/blog/de/i18next_vs_intlayer.md +128 -14
  11. package/blog/de/lingui_vs_intlayer.md +122 -15
  12. package/blog/de/next-intl_vs_intlayer-next-intl.md +124 -15
  13. package/blog/de/next-intl_vs_intlayer.md +125 -15
  14. package/blog/de/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  15. package/blog/de/vue-i18n_vs_intlayer.md +193 -31
  16. package/blog/en/i18next_vs_intlayer-i18next.md +121 -14
  17. package/blog/en/i18next_vs_intlayer.md +128 -14
  18. package/blog/en/lingui_vs_intlayer.md +124 -15
  19. package/blog/en/next-intl_vs_intlayer-next-intl.md +123 -14
  20. package/blog/en/next-intl_vs_intlayer.md +125 -13
  21. package/blog/en/vue-i18n_vs_intlayer-vue-i18n.md +115 -15
  22. package/blog/en/vue-i18n_vs_intlayer.md +188 -27
  23. package/blog/en-GB/i18next_vs_intlayer-i18next.md +121 -14
  24. package/blog/en-GB/i18next_vs_intlayer.md +128 -14
  25. package/blog/en-GB/lingui_vs_intlayer.md +122 -15
  26. package/blog/en-GB/next-intl_vs_intlayer-next-intl.md +124 -15
  27. package/blog/en-GB/next-intl_vs_intlayer.md +125 -15
  28. package/blog/en-GB/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  29. package/blog/en-GB/vue-i18n_vs_intlayer.md +187 -25
  30. package/blog/en-GB/vue-i18n_vs_intlayer_benchmark.md +116 -0
  31. package/blog/es/i18next_vs_intlayer-i18next.md +122 -15
  32. package/blog/es/i18next_vs_intlayer.md +128 -14
  33. package/blog/es/lingui_vs_intlayer.md +122 -15
  34. package/blog/es/next-intl_vs_intlayer-next-intl.md +124 -15
  35. package/blog/es/next-intl_vs_intlayer.md +125 -15
  36. package/blog/es/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  37. package/blog/es/vue-i18n_vs_intlayer.md +193 -31
  38. package/blog/fr/i18next_vs_intlayer-i18next.md +122 -15
  39. package/blog/fr/i18next_vs_intlayer.md +128 -14
  40. package/blog/fr/lingui_vs_intlayer.md +122 -15
  41. package/blog/fr/next-intl_vs_intlayer-next-intl.md +124 -15
  42. package/blog/fr/next-intl_vs_intlayer.md +127 -15
  43. package/blog/fr/vue-i18n_vs_intlayer-vue-i18n.md +118 -17
  44. package/blog/fr/vue-i18n_vs_intlayer.md +192 -31
  45. package/blog/fr/vue-i18n_vs_intlayer_benchmark.md +329 -7
  46. package/blog/hi/i18next_vs_intlayer-i18next.md +122 -15
  47. package/blog/hi/i18next_vs_intlayer.md +130 -16
  48. package/blog/hi/lingui_vs_intlayer.md +122 -15
  49. package/blog/hi/next-intl_vs_intlayer-next-intl.md +124 -15
  50. package/blog/hi/next-intl_vs_intlayer.md +135 -19
  51. package/blog/hi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  52. package/blog/hi/vue-i18n_vs_intlayer.md +193 -31
  53. package/blog/hi/vue-i18n_vs_intlayer_benchmark.md +361 -0
  54. package/blog/id/i18next_vs_intlayer-i18next.md +122 -15
  55. package/blog/id/i18next_vs_intlayer.md +128 -14
  56. package/blog/id/lingui_vs_intlayer.md +122 -15
  57. package/blog/id/next-intl_vs_intlayer-next-intl.md +124 -15
  58. package/blog/id/next-intl_vs_intlayer.md +135 -19
  59. package/blog/id/vue-i18n_vs_intlayer-vue-i18n.md +354 -2
  60. package/blog/id/vue-i18n_vs_intlayer.md +188 -26
  61. package/blog/id/vue-i18n_vs_intlayer_benchmark.md +327 -7
  62. package/blog/it/i18next_vs_intlayer-i18next.md +122 -15
  63. package/blog/it/i18next_vs_intlayer.md +128 -14
  64. package/blog/it/lingui_vs_intlayer.md +122 -15
  65. package/blog/it/next-intl_vs_intlayer-next-intl.md +124 -15
  66. package/blog/it/next-intl_vs_intlayer.md +125 -15
  67. package/blog/it/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  68. package/blog/it/vue-i18n_vs_intlayer.md +191 -31
  69. package/blog/it/vue-i18n_vs_intlayer_benchmark.md +332 -5
  70. package/blog/ja/i18next_vs_intlayer-i18next.md +122 -15
  71. package/blog/ja/i18next_vs_intlayer.md +129 -17
  72. package/blog/ja/lingui_vs_intlayer.md +122 -15
  73. package/blog/ja/next-intl_vs_intlayer-next-intl.md +124 -15
  74. package/blog/ja/next-intl_vs_intlayer.md +124 -14
  75. package/blog/ja/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  76. package/blog/ja/vue-i18n_vs_intlayer.md +193 -31
  77. package/blog/ja/vue-i18n_vs_intlayer_benchmark.md +361 -0
  78. package/blog/ko/i18next_vs_intlayer-i18next.md +122 -15
  79. package/blog/ko/i18next_vs_intlayer.md +129 -17
  80. package/blog/ko/lingui_vs_intlayer.md +122 -15
  81. package/blog/ko/next-intl_vs_intlayer-next-intl.md +124 -15
  82. package/blog/ko/next-intl_vs_intlayer.md +134 -18
  83. package/blog/ko/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  84. package/blog/ko/vue-i18n_vs_intlayer.md +193 -31
  85. package/blog/pl/i18next_vs_intlayer-i18next.md +122 -15
  86. package/blog/pl/i18next_vs_intlayer.md +128 -14
  87. package/blog/pl/lingui_vs_intlayer.md +122 -15
  88. package/blog/pl/next-intl_vs_intlayer-next-intl.md +124 -15
  89. package/blog/pl/next-intl_vs_intlayer.md +134 -18
  90. package/blog/pl/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  91. package/blog/pl/vue-i18n_vs_intlayer.md +188 -26
  92. package/blog/pl/vue-i18n_vs_intlayer_benchmark.md +361 -0
  93. package/blog/pt/i18next_vs_intlayer-i18next.md +122 -15
  94. package/blog/pt/i18next_vs_intlayer.md +128 -14
  95. package/blog/pt/lingui_vs_intlayer.md +122 -15
  96. package/blog/pt/next-intl_vs_intlayer-next-intl.md +124 -15
  97. package/blog/pt/next-intl_vs_intlayer.md +131 -15
  98. package/blog/pt/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  99. package/blog/pt/vue-i18n_vs_intlayer.md +193 -31
  100. package/blog/pt/vue-i18n_vs_intlayer_benchmark.md +361 -0
  101. package/blog/ru/i18next_vs_intlayer-i18next.md +122 -15
  102. package/blog/ru/i18next_vs_intlayer.md +130 -16
  103. package/blog/ru/lingui_vs_intlayer.md +122 -15
  104. package/blog/ru/next-intl_vs_intlayer-next-intl.md +125 -16
  105. package/blog/ru/next-intl_vs_intlayer.md +123 -13
  106. package/blog/ru/vue-i18n_vs_intlayer-vue-i18n.md +127 -27
  107. package/blog/ru/vue-i18n_vs_intlayer.md +193 -31
  108. package/blog/ru/vue-i18n_vs_intlayer_benchmark.md +326 -19
  109. package/blog/tr/i18next_vs_intlayer-i18next.md +122 -15
  110. package/blog/tr/i18next_vs_intlayer.md +128 -14
  111. package/blog/tr/lingui_vs_intlayer.md +122 -15
  112. package/blog/tr/next-intl_vs_intlayer-next-intl.md +124 -15
  113. package/blog/tr/next-intl_vs_intlayer.md +136 -20
  114. package/blog/tr/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  115. package/blog/tr/vue-i18n_vs_intlayer.md +188 -26
  116. package/blog/tr/vue-i18n_vs_intlayer_benchmark.md +361 -0
  117. package/blog/uk/i18next_vs_intlayer-i18next.md +122 -15
  118. package/blog/uk/i18next_vs_intlayer.md +130 -16
  119. package/blog/uk/lingui_vs_intlayer.md +122 -15
  120. package/blog/uk/next-intl_vs_intlayer-next-intl.md +124 -15
  121. package/blog/uk/next-intl_vs_intlayer.md +135 -19
  122. package/blog/uk/vue-i18n_vs_intlayer-vue-i18n.md +135 -17
  123. package/blog/uk/vue-i18n_vs_intlayer.md +188 -27
  124. package/blog/uk/vue-i18n_vs_intlayer_benchmark.md +361 -0
  125. package/blog/vi/i18next_vs_intlayer-i18next.md +122 -15
  126. package/blog/vi/i18next_vs_intlayer.md +128 -14
  127. package/blog/vi/lingui_vs_intlayer.md +122 -15
  128. package/blog/vi/next-intl_vs_intlayer-next-intl.md +124 -15
  129. package/blog/vi/next-intl_vs_intlayer.md +135 -19
  130. package/blog/vi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  131. package/blog/vi/vue-i18n_vs_intlayer.md +188 -26
  132. package/blog/vi/vue-i18n_vs_intlayer_benchmark.md +361 -0
  133. package/blog/zh/i18next_vs_intlayer-i18next.md +122 -15
  134. package/blog/zh/i18next_vs_intlayer.md +128 -14
  135. package/blog/zh/lingui_vs_intlayer.md +122 -15
  136. package/blog/zh/next-intl_vs_intlayer-next-intl.md +124 -15
  137. package/blog/zh/next-intl_vs_intlayer.md +125 -15
  138. package/blog/zh/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  139. package/blog/zh/vue-i18n_vs_intlayer.md +192 -31
  140. package/blog/zh/vue-i18n_vs_intlayer_benchmark.md +340 -9
  141. package/dist/cjs/generated/docs.entry.cjs +40 -40
  142. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  143. package/dist/cjs/index.cjs +2 -2
  144. package/dist/esm/generated/docs.entry.mjs +40 -40
  145. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  146. package/dist/esm/index.mjs +2 -2
  147. package/dist/types/generated/docs.entry.d.ts +2 -2
  148. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  149. package/docs/ar/benchmark/nextjs.md +13 -13
  150. package/docs/ar/benchmark/solid.md +5 -5
  151. package/docs/ar/benchmark/svelte.md +4 -4
  152. package/docs/ar/benchmark/tanstack.md +14 -13
  153. package/docs/ar/benchmark/vue.md +5 -5
  154. package/docs/ar/chrome_extension.md +130 -0
  155. package/docs/ar/cli/index.md +6 -1
  156. package/docs/ar/cli/infra.md +162 -0
  157. package/docs/ar/cli/init.md +24 -1
  158. package/docs/ar/dictionary/html.md +173 -5
  159. package/docs/ar/dictionary/markdown.md +263 -1
  160. package/docs/ar/intlayer_with_analog.md +23 -1
  161. package/docs/ar/intlayer_with_angular_19.md +24 -1
  162. package/docs/ar/intlayer_with_angular_21.md +24 -1
  163. package/docs/ar/intlayer_with_astro.md +24 -1
  164. package/docs/ar/intlayer_with_astro_lit.md +25 -1
  165. package/docs/ar/intlayer_with_astro_preact.md +26 -1
  166. package/docs/ar/intlayer_with_astro_react.md +26 -1
  167. package/docs/ar/intlayer_with_astro_solid.md +26 -1
  168. package/docs/ar/intlayer_with_astro_svelte.md +25 -1
  169. package/docs/ar/intlayer_with_astro_vue.md +25 -1
  170. package/docs/ar/intlayer_with_remix_3.md +22 -1
  171. package/docs/ar/self_hosting.md +406 -231
  172. package/docs/de/benchmark/nextjs.md +13 -13
  173. package/docs/de/benchmark/solid.md +5 -5
  174. package/docs/de/benchmark/svelte.md +4 -4
  175. package/docs/de/benchmark/tanstack.md +14 -13
  176. package/docs/de/benchmark/vue.md +5 -5
  177. package/docs/de/chrome_extension.md +130 -0
  178. package/docs/de/cli/index.md +6 -1
  179. package/docs/de/cli/infra.md +162 -0
  180. package/docs/de/cli/init.md +24 -1
  181. package/docs/de/dictionary/html.md +173 -5
  182. package/docs/de/dictionary/markdown.md +263 -1
  183. package/docs/de/intlayer_with_analog.md +23 -1
  184. package/docs/de/intlayer_with_angular_19.md +24 -1
  185. package/docs/de/intlayer_with_angular_21.md +24 -1
  186. package/docs/de/intlayer_with_astro.md +24 -1
  187. package/docs/de/intlayer_with_astro_lit.md +25 -1
  188. package/docs/de/intlayer_with_astro_preact.md +26 -1
  189. package/docs/de/intlayer_with_astro_react.md +26 -1
  190. package/docs/de/intlayer_with_astro_solid.md +26 -1
  191. package/docs/de/intlayer_with_astro_svelte.md +25 -1
  192. package/docs/de/intlayer_with_astro_vue.md +25 -1
  193. package/docs/de/intlayer_with_remix_3.md +22 -1
  194. package/docs/de/self_hosting.md +404 -227
  195. package/docs/en/benchmark/nextjs.md +13 -13
  196. package/docs/en/benchmark/solid.md +5 -5
  197. package/docs/en/benchmark/svelte.md +4 -4
  198. package/docs/en/benchmark/tanstack.md +14 -13
  199. package/docs/en/benchmark/vue.md +5 -5
  200. package/docs/en/chrome_extension.md +130 -0
  201. package/docs/en/cli/index.md +6 -1
  202. package/docs/en/cli/infra.md +175 -0
  203. package/docs/en/cli/init.md +25 -1
  204. package/docs/en/dictionary/html.md +173 -5
  205. package/docs/en/dictionary/markdown.md +263 -1
  206. package/docs/en/intlayer_with_analog.md +23 -1
  207. package/docs/en/intlayer_with_angular_19.md +24 -1
  208. package/docs/en/intlayer_with_angular_21.md +24 -1
  209. package/docs/en/intlayer_with_astro.md +24 -1
  210. package/docs/en/intlayer_with_astro_lit.md +25 -1
  211. package/docs/en/intlayer_with_astro_preact.md +26 -1
  212. package/docs/en/intlayer_with_astro_react.md +26 -1
  213. package/docs/en/intlayer_with_astro_solid.md +26 -1
  214. package/docs/en/intlayer_with_astro_svelte.md +25 -1
  215. package/docs/en/intlayer_with_astro_vue.md +25 -1
  216. package/docs/en/intlayer_with_remix_3.md +22 -1
  217. package/docs/en/self_hosting.md +418 -176
  218. package/docs/en-GB/benchmark/nextjs.md +13 -13
  219. package/docs/en-GB/benchmark/solid.md +5 -5
  220. package/docs/en-GB/benchmark/svelte.md +4 -4
  221. package/docs/en-GB/benchmark/tanstack.md +14 -13
  222. package/docs/en-GB/benchmark/vue.md +5 -5
  223. package/docs/en-GB/chrome_extension.md +130 -0
  224. package/docs/en-GB/cli/index.md +6 -1
  225. package/docs/en-GB/cli/infra.md +162 -0
  226. package/docs/en-GB/cli/init.md +24 -1
  227. package/docs/en-GB/dictionary/html.md +173 -5
  228. package/docs/en-GB/dictionary/markdown.md +263 -1
  229. package/docs/en-GB/intlayer_with_analog.md +23 -1
  230. package/docs/en-GB/intlayer_with_angular_19.md +24 -1
  231. package/docs/en-GB/intlayer_with_angular_21.md +24 -1
  232. package/docs/en-GB/intlayer_with_astro.md +24 -1
  233. package/docs/en-GB/intlayer_with_astro_lit.md +25 -1
  234. package/docs/en-GB/intlayer_with_astro_preact.md +26 -1
  235. package/docs/en-GB/intlayer_with_astro_react.md +26 -1
  236. package/docs/en-GB/intlayer_with_astro_solid.md +26 -1
  237. package/docs/en-GB/intlayer_with_astro_svelte.md +25 -1
  238. package/docs/en-GB/intlayer_with_astro_vue.md +25 -1
  239. package/docs/en-GB/intlayer_with_remix_3.md +22 -1
  240. package/docs/en-GB/self_hosting.md +381 -206
  241. package/docs/es/benchmark/nextjs.md +13 -13
  242. package/docs/es/benchmark/solid.md +5 -5
  243. package/docs/es/benchmark/svelte.md +4 -4
  244. package/docs/es/benchmark/tanstack.md +14 -13
  245. package/docs/es/benchmark/vue.md +5 -5
  246. package/docs/es/chrome_extension.md +130 -0
  247. package/docs/es/cli/index.md +6 -1
  248. package/docs/es/cli/infra.md +162 -0
  249. package/docs/es/cli/init.md +24 -1
  250. package/docs/es/dictionary/html.md +173 -5
  251. package/docs/es/dictionary/markdown.md +263 -1
  252. package/docs/es/intlayer_with_analog.md +23 -1
  253. package/docs/es/intlayer_with_angular_19.md +24 -1
  254. package/docs/es/intlayer_with_angular_21.md +24 -1
  255. package/docs/es/intlayer_with_astro.md +24 -1
  256. package/docs/es/intlayer_with_astro_lit.md +25 -1
  257. package/docs/es/intlayer_with_astro_preact.md +26 -1
  258. package/docs/es/intlayer_with_astro_react.md +26 -1
  259. package/docs/es/intlayer_with_astro_solid.md +26 -1
  260. package/docs/es/intlayer_with_astro_svelte.md +25 -1
  261. package/docs/es/intlayer_with_astro_vue.md +25 -1
  262. package/docs/es/intlayer_with_remix_3.md +22 -1
  263. package/docs/es/self_hosting.md +400 -223
  264. package/docs/fr/benchmark/nextjs.md +13 -13
  265. package/docs/fr/benchmark/solid.md +5 -5
  266. package/docs/fr/benchmark/svelte.md +4 -4
  267. package/docs/fr/benchmark/tanstack.md +14 -13
  268. package/docs/fr/benchmark/vue.md +5 -5
  269. package/docs/fr/chrome_extension.md +130 -0
  270. package/docs/fr/cli/index.md +6 -1
  271. package/docs/fr/cli/infra.md +162 -0
  272. package/docs/fr/cli/init.md +24 -1
  273. package/docs/fr/dictionary/html.md +173 -5
  274. package/docs/fr/dictionary/markdown.md +265 -4
  275. package/docs/fr/intlayer_with_analog.md +23 -1
  276. package/docs/fr/intlayer_with_angular_19.md +24 -1
  277. package/docs/fr/intlayer_with_angular_21.md +24 -1
  278. package/docs/fr/intlayer_with_astro.md +24 -1
  279. package/docs/fr/intlayer_with_astro_lit.md +25 -1
  280. package/docs/fr/intlayer_with_astro_preact.md +26 -1
  281. package/docs/fr/intlayer_with_astro_react.md +26 -1
  282. package/docs/fr/intlayer_with_astro_solid.md +26 -1
  283. package/docs/fr/intlayer_with_astro_svelte.md +25 -1
  284. package/docs/fr/intlayer_with_astro_vue.md +25 -1
  285. package/docs/fr/intlayer_with_remix_3.md +22 -1
  286. package/docs/fr/self_hosting.md +401 -224
  287. package/docs/hi/benchmark/nextjs.md +13 -13
  288. package/docs/hi/benchmark/solid.md +5 -5
  289. package/docs/hi/benchmark/svelte.md +4 -4
  290. package/docs/hi/benchmark/tanstack.md +14 -13
  291. package/docs/hi/benchmark/vue.md +5 -5
  292. package/docs/hi/chrome_extension.md +130 -0
  293. package/docs/hi/cli/index.md +6 -1
  294. package/docs/hi/cli/infra.md +162 -0
  295. package/docs/hi/cli/init.md +24 -1
  296. package/docs/hi/dictionary/html.md +173 -5
  297. package/docs/hi/dictionary/markdown.md +263 -1
  298. package/docs/hi/intlayer_with_analog.md +23 -1
  299. package/docs/hi/intlayer_with_angular_19.md +24 -1
  300. package/docs/hi/intlayer_with_angular_21.md +24 -1
  301. package/docs/hi/intlayer_with_astro.md +24 -1
  302. package/docs/hi/intlayer_with_astro_lit.md +25 -1
  303. package/docs/hi/intlayer_with_astro_preact.md +26 -1
  304. package/docs/hi/intlayer_with_astro_react.md +26 -1
  305. package/docs/hi/intlayer_with_astro_solid.md +26 -1
  306. package/docs/hi/intlayer_with_astro_svelte.md +25 -1
  307. package/docs/hi/intlayer_with_astro_vue.md +25 -1
  308. package/docs/hi/intlayer_with_remix_3.md +22 -1
  309. package/docs/hi/self_hosting.md +409 -235
  310. package/docs/id/benchmark/nextjs.md +13 -13
  311. package/docs/id/benchmark/solid.md +5 -5
  312. package/docs/id/benchmark/svelte.md +4 -4
  313. package/docs/id/benchmark/tanstack.md +14 -13
  314. package/docs/id/benchmark/vue.md +5 -5
  315. package/docs/id/chrome_extension.md +130 -0
  316. package/docs/id/cli/index.md +6 -1
  317. package/docs/id/cli/infra.md +162 -0
  318. package/docs/id/cli/init.md +24 -1
  319. package/docs/id/dictionary/html.md +173 -5
  320. package/docs/id/dictionary/markdown.md +263 -1
  321. package/docs/id/intlayer_with_analog.md +23 -1
  322. package/docs/id/intlayer_with_angular_19.md +24 -1
  323. package/docs/id/intlayer_with_angular_21.md +24 -1
  324. package/docs/id/intlayer_with_astro.md +24 -1
  325. package/docs/id/intlayer_with_astro_lit.md +25 -1
  326. package/docs/id/intlayer_with_astro_preact.md +26 -1
  327. package/docs/id/intlayer_with_astro_react.md +26 -1
  328. package/docs/id/intlayer_with_astro_solid.md +26 -1
  329. package/docs/id/intlayer_with_astro_svelte.md +25 -1
  330. package/docs/id/intlayer_with_astro_vue.md +25 -1
  331. package/docs/id/intlayer_with_remix_3.md +22 -1
  332. package/docs/id/self_hosting.md +416 -243
  333. package/docs/it/benchmark/nextjs.md +13 -13
  334. package/docs/it/benchmark/solid.md +5 -5
  335. package/docs/it/benchmark/svelte.md +4 -4
  336. package/docs/it/benchmark/tanstack.md +14 -13
  337. package/docs/it/benchmark/vue.md +5 -5
  338. package/docs/it/chrome_extension.md +130 -0
  339. package/docs/it/cli/index.md +6 -1
  340. package/docs/it/cli/infra.md +162 -0
  341. package/docs/it/cli/init.md +24 -1
  342. package/docs/it/dictionary/html.md +173 -5
  343. package/docs/it/dictionary/markdown.md +263 -1
  344. package/docs/it/intlayer_with_analog.md +23 -1
  345. package/docs/it/intlayer_with_angular_19.md +24 -1
  346. package/docs/it/intlayer_with_angular_21.md +24 -1
  347. package/docs/it/intlayer_with_astro.md +24 -1
  348. package/docs/it/intlayer_with_astro_lit.md +25 -1
  349. package/docs/it/intlayer_with_astro_preact.md +26 -1
  350. package/docs/it/intlayer_with_astro_react.md +26 -1
  351. package/docs/it/intlayer_with_astro_solid.md +26 -1
  352. package/docs/it/intlayer_with_astro_svelte.md +25 -1
  353. package/docs/it/intlayer_with_astro_vue.md +25 -1
  354. package/docs/it/intlayer_with_remix_3.md +22 -1
  355. package/docs/it/self_hosting.md +412 -237
  356. package/docs/ja/benchmark/nextjs.md +13 -13
  357. package/docs/ja/benchmark/solid.md +5 -5
  358. package/docs/ja/benchmark/svelte.md +4 -4
  359. package/docs/ja/benchmark/tanstack.md +13 -12
  360. package/docs/ja/benchmark/vue.md +5 -5
  361. package/docs/ja/chrome_extension.md +130 -0
  362. package/docs/ja/cli/index.md +6 -1
  363. package/docs/ja/cli/infra.md +162 -0
  364. package/docs/ja/cli/init.md +24 -1
  365. package/docs/ja/dictionary/html.md +173 -5
  366. package/docs/ja/dictionary/markdown.md +263 -1
  367. package/docs/ja/intlayer_with_analog.md +23 -1
  368. package/docs/ja/intlayer_with_angular_19.md +24 -1
  369. package/docs/ja/intlayer_with_angular_21.md +24 -1
  370. package/docs/ja/intlayer_with_astro.md +24 -1
  371. package/docs/ja/intlayer_with_astro_lit.md +25 -1
  372. package/docs/ja/intlayer_with_astro_preact.md +26 -1
  373. package/docs/ja/intlayer_with_astro_react.md +26 -1
  374. package/docs/ja/intlayer_with_astro_solid.md +26 -1
  375. package/docs/ja/intlayer_with_astro_svelte.md +25 -1
  376. package/docs/ja/intlayer_with_astro_vue.md +25 -1
  377. package/docs/ja/intlayer_with_remix_3.md +22 -1
  378. package/docs/ja/self_hosting.md +398 -223
  379. package/docs/ko/benchmark/nextjs.md +13 -13
  380. package/docs/ko/benchmark/solid.md +5 -5
  381. package/docs/ko/benchmark/svelte.md +4 -4
  382. package/docs/ko/benchmark/tanstack.md +14 -13
  383. package/docs/ko/benchmark/vue.md +5 -5
  384. package/docs/ko/chrome_extension.md +130 -0
  385. package/docs/ko/cli/index.md +6 -1
  386. package/docs/ko/cli/infra.md +162 -0
  387. package/docs/ko/cli/init.md +24 -1
  388. package/docs/ko/dictionary/html.md +173 -5
  389. package/docs/ko/dictionary/markdown.md +263 -1
  390. package/docs/ko/intlayer_with_analog.md +23 -1
  391. package/docs/ko/intlayer_with_angular_19.md +24 -1
  392. package/docs/ko/intlayer_with_angular_21.md +24 -1
  393. package/docs/ko/intlayer_with_astro.md +24 -1
  394. package/docs/ko/intlayer_with_astro_lit.md +25 -1
  395. package/docs/ko/intlayer_with_astro_preact.md +26 -1
  396. package/docs/ko/intlayer_with_astro_react.md +26 -1
  397. package/docs/ko/intlayer_with_astro_solid.md +26 -1
  398. package/docs/ko/intlayer_with_astro_svelte.md +25 -1
  399. package/docs/ko/intlayer_with_astro_vue.md +25 -1
  400. package/docs/ko/intlayer_with_remix_3.md +22 -1
  401. package/docs/ko/self_hosting.md +411 -238
  402. package/docs/pl/benchmark/nextjs.md +13 -13
  403. package/docs/pl/benchmark/solid.md +5 -5
  404. package/docs/pl/benchmark/svelte.md +4 -4
  405. package/docs/pl/benchmark/tanstack.md +14 -13
  406. package/docs/pl/benchmark/vue.md +5 -5
  407. package/docs/pl/chrome_extension.md +130 -0
  408. package/docs/pl/cli/index.md +6 -1
  409. package/docs/pl/cli/infra.md +162 -0
  410. package/docs/pl/cli/init.md +24 -1
  411. package/docs/pl/dictionary/html.md +173 -5
  412. package/docs/pl/dictionary/markdown.md +263 -1
  413. package/docs/pl/intlayer_with_analog.md +23 -1
  414. package/docs/pl/intlayer_with_angular_19.md +24 -1
  415. package/docs/pl/intlayer_with_angular_21.md +24 -1
  416. package/docs/pl/intlayer_with_astro.md +24 -1
  417. package/docs/pl/intlayer_with_astro_lit.md +25 -1
  418. package/docs/pl/intlayer_with_astro_preact.md +26 -1
  419. package/docs/pl/intlayer_with_astro_react.md +26 -1
  420. package/docs/pl/intlayer_with_astro_solid.md +26 -1
  421. package/docs/pl/intlayer_with_astro_svelte.md +25 -1
  422. package/docs/pl/intlayer_with_astro_vue.md +25 -1
  423. package/docs/pl/intlayer_with_remix_3.md +22 -1
  424. package/docs/pl/self_hosting.md +408 -233
  425. package/docs/pt/benchmark/nextjs.md +13 -13
  426. package/docs/pt/benchmark/solid.md +5 -5
  427. package/docs/pt/benchmark/svelte.md +4 -4
  428. package/docs/pt/benchmark/tanstack.md +14 -13
  429. package/docs/pt/benchmark/vue.md +5 -5
  430. package/docs/pt/chrome_extension.md +130 -0
  431. package/docs/pt/cli/index.md +6 -1
  432. package/docs/pt/cli/infra.md +162 -0
  433. package/docs/pt/cli/init.md +24 -1
  434. package/docs/pt/dictionary/html.md +173 -5
  435. package/docs/pt/dictionary/markdown.md +263 -1
  436. package/docs/pt/intlayer_with_analog.md +23 -1
  437. package/docs/pt/intlayer_with_angular_19.md +24 -1
  438. package/docs/pt/intlayer_with_angular_21.md +24 -1
  439. package/docs/pt/intlayer_with_astro.md +24 -1
  440. package/docs/pt/intlayer_with_astro_lit.md +25 -1
  441. package/docs/pt/intlayer_with_astro_preact.md +26 -1
  442. package/docs/pt/intlayer_with_astro_react.md +26 -1
  443. package/docs/pt/intlayer_with_astro_solid.md +26 -1
  444. package/docs/pt/intlayer_with_astro_svelte.md +25 -1
  445. package/docs/pt/intlayer_with_astro_vue.md +25 -1
  446. package/docs/pt/intlayer_with_remix_3.md +22 -1
  447. package/docs/pt/self_hosting.md +399 -224
  448. package/docs/ru/benchmark/nextjs.md +13 -13
  449. package/docs/ru/benchmark/solid.md +5 -5
  450. package/docs/ru/benchmark/svelte.md +4 -4
  451. package/docs/ru/benchmark/tanstack.md +14 -13
  452. package/docs/ru/benchmark/vue.md +5 -5
  453. package/docs/ru/chrome_extension.md +130 -0
  454. package/docs/ru/cli/index.md +6 -1
  455. package/docs/ru/cli/infra.md +162 -0
  456. package/docs/ru/cli/init.md +24 -1
  457. package/docs/ru/dictionary/html.md +173 -5
  458. package/docs/ru/dictionary/markdown.md +263 -1
  459. package/docs/ru/intlayer_with_analog.md +23 -1
  460. package/docs/ru/intlayer_with_angular_19.md +24 -1
  461. package/docs/ru/intlayer_with_angular_21.md +24 -1
  462. package/docs/ru/intlayer_with_astro.md +24 -1
  463. package/docs/ru/intlayer_with_astro_lit.md +25 -1
  464. package/docs/ru/intlayer_with_astro_preact.md +26 -1
  465. package/docs/ru/intlayer_with_astro_react.md +26 -1
  466. package/docs/ru/intlayer_with_astro_solid.md +26 -1
  467. package/docs/ru/intlayer_with_astro_svelte.md +25 -1
  468. package/docs/ru/intlayer_with_astro_vue.md +25 -1
  469. package/docs/ru/intlayer_with_remix_3.md +22 -1
  470. package/docs/ru/self_hosting.md +403 -228
  471. package/docs/tr/benchmark/nextjs.md +13 -13
  472. package/docs/tr/benchmark/solid.md +5 -5
  473. package/docs/tr/benchmark/svelte.md +4 -4
  474. package/docs/tr/benchmark/tanstack.md +14 -13
  475. package/docs/tr/benchmark/vue.md +5 -5
  476. package/docs/tr/chrome_extension.md +130 -0
  477. package/docs/tr/cli/index.md +6 -1
  478. package/docs/tr/cli/infra.md +162 -0
  479. package/docs/tr/cli/init.md +24 -1
  480. package/docs/tr/dictionary/html.md +173 -5
  481. package/docs/tr/dictionary/markdown.md +263 -1
  482. package/docs/tr/intlayer_with_analog.md +23 -1
  483. package/docs/tr/intlayer_with_angular_19.md +24 -1
  484. package/docs/tr/intlayer_with_angular_21.md +24 -1
  485. package/docs/tr/intlayer_with_astro.md +24 -1
  486. package/docs/tr/intlayer_with_astro_lit.md +25 -1
  487. package/docs/tr/intlayer_with_astro_preact.md +26 -1
  488. package/docs/tr/intlayer_with_astro_react.md +26 -1
  489. package/docs/tr/intlayer_with_astro_solid.md +26 -1
  490. package/docs/tr/intlayer_with_astro_svelte.md +25 -1
  491. package/docs/tr/intlayer_with_astro_vue.md +25 -1
  492. package/docs/tr/intlayer_with_remix_3.md +22 -1
  493. package/docs/tr/self_hosting.md +410 -234
  494. package/docs/uk/benchmark/nextjs.md +13 -13
  495. package/docs/uk/benchmark/solid.md +5 -5
  496. package/docs/uk/benchmark/svelte.md +4 -4
  497. package/docs/uk/benchmark/tanstack.md +14 -13
  498. package/docs/uk/benchmark/vue.md +5 -5
  499. package/docs/uk/chrome_extension.md +130 -0
  500. package/docs/uk/cli/index.md +6 -1
  501. package/docs/uk/cli/infra.md +162 -0
  502. package/docs/uk/cli/init.md +24 -1
  503. package/docs/uk/dictionary/html.md +173 -5
  504. package/docs/uk/dictionary/markdown.md +263 -1
  505. package/docs/uk/intlayer_with_analog.md +23 -1
  506. package/docs/uk/intlayer_with_angular_19.md +24 -1
  507. package/docs/uk/intlayer_with_angular_21.md +24 -1
  508. package/docs/uk/intlayer_with_astro.md +24 -1
  509. package/docs/uk/intlayer_with_astro_lit.md +25 -1
  510. package/docs/uk/intlayer_with_astro_preact.md +26 -1
  511. package/docs/uk/intlayer_with_astro_react.md +26 -1
  512. package/docs/uk/intlayer_with_astro_solid.md +26 -1
  513. package/docs/uk/intlayer_with_astro_svelte.md +25 -1
  514. package/docs/uk/intlayer_with_astro_vue.md +25 -1
  515. package/docs/uk/intlayer_with_remix_3.md +22 -1
  516. package/docs/uk/self_hosting.md +413 -238
  517. package/docs/vi/benchmark/nextjs.md +13 -13
  518. package/docs/vi/benchmark/solid.md +5 -5
  519. package/docs/vi/benchmark/svelte.md +4 -4
  520. package/docs/vi/benchmark/tanstack.md +14 -13
  521. package/docs/vi/benchmark/vue.md +5 -5
  522. package/docs/vi/chrome_extension.md +130 -0
  523. package/docs/vi/cli/index.md +6 -1
  524. package/docs/vi/cli/infra.md +162 -0
  525. package/docs/vi/cli/init.md +24 -1
  526. package/docs/vi/dictionary/html.md +173 -5
  527. package/docs/vi/dictionary/markdown.md +263 -1
  528. package/docs/vi/intlayer_with_analog.md +23 -1
  529. package/docs/vi/intlayer_with_angular_19.md +24 -1
  530. package/docs/vi/intlayer_with_angular_21.md +24 -1
  531. package/docs/vi/intlayer_with_astro.md +24 -1
  532. package/docs/vi/intlayer_with_astro_lit.md +25 -1
  533. package/docs/vi/intlayer_with_astro_preact.md +26 -1
  534. package/docs/vi/intlayer_with_astro_react.md +26 -1
  535. package/docs/vi/intlayer_with_astro_solid.md +26 -1
  536. package/docs/vi/intlayer_with_astro_svelte.md +25 -1
  537. package/docs/vi/intlayer_with_astro_vue.md +25 -1
  538. package/docs/vi/intlayer_with_remix_3.md +22 -1
  539. package/docs/vi/self_hosting.md +408 -234
  540. package/docs/zh/benchmark/nextjs.md +13 -13
  541. package/docs/zh/benchmark/solid.md +5 -5
  542. package/docs/zh/benchmark/svelte.md +4 -4
  543. package/docs/zh/benchmark/tanstack.md +14 -13
  544. package/docs/zh/benchmark/vue.md +5 -5
  545. package/docs/zh/chrome_extension.md +130 -0
  546. package/docs/zh/cli/index.md +6 -1
  547. package/docs/zh/cli/infra.md +162 -0
  548. package/docs/zh/cli/init.md +24 -1
  549. package/docs/zh/dictionary/html.md +172 -5
  550. package/docs/zh/dictionary/markdown.md +262 -1
  551. package/docs/zh/intlayer_with_analog.md +23 -1
  552. package/docs/zh/intlayer_with_angular_19.md +24 -1
  553. package/docs/zh/intlayer_with_angular_21.md +24 -1
  554. package/docs/zh/intlayer_with_astro.md +24 -1
  555. package/docs/zh/intlayer_with_astro_lit.md +25 -1
  556. package/docs/zh/intlayer_with_astro_preact.md +26 -1
  557. package/docs/zh/intlayer_with_astro_react.md +26 -1
  558. package/docs/zh/intlayer_with_astro_solid.md +26 -1
  559. package/docs/zh/intlayer_with_astro_svelte.md +25 -1
  560. package/docs/zh/intlayer_with_astro_vue.md +25 -1
  561. package/docs/zh/intlayer_with_remix_3.md +22 -1
  562. package/docs/zh/self_hosting.md +410 -237
  563. package/legal/ar/privacy_notice.md +9 -3
  564. package/legal/de/privacy_notice.md +9 -3
  565. package/legal/en/privacy_notice.md +10 -3
  566. package/legal/en-GB/privacy_notice.md +9 -3
  567. package/legal/es/privacy_notice.md +9 -3
  568. package/legal/fr/privacy_notice.md +9 -3
  569. package/legal/hi/privacy_notice.md +9 -3
  570. package/legal/id/privacy_notice.md +9 -3
  571. package/legal/it/privacy_notice.md +9 -3
  572. package/legal/ja/privacy_notice.md +9 -3
  573. package/legal/ko/privacy_notice.md +9 -3
  574. package/legal/pl/privacy_notice.md +9 -3
  575. package/legal/pt/privacy_notice.md +9 -3
  576. package/legal/ru/privacy_notice.md +9 -3
  577. package/legal/tr/privacy_notice.md +9 -3
  578. package/legal/uk/privacy_notice.md +9 -3
  579. package/legal/vi/privacy_notice.md +9 -3
  580. package/legal/zh/privacy_notice.md +9 -3
  581. package/package.json +1 -1
  582. package/src/generated/docs.entry.ts +40 -40
  583. package/docs/ar/roadmap.md +0 -321
  584. package/docs/de/roadmap.md +0 -322
  585. package/docs/en/intlayer_with_astro_vanilla.md +0 -713
  586. package/docs/en/roadmap.md +0 -325
  587. package/docs/en-GB/roadmap.md +0 -322
  588. package/docs/es/roadmap.md +0 -322
  589. package/docs/fr/roadmap.md +0 -322
  590. package/docs/hi/roadmap.md +0 -322
  591. package/docs/id/roadmap.md +0 -325
  592. package/docs/it/roadmap.md +0 -322
  593. package/docs/ja/roadmap.md +0 -322
  594. package/docs/ko/roadmap.md +0 -322
  595. package/docs/pl/roadmap.md +0 -325
  596. package/docs/pt/roadmap.md +0 -322
  597. package/docs/ru/roadmap.md +0 -322
  598. package/docs/tr/roadmap.md +0 -325
  599. package/docs/uk/roadmap.md +0 -325
  600. package/docs/vi/roadmap.md +0 -325
  601. package/docs/zh/roadmap.md +0 -322
@@ -0,0 +1,361 @@
1
+ ---
2
+ createdAt: 2026-09-13
3
+ updatedAt: 2026-09-13
4
+ title: "vue-i18n vs Intlayer: бенчмарк 2026"
5
+ description: vue-i18n та Intlayer, виміряні на одному й тому самому застосунку Vite + Vue 3. Розмір бібліотеки, JavaScript на сторінку, витік контенту, розмір компонентів і реактивність перемикання локалі, з поясненням цифр.
6
+ keywords:
7
+ - vue-i18n
8
+ - Intlayer
9
+ - Internationalization
10
+ - i18n
11
+ - Benchmark
12
+ - Bundle size
13
+ - Blog
14
+ - Vue
15
+ - Nuxt
16
+ - Vite
17
+ - JavaScript
18
+ slugs:
19
+ - blog
20
+ - vue-i18n-vs-intlayer-benchmark
21
+ author: aymericzip
22
+ ---
23
+
24
+ # vue-i18n VS Intlayer | Бенчмарк інтернаціоналізації (i18n) для Vue
25
+
26
+ `vue-i18n` — еталонна i18n-бібліотека для Vue. Intlayer — альтернатива на основі компілятора з контентом, обмеженим областю компонента, та інтеграцією з Vue (`vue-intlayer`). Ми вже порівнювали їхні [можливості та досвід розробника](https://intlayer.org/blog/vue-i18n-vs-intlayer). Ця стаття розглядає, скільки коштує кожна з них після збірки застосунку.
27
+
28
+ Дані взято з [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom), open-source набору, який збирає один і той самий застосунок із кожною бібліотекою та записує, що браузер насправді завантажує й виконує.
29
+
30
+ <TOC/>
31
+
32
+ > **tl;dr**: На одному й тому самому застосунку Vite + Vue 3 `vue-i18n` віддає **134,9 КБ** gzip-стисненого JavaScript на сторінку проти **41,3 КБ** для застосунку без i18n. Intlayer віддає **57,1 КБ**. Сам лише рантайм `vue-i18n` важить **24,3 КБ gzip** (у 6 разів більше за 3,9 КБ Intlayer), кожна сторінка несе **90 % рядків чужих сторінок**, а компонент, скомпільований ізольовано, тягне за собою **196 КБ**, бо прив'язаний до глобального дерева повідомлень. Адаптер `@intlayer/vue-i18n` зберігає API `vue-i18n` і показав **47,0 КБ** на сторінку.
33
+
34
+ ## Коротко
35
+
36
+ - **vue-i18n** — де-факто i18n-бібліотека для Vue 2 / Vue 3 та ядро `@nuxtjs/i18n`. Повідомлення в стилі ICU, блоки `<i18n>` у SFC, директива `v-t`, форматери `d()` / `n()`, велика екосистема. Повідомлення реєструються на глобальному екземплярі під час `createI18n()`; ліниве завантаження за локаллю — це ручний патерн із `setLocaleMessage()`, а розбиття за маршрутами вам потрібно будувати самостійно.
37
+ - **Intlayer** — модель контенту, орієнтована на компоненти. Словники `.content.ts` лежать поруч із компонентом, який вони обслуговують, компілятор на етапі збірки (`vite-intlayer`) виконує tree-shaking і ліниве завантаження за компонентами та локалями, суворі типи TypeScript генеруються з вашого контенту, а відсутні переклади спричиняють помилку на етапі збірки. Містить хелпери для роутера / SEO, Visual Editor / CMS та переклад за допомогою ШІ.
38
+
39
+ | Бібліотека | Зірки GitHub | Усього комітів | Останній коміт | Перша версія | Версія NPM | Завантаження NPM |
40
+ | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
41
+ | `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) |
42
+ | `intlify/vue-i18n` | [![GitHub Repo stars](https://img.shields.io/github/stars/intlify/vue-i18n?style=for-the-badge&label=%E2%AD%90%20stars)](https://github.com/intlify/vue-i18n/stargazers) | [![GitHub commit activity](https://img.shields.io/github/commit-activity/t/intlify/vue-i18n?style=for-the-badge&label=commits)](https://github.com/intlify/vue-i18n/commits) | [![Last Commit](https://img.shields.io/github/last-commit/intlify/vue-i18n?style=for-the-badge)](https://github.com/intlify/vue-i18n/commits) | Груд 2016 | [![npm](https://img.shields.io/npm/v/vue-i18n?style=for-the-badge)](https://www.npmjs.com/package/vue-i18n) | [![npm downloads](https://img.shields.io/npm/dm/vue-i18n?style=for-the-badge)](https://www.npmjs.com/package/vue-i18n) |
43
+
44
+ > Бейджі оновлюються автоматично. Знімки змінюватимуться з часом.
45
+
46
+ ## Порівняння можливостей пліч-о-пліч
47
+
48
+ | Можливість | `vue-intlayer` (Intlayer) | `vue-i18n` |
49
+ | ------------------------------------------------------ | ------------------------------------------------------------- | --------------------------------------------------------------------------------- |
50
+ | **Переклади поруч із компонентами** | ✅ Так, `.content.ts` розташовано поруч із кожним компонентом | ✅ Через блоки SFC `<i18n>` (опційно); зазвичай використовують глобальні каталоги |
51
+ | **Інтеграція з TypeScript** | ✅ Суворі типи автоматично генеруються з контенту | ✅ Гарні типи; сувора безпека ключів потребує типізації схеми та дисципліни |
52
+ | **Виявлення відсутніх перекладів** | ✅ Помилка TypeScript + помилка/попередження під час збірки | ⚠️ Fallback під час виконання + попередження в консолі |
53
+ | **Багатий контент (компоненти / Markdown)** | ✅ Пряма підтримка | ⚠️ Інтерполяція компонентів `<i18n-t>`; Markdown через зовнішні плагіни |
54
+ | **Підтримка ICU** | ⚠️ У роботі | ✅ Так |
55
+ | **Форматування (дати, числа, валюти)** | ✅ Форматери на основі Intl | ✅ `d()` / `n()` із `datetimeFormats` / `numberFormats` |
56
+ | **Локалізована маршрутизація** | ✅ Хелпери для Vue Router / Nuxt, `getMultilingualUrls` | ⚠️ Не в ядрі (`@nuxtjs/i18n` або власне налаштування роутера) |
57
+ | **SEO-хелпери (hreflang, sitemap, robots)** | ✅ Вбудовані хелпери | ❌ Не в ядрі |
58
+ | **Tree-shaking (віддавати лише використаний контент)** | ✅ За компонентами, за локалями, автоматично компілятором | ⚠️ Вручну: розбивати каталоги, `setLocaleMessage()` на кожен маршрут |
59
+ | **Ліниве завантаження** | ✅ `importMode: 'dynamic'` (один рядок конфігурації) | ✅ Ручний `import()` + `setLocaleMessage()` |
60
+ | **Очищення невикористаного контенту** | ✅ Мертві словники видаляються на етапі збірки | ❌ Не вбудовано |
61
+ | **Перевірка відсутніх перекладів (CLI / CI)** | ✅ `npx intlayer content test` | ⚠️ Сторонні інструменти (`vue-i18n-extract`) |
62
+ | **Переклад за допомогою ШІ** | ✅ Вбудований, використовує ваші власні ключі провайдера | ❌ Ні |
63
+ | **Visual Editor / CMS** | ✅ Безкоштовний Visual Editor + опційна CMS | ❌ Ні (зовнішні платформи локалізації) |
64
+ | **MCP-сервер і Agent Skills** | ✅ Так | ❌ Ні |
65
+ | **Екосистема / спільнота** | ⚠️ Менша, але швидко зростає | ✅ Велика та зріла в екосистемі Vue |
66
+
67
+ ## Бенчмарк
68
+
69
+ ### Що вимірювалося
70
+
71
+ Набір [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) збирає **один і той самий застосунок Vite + Vue 3** з кожною бібліотекою: **10 сторінок** (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), **10 локалей** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), однакові компоненти та однаковий контент. Сторінки вимірюються в `en` та `fr`.
72
+
73
+ Обидві бібліотеки тестувалися в конфігурації **static** — тій, з якою виходить більшість Vue-проєктів: для `vue-i18n` JSON кожної локалі імпортується та передається в `createI18n({ messages })`; для Intlayer — `importMode: 'static'` за замовчуванням. У цьому режимі Intlayer також пакує всі локалі, але компілятор і далі обмежує контент **за компонентами**, тож сторінка несе лише словники тих компонентів, які вона рендерить.
74
+
75
+ Для кожної збірки набір записує:
76
+
77
+ - **Lib size**: gzip-розмір порожнього компонента, який лише імпортує i18n-бібліотеку. Фіксована вартість рантайму.
78
+ - **Page JS**: gzip JavaScript, що завантажується на сторінку, усереднений за всіма сторінками та локалями.
79
+ - **Locale leak %**: частка перекладених рядків у завантаженому JS, які належать до локалі, яку користувач **не** переглядає (відбитки за `en` та `fr`, тож 50 % означає «інша вимірювана локаль присутня повністю»; за 10 запакованих локалей реальні втрати вищі).
80
+ - **Page leak %**: частка перекладених рядків у завантаженому JS, які належать до сторінки, на якій користувач **не** перебуває.
81
+ - **Component avg**: середній gzip-розмір кожного компонента, скомпільованого ізольовано. Показує, скільки i18n-рантайму та каталогу тягне за собою один компонент.
82
+ - **E2E reactivity**: реальний час між вибором нової локалі та оновленням `html[lang]` у DOM (Playwright, 5 ітерацій).
83
+ - **Page load**: `PerformanceNavigationTiming.duration`.
84
+
85
+ > Цифри нижче взято з прогону від **2026-09-12** із `vue-i18n` 11.4.0 та `intlayer` 9.5.0 / 9.5.1. Тестовий застосунок навмисно невеликий (кілька десятків рядків на локаль), тому відсотки витоку описують **закономірність**: вони зростають разом із вашим контентом, тоді як вартість рантайму залишається фіксованою.
86
+
87
+ ### Результати на Vite + Vue 3
88
+
89
+ | Бібліотека | Стратегія | Lib size (gz) | Lib size (min) | Page JS сер. (gz) | Locale leak | Page leak | Component сер. (gz) | Реактивність E2E | Page load |
90
+ | ----------------------------- | --------- | ------------: | -------------: | ----------------: | ----------: | --------: | ------------------: | ---------------: | --------: |
91
+ | **base** (без i18n) | - | 0,0 КБ | 0,0 КБ | 41,3 КБ | 0,0 % | - | 1,1 КБ | 1,8 мс | 10,8 мс |
92
+ | `vue-i18n` | static | 24,3 КБ | 83,2 КБ | 134,9 КБ | 50,0 % | 90,0 % | 196,0 КБ | 2,8 мс | 13,6 мс |
93
+ | **`vue-intlayer`** | static | **3,9 КБ** | **11,1 КБ** | **57,1 КБ** | 56,8 % | **0,0 %** | **7,7 КБ** | **4,5 мс** | 13,8 мс |
94
+ | `@intlayer/vue-i18n` (compat) | static | 7,9 КБ | 23,2 КБ | 47,0 КБ | 15,0 % | 0,0 % | 8,4 КБ | 1,5 мс | 9,3 мс |
95
+
96
+ > Стовпець page-leak для базового застосунку залишено порожнім: без i18n-бібліотеки зняття відбитків підхоплює жорстко закодовані рядки в спільних чанках, і число не має сенсу.
97
+
98
+ **Як це читати**
99
+
100
+ - **Вартість рантайму.** `vue-i18n` — один із найважчих рантаймів у всьому бенчмарку: **24,3 КБ gzip / 83,2 КБ у мініфікованому вигляді** для порожнього компонента, який лише його імпортує. `vue-intlayer` коштує 3,9 КБ gzip. Цей розрив оплачується на кожній сторінці незалежно від того, скільки у вас рядків.
101
+ - **JavaScript на сторінку.** Застосунок без i18n важить 41,3 КБ. `vue-i18n` збільшує його більш ніж утричі — до **134,9 КБ**; Intlayer виходить на **57,1 КБ**, +15,8 КБ, більша частина з яких — десять запакованих локалей (див. наступний пункт).
102
+ - **Витік.** Із `createI18n({ messages: { en, fr, ... } })` кожна сторінка віддає всі локалі та рядки всіх сторінок: **50 % витоку локалей** (за двома вимірюваними локалями) та **90 % витоку сторінок**. Режим `static` в Intlayer також пакує всі локалі (звідси порівнянний показник витоку локалей), але дає **0 % витоку сторінок**: сторінка підтягує лише словники тих компонентів, які рендерить. Перехід на `importMode: 'dynamic'` прибирає й витік локалей; ця конфігурація не входила до цього прогону для Vue.
103
+ - **Розмір компонентів — те місце, де проявляється архітектура.** Компонент, що викликає `useI18n()`, компілюється в середньому у **196 КБ**, бо `t()` прив'язаний до глобального екземпляра, який тримає всі повідомлення всіх локалей. Той самий компонент із `useIntlayer()` компілюється у **7,7 КБ**: він звертається лише до свого словника.
104
+ - **Реактивність** не є проблемою для жодної з них (2–5 мс). Система реактивності Vue робить перемикання локалі дешевим, щойно повідомлення опиняються в пам'яті.
105
+ - **`@intlayer/vue-i18n`**, drop-in адаптер, зберігає API `vue-i18n` і показав **47,0 КБ на сторінку** та **8,4 КБ на компонент**, при цьому код застосунку не змінювався.
106
+
107
+ > Для довідки: той самий прогін виміряв `fluent-vue` на рівні 171,8 КБ на сторінку, 29,7 КБ рантайму та 217 КБ на компонент.
108
+
109
+ ## Звідки розрив? Глобальний екземпляр проти скомпільованих словників
110
+
111
+ `vue-i18n` — це рантайм. `createI18n()` створює глобальний екземпляр, що зберігає дерево повідомлень для кожної локалі; `useI18n()` прив'язує до нього кожен компонент; `t("footer.github")` шукає ключ під час рендеру. Саме це уможливлює блоки SFC `<i18n>`, `v-t` та завантаження повідомлень під час виконання, і саме тому граф залежностей кожного компонента містить усе дерево:
112
+
113
+ ```bash
114
+ .
115
+ ├── locales
116
+ │ ├── en.json
117
+ │ ├── fr.json
118
+ │ └── ... # один файл на локаль, усі сторінки всередині
119
+ └── src
120
+ ├── i18n.ts # createI18n({ messages: { en, fr, ... } })
121
+ ├── main.ts
122
+ └── components
123
+ └── Footer.vue # const { t } = useI18n(); t("footer.github")
124
+ ```
125
+
126
+ Оптимізація означає, що **ви** розбиваєте `en.json` на файли за маршрутами, **ви** викликаєте `setLocaleMessage()` у guard роутера і **ви** підтримуєте коректність відповідності маршрутів файлам у міру переміщення компонентів. Рантайм не може зробити це за вас, бо не знає, які ключі запитає компонент.
127
+
128
+ Intlayer переносить це знання на етап збірки. Контент оголошується поруч із компонентом, а `vite-intlayer` визначає, який компонент імпортує який словник:
129
+
130
+ ```bash
131
+ .
132
+ ├── intlayer.config.ts
133
+ └── src
134
+ ├── main.ts # createApp(App).use(intlayer)
135
+ └── components
136
+ └── Footer
137
+ ├── Footer.vue # useIntlayer("footer")
138
+ └── Footer.content.ts
139
+ ```
140
+
141
+ Компілятор генерує для кожного словника та кожної локалі рівно той JSON, який потрібен цьому компоненту, і відкидає словники, які ніхто не імпортує. Обмеження за маршрутами — наслідок обмеження за компонентами, а не окреме завдання.
142
+
143
+ > Щоб також відкинути невикористані локалі, встановіть `dictionary.importMode: 'dynamic'` в `intlayer.config.ts`. Див. [документацію з оптимізації бандла](https://intlayer.org/doc/concept/bundle-optimization).
144
+
145
+ ## Досвід розробника
146
+
147
+ ### Налаштування
148
+
149
+ **vue-i18n**
150
+
151
+ ```ts fileName="src/i18n.ts"
152
+ import { createI18n } from "vue-i18n";
153
+ import en from "../locales/en.json";
154
+ import fr from "../locales/fr.json";
155
+
156
+ export const i18n = createI18n({
157
+ legacy: false,
158
+ locale: "en",
159
+ fallbackLocale: "en",
160
+ messages: { en, fr },
161
+ });
162
+ ```
163
+
164
+ ```ts fileName="src/main.ts"
165
+ import { createApp } from "vue";
166
+ import App from "./App.vue";
167
+ import router from "./router";
168
+ import { i18n } from "./i18n";
169
+
170
+ createApp(App).use(router).use(i18n).mount("#app");
171
+ ```
172
+
173
+ **Intlayer**
174
+
175
+ ```ts fileName="intlayer.config.ts"
176
+ import { type IntlayerConfig, Locales } from "intlayer";
177
+
178
+ const config: IntlayerConfig = {
179
+ internationalization: {
180
+ locales: [Locales.ENGLISH, Locales.FRENCH],
181
+ defaultLocale: Locales.ENGLISH,
182
+ },
183
+ };
184
+
185
+ export default config;
186
+ ```
187
+
188
+ ```ts fileName="vite.config.ts"
189
+ import { defineConfig } from "vite";
190
+ import vue from "@vitejs/plugin-vue";
191
+ import { intlayer } from "vite-intlayer";
192
+
193
+ export default defineConfig({
194
+ plugins: [intlayer(), vue()],
195
+ });
196
+ ```
197
+
198
+ ```ts fileName="src/main.ts"
199
+ import { createApp } from "vue";
200
+ import { intlayer } from "vue-intlayer";
201
+ import App from "./App.vue";
202
+ import router from "./router";
203
+
204
+ createApp(App).use(intlayer).use(router).mount("#app");
205
+ ```
206
+
207
+ ### Компонент
208
+
209
+ **vue-i18n**
210
+
211
+ ```json fileName="locales/en.json"
212
+ {
213
+ "counter": {
214
+ "label": "Counter",
215
+ "increment": "Increment"
216
+ }
217
+ }
218
+ ```
219
+
220
+ ```vue fileName="src/components/Counter.vue"
221
+ <script setup lang="ts">
222
+ import { ref } from "vue";
223
+ import { useI18n } from "vue-i18n";
224
+
225
+ const { t, n } = useI18n();
226
+ const count = ref(0);
227
+ </script>
228
+
229
+ <template>
230
+ <div>
231
+ <p>{{ n(count) }}</p>
232
+ <button :aria-label="t('counter.label')" @click="count++">
233
+ {{ t("counter.increment") }}
234
+ </button>
235
+ </div>
236
+ </template>
237
+ ```
238
+
239
+ `t('counter.label')` залишається рядком, доки ви самі не типізуєте схему повідомлень; одруківка відрендерить ключ.
240
+
241
+ **Intlayer**
242
+
243
+ ```ts fileName="src/components/Counter/Counter.content.ts"
244
+ import { t, type Dictionary } from "intlayer";
245
+
246
+ const counterContent = {
247
+ key: "counter",
248
+ content: {
249
+ label: t({ en: "Counter", fr: "Compteur" }),
250
+ increment: t({ en: "Increment", fr: "Incrémenter" }),
251
+ },
252
+ } satisfies Dictionary;
253
+
254
+ export default counterContent;
255
+ ```
256
+
257
+ ```vue fileName="src/components/Counter/Counter.vue"
258
+ <script setup lang="ts">
259
+ import { ref } from "vue";
260
+ import { useIntlayer } from "vue-intlayer";
261
+ import { useNumber } from "vue-intlayer/format";
262
+
263
+ const { label, increment } = useIntlayer("counter");
264
+ const number = useNumber();
265
+ const count = ref(0);
266
+ </script>
267
+
268
+ <template>
269
+ <div>
270
+ <p>{{ number.value(count) }}</p>
271
+ <button :aria-label="label" @click="count++">
272
+ {{ increment }}
273
+ </button>
274
+ </div>
275
+ </template>
276
+ ```
277
+
278
+ `label` та `increment` типізовані; одруківка — це помилка TypeScript, відсутнє французьке значення — помилка збірки.
279
+
280
+ ### Ліниве завантаження за локаллю
281
+
282
+ **vue-i18n**
283
+
284
+ ```ts fileName="src/i18n.ts"
285
+ import { nextTick } from "vue";
286
+ import { createI18n } from "vue-i18n";
287
+
288
+ export const i18n = createI18n({
289
+ legacy: false,
290
+ locale: "en",
291
+ fallbackLocale: "en",
292
+ });
293
+
294
+ export const loadLocaleMessages = async (locale: string) => {
295
+ const messages = await import(`../locales/${locale}.json`);
296
+ i18n.global.setLocaleMessage(locale, messages.default);
297
+ await nextTick();
298
+ i18n.global.locale.value = locale;
299
+ };
300
+ ```
301
+
302
+ Потім викличте `loadLocaleMessages()` із guard роутера та самостійно розбийте `locales/{locale}.json` за маршрутами, якщо хочете обмеження за сторінками.
303
+
304
+ **Intlayer**
305
+
306
+ ```ts fileName="intlayer.config.ts"
307
+ const config: IntlayerConfig = {
308
+ // ...
309
+ dictionary: {
310
+ importMode: "dynamic",
311
+ },
312
+ };
313
+ ```
314
+
315
+ ## Збережіть API vue-i18n, отримайте результат Intlayer
316
+
317
+ `@intlayer/vue-i18n` — це drop-in адаптер: `useI18n()`, `t()`, `d()`, `n()`, інтерполяція `{name}` та `{0}`, множина через pipe (`"car | cars"`), `v-t` та `i18n.global.locale` продовжують працювати, але обслуговуються зі словників Intlayer, скомпільованих `vite-intlayer`.
318
+
319
+ ```ts fileName="vite.config.ts"
320
+ import { defineConfig } from "vite";
321
+ import vue from "@vitejs/plugin-vue";
322
+ import vueI18nVitePlugin from "@intlayer/vue-i18n/plugin";
323
+
324
+ export default defineConfig({
325
+ plugins: [vue(), vueI18nVitePlugin()],
326
+ });
327
+ ```
328
+
329
+ У бенчмарку compat-збірка того самого застосунку зменшилася зі **134,9 КБ до 47,0 КБ** на сторінку та зі **196 КБ до 8,4 КБ** на компонент, при цьому компоненти не змінювалися. Ваші наявні `locales/{locale}.json` можуть залишатися джерелом істини через плагін синхронізації JSON.
330
+
331
+ Див. [посібник із міграції з vue-i18n](https://intlayer.org/doc/migration/vue-i18n) та [документацію із сумісності](https://intlayer.org/doc/compatibility/vue-i18n). Користувачі Nuxt мають той самий шлях через [сумісність із `@nuxtjs/i18n`](https://intlayer.org/doc/compatibility/nuxtjs-i18n).
332
+
333
+ ## Коли що обирати?
334
+
335
+ - **Обирайте vue-i18n**, якщо вам потрібен стандартний підхід Vue, ви покладаєтеся на ICU-повідомлення або блоки SFC `<i18n>`, уже використовуєте `@nuxtjs/i18n` або платформа перекладу очікує централізований JSON. Закладіть час на розбиття каталогів і ліниве завантаження за маршрутами, якщо розмір бандла має значення.
336
+ - **Обирайте Intlayer**, якщо вам потрібні **контент, обмежений компонентом**, **суворий TypeScript**, **помилки відсутніх ключів на етапі збірки**, **tree-shaking і ліниве завантаження без зусиль** та вбудовані редакторські інструменти (Visual Editor, CMS, ШІ-переклад, MCP-сервер). Особливо актуально для великих модульних кодових баз Vue / Nuxt та дизайн-систем.
337
+ - **Обирайте `@intlayer/vue-i18n`**, якщо ви вже на `vue-i18n` і хочете виграш у розмірі бандла без переписування.
338
+
339
+ ## Пов'язані порівняння
340
+
341
+ - [next-intl vs Intlayer](https://intlayer.org/blog/next-intl-vs-intlayer) (той самий бенчмарк)
342
+ - [i18next vs Intlayer](https://intlayer.org/blog/i18next-vs-intlayer) (той самий бенчмарк)
343
+ - [Lingui vs Intlayer](https://intlayer.org/blog/lingui-vs-intlayer) (той самий бенчмарк)
344
+ - [vue-i18n vs Intlayer (можливості та DX)](https://intlayer.org/blog/vue-i18n-vs-intlayer)
345
+ - [Чи застарів vue-i18n?](https://intlayer.org/blog/is-vue-i18n-outdated)
346
+
347
+ ## Зірки GitHub
348
+
349
+ Зірки GitHub — сильний індикатор популярності проєкту, довіри спільноти та довгострокової актуальності. Хоча вони не є прямою мірою технічної якості, вони відображають, скільки розробників вважають проєкт корисним, стежать за його розвитком і, ймовірно, використовуватимуть його.
350
+
351
+ [![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)
352
+
353
+ ## Висновок
354
+
355
+ `vue-i18n` — зріла, гнучка та глибоко інтегрована з Vue бібліотека. Бенчмарк показує, скільки коштує її runtime-first дизайн у збірці Vite: **рантайм 24 КБ gzip**, **134,9 КБ на сторінку** для застосунку, який важить 41 КБ без i18n, **90 % контенту чужих сторінок** на кожній сторінці та компоненти, кожен із яких сягає **196 КБ**, бо висить на глобальному дереві повідомлень.
356
+
357
+ Intlayer переносить роботу в компілятор. Словники за компонентами та очищення мертвого контенту — це результати збірки, а не домовленості. На тому самому застосунку: **рантайм 3,9 КБ**, **57,1 КБ на сторінку**, **0 % витоку сторінок**, компоненти **у 25 разів менші**. А якщо переписування не розглядається, `@intlayer/vue-i18n` проходить більшу частину шляху, не торкаючись компонентів.
358
+
359
+ Усі сирі дані, тестові застосунки та скрипти знаходяться в [репозиторії Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Запустіть його самі.
360
+
361
+ Докладніше див. у документі [«Чому Intlayer?»](https://intlayer.org/doc/why).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2026-09-13
3
- updatedAt: 2026-09-13
3
+ updatedAt: 2026-09-22
4
4
  title: "i18next vs @intlayer/i18next: Cùng API, Khác biệt Bundle"
5
5
  description: "Những thay đổi khi ứng dụng React hoặc Next.js giữ nguyên các lệnh gọi i18next, react-i18next và next-i18next nhưng phục vụ chúng thông qua các adapter @intlayer/i18next. JavaScript mỗi trang, kích thước component, rò rỉ chuỗi và quá trình hydrate được đo trên cùng một mã nguồn, cùng với những gì adapter giữ lại, bỏ qua và không thể thay thế."
6
6
  keywords:
@@ -28,6 +28,8 @@ author: aymericzip
28
28
 
29
29
  # i18next VS @intlayer/i18next | Cùng API, Khác biệt Bundle
30
30
 
31
+ ![i18next VS Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/assets/i18next-next-intl-intlayer.webp?raw=true)
32
+
31
33
  `@intlayer/i18next`, `@intlayer/react-i18next` và `@intlayer/next-i18next` là các adapter tương thích. Chúng cung cấp API `i18next` mà mã nguồn của bạn đang sử dụng (`useTranslation`, `t()`, `<Trans>`, `i18n.changeLanguage()`, `getFixedT`, `serverSideTranslations`...) và phân phối bản dịch từ các từ điển được biên dịch bởi Intlayer. Các component không hề thay đổi. Runtime bên dưới chúng mới là phần thay đổi.
32
34
 
33
35
  Bài viết này đo lường sự thay thế đó trên cùng một ứng dụng Next.js, được xây dựng một lần với `next-i18next` và một lần với `@intlayer/next-i18next`. Các số liệu đến từ [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Để so sánh `i18next` và Intlayer dưới dạng thư viện, hãy đọc [i18next vs Intlayer](https://intlayer.org/vi/blog/i18next-vs-intlayer). Bài viết này tập trung vào những gì adapter mang lại khi bạn giữ nguyên mã nguồn của mình.
@@ -109,6 +111,10 @@ Bộ kiểm thử [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bl
109
111
 
110
112
  ### Kết quả trên Next.js
111
113
 
114
+ Chọn số liệu và thư viện mà bạn quan tâm:
115
+
116
+ <I18nBenchmark framework="nextjs" vertical/>
117
+
112
118
  | Cấu hình | Chiến lược | Lib size (gz) | Page JS avg (gz) | Locale leak | Page leak | Component avg (gz) | E2E reactivity | Hydration |
113
119
  | ---------------------------- | -------------- | ------------: | ---------------: | ----------: | --------: | -----------------: | -------------: | ----------: |
114
120
  | **base** (không dùng i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
@@ -129,10 +135,21 @@ Bộ kiểm thử [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bl
129
135
  - **Hydration và chuyển đổi ngôn ngữ nhanh hơn.** Thời gian hydrate giảm từ 15.6 ms xuống **11.3 ms** (và từ 27.7 ms ở thiết lập `dynamic`, nơi việc nạp backend nằm trên luồng xử lý quan trọng). Chuyển đổi ngôn ngữ rút ngắn từ 15-16 ms xuống **11-12 ms**.
130
136
  - **Adapter không phải là runtime gốc.** `next-intlayer` chỉ nặng **141.3 KB**, thêm vỏn vẹn +0.3 KB so với ứng dụng gốc không có i18n. Adapter mang theo toàn bộ giao diện API của `i18next` (cú pháp nội suy, giải quyết hậu tố số nhiều và ngữ cảnh, phân tích thẻ `<Trans>`) trên nền tảng lõi Intlayer: 9.4 KB và +9.4 KB mỗi trang so với bản gốc. Đây là giải pháp cầu nối, không phải đích đến cuối cùng.
131
137
 
138
+ <ClickToOpenIframe
139
+ src="https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-nextjs.md"
140
+ width="100%"
141
+ height="600px"
142
+ style="border:none;"
143
+ />
144
+
145
+ > Bảng đầy đủ, từng thư viện và từng chiến lược, trong [báo cáo benchmark Next.js](https://intlayer.org/vi/doc/benchmark/nextjs).
146
+
132
147
  > Adapter `react-i18next` trên Vite / TanStack Start không nằm trong đợt thử nghiệm này. Số liệu cơ sở của `react-i18next` trên TanStack Start có tại [i18next vs Intlayer](https://intlayer.org/vi/blog/i18next-vs-intlayer): 127-184 KB mỗi trang và mất 123-185 ms khi đổi ngôn ngữ với backend tải lười.
133
148
 
134
149
  ## Lý do các con số có sự thay đổi
135
150
 
151
+ ![The Intlayer compiler extracts content from components](https://github.com/aymericzip/intlayer/blob/main/docs/assets/compiler.webp?raw=true)
152
+
136
153
  Không có gì trong thư mục `components/` thay đổi, sự cải thiện đến từ nơi mà `useTranslation` được liên kết.
137
154
 
138
155
  **Với `i18next`**, liên kết hướng tới instance toàn cục. Bất cứ thứ gì được tải vào đó (tất cả các ngôn ngữ trong `static`, toàn bộ namespace của ngôn ngữ đang hoạt động trong `dynamic`) đều có thể được truy cập từ mọi component gọi `useTranslation()`. Trình đóng gói không thể chia nhỏ hơn những gì instance đang nắm giữ, và runtime không thể biết trước component sẽ yêu cầu những khóa nào.
@@ -149,6 +166,10 @@ Không có gì trong thư mục `components/` thay đổi, sự cải thiện đ
149
166
  └── About.tsx # useTranslation(); t("about.title")
150
167
  ```
151
168
 
169
+ Bất cứ thứ gì instance chứa đều được gửi đến mọi trang, và sự lãng phí gia tăng trên hai trục, trang và ngôn ngữ:
170
+
171
+ ![Theoretical content leakage by architecture](https://github.com/aymericzip/intlayer/blob/main/docs/assets/theorical_content_leakage.webp?raw=true)
172
+
152
173
  **Với `@intlayer/next-i18next`**, liên kết hướng tới từ điển. `syncJSON` chuyển đổi từng tệp namespace thành một từ điển; bước tối ưu hóa sẽ cung cấp cho component đúng từ điển mà nó cần, dưới dạng một import mà trình đóng gói có thể theo dõi và chia nhỏ theo từng trang và từng ngôn ngữ.
153
174
 
154
175
  ```bash
@@ -297,26 +318,112 @@ export default defineConfig({
297
318
 
298
319
  ## Những hạn chế cần lưu ý trước khi bắt đầu
299
320
 
300
- - **Backend và detector không hoạt động.** Lệnh gọi `i18n.use(HttpBackend)` chỉ chạy hàm `init` của plugin và không làm gì thêm. Nếu ứng dụng của bạn dựa vào việc tải bản dịch từ một CMS tại runtime, quy trình đó sẽ không còn khả dụng; hãy dùng CMS của Intlayer hoặc các lệnh `intlayer pull` / `push` thay thế.
301
- - **`resources` bị bỏ qua chứ không được gộp vào.** Khác với một số adapter khác, `@intlayer/i18next` không dùng `resources` dạng inline làm phương án dự phòng (fallback). Mọi khóa đều phải tồn tại trong các từ điển được đồng bộ, điều mà `intlayer test` sẽ kiểm tra.
302
- - **App Router yêu cầu chỉnh sửa provider.** Chỉ một tệp duy nhất như hướng dẫn ở trên. Với Pages Router sử dụng `appWithTranslation`, bạn không cần thay đổi gì.
303
- - **`next-i18next.config.js` không được đọc.** Các tùy chọn như `localePath`, `fallbackLng`, `reloadOnPrerender` không có tác dụng; cấu hình ngôn ngữ và fallback đều nằm ở `intlayer.config.ts`.
304
- - **Adapter vẫn tốn một phần dung lượng.** Nó bổ sung 9.4 KB runtime và +9.4 KB mỗi trang so với `next-intlayer`. Khi tất cả các component đã chuyển sang `useIntlayer`, bạn có thể gỡ bỏ adapter này.
321
+ <AccordionGroup>
322
+ <Accordion header="Các backend và trình phát hiện không hoạt động">
323
+
324
+ `i18n.use(HttpBackend)` chỉ gọi init của plugin và không làm gì khác. Nếu ứng dụng của bạn dựa vào việc tìm nạp bản dịch từ CMS tại runtime, luồng đó sẽ không còn nữa; hãy sử dụng [Intlayer CMS](https://intlayer.org/vi/doc/concept/cms) hoặc các lệnh `intlayer pull` / `push` để thay thế. Việc phát hiện ngôn ngữ sẽ trở thành cấu hình định tuyến của Intlayer (tiền tố URL, cookie, tiêu đề).
325
+
326
+ </Accordion>
327
+ <Accordion header="resources bị bỏ qua, không được hợp nhất">
328
+
329
+ Không giống như một số adapter khác, `@intlayer/i18next` không sử dụng `resources` nội tuyến làm phương án dự phòng. Mỗi khóa phải tồn tại trong các từ điển được đồng bộ hóa, điều mà `intlayer test` sẽ xác minh.
330
+
331
+ </Accordion>
332
+ <Accordion header="App Router cần chỉnh sửa provider">
333
+
334
+ Chỉ một tệp, được hiển thị ở trên. Pages Router với `appWithTranslation` không cần làm gì cả.
335
+
336
+ </Accordion>
337
+ <Accordion header="next-i18next.config.js không được đọc">
338
+
339
+ `localePath`, `fallbackLng`, `reloadOnPrerender` và các cấu hình tương tự không có tương đương; ngôn ngữ và dự phòng lấy từ `intlayer.config.ts`.
340
+
341
+ </Accordion>
342
+ <Accordion header="Adapter không miễn phí">
343
+
344
+ 9.4 KB runtime và +9.4 KB mỗi trang so với `next-intlayer`. Khi mọi component đã chuyển sang `useIntlayer`, hãy gỡ bỏ nó.
345
+
346
+ </Accordion>
347
+ </AccordionGroup>
305
348
 
306
349
  ## Khi nào nên sử dụng giải pháp nào?
307
350
 
308
- - **Tiếp tục dùng `i18next`** nếu ứng dụng của bạn phụ thuộc hoàn toàn vào các backend runtime (bản dịch do CMS cấp phát ngay lúc có request), vào hệ sinh thái plugin rộng lớn, hoặc trên các nền tảng không phải React mà adapter chưa hỗ trợ.
309
- - **Sử dụng `@intlayer/*`** nếu bạn đang dùng `react-i18next` / `next-i18next` và muốn giảm 68 KB dung lượng, component nhỏ hơn 8 lần, 0% rò rỉ chuỗi, khóa có kiểu dữ liệu an toàn và kiểm tra CI mà không cần viết lại toàn bộ mã nguồn. Đây là bước đệm tối ưu cho một codebase `i18next` hiện hữu.
310
- - **Dùng trực tiếp bản gốc (`next-intlayer` / `react-intlayer`)** cho các dự án mới, hoặc sau khi adapter đã hoàn thành vai trò chuyển tiếp của nó. Đây là lựa chọn nhẹ nhất (5.5 KB, +0.3 KB mỗi trang), hỗ trợ Server Components đồng bộ và các tệp `.content.ts` đặt cùng component.
351
+ <AccordionGroup>
352
+ <Accordion header="Ở lại với i18next">
353
+
354
+ Ứng dụng của bạn phụ thuộc vào các backend tại runtime (bản dịch được phục vụ bởi CMS tại thời điểm yêu cầu), vào hệ sinh thái plugin hoặc vào môi trường không phải React mà các adapter không hỗ trợ.
355
+
356
+ </Accordion>
357
+ <Accordion header="Sử dụng @intlayer/*">
358
+
359
+ Bạn đang dùng `react-i18next` / `next-i18next` và muốn tiết kiệm 68 KB, component nhỏ hơn 8 lần, 0% rò rỉ, khóa có định kiểu và kiểm tra CI mà không cần viết lại mã nguồn. Đây là điểm khởi đầu cho codebase `i18next` hiện có.
360
+
361
+ </Accordion>
362
+ <Accordion header="Chuyển sang native (next-intlayer / react-intlayer)">
363
+
364
+ Dành cho các dự án mới hoặc khi adapter đã hoàn thành nhiệm vụ. Nó có runtime nhẹ nhất (5.5 KB, +0.3 KB mỗi trang) và mở khóa các Server Components đồng bộ cùng các tệp `.content.ts` theo từng component. Bắt đầu với [Intlayer với Next.js](https://intlayer.org/vi/doc/environment/nextjs) hoặc [với Vite và React](https://intlayer.org/vi/doc/environment/vite-and-react).
365
+
366
+ </Accordion>
367
+ </AccordionGroup>
368
+
369
+ ## FAQ
370
+
371
+ <FAQ>
372
+
373
+ <Question title="Khoản tiết kiệm 68 KB đến từ đâu?">
374
+
375
+ Từ `resources: { en, fr, ... }`. Thiết lập cơ bản của `next-i18next` import JSON của mọi ngôn ngữ vào `init()`, do đó mỗi trang mang theo mọi namespace ở mọi ngôn ngữ: **218.5 KB** mỗi trang. Adapter không bao giờ đóng gói khối đó; nó chỉ cung cấp cho mỗi component từ điển được yêu cầu, trong ngôn ngữ hoạt động.
376
+
377
+ </Question>
378
+
379
+ <Question title="Các component <Trans> của tôi có tiếp tục hoạt động không?">
380
+
381
+ Có, với `components`, thẻ được đánh số `<1>...</1>` và `values`. Tương tự với `{{interpolation}}`, lồng `$t(key)`, số nhiều `key_one` / `key_other` (được đánh giá bằng `Intl.PluralRules`), hậu tố ngữ cảnh và `returnObjects`.
382
+
383
+ </Question>
384
+
385
+ <Question title="Điều gì xảy ra nếu tôi sử dụng một tệp translation.json duy nhất cho mỗi ngôn ngữ?">
386
+
387
+ Đặt `splitKeys: false` trong plugin `syncJSON`. Toàn bộ tệp vẫn là một từ điển duy nhất và một lệnh gọi `useTranslation()` đơn giản sẽ tiếp tục phân giải theo nó.
388
+
389
+ </Question>
390
+
391
+ <Question title="Điều này có giống với việc di chuyển hoàn toàn sang Intlayer không?">
392
+
393
+ Không, đây là cầu nối. Adapter giữ nguyên API `i18next` và tốn 9.4 KB runtime; `next-intlayer` native chỉ tốn 5.5 KB và bổ sung các Server Components đồng bộ cùng các tệp `.content.ts` đặt cùng vị trí. Bạn có thể di chuyển từng component một vì các từ điển JSON và `.content.ts` cùng tồn tại.
394
+
395
+ </Question>
396
+
397
+ <Question title="Các dịch giả có thể tiếp tục làm việc như hiện nay không?">
398
+
399
+ Có. `locales/{lng}/{ns}.json` vẫn là nguồn chân lý duy nhất: `syncJSON` đọc nó với cú pháp của i18next và ghi các bản dịch trở lại khi CLI hoặc CMS cập nhật.
400
+
401
+ </Question>
402
+
403
+ </FAQ>
311
404
 
312
405
  ## Các bài so sánh liên quan
313
406
 
314
- - [i18next vs Intlayer](https://intlayer.org/vi/blog/i18next-vs-intlayer) (so sánh hai thư viện, cùng bài benchmark)
315
- - [next-intl vs @intlayer/next-intl](https://intlayer.org/vi/blog/next-intl-vs-intlayer-next-intl) (cùng chuỗi bài adapter)
316
- - [Lingui vs @intlayer/lingui](https://intlayer.org/vi/blog/lingui-vs-intlayer-lingui) (cùng chuỗi bài adapter)
317
- - [vue-i18n vs @intlayer/vue-i18n](https://intlayer.org/vi/blog/vue-i18n-vs-intlayer-vue-i18n) (cùng chuỗi bài adapter)
318
- - Hướng dẫn chuyển đổi: [i18next](https://intlayer.org/vi/doc/migration/i18next), [react-i18next](https://intlayer.org/vi/doc/migration/react-i18next), [next-i18next](https://intlayer.org/vi/doc/migration/next-i18next)
319
- - Tài liệu kỹ thuật adapter tương thích: [i18next](https://intlayer.org/vi/doc/compatibility/i18next), [react-i18next](https://intlayer.org/vi/doc/compatibility/react-i18next), [next-i18next](https://intlayer.org/vi/doc/compatibility/next-i18next)
407
+ Cùng loạt adapter:
408
+
409
+ - [next-intl vs @intlayer/next-intl](https://intlayer.org/vi/blog/next-intl-vs-intlayer-next-intl)
410
+ - [Lingui vs @intlayer/lingui](https://intlayer.org/vi/blog/lingui-vs-intlayer-lingui)
411
+ - [vue-i18n vs @intlayer/vue-i18n](https://intlayer.org/vi/blog/vue-i18n-vs-intlayer-vue-i18n)
412
+
413
+ Các thư viện được so sánh trực tiếp:
414
+
415
+ - [i18next vs Intlayer](https://intlayer.org/vi/blog/i18next-vs-intlayer), same benchmark
416
+ - [next-i18next vs next-intl vs Intlayer](https://intlayer.org/vi/blog/next-i18next-vs-next-intl-vs-intlayer)
417
+ - [react-i18next vs react-intl vs Intlayer](https://intlayer.org/vi/blog/react-i18next-vs-react-intl-vs-intlayer)
418
+ - [Is i18next outdated?](https://intlayer.org/vi/blog/is-i18next-outdated)
419
+
420
+ Tài liệu tham khảo:
421
+
422
+ - Compat adapters: [i18next](https://intlayer.org/vi/doc/compatibility/i18next), [react-i18next](https://intlayer.org/vi/doc/compatibility/react-i18next), [next-i18next](https://intlayer.org/vi/doc/compatibility/next-i18next)
423
+ - Migration guides: [i18next](https://intlayer.org/vi/doc/migration/i18next), [react-i18next](https://intlayer.org/vi/doc/migration/react-i18next), [next-i18next](https://intlayer.org/vi/doc/migration/next-i18next)
424
+ - [Next.js benchmark report](https://intlayer.org/vi/doc/benchmark/nextjs) and [TanStack Start benchmark report](https://intlayer.org/vi/doc/benchmark/tanstack)
425
+ - [Bundle optimization](https://intlayer.org/vi/doc/concept/bundle-optimization) and [the Intlayer compiler](https://intlayer.org/vi/doc/compiler)
426
+ - [Visual Editor](https://intlayer.org/vi/doc/concept/editor), [CMS](https://intlayer.org/vi/doc/concept/cms) and [AI translation](https://intlayer.org/vi/doc/concept/auto-fill)
320
427
 
321
428
  ## Kết luận
322
429