@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,304 @@
1
+ ---
2
+ createdAt: 2026-09-13
3
+ updatedAt: 2026-09-13
4
+ title: "Lingui против @intlayer/lingui: те же макросы, другой рантайм"
5
+ description: "Что меняется, когда приложение React сохраняет макросы Lingui, но обслуживает их через адаптер совместимости @intlayer/lingui. Размер компонентов, гидратация, утечки и объем JavaScript на страницу, измеренные на одном коде TanStack Start, включая аспекты, где адаптер уступает."
6
+ keywords:
7
+ - Lingui
8
+ - "@intlayer/lingui"
9
+ - Intlayer
10
+ - Адаптер совместимости
11
+ - Миграция
12
+ - Интернационализация
13
+ - i18n
14
+ - Бенчмарк
15
+ - Размер бандла
16
+ - Блог
17
+ - React
18
+ - TanStack Start
19
+ - Vite
20
+ slugs:
21
+ - blog
22
+ - lingui-vs-intlayer-lingui
23
+ author: aymericzip
24
+ ---
25
+
26
+ # Lingui против @intlayer/lingui | Те же макросы, другой рантайм
27
+
28
+ `@intlayer/lingui` - это адаптер совместимости для `@lingui/core` и `@lingui/react`. Ваши вызовы `` t`...` ``, `<Trans>`, `useLingui()` и `i18n._()` остаются в первозданном виде; макросы компилируются как обычно; меняется лишь источник сообщений во время выполнения. Вместо одного общего скомпилированного каталога на каждую локаль каждый вызов связывается со словарем Intlayer, скомпилированным индивидуально для него.
29
+
30
+ В этой статье оценивается данная замена на одном и том же приложении TanStack Start, собранном сначала с чистым Lingui, а затем с адаптером. Данные получены из [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Чтобы сравнить две библиотеки напрямую, прочтите статью [Lingui против Intlayer](https://intlayer.org/ru/blog/lingui-vs-intlayer). Здесь же речь идет о том, что дает адаптер и в каких сценариях он не дает преимуществ.
31
+
32
+ <TOC/>
33
+
34
+ > **Кратко (tl;dr)**: На одном и том же приложении TanStack Start `@intlayer/lingui` снизил средний вес компонента с **85,5 КБ до 12,8 КБ** gzip, ускорил гидратацию с **28 мс до 19,7 мс**, а переключение языка - с **5,9 мс до 2,9 мс** при полностью неизменных макросах. В базовой конфигурации (все каталоги загружаются сразу) он также устранил **90% утечки страниц** и сэкономил 12 КБ на страницу. Однако при ленивой загрузке адаптер отдает **137 КБ на страницу против 115 КБ** у чистого Lingui: адаптер выполняет парсинг ICU в рантайме, тогда как Lingui поставляет предварительно скомпилированные массивы токенов. Утечка исходной локали (~9-10%) одинакова с обеих сторон, так как она обусловлена встроенным в компоненты запасным текстом `message`, а не рантаймом. Адаптер оформлен как плагин для Vite; измерения проводились на TanStack Start.
35
+
36
+ ## Что представляет собой `@intlayer/lingui`
37
+
38
+ Lingui состоит из компилятора и рантайма. Макросы из вашего исходного кода извлекаются в каталог `.po` (или JSON) для каждой локали, компилируются в JS-модуль на локаль и загружаются в глобальный экземпляр `I18n` с помощью `i18n.load()` + `i18n.activate()`. Каждый вызов `useLingui()` подписывается на этот экземпляр; каждый вызов `_()` ищет идентификатор в активном каталоге.
39
+
40
+ `@intlayer/lingui` сохраняет макросы и привычный API, полностью преобразуя логику поиска сообщений:
41
+
42
+ 1. **Алиасы импортов.** Плагин `lingui()` из пакета `@intlayer/lingui/plugin` оборачивает `vite-intlayer` и настраивает `resolve.alias`, направляя `@lingui/core` и `@lingui/react` на `@intlayer/lingui`. Ваши пути импорта остаются прежними.
43
+ 2. **Каталоги как единый источник правды.** Плагин `syncJSON` (или `syncPO` для файлов `.po`) читает существующие каталоги и конвертирует их в словари Intlayer, записывая переводы обратно при обновлении через CLI или CMS. С опцией `splitKeys: "key-prefix"` плоский каталог с составными идентификаторами (`footer.github`, `hero.title`) превращается в набор компактных словарей по префиксам вместо одного тяжелого файла на 244 КБ.
44
+ 3. **Привязка к месту вызова.** Этап оптимизации Intlayer собирает идентификаторы, переданные в `_`, `t` и `<Trans>` в каждом файле, и передает компоненту только релевантные словари. Элемент `<Trans id="hero.title">` связывается автономно; хук `useLingui()` подключает все префиксы, используемые в текущем файле. Идентификаторы без точек (хешированные id, `mockBanner`) обращаются к общему запасному словарю `messages` Lingui.
45
+
46
+ ```tsx fileName="src/components/Hero.tsx"
47
+ // Ваш код, без изменений
48
+ import { useLingui } from "@lingui/react";
49
+ import { Trans } from "@lingui/react/macro";
50
+
51
+ const Hero = () => {
52
+ const { _ } = useLingui();
53
+ return (
54
+ <section>
55
+ <h1>{_({ id: "hero.title", message: "Measure what you ship" })}</h1>
56
+ <Trans id="hero.subtitle">Every byte counts</Trans>
57
+ </section>
58
+ );
59
+ };
60
+ ```
61
+
62
+ ```tsx fileName="Что генерирует компилятор (упрощенно)"
63
+ import _dicHash_hero from "../.intlayer/dictionaries/hero.mjs";
64
+ import {
65
+ useDictionary as useLingui,
66
+ TransDictionary as Trans,
67
+ } from "@intlayer/lingui";
68
+
69
+ const Hero = () => {
70
+ const { _ } = useLingui(_dicHash_hero);
71
+ return (
72
+ <section>
73
+ <h1>{_({ id: "hero.title", message: "Measure what you ship" })}</h1>
74
+ <Trans id="hero.subtitle" dictionary={_dicHash_hero}>
75
+ Every byte counts
76
+ </Trans>
77
+ </section>
78
+ );
79
+ };
80
+ ```
81
+
82
+ Компонент больше не держит ссылку на глобальный экземпляр и связанный с ним монолитный каталог. Он обращается только к словарю `hero`. Именно поэтому размер компонентов в таблице ниже снижается в 7 раз.
83
+
84
+ ## Что адаптер сохраняет, игнорирует и не заменяет
85
+
86
+ | API Lingui | С `@intlayer/lingui` |
87
+ | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
88
+ | Макросы `` t`...` ``, `msg`, `plural`, `select`, `<Trans>` | ✅ Сохраняются. Оставьте `@lingui/babel-plugin-lingui-macro` или `@lingui/swc-plugin` перед этапом Intlayer |
89
+ | `useLingui()` → `{ i18n, _, t }` | ✅ Сохраняется. Работает и вне контекст-провайдера (локаль берется из `react-intlayer`) |
90
+ | `i18n._(id, values)`, `i18n.t()` | ✅ Сохраняется. Поддерживает как явные, так и хешированные идентификаторы |
91
+ | Формы множественного числа ICU, `select`, `selectordinal`, `#` | ✅ Сохраняются через резолвер ICU в Intlayer |
92
+ | `i18n.date()`, `i18n.number()`, `formats` | ✅ Сохраняются на базе нативного API `Intl` |
93
+ | `I18nProvider` | ✅ Сохраняется. Оборачивает `IntlayerProvider`; слушает `i18n.on("change")`, поэтому `activate()` рендерит заново |
94
+ | `i18n.activate(locale)` | ✅ Сохраняется |
95
+ | `i18n.load(locale, messages)` / `loadAndActivate()` | ⚠️ Допускается как **рантайм-фолбек**. Скомпилированные словари в приоритете; предупреждение в dev-режиме |
96
+ | `setupI18n({ messages, missing })` | ⚠️ `messages` объединяются как фолбек; параметр `missing` игнорируется |
97
+ | `lingui extract` / `lingui compile` | ✅ Ваш процесс не меняется. Укажите `syncPO` / `syncJSON` на извлеченные каталоги |
98
+ | `defaultComponent` в `I18nProvider` | ⚠️ Сохраняется в контексте, но не применяется при рендере |
99
+ | Next.js | ❌ Плагин оборачивает `vite-intlayer`. Поддерживаются только Vite, TanStack Start и React Router |
100
+
101
+ ## Бенчмарк
102
+
103
+ ### Что измерялось
104
+
105
+ Тестовый набор [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) собирает **одно и то же приложение** в каждой конфигурации: **10 страниц** (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), **10 локалей** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), одинаковые компоненты и одинаковый контент. Замеры проводились на страницах `en` и `fr`.
106
+
107
+ Lingui компилировался в четырех стратегиях загрузки: от статического импорта всех каталогов заранее (`static`) до ленивой загрузки каталога под каждый конкретный маршрут (`scoped-dynamic`). Адаптер тестировался на **тех же компонентах**, где менялись только `vite.config.ts` и `intlayer.config.ts`. Конфигурация `static` упаковывает все языки сразу; конфигурация `dynamic` (`importMode: 'dynamic'`) подгружает нужный язык по запросу. Вариант "scoped" отсутствует, поскольку оптимизатор изолирует код на уровне мест вызовов.
108
+
109
+ Для каждой сборки фиксируются параметры:
110
+
111
+ - **Lib size**: размер gzip пустого компонента, импортирующего только библиотеку i18n.
112
+ - **Page JS**: объем gzip JavaScript, загружаемый на страницу (усреднено по всем страницам и локалям).
113
+ - **Locale leak %**: доля строк в загруженном JS, относящихся к языкам, которые пользователь **не** просматривает.
114
+ - **Page leak %**: доля строк в загруженном JS, относящихся к страницам, на которых пользователь **не** находится.
115
+ - **Component avg**: средний размер gzip каждого компонента при изолированной сборке.
116
+ - **E2E reactivity**: реальное время между выбором другого языка и обновлением атрибута `html[lang]` в DOM (Playwright, 5 итераций).
117
+ - **Hydration**: продолжительность фазы гидратации React.
118
+
119
+ > Цифры ниже получены в тестировании от **2026-09-12** с использованием `@lingui/react` 6.6.0 и `@intlayer/lingui` 9.5.1. Тестовое приложение компактно (несколько десятков строк на язык), поэтому процент утечки отражает **системную тенденцию**: он масштабируется с ростом контента, тогда как накладные расходы рантайма остаются постоянными.
120
+
121
+ ### Результаты на TanStack Start
122
+
123
+ | Конфигурация | Стратегия | Lib size (gz) | Page JS ср. (gz) | Утечка языка | Утечка страниц | Компонент ср. (gz) | E2E-реактивность | Гидратация |
124
+ | ---------------------- | -------------- | ------------: | ---------------: | -----------: | -------------: | -----------------: | ---------------: | ----------: |
125
+ | **base** (без i18n) | - | 0,0 КБ | 111,0 КБ | 0,0% | 0,0% | 0,7 КБ | 8,1 мс | 21,6 мс |
126
+ | Lingui | static | 11,2 КБ | 152,2 КБ | 50,0% | 90,0% | 58,0 КБ | 3,9 мс | 19,9 мс |
127
+ | Lingui | dynamic | 11,2 КБ | **115,2 КБ** | 9,3% | 0,0% | 85,5 КБ | 5,9 мс | 28,0 мс |
128
+ | Lingui | scoped-static | 11,2 КБ | 120,8 КБ | 4,0% | 0,0% | 147,9 КБ | 7,1 мс | 33,9 мс |
129
+ | Lingui | scoped-dynamic | 11,2 КБ | 120,2 КБ | 8,6% | 0,0% | 83,7 КБ | 42,1 мс | 32,9 мс |
130
+ | **`@intlayer/lingui`** | static | **10,3 КБ** | 140,5 КБ | 50,0% | **0,0%** | **14,9 КБ** | **3,3 мс** | **11,3 мс** |
131
+ | **`@intlayer/lingui`** | dynamic | **10,3 КБ** | 137,0 КБ | 9,9% | **0,0%** | **12,8 КБ** | **2,9 мс** | **19,7 мс** |
132
+ | `intlayer` (нативный) | static | 5,0 КБ | 125,8 КБ | 50,0% | 0,0% | 8,1 КБ | 3,2 мс | 11,5 мс |
133
+ | `intlayer` (нативный) | dynamic | 5,0 КБ | 118,6 КБ | 0,0% | 0,0% | 6,3 КБ | 3,6 мс | 14,1 мс |
134
+
135
+ **Анализ результатов**
136
+
137
+ - **Компоненты: в 7 раз компактнее.** Это главное преимущество адаптера. Изолированный компонент Lingui весит в среднем **от 58 до 148 КБ** в зависимости от схемы загрузки, так как `useLingui()` тянет глобальный экземпляр и весь загруженный в него каталог. Тот же компонент с адаптером весит всего **12,8-14,9 КБ**: он импортирует только собственные словари и ICU-резолвер.
138
+ - **Гидратация: на 8-14 мс быстрее.** Методы `i18n.load()` + `i18n.activate()` выполняются на клиенте до того, как React начнет гидратацию. Чем сильнее разбит Lingui, тем дольше идет инициализация (28-34 мс). С адаптером словари приходят как стандартные импорты, уже включенные бандлером в чанк страницы: **11,3 мс** в режиме `static`, **19,7 мс** в `dynamic`.
139
+ - **Переключение языка: в 2 раза быстрее и без просадок.** Оптимизированная конфигурация `scoped-dynamic` в Lingui тратит **42 мс** на обновление `html[lang]`, поскольку каталог маршрута должен быть запрошен, загружен и активирован. Адаптер стабильно укладывается в **2,9-3,3 мс** в обоих режимах.
140
+ - **Простая конфигурация исправляется автоматически.** Статический Lingui отдает все каталоги на каждой странице: 152,2 КБ и 90% утечки страниц. Статический адаптер: 140,5 КБ и 0% утечки страниц при тех же самых компонентах.
141
+ - **Объем на страницу: Lingui выигрывает в `dynamic` на 22 КБ.** Это важный нюанс. Lingui транслирует сообщения в массивы токенов еще на этапе сборки и использует рантайм весом 11 КБ, который просто обходит эти массивы. Адаптер поставляет резолвер ICU от Intlayer (примерно +15 КБ к коду `@intlayer/core` по сравнению с нативной сборкой), слой адаптера (~10 КБ) и `react-intlayer` (~6 КБ). В данном приложении это дает **137,0 КБ против 115,2 КБ**. Если ваш единственный ориентир - минимальный вес страницы, и у вас уже настроен ленивый Lingui, адаптер не уменьшит эту цифру.
142
+ - **Утечка локали сопоставима с обеих сторон.** 9,3% у Lingui и 9,9% у адаптера в `dynamic`. Причина кроется в коде компонентов: вызов `i18n._({ id: "careers-benefits.pay", message: "Top-of-market compensation" })` содержит английский оригинал в качестве фолбека, как и сгенерированный макросами код, если поле message не удалено. Этот английский текст попадает в чанк `fr` вне зависимости от используемого рантайма. Нативный Intlayer (`.content.ts`, без встроенного в код исходного текста) дает ровно 0%.
143
+
144
+ ## Почему показатели меняются и почему один остается неизменным
145
+
146
+ На итоговые значения влияют два фактора: **к чему привязан компонент** и **в каком формате передаются сообщения**.
147
+
148
+ **Привязка.** В Lingui базовой единицей служит локаль целиком. Файл `messages.mjs` для `fr` представляет собой единый модуль; любой компонент, подключающий экземпляр, получает доступ ко всему содержимому, не позволяя сборщику разделить его тоньше. В адаптере единицей является конкретное место вызова: секции `hero` и `footer` - это отдельные импорты, которые бандлер делит и подгружает для каждого компонента индивидуально. Отсюда экономия в размере компонентов, гидратации и утечке страниц.
149
+
150
+ ```bash
151
+ .
152
+ ├── lingui.config.ts
153
+ └── src
154
+ ├── i18n.ts # setupI18n(), load(), activate()
155
+ ├── locales
156
+ │ ├── en/messages.mjs # результат lingui compile, по одному на язык
157
+ │ └── fr/messages.mjs
158
+ └── components
159
+ └── Hero.tsx # useLingui(); _("hero.title")
160
+ ```
161
+
162
+ ```bash
163
+ .
164
+ ├── intlayer.config.ts # syncJSON({ splitKeys: "key-prefix" })
165
+ ├── .intlayer/ # сгенерировано: словарь на префикс id для каждого языка
166
+ └── src
167
+ ├── locales
168
+ │ ├── en/messages.json # без изменений, остается источником правды
169
+ │ └── fr/messages.json
170
+ └── components
171
+ └── Hero.tsx # useLingui(); _("hero.title") ← без изменений
172
+ ```
173
+
174
+ **Формат.** Компилятор Lingui преобразует конструкцию `{count, plural, one {# item} other {# items}}` в массив токенов, поэтому рантайму не требуется парсить ICU. Адаптер хранит сообщение в виде строки и разбирает его через ICU-резолвер Intlayer. Это создает фиксированные накладные расходы около 15 КБ один раз на страницу. По этой причине строка `dynamic` уступает по объему байтов, выигрывая по всем остальным метрикам. Нативный Intlayer избегает этого, поскольку в файлах `.content.ts` узлы `enu()` / `insert()` рассчитываются компилятором заранее.
175
+
176
+ ## Миграция в три шага
177
+
178
+ <Steps>
179
+ <Step number={1} title="Установка">
180
+
181
+ ```bash packageManager="npm"
182
+ npx intlayer init --interactive
183
+ ```
184
+
185
+ ```bash packageManager="pnpm"
186
+ pnpm dlx intlayer init --interactive
187
+ ```
188
+
189
+ ```bash packageManager="yarn"
190
+ yarn dlx intlayer init --interactive
191
+ ```
192
+
193
+ ```bash packageManager="bun"
194
+ bunx intlayer init --interactive
195
+ ```
196
+
197
+ Команда обнаружит Lingui, изучит `lingui.config.ts`, чтобы подключить `syncPO` (для каталогов `.po`) или `syncJSON` (для каталогов JSON), установит пакеты `intlayer`, `react-intlayer`, `@intlayer/lingui` и требуемый плагин синхронизации, а также заменит `@lingui/vite-plugin` на плагин адаптера в `vite.config.ts`. Пакеты `@lingui/core`, `@lingui/react` и плагин макросов удалять не нужно: макросы компилируются штатно, а адаптер опирается на типы Lingui.
198
+
199
+ </Step>
200
+ <Step number={2} title="Настройка связи Intlayer с каталогами">
201
+
202
+ Для каталогов JSON (`format: "minimal"` в `lingui.config.ts`):
203
+
204
+ ```ts fileName="intlayer.config.ts"
205
+ import { Locales, type IntlayerConfig } from "intlayer";
206
+ import { syncJSON } from "@intlayer/sync-json-plugin";
207
+
208
+ const config: IntlayerConfig = {
209
+ internationalization: {
210
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
211
+ defaultLocale: Locales.ENGLISH,
212
+ },
213
+ dictionary: {
214
+ importMode: "dynamic",
215
+ format: "icu",
216
+ },
217
+ plugins: [
218
+ syncJSON({
219
+ format: "icu",
220
+ source: ({ locale, key }) => `./src/locales/${locale}/${key}.json`,
221
+ // Группировка идентификаторов по первому сегменту: `footer.github` → словарь `footer`
222
+ splitKeys: "key-prefix",
223
+ }),
224
+ ],
225
+ };
226
+
227
+ export default config;
228
+ ```
229
+
230
+ Для каталогов `.po` замените `syncJSON` на `syncPO` из пакета `@intlayer/sync-po-plugin` с аналогичным шаблоном в свойстве `source` и расширением `.po`. Подробнее в [документации плагина Sync PO](https://intlayer.org/ru/doc/plugin/sync-po).
231
+
232
+ Параметр `splitKeys: "key-prefix"` как раз обеспечивает уменьшение размера компонентов. Сам файл каталога сохраняет линейную структуру, разбивка применяется только к сгенерированным словарям, а обратная синхронизация автоматически объединяет ключи.
233
+
234
+ </Step>
235
+ <Step number={3} title="Подключение плагина">
236
+
237
+ ```ts fileName="vite.config.ts"
238
+ import { defineConfig } from "vite";
239
+ import { tanstackStart } from "@tanstack/react-start/plugin/vite";
240
+ import viteReact from "@vitejs/plugin-react";
241
+ import { lingui } from "@intlayer/lingui/plugin";
242
+
243
+ export default defineConfig({
244
+ plugins: [
245
+ tanstackStart(),
246
+ viteReact({
247
+ // Сохраните плагин макросов; он должен выполниться до этапа Intlayer
248
+ babel: { plugins: ["@lingui/babel-plugin-lingui-macro"] },
249
+ }),
250
+ lingui(),
251
+ ],
252
+ });
253
+ ```
254
+
255
+ Плагин `lingui()` оборачивает `vite-intlayer` (отслеживание изменений контента, сборка словарей, фаза оптимизации) и настраивает алиасы для перенаправления `@lingui/core` и `@lingui/react` на адаптер. Запустите сборку, и зафиксированные выше преимущества станут доступны вашему приложению.
256
+
257
+ </Step>
258
+ </Steps>
259
+
260
+ ### Что можно удалить после перехода
261
+
262
+ | Файл / паттерн | Причина |
263
+ | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
264
+ | `await import(\`./locales/${locale}/messages.mjs\`)` | Словари импортируются компонентами напрямую. Метод `i18n.load()` становится фолбеком |
265
+ | `i18n.load()` / `i18n.loadAndActivate()` | Оставьте `i18n.activate(locale)`; удалите ручную загрузку каталогов |
266
+ | `lingui compile` в сценариях сборки | Только если вы перешли на JSON / `.po` как источник и больше не импортируете скомпилированные модули |
267
+
268
+ ### Что вы получаете помимо экономии байтов
269
+
270
+ - **Поиск пропущенных переводов.** Команда `npx intlayer test` прерывает пайплайн CI, если в каком-либо языке отсутствует ключ; `lingui extract` отображает лишь сводную статистику.
271
+ - **`npx intlayer fill`** переводит недостающие строки с помощью выбранного вами ИИ-провайдера (OpenAI, Anthropic, Mistral, Gemini...) и сохраняет их прямо в исходные каталоги.
272
+ - **Визуальный редактор и CMS** работают с теми же словарями, позволяя контент-менеджерам редактировать файлы `.po` и JSON через удобный интерфейс.
273
+ - **Плавная миграция на `.content.ts`.** В любой момент отдельный компонент можно перевести с `useLingui()` на `useIntlayer("hero")` с выделенным файлом декларации контента. Оба формата словарей прекрасно сосуществуют.
274
+
275
+ ## Ограничения, о которых важно знать заранее
276
+
277
+ - **Накладные расходы на страницу в режиме `dynamic`.** Как отмечалось выше: рассчитывайте примерно на +20 КБ на страницу относительно лениво загружаемого Lingui на небольшом приложении. Эта разница не растет вместе с текстами (она задается резолвером, а не каталогами), но и не сокращается.
278
+ - **Утечка исходной локали сохраняется.** Дескрипторы сообщений и сгенерированный макросами код содержат английский оригинал для подстраховки. Для ее устранения потребуется очистить поле `message` или переписать компонент на `.content.ts`.
279
+ - **`i18n.load()` - это фолбек, а не целевой путь.** Если продолжать импортировать скомпилированные каталоги и вызывать `load()`, в итоговый бандл попадут и старая, и новая схемы. Удалите эти импорты.
280
+ - **Поддерживается только Vite.** Плагин для Next.js в рамках `@intlayer/lingui` отсутствует. Проектам на Next.js с Lingui имеет смысл сразу рассмотреть [`next-intlayer`](https://intlayer.org/ru/doc/environment/nextjs).
281
+ - **Свойство `defaultComponent` не задействуется.** Если вы использовали его для оборачивания каждого `<Trans>`, добавляйте обертку явно в разметку компонентов.
282
+
283
+ ## Что выбрать в вашей ситуации?
284
+
285
+ - **Оставайтесь на Lingui**, если в проекте уже реализована схема `scoped-dynamic`, вашей приоритетной метрикой является минимальный вес страницы в КБ, а переключение языка за 42 мс и гидратация за 30 мс полностью приемлемы для задач проекта.
286
+ - **Выбирайте `@intlayer/lingui`**, если проект использует Lingui и вам требуются легковесные компоненты, быстрая гидратация и отзывчивая смена локали, отсутствие утечек страниц в простых схемах, типизированные идентификаторы, валидация в CI и автоперевод через ИИ без изменения макросов. Это оптимальный мост для существующей кодовой базы.
287
+ - **Переходите на нативный Intlayer (`react-intlayer`)**, когда начнется плановый рефакторинг компонентов. Это единственное решение в тесте с **0% утечки локали**, рантаймом 5 КБ и приростом всего +7,6 КБ на страницу по сравнению с базовым приложением.
288
+
289
+ ## Похожие сравнения
290
+
291
+ - [Lingui против Intlayer](https://intlayer.org/ru/blog/lingui-vs-intlayer) (сравнение библиотек в рамках того же бенчмарка)
292
+ - [next-intl против @intlayer/next-intl](https://intlayer.org/ru/blog/next-intl-vs-intlayer-next-intl) (материал из серии об адаптерах)
293
+ - [i18next против @intlayer/i18next](https://intlayer.org/ru/blog/i18next-vs-intlayer-i18next) (материал из серии об адаптерах)
294
+ - [vue-i18n против @intlayer/vue-i18n](https://intlayer.org/ru/blog/vue-i18n-vs-intlayer-vue-i18n) (материал из серии об адаптерах)
295
+ - [Справочник по адаптеру совместимости: Lingui](https://intlayer.org/ru/doc/compatibility/lingui)
296
+ - [Компилятор против декларативной i18n](https://intlayer.org/ru/blog/compiler-vs-declarative-i18n)
297
+
298
+ ## Заключение
299
+
300
+ `@intlayer/lingui` меняет то, к чему привязываются места вызова Lingui: вместо глобального экземпляра и монолитного каталога локали каждый компонент получает персонально скомпилированный словарь. На приложении TanStack Start это дает **уменьшение компонентов в 7 раз**, **ускорение гидратации на 8-14 мс**, **в 2 раза более быстрое переключение языка** без пауз в 42 мс без необходимости переписывать макросы. Решение не удаляет встроенные запасные строки (утечка исходного языка сохраняется) и парсит ICU на лету (динамическая схема загружает примерно на 20 КБ больше на страницу, чем чистый Lingui). Оцените ваши цели по производительности перед выбором подходящего пути.
301
+
302
+ Все исходные данные, тестовые стенды и скрипты опубликованы в [репозитории Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Вы можете повторить эти тесты самостоятельно.
303
+
304
+ Ознакомьтесь с материалом ['Почему Intlayer?'](https://intlayer.org/ru/doc/why) для получения дополнительной информации.