@intlayer/docs 7.2.3 → 7.3.0

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 (461) hide show
  1. package/README.md +2 -0
  2. package/blog/ar/compiler_vs_declarative_i18n.md +138 -0
  3. package/blog/ar/intlayer_with_next-i18next.md +0 -1
  4. package/blog/ar/intlayer_with_vue-i18n.md +0 -1
  5. package/blog/de/compiler_vs_declarative_i18n.md +138 -0
  6. package/blog/de/intlayer_with_next-i18next.md +0 -1
  7. package/blog/de/intlayer_with_vue-i18n.md +0 -1
  8. package/blog/en/compiler_vs_declarative_i18n.md +138 -0
  9. package/blog/en/i18n_using_next-i18next.md +1 -1
  10. package/blog/en/i18n_using_next-intl.md +1 -1
  11. package/blog/en/intlayer_with_i18next.md +1 -1
  12. package/blog/en/intlayer_with_next-i18next.md +1 -2
  13. package/blog/en/intlayer_with_next-intl.md +1 -1
  14. package/blog/en/intlayer_with_react-i18next.md +1 -1
  15. package/blog/en/intlayer_with_react-intl.md +1 -1
  16. package/blog/en/intlayer_with_vue-i18n.md +1 -2
  17. package/blog/en-GB/compiler_vs_declarative_i18n.md +138 -0
  18. package/blog/en-GB/intlayer_with_next-i18next.md +0 -1
  19. package/blog/en-GB/intlayer_with_vue-i18n.md +0 -1
  20. package/blog/es/compiler_vs_declarative_i18n.md +138 -0
  21. package/blog/es/intlayer_with_next-i18next.md +0 -1
  22. package/blog/es/intlayer_with_vue-i18n.md +0 -1
  23. package/blog/fr/compiler_vs_declarative_i18n.md +138 -0
  24. package/blog/fr/intlayer_with_next-i18next.md +0 -1
  25. package/blog/fr/intlayer_with_vue-i18n.md +0 -1
  26. package/blog/hi/compiler_vs_declarative_i18n.md +138 -0
  27. package/blog/hi/intlayer_with_next-i18next.md +0 -1
  28. package/blog/hi/intlayer_with_vue-i18n.md +0 -1
  29. package/blog/id/compiler_vs_declarative_i18n.md +138 -0
  30. package/blog/id/intlayer_with_next-i18next.md +0 -1
  31. package/blog/id/intlayer_with_vue-i18n.md +0 -1
  32. package/blog/it/compiler_vs_declarative_i18n.md +138 -0
  33. package/blog/it/intlayer_with_next-i18next.md +0 -1
  34. package/blog/it/intlayer_with_vue-i18n.md +0 -1
  35. package/blog/ja/compiler_vs_declarative_i18n.md +138 -0
  36. package/blog/ja/intlayer_with_next-i18next.md +0 -1
  37. package/blog/ja/intlayer_with_vue-i18n.md +0 -1
  38. package/blog/ko/compiler_vs_declarative_i18n.md +138 -0
  39. package/blog/ko/intlayer_with_next-i18next.md +0 -1
  40. package/blog/ko/intlayer_with_vue-i18n.md +0 -1
  41. package/blog/pl/compiler_vs_declarative_i18n.md +138 -0
  42. package/blog/pl/intlayer_with_next-i18next.md +0 -1
  43. package/blog/pl/intlayer_with_vue-i18n.md +0 -1
  44. package/blog/pt/compiler_vs_declarative_i18n.md +138 -0
  45. package/blog/pt/intlayer_with_next-i18next.md +0 -1
  46. package/blog/pt/intlayer_with_vue-i18n.md +0 -1
  47. package/blog/ru/compiler_vs_declarative_i18n.md +138 -0
  48. package/blog/ru/intlayer_with_next-i18next.md +0 -1
  49. package/blog/ru/intlayer_with_vue-i18n.md +0 -1
  50. package/blog/tr/compiler_vs_declarative_i18n.md +138 -0
  51. package/blog/tr/intlayer_with_next-i18next.md +0 -1
  52. package/blog/tr/intlayer_with_vue-i18n.md +0 -1
  53. package/blog/vi/compiler_vs_declarative_i18n.md +138 -0
  54. package/blog/vi/intlayer_with_next-i18next.md +0 -1
  55. package/blog/vi/intlayer_with_vue-i18n.md +0 -1
  56. package/blog/zh/compiler_vs_declarative_i18n.md +138 -0
  57. package/blog/zh/intlayer_with_next-i18next.md +0 -1
  58. package/blog/zh/intlayer_with_vue-i18n.md +0 -1
  59. package/dist/cjs/generated/blog.entry.cjs +19 -0
  60. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  61. package/dist/cjs/generated/docs.entry.cjs +323 -19
  62. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  63. package/dist/esm/generated/blog.entry.mjs +19 -0
  64. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  65. package/dist/esm/generated/docs.entry.mjs +323 -19
  66. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  67. package/dist/types/generated/blog.entry.d.ts +1 -0
  68. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  69. package/dist/types/generated/docs.entry.d.ts +17 -1
  70. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  71. package/docs/ar/cli/build.md +64 -0
  72. package/docs/ar/cli/configuration.md +63 -0
  73. package/docs/ar/cli/debug.md +46 -0
  74. package/docs/ar/cli/doc-review.md +43 -0
  75. package/docs/ar/cli/doc-translate.md +132 -0
  76. package/docs/ar/cli/editor.md +28 -0
  77. package/docs/ar/cli/fill.md +130 -0
  78. package/docs/ar/cli/index.md +163 -0
  79. package/docs/ar/cli/list.md +53 -0
  80. package/docs/ar/cli/live.md +41 -0
  81. package/docs/ar/cli/pull.md +78 -0
  82. package/docs/ar/cli/push.md +98 -0
  83. package/docs/ar/cli/sdk.md +67 -0
  84. package/docs/ar/cli/test.md +76 -0
  85. package/docs/ar/cli/transform.md +65 -0
  86. package/docs/ar/cli/version.md +24 -0
  87. package/docs/ar/cli/watch.md +37 -0
  88. package/docs/ar/packages/intlayer/getPrefix.md +210 -0
  89. package/docs/de/cli/build.md +64 -0
  90. package/docs/de/cli/configuration.md +63 -0
  91. package/docs/de/cli/debug.md +46 -0
  92. package/docs/de/cli/doc-review.md +43 -0
  93. package/docs/de/cli/doc-translate.md +132 -0
  94. package/docs/de/cli/editor.md +28 -0
  95. package/docs/de/cli/fill.md +130 -0
  96. package/docs/de/cli/index.md +163 -0
  97. package/docs/de/cli/list.md +53 -0
  98. package/docs/de/cli/live.md +41 -0
  99. package/docs/de/cli/pull.md +78 -0
  100. package/docs/de/cli/push.md +98 -0
  101. package/docs/de/cli/sdk.md +67 -0
  102. package/docs/de/cli/test.md +76 -0
  103. package/docs/de/cli/transform.md +65 -0
  104. package/docs/de/cli/version.md +24 -0
  105. package/docs/de/cli/watch.md +37 -0
  106. package/docs/de/packages/intlayer/getPrefix.md +213 -0
  107. package/docs/en/CI_CD.md +2 -2
  108. package/docs/en/autoFill.md +24 -2
  109. package/docs/en/cli/build.md +64 -0
  110. package/docs/en/cli/configuration.md +63 -0
  111. package/docs/en/cli/debug.md +46 -0
  112. package/docs/en/cli/doc-review.md +43 -0
  113. package/docs/en/cli/doc-translate.md +132 -0
  114. package/docs/en/cli/editor.md +28 -0
  115. package/docs/en/cli/fill.md +130 -0
  116. package/docs/en/cli/index.md +163 -0
  117. package/docs/en/cli/list.md +53 -0
  118. package/docs/en/cli/live.md +41 -0
  119. package/docs/en/cli/pull.md +78 -0
  120. package/docs/en/cli/push.md +98 -0
  121. package/docs/en/cli/sdk.md +67 -0
  122. package/docs/en/cli/test.md +76 -0
  123. package/docs/en/cli/transform.md +65 -0
  124. package/docs/en/cli/version.md +24 -0
  125. package/docs/en/cli/watch.md +37 -0
  126. package/docs/en/dictionary/condition.md +1 -1
  127. package/docs/en/dictionary/enumeration.md +1 -1
  128. package/docs/en/dictionary/file.md +1 -1
  129. package/docs/en/dictionary/gender.md +1 -1
  130. package/docs/en/dictionary/insertion.md +1 -1
  131. package/docs/en/dictionary/markdown.md +1 -1
  132. package/docs/en/dictionary/nesting.md +1 -1
  133. package/docs/en/index.md +1 -1
  134. package/docs/en/intlayer_with_angular.md +1 -1
  135. package/docs/en/intlayer_with_astro.md +1 -1
  136. package/docs/en/intlayer_with_create_react_app.md +1 -1
  137. package/docs/en/intlayer_with_lynx+react.md +1 -1
  138. package/docs/en/intlayer_with_next-i18next.md +1 -1
  139. package/docs/en/intlayer_with_next-intl.md +1 -1
  140. package/docs/en/intlayer_with_nextjs_14.md +1 -1
  141. package/docs/en/intlayer_with_nextjs_15.md +1 -1
  142. package/docs/en/intlayer_with_nextjs_16.md +1 -1
  143. package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
  144. package/docs/en/intlayer_with_nuxt.md +1 -1
  145. package/docs/en/intlayer_with_react_native+expo.md +1 -1
  146. package/docs/en/intlayer_with_react_router_v7.md +1 -1
  147. package/docs/en/intlayer_with_tanstack.md +1 -1
  148. package/docs/en/intlayer_with_vite+preact.md +1 -1
  149. package/docs/en/intlayer_with_vite+react.md +1 -1
  150. package/docs/en/intlayer_with_vite+solid.md +1 -1
  151. package/docs/en/intlayer_with_vite+svelte.md +1 -1
  152. package/docs/en/intlayer_with_vite+vue.md +1 -1
  153. package/docs/en/introduction.md +1 -1
  154. package/docs/en/mcp_server.md +1 -2
  155. package/docs/en/per_locale_file.md +1 -1
  156. package/docs/en/plugins/sync-json.md +1 -1
  157. package/docs/en/releases/v6.md +2 -2
  158. package/docs/en/roadmap.md +1 -1
  159. package/docs/en-GB/cli/build.md +64 -0
  160. package/docs/en-GB/cli/configuration.md +63 -0
  161. package/docs/en-GB/cli/debug.md +46 -0
  162. package/docs/en-GB/cli/doc-review.md +43 -0
  163. package/docs/en-GB/cli/doc-translate.md +132 -0
  164. package/docs/en-GB/cli/editor.md +28 -0
  165. package/docs/en-GB/cli/fill.md +130 -0
  166. package/docs/en-GB/cli/index.md +163 -0
  167. package/docs/en-GB/cli/list.md +53 -0
  168. package/docs/en-GB/cli/live.md +41 -0
  169. package/docs/en-GB/cli/pull.md +78 -0
  170. package/docs/en-GB/cli/push.md +98 -0
  171. package/docs/en-GB/cli/sdk.md +67 -0
  172. package/docs/en-GB/cli/test.md +100 -0
  173. package/docs/en-GB/cli/transform.md +65 -0
  174. package/docs/en-GB/cli/version.md +24 -0
  175. package/docs/en-GB/cli/watch.md +37 -0
  176. package/docs/en-GB/dictionary/condition.md +1 -1
  177. package/docs/en-GB/dictionary/markdown.md +1 -1
  178. package/docs/en-GB/dictionary/nesting.md +1 -1
  179. package/docs/en-GB/intlayer_with_nextjs_14.md +1 -1
  180. package/docs/en-GB/intlayer_with_react_native+expo.md +1 -1
  181. package/docs/en-GB/packages/intlayer/getPrefix.md +213 -0
  182. package/docs/es/cli/build.md +64 -0
  183. package/docs/es/cli/configuration.md +63 -0
  184. package/docs/es/cli/debug.md +46 -0
  185. package/docs/es/cli/doc-review.md +43 -0
  186. package/docs/es/cli/doc-translate.md +132 -0
  187. package/docs/es/cli/editor.md +28 -0
  188. package/docs/es/cli/fill.md +130 -0
  189. package/docs/es/cli/index.md +163 -0
  190. package/docs/es/cli/list.md +53 -0
  191. package/docs/es/cli/live.md +41 -0
  192. package/docs/es/cli/pull.md +78 -0
  193. package/docs/es/cli/push.md +98 -0
  194. package/docs/es/cli/sdk.md +67 -0
  195. package/docs/es/cli/test.md +76 -0
  196. package/docs/es/cli/transform.md +65 -0
  197. package/docs/es/cli/version.md +24 -0
  198. package/docs/es/cli/watch.md +37 -0
  199. package/docs/es/packages/intlayer/getPrefix.md +213 -0
  200. package/docs/fr/cli/build.md +64 -0
  201. package/docs/fr/cli/configuration.md +63 -0
  202. package/docs/fr/cli/debug.md +46 -0
  203. package/docs/fr/cli/doc-review.md +43 -0
  204. package/docs/fr/cli/doc-translate.md +132 -0
  205. package/docs/fr/cli/editor.md +28 -0
  206. package/docs/fr/cli/fill.md +130 -0
  207. package/docs/fr/cli/index.md +163 -0
  208. package/docs/fr/cli/list.md +53 -0
  209. package/docs/fr/cli/live.md +41 -0
  210. package/docs/fr/cli/pull.md +78 -0
  211. package/docs/fr/cli/push.md +98 -0
  212. package/docs/fr/cli/sdk.md +67 -0
  213. package/docs/fr/cli/test.md +76 -0
  214. package/docs/fr/cli/transform.md +65 -0
  215. package/docs/fr/cli/version.md +24 -0
  216. package/docs/fr/cli/watch.md +37 -0
  217. package/docs/fr/packages/intlayer/getPrefix.md +213 -0
  218. package/docs/hi/cli/build.md +64 -0
  219. package/docs/hi/cli/configuration.md +63 -0
  220. package/docs/hi/cli/debug.md +46 -0
  221. package/docs/hi/cli/doc-review.md +43 -0
  222. package/docs/hi/cli/doc-translate.md +132 -0
  223. package/docs/hi/cli/editor.md +28 -0
  224. package/docs/hi/cli/fill.md +130 -0
  225. package/docs/hi/cli/index.md +163 -0
  226. package/docs/hi/cli/list.md +53 -0
  227. package/docs/hi/cli/live.md +41 -0
  228. package/docs/hi/cli/pull.md +78 -0
  229. package/docs/hi/cli/push.md +98 -0
  230. package/docs/hi/cli/sdk.md +67 -0
  231. package/docs/hi/cli/test.md +76 -0
  232. package/docs/hi/cli/transform.md +65 -0
  233. package/docs/hi/cli/version.md +24 -0
  234. package/docs/hi/cli/watch.md +37 -0
  235. package/docs/hi/intlayer_with_tanstack.md +1 -1
  236. package/docs/hi/intlayer_with_vite+solid.md +1 -1
  237. package/docs/hi/packages/intlayer/getPrefix.md +217 -0
  238. package/docs/id/cli/build.md +64 -0
  239. package/docs/id/cli/configuration.md +62 -0
  240. package/docs/id/cli/debug.md +46 -0
  241. package/docs/id/cli/doc-review.md +43 -0
  242. package/docs/id/cli/doc-translate.md +132 -0
  243. package/docs/id/cli/editor.md +28 -0
  244. package/docs/id/cli/fill.md +130 -0
  245. package/docs/id/cli/index.md +163 -0
  246. package/docs/id/cli/list.md +53 -0
  247. package/docs/id/cli/live.md +41 -0
  248. package/docs/id/cli/pull.md +78 -0
  249. package/docs/id/cli/push.md +98 -0
  250. package/docs/id/cli/sdk.md +67 -0
  251. package/docs/id/cli/test.md +76 -0
  252. package/docs/id/cli/transform.md +65 -0
  253. package/docs/id/cli/version.md +24 -0
  254. package/docs/id/cli/watch.md +37 -0
  255. package/docs/id/packages/intlayer/getPrefix.md +210 -0
  256. package/docs/it/cli/build.md +64 -0
  257. package/docs/it/cli/configuration.md +63 -0
  258. package/docs/it/cli/debug.md +46 -0
  259. package/docs/it/cli/doc-review.md +43 -0
  260. package/docs/it/cli/doc-translate.md +132 -0
  261. package/docs/it/cli/editor.md +28 -0
  262. package/docs/it/cli/fill.md +130 -0
  263. package/docs/it/cli/index.md +158 -0
  264. package/docs/it/cli/list.md +53 -0
  265. package/docs/it/cli/live.md +41 -0
  266. package/docs/it/cli/pull.md +78 -0
  267. package/docs/it/cli/push.md +98 -0
  268. package/docs/it/cli/sdk.md +67 -0
  269. package/docs/it/cli/test.md +76 -0
  270. package/docs/it/cli/transform.md +65 -0
  271. package/docs/it/cli/version.md +24 -0
  272. package/docs/it/cli/watch.md +39 -0
  273. package/docs/it/packages/intlayer/getPrefix.md +211 -0
  274. package/docs/ja/cli/build.md +78 -0
  275. package/docs/ja/cli/configuration.md +63 -0
  276. package/docs/ja/cli/debug.md +46 -0
  277. package/docs/ja/cli/doc-review.md +43 -0
  278. package/docs/ja/cli/doc-translate.md +132 -0
  279. package/docs/ja/cli/editor.md +28 -0
  280. package/docs/ja/cli/fill.md +130 -0
  281. package/docs/ja/cli/index.md +163 -0
  282. package/docs/ja/cli/list.md +53 -0
  283. package/docs/ja/cli/live.md +41 -0
  284. package/docs/ja/cli/pull.md +78 -0
  285. package/docs/ja/cli/push.md +113 -0
  286. package/docs/ja/cli/sdk.md +67 -0
  287. package/docs/ja/cli/test.md +76 -0
  288. package/docs/ja/cli/transform.md +65 -0
  289. package/docs/ja/cli/version.md +24 -0
  290. package/docs/ja/cli/watch.md +37 -0
  291. package/docs/ja/packages/intlayer/getPrefix.md +212 -0
  292. package/docs/ko/cli/build.md +64 -0
  293. package/docs/ko/cli/configuration.md +63 -0
  294. package/docs/ko/cli/debug.md +46 -0
  295. package/docs/ko/cli/doc-review.md +43 -0
  296. package/docs/ko/cli/doc-translate.md +132 -0
  297. package/docs/ko/cli/editor.md +28 -0
  298. package/docs/ko/cli/fill.md +130 -0
  299. package/docs/ko/cli/index.md +163 -0
  300. package/docs/ko/cli/list.md +53 -0
  301. package/docs/ko/cli/live.md +41 -0
  302. package/docs/ko/cli/pull.md +78 -0
  303. package/docs/ko/cli/push.md +113 -0
  304. package/docs/ko/cli/sdk.md +67 -0
  305. package/docs/ko/cli/test.md +76 -0
  306. package/docs/ko/cli/transform.md +65 -0
  307. package/docs/ko/cli/version.md +24 -0
  308. package/docs/ko/cli/watch.md +37 -0
  309. package/docs/ko/packages/intlayer/getPrefix.md +213 -0
  310. package/docs/pl/cli/build.md +64 -0
  311. package/docs/pl/cli/configuration.md +63 -0
  312. package/docs/pl/cli/debug.md +46 -0
  313. package/docs/pl/cli/doc-review.md +43 -0
  314. package/docs/pl/cli/doc-translate.md +132 -0
  315. package/docs/pl/cli/editor.md +28 -0
  316. package/docs/pl/cli/fill.md +130 -0
  317. package/docs/pl/cli/index.md +163 -0
  318. package/docs/pl/cli/list.md +53 -0
  319. package/docs/pl/cli/live.md +41 -0
  320. package/docs/pl/cli/pull.md +78 -0
  321. package/docs/pl/cli/push.md +98 -0
  322. package/docs/pl/cli/sdk.md +67 -0
  323. package/docs/pl/cli/test.md +76 -0
  324. package/docs/pl/cli/transform.md +65 -0
  325. package/docs/pl/cli/version.md +24 -0
  326. package/docs/pl/cli/watch.md +39 -0
  327. package/docs/pl/packages/intlayer/getPrefix.md +217 -0
  328. package/docs/pt/cli/build.md +64 -0
  329. package/docs/pt/cli/configuration.md +63 -0
  330. package/docs/pt/cli/debug.md +46 -0
  331. package/docs/pt/cli/doc-review.md +43 -0
  332. package/docs/pt/cli/doc-translate.md +132 -0
  333. package/docs/pt/cli/editor.md +28 -0
  334. package/docs/pt/cli/fill.md +130 -0
  335. package/docs/pt/cli/index.md +163 -0
  336. package/docs/pt/cli/list.md +53 -0
  337. package/docs/pt/cli/live.md +41 -0
  338. package/docs/pt/cli/pull.md +78 -0
  339. package/docs/pt/cli/push.md +98 -0
  340. package/docs/pt/cli/sdk.md +67 -0
  341. package/docs/pt/cli/test.md +76 -0
  342. package/docs/pt/cli/transform.md +65 -0
  343. package/docs/pt/cli/version.md +24 -0
  344. package/docs/pt/cli/watch.md +39 -0
  345. package/docs/pt/packages/intlayer/getPrefix.md +217 -0
  346. package/docs/ru/cli/build.md +64 -0
  347. package/docs/ru/cli/configuration.md +63 -0
  348. package/docs/ru/cli/debug.md +46 -0
  349. package/docs/ru/cli/doc-review.md +43 -0
  350. package/docs/ru/cli/doc-translate.md +132 -0
  351. package/docs/ru/cli/editor.md +28 -0
  352. package/docs/ru/cli/fill.md +130 -0
  353. package/docs/ru/cli/index.md +163 -0
  354. package/docs/ru/cli/list.md +53 -0
  355. package/docs/ru/cli/live.md +41 -0
  356. package/docs/ru/cli/pull.md +78 -0
  357. package/docs/ru/cli/push.md +98 -0
  358. package/docs/ru/cli/sdk.md +67 -0
  359. package/docs/ru/cli/test.md +76 -0
  360. package/docs/ru/cli/transform.md +65 -0
  361. package/docs/ru/cli/version.md +24 -0
  362. package/docs/ru/cli/watch.md +39 -0
  363. package/docs/ru/packages/intlayer/getPrefix.md +213 -0
  364. package/docs/tr/CI_CD.md +2 -2
  365. package/docs/tr/cli/build.md +64 -0
  366. package/docs/tr/cli/configuration.md +63 -0
  367. package/docs/tr/cli/debug.md +46 -0
  368. package/docs/tr/cli/doc-review.md +43 -0
  369. package/docs/tr/cli/doc-translate.md +132 -0
  370. package/docs/tr/cli/editor.md +28 -0
  371. package/docs/tr/cli/fill.md +130 -0
  372. package/docs/tr/cli/index.md +163 -0
  373. package/docs/tr/cli/list.md +53 -0
  374. package/docs/tr/cli/live.md +41 -0
  375. package/docs/tr/cli/pull.md +78 -0
  376. package/docs/tr/cli/push.md +98 -0
  377. package/docs/tr/cli/sdk.md +67 -0
  378. package/docs/tr/cli/test.md +76 -0
  379. package/docs/tr/cli/transform.md +65 -0
  380. package/docs/tr/cli/version.md +24 -0
  381. package/docs/tr/cli/watch.md +39 -0
  382. package/docs/tr/dictionary/condition.md +1 -1
  383. package/docs/tr/dictionary/enumeration.md +1 -1
  384. package/docs/tr/dictionary/file.md +1 -1
  385. package/docs/tr/dictionary/gender.md +1 -1
  386. package/docs/tr/dictionary/insertion.md +1 -1
  387. package/docs/tr/dictionary/markdown.md +1 -1
  388. package/docs/tr/dictionary/nesting.md +1 -1
  389. package/docs/tr/index.md +1 -1
  390. package/docs/tr/intlayer_with_angular.md +1 -1
  391. package/docs/tr/intlayer_with_create_react_app.md +1 -1
  392. package/docs/tr/intlayer_with_lynx+react.md +1 -1
  393. package/docs/tr/intlayer_with_nextjs_15.md +1 -1
  394. package/docs/tr/intlayer_with_nextjs_page_router.md +1 -1
  395. package/docs/tr/intlayer_with_nuxt.md +1 -1
  396. package/docs/tr/intlayer_with_react_native+expo.md +1 -1
  397. package/docs/tr/intlayer_with_vite+preact.md +1 -1
  398. package/docs/tr/intlayer_with_vite+react.md +1 -1
  399. package/docs/tr/intlayer_with_vite+solid.md +1 -1
  400. package/docs/tr/intlayer_with_vite+vue.md +1 -1
  401. package/docs/tr/introduction.md +1 -1
  402. package/docs/tr/mcp_server.md +1 -1
  403. package/docs/tr/packages/intlayer/getPrefix.md +213 -0
  404. package/docs/tr/per_locale_file.md +1 -1
  405. package/docs/tr/roadmap.md +1 -1
  406. package/docs/vi/cli/build.md +64 -0
  407. package/docs/vi/cli/configuration.md +63 -0
  408. package/docs/vi/cli/debug.md +46 -0
  409. package/docs/vi/cli/doc-review.md +43 -0
  410. package/docs/vi/cli/doc-translate.md +132 -0
  411. package/docs/vi/cli/editor.md +28 -0
  412. package/docs/vi/cli/fill.md +130 -0
  413. package/docs/vi/cli/index.md +163 -0
  414. package/docs/vi/cli/list.md +53 -0
  415. package/docs/vi/cli/live.md +41 -0
  416. package/docs/vi/cli/pull.md +78 -0
  417. package/docs/vi/cli/push.md +98 -0
  418. package/docs/vi/cli/sdk.md +67 -0
  419. package/docs/vi/cli/test.md +76 -0
  420. package/docs/vi/cli/transform.md +65 -0
  421. package/docs/vi/cli/version.md +24 -0
  422. package/docs/vi/cli/watch.md +37 -0
  423. package/docs/vi/packages/intlayer/getPrefix.md +213 -0
  424. package/docs/zh/cli/build.md +64 -0
  425. package/docs/zh/cli/configuration.md +63 -0
  426. package/docs/zh/cli/debug.md +46 -0
  427. package/docs/zh/cli/doc-review.md +43 -0
  428. package/docs/zh/cli/doc-translate.md +132 -0
  429. package/docs/zh/cli/editor.md +28 -0
  430. package/docs/zh/cli/fill.md +130 -0
  431. package/docs/zh/cli/index.md +168 -0
  432. package/docs/zh/cli/list.md +53 -0
  433. package/docs/zh/cli/live.md +41 -0
  434. package/docs/zh/cli/pull.md +78 -0
  435. package/docs/zh/cli/push.md +113 -0
  436. package/docs/zh/cli/sdk.md +67 -0
  437. package/docs/zh/cli/test.md +76 -0
  438. package/docs/zh/cli/transform.md +65 -0
  439. package/docs/zh/cli/version.md +24 -0
  440. package/docs/zh/cli/watch.md +37 -0
  441. package/docs/zh/packages/intlayer/getPrefix.md +213 -0
  442. package/package.json +9 -9
  443. package/src/generated/blog.entry.ts +19 -0
  444. package/src/generated/docs.entry.ts +323 -19
  445. package/docs/ar/intlayer_cli.md +0 -614
  446. package/docs/de/intlayer_cli.md +0 -615
  447. package/docs/en/intlayer_cli.md +0 -897
  448. package/docs/en-GB/intlayer_cli.md +0 -615
  449. package/docs/es/intlayer_cli.md +0 -614
  450. package/docs/fr/intlayer_cli.md +0 -614
  451. package/docs/hi/intlayer_cli.md +0 -616
  452. package/docs/id/intlayer_cli.md +0 -886
  453. package/docs/it/intlayer_cli.md +0 -610
  454. package/docs/ja/intlayer_cli.md +0 -616
  455. package/docs/ko/intlayer_cli.md +0 -614
  456. package/docs/pl/intlayer_cli.md +0 -893
  457. package/docs/pt/intlayer_cli.md +0 -615
  458. package/docs/ru/intlayer_cli.md +0 -885
  459. package/docs/tr/intlayer_cli.md +0 -614
  460. package/docs/vi/intlayer_cli.md +0 -886
  461. package/docs/zh/intlayer_cli.md +0 -613
package/README.md CHANGED
@@ -24,6 +24,8 @@
24
24
  <a href="https://github.com/aymericzip/intlayer/blob/main/LICENSE" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/github/license/aymericzip/intlayer?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="license"/></a>
25
25
  <a href="https://github.com/aymericzip/intlayer/commits/main" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/github/last-commit/aymericzip/intlayer?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="last commit"/>
26
26
  </a>
27
+ <a href="https://bountyhub.dev/bounties?repo=intlayer" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/badge/Bounties-on%20BountyHub-yellow?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="Bounties on BountyHub"/>
28
+ </a>
27
29
  </p>
28
30
 
29
31
  ![Watch the video](https://github.com/aymericzip/intlayer/blob/main/docs/assets/demo_video.gif)
@@ -0,0 +1,138 @@
1
+ ---
2
+ createdAt: 2025-11-24
3
+ updatedAt: 2025-11-24
4
+ title: المترجم مقابل التدوين التصريحي في التدويل
5
+ description: استكشاف المقايضات المعمارية بين التدويل "السحري" المعتمد على المترجم وإدارة المحتوى التصريحية الصريحة.
6
+ keywords:
7
+ - Intlayer
8
+ - التدويل
9
+ - مدونة
10
+ - Next.js
11
+ - JavaScript
12
+ - React
13
+ - i18n
14
+ - المترجم
15
+ - تدويني
16
+ slugs:
17
+ - compiler-vs-declarative-i18n
18
+ - blog
19
+ - i18n
20
+ ---
21
+
22
+ # الحجج المؤيدة والمعارضة للتدويل المعتمد على المترجم
23
+
24
+ إذا كنت تبني تطبيقات ويب لأكثر من عقد من الزمن، فأنت تعلم أن التدويل (i18n) كان دائمًا نقطة احتكاك. غالبًا ما تكون مهمة لا يرغب أحد في القيام بها — استخراج النصوص، إدارة ملفات JSON، والقلق بشأن قواعد الجمع والتعدد.
25
+
26
+ مؤخرًا، ظهرت موجة جديدة من أدوات التدويل "المعتمدة على المترجم"، واعدة بجعل هذه المعاناة تختفي. العرض مغرٍ: **فقط اكتب النص في مكوناتك، ودع أداة البناء تتولى الباقي.** لا مفاتيح، لا استيرادات، فقط سحر.
27
+
28
+ ولكن كما هو الحال مع جميع التجريدات في هندسة البرمجيات، يأتي السحر بثمن.
29
+
30
+ في هذه التدوينة، سوف نستكشف التحول من المكتبات التصريحية إلى النهج المعتمد على المترجم، والديون المعمارية الخفية التي يقدمونها، ولماذا قد يكون الطريق "الممل" لا يزال أفضل طريقة للتطبيقات المهنية.
31
+
32
+ ## لمحة تاريخية عن الترجمة
33
+
34
+ لفهم مكاننا الحالي، علينا أن ننظر إلى الوراء حيث بدأنا.
35
+
36
+ حوالي عامي 2011–2012، كان مشهد JavaScript مختلفًا تمامًا. لم تكن أدوات التجميع كما نعرفها اليوم (Webpack، Vite) موجودة أو كانت في مراحلها الأولى. كنا نلصق السكريبتات معًا في المتصفح. في هذه الحقبة، وُلدت مكتبات مثل **i18next**.
37
+
38
+ لقد حلوا المشكلة بالطريقة الوحيدة الممكنة في ذلك الوقت: **القواميس أثناء وقت التشغيل**. كنت تقوم بتحميل كائن JSON ضخم في الذاكرة، وكانت دالة تبحث عن المفاتيح أثناء التنفيذ. كان ذلك موثوقًا وصريحًا، ويعمل في كل مكان.
39
+
40
+ تقدم سريعًا إلى اليوم. لدينا مترجمات قوية (SWC، أدوات تجميع مبنية على Rust) يمكنها تحليل أشجار البنية المجردة (AST) في غضون مللي ثانية. هذه القوة ولدت فكرة جديدة: _لماذا ندير المفاتيح يدويًا؟ لماذا لا يستطيع المترجم فقط رؤية النص "Hello World" واستبداله لنا؟_
41
+
42
+ وهكذا وُلدت الترجمة المعتمدة على المترجم (Compiler-based i18n).
43
+
44
+ ## جاذبية المترجم (النهج "السحري")
45
+
46
+ هناك سبب يجعل هذا النهج الجديد شائعًا. بالنسبة للمطور، تكون التجربة مذهلة.
47
+
48
+ ### 1. السرعة و"التدفق"
49
+
50
+ عندما تكون في حالة تركيز، التوقف للتفكير في اسم متغير (`home_hero_title_v2`) يكسر تدفقك. مع نهج المترجم، تكتب `<p>Welcome back</p>` وتتابع العمل. الاحتكاك معدوم.
51
+
52
+ ### 2. مهمة إنقاذ التراث
53
+
54
+ تخيل أنك ترث قاعدة كود ضخمة تحتوي على 5000 مكون وبدون أي ترجمات. تعديل هذا النظام ليعمل بنظام المفاتيح اليدوي هو كابوس يستمر لأشهر. أداة تعتمد على المترجم تعمل كاستراتيجية إنقاذ، حيث تستخرج آلاف السلاسل النصية فورًا دون الحاجة إلى لمس أي ملف يدويًا.
55
+
56
+ ### 3. عصر الذكاء الاصطناعي
57
+
58
+ هذه فائدة حديثة لا ينبغي أن نتجاهلها. مساعدو البرمجة بالذكاء الاصطناعي (مثل Copilot أو ChatGPT) يولدون بشكل طبيعي JSX/HTML قياسي. هم لا يعرفون مخطط مفاتيح الترجمة الخاص بك.
59
+
60
+ - **إعلاني:** عليك إعادة كتابة مخرجات الذكاء الاصطناعي لاستبدال النص بالمفاتيح.
61
+ - **المترجم:** تقوم بنسخ ولصق كود الذكاء الاصطناعي، ويعمل مباشرة.
62
+
63
+ ## فحص الواقع: لماذا "السحر" خطير
64
+
65
+ بينما يبدو "السحر" جذابًا، فإن التجريد يتسرب. الاعتماد على أداة بناء لفهم نية الإنسان يُدخل هشاشة معمارية.
66
+
67
+ ### 1. هشاشة الاستدلال (لعبة التخمين)
68
+
69
+ يجب على المترجم أن يخمن ما هو المحتوى وما هو الكود.
70
+
71
+ - هل يتم ترجمة `className="active"`؟ إنها سلسلة نصية.
72
+ - هل يتم ترجمة `status="pending"`؟
73
+ - هل يتم ترجمة `<MyComponent errorMessage="An error occurred" />`؟
74
+ - هل يتم ترجمة معرف منتج مثل `"AX-99"`؟
75
+
76
+ في النهاية، ستجد نفسك "تقاتل" المترجم، مضيفًا تعليقات محددة (مثل `// ignore-translation`) لمنعه من كسر منطق تطبيقك.
77
+
78
+ ### 2. الحد الصعب للبيانات الديناميكية
79
+
80
+ يعتمد استخراج المترجم على **التحليل الثابت**. يجب أن يرى السلسلة النصية الحرفية في كودك لتوليد معرف ثابت.
81
+ إذا أعاد API الخاص بك رمز خطأ مثل `server_error`، فلا يمكنك ترجمته باستخدام المترجم لأن المترجم لا يعرف بوجود هذه السلسلة أثناء وقت البناء. تُجبر على بناء نظام ثانوي "للتشغيل فقط" مخصص للبيانات الديناميكية.
82
+
83
+ ### 3. "انفجار القطع" وشلالات الشبكة
84
+
85
+ للسماح بعملية tree-shaking، غالبًا ما تقوم أدوات المترجم بتقسيم الترجمات حسب المكون.
86
+
87
+ - **النتيجة:** قد يؤدي عرض صفحة واحدة تحتوي على 50 مكونًا صغيرًا إلى تفعيل **50 طلب HTTP منفصل** لقطع ترجمة صغيرة. حتى مع HTTP/2، يخلق هذا شلالًا في الشبكة يجعل تطبيقك يبدو بطيئًا مقارنة بتحميل حزمة لغة واحدة محسّنة.
88
+
89
+ ### 4. العبء على أداء وقت التشغيل
90
+
91
+ لجعل الترجمات تفاعلية (حتى يتم تحديثها فورًا عند تبديل اللغات)، غالبًا ما يقوم المترجم بحقن خطافات إدارة الحالة في _كل_ مكون.
92
+
93
+ - **التكلفة:** إذا قمت بعرض قائمة تحتوي على 5000 عنصر، فأنت تقوم بتهيئة 5000 من خطافات `useState` و `useEffect` فقط للنصوص. هذا يستهلك الذاكرة ودورات وحدة المعالجة المركزية التي توفرها المكتبات التصريحية (التي تستخدم عادة مزود Context واحد).
94
+
95
+ ## الفخ: التقييد بالبائع
96
+
97
+ هذا ربما يكون أخطر جانب في التدويل المعتمد على المترجم.
98
+
99
+ في مكتبة تصريحية، يحتوي كود المصدر الخاص بك على نية صريحة. أنت تملك المفاتيح. إذا قمت بتغيير المكتبة، فقط تغير الاستيراد.
100
+
101
+ في النهج المعتمد على المترجم، **كود المصدر الخاص بك هو مجرد نص إنجليزي.** "منطق الترجمة" موجود فقط داخل تكوين إضافة البناء.
102
+ إذا توقف ذلك المكتبة عن الصيانة، أو إذا تجاوزتها، فأنت عالق. لا يمكنك "الإخراج" بسهولة لأنك لا تملك أي مفاتيح ترجمة في شفرتك المصدرية. سيتعين عليك إعادة كتابة تطبيقك بالكامل يدويًا للانتقال بعيدًا.
103
+
104
+ ## الجانب الآخر: مخاطر النهج التصريحي
105
+
106
+ لكي نكون منصفين، الطريقة التصريحية التقليدية ليست مثالية أيضًا. لديها مجموعة من "المشاكل الذاتية".
107
+
108
+ 1. **جحيم المساحات الاسمية:** غالبًا ما يتعين عليك إدارة ملفات JSON التي يجب تحميلها يدويًا (`common.json`، `dashboard.json`، `footer.json`). إذا نسيت واحدًا، سيرى المستخدم المفاتيح الخام.
109
+ 2. **التحميل الزائد:** بدون تكوين دقيق، من السهل جدًا تحميل _جميع_ مفاتيح الترجمة الخاصة بك لـ _جميع_ الصفحات عند التحميل الأولي، مما يزيد من حجم الحزمة.
110
+ 3. **انحراف التزامن:** من الشائع أن تبقى المفاتيح في ملف JSON لفترة طويلة بعد حذف المكون الذي يستخدمها. تنمو ملفات الترجمة الخاصة بك بلا حدود، مليئة بـ "مفاتيح الزومبي".
111
+
112
+ ## الحل الوسط مع Intlayer
113
+
114
+ هنا تحاول أدوات مثل **Intlayer** الابتكار. يفهم Intlayer أنه بينما المترجمات قوية، فإن السحر الضمني خطير.
115
+
116
+ يقدم Intlayer أمرًا فريدًا **`transform`**. بدلاً من القيام بالسحر فقط في خطوة البناء المخفية، يمكنه فعليًا **إعادة كتابة كود المكون الخاص بك**. يقوم بمسح نصك ويستبدله بإعلانات محتوى صريحة في قاعدة الكود الخاصة بك.
117
+
118
+ هذا يمنحك أفضل ما في العالمين:
119
+
120
+ 1. **الدقة:** تحتفظ بترجماتك قريبة من مكوناتك (محسنًا التجزئة وإزالة الشجر).
121
+ 2. **الأمان:** تصبح الترجمة كودًا صريحًا، وليس سحرًا مخفيًا في وقت البناء.
122
+ 3. **عدم القفل:** نظرًا لأن الكود يتم تحويله إلى هيكل إعلاني قياسي داخل مستودعك، فلن تخفي المنطق في إضافة webpack.
123
+
124
+ ## الخلاصة
125
+
126
+ فأي منهما يجب أن تختار؟
127
+
128
+ **إذا كنت مطورًا مبتدئًا، أو مؤسسًا منفردًا، أو تبني MVP:**
129
+ النهج القائم على المترجم هو خيار صالح. يسمح لك بالتحرك بسرعة كبيرة. لا تحتاج إلى القلق بشأن هياكل الملفات أو المفاتيح. فقط تبني. الدين الفني هو مشكلة لـ "أنت في المستقبل".
130
+
131
+ **إذا كنت تبني تطبيقًا احترافيًا على مستوى المؤسسات:**
132
+ السحر عادةً ما يكون فكرة سيئة. تحتاج إلى السيطرة.
133
+
134
+ - تحتاج إلى التعامل مع البيانات الديناميكية من الخلفيات.
135
+ - تحتاج إلى ضمان الأداء على الأجهزة منخفضة المواصفات (تجنب انفجارات الـ hooks).
136
+ - تحتاج إلى التأكد من أنك لست مقيدًا بأداة بناء معينة إلى الأبد.
137
+
138
+ بالنسبة للتطبيقات الاحترافية، يظل **إدارة المحتوى التصريحية** (مثل Intlayer أو المكتبات المعروفة) المعيار الذهبي. فهي تفصل بين اهتماماتك، وتحافظ على نظافة هيكلك، وتضمن أن قدرة تطبيقك على التحدث بعدة لغات لا تعتمد على "صندوق أسود" يقوم المترجم بتخمين نواياك.
@@ -176,7 +176,6 @@ export default config;
176
176
  ```plaintext fileName=".gitignore"
177
177
  # تجاهل الملفات التي تم إنشاؤها بواسطة Intlayer
178
178
  .intlayer
179
- intl
180
179
  ```
181
180
 
182
181
  يتم إعادة إنشاء هذه الملفات تلقائيًا أثناء عملية البناء ولا تحتاج إلى الالتزام بها في مستودعك.
@@ -166,7 +166,6 @@ export default config;
166
166
  ```plaintext fileName=".gitignore"
167
167
  # تجاهل الملفات التي تم إنشاؤها بواسطة Intlayer
168
168
  .intlayer
169
- intl
170
169
  ```
171
170
 
172
171
  يتم إعادة إنشاء هذه الملفات تلقائيًا أثناء عملية البناء ولا تحتاج إلى الالتزام بها في مستودعك.
@@ -0,0 +1,138 @@
1
+ ---
2
+ createdAt: 2025-11-24
3
+ updatedAt: 2025-11-24
4
+ title: Compiler vs. deklarative i18n
5
+ description: Untersuchung der architektonischen Kompromisse zwischen "magischer" compiler-basierter Internationalisierung und explizitem deklarativem Content-Management.
6
+ keywords:
7
+ - Intlayer
8
+ - Internationalisierung
9
+ - Blog
10
+ - Next.js
11
+ - JavaScript
12
+ - React
13
+ - i18n
14
+ - Compiler
15
+ - Deklarativ
16
+ slugs:
17
+ - compiler-vs-declarative-i18n
18
+ - blog
19
+ - i18n
20
+ ---
21
+
22
+ # Pro und Contra compiler-basierte i18n
23
+
24
+ Wenn Sie seit mehr als einem Jahrzehnt Webanwendungen entwickeln, wissen Sie, dass Internationalisierung (i18n) schon immer ein Reibungspunkt war. Es ist oft die Aufgabe, die niemand machen möchte – Strings extrahieren, JSON-Dateien verwalten und sich um Pluralisierungsregeln kümmern.
25
+
26
+ In letzter Zeit ist eine neue Welle von "compiler-basierten" i18n-Tools aufgetaucht, die versprechen, diesen Schmerz verschwinden zu lassen. Das Versprechen ist verlockend: **Schreiben Sie einfach den Text in Ihre Komponenten, und lassen Sie das Build-Tool den Rest erledigen.** Keine Keys, keine Importe, einfach Magie.
27
+
28
+ Aber wie bei allen Abstraktionen in der Softwareentwicklung hat Magie ihren Preis.
29
+
30
+ In diesem Blogbeitrag werden wir den Wandel von deklarativen Bibliotheken hin zu compiler-basierten Ansätzen untersuchen, die versteckten architektonischen Schulden, die sie mit sich bringen, und warum der "langweilige" Weg für professionelle Anwendungen immer noch der beste sein könnte.
31
+
32
+ ## Eine kurze Geschichte der Übersetzung
33
+
34
+ Um zu verstehen, wo wir stehen, müssen wir zurückblicken, wo wir angefangen haben.
35
+
36
+ Um 2011–2012 sah die JavaScript-Landschaft ganz anders aus. Bundler, wie wir sie heute kennen (Webpack, Vite), existierten entweder noch nicht oder steckten noch in den Kinderschuhen. Wir klebten Skripte direkt im Browser zusammen. In dieser Zeit entstanden Bibliotheken wie **i18next**.
37
+
38
+ Sie lösten das Problem auf die damals einzig mögliche Weise: **Runtime-Wörterbücher**. Man lud ein riesiges JSON-Objekt in den Speicher, und eine Funktion suchte die Schlüssel zur Laufzeit nach. Es war zuverlässig, explizit und funktionierte überall.
39
+
40
+ Spulen wir bis heute vor. Wir haben leistungsstarke Compiler (SWC, Rust-basierte Bundler), die Abstract Syntax Trees (AST) in Millisekunden parsen können. Diese Leistung brachte eine neue Idee hervor: _Warum verwalten wir Schlüssel manuell? Warum kann der Compiler nicht einfach den Text "Hello World" sehen und für uns austauschen?_
41
+
42
+ So wurde das compiler-basierte i18n geboren.
43
+
44
+ ## Der Reiz des Compilers (Der "Magische" Ansatz)
45
+
46
+ Es gibt einen Grund, warum dieser neue Ansatz im Trend liegt. Für einen Entwickler fühlt sich die Erfahrung unglaublich an.
47
+
48
+ ### 1. Geschwindigkeit und "Flow"
49
+
50
+ Wenn man im Flow ist, unterbricht das Nachdenken über einen Variablennamen (`home_hero_title_v2`) den Arbeitsfluss. Mit einem Compiler-Ansatz tippt man einfach `<p>Welcome back</p>` und macht weiter. Die Reibung ist null.
51
+
52
+ ### 2. Die Rettungsmission für Altbestände
53
+
54
+ Stellen Sie sich vor, Sie erben eine riesige Codebasis mit 5.000 Komponenten und null Übersetzungen. Diese manuell mit einem schlüsselbasierten System nachzurüsten, ist ein monatelanger Albtraum. Ein compilerbasiertes Tool fungiert als Rettungsstrategie, indem es sofort Tausende von Strings extrahiert, ohne dass Sie eine einzige Datei manuell anfassen müssen.
55
+
56
+ ### 3. Das KI-Zeitalter
57
+
58
+ Dies ist ein moderner Vorteil, den wir nicht übersehen sollten. KI-Coding-Assistenten (wie Copilot oder ChatGPT) erzeugen natürlicherweise standardmäßiges JSX/HTML. Sie kennen Ihr spezifisches Übersetzungsschlüsselschema nicht.
59
+
60
+ - **Deklarativ:** Sie müssen die Ausgabe der KI umschreiben, um Text durch Schlüssel zu ersetzen.
61
+ - **Compiler:** Sie kopieren den Code der KI einfach und es funktioniert sofort.
62
+
63
+ ## Die Realität: Warum "Magie" gefährlich ist
64
+
65
+ Obwohl die "Magie" verlockend ist, gibt es Undichtigkeiten in der Abstraktion. Sich auf ein Build-Tool zu verlassen, das menschliche Absichten versteht, führt zu architektonischer Fragilität.
66
+
67
+ ### 1. Heuristische Fragilität (Das Ratespiel)
68
+
69
+ Der Compiler muss erraten, was Inhalt und was Code ist.
70
+
71
+ - Wird `className="active"` übersetzt? Es ist ein String.
72
+ - Wird `status="pending"` übersetzt?
73
+ - Wird `<MyComponent errorMessage="An error occurred" />` übersetzt?
74
+ - Wird eine Produkt-ID wie `"AX-99"` übersetzt?
75
+
76
+ Sie enden unweigerlich damit, gegen den Compiler "anzukämpfen" und fügen spezifische Kommentare hinzu (wie `// ignore-translation`), um zu verhindern, dass er Ihre Anwendungslogik bricht.
77
+
78
+ ### 2. Die harte Grenze bei dynamischen Daten
79
+
80
+ Die Compiler-Extraktion basiert auf **statischer Analyse**. Sie muss den Literalstring in Ihrem Code sehen, um eine stabile ID zu generieren.
81
+ Wenn Ihre API einen Fehlercode-String wie `server_error` zurückgibt, können Sie ihn nicht mit einem Compiler übersetzen, da der Compiler diesen String zur Build-Zeit nicht kennt. Sie sind gezwungen, ein sekundäres "nur zur Laufzeit" System nur für dynamische Daten zu erstellen.
82
+
83
+ ### 3. "Chunk-Explosion" und Netzwerk-Wasserfälle
84
+
85
+ Um Tree-Shaking zu ermöglichen, teilen Compiler-Tools Übersetzungen oft pro Komponente auf.
86
+
87
+ - **Die Folge:** Eine einzelne Seitenansicht mit 50 kleinen Komponenten könnte **50 separate HTTP-Anfragen** für winzige Übersetzungsfragmente auslösen. Selbst mit HTTP/2 erzeugt dies eine Netzwerk-Wasserfallstruktur, die Ihre Anwendung im Vergleich zum Laden eines einzigen, optimierten Sprachpakets träge erscheinen lässt.
88
+
89
+ ### 4. Laufzeit-Performance-Overhead
90
+
91
+ Um Übersetzungen reaktiv zu machen (damit sie sich sofort aktualisieren, wenn Sie die Sprache wechseln), injiziert der Compiler häufig Zustandsverwaltungs-Hooks in _jede_ Komponente.
92
+
93
+ - **Die Kosten:** Wenn Sie eine Liste mit 5.000 Elementen rendern, initialisieren Sie 5.000 `useState`- und `useEffect`-Hooks ausschließlich für Text. Dies verbraucht Speicher und CPU-Zyklen, die deklarative Bibliotheken (die typischerweise einen einzigen Context-Provider verwenden) einsparen.
94
+
95
+ ## Die Falle: Vendor Lock-in
96
+
97
+ Dies ist wohl der gefährlichste Aspekt von compiler-basierter i18n.
98
+
99
+ In einer deklarativen Bibliothek enthält Ihr Quellcode eine explizite Absicht. Sie besitzen die Keys. Wenn Sie die Bibliothek wechseln, ändern Sie einfach den Import.
100
+
101
+ In einem compiler-basierten Ansatz ist **Ihr Quellcode nur englischer Text.** Die „Übersetzungslogik“ existiert nur in der Konfiguration des Build-Plugins.
102
+ Wenn diese Bibliothek nicht mehr gepflegt wird oder wenn Sie darüber hinauswachsen, sind Sie festgefahren. Sie können nicht einfach „aussteigen“, weil Sie keine Übersetzungsschlüssel in Ihrem Quellcode haben. Sie müssten Ihre gesamte Anwendung manuell neu schreiben, um zu migrieren.
103
+
104
+ ## Die andere Seite: Risiken des deklarativen Ansatzes
105
+
106
+ Um fair zu sein, ist der traditionelle deklarative Weg auch nicht perfekt. Er hat seine eigenen „Fußangeln“.
107
+
108
+ 1. **Namespace-Hölle:** Sie müssen oft manuell verwalten, welche JSON-Dateien geladen werden (`common.json`, `dashboard.json`, `footer.json`). Wenn Sie eine vergessen, sieht der Benutzer rohe Schlüssel.
109
+ 2. **Übermäßiges Laden:** Ohne sorgfältige Konfiguration ist es sehr einfach, versehentlich _alle_ Ihre Übersetzungsschlüssel für _alle_ Seiten beim ersten Laden zu laden, was Ihre Bundle-Größe aufbläht.
110
+ 3. **Synchronisationsabweichung:** Es ist üblich, dass Schlüssel lange nach der Löschung der sie verwendenden Komponente in der JSON-Datei verbleiben. Ihre Übersetzungsdateien wachsen unendlich und sind mit „Zombie-Schlüsseln“ gefüllt.
111
+
112
+ ## Der Mittelweg mit Intlayer
113
+
114
+ Hier versuchen Werkzeuge wie **Intlayer** zu innovieren. Intlayer versteht, dass Compiler zwar mächtig sind, implizite Magie jedoch gefährlich ist.
115
+
116
+ Intlayer bietet einen einzigartigen **`transform`-Befehl** an. Anstatt nur Magie im versteckten Build-Schritt auszuführen, kann es tatsächlich **Ihren Komponenten-Code umschreiben**. Es scannt Ihren Text und ersetzt ihn durch explizite Inhaltsdeklarationen in Ihrem Codebase.
117
+
118
+ Das bietet Ihnen das Beste aus beiden Welten:
119
+
120
+ 1. **Granularität:** Sie halten Ihre Übersetzungen nah an Ihren Komponenten (verbessert Modularität und Tree-Shaking).
121
+ 2. **Sicherheit:** Die Übersetzung wird zu explizitem Code, nicht zu versteckter Build-Zeit-Magie.
122
+ 3. **Keine Bindung:** Da der Code in eine standardisierte deklarative Struktur innerhalb Ihres Repositories umgewandelt wird, verstecken Sie keine Logik in einem Webpack-Plugin.
123
+
124
+ ## Fazit
125
+
126
+ Welche Methode sollten Sie also wählen?
127
+
128
+ **Wenn Sie ein Junior-Entwickler, ein Solo-Gründer oder ein MVP-Ersteller sind:**
129
+ Der compilerbasierte Ansatz ist eine gültige Wahl. Er ermöglicht es Ihnen, unglaublich schnell voranzukommen. Sie müssen sich nicht um Dateistrukturen oder Schlüssel kümmern. Sie bauen einfach. Die technische Schuld ist ein Problem für das „zukünftige Sie“.
130
+
131
+ **Wenn Sie eine professionelle, unternehmensgerechte Anwendung entwickeln:**
132
+ Magie ist im Allgemeinen eine schlechte Idee. Sie brauchen Kontrolle.
133
+
134
+ - Sie müssen dynamische Daten von Backends verarbeiten.
135
+ - Sie müssen die Leistung auf Geräten mit geringer Leistung sicherstellen (Vermeidung von Hook-Explosionen).
136
+ - Sie müssen sicherstellen, dass Sie nicht für immer an ein bestimmtes Build-Tool gebunden sind.
137
+
138
+ Für professionelle Anwendungen bleibt **Deklaratives Content Management** (wie Intlayer oder etablierte Bibliotheken) der Goldstandard. Es trennt Ihre Anliegen, hält Ihre Architektur sauber und stellt sicher, dass die Mehrsprachigkeitsfähigkeit Ihrer Anwendung nicht von einem „Black-Box“-Compiler abhängt, der Ihre Absichten errät.
@@ -177,7 +177,6 @@ Schließen Sie generierte Dateien von der Versionskontrolle aus:
177
177
  ```plaintext fileName=".gitignore"
178
178
  # Dateien ignorieren, die von Intlayer generiert werden
179
179
  .intlayer
180
- intl
181
180
  ```
182
181
 
183
182
  Diese Dateien werden während des Build-Prozesses automatisch neu generiert und müssen nicht in Ihr Repository eingecheckt werden.
@@ -166,7 +166,6 @@ Schließen Sie generierte Dateien von der Versionskontrolle aus:
166
166
  ```plaintext fileName=".gitignore"
167
167
  # Ignoriere von Intlayer generierte Dateien
168
168
  .intlayer
169
- intl
170
169
  ```
171
170
 
172
171
  Diese Dateien werden während des Build-Prozesses automatisch neu generiert und müssen nicht in Ihr Repository übernommen werden.
@@ -0,0 +1,138 @@
1
+ ---
2
+ createdAt: 2025-11-24
3
+ updatedAt: 2025-11-24
4
+ title: Compiler vs. Declarative i18n
5
+ description: Exploring the architectural trade-offs between "magic" compiler-based internationalization and explicit declarative content management.
6
+ keywords:
7
+ - Intlayer
8
+ - Internationalization
9
+ - Blog
10
+ - Next.js
11
+ - JavaScript
12
+ - React
13
+ - i18n
14
+ - Compiler
15
+ - Declarative
16
+ slugs:
17
+ - compiler-vs-declarative-i18n
18
+ - blog
19
+ - i18n
20
+ ---
21
+
22
+ # The Case for and Against Compiler-Based i18n
23
+
24
+ If you have been building web applications for more than a decade, you know that Internationalization (i18n) has always been a friction point. It is often the task no one wants to do—extracting strings, managing JSON files, and worrying about pluralization rules.
25
+
26
+ Recently, a new wave of "Compiler-based" i18n tools has emerged, promising to make this pain disappear. The pitch is seductive: **Just write text in your components, and let the build tool handle the rest.** No keys, no imports, just magic.
27
+
28
+ But as with all abstractions in software engineering, magic comes with a price.
29
+
30
+ In this blog post, we will explore the shift from declarative libraries to compiler-based approaches, the hidden architectural debts they introduce, and why the "boring" way might still be the best way for professional applications.
31
+
32
+ ## A Brief History of Translation
33
+
34
+ To understand where we are, we have to look back at where we started.
35
+
36
+ Around 2011–2012, the JavaScript landscape was vastly different. Bundlers as we know them (Webpack, Vite) didn't exist or were in their infancy. We were glueing scripts together in the browser. In this era, libraries like **i18next** were born.
37
+
38
+ They solved the problem the only way possible at the time: **Runtime Dictionaries**. You loaded a massive JSON object into memory, and a function looked up keys on the fly. It was reliable, explicit, and worked everywhere.
39
+
40
+ Fast forward to today. We have powerful compilers (SWC, Rust-based bundlers) that can parse Abstract Syntax Trees (AST) in milliseconds. This power gave birth to a new idea: _Why are we manually managing keys? Why can't the compiler just see the text "Hello World" and swap it out for us?_
41
+
42
+ Thus, Compiler-based i18n was born.
43
+
44
+ ## The Allure of the Compiler (The "Magic" Approach)
45
+
46
+ There is a reason this new approach is trending. For a developer, the experience feels incredible.
47
+
48
+ ### 1. Speed and "Flow"
49
+
50
+ When you are in the zone, stopping to think of a variable name (`home_hero_title_v2`) breaks your flow. With a compiler approach, you type `<p>Welcome back</p>` and keep moving. The friction is zero.
51
+
52
+ ### 2. The Legacy Rescue Mission
53
+
54
+ Imagine inheriting a massive codebase with 5,000 components and zero translations. Retrofitting this with a manual key-based system is a months-long nightmare. A compiler-based tool acts as a rescue strategy, instantly extracting thousands of strings without you needing to touch a single file manually.
55
+
56
+ ### 3. The AI Era
57
+
58
+ This is a modern benefit we shouldn't overlook. AI coding assistants (like Copilot or ChatGPT) naturally generate standard JSX/HTML. They don't know your specific translation key schema.
59
+
60
+ - **Declarative:** You have to rewrite the AI's output to replace text with keys.
61
+ - **Compiler:** You copy-paste the AI's code, and it just works.
62
+
63
+ ## The Reality Check: Why "Magic" is Dangerous
64
+
65
+ While the "magic" is appealing, the abstraction leaks. Relying on a build tool to understand human intent introduces architectural fragility.
66
+
67
+ ### 1. Heuristic Fragility (The Guessing Game)
68
+
69
+ The compiler has to guess what is content and what is code.
70
+
71
+ - Does `className="active"` get translated? It's a string.
72
+ - Does `status="pending"` get translated?
73
+ - Does `<MyComponent errorMessage="An error occurred" />` get translated?
74
+ - Does a product ID like `"AX-99"` get translated?
75
+
76
+ You inevitably end up "fighting" the compiler, adding specific comments (like `// ignore-translation`) to prevent it from breaking your application logic.
77
+
78
+ ### 2. The Dynamic Data Hard Limit
79
+
80
+ Compiler extraction relies on **static analysis**. It must see the literal string in your code to generate a stable ID.
81
+ If your API returns an error code string like `server_error`, you cannot translate it with a compiler because the compiler doesn't know that string exists at build time. You are forced to build a secondary "runtime-only" system just for dynamic data.
82
+
83
+ ### 3. "Chunk Explosion" and Network Waterfalls
84
+
85
+ To allow for tree-shaking, compiler tools often split translations per component.
86
+
87
+ - **The Consequence:** A single page view with 50 small components might trigger **50 separate HTTP requests** for tiny translation fragments. Even with HTTP/2, this creates a network waterfall that makes your application feel sluggish compared to loading a single, optimized language bundle.
88
+
89
+ ### 4. Runtime Performance Overhead
90
+
91
+ To make translations reactive (so they update instantly when you switch languages), the compiler often injects state management hooks into _every_ component.
92
+
93
+ - **The Cost:** If you render a list of 5,000 items, you are initializing 5,000 `useState` and `useEffect` hooks solely for text. This eats up memory and CPU cycles that declarative libraries (which typically use a single Context provider) save.
94
+
95
+ ## The Trap: Vendor Lock-in
96
+
97
+ This is arguably the most dangerous aspect of compiler-based i18n.
98
+
99
+ In a declarative library, your source code contains explicit intent. You own the keys. If you switch libraries, you just change the import.
100
+
101
+ In a compiler-based approach, **your source code is just English text.** The "translation logic" only exists inside the build plugin's configuration.
102
+ If that library stops being maintained, or if you outgrow it, you are stuck. You cannot "eject" easily because you have zero translation keys in your source code. You would have to manually rewrite your entire application to migrate away.
103
+
104
+ ## The Other Side: Risks of the Declarative Approach
105
+
106
+ To be fair, the traditional declarative way isn't perfect either. It has its own set of "footguns."
107
+
108
+ 1. **Namespace Hell:** You often have to manually manage which JSON files to load (`common.json`, `dashboard.json`, `footer.json`). If you forget one, the user sees raw keys.
109
+ 2. **Over-fetching:** Without careful configuration, it is very easy to accidentally load _all_ your translation keys for _all_ pages on the initial load, bloating your bundle size.
110
+ 3. **Sync Drift:** It is common for keys to remain in the JSON file long after the component using them has been deleted. Your translation files grow indefinitely, filled with "zombie keys."
111
+
112
+ ## The Intlayer Middle Ground
113
+
114
+ This is where tools like **Intlayer** are trying to innovate. Intlayer understands that while compilers are powerful, implicit magic is dangerous.
115
+
116
+ Intlayer offers a unique **`transform` command**. Instead of just doing magic in the hidden build step, it can actually **rewrite your component code**. It scans your text and replaces it with explicit content declarations in your codebase.
117
+
118
+ This gives you the best of both worlds:
119
+
120
+ 1. **Granularity:** You keep your translations close to your components (improving modularity and tree-shaking).
121
+ 2. **Safety:** The translation becomes explicit code, not hidden build-time magic.
122
+ 3. **No Lock-in:** Since the code is transformed into a standard declarative structure within your repo, you aren't hiding logic in a webpack plugin.
123
+
124
+ ## Conclusion
125
+
126
+ So, which should you choose?
127
+
128
+ **If you are a Junior Developer, a Solo Founder, or building an MVP:**
129
+ The compiler-based approach is a valid choice. It allows you to move incredibly fast. You don't need to worry about file structures or keys. You just build. The technical debt is a problem for "Future You."
130
+
131
+ **If you are building a Professional, Enterprise-Grade Application:**
132
+ Magic is generally a bad idea. You need control.
133
+
134
+ - You need to handle dynamic data from backends.
135
+ - You need to ensure performance on low-end devices (avoiding hook explosions).
136
+ - You need to ensure you aren't locked into a specific build tool forever.
137
+
138
+ For professional apps, **Declarative Content Management** (like Intlayer or established libraries) remains the gold standard. It separates your concerns, keeps your architecture clean, and ensures that your application's ability to speak multiple languages isn't dependent on a "black box" compiler guessing your intentions.
@@ -1061,7 +1061,7 @@ Intlayer will allows your to:
1061
1061
  Intlayer provide test functions to that can be integrated in your CI/CD pipeline, or in your unit tests. Learn more about [testing your translations](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/testing.md).
1062
1062
 
1063
1063
  - **Automate your translations**,
1064
- Intlayer provide a CLI and a VSCode extension to automate your translations. It can be integrated in your CI/CD pipeline. Learn more about [automating your translations](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_cli.md).
1064
+ Intlayer provide a CLI and a VSCode extension to automate your translations. It can be integrated in your CI/CD pipeline. Learn more about [automating your translations](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
1065
1065
  You can use your **own API key, and the AI provider of your choice**. It also provide context aware translations, see [fill content](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/autoFill.md).
1066
1066
 
1067
1067
  - **Connect external content**
@@ -745,7 +745,7 @@ Intlayer will allows your to:
745
745
  Intlayer provide test functions to that can be integrated in your CI/CD pipeline, or in your unit tests. Learn more about [testing your translations](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/testing.md).
746
746
 
747
747
  - **Automate your translations**,
748
- Intlayer provide a CLI and a VSCode extension to automate your translations. It can be integrated in your CI/CD pipeline. Learn more about [automating your translations](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_cli.md).
748
+ Intlayer provide a CLI and a VSCode extension to automate your translations. It can be integrated in your CI/CD pipeline. Learn more about [automating your translations](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
749
749
  You can use your **own API key, and the AI provider of your choice**. It also provide context aware translations, see [fill content](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/autoFill.md).
750
750
 
751
751
  - **Connect external content**
@@ -218,7 +218,7 @@ npx intlayer fill
218
218
  This will fill your translations with the AI provider you have configured.
219
219
 
220
220
  > See all the available AI providers in the [Intlayer AI configuration documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md#ai-configuration).
221
- > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_cli.md).
221
+ > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
222
222
 
223
223
  ---
224
224
 
@@ -218,7 +218,7 @@ npx intlayer fill
218
218
  This will fill your translations with the AI provider you have configured.
219
219
 
220
220
  > See all the available AI providers in the [Intlayer AI configuration documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md#ai-configuration).
221
- > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_cli.md).
221
+ > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
222
222
 
223
223
  ---
224
224
 
@@ -229,7 +229,6 @@ Exclude generated files from version control:
229
229
  ```plaintext fileName=".gitignore"
230
230
  # Ignore files generated by Intlayer
231
231
  .intlayer
232
- intl
233
232
  ```
234
233
 
235
234
  These files are automatically regenerated during the build process and don't need to be committed to your repository.
@@ -203,7 +203,7 @@ npx intlayer fill
203
203
  This will fill your translations with the AI provider you have configured.
204
204
 
205
205
  > See all the available AI providers in the [Intlayer AI configuration documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md#ai-configuration).
206
- > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_cli.md).
206
+ > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
207
207
 
208
208
  ---
209
209
 
@@ -214,7 +214,7 @@ npx intlayer fill
214
214
  This will fill your translations with the AI provider you have configured.
215
215
 
216
216
  > See all the available AI providers in the [Intlayer AI configuration documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md#ai-configuration).
217
- > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_cli.md).
217
+ > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
218
218
 
219
219
  ## Git Configuration
220
220
 
@@ -212,7 +212,7 @@ npx intlayer fill
212
212
  This will fill your translations with the AI provider you have configured.
213
213
 
214
214
  > See all the available AI providers in the [Intlayer AI configuration documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md#ai-configuration).
215
- > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_cli.md).
215
+ > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
216
216
 
217
217
  ---
218
218
 
@@ -216,7 +216,7 @@ npx intlayer fill
216
216
  This will fill your translations with the AI provider you have configured.
217
217
 
218
218
  > See all the available AI providers in the [Intlayer AI configuration documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md#ai-configuration).
219
- > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_cli.md).
219
+ > See all the available commands in the [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
220
220
 
221
221
  ---
222
222
 
@@ -227,7 +227,6 @@ Exclude generated files from version control:
227
227
  ```plaintext fileName=".gitignore"
228
228
  # Ignore files generated by Intlayer
229
229
  .intlayer
230
- intl
231
230
  ```
232
231
 
233
232
  These files are automatically regenerated during the build process and don't need to be committed to your repository.