@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,288 @@
1
+ ---
2
+ createdAt: 2026-09-13
3
+ updatedAt: 2026-09-13
4
+ title: "vue-i18n vs @intlayer/vue-i18n:相同的 API,不同的 Bundle"
5
+ description: 当 Vue 3 应用保持其 vue-i18n 调用但通过 @intlayer/vue-i18n compat 适配器提供服务时会发生什么变化。在相同的 Vite + Vue 代码上测量的每页 JavaScript、运行时大小、组件大小和泄漏,以及适配器保留、忽略和无法替换的内容。
6
+ keywords:
7
+ - vue-i18n
8
+ - "@intlayer/vue-i18n"
9
+ - Intlayer
10
+ - Compat adapter
11
+ - Migration
12
+ - Internationalization
13
+ - i18n
14
+ - Benchmark
15
+ - Bundle size
16
+ - Blog
17
+ - Vue
18
+ - Nuxt
19
+ - Vite
20
+ slugs:
21
+ - blog
22
+ - vue-i18n-vs-intlayer-vue-i18n
23
+ author: aymericzip
24
+ ---
25
+
26
+ # vue-i18n VS @intlayer/vue-i18n | 相同的 API,不同的 Bundle
27
+
28
+ `@intlayer/vue-i18n` 是一个兼容适配器:它公开了 `vue-i18n` API(`createI18n`、`useI18n`、`t()`、`d()`、`n()`、`$t`、`v-t`、`i18n.global.locale`...),并从 Intlayer 编译的字典中提供服务。你的 `.vue` 文件不会改变。改变的是 `t("footer.github")` 绑定的内容。
29
+
30
+ 本文在同一个 Vite + Vue 3 应用上测量了这个替换,该应用分别使用 `vue-i18n` 和适配器构建。数据来自 [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom)。如需了解 `vue-i18n` 和 Intlayer 作为库的对比,请阅读 [vue-i18n vs Intlayer](https://intlayer.org/blog/vue-i18n-vs-intlayer) 和 [vue-i18n vs Intlayer 基准测试](https://intlayer.org/blog/vue-i18n-vs-intlayer-benchmark)。本文讨论的是当你保持组件不变时,适配器会带来什么改变。
31
+
32
+ <TOC/>
33
+
34
+ > **总结**: 在同一个 Vite + Vue 3 应用中,将 `vue-i18n` 替换为 `@intlayer/vue-i18n` 后,每页 JavaScript 从 **134.9 KB 降至 47.0 KB** gzip(不含 i18n 的应用为 41.3 KB),运行时从 **24.3 KB 降至 7.9 KB**,平均组件从 **196 KB 降至 8.4 KB**,跨页面字符串泄露从 **90% 降至 0%**,且无需编辑任何 `.vue` 文件。`createI18n({ messages })` 仍作为备选方案继续工作;移除 JSON 导入即可获得上述数字。SFC `<i18n>` 块和运行时 `setLocaleMessage()` 这两个功能无法转移。
35
+
36
+ ## 什么是 `@intlayer/vue-i18n`
37
+
38
+ `vue-i18n` 是一个运行时库。`createI18n({ messages: { en, fr, ... } })` 构建一个全局实例,持有每个区域的所有消息;`useI18n()` 将每个组件绑定到它;`t("footer.github")` 在渲染时遍历树。这种设计使得 SFC `<i18n>` 块和 `setLocaleMessage()` 成为可能,同时也是为什么每个组件的依赖图包含整个树的原因。
39
+
40
+ `@intlayer/vue-i18n` 保持 API 并替换树:
41
+
42
+ 1. **导入别名。** `@intlayer/vue-i18n/plugin` 中的 `vueI18nVitePlugin()` 包装 `vite-intlayer` 并添加一个 `resolve.alias`,使得 `vue-i18n` 解析为 `@intlayer/vue-i18n`。没有导入被重命名。
43
+ 2. **JSON 作为真实来源。** `syncJSON` 插件读取你现有的 `locales/{locale}.json`(使用 `format: "vue-i18n"`,以便正确解析 `{name}`、`{0}` 列表插值和 `"car | cars"` 管道复数),当 CLI 或 CMS 更新它们时,会将翻译写回。
44
+ 3. **调用点绑定。** Intlayer 优化通过重写 `useI18n()` 调用点,使组件接收其键名在活跃locale中的字典,作为bundler可以追踪和分割的imports。
45
+
46
+ ```vue fileName="src/components/Footer.vue"
47
+ <!-- 你的代码,保持不变 -->
48
+ <script setup lang="ts">
49
+ import { useI18n } from "vue-i18n";
50
+
51
+ const { t } = useI18n();
52
+ </script>
53
+
54
+ <template>
55
+ <a href="https://github.com/intlayer-org/benchmark-bloom">{{
56
+ t("footer.github")
57
+ }}</a>
58
+ </template>
59
+ ```
60
+
61
+ ```ts fileName="编译器生成的内容 (简化版)"
62
+ import _dicHash_footer from "../.intlayer/dictionaries/footer.mjs";
63
+ import { useDictionary as useI18n } from "@intlayer/vue-i18n";
64
+
65
+ const { t } = useI18n(_dicHash_footer);
66
+ ```
67
+
68
+ 该组件不再访问全局消息树。它只访问 `footer`。这就是为什么下面的组件大小列从 196 KB 下降到 8 KB。
69
+
70
+ ## adapter 保留、忽略和不替换的内容
71
+
72
+ | `vue-i18n` API | 使用 `@intlayer/vue-i18n` |
73
+ | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
74
+ | `useI18n()` → `{ t, d, n, te, tm, rt, locale, availableLocales }` | ✅ 保留。`t` 键针对你的字典进行了类型化 |
75
+ | `t("key", { name })`, `t("key", [a, b])`, `t("key", count)` | ✅ 保留。`{name}`、`{0}` 和管道分隔的复数形式解析方式与以前相同 |
76
+ | `d(date, "long")`, `n(value, "currency")` | ✅ 保留。来自 `createI18n()` 的 `datetimeFormats` / `numberFormats` 得到遵守,由原生 `Intl` 提供支持 |
77
+ | `i18n.global.locale.value = "fr"` | ✅ 保留。由 Intlayer 客户端支持的 `WritableComputedRef`;响应式行为与之前相同 |
78
+ | `$t`, `$tc`, `$te`, `$tm`, `$rt`, `$d`, `$n`, `$i18n`(Options API) | ✅ 保留。由 `app.use(i18n)` 注册到 `app.config.globalProperties` |
79
+ | `v-t` 指令 | ✅ 保留 |
80
+ | `legacy: true` | ✅ 接受 |
81
+ | `createI18n({ messages })` | ⚠️ `messages` 被用作**运行时 fallback**,并会有开发警告。移除 JSON imports 以获得 bundle 优化 |
82
+ | `setLocaleMessage()`, `mergeLocaleMessage()` | ❌ 警告并不执行任何操作。运行时消息加载被构建时字典替代 |
83
+ | SFC `<i18n>` 自定义块 | ❌ 不被读取。将这些消息移入 locale JSON(或组件旁的 `.content.ts`) |
84
+ | `@nuxtjs/i18n` | ⚠️ 独立适配器,请查看 [Nuxt 兼容性文档](https://intlayer.org/doc/compatibility/nuxtjs-i18n) |
85
+
86
+ ## 基准测试
87
+
88
+ ### 测量了什么
89
+
90
+ [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` 中进行测量。
91
+
92
+ 两者都以**静态**配置构建,这是大多数 Vue 项目使用的配置:对于 `vue-i18n`,每个语言环境的 JSON 导入并传递给 `createI18n({ messages })`;对于适配器,使用相同的组件,改变 `vite.config.ts` 和 `intlayer.config.ts` 并移除 `messages` 导入。包含原生 `vue-intlayer` 作为参考。
93
+
94
+ 对于每个构建,套件记录:
95
+
96
+ - **Lib size**: 空组件的 gzip(和压缩后)大小,该组件仅导入 i18n 库。
97
+ - **Page JS**: 每个页面下载的 gzip JavaScript,在所有页面和语言环境中平均。
98
+ - **Locale leak %**: 下载的 JS 中属于用户**未**查看的语言环境的已翻译字符串的份额。
99
+ - **Page leak %**: 下载的 JS 中属于用户**未**访问的页面的已翻译字符串的份额。
100
+ - **Component avg**: 单独编译的每个组件的平均 gzip 大小。
101
+ - **E2E reactivity**: 选择新语言环境和 `html[lang]` 在 DOM 中更新之间的实际时间(Playwright,5 次迭代)。
102
+ - **Page load**: `PerformanceNavigationTiming.duration`。
103
+
104
+ > 下面的数字来自 **2026-09-12** 运行的数据,使用 `vue-i18n` 11.4.0 和 `@intlayer/vue-i18n` 9.5.1。测试应用程序故意很小(每个语言环境只有几十个字符串),所以泄露百分比描述的是一个**模式**:当你的内容增加时,泄露会增长,但运行时成本保持不变。
105
+
106
+ ### Vite + Vue 3 的结果
107
+
108
+ | Setup | Strategy | Lib size (gz) | Lib size (min) | Page JS avg (gz) | Locale leak | Page leak | Component avg (gz) | E2E reactivity | Page load |
109
+ | ------------------------ | -------- | ------------: | -------------: | ---------------: | ----------: | --------: | -----------------: | -------------: | ---------: |
110
+ | **base** (no i18n) | - | 0.0 KB | 0.0 KB | 41.3 KB | 0.0% | - | 1.1 KB | 1.8 ms | 10.8 ms |
111
+ | `vue-i18n` | static | 24.3 KB | 83.2 KB | 134.9 KB | 50.0% | 90.0% | 196.0 KB | 2.8 ms | 13.6 ms |
112
+ | **`@intlayer/vue-i18n`** | static | **7.9 KB** | **23.2 KB** | **47.0 KB** | **15.0%** | **0.0%** | **8.4 KB** | **1.5 ms** | **9.3 ms** |
113
+ | `vue-intlayer` (native) | static | 3.9 KB | 11.1 KB | 57.1 KB | 56.8% | 0.0% | 7.7 KB | 4.5 ms | 13.8 ms |
114
+ | `vue-intlayer` (native) | dynamic | 3.9 KB | 11.1 KB | 59.8 KB | 50.0% | 0.0% | 6.5 KB | 4.0 ms | 15.8 ms |
115
+
116
+ > 基础应用的页面泄漏列为空:没有 i18n 库,指纹识别会在共享块中挑选硬编码的字符串,该数字没有意义。
117
+
118
+ **如何理解它**
119
+
120
+ - **每个页面减少 88 KB,组件相同。** `vue-i18n` 将 41.3 KB 的应用增加到 **134.9 KB**。相同组件的适配器构建落在 **47.0 KB**,比基础应用多 5.7 KB。大多数差异来自 `createI18n({ messages })` 将 74.9 KB 的 `src/locales` 拉入每个页面,而适配器从不将其作为一个块捆绑。
121
+ - **运行时缩小 3 倍。** 仅导入 `vue-i18n` 的空组件成本为 **24.3 KB gzip / 83.2 KB minified**:`@intlify/core-base`、message compiler 和 runtime。adapter 成本为 **7.9 KB / 23.2 KB**,大部分是 Intlayer 的 core 加上 `vue-i18n` API surface。
122
+ - **组件:小 23 倍。** 单独编译的 `useI18n()` 组件平均为 **196 KB**,因为 `t` 绑定到持有每个 locale 所有消息的实例。使用 adapter,相同的组件平均为 **8.4 KB**:它到达自己的字典。
123
+ - **泄漏。** `vue-i18n` 在每个页面上都会打包每个语言环境和每个页面的字符串:50% 的语言环境泄漏(在两个指纹识别的语言环境上;捆绑十个语言环境时实际浪费更高),90% 的页面泄漏。该适配器将页面泄漏降低到 **0%**,因为每个组件只导入其自己的字典。在这次 `static` 运行中,语言环境泄漏为 15%;`importMode: 'dynamic'` 是移除它的设置,该配置不在此 Vue 运行中。
124
+ - **响应性和页面加载。** 对于两者而言,语言环境切换成本低廉(1.5-2.8 ms);一旦消息在内存中,Vue 的响应性系统会实现这一点。页面加载从 13.6 ms 降低到 **9.3 ms**,与减少 88 KB 的 JavaScript 解析量一致。
125
+ - **关于原生行。** `vue-intlayer` 在此运行中在 `static` 模式下捆绑了每个区域设置,达到 57.1 KB,运行时为 3.9 KB;适配器的同步字典携带更少的外国语言环境字符串,因此每页数据更低。原生运行时仍然是三者中最轻的,其 `.content.ts` 模型是 SFC `<i18n>` 块找到其等效项的地方。
126
+
127
+ ## 为什么数字会变化
128
+
129
+ `src/components/` 中的内容没有改变,所以收益来自 `useI18n` 绑定到的内容。
130
+
131
+ **使用 `vue-i18n`** 时,绑定是全局实例。`createI18n({ messages: { en, fr, ... } })` 是一个导入,包含所有内容;每个调用 `useI18n()` 的组件都可以访问所有内容,因此 bundler 无法在实例以下进行分割。优化意味着 _你_ 需要按路由拆分 `en.json`,在路由守卫中调用 `setLocaleMessage()`,并在组件移动时保持路由到文件的映射正确。
132
+
133
+ ```bash
134
+ .
135
+ ├── locales
136
+ │ ├── en.json # 每个页面的字符串
137
+ │ └── fr.json
138
+ └── src
139
+ ├── i18n.ts # createI18n({ messages: { en, fr, ... } })
140
+ ├── main.ts # app.use(i18n)
141
+ └── components
142
+ └── Footer.vue # useI18n(); t("footer.github")
143
+ ```
144
+
145
+ **使用 `@intlayer/vue-i18n`**,绑定是字典。`syncJSON` 将 `en.json` 的每个顶级键转换为字典;优化过程将组件所需的那些作为导入提供给 bundler 追踪并按页面拆分。
146
+
147
+ ```bash
148
+ .
149
+ ├── intlayer.config.ts # syncJSON({ format: "vue-i18n", source: ... })
150
+ ├── locales
151
+ │ ├── en.json # 未更改,仍为真实来源
152
+ │ └── fr.json
153
+ ├── .intlayer/ # 生成:每个顶级键对应一个字典,每个语言环境
154
+ └── src
155
+ ├── i18n.ts # createI18n({}) ← messages 导入已删除
156
+ ├── main.ts # app.use(i18n) ← 未更改
157
+ └── components
158
+ └── Footer.vue # useI18n(); t("footer.github") ← 未更改
159
+ ```
160
+
161
+ `i18n.ts` 中的 `messages` 导入是唯一需要删除的一行。那就是 88 KB。
162
+
163
+ ## 分三个步骤迁移
164
+
165
+ <Steps>
166
+ <Step number={1} title="安装">
167
+
168
+ ```bash packageManager="npm"
169
+ npx intlayer init --interactive
170
+ ```
171
+
172
+ ```bash packageManager="pnpm"
173
+ pnpm dlx intlayer init --interactive
174
+ ```
175
+
176
+ ```bash packageManager="yarn"
177
+ yarn dlx intlayer init --interactive
178
+ ```
179
+
180
+ ```bash packageManager="bun"
181
+ bunx intlayer init --interactive
182
+ ```
183
+
184
+ 该命令检测 `vue-i18n`,安装 `intlayer`、`vue-intlayer`、`@intlayer/vue-i18n` 和 `@intlayer/sync-json-plugin`,并预填充 `intlayer.config.ts`。保持 `vue-i18n` 已安装:它是一个对等依赖项,并提供类型。
185
+
186
+ </Step>
187
+ <Step number={2} title="将 Intlayer 指向您的 locale 文件">
188
+
189
+ ```ts fileName="intlayer.config.ts"
190
+ import { Locales, type IntlayerConfig } from "intlayer";
191
+ import { syncJSON } from "@intlayer/sync-json-plugin";
192
+
193
+ const config: IntlayerConfig = {
194
+ internationalization: {
195
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
196
+ defaultLocale: Locales.ENGLISH,
197
+ },
198
+ dictionary: {
199
+ // "static" 捆绑每个语言环境; "dynamic" 按需加载活跃的语言环境
200
+ importMode: "dynamic",
201
+ format: "vue-i18n",
202
+ },
203
+ plugins: [
204
+ syncJSON({
205
+ // vue-i18n 方言: {name}, {0}, "car | cars"
206
+ format: "vue-i18n",
207
+ source: ({ locale }) => `./locales/${locale}.json`,
208
+ location: "locales",
209
+ }),
210
+ ],
211
+ };
212
+
213
+ export default config;
214
+ ```
215
+
216
+ `locales/{locale}.json` 保持在原来的位置。每个顶级键(`footer`、`hero`...)都会变成一个字典。
217
+
218
+ </Step>
219
+ <Step number={3} title="添加插件并删除消息导入">
220
+
221
+ ```ts fileName="vite.config.ts"
222
+ import { defineConfig } from "vite";
223
+ import vue from "@vitejs/plugin-vue";
224
+ import { vueI18nVitePlugin } from "@intlayer/vue-i18n/plugin";
225
+
226
+ export default defineConfig({
227
+ plugins: [vue(), vueI18nVitePlugin()],
228
+ });
229
+ ```
230
+
231
+ ```ts fileName="src/i18n.ts"
232
+ import { createI18n } from "vue-i18n";
233
+
234
+ // 之前: createI18n({ locale: "en", messages: { en, fr, es } })
235
+ export const i18n = createI18n({ locale: "en" });
236
+ ```
237
+
238
+ `vueI18nVitePlugin()` 包装了 `vite-intlayer`(内容监听、字典编译、优化过程)并将 `vue-i18n` 别名指向适配器。移除 `messages` 导入是减少 88 KB 的关键;保留它会使应用继续工作,但会同时发送两个版本。
239
+
240
+ </Step>
241
+ </Steps>
242
+
243
+ ### 之后可以删除的内容
244
+
245
+ | 文件 / 模式 | 原因 |
246
+ | ----------------------------------------------- | ------------------------------------------------------------- |
247
+ | `import en from "./locales/en.json"` 及类似语句 | 仅由适配器用作回退方案。这是 88 KB 的来源 |
248
+ | 路由守卫中的 `setLocaleMessage()` | 无操作。按路由加载现在是编译器的工作 |
249
+ | `@intlify/unplugin-vue-i18n` | 不需要:它预编译消息和 SFC blocks,而适配器不读取这些内容 |
250
+ | SFC `<i18n>` 块 | 未被读取;将它们移动到 locale JSON 或每个组件的 `.content.ts` |
251
+
252
+ ### 除了字节数之外你还能获得什么
253
+
254
+ - **类型化的键。** `t("footer.github")` 针对编译的 `footer` 字典进行类型检查;错误的路径会产生 TypeScript 错误,而不是将键呈现为文本。
255
+ - **`npx intlayer test`** 在 CI 中对任何 locale 中缺少的键失败。**`npx intlayer fill`** 使用你自己的提供商密钥(OpenAI、Anthropic、Mistral、Gemini...)翻译缺少的键,并将其写回 `locales/{locale}.json`。
256
+ - **Visual Editor 和 CMS** 操作相同的 JSON,因此非开发人员可以通过 UI 进行编辑,文件会自动更新。
257
+ - **逐步迁移到 `.content.ts`。** 任何组件都可以通过一个共同位置的内容文件从 `useI18n()` 切换到 `useIntlayer("footer")`。JSON 和 `.content.ts` 字典可以共存并合并。
258
+
259
+ ## 开始前需要了解的限制
260
+
261
+ - **SFC `<i18n>` 块不被读取。** 如果你的消息存在于组件内部,它们需要移动到 locale 文件(或 `.content.ts`,这是相同的想法但带有类型)。
262
+ - **运行时消息加载已消除。** `setLocaleMessage()` 和 `mergeLocaleMessage()` 会发出警告并返回。从 CMS 在运行时获取的翻译需要 Intlayer 的 CMS,或者使用 `intlayer pull` / `push` 命令。
263
+ - **`messages` 是一个回退方案,不是免费的。** 在 `createI18n()` 中保留 JSON 导入会在 bundle 中保留 75 KB。一旦 `intlayer test` 通过,就删除它们。
264
+ - **该适配器不是原生运行时。** 7.9 KB 对比 `vue-intlayer` 的 3.9 KB。一旦每个组件都迁移到 `useIntlayer`,就可以删除它。
265
+
266
+ ## 何时使用哪个?
267
+
268
+ - **继续使用 `vue-i18n`** 如果你的应用依赖 SFC `<i18n>` 块、运行时 `setLocaleMessage()` 流程,或者 90 KB 每页对你的用户来说不是问题。
269
+ - **使用 `@intlayer/vue-i18n`** 如果你在用 `vue-i18n` 并想要节省 88 KB、缩小 23 倍的组件、0% 页面泄漏、类型化的键和 CI 检查,而无需编辑 `.vue` 文件。这是现有 `vue-i18n` codebase 的入口点。
270
+ - **使用原生方案(`vue-intlayer`)** 用于新项目,或在适配器完成其工作后。它具有最轻的运行时(3.9 KB)和按组件的 `.content.ts` 模型,用类型化内容替代 `<i18n>` 块。
271
+
272
+ ## 相关比较
273
+
274
+ - [vue-i18n vs Intlayer](https://intlayer.org/blog/vue-i18n-vs-intlayer) (功能和开发体验)
275
+ - [vue-i18n vs Intlayer benchmark](https://intlayer.org/blog/vue-i18n-vs-intlayer-benchmark) (库,相同基准)
276
+ - [next-intl vs @intlayer/next-intl](https://intlayer.org/blog/next-intl-vs-intlayer-next-intl) (相同adapter系列)
277
+ - [i18next vs @intlayer/i18next](https://intlayer.org/blog/i18next-vs-intlayer-i18next) (相同adapter系列)
278
+ - [Lingui vs @intlayer/lingui](https://intlayer.org/blog/lingui-vs-intlayer-lingui) (相同adapter系列)
279
+ - [迁移指南:vue-i18n 到 Intlayer](https://intlayer.org/doc/migration/vue-i18n)
280
+ - [兼容适配器参考:vue-i18n](https://intlayer.org/doc/compatibility/vue-i18n), [Nuxt i18n](https://intlayer.org/doc/compatibility/nuxtjs-i18n)
281
+
282
+ ## 总结
283
+
284
+ `@intlayer/vue-i18n` 改变了 `useI18n()` 的绑定方式:从持有每个locale的每条消息的全局实例转变为为该组件编译的字典。在同一个 Vite + Vue 3 应用上,每页减少 **88 KB**,运行时减少 **3倍**,组件减少 **23倍**,页面泄漏 **0%**,仅需配置文件、一行插件和删除一个导入。SFC `<i18n>` 块和运行时消息加载是它不支持的两个功能,而原生 `vue-intlayer` 运行时仍然保持其一半的大小。
285
+
286
+ 所有原始数据、测试应用程序和脚本都在 [Benchmark Bloom 仓库](https://github.com/intlayer-org/benchmark-bloom) 中。自己运行它。
287
+
288
+ 有关更多详细信息,请参考 ['Why Intlayer?' 文档](https://intlayer.org/doc/why)。
@@ -236,7 +236,7 @@ const { greeting } = useIntlayer("component-example");
236
236
 
237
237
  GitHub stars 是项目受欢迎程度、社区信任度和长期相关性的强有力指标。虽然不是技术质量的直接衡量标准,但它们反映了有多少开发者认为该项目有用、关注其进展,以及可能会采用它。对于估计项目的价值,stars 有助于在各种方案之间进行性能对比,并提供生态系统增长的见解。
238
238
 
239
- [![Star History Chart](https://api.star-history.com/svg?repos=intlify/vue-i18n&repos=aymericzip/intlayer&type=Date)](https://www.star-history.com/#intlify/vue-i18n&aymericzip/intlayer)
239
+ [![Star History Chart](https://api.star-history.com/svg?repos=intlify/vue-i18n&repos=aymericzip/intlayer&type=Date)](https://star-history.com/#intlify/vue-i18n&aymericzip/intlayer)
240
240
 
241
241
  ## 结论
242
242
 
@@ -0,0 +1,30 @@
1
+ ---
2
+ createdAt: 2026-09-13
3
+ updatedAt: 2026-09-13
4
+ title: "vue-i18n vs Intlayer: 2026 基准测试"
5
+ description: 在相同的 Vite + Vue 3 应用上测量 vue-i18n 和 Intlayer。库大小、每页 JavaScript、内容泄漏、组件大小和语言切换响应性,附带详细数据说明。
6
+ keywords:
7
+ - vue-i18n
8
+ - Intlayer
9
+ - 国际化
10
+ - i18n
11
+ - 基准测试
12
+ - 包大小
13
+ - 博客
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 | Vue 国际化(i18n)基准测试
25
+
26
+ `vue-i18n` 是 Vue 的参考 i18n 库。Intlayer 是一个基于编译器、组件作用域的替代方案,具有 Vue 集成(`vue-intlayer`)。我们已经比较过它们的[功能和开发体验](https://intlayer.org/blog/vue-i18n-vs-intlayer)。本文着眼于每个库在应用构建后的成本。
27
+
28
+ 数据来自 [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom),这是一个开源套件,使用每个库构建相同的应用程序,并记录浏览器实际下载和执行的内容。
29
+
30
+ <TOC/>
@@ -254,6 +254,46 @@ const blogEntry = {
254
254
  vi: readLocale("i18n_using_next-intl.md", "vi"),
255
255
  uk: readLocale("i18n_using_next-intl.md", "uk")
256
256
  },
257
+ "./blog/en/i18next_vs_intlayer-i18next.md": {
258
+ en: readLocale("i18next_vs_intlayer-i18next.md", "en"),
259
+ es: readLocale("i18next_vs_intlayer-i18next.md", "es"),
260
+ ru: readLocale("i18next_vs_intlayer-i18next.md", "ru"),
261
+ ja: readLocale("i18next_vs_intlayer-i18next.md", "ja"),
262
+ fr: readLocale("i18next_vs_intlayer-i18next.md", "fr"),
263
+ ko: readLocale("i18next_vs_intlayer-i18next.md", "ko"),
264
+ zh: readLocale("i18next_vs_intlayer-i18next.md", "zh"),
265
+ de: readLocale("i18next_vs_intlayer-i18next.md", "de"),
266
+ ar: readLocale("i18next_vs_intlayer-i18next.md", "ar"),
267
+ it: readLocale("i18next_vs_intlayer-i18next.md", "it"),
268
+ "en-GB": readLocale("i18next_vs_intlayer-i18next.md", "en-GB"),
269
+ pt: readLocale("i18next_vs_intlayer-i18next.md", "pt"),
270
+ hi: readLocale("i18next_vs_intlayer-i18next.md", "hi"),
271
+ tr: readLocale("i18next_vs_intlayer-i18next.md", "tr"),
272
+ pl: readLocale("i18next_vs_intlayer-i18next.md", "pl"),
273
+ id: readLocale("i18next_vs_intlayer-i18next.md", "id"),
274
+ vi: readLocale("i18next_vs_intlayer-i18next.md", "vi"),
275
+ uk: readLocale("i18next_vs_intlayer-i18next.md", "uk")
276
+ },
277
+ "./blog/en/i18next_vs_intlayer.md": {
278
+ en: readLocale("i18next_vs_intlayer.md", "en"),
279
+ es: readLocale("i18next_vs_intlayer.md", "es"),
280
+ ru: readLocale("i18next_vs_intlayer.md", "ru"),
281
+ ja: readLocale("i18next_vs_intlayer.md", "ja"),
282
+ fr: readLocale("i18next_vs_intlayer.md", "fr"),
283
+ ko: readLocale("i18next_vs_intlayer.md", "ko"),
284
+ zh: readLocale("i18next_vs_intlayer.md", "zh"),
285
+ de: readLocale("i18next_vs_intlayer.md", "de"),
286
+ ar: readLocale("i18next_vs_intlayer.md", "ar"),
287
+ it: readLocale("i18next_vs_intlayer.md", "it"),
288
+ "en-GB": readLocale("i18next_vs_intlayer.md", "en-GB"),
289
+ pt: readLocale("i18next_vs_intlayer.md", "pt"),
290
+ hi: readLocale("i18next_vs_intlayer.md", "hi"),
291
+ tr: readLocale("i18next_vs_intlayer.md", "tr"),
292
+ pl: readLocale("i18next_vs_intlayer.md", "pl"),
293
+ id: readLocale("i18next_vs_intlayer.md", "id"),
294
+ vi: readLocale("i18next_vs_intlayer.md", "vi"),
295
+ uk: readLocale("i18next_vs_intlayer.md", "uk")
296
+ },
257
297
  "./blog/en/icu_message_format.md": {
258
298
  en: readLocale("icu_message_format.md", "en"),
259
299
  es: readLocale("icu_message_format.md", "es"),
@@ -554,6 +594,46 @@ const blogEntry = {
554
594
  vi: readLocale("l10n_platform_alternative/phrase.md", "vi"),
555
595
  uk: readLocale("l10n_platform_alternative/phrase.md", "uk")
556
596
  },
597
+ "./blog/en/lingui_vs_intlayer-lingui.md": {
598
+ en: readLocale("lingui_vs_intlayer-lingui.md", "en"),
599
+ es: readLocale("lingui_vs_intlayer-lingui.md", "es"),
600
+ ru: readLocale("lingui_vs_intlayer-lingui.md", "ru"),
601
+ ja: readLocale("lingui_vs_intlayer-lingui.md", "ja"),
602
+ fr: readLocale("lingui_vs_intlayer-lingui.md", "fr"),
603
+ ko: readLocale("lingui_vs_intlayer-lingui.md", "ko"),
604
+ zh: readLocale("lingui_vs_intlayer-lingui.md", "zh"),
605
+ de: readLocale("lingui_vs_intlayer-lingui.md", "de"),
606
+ ar: readLocale("lingui_vs_intlayer-lingui.md", "ar"),
607
+ it: readLocale("lingui_vs_intlayer-lingui.md", "it"),
608
+ "en-GB": readLocale("lingui_vs_intlayer-lingui.md", "en-GB"),
609
+ pt: readLocale("lingui_vs_intlayer-lingui.md", "pt"),
610
+ hi: readLocale("lingui_vs_intlayer-lingui.md", "hi"),
611
+ tr: readLocale("lingui_vs_intlayer-lingui.md", "tr"),
612
+ pl: readLocale("lingui_vs_intlayer-lingui.md", "pl"),
613
+ id: readLocale("lingui_vs_intlayer-lingui.md", "id"),
614
+ vi: readLocale("lingui_vs_intlayer-lingui.md", "vi"),
615
+ uk: readLocale("lingui_vs_intlayer-lingui.md", "uk")
616
+ },
617
+ "./blog/en/lingui_vs_intlayer.md": {
618
+ en: readLocale("lingui_vs_intlayer.md", "en"),
619
+ es: readLocale("lingui_vs_intlayer.md", "es"),
620
+ ru: readLocale("lingui_vs_intlayer.md", "ru"),
621
+ ja: readLocale("lingui_vs_intlayer.md", "ja"),
622
+ fr: readLocale("lingui_vs_intlayer.md", "fr"),
623
+ ko: readLocale("lingui_vs_intlayer.md", "ko"),
624
+ zh: readLocale("lingui_vs_intlayer.md", "zh"),
625
+ de: readLocale("lingui_vs_intlayer.md", "de"),
626
+ ar: readLocale("lingui_vs_intlayer.md", "ar"),
627
+ it: readLocale("lingui_vs_intlayer.md", "it"),
628
+ "en-GB": readLocale("lingui_vs_intlayer.md", "en-GB"),
629
+ pt: readLocale("lingui_vs_intlayer.md", "pt"),
630
+ hi: readLocale("lingui_vs_intlayer.md", "hi"),
631
+ tr: readLocale("lingui_vs_intlayer.md", "tr"),
632
+ pl: readLocale("lingui_vs_intlayer.md", "pl"),
633
+ id: readLocale("lingui_vs_intlayer.md", "id"),
634
+ vi: readLocale("lingui_vs_intlayer.md", "vi"),
635
+ uk: readLocale("lingui_vs_intlayer.md", "uk")
636
+ },
557
637
  "./blog/en/list_i18n_technologies/build-tools/vite.md": {
558
638
  en: readLocale("list_i18n_technologies/build-tools/vite.md", "en"),
559
639
  es: readLocale("list_i18n_technologies/build-tools/vite.md", "es"),
@@ -834,6 +914,46 @@ const blogEntry = {
834
914
  vi: readLocale("next-i18next_vs_next-intl_vs_intlayer.md", "vi"),
835
915
  uk: readLocale("next-i18next_vs_next-intl_vs_intlayer.md", "uk")
836
916
  },
917
+ "./blog/en/next-intl_vs_intlayer-next-intl.md": {
918
+ en: readLocale("next-intl_vs_intlayer-next-intl.md", "en"),
919
+ es: readLocale("next-intl_vs_intlayer-next-intl.md", "es"),
920
+ ru: readLocale("next-intl_vs_intlayer-next-intl.md", "ru"),
921
+ ja: readLocale("next-intl_vs_intlayer-next-intl.md", "ja"),
922
+ fr: readLocale("next-intl_vs_intlayer-next-intl.md", "fr"),
923
+ ko: readLocale("next-intl_vs_intlayer-next-intl.md", "ko"),
924
+ zh: readLocale("next-intl_vs_intlayer-next-intl.md", "zh"),
925
+ de: readLocale("next-intl_vs_intlayer-next-intl.md", "de"),
926
+ ar: readLocale("next-intl_vs_intlayer-next-intl.md", "ar"),
927
+ it: readLocale("next-intl_vs_intlayer-next-intl.md", "it"),
928
+ "en-GB": readLocale("next-intl_vs_intlayer-next-intl.md", "en-GB"),
929
+ pt: readLocale("next-intl_vs_intlayer-next-intl.md", "pt"),
930
+ hi: readLocale("next-intl_vs_intlayer-next-intl.md", "hi"),
931
+ tr: readLocale("next-intl_vs_intlayer-next-intl.md", "tr"),
932
+ pl: readLocale("next-intl_vs_intlayer-next-intl.md", "pl"),
933
+ id: readLocale("next-intl_vs_intlayer-next-intl.md", "id"),
934
+ vi: readLocale("next-intl_vs_intlayer-next-intl.md", "vi"),
935
+ uk: readLocale("next-intl_vs_intlayer-next-intl.md", "uk")
936
+ },
937
+ "./blog/en/next-intl_vs_intlayer.md": {
938
+ en: readLocale("next-intl_vs_intlayer.md", "en"),
939
+ es: readLocale("next-intl_vs_intlayer.md", "es"),
940
+ ru: readLocale("next-intl_vs_intlayer.md", "ru"),
941
+ ja: readLocale("next-intl_vs_intlayer.md", "ja"),
942
+ fr: readLocale("next-intl_vs_intlayer.md", "fr"),
943
+ ko: readLocale("next-intl_vs_intlayer.md", "ko"),
944
+ zh: readLocale("next-intl_vs_intlayer.md", "zh"),
945
+ de: readLocale("next-intl_vs_intlayer.md", "de"),
946
+ ar: readLocale("next-intl_vs_intlayer.md", "ar"),
947
+ it: readLocale("next-intl_vs_intlayer.md", "it"),
948
+ "en-GB": readLocale("next-intl_vs_intlayer.md", "en-GB"),
949
+ pt: readLocale("next-intl_vs_intlayer.md", "pt"),
950
+ hi: readLocale("next-intl_vs_intlayer.md", "hi"),
951
+ tr: readLocale("next-intl_vs_intlayer.md", "tr"),
952
+ pl: readLocale("next-intl_vs_intlayer.md", "pl"),
953
+ id: readLocale("next-intl_vs_intlayer.md", "id"),
954
+ vi: readLocale("next-intl_vs_intlayer.md", "vi"),
955
+ uk: readLocale("next-intl_vs_intlayer.md", "uk")
956
+ },
837
957
  "./blog/en/nextjs-multilingual-seo-comparison.md": {
838
958
  en: readLocale("nextjs-multilingual-seo-comparison.md", "en"),
839
959
  es: readLocale("nextjs-multilingual-seo-comparison.md", "es"),
@@ -954,6 +1074,26 @@ const blogEntry = {
954
1074
  vi: readLocale("transform_existing_vite_react_app_using_compiler.md", "vi"),
955
1075
  uk: readLocale("transform_existing_vite_react_app_using_compiler.md", "uk")
956
1076
  },
1077
+ "./blog/en/vue-i18n_vs_intlayer-vue-i18n.md": {
1078
+ en: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "en"),
1079
+ es: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "es"),
1080
+ ru: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "ru"),
1081
+ ja: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "ja"),
1082
+ fr: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "fr"),
1083
+ ko: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "ko"),
1084
+ zh: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "zh"),
1085
+ de: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "de"),
1086
+ ar: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "ar"),
1087
+ it: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "it"),
1088
+ "en-GB": readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "en-GB"),
1089
+ pt: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "pt"),
1090
+ hi: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "hi"),
1091
+ tr: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "tr"),
1092
+ pl: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "pl"),
1093
+ id: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "id"),
1094
+ vi: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "vi"),
1095
+ uk: readLocale("vue-i18n_vs_intlayer-vue-i18n.md", "uk")
1096
+ },
957
1097
  "./blog/en/vue-i18n_vs_intlayer.md": {
958
1098
  en: readLocale("vue-i18n_vs_intlayer.md", "en"),
959
1099
  es: readLocale("vue-i18n_vs_intlayer.md", "es"),
@@ -974,6 +1114,26 @@ const blogEntry = {
974
1114
  vi: readLocale("vue-i18n_vs_intlayer.md", "vi"),
975
1115
  uk: readLocale("vue-i18n_vs_intlayer.md", "uk")
976
1116
  },
1117
+ "./blog/en/vue-i18n_vs_intlayer_benchmark.md": {
1118
+ en: readLocale("vue-i18n_vs_intlayer_benchmark.md", "en"),
1119
+ es: readLocale("vue-i18n_vs_intlayer_benchmark.md", "es"),
1120
+ ru: readLocale("vue-i18n_vs_intlayer_benchmark.md", "ru"),
1121
+ ja: readLocale("vue-i18n_vs_intlayer_benchmark.md", "ja"),
1122
+ fr: readLocale("vue-i18n_vs_intlayer_benchmark.md", "fr"),
1123
+ ko: readLocale("vue-i18n_vs_intlayer_benchmark.md", "ko"),
1124
+ zh: readLocale("vue-i18n_vs_intlayer_benchmark.md", "zh"),
1125
+ de: readLocale("vue-i18n_vs_intlayer_benchmark.md", "de"),
1126
+ ar: readLocale("vue-i18n_vs_intlayer_benchmark.md", "ar"),
1127
+ it: readLocale("vue-i18n_vs_intlayer_benchmark.md", "it"),
1128
+ "en-GB": readLocale("vue-i18n_vs_intlayer_benchmark.md", "en-GB"),
1129
+ pt: readLocale("vue-i18n_vs_intlayer_benchmark.md", "pt"),
1130
+ hi: readLocale("vue-i18n_vs_intlayer_benchmark.md", "hi"),
1131
+ tr: readLocale("vue-i18n_vs_intlayer_benchmark.md", "tr"),
1132
+ pl: readLocale("vue-i18n_vs_intlayer_benchmark.md", "pl"),
1133
+ id: readLocale("vue-i18n_vs_intlayer_benchmark.md", "id"),
1134
+ vi: readLocale("vue-i18n_vs_intlayer_benchmark.md", "vi"),
1135
+ uk: readLocale("vue-i18n_vs_intlayer_benchmark.md", "uk")
1136
+ },
977
1137
  "./blog/en/what_is_internationalization.md": {
978
1138
  en: readLocale("what_is_internationalization.md", "en"),
979
1139
  es: readLocale("what_is_internationalization.md", "es"),