@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. حجم المكونات، والترطيب (hydration)، والتسرب وحجم 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` هي محول توافق (compat adapter) لمكتبتي `@lingui/core` و `@lingui/react`. استدعاءاتك لكل من `` t`...` `` و `<Trans>` و `useLingui()` و `i18n._()` تبقى كما هي تماما؛ تواصل وحدات الماكرو التصريف دون تغيير؛ والشيء الوحيد الذي يتغير هو مصدر النصوص في وقت التشغيل (runtime). بدلا من وجود فهرس مجمع واحد لكل لغة، يرتبط كل موقع استدعاء بقاموس Intlayer تم تجميعه خصيصا له.
29
+
30
+ تقيس هذه المقالة هذا التحول على نفس تطبيق TanStack Start، مبنيا مرة باستخدام Lingui الصافي ومرة باستخدام المحول. الأرقام مأخوذة من [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). للمقارنة بين المكتبتين كمكتبتين مستقلتين، اقرأ [Lingui مقابل Intlayer](https://intlayer.org/ar/blog/lingui-vs-intlayer). تركز هذه المقالة على ما يغيره المحول، وأين لا يقدم فائدة إضافية.
31
+
32
+ <TOC/>
33
+
34
+ > **خلاصة سريعة (tl;dr)**: في نفس تطبيق TanStack Start، قلص `@intlayer/lingui` متوسط حجم المكون من **85.5 كيلوبايت إلى 12.8 كيلوبايت** بتنسيق gzip، وخفض وقت الترطيب (hydration) من **28 مللي ثانية إلى 19.7 مللي ثانية**، وسرع التبديل بين اللغات من **5.9 مللي ثانية إلى 2.9 مللي ثانية**، مع بقاء وحدات الماكرو كما هي دون تعديل. في الإعداد البسيط (تحميل كافة الفهارس مسبقا)، أزال أيضا **90% من تسرب الصفحات** ووفر 12 كيلوبايت لكل صفحة. ولكن في إعداد التحميل الكسول (lazy-loaded)، يرسل المحول **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` على وحدات الماكرو وواجهة برمجة التطبيقات ويستبدل آلية البحث في الفهارس:
41
+
42
+ 1. **الأسماء المستعارة للاستيراد (Import aliasing).** تغلف إضافة `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()` بجميع البادئات المستخدمة في الملف. المعرفات التي لا تحتوي على نقاط (المعرفات المجزأة، `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
+ | واجهة برمجة تطبيقات Lingui | مع `@intlayer/lingui` |
87
+ | ------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------- |
88
+ | وحدات ماكرو `` t`...` `` و `msg` و `plural` و `select` و `<Trans>` | ✅ محتفظ بها. احتفظ بإضافة `@lingui/babel-plugin-lingui-macro` أو `@lingui/swc-plugin` قبل معالجة Intlayer |
89
+ | `useLingui()` → `{ i18n, _, t }` | ✅ محتفظ بها. تعمل خارج الـ Provider أيضا (تستنتج اللغة من `react-intlayer`) |
90
+ | `i18n._(id, values)` و `i18n.t()` | ✅ محتفظ بها. تحل المعرفات الصريحة والمجزأة على حد سواء |
91
+ | صيغ الجمع في ICU و `select` و `selectordinal` و `#` | ✅ محتفظ بها، من خلال محلل ICU المدمج في Intlayer |
92
+ | `i18n.date()` و `i18n.number()` و `formats` | ✅ محتفظ بها، مدعومة بمحرك `Intl` الأصلي |
93
+ | `I18nProvider` | ✅ محتفظ بها. تغلف `IntlayerProvider` وتستمع إلى `i18n.on("change")` لإعادة التصيير مع `activate()` |
94
+ | `i18n.activate(locale)` | ✅ محتفظ بها |
95
+ | `i18n.load(locale, messages)` / `loadAndActivate()` | ⚠️ مقبولة كـ **حل احتياطي لوقت التشغيل**. القواميس المجمعة لها الأولوية؛ يظهر تحذير للمطور باقتراح إزالة الكود |
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
+ ## اختبار الأداء المقارن (Benchmark)
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 لمكون فارغ يستورد مكتبة التدويل فقط.
112
+ - **حجم JS لكل صفحة (Page JS)**: متوسط حجم JavaScript المحمل بتنسيق gzip لكل صفحة عبر كافة الصفحات واللغات.
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
+ | الإعداد | الاستراتيجية | حجم المكتبة (gz) | متوسط JS للصفحة (gz) | تسرب اللغة | تسرب الصفحات | متوسط المكون (gz) | استجابة E2E | الترطيب |
124
+ | --------------------------- | -------------- | ---------------: | -------------------: | ---------: | -----------: | ----------------: | ----------: | -----------: |
125
+ | **الأساس** (بدون 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
+ - **التبديل بين اللغات: أسرع بضعفين وبدون تأخير مفاجئ.** يستغرق إعداد Lingui المحسن `scoped-dynamic` حوالي **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
+ **الارتباط (Binding).** في 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/ # منشأ تلقائيا: قاموس لكل بادئة معرف، لكل لغة
166
+ └── src
167
+ ├── locales
168
+ │ ├── en/messages.json # دون تغيير، يظل المصدر الوحيد للحقيقة
169
+ │ └── fr/messages.json
170
+ └── components
171
+ └── Hero.tsx # useLingui(); _("hero.title") ← دون تغيير
172
+ ```
173
+
174
+ **صيغة الرسائل (Format).** تحول مرحلة التصريف في 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/ar/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/ar/doc/environment/nextjs).
281
+ - **عدم تطبيق `defaultComponent`.** إذا كنت تعتمد عليه لتغليف كل عنصر `<Trans>` تلقائيا، أضف التغليف بشكل صريح داخل المكونات.
282
+
283
+ ## متى تستخدم كل خيار؟
284
+
285
+ - **ابق مع Lingui** إذا كنت تطبق بالفعل بنية `scoped-dynamic`، ومعيارك الحاسم الوحيد هو الحجم الأدنى للبايتات لكل صفحة، وكان زمن 42 مللي ثانية لتبديل اللغة و 30 مللي ثانية للترطيب مقبولا في تطبيقك.
286
+ - **استخدم `@intlayer/lingui`** إذا كنت تستخدم Lingui وتريد مكونات أخف وزنا، وترطيبا وتبديلا أسرع للغات، و 0% تسرب للصفحات في الإعداد البسيط، ومعرفات محددة النوع، وفحوصات CI وترجمة مدعومة بالذكاء الاصطناعي دون الحاجة لتعديل الماكرو. إنه الجسر المثالي لتطوير مشاريع Lingui الحالية.
287
+ - **انتقل إلى Intlayer الأصلية (`react-intlayer`)** عندما تبدأ إعادة هيكلة المكونات. إنها الحل الوحيد في جدول المقارنة الذي يحقق **0% تسرب للغة**، وبيئة تشغيل بحجم 5 كيلوبايت وزيادة طفيفة لا تتعدى +7.6 كيلوبايت لكل صفحة مقارنة بالتطبيق الأساسي.
288
+
289
+ ## مقارنات ذات صلة
290
+
291
+ - [Lingui مقابل Intlayer](https://intlayer.org/ar/blog/lingui-vs-intlayer) (مقارنة مباشرة بين المكتبتين على نفس الاختبار)
292
+ - [next-intl مقابل @intlayer/next-intl](https://intlayer.org/ar/blog/next-intl-vs-intlayer-next-intl) (ضمن سلسلة مقارنات المحولات)
293
+ - [i18next مقابل @intlayer/i18next](https://intlayer.org/ar/blog/i18next-vs-intlayer-i18next) (ضمن سلسلة مقارنات المحولات)
294
+ - [vue-i18n مقابل @intlayer/vue-i18n](https://intlayer.org/ar/blog/vue-i18n-vs-intlayer-vue-i18n) (ضمن سلسلة مقارنات المحولات)
295
+ - [مرجع محول التوافق: Lingui](https://intlayer.org/ar/doc/compatibility/lingui)
296
+ - [النهج المعتمد على المصرف مقابل التدويل التعريفي](https://intlayer.org/ar/blog/compiler-vs-declarative-i18n)
297
+
298
+ ## الخاتمة
299
+
300
+ يغير `@intlayer/lingui` جهة الارتباط لمواقع استدعاء Lingui: فبدلا من الارتباط بالنسخة العامة وفهرس اللغة الضخم، يرتبط كل مكون بقاموس مخصص تم تصريفه له على حدة. في نفس تطبيق TanStack Start يحقق ذلك **مكونات أصغر بـ 7 أضعاف**، و **ترطيبا أسرع بـ 8-14 مللي ثانية**، و **تبديلا أسرع للغات بضعفين** مع تفادي التعليق المؤقت البالغ 42 مللي ثانية، دون تحرير أي ماكرو. وهو لا يغير النصوص الاحتياطية المضمنة في المكونات (مما يبقي على تسرب لغة المصدر)، كما يحلل صيغة ICU في وقت التشغيل (مما يضيف نحو 20 كيلوبايت لكل صفحة في الوضع الديناميكي مقارنة بـ Lingui الصافية). حدد أولويات الأداء في مشروعك قبل حسم قرارك.
301
+
302
+ تتوفر جميع البيانات التفصيلية وتطبيقات الاختبار وسكربتات القياس في [مستودع Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). ندعوك لتجربتها بنفسك.
303
+
304
+ راجع توثيق ['لماذا Intlayer؟'](https://intlayer.org/ar/doc/why) لمزيد من التفاصيل.