@intlayer/docs 9.1.3 → 9.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 (482) hide show
  1. package/blog/ar/index.md +1 -1
  2. package/blog/ar/rag_powered_documentation_assistant.md +7 -0
  3. package/blog/de/index.md +1 -1
  4. package/blog/de/rag_powered_documentation_assistant.md +6 -0
  5. package/blog/en/index.md +1 -1
  6. package/blog/en-GB/index.md +1 -1
  7. package/blog/en-GB/rag_powered_documentation_assistant.md +6 -0
  8. package/blog/es/index.md +1 -1
  9. package/blog/es/rag_powered_documentation_assistant.md +7 -0
  10. package/blog/fr/i18n_meaning.md +7 -1
  11. package/blog/fr/index.md +1 -1
  12. package/blog/fr/list_i18n_technologies/frameworks/angular.md +5 -1
  13. package/blog/fr/rag_powered_documentation_assistant.md +6 -0
  14. package/blog/hi/index.md +1 -1
  15. package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +119 -42
  16. package/blog/hi/rag_powered_documentation_assistant.md +7 -0
  17. package/blog/id/index.md +1 -1
  18. package/blog/id/rag_powered_documentation_assistant.md +6 -0
  19. package/blog/it/index.md +1 -1
  20. package/blog/it/rag_powered_documentation_assistant.md +6 -0
  21. package/blog/ja/index.md +1 -1
  22. package/blog/ja/rag_powered_documentation_assistant.md +7 -0
  23. package/blog/ko/index.md +1 -1
  24. package/blog/ko/list_i18n_technologies/frameworks/react.md +7 -7
  25. package/blog/ko/rag_powered_documentation_assistant.md +6 -0
  26. package/blog/pl/index.md +1 -1
  27. package/blog/pl/rag_powered_documentation_assistant.md +6 -0
  28. package/blog/pt/index.md +1 -1
  29. package/blog/pt/rag_powered_documentation_assistant.md +6 -0
  30. package/blog/ru/index.md +1 -1
  31. package/blog/ru/rag_powered_documentation_assistant.md +7 -0
  32. package/blog/tr/intlayer_with_react-intl.md +3 -1
  33. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +175 -42
  34. package/blog/tr/rag_powered_documentation_assistant.md +6 -0
  35. package/blog/uk/index.md +1 -1
  36. package/blog/uk/rag_powered_documentation_assistant.md +6 -0
  37. package/blog/vi/index.md +1 -1
  38. package/blog/vi/rag_powered_documentation_assistant.md +6 -0
  39. package/blog/zh/index.md +1 -1
  40. package/blog/zh/intlayer_with_i18next.md +87 -28
  41. package/blog/zh/intlayer_with_next-i18next.md +86 -29
  42. package/blog/zh/intlayer_with_next-intl.md +88 -28
  43. package/blog/zh/intlayer_with_react-i18next.md +87 -28
  44. package/blog/zh/intlayer_with_react-intl.md +88 -27
  45. package/blog/zh/intlayer_with_vue-i18n.md +117 -8
  46. package/blog/zh/rag_powered_documentation_assistant.md +6 -0
  47. package/dist/cjs/common.cjs +24 -1
  48. package/dist/cjs/common.cjs.map +1 -1
  49. package/dist/cjs/generated/blog.entry.cjs +58 -31
  50. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  51. package/dist/cjs/generated/docs.entry.cjs +265 -218
  52. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  53. package/dist/cjs/generated/frequentQuestions.entry.cjs +48 -21
  54. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  55. package/dist/cjs/generated/legal.entry.cjs +33 -6
  56. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  57. package/dist/esm/common.mjs +24 -1
  58. package/dist/esm/common.mjs.map +1 -1
  59. package/dist/esm/generated/blog.entry.mjs +58 -31
  60. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  61. package/dist/esm/generated/docs.entry.mjs +265 -218
  62. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  63. package/dist/esm/generated/frequentQuestions.entry.mjs +48 -21
  64. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  65. package/dist/esm/generated/legal.entry.mjs +33 -6
  66. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  67. package/dist/types/common.d.ts.map +1 -1
  68. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  69. package/dist/types/generated/docs.entry.d.ts +1 -0
  70. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  71. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  72. package/dist/types/generated/legal.entry.d.ts.map +1 -1
  73. package/docs/ar/analytics.md +222 -0
  74. package/docs/ar/autoFill.md +28 -9
  75. package/docs/ar/bundle_optimization.md +58 -25
  76. package/docs/ar/configuration.md +25 -8
  77. package/docs/ar/dictionary/file.md +3 -1
  78. package/docs/ar/dictionary/nesting.md +47 -30
  79. package/docs/ar/formatters.md +148 -193
  80. package/docs/ar/intlayer_CMS.md +152 -0
  81. package/docs/ar/intlayer_with_angular_21.md +9 -9
  82. package/docs/ar/intlayer_with_nextjs_14.md +1 -28
  83. package/docs/ar/intlayer_with_nextjs_15.md +1 -33
  84. package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +40 -83
  85. package/docs/ar/intlayer_with_solid_start.md +1078 -0
  86. package/docs/ar/intlayer_with_vite+vue.md +1 -3
  87. package/docs/ar/live-sync.md +4 -0
  88. package/docs/ar/packages/intlayer/getLocalizedUrl.md +26 -24
  89. package/docs/ar/packages/intlayer/getMultilingualUrls.md +4 -18
  90. package/docs/ar/packages/react-intlayer/useDictionary.md +4 -21
  91. package/docs/ar/packages/react-intlayer/useIntlayer.md +2 -2
  92. package/docs/ar/packages/vite-intlayer/exports.md +15 -0
  93. package/docs/ar/packages/vite-intlayer/intlayer.md +121 -6
  94. package/docs/ar/packages/vite-intlayer/intlayerPrune.md +70 -3
  95. package/docs/ar/releases/v9.md +0 -37
  96. package/docs/ar/self_hosting.md +46 -49
  97. package/docs/bn/bundle_optimization.md +58 -25
  98. package/docs/bn/configuration.md +25 -8
  99. package/docs/bn/intlayer_with_angular_21.md +9 -9
  100. package/docs/cs/bundle_optimization.md +58 -25
  101. package/docs/cs/configuration.md +25 -8
  102. package/docs/cs/intlayer_with_angular_21.md +9 -9
  103. package/docs/de/analytics.md +222 -0
  104. package/docs/de/autoFill.md +28 -9
  105. package/docs/de/bundle_optimization.md +58 -25
  106. package/docs/de/configuration.md +25 -8
  107. package/docs/de/dictionary/file.md +3 -1
  108. package/docs/de/dictionary/nesting.md +47 -31
  109. package/docs/de/formatters.md +208 -334
  110. package/docs/de/intlayer_CMS.md +66 -15
  111. package/docs/de/intlayer_with_angular_21.md +9 -9
  112. package/docs/de/intlayer_with_nestjs.md +11 -7
  113. package/docs/de/intlayer_with_nextjs_14.md +1 -28
  114. package/docs/de/intlayer_with_nextjs_15.md +1 -33
  115. package/docs/de/intlayer_with_solid_start.md +1078 -0
  116. package/docs/de/intlayer_with_vite+vue.md +1 -3
  117. package/docs/de/live-sync.md +4 -0
  118. package/docs/de/packages/intlayer/getLocalizedUrl.md +33 -25
  119. package/docs/de/packages/intlayer/getMultilingualUrls.md +4 -18
  120. package/docs/de/packages/react-intlayer/useDictionary.md +2 -5
  121. package/docs/de/packages/vite-intlayer/exports.md +15 -0
  122. package/docs/de/packages/vite-intlayer/intlayer.md +121 -6
  123. package/docs/de/packages/vite-intlayer/intlayerPrune.md +77 -4
  124. package/docs/de/releases/v9.md +0 -15
  125. package/docs/de/self_hosting.md +46 -50
  126. package/docs/en/bundle_optimization.md +51 -23
  127. package/docs/en/cli/doc-review.md +13 -2
  128. package/docs/en/configuration.md +24 -15
  129. package/docs/en/intlayer_with_angular_21.md +9 -9
  130. package/docs/en/intlayer_with_solid_start.md +1091 -0
  131. package/docs/en/intlayer_with_vite+solid.md +12 -0
  132. package/docs/en/live-sync.md +4 -0
  133. package/docs/en-GB/analytics.md +222 -0
  134. package/docs/en-GB/autoFill.md +26 -7
  135. package/docs/en-GB/bundle_optimization.md +58 -25
  136. package/docs/en-GB/configuration.md +25 -8
  137. package/docs/en-GB/dictionary/file.md +2 -0
  138. package/docs/en-GB/dictionary/nesting.md +64 -205
  139. package/docs/en-GB/formatters.md +146 -181
  140. package/docs/en-GB/intlayer_CMS.md +152 -0
  141. package/docs/en-GB/intlayer_with_angular_21.md +9 -9
  142. package/docs/en-GB/intlayer_with_nestjs.md +6 -2
  143. package/docs/en-GB/intlayer_with_nextjs_14.md +0 -27
  144. package/docs/en-GB/intlayer_with_nextjs_15.md +1 -33
  145. package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +40 -82
  146. package/docs/en-GB/intlayer_with_solid_start.md +1078 -0
  147. package/docs/en-GB/intlayer_with_vite+vue.md +1 -3
  148. package/docs/en-GB/live-sync.md +4 -0
  149. package/docs/en-GB/packages/intlayer/getLocalizedUrl.md +30 -22
  150. package/docs/en-GB/packages/intlayer/getMultilingualUrls.md +16 -48
  151. package/docs/en-GB/packages/vite-intlayer/exports.md +15 -0
  152. package/docs/en-GB/packages/vite-intlayer/intlayer.md +121 -6
  153. package/docs/en-GB/packages/vite-intlayer/intlayerPrune.md +77 -4
  154. package/docs/en-GB/self_hosting.md +60 -49
  155. package/docs/es/analytics.md +222 -0
  156. package/docs/es/autoFill.md +28 -9
  157. package/docs/es/bundle_optimization.md +58 -25
  158. package/docs/es/configuration.md +24 -7
  159. package/docs/es/dictionary/file.md +3 -1
  160. package/docs/es/dictionary/nesting.md +47 -30
  161. package/docs/es/formatters.md +114 -168
  162. package/docs/es/intlayer_CMS.md +35 -10
  163. package/docs/es/intlayer_with_angular_21.md +9 -9
  164. package/docs/es/intlayer_with_nextjs_14.md +1 -28
  165. package/docs/es/intlayer_with_nextjs_15.md +1 -33
  166. package/docs/es/intlayer_with_solid_start.md +1078 -0
  167. package/docs/es/live-sync.md +4 -0
  168. package/docs/es/packages/intlayer/getLocalizedUrl.md +31 -23
  169. package/docs/es/packages/intlayer/getMultilingualUrls.md +4 -18
  170. package/docs/es/packages/vite-intlayer/exports.md +15 -0
  171. package/docs/es/packages/vite-intlayer/intlayer.md +121 -6
  172. package/docs/es/packages/vite-intlayer/intlayerPrune.md +69 -2
  173. package/docs/es/releases/v9.md +0 -15
  174. package/docs/es/self_hosting.md +46 -49
  175. package/docs/fr/analytics.md +222 -0
  176. package/docs/fr/autoFill.md +27 -8
  177. package/docs/fr/bundle_optimization.md +58 -25
  178. package/docs/fr/configuration.md +25 -8
  179. package/docs/fr/dictionary/file.md +2 -0
  180. package/docs/fr/dictionary/nesting.md +37 -184
  181. package/docs/fr/formatters.md +95 -236
  182. package/docs/fr/intlayer_CMS.md +66 -15
  183. package/docs/fr/intlayer_with_angular_21.md +9 -9
  184. package/docs/fr/intlayer_with_nextjs_14.md +1 -28
  185. package/docs/fr/intlayer_with_nextjs_15.md +1 -33
  186. package/docs/fr/intlayer_with_solid_start.md +1078 -0
  187. package/docs/fr/live-sync.md +4 -0
  188. package/docs/fr/packages/intlayer/getLocalizedUrl.md +37 -27
  189. package/docs/fr/packages/intlayer/getMultilingualUrls.md +18 -20
  190. package/docs/fr/packages/vite-intlayer/exports.md +15 -0
  191. package/docs/fr/packages/vite-intlayer/intlayer.md +121 -6
  192. package/docs/fr/packages/vite-intlayer/intlayerPrune.md +77 -4
  193. package/docs/fr/releases/v9.md +0 -15
  194. package/docs/fr/self_hosting.md +46 -49
  195. package/docs/hi/analytics.md +222 -0
  196. package/docs/hi/autoFill.md +28 -9
  197. package/docs/hi/bundle_optimization.md +58 -25
  198. package/docs/hi/configuration.md +25 -8
  199. package/docs/hi/dictionary/file.md +3 -1
  200. package/docs/hi/dictionary/nesting.md +47 -30
  201. package/docs/hi/formatters.md +233 -334
  202. package/docs/hi/how_works_intlayer.md +3 -1
  203. package/docs/hi/intlayer_CMS.md +152 -0
  204. package/docs/hi/intlayer_with_angular_21.md +9 -9
  205. package/docs/hi/intlayer_with_nestjs.md +11 -7
  206. package/docs/hi/intlayer_with_nextjs_14.md +1 -28
  207. package/docs/hi/intlayer_with_nextjs_15.md +1 -33
  208. package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +40 -83
  209. package/docs/hi/intlayer_with_solid_start.md +1077 -0
  210. package/docs/hi/intlayer_with_vite+preact.md +56 -49
  211. package/docs/hi/intlayer_with_vite+react.md +48 -41
  212. package/docs/hi/intlayer_with_vite+solid.md +32 -41
  213. package/docs/hi/intlayer_with_vite+vue.md +49 -44
  214. package/docs/hi/live-sync.md +4 -0
  215. package/docs/hi/packages/intlayer/getLocalizedUrl.md +26 -24
  216. package/docs/hi/packages/intlayer/getMultilingualUrls.md +4 -18
  217. package/docs/hi/packages/next-intlayer/t.md +33 -1
  218. package/docs/hi/packages/react-intlayer/useDictionary.md +4 -21
  219. package/docs/hi/packages/vite-intlayer/exports.md +15 -0
  220. package/docs/hi/packages/vite-intlayer/intlayer.md +121 -6
  221. package/docs/hi/packages/vite-intlayer/intlayerPrune.md +78 -5
  222. package/docs/hi/plugins/sync-json.md +9 -9
  223. package/docs/hi/releases/v9.md +0 -15
  224. package/docs/hi/self_hosting.md +38 -51
  225. package/docs/id/analytics.md +223 -0
  226. package/docs/id/bundle_optimization.md +58 -25
  227. package/docs/id/configuration.md +25 -8
  228. package/docs/id/dictionary/nesting.md +37 -184
  229. package/docs/id/formatters.md +208 -305
  230. package/docs/id/intlayer_CMS.md +164 -0
  231. package/docs/id/intlayer_with_angular_21.md +9 -9
  232. package/docs/id/intlayer_with_nextjs_14.md +1 -26
  233. package/docs/id/intlayer_with_react_router_v7_fs_routes.md +70 -63
  234. package/docs/id/intlayer_with_solid_start.md +1078 -0
  235. package/docs/id/live-sync.md +4 -0
  236. package/docs/id/packages/intlayer/getMultilingualUrls.md +4 -18
  237. package/docs/id/packages/react-intlayer/useIntlayer.md +2 -2
  238. package/docs/id/packages/vite-intlayer/exports.md +15 -0
  239. package/docs/id/packages/vite-intlayer/intlayer.md +121 -6
  240. package/docs/id/packages/vite-intlayer/intlayerPrune.md +78 -5
  241. package/docs/id/releases/v9.md +12 -0
  242. package/docs/id/self_hosting.md +61 -50
  243. package/docs/it/analytics.md +222 -0
  244. package/docs/it/autoFill.md +27 -8
  245. package/docs/it/bundle_optimization.md +58 -25
  246. package/docs/it/configuration.md +25 -8
  247. package/docs/it/dictionary/file.md +3 -1
  248. package/docs/it/dictionary/nesting.md +47 -30
  249. package/docs/it/formatters.md +114 -168
  250. package/docs/it/intlayer_CMS.md +66 -15
  251. package/docs/it/intlayer_with_angular_21.md +9 -9
  252. package/docs/it/intlayer_with_nestjs.md +11 -7
  253. package/docs/it/intlayer_with_nextjs_14.md +1 -28
  254. package/docs/it/intlayer_with_nextjs_15.md +1 -33
  255. package/docs/it/intlayer_with_solid_start.md +1078 -0
  256. package/docs/it/intlayer_with_vite+vue.md +1 -3
  257. package/docs/it/live-sync.md +4 -0
  258. package/docs/it/packages/intlayer/getLocalizedUrl.md +34 -26
  259. package/docs/it/packages/intlayer/getMultilingualUrls.md +4 -18
  260. package/docs/it/packages/react-intlayer/useDictionary.md +4 -21
  261. package/docs/it/packages/vite-intlayer/exports.md +15 -0
  262. package/docs/it/packages/vite-intlayer/intlayer.md +121 -6
  263. package/docs/it/packages/vite-intlayer/intlayerPrune.md +77 -4
  264. package/docs/it/releases/v9.md +0 -15
  265. package/docs/it/self_hosting.md +60 -49
  266. package/docs/ja/analytics.md +222 -0
  267. package/docs/ja/autoFill.md +28 -9
  268. package/docs/ja/bundle_optimization.md +58 -25
  269. package/docs/ja/configuration.md +25 -8
  270. package/docs/ja/dictionary/content_file.md +15 -7
  271. package/docs/ja/dictionary/file.md +3 -1
  272. package/docs/ja/dictionary/nesting.md +47 -30
  273. package/docs/ja/formatters.md +133 -187
  274. package/docs/ja/intlayer_visual_editor.md +3 -1
  275. package/docs/ja/intlayer_with_angular_21.md +6 -6
  276. package/docs/ja/intlayer_with_nestjs.md +2 -12
  277. package/docs/ja/intlayer_with_nextjs_14.md +1 -28
  278. package/docs/ja/intlayer_with_nextjs_15.md +1 -33
  279. package/docs/ja/intlayer_with_react_router_v7.md +456 -20
  280. package/docs/ja/intlayer_with_solid_start.md +1078 -0
  281. package/docs/ja/intlayer_with_vite+preact.md +73 -41
  282. package/docs/ja/intlayer_with_vite+vue.md +1 -3
  283. package/docs/ja/live-sync.md +4 -0
  284. package/docs/ja/mcp_server.md +3 -9
  285. package/docs/ja/packages/intlayer/getLocalizedUrl.md +26 -24
  286. package/docs/ja/packages/intlayer/getMultilingualUrls.md +3 -17
  287. package/docs/ja/packages/vite-intlayer/exports.md +15 -0
  288. package/docs/ja/packages/vite-intlayer/intlayer.md +121 -6
  289. package/docs/ja/packages/vite-intlayer/intlayerPrune.md +79 -6
  290. package/docs/ja/releases/v9.md +12 -0
  291. package/docs/ja/self_hosting.md +46 -50
  292. package/docs/ko/analytics.md +222 -0
  293. package/docs/ko/autoFill.md +28 -9
  294. package/docs/ko/bundle_optimization.md +58 -25
  295. package/docs/ko/configuration.md +25 -8
  296. package/docs/ko/dictionary/file.md +3 -1
  297. package/docs/ko/dictionary/nesting.md +47 -30
  298. package/docs/ko/formatters.md +133 -187
  299. package/docs/ko/intlayer_with_angular_21.md +9 -9
  300. package/docs/ko/intlayer_with_lynx+react.md +133 -39
  301. package/docs/ko/intlayer_with_nextjs_14.md +1 -28
  302. package/docs/ko/intlayer_with_nextjs_15.md +1 -33
  303. package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +40 -188
  304. package/docs/ko/intlayer_with_solid_start.md +1078 -0
  305. package/docs/ko/intlayer_with_vite+preact.md +57 -23
  306. package/docs/ko/intlayer_with_vite+vue.md +1 -3
  307. package/docs/ko/live-sync.md +4 -0
  308. package/docs/ko/packages/intlayer/getLocalizedUrl.md +26 -24
  309. package/docs/ko/packages/intlayer/getMultilingualUrls.md +4 -18
  310. package/docs/ko/packages/vite-intlayer/exports.md +15 -0
  311. package/docs/ko/packages/vite-intlayer/intlayer.md +121 -6
  312. package/docs/ko/packages/vite-intlayer/intlayerPrune.md +79 -6
  313. package/docs/ko/releases/v9.md +12 -0
  314. package/docs/ko/self_hosting.md +60 -49
  315. package/docs/nl/bundle_optimization.md +58 -25
  316. package/docs/nl/configuration.md +25 -8
  317. package/docs/nl/intlayer_with_angular_21.md +9 -9
  318. package/docs/pl/analytics.md +220 -0
  319. package/docs/pl/bundle_optimization.md +58 -25
  320. package/docs/pl/configuration.md +25 -8
  321. package/docs/pl/dictionary/nesting.md +47 -30
  322. package/docs/pl/formatters.md +208 -305
  323. package/docs/pl/intlayer_CMS.md +152 -0
  324. package/docs/pl/intlayer_with_angular_21.md +9 -9
  325. package/docs/pl/intlayer_with_nextjs_14.md +1 -26
  326. package/docs/pl/intlayer_with_solid_start.md +1078 -0
  327. package/docs/pl/live-sync.md +4 -0
  328. package/docs/pl/packages/intlayer/getMultilingualUrls.md +4 -18
  329. package/docs/pl/packages/react-intlayer/useDictionary.md +2 -19
  330. package/docs/pl/packages/vite-intlayer/exports.md +15 -0
  331. package/docs/pl/packages/vite-intlayer/intlayer.md +121 -6
  332. package/docs/pl/packages/vite-intlayer/intlayerPrune.md +77 -4
  333. package/docs/pl/releases/v9.md +0 -15
  334. package/docs/pl/self_hosting.md +60 -49
  335. package/docs/pt/analytics.md +222 -0
  336. package/docs/pt/bundle_optimization.md +58 -24
  337. package/docs/pt/configuration.md +25 -8
  338. package/docs/pt/dictionary/file.md +3 -1
  339. package/docs/pt/dictionary/nesting.md +47 -30
  340. package/docs/pt/formatters.md +112 -168
  341. package/docs/pt/intlayer_CMS.md +66 -15
  342. package/docs/pt/intlayer_with_angular_21.md +9 -9
  343. package/docs/pt/intlayer_with_astro_lit.md +26 -1
  344. package/docs/pt/intlayer_with_nextjs_14.md +1 -28
  345. package/docs/pt/intlayer_with_nextjs_15.md +1 -33
  346. package/docs/pt/intlayer_with_solid_start.md +1078 -0
  347. package/docs/pt/intlayer_with_vite+vue.md +1 -3
  348. package/docs/pt/live-sync.md +4 -0
  349. package/docs/pt/packages/intlayer/getLocalizedUrl.md +34 -26
  350. package/docs/pt/packages/intlayer/getMultilingualUrls.md +4 -18
  351. package/docs/pt/packages/vite-intlayer/exports.md +15 -0
  352. package/docs/pt/packages/vite-intlayer/intlayer.md +121 -6
  353. package/docs/pt/packages/vite-intlayer/intlayerPrune.md +78 -6
  354. package/docs/pt/releases/v9.md +0 -15
  355. package/docs/pt/self_hosting.md +60 -49
  356. package/docs/ru/analytics.md +222 -0
  357. package/docs/ru/autoFill.md +27 -8
  358. package/docs/ru/bundle_optimization.md +58 -25
  359. package/docs/ru/configuration.md +25 -8
  360. package/docs/ru/dictionary/file.md +3 -1
  361. package/docs/ru/dictionary/nesting.md +64 -205
  362. package/docs/ru/formatters.md +108 -128
  363. package/docs/ru/intlayer_with_angular_21.md +9 -9
  364. package/docs/ru/intlayer_with_nextjs_14.md +1 -28
  365. package/docs/ru/intlayer_with_nextjs_15.md +1 -33
  366. package/docs/ru/intlayer_with_solid_start.md +1078 -0
  367. package/docs/ru/intlayer_with_vite+vue.md +1 -3
  368. package/docs/ru/live-sync.md +4 -0
  369. package/docs/ru/packages/intlayer/getLocalizedUrl.md +34 -26
  370. package/docs/ru/packages/intlayer/getMultilingualUrls.md +4 -18
  371. package/docs/ru/packages/react-intlayer/useDictionary.md +4 -21
  372. package/docs/ru/packages/vite-intlayer/exports.md +15 -0
  373. package/docs/ru/packages/vite-intlayer/intlayer.md +121 -6
  374. package/docs/ru/packages/vite-intlayer/intlayerPrune.md +77 -4
  375. package/docs/ru/releases/v9.md +0 -15
  376. package/docs/ru/self_hosting.md +60 -49
  377. package/docs/tr/analytics.md +222 -0
  378. package/docs/tr/autoFill.md +28 -9
  379. package/docs/tr/bundle_optimization.md +58 -25
  380. package/docs/tr/configuration.md +25 -8
  381. package/docs/tr/dictionary/file.md +2 -0
  382. package/docs/tr/dictionary/nesting.md +47 -30
  383. package/docs/tr/formatters.md +144 -190
  384. package/docs/tr/intlayer_CMS.md +152 -0
  385. package/docs/tr/intlayer_with_angular_21.md +9 -9
  386. package/docs/tr/intlayer_with_nestjs.md +2 -12
  387. package/docs/tr/intlayer_with_nextjs_15.md +1 -33
  388. package/docs/tr/intlayer_with_solid_start.md +1078 -0
  389. package/docs/tr/intlayer_with_vite+vue.md +1 -3
  390. package/docs/tr/live-sync.md +4 -0
  391. package/docs/tr/packages/intlayer/getMultilingualUrls.md +4 -18
  392. package/docs/tr/packages/vite-intlayer/exports.md +15 -0
  393. package/docs/tr/packages/vite-intlayer/intlayer.md +121 -6
  394. package/docs/tr/packages/vite-intlayer/intlayerPrune.md +77 -4
  395. package/docs/tr/self_hosting.md +47 -50
  396. package/docs/uk/analytics.md +222 -0
  397. package/docs/uk/bundle_optimization.md +58 -25
  398. package/docs/uk/configuration.md +25 -8
  399. package/docs/uk/dictionary/nesting.md +47 -30
  400. package/docs/uk/formatters.md +128 -185
  401. package/docs/uk/intlayer_CMS.md +152 -0
  402. package/docs/uk/intlayer_with_angular_21.md +9 -9
  403. package/docs/uk/intlayer_with_nextjs_14.md +1 -26
  404. package/docs/uk/intlayer_with_solid_start.md +1078 -0
  405. package/docs/uk/live-sync.md +4 -0
  406. package/docs/uk/packages/react-intlayer/useDictionary.md +2 -19
  407. package/docs/uk/packages/vite-intlayer/exports.md +15 -0
  408. package/docs/uk/packages/vite-intlayer/intlayer.md +121 -6
  409. package/docs/uk/packages/vite-intlayer/intlayerPrune.md +77 -4
  410. package/docs/uk/releases/v9.md +0 -15
  411. package/docs/uk/self_hosting.md +60 -50
  412. package/docs/ur/bundle_optimization.md +58 -25
  413. package/docs/ur/configuration.md +25 -8
  414. package/docs/ur/intlayer_with_angular_21.md +9 -9
  415. package/docs/vi/analytics.md +222 -0
  416. package/docs/vi/bundle_optimization.md +58 -25
  417. package/docs/vi/configuration.md +24 -8
  418. package/docs/vi/dictionary/nesting.md +37 -184
  419. package/docs/vi/formatters.md +208 -309
  420. package/docs/vi/intlayer_CMS.md +164 -0
  421. package/docs/vi/intlayer_with_angular_21.md +9 -9
  422. package/docs/vi/intlayer_with_nextjs_14.md +0 -25
  423. package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +70 -63
  424. package/docs/vi/intlayer_with_solid_start.md +1078 -0
  425. package/docs/vi/live-sync.md +4 -0
  426. package/docs/vi/packages/intlayer/getMultilingualUrls.md +4 -18
  427. package/docs/vi/packages/react-intlayer/useIntlayer.md +2 -2
  428. package/docs/vi/packages/vite-intlayer/exports.md +15 -0
  429. package/docs/vi/packages/vite-intlayer/intlayer.md +121 -6
  430. package/docs/vi/packages/vite-intlayer/intlayerPrune.md +77 -4
  431. package/docs/vi/plugins/sync-json.md +6 -6
  432. package/docs/vi/releases/v9.md +12 -0
  433. package/docs/vi/self_hosting.md +61 -50
  434. package/docs/zh/CI_CD.md +4 -0
  435. package/docs/zh/analytics.md +222 -0
  436. package/docs/zh/autoFill.md +28 -9
  437. package/docs/zh/bundle_optimization.md +58 -25
  438. package/docs/zh/configuration.md +24 -8
  439. package/docs/zh/dictionary/file.md +2 -0
  440. package/docs/zh/dictionary/nesting.md +47 -30
  441. package/docs/zh/formatters.md +140 -188
  442. package/docs/zh/intlayer_CMS.md +164 -0
  443. package/docs/zh/intlayer_with_analog.md +193 -3
  444. package/docs/zh/intlayer_with_angular_19.md +272 -3
  445. package/docs/zh/intlayer_with_angular_21.md +7 -7
  446. package/docs/zh/intlayer_with_create_react_app.md +348 -26
  447. package/docs/zh/intlayer_with_lynx+react.md +263 -4
  448. package/docs/zh/intlayer_with_nextjs_14.md +1 -28
  449. package/docs/zh/intlayer_with_nextjs_15.md +1 -33
  450. package/docs/zh/intlayer_with_nextjs_no_locale_path.md +558 -1
  451. package/docs/zh/intlayer_with_nuxt.md +182 -7
  452. package/docs/zh/intlayer_with_react_router_v7.md +183 -25
  453. package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +306 -42
  454. package/docs/zh/intlayer_with_solid_start.md +1077 -0
  455. package/docs/zh/intlayer_with_storybook.md +260 -3
  456. package/docs/zh/intlayer_with_svelte_kit.md +428 -48
  457. package/docs/zh/intlayer_with_tanstack+solid.md +713 -13
  458. package/docs/zh/intlayer_with_tanstack.md +731 -20
  459. package/docs/zh/intlayer_with_vanilla.md +314 -4
  460. package/docs/zh/intlayer_with_vite+lit.md +465 -4
  461. package/docs/zh/intlayer_with_vite+preact.md +422 -116
  462. package/docs/zh/intlayer_with_vite+react.md +324 -45
  463. package/docs/zh/intlayer_with_vite+react_compiler.md +228 -13
  464. package/docs/zh/intlayer_with_vite+solid.md +462 -32
  465. package/docs/zh/intlayer_with_vite+vanilla.md +497 -4
  466. package/docs/zh/live-sync.md +4 -0
  467. package/docs/zh/mcp_server.md +3 -9
  468. package/docs/zh/packages/intlayer/getLocalizedUrl.md +26 -24
  469. package/docs/zh/packages/intlayer/getMultilingualUrls.md +4 -18
  470. package/docs/zh/packages/vite-intlayer/exports.md +29 -0
  471. package/docs/zh/packages/vite-intlayer/intlayer.md +121 -6
  472. package/docs/zh/packages/vite-intlayer/intlayerPrune.md +79 -6
  473. package/docs/zh/releases/v9.md +12 -0
  474. package/docs/zh/self_hosting.md +60 -50
  475. package/docs/zh-TW/bundle_optimization.md +58 -25
  476. package/docs/zh-TW/intlayer_with_angular_21.md +7 -7
  477. package/package.json +7 -7
  478. package/src/common.ts +39 -2
  479. package/src/generated/blog.entry.ts +66 -34
  480. package/src/generated/docs.entry.ts +273 -221
  481. package/src/generated/frequentQuestions.entry.ts +56 -24
  482. package/src/generated/legal.entry.ts +41 -9
@@ -15,6 +15,7 @@ slugs:
15
15
  - environment
16
16
  - vite-and-solid
17
17
  applicationTemplate: https://github.com/aymericzip/intlayer-vite-solid-template
18
+ applicationShowcase: https://intlayer-vite-solid.vercel.app
18
19
  history:
19
20
  - version: 8.9.0
20
21
  date: 2026-05-04
@@ -46,6 +47,17 @@ author: aymericzip
46
47
  loading="lazy"
47
48
  />
48
49
 
50
+ </Tab>
51
+ <Tab label="Demo" value="demo">
52
+
53
+ <iframe
54
+ src="https://intlayer-vite-solid.vercel.app"
55
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
56
+ title="Demo Intlayer Vite + Solid Template"
57
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
58
+ loading="lazy"
59
+ />
60
+
49
61
  </Tab>
50
62
  </Tabs>
51
63
 
@@ -12,6 +12,10 @@ keywords:
12
12
  - Intlayer
13
13
  - Next.js
14
14
  - Vite
15
+ slugs:
16
+ - doc
17
+ - concept
18
+ - live-sync
15
19
  history:
16
20
  - version: 9.0.0
17
21
  date: 2026-07-08
@@ -0,0 +1,222 @@
1
+ ---
2
+ createdAt: 2026-07-08
3
+ updatedAt: 2026-07-08
4
+ title: Intlayer Analytics | Track content exposure and run A/B tests
5
+ description: Discover how @intlayer/analytics tracks page/locale views and content exposure, and how to use it to run A/B tests on your Intlayer content.
6
+ keywords:
7
+ - Analytics
8
+ - A/B Testing
9
+ - Audience
10
+ - Internationalisation
11
+ - Documentation
12
+ - Intlayer
13
+ - Next.js
14
+ - JavaScript
15
+ - React
16
+ slugs:
17
+ - doc
18
+ - concept
19
+ - analytics
20
+ history:
21
+ - version: 9.0.0
22
+ date: 2026-07-08
23
+ changes: "Init doc — @intlayer/analytics package, provider/node-level tracking, A/B testing, dashboard"
24
+ author: aymericzip
25
+ ---
26
+
27
+ # Intlayer Analytics Documentation
28
+
29
+ `@intlayer/analytics` is an optional companion package that tells you **which content is actually shown** to your visitors — which page, in which locale, and which specific piece of translated content — so you can understand your audience and run **A/B tests on content**.
30
+
31
+ ## Table of Contents
32
+
33
+ <TOC/>
34
+
35
+ ---
36
+
37
+ ## What it tracks
38
+
39
+ `@intlayer/analytics` batches three kinds of anonymous events:
40
+
41
+ | Event | Captured where | What it tells you |
42
+ | ------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
43
+ | `page_view` | Provider level (`IntlayerProvider`) | Which page and locale a session viewed, on first load, route change, or locale switch. |
44
+ | `content_exposure` | Node level (`useIntlayer` / interpreter plugins) | Which dictionary key / key path was actually resolved and displayed — and, when part of an experiment, which **variant**. |
45
+ | `conversion` | Wherever you call `useConversion()` | A goal reached (signup, click, purchase…) attributed to the A/B variant the session was exposed to. |
46
+
47
+ Events are collected in memory and sent as a **single batched request roughly every 20 seconds** — never on every keystroke or render — so analytics never impacts first render time or adds a request per interaction.
48
+
49
+ ## How it powers A/B testing on content
50
+
51
+ Intlayer already lets you declare content [Variants](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/dynamic_dictionaries/index.md) (e.g. a `hero-banner` dictionary with a `control` and a `black_friday` variant). `@intlayer/analytics` closes the loop:
52
+
53
+ 1. `getVariant(experimentKey, variants)` deterministically assigns each anonymous session to a variant — a pure function of the session id and the experiment key, so the assignment is **stable across the session** and requires **no server round-trip** before first render (no flicker, no layout shift).
54
+ 2. Every `content_exposure` event carries the `variant` that was shown.
55
+ 3. `useConversion()` lets you attribute a goal (e.g. `"cta_click"`) to that variant.
56
+ 4. The dashboard's experiment results endpoint compares conversion rates per variant, including statistical significance (a z-test).
57
+
58
+ ## Installation
59
+
60
+ `@intlayer/analytics` is a **peer, optional** dependency — never installed automatically by a framework package. Add it alongside `intlayer`:
61
+
62
+ ```bash packageManager="npm"
63
+ npm install @intlayer/analytics
64
+ ```
65
+
66
+ ```bash packageManager="yarn"
67
+ yarn add @intlayer/analytics
68
+ ```
69
+
70
+ ```bash packageManager="pnpm"
71
+ pnpm add @intlayer/analytics
72
+ ```
73
+
74
+ ```bash packageManager="bun"
75
+ bun add @intlayer/analytics
76
+ ```
77
+
78
+ If you don't install it, every integration point resolves to a no-op — see [Zero-cost when not installed](#zero-cost-when-not-installed) below.
79
+
80
+ ## Configuration
81
+
82
+ Analytics **reuses the existing `editor` configuration block** — there is no separate `analytics` config schema to fill in:
83
+
84
+ ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
85
+ import type { IntlayerConfig } from "intlayer";
86
+
87
+ const config: IntlayerConfig = {
88
+ editor: {
89
+ backendURL: "https://back.intlayer.org", // Also used as the analytics ingestion endpoint
90
+ clientId: "your-client-id", // Also used as the analytics project key
91
+ clientSecret: "your-client-secret",
92
+ },
93
+ };
94
+
95
+ export default config;
96
+ ```
97
+
98
+ - `editor.backendURL` — the base URL analytics events are sent to (`POST {backendURL}/api/analytics/events`).
99
+ - `editor.clientId` — the public project key attributed to every ingested event. It also acts as the **enable switch**: analytics stays fully disabled (and tree-shaken, see below) until `clientId` is configured.
100
+
101
+ If you self-host Intlayer, analytics automatically points at your own instance since it shares `editor.backendURL`.
102
+
103
+ ## Framework support
104
+
105
+ Analytics is wired into the shared `IntlayerProvider` from `react-intlayer`, so it is available today anywhere that provider is used:
106
+
107
+ | Framework | Status |
108
+ | -------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
109
+ | React | ✅ Available |
110
+ | Next.js (`next-intlayer`) | ✅ Available (via `react-intlayer`) |
111
+ | React Native / Expo (`react-native-intlayer`) | ✅ Available (via `react-intlayer`) |
112
+ | Vue, Svelte, Angular, Solid, Preact, Lit, Astro, Vanilla | 🚧 Planned — same client, provider-level bindings following the `@intlayer/editor` rollout pattern |
113
+
114
+ ## Usage
115
+
116
+ ### Automatic provider-level tracking
117
+
118
+ No code changes are required. Once `@intlayer/analytics` is installed and `editor.clientId` is configured, `IntlayerProvider` automatically:
119
+
120
+ - initialises the analytics client on mount,
121
+ - records a `page_view` on initial load,
122
+ - records a `page_view` on every locale change,
123
+ - starts the ~20s flush loop and flushes any remaining events on unmount / tab close (via `navigator.sendBeacon`, falling back to `fetch(..., { keepalive: true })`).
124
+
125
+ ### Automatic node-level tracking
126
+
127
+ Every time `useIntlayer` resolves a piece of content for display, the interpreter reports a `content_exposure` event for that exact `dictionaryKey` + key path + locale — again, no code changes required. Repeated exposures of the same node within a flush window are coalesced into a single event with a `count`, so a list re-rendering 50 times doesn't send 50 events.
128
+
129
+ ### Tracking conversions for A/B tests
130
+
131
+ Use `useConversion()` to attribute a goal to the variant a session saw:
132
+
133
+ ```tsx fileName="CTAButton.tsx" codeFormat="tsx"
134
+ import { useConversion } from "react-intlayer";
135
+
136
+ const CTAButton = () => {
137
+ const trackConversion = useConversion();
138
+
139
+ return (
140
+ <button
141
+ onClick={() =>
142
+ trackConversion({
143
+ experimentKey: "homepage-hero",
144
+ variant: "black_friday",
145
+ goal: "cta_click",
146
+ })
147
+ }
148
+ >
149
+ Get started
150
+ </button>
151
+ );
152
+ };
153
+ ```
154
+
155
+ ### Resolving a variant client-side
156
+
157
+ ```tsx fileName="useHeroVariant.ts" codeFormat="tsx"
158
+ import { getGlobalAnalyticsClient } from "@intlayer/analytics/client";
159
+
160
+ const client = getGlobalAnalyticsClient();
161
+ const variant = client?.getVariant("homepage-hero", [
162
+ "control",
163
+ "black_friday",
164
+ ]);
165
+ ```
166
+
167
+ ## Privacy & performance
168
+
169
+ - **Anonymous by design**: sessions are identified by a rotating id; the backend only ever stores a **SHA-256 hash** of that id — never the raw id, never an IP address.
170
+ - **Location is coarse**: only a country code, derived from CDN geolocation headers (`cf-ipcountry`, `x-vercel-ip-country`, …) — no IP is read or stored.
171
+ - **URLs exclude search params** by default, so query strings are never captured.
172
+ - **Sampling**: `sampleRate` lets you keep only a fraction of content-exposure events on high-traffic apps.
173
+ - **Batched**: one request roughly every 20 seconds (`flushInterval`), or earlier if the buffer fills up (`maxBufferSize`) — never one request per event.
174
+
175
+ ### Zero-cost when not installed
176
+
177
+ `@intlayer/analytics` follows the exact same optional-dependency pattern as `@intlayer/editor`:
178
+
179
+ - every integration point loads the package via a **dynamic `import()` wrapped in `try/catch`** — an app that never installs `@intlayer/analytics` never pays a bundle-size or runtime cost, and never sees an error;
180
+ - a compile-time env var (`INTLAYER_ANALYTICS_ENABLED`), automatically set to `'false'` by `@intlayer/config` whenever `editor.clientId` is not configured, lets bundlers **dead-code-eliminate** the whole integration;
181
+ - analytics is disabled inside the Intlayer editor/CMS preview iframe, so editor sessions are never counted as real traffic.
182
+
183
+ ## Dashboard: Analytics page
184
+
185
+ Once your project has collected events, the **Analytics** page in the [Intlayer dashboard](https://app.intlayer.org/analytics) (visible in the sidebar once a project is selected) shows:
186
+
187
+ - **Active users** — distinct visitors over the selected rolling window (7 / 30 / 90 days).
188
+ - **Users today** and **users over the last 7 days**.
189
+ - **Page views** over the selected window.
190
+ - An **evolution graph** of daily distinct visitors.
191
+ - **Locales** and **Location** breakdown tabs, ranking your audience by locale and by country.
192
+
193
+ ## Backend API reference
194
+
195
+ All read endpoints require authentication; ingestion is public and attributed by `clientId`.
196
+
197
+ | Method | Endpoint | Description |
198
+ | ------ | ------------------------------------------- | -------------------------------------------------------------------------------- |
199
+ | `POST` | `/api/analytics/events` | Ingest a batch of events (public, attributed by `clientId` in the body). |
200
+ | `GET` | `/api/analytics/overview` | Page/locale totals for the authenticated project. |
201
+ | `GET` | `/api/analytics/audience?days=30` | Distinct visitors, page views, daily series, locale + country breakdowns. |
202
+ | `GET` | `/api/analytics/content-stats` | Per-content exposure totals, grouped by dictionary key / key path / locale. |
203
+ | `GET` | `/api/analytics/experiments/:experimentKey` | Per-variant conversion rates and statistical significance for an A/B experiment. |
204
+
205
+ You can also call these programmatically with the [CMS SDK](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/intlayer_CMS.md):
206
+
207
+ ```ts fileName="analytics.ts"
208
+ import { createIntlayerCMS } from "@intlayer/api";
209
+ import { analyticsEndpoint } from "@intlayer/api/analytics";
210
+
211
+ const cms = createIntlayerCMS();
212
+
213
+ const { data: audience } = await analyticsEndpoint(cms).getAudience(30);
214
+ ```
215
+
216
+ ## Useful links
217
+
218
+ - [Dynamic Dictionaries - Collections & Variants](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/dynamic_dictionaries/index.md)
219
+ - [Intlayer CMS - CMS SDK](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/intlayer_CMS.md)
220
+ - [Intlayer Visual Editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/intlayer_visual_editor.md)
221
+ - [Configuration Reference](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/configuration.md)
222
+ - [Self-Hosting Guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/self_hosting.md)
@@ -75,11 +75,30 @@ In v7, the `fill` command behaviour has been updated:
75
75
 
76
76
  When using a path option to write to another file, the fill mechanism works through a _master-slave_ relationship between content declaration files. The main (master) file serves as the source of truth, and when it's updated, Intlayer will automatically apply those changes to the derived (filled) declaration files specified by the path.
77
77
 
78
- # Autofill Content Declaration File Translations
78
+ ### Per-Locale Customisation
79
79
 
80
- **Autofill content declaration files** are a way to speed up your development workflow.
80
+ You can also customise the behaviour for each locale by using an object:
81
81
 
82
- The autofill mechanism works through a _master-slave_ relationship between content declaration files. When the main (master) file is updated, Intlayer will automatically apply those changes to the derived (autofilled) declaration files.
82
+ ```ts fileName="intlayer.config.ts"
83
+ const config: IntlayerConfig = {
84
+ content: {
85
+ internationalization: {
86
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.POLISH],
87
+ defaultLocale: Locales.ENGLISH,
88
+ requiredLocales: [Locales.ENGLISH], // Recommended to avoid Property 'pl' is missing in type '{ en: string; xxx } on your t function if
89
+ },
90
+ },
91
+ dictionary: {
92
+ fill: {
93
+ en: true, // Fill and edit the current file for English
94
+ fr: "./translations/fr.json", // Create separate file for French
95
+ es: false, // Disable fill for Spanish
96
+ },
97
+ },
98
+ };
99
+ ```
100
+
101
+ This allows you to have different fill behaviours for different locales within the same project.
83
102
 
84
103
  ```ts fileName="src/components/example/example.content.ts"
85
104
  import { Locales, type Dictionary } from "intlayer";
@@ -87,7 +106,7 @@ import { Locales, type Dictionary } from "intlayer";
87
106
  const exampleContent = {
88
107
  key: "example",
89
108
  locale: Locales.ENGLISH,
90
- autoFill: "./example.content.json",
109
+ fill: "./example.content.json",
91
110
  content: {
92
111
  contentExample: "This is an example of content",
93
112
  },
@@ -96,7 +115,7 @@ const exampleContent = {
96
115
  export default exampleContent;
97
116
  ```
98
117
 
99
- Here is a [per-locale content declaration file](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/per_locale_file.md) using the `autoFill` instruction.
118
+ Here is a [per-locale content declaration file](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/per_locale_file.md) using the `fill` instruction.
100
119
 
101
120
  Then, when you run the following command:
102
121
 
@@ -126,14 +145,14 @@ Intlayer will automatically generate the derived declaration file at `src/compon
126
145
  "nodeType": "translation",
127
146
  "translation": {
128
147
  "fr": "Ceci est un exemple de contenu",
129
- "es": "Este es un exemple de contenu",
148
+ "es": "Este es un ejemplo de contenido",
130
149
  },
131
150
  },
132
151
  },
133
152
  }
134
153
  ```
135
154
 
136
- Afterwards, both declaration files will be merged into a single dictionary, accessible using the standard `useIntlayer("example")` hook (React) / composable (Vue).
155
+ Afterwards, both declaration files will be merged into a single dictionary, accessible using the standard `useIntlayer("example")` hook (react) / composable (vue).
137
156
 
138
157
  ## Global Configuration
139
158
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-11-25
3
- updatedAt: 2026-06-07
3
+ updatedAt: 2026-08-09
4
4
  title: i18n Bundle Size & Performance Optimisation
5
5
  description: Reduce your application bundle size by optimising internationalisation (i18n) content. Learn how to leverage tree shaking and lazy loading for dictionaries with Intlayer.
6
6
  keywords:
@@ -16,6 +16,12 @@ slugs:
16
16
  - concept
17
17
  - bundle-optimization
18
18
  history:
19
+ - version: 9.2.1
20
+ date: 2026-08-09
21
+ changes: "`purge` and `minify` now work on Next.js through `@intlayer/swc` — no `babel.config.js` required"
22
+ - version: 8.12.0
23
+ date: 2026-06-24
24
+ changes: "List Babel plugins in required pipeline order (extract → purge → minify → optimize) in the reference tables"
19
25
  - version: 8.12.0
20
26
  date: 2026-06-07
21
27
  changes: "Added `intlayerPurgeBabelPlugin` and `intlayerMinifyBabelPlugin` for Babel/Webpack; clarified the plugin pipeline"
@@ -191,12 +197,14 @@ Intlayer's build optimisation is split into several discrete plugins, each with
191
197
 
192
198
  These are used directly in `babel.config.js` for Webpack-based setups (Next.js with Babel, CRA, custom Webpack, etc).
193
199
 
200
+ The table below lists them in their required pipeline order (the same order they must appear in `babel.config.js`):
201
+
194
202
  | Plugin | What it does |
195
203
  | :---------------------------- | :------------------------------------------------------------------------------------------------------------------ |
196
204
  | `intlayerExtractBabelPlugin` | Scans `.content.ts` files and writes compiled dictionaries to `.intlayer/` |
197
- | `intlayerOptimizeBabelPlugin` | Rewrites `useIntlayer('key')` → `useDictionary(hash)` and injects the matching dictionary `import` |
198
205
  | `intlayerPurgeBabelPlugin` | Scans all source files, removes **unused content fields** from the compiled `.intlayer/**/*.json` dictionary files |
199
206
  | `intlayerMinifyBabelPlugin` | **Renames content field keys** to short alphabetical aliases (`title` → `a`) in both JSON files and the source code |
207
+ | `intlayerOptimizeBabelPlugin` | Rewrites `useIntlayer('key')` → `useDictionary(hash)` and injects the matching dictionary `import` |
200
208
 
201
209
  > **Plugin order matters.** In your `babel.config.js` the purge and minify plugins must appear **before** the optimize plugin. The optimize pass replaces `useIntlayer('key')` with an opaque `useDictionary(hash)` call, wiping out the dictionary key information the purge and minify passes need to identify which fields are used.
202
210
 
@@ -205,9 +213,9 @@ Each Babel plugin has a corresponding options helper that reads your `intlayer.c
205
213
  | Options helper | Used with |
206
214
  | :--------------------------- | :---------------------------- |
207
215
  | `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
208
- | `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
209
216
  | `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
210
217
  | `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
218
+ | `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
211
219
 
212
220
  ### Vite plugins (`vite-intlayer`)
213
221
 
@@ -220,6 +228,20 @@ Vite users **never configure these directly**. They are wired up automatically w
220
228
  | Dictionary minify | Same as `intlayerMinifyBabelPlugin` JSON write pass |
221
229
  | Babel transform | Same as `intlayerMinifyBabelPlugin` source code rename + `intlayerOptimizeBabelPlugin` |
222
230
 
231
+ ### SWC plugin (`@intlayer/swc`)
232
+
233
+ Next.js users **never configure these directly** either. Since **v9.2.1**, `withIntlayer()` in `next.config.ts` runs the full pipeline — purge, minify and import rewriting — from the `build.purge` and `build.minify` flags alone.
234
+
235
+ The work is split in two, because an SWC Wasm plugin transforms one file at a time with no file-system access:
236
+
237
+ | Pass | Where it runs | What it does |
238
+ | :---------------------------------------- | :---------------------------- | :---------------------------------------------------------------------------------------- |
239
+ | Usage analysis + JSON purge/minify | Node, inside `withIntlayer()` | Reads every component source file, rewrites `.intlayer/**/*.json`, produces rename tables |
240
+ | Source rewriting (`content.title` → `.a`) | `@intlayer/swc` (Wasm) | Applies the rename tables to the matching property accesses in your code |
241
+ | Import rewriting (`useIntlayer` → dict) | `@intlayer/swc` (Wasm) | Same as `intlayerOptimizeBabelPlugin` |
242
+
243
+ Deciding _which_ fields are unused and _what_ alias each one gets requires cross-file state and file I/O, so that half runs in Node; the SWC plugin only receives the resulting tables.
244
+
223
245
  ## Setup by Platform
224
246
 
225
247
  <Tabs>
@@ -227,10 +249,12 @@ Vite users **never configure these directly**. They are wired up automatically w
227
249
 
228
250
  ### Next.js
229
251
 
230
- Next.js requires the `@intlayer/swc` plugin for the optimise (import rewrite) pass, because Next.js uses SWC for builds.
252
+ Next.js requires the `@intlayer/swc` plugin, because Next.js uses SWC for builds. Since **v9.2.1** this single package covers the whole pipeline — optimise (import rewriting), purge and minify.
231
253
 
232
254
  > This plugin is not installed by default as SWC plugins are still experimental for Next.js. This may change in the future.
233
255
 
256
+ > **Next.js 16.1.0 is the minimum version.** It is the first release built on SWC's forward-compatible Wasm plugin ABI; earlier releases reject the plugin. `withIntlayer` reads your Next.js version and simply does not register the plugin below 16.1.0 — those builds still succeed, they just run without bundle optimisation.
257
+
234
258
  <Tabs>
235
259
  <Tab value="npm">
236
260
 
@@ -265,33 +289,40 @@ intlayer-swc-plugin = "*"
265
289
 
266
290
  Once installed, Intlayer will automatically detect and use the plugin.
267
291
 
268
- For the **purge and minify** passes (field removal and field rename), install `@intlayer/babel` alongside it and add the Babel plugins. Because Next.js uses SWC for transformation but still evaluates `babel.config.js` for plugin config, the Babel plugins run as a pre-pass before SWC.
292
+ The **purge and minify** passes (field removal and field renaming) require no extra package and no `babel.config.js`. Wrap your config with `withIntlayer` and toggle the flags in `intlayer.config.ts`:
269
293
 
270
- ```bash packageManager="npm"
271
- npm install -D @intlayer/babel
294
+ ```typescript fileName="next.config.ts"
295
+ import { withIntlayer } from "next-intlayer/server";
296
+ import type { NextConfig } from "next";
297
+
298
+ const nextConfig: NextConfig = {/* your config */};
299
+
300
+ export default withIntlayer(nextConfig);
272
301
  ```
273
302
 
274
- ```javascript fileName="babel.config.js"
275
- const {
276
- intlayerPurgeBabelPlugin,
277
- intlayerMinifyBabelPlugin,
278
- getPurgePluginOptions,
279
- getMinifyPluginOptions,
280
- } = require("@intlayer/babel");
303
+ ```typescript fileName="intlayer.config.ts"
304
+ import type { IntlayerConfig } from "intlayer";
281
305
 
282
- module.exports = {
283
- presets: ["next/babel"],
284
- plugins: [
285
- // Purge: remove unused content fields from .intlayer/**/*.json
286
- [intlayerPurgeBabelPlugin, getPurgePluginOptions()],
287
- // Minify: rename content field keys in JSON + source code
288
- [intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
289
- // Note: intlayerOptimizeBabelPlugin is NOT needed here because
290
- // @intlayer/swc handles the useIntlayer → useDictionary rewrite.
291
- ],
306
+ const config: IntlayerConfig = {
307
+ build: {
308
+ purge: true, // remove unused content fields from bundled JSON
309
+ minify: true, // rename content field keys to short aliases
310
+ },
292
311
  };
312
+
313
+ export default config;
293
314
  ```
294
315
 
316
+ During `next build`, `withIntlayer` analyses your sources, rewrites the compiled dictionaries, and forwards the resulting field-rename tables to `@intlayer/swc`, which updates the matching property accesses in your code.
317
+
318
+ > Use the async `withIntlayer`, not `withIntlayerSync`. The sync variant does not run the analysis pipeline, so purge and minify have no effect with it.
319
+
320
+ > Purge and minify run on `next build` only — the optimise pipeline is off during `next dev`.
321
+
322
+ > They are also disabled when compat-adapter callers are configured (`swcExtraCallers`, set by the compat packages such as `@intlayer/next-intl` or `@intlayer/react-i18next`): those call sites are invisible to the usage analyser, so purging would remove fields the code still reads. Import rewriting stays active.
323
+
324
+ **Earlier versions (before 9.2.1)** required `@intlayer/babel` and a `babel.config.js` declaring `intlayerPurgeBabelPlugin` and `intlayerMinifyBabelPlugin`. That file is no longer needed and can be deleted.
325
+
295
326
  </Tab>
296
327
  <Tab value="vite">
297
328
 
@@ -447,6 +478,8 @@ export default config;
447
478
 
448
479
  > Minification is skipped when `optimize` is `false` or when `editor.enabled` is `true` (the visual editor requires the original field names to allow editing).
449
480
 
481
+ > On Next.js, minification is also skipped when `@intlayer/swc` is not installed or cannot be loaded (Next.js below 16.1.0). The plugin is the half that rewrites the source accesses, so renaming the dictionaries without it would leave your code reading field names that no longer exist.
482
+
450
483
  > Minification is also skipped for dictionaries loaded via `importMode: 'fetch'` because their JSON is served from a remote API using the original field names — renaming the client-side keys would break the server/client contract.
451
484
 
452
485
  ### Purging (unused field removal)
@@ -475,7 +508,7 @@ export default config;
475
508
  { "title": "…", "subtitle": "…" }
476
509
  ```
477
510
 
478
- > Purge is skipped when `optimize` is `false` or when `editor.enabled` is `true`.
511
+ > Purge is skipped when `optimize` is `false` or when `editor.enabled` is `true`. On Next.js it is additionally skipped when `@intlayer/swc` is unavailable, and when compat-adapter callers are configured.
479
512
 
480
513
  > Purge is also conservatively skipped when a source file cannot be parsed, or when the result of `useIntlayer` is assigned to a variable and passed around in ways the static analyser cannot track (e.g. spread into an object, passed as a prop without destructuring). In those cases, the full dictionary is preserved.
481
514
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2024-08-13
3
- updatedAt: 2026-07-11
3
+ updatedAt: 2026-08-06
4
4
  title: Configuration
5
5
  description: Learn how to configure Intlayer for your application. Understand the various settings and options available to customize Intlayer to your needs.
6
6
  keywords:
@@ -14,6 +14,9 @@ slugs:
14
14
  - concept
15
15
  - configuration
16
16
  history:
17
+ - version: 9.1.3
18
+ date: 2026-08-06
19
+ changes: "Make `routing.enableProxy` tri-state: unset (auto), `true`, `false`"
17
20
  - version: 9.0.0
18
21
  date: 2026-07-11
19
22
  changes: "Add `analytics` configuration"
@@ -235,6 +238,19 @@ const config: IntlayerConfig = {
235
238
  */
236
239
  mode: "prefix-no-default",
237
240
 
241
+ /**
242
+ * Enables the Intlayer locale-routing proxy (middleware).
243
+ * Handles locale detection, redirects and rewrites in dev, preview and SSR.
244
+ * - unset (auto): development and preview servers keep locale routing
245
+ * URL-driven by ignoring the locale stored in cookies and headers.
246
+ * Prefixes still resolve, the locale is still persisted, and
247
+ * Accept-Language detection still applies. Production behaves like `true`.
248
+ * - true: full behaviour in every environment.
249
+ * - false: no locale routing.
250
+ * Default: undefined (auto)
251
+ */
252
+ enableProxy: undefined,
253
+
238
254
  /**
239
255
  * Where to store the user's selected locale.
240
256
  * Options: 'cookie', 'localStorage', 'sessionStorage', 'header', or an array of these.
@@ -715,13 +731,14 @@ Analytics is strictly opt-in: nothing is collected unless `analytics.enabled` is
715
731
 
716
732
  Settings that control routing behavior, including URL structure, locale storage, and middleware handling.
717
733
 
718
- | Field | Description | Type | Default | Example | Note |
719
- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
720
- | `mode` | URL routing mode for locale handling. | `'prefix-no-default'` &#124; <br/> `'prefix-all'` &#124; <br/> `'no-prefix'` &#124; <br/> `'search-params'` | `'prefix-no-default'` | `'prefix-no-default'`: `/dashboard` (en) or `/fr/dashboard` (fr). `'prefix-all'`: `/en/dashboard`. `'no-prefix'`: locale handled via other means. `'search-params'`: `/dashboard?locale=fr` | Does not impact cookie or locale storage management. |
721
- | `storage` | Configuration for storing the locale in the client. | `false` &#124; <br/> `'cookie'` &#124; <br/> `'localStorage'` &#124; <br/> `'sessionStorage'` &#124; <br/> `'header'` &#124; <br/> `CookiesAttributes` &#124; <br/> `StorageAttributes` &#124; <br/> `Array` | `['cookie', 'header']` | `'localStorage'` <br/> `[{ type: 'cookie', name: 'custom-locale', secure: true }]` | See Storage Options table below. |
722
- | `basePath` | The base path for the application URLs. | `string` | `''` | `'/my-app'` | If app is at `https://example.com/my-app, basePath is `'/my-app'`and URLs become`https://example.com/my-app/en`. |
723
- | `rewrite` | Custom URL rewriting rules that override the default routing mode for specific paths. Supports `[param]` dynamic parameters. | `Record<string, StrictModeLocaleMap<string>>` | `undefined` | See example below | Rewrite rules take precedence over `mode`.<br/>• Works with Next.js and Vite.<br/>• `getLocalizedUrl()` automatically applies matching rules.<br/>• See [Custom URL Rewrites](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/custom_url_rewrites.md). |
724
- | `domains` | Maps locales to domain hostnames for domain-based routing. When set, URLs for that locale use this domain as a base (absolute URL) and no locale prefix is added to the path. | `Partial<Record<Locale, string>>` | `undefined` | `{ zh: 'intlayer.zh', fr: 'intlayer.org' }` | Default protocol is `https://` if not included in the hostname.<br/>• The domain itself identifies the locale, so no `/zh/` prefix is added.<br/>• `getLocalizedUrl('/', 'zh')` returns `https://intlayer.zh/`. |
734
+ | Field | Description | Type | Default | Example | Note |
735
+ | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
736
+ | `mode` | URL routing mode for locale handling. | `'prefix-no-default'` &#124; <br/> `'prefix-all'` &#124; <br/> `'no-prefix'` &#124; <br/> `'search-params'` | `'prefix-no-default'` | `'prefix-no-default'`: `/dashboard` (en) or `/fr/dashboard` (fr). `'prefix-all'`: `/en/dashboard`. `'no-prefix'`: locale handled via other means. `'search-params'`: `/dashboard?locale=fr` | Does not impact cookie or locale storage management. |
737
+ | `enableProxy` | Enables the Intlayer locale-routing proxy (middleware). | `boolean` &#124; <br/> `undefined` | `undefined` (auto) | `true` | Unset (auto): development and preview servers ignore the locale stored in cookies/headers as a redirect source; prefixes, persistence and `Accept-Language` detection still apply. Production behaves like `true`.<br/>• `true`: full behaviour everywhere.<br/>• `false`: no locale routing. On Next.js, the `intlayerProxy` middleware becomes a pass-through. |
738
+ | `storage` | Configuration for storing the locale in the client. | `false` &#124; <br/> `'cookie'` &#124; <br/> `'localStorage'` &#124; <br/> `'sessionStorage'` &#124; <br/> `'header'` &#124; <br/> `CookiesAttributes` &#124; <br/> `StorageAttributes` &#124; <br/> `Array` | `['cookie', 'header']` | `'localStorage'` <br/> `[{ type: 'cookie', name: 'custom-locale', secure: true }]` | See Storage Options table below. |
739
+ | `basePath` | The base path for the application URLs. | `string` | `''` | `'/my-app'` | If app is at `https://example.com/my-app, basePath is `'/my-app'`and URLs become`https://example.com/my-app/en`. |
740
+ | `rewrite` | Custom URL rewriting rules that override the default routing mode for specific paths. Supports `[param]` dynamic parameters. | `Record<string, StrictModeLocaleMap<string>>` | `undefined` | See example below | Rewrite rules take precedence over `mode`.<br/>• Works with Next.js and Vite.<br/>• `getLocalizedUrl()` automatically applies matching rules.<br/>• See [Custom URL Rewrites](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/custom_url_rewrites.md). |
741
+ | `domains` | Maps locales to domain hostnames for domain-based routing. When set, URLs for that locale use this domain as a base (absolute URL) and no locale prefix is added to the path. | `Partial<Record<Locale, string>>` | `undefined` | `{ zh: 'intlayer.zh', fr: 'intlayer.org' }` | • Default protocol is `https://` if not included in the hostname.<br/>• The domain itself identifies the locale, so no `/zh/` prefix is added.<br/>• `getLocalizedUrl('/', 'zh')` returns `https://intlayer.zh/`. |
725
742
 
726
743
  **`rewrite` example**:
727
744
 
@@ -25,6 +25,8 @@ author: aymericzip
25
25
 
26
26
  # File Content / Embedding Files in Intlayer
27
27
 
28
+ In Intlayer, the `file` function allows embedding external file content into a dictionary. This approach ensures that Intlayer recognises the source file, enabling seamless integration with the Intlayer Visual Editor and CMS.
29
+
28
30
  ## How File Embedding Works
29
31
 
30
32
  <Tabs group="framework">