@intlayer/docs 9.1.3 → 9.2.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 (415) hide show
  1. package/blog/ar/rag_powered_documentation_assistant.md +7 -0
  2. package/blog/de/rag_powered_documentation_assistant.md +6 -0
  3. package/blog/en-GB/rag_powered_documentation_assistant.md +6 -0
  4. package/blog/es/rag_powered_documentation_assistant.md +7 -0
  5. package/blog/fr/i18n_meaning.md +7 -1
  6. package/blog/fr/list_i18n_technologies/frameworks/angular.md +5 -1
  7. package/blog/fr/rag_powered_documentation_assistant.md +6 -0
  8. package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +119 -42
  9. package/blog/hi/rag_powered_documentation_assistant.md +7 -0
  10. package/blog/id/rag_powered_documentation_assistant.md +6 -0
  11. package/blog/it/rag_powered_documentation_assistant.md +6 -0
  12. package/blog/ja/rag_powered_documentation_assistant.md +7 -0
  13. package/blog/ko/list_i18n_technologies/frameworks/react.md +7 -7
  14. package/blog/ko/rag_powered_documentation_assistant.md +6 -0
  15. package/blog/pl/rag_powered_documentation_assistant.md +6 -0
  16. package/blog/pt/rag_powered_documentation_assistant.md +6 -0
  17. package/blog/ru/rag_powered_documentation_assistant.md +7 -0
  18. package/blog/tr/intlayer_with_react-intl.md +3 -1
  19. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +175 -42
  20. package/blog/tr/rag_powered_documentation_assistant.md +6 -0
  21. package/blog/uk/rag_powered_documentation_assistant.md +6 -0
  22. package/blog/vi/rag_powered_documentation_assistant.md +6 -0
  23. package/blog/zh/intlayer_with_i18next.md +87 -28
  24. package/blog/zh/intlayer_with_next-i18next.md +86 -29
  25. package/blog/zh/intlayer_with_next-intl.md +88 -28
  26. package/blog/zh/intlayer_with_react-i18next.md +87 -28
  27. package/blog/zh/intlayer_with_react-intl.md +88 -27
  28. package/blog/zh/intlayer_with_vue-i18n.md +117 -8
  29. package/blog/zh/rag_powered_documentation_assistant.md +6 -0
  30. package/dist/cjs/generated/blog.entry.cjs +27 -27
  31. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  32. package/dist/cjs/generated/docs.entry.cjs +234 -214
  33. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  34. package/dist/cjs/generated/frequentQuestions.entry.cjs +17 -17
  35. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  36. package/dist/cjs/generated/legal.entry.cjs +2 -2
  37. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  38. package/dist/esm/generated/blog.entry.mjs +27 -27
  39. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  40. package/dist/esm/generated/docs.entry.mjs +234 -214
  41. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  42. package/dist/esm/generated/frequentQuestions.entry.mjs +17 -17
  43. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  44. package/dist/esm/generated/legal.entry.mjs +2 -2
  45. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  46. package/dist/types/generated/docs.entry.d.ts +1 -0
  47. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  48. package/docs/ar/analytics.md +222 -0
  49. package/docs/ar/autoFill.md +28 -9
  50. package/docs/ar/configuration.md +25 -8
  51. package/docs/ar/dictionary/file.md +3 -1
  52. package/docs/ar/dictionary/nesting.md +47 -30
  53. package/docs/ar/formatters.md +148 -193
  54. package/docs/ar/intlayer_CMS.md +152 -0
  55. package/docs/ar/intlayer_with_angular_21.md +9 -9
  56. package/docs/ar/intlayer_with_nextjs_14.md +1 -28
  57. package/docs/ar/intlayer_with_nextjs_15.md +1 -33
  58. package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +40 -83
  59. package/docs/ar/intlayer_with_solid_start.md +1078 -0
  60. package/docs/ar/intlayer_with_vite+vue.md +1 -3
  61. package/docs/ar/packages/intlayer/getLocalizedUrl.md +26 -24
  62. package/docs/ar/packages/intlayer/getMultilingualUrls.md +4 -18
  63. package/docs/ar/packages/react-intlayer/useDictionary.md +4 -21
  64. package/docs/ar/packages/react-intlayer/useIntlayer.md +2 -2
  65. package/docs/ar/packages/vite-intlayer/exports.md +15 -0
  66. package/docs/ar/packages/vite-intlayer/intlayer.md +121 -6
  67. package/docs/ar/packages/vite-intlayer/intlayerPrune.md +70 -3
  68. package/docs/ar/releases/v9.md +0 -37
  69. package/docs/ar/self_hosting.md +46 -49
  70. package/docs/bn/configuration.md +25 -8
  71. package/docs/bn/intlayer_with_angular_21.md +9 -9
  72. package/docs/cs/configuration.md +25 -8
  73. package/docs/cs/intlayer_with_angular_21.md +9 -9
  74. package/docs/de/analytics.md +222 -0
  75. package/docs/de/autoFill.md +28 -9
  76. package/docs/de/configuration.md +25 -8
  77. package/docs/de/dictionary/file.md +3 -1
  78. package/docs/de/dictionary/nesting.md +47 -31
  79. package/docs/de/formatters.md +208 -334
  80. package/docs/de/intlayer_CMS.md +66 -15
  81. package/docs/de/intlayer_with_angular_21.md +9 -9
  82. package/docs/de/intlayer_with_nestjs.md +11 -7
  83. package/docs/de/intlayer_with_nextjs_14.md +1 -28
  84. package/docs/de/intlayer_with_nextjs_15.md +1 -33
  85. package/docs/de/intlayer_with_solid_start.md +1078 -0
  86. package/docs/de/intlayer_with_vite+vue.md +1 -3
  87. package/docs/de/packages/intlayer/getLocalizedUrl.md +33 -25
  88. package/docs/de/packages/intlayer/getMultilingualUrls.md +4 -18
  89. package/docs/de/packages/react-intlayer/useDictionary.md +2 -5
  90. package/docs/de/packages/vite-intlayer/exports.md +15 -0
  91. package/docs/de/packages/vite-intlayer/intlayer.md +121 -6
  92. package/docs/de/packages/vite-intlayer/intlayerPrune.md +77 -4
  93. package/docs/de/releases/v9.md +0 -15
  94. package/docs/de/self_hosting.md +46 -50
  95. package/docs/en/cli/doc-review.md +13 -2
  96. package/docs/en/configuration.md +24 -15
  97. package/docs/en/intlayer_with_angular_21.md +9 -9
  98. package/docs/en/intlayer_with_solid_start.md +1091 -0
  99. package/docs/en/intlayer_with_vite+solid.md +12 -0
  100. package/docs/en-GB/analytics.md +222 -0
  101. package/docs/en-GB/autoFill.md +26 -7
  102. package/docs/en-GB/configuration.md +25 -8
  103. package/docs/en-GB/dictionary/file.md +2 -0
  104. package/docs/en-GB/dictionary/nesting.md +64 -205
  105. package/docs/en-GB/formatters.md +146 -181
  106. package/docs/en-GB/intlayer_CMS.md +152 -0
  107. package/docs/en-GB/intlayer_with_angular_21.md +9 -9
  108. package/docs/en-GB/intlayer_with_nestjs.md +6 -2
  109. package/docs/en-GB/intlayer_with_nextjs_14.md +0 -27
  110. package/docs/en-GB/intlayer_with_nextjs_15.md +1 -33
  111. package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +40 -82
  112. package/docs/en-GB/intlayer_with_solid_start.md +1078 -0
  113. package/docs/en-GB/intlayer_with_vite+vue.md +1 -3
  114. package/docs/en-GB/packages/intlayer/getLocalizedUrl.md +30 -22
  115. package/docs/en-GB/packages/intlayer/getMultilingualUrls.md +16 -48
  116. package/docs/en-GB/packages/vite-intlayer/exports.md +15 -0
  117. package/docs/en-GB/packages/vite-intlayer/intlayer.md +121 -6
  118. package/docs/en-GB/packages/vite-intlayer/intlayerPrune.md +77 -4
  119. package/docs/en-GB/self_hosting.md +60 -49
  120. package/docs/es/analytics.md +222 -0
  121. package/docs/es/autoFill.md +28 -9
  122. package/docs/es/configuration.md +24 -7
  123. package/docs/es/dictionary/file.md +3 -1
  124. package/docs/es/dictionary/nesting.md +47 -30
  125. package/docs/es/formatters.md +114 -168
  126. package/docs/es/intlayer_CMS.md +35 -10
  127. package/docs/es/intlayer_with_angular_21.md +9 -9
  128. package/docs/es/intlayer_with_nextjs_14.md +1 -28
  129. package/docs/es/intlayer_with_nextjs_15.md +1 -33
  130. package/docs/es/intlayer_with_solid_start.md +1078 -0
  131. package/docs/es/packages/intlayer/getLocalizedUrl.md +31 -23
  132. package/docs/es/packages/intlayer/getMultilingualUrls.md +4 -18
  133. package/docs/es/packages/vite-intlayer/exports.md +15 -0
  134. package/docs/es/packages/vite-intlayer/intlayer.md +121 -6
  135. package/docs/es/packages/vite-intlayer/intlayerPrune.md +69 -2
  136. package/docs/es/releases/v9.md +0 -15
  137. package/docs/es/self_hosting.md +46 -49
  138. package/docs/fr/analytics.md +222 -0
  139. package/docs/fr/autoFill.md +27 -8
  140. package/docs/fr/configuration.md +25 -8
  141. package/docs/fr/dictionary/file.md +2 -0
  142. package/docs/fr/dictionary/nesting.md +37 -184
  143. package/docs/fr/formatters.md +95 -236
  144. package/docs/fr/intlayer_CMS.md +66 -15
  145. package/docs/fr/intlayer_with_angular_21.md +9 -9
  146. package/docs/fr/intlayer_with_nextjs_14.md +1 -28
  147. package/docs/fr/intlayer_with_nextjs_15.md +1 -33
  148. package/docs/fr/intlayer_with_solid_start.md +1078 -0
  149. package/docs/fr/packages/intlayer/getLocalizedUrl.md +37 -27
  150. package/docs/fr/packages/intlayer/getMultilingualUrls.md +18 -20
  151. package/docs/fr/packages/vite-intlayer/exports.md +15 -0
  152. package/docs/fr/packages/vite-intlayer/intlayer.md +121 -6
  153. package/docs/fr/packages/vite-intlayer/intlayerPrune.md +77 -4
  154. package/docs/fr/releases/v9.md +0 -15
  155. package/docs/fr/self_hosting.md +46 -49
  156. package/docs/hi/analytics.md +222 -0
  157. package/docs/hi/autoFill.md +28 -9
  158. package/docs/hi/configuration.md +25 -8
  159. package/docs/hi/dictionary/file.md +3 -1
  160. package/docs/hi/dictionary/nesting.md +47 -30
  161. package/docs/hi/formatters.md +233 -334
  162. package/docs/hi/how_works_intlayer.md +3 -1
  163. package/docs/hi/intlayer_CMS.md +152 -0
  164. package/docs/hi/intlayer_with_angular_21.md +9 -9
  165. package/docs/hi/intlayer_with_nestjs.md +11 -7
  166. package/docs/hi/intlayer_with_nextjs_14.md +1 -28
  167. package/docs/hi/intlayer_with_nextjs_15.md +1 -33
  168. package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +40 -83
  169. package/docs/hi/intlayer_with_solid_start.md +1077 -0
  170. package/docs/hi/intlayer_with_vite+preact.md +56 -49
  171. package/docs/hi/intlayer_with_vite+react.md +48 -41
  172. package/docs/hi/intlayer_with_vite+solid.md +32 -41
  173. package/docs/hi/intlayer_with_vite+vue.md +49 -44
  174. package/docs/hi/packages/intlayer/getLocalizedUrl.md +26 -24
  175. package/docs/hi/packages/intlayer/getMultilingualUrls.md +4 -18
  176. package/docs/hi/packages/next-intlayer/t.md +33 -1
  177. package/docs/hi/packages/react-intlayer/useDictionary.md +4 -21
  178. package/docs/hi/packages/vite-intlayer/exports.md +15 -0
  179. package/docs/hi/packages/vite-intlayer/intlayer.md +121 -6
  180. package/docs/hi/packages/vite-intlayer/intlayerPrune.md +78 -5
  181. package/docs/hi/plugins/sync-json.md +9 -9
  182. package/docs/hi/releases/v9.md +0 -15
  183. package/docs/hi/self_hosting.md +38 -51
  184. package/docs/id/analytics.md +223 -0
  185. package/docs/id/configuration.md +25 -8
  186. package/docs/id/dictionary/nesting.md +37 -184
  187. package/docs/id/formatters.md +208 -305
  188. package/docs/id/intlayer_CMS.md +164 -0
  189. package/docs/id/intlayer_with_angular_21.md +9 -9
  190. package/docs/id/intlayer_with_nextjs_14.md +1 -26
  191. package/docs/id/intlayer_with_react_router_v7_fs_routes.md +70 -63
  192. package/docs/id/intlayer_with_solid_start.md +1078 -0
  193. package/docs/id/packages/intlayer/getMultilingualUrls.md +4 -18
  194. package/docs/id/packages/react-intlayer/useIntlayer.md +2 -2
  195. package/docs/id/packages/vite-intlayer/exports.md +15 -0
  196. package/docs/id/packages/vite-intlayer/intlayer.md +121 -6
  197. package/docs/id/packages/vite-intlayer/intlayerPrune.md +78 -5
  198. package/docs/id/releases/v9.md +12 -0
  199. package/docs/id/self_hosting.md +61 -50
  200. package/docs/it/analytics.md +222 -0
  201. package/docs/it/autoFill.md +27 -8
  202. package/docs/it/configuration.md +25 -8
  203. package/docs/it/dictionary/file.md +3 -1
  204. package/docs/it/dictionary/nesting.md +47 -30
  205. package/docs/it/formatters.md +114 -168
  206. package/docs/it/intlayer_CMS.md +66 -15
  207. package/docs/it/intlayer_with_angular_21.md +9 -9
  208. package/docs/it/intlayer_with_nestjs.md +11 -7
  209. package/docs/it/intlayer_with_nextjs_14.md +1 -28
  210. package/docs/it/intlayer_with_nextjs_15.md +1 -33
  211. package/docs/it/intlayer_with_solid_start.md +1078 -0
  212. package/docs/it/intlayer_with_vite+vue.md +1 -3
  213. package/docs/it/packages/intlayer/getLocalizedUrl.md +34 -26
  214. package/docs/it/packages/intlayer/getMultilingualUrls.md +4 -18
  215. package/docs/it/packages/react-intlayer/useDictionary.md +4 -21
  216. package/docs/it/packages/vite-intlayer/exports.md +15 -0
  217. package/docs/it/packages/vite-intlayer/intlayer.md +121 -6
  218. package/docs/it/packages/vite-intlayer/intlayerPrune.md +77 -4
  219. package/docs/it/releases/v9.md +0 -15
  220. package/docs/it/self_hosting.md +60 -49
  221. package/docs/ja/analytics.md +222 -0
  222. package/docs/ja/autoFill.md +28 -9
  223. package/docs/ja/configuration.md +25 -8
  224. package/docs/ja/dictionary/content_file.md +15 -7
  225. package/docs/ja/dictionary/file.md +3 -1
  226. package/docs/ja/dictionary/nesting.md +47 -30
  227. package/docs/ja/formatters.md +133 -187
  228. package/docs/ja/intlayer_visual_editor.md +3 -1
  229. package/docs/ja/intlayer_with_angular_21.md +6 -6
  230. package/docs/ja/intlayer_with_nestjs.md +2 -12
  231. package/docs/ja/intlayer_with_nextjs_14.md +1 -28
  232. package/docs/ja/intlayer_with_nextjs_15.md +1 -33
  233. package/docs/ja/intlayer_with_react_router_v7.md +456 -20
  234. package/docs/ja/intlayer_with_solid_start.md +1078 -0
  235. package/docs/ja/intlayer_with_vite+preact.md +73 -41
  236. package/docs/ja/intlayer_with_vite+vue.md +1 -3
  237. package/docs/ja/mcp_server.md +3 -9
  238. package/docs/ja/packages/intlayer/getLocalizedUrl.md +26 -24
  239. package/docs/ja/packages/intlayer/getMultilingualUrls.md +3 -17
  240. package/docs/ja/packages/vite-intlayer/exports.md +15 -0
  241. package/docs/ja/packages/vite-intlayer/intlayer.md +121 -6
  242. package/docs/ja/packages/vite-intlayer/intlayerPrune.md +79 -6
  243. package/docs/ja/releases/v9.md +12 -0
  244. package/docs/ja/self_hosting.md +46 -50
  245. package/docs/ko/analytics.md +222 -0
  246. package/docs/ko/autoFill.md +28 -9
  247. package/docs/ko/configuration.md +25 -8
  248. package/docs/ko/dictionary/file.md +3 -1
  249. package/docs/ko/dictionary/nesting.md +47 -30
  250. package/docs/ko/formatters.md +133 -187
  251. package/docs/ko/intlayer_with_angular_21.md +9 -9
  252. package/docs/ko/intlayer_with_lynx+react.md +133 -39
  253. package/docs/ko/intlayer_with_nextjs_14.md +1 -28
  254. package/docs/ko/intlayer_with_nextjs_15.md +1 -33
  255. package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +40 -188
  256. package/docs/ko/intlayer_with_solid_start.md +1078 -0
  257. package/docs/ko/intlayer_with_vite+preact.md +57 -23
  258. package/docs/ko/intlayer_with_vite+vue.md +1 -3
  259. package/docs/ko/packages/intlayer/getLocalizedUrl.md +26 -24
  260. package/docs/ko/packages/intlayer/getMultilingualUrls.md +4 -18
  261. package/docs/ko/packages/vite-intlayer/exports.md +15 -0
  262. package/docs/ko/packages/vite-intlayer/intlayer.md +121 -6
  263. package/docs/ko/packages/vite-intlayer/intlayerPrune.md +79 -6
  264. package/docs/ko/releases/v9.md +12 -0
  265. package/docs/ko/self_hosting.md +60 -49
  266. package/docs/nl/configuration.md +25 -8
  267. package/docs/nl/intlayer_with_angular_21.md +9 -9
  268. package/docs/pl/analytics.md +220 -0
  269. package/docs/pl/configuration.md +25 -8
  270. package/docs/pl/dictionary/nesting.md +47 -30
  271. package/docs/pl/formatters.md +208 -305
  272. package/docs/pl/intlayer_CMS.md +152 -0
  273. package/docs/pl/intlayer_with_angular_21.md +9 -9
  274. package/docs/pl/intlayer_with_nextjs_14.md +1 -26
  275. package/docs/pl/intlayer_with_solid_start.md +1078 -0
  276. package/docs/pl/packages/intlayer/getMultilingualUrls.md +4 -18
  277. package/docs/pl/packages/react-intlayer/useDictionary.md +2 -19
  278. package/docs/pl/packages/vite-intlayer/exports.md +15 -0
  279. package/docs/pl/packages/vite-intlayer/intlayer.md +121 -6
  280. package/docs/pl/packages/vite-intlayer/intlayerPrune.md +77 -4
  281. package/docs/pl/releases/v9.md +0 -15
  282. package/docs/pl/self_hosting.md +60 -49
  283. package/docs/pt/analytics.md +222 -0
  284. package/docs/pt/configuration.md +25 -8
  285. package/docs/pt/dictionary/file.md +3 -1
  286. package/docs/pt/dictionary/nesting.md +47 -30
  287. package/docs/pt/formatters.md +112 -168
  288. package/docs/pt/intlayer_CMS.md +66 -15
  289. package/docs/pt/intlayer_with_angular_21.md +9 -9
  290. package/docs/pt/intlayer_with_astro_lit.md +26 -1
  291. package/docs/pt/intlayer_with_nextjs_14.md +1 -28
  292. package/docs/pt/intlayer_with_nextjs_15.md +1 -33
  293. package/docs/pt/intlayer_with_solid_start.md +1078 -0
  294. package/docs/pt/intlayer_with_vite+vue.md +1 -3
  295. package/docs/pt/packages/intlayer/getLocalizedUrl.md +34 -26
  296. package/docs/pt/packages/intlayer/getMultilingualUrls.md +4 -18
  297. package/docs/pt/packages/vite-intlayer/exports.md +15 -0
  298. package/docs/pt/packages/vite-intlayer/intlayer.md +121 -6
  299. package/docs/pt/packages/vite-intlayer/intlayerPrune.md +78 -6
  300. package/docs/pt/releases/v9.md +0 -15
  301. package/docs/pt/self_hosting.md +60 -49
  302. package/docs/ru/analytics.md +222 -0
  303. package/docs/ru/autoFill.md +27 -8
  304. package/docs/ru/configuration.md +25 -8
  305. package/docs/ru/dictionary/file.md +3 -1
  306. package/docs/ru/dictionary/nesting.md +64 -205
  307. package/docs/ru/formatters.md +108 -128
  308. package/docs/ru/intlayer_with_angular_21.md +9 -9
  309. package/docs/ru/intlayer_with_nextjs_14.md +1 -28
  310. package/docs/ru/intlayer_with_nextjs_15.md +1 -33
  311. package/docs/ru/intlayer_with_solid_start.md +1078 -0
  312. package/docs/ru/intlayer_with_vite+vue.md +1 -3
  313. package/docs/ru/packages/intlayer/getLocalizedUrl.md +34 -26
  314. package/docs/ru/packages/intlayer/getMultilingualUrls.md +4 -18
  315. package/docs/ru/packages/react-intlayer/useDictionary.md +4 -21
  316. package/docs/ru/packages/vite-intlayer/exports.md +15 -0
  317. package/docs/ru/packages/vite-intlayer/intlayer.md +121 -6
  318. package/docs/ru/packages/vite-intlayer/intlayerPrune.md +77 -4
  319. package/docs/ru/releases/v9.md +0 -15
  320. package/docs/ru/self_hosting.md +60 -49
  321. package/docs/tr/analytics.md +222 -0
  322. package/docs/tr/autoFill.md +28 -9
  323. package/docs/tr/configuration.md +25 -8
  324. package/docs/tr/dictionary/file.md +2 -0
  325. package/docs/tr/dictionary/nesting.md +47 -30
  326. package/docs/tr/formatters.md +144 -190
  327. package/docs/tr/intlayer_CMS.md +152 -0
  328. package/docs/tr/intlayer_with_angular_21.md +9 -9
  329. package/docs/tr/intlayer_with_nestjs.md +2 -12
  330. package/docs/tr/intlayer_with_nextjs_15.md +1 -33
  331. package/docs/tr/intlayer_with_solid_start.md +1078 -0
  332. package/docs/tr/intlayer_with_vite+vue.md +1 -3
  333. package/docs/tr/packages/intlayer/getMultilingualUrls.md +4 -18
  334. package/docs/tr/packages/vite-intlayer/exports.md +15 -0
  335. package/docs/tr/packages/vite-intlayer/intlayer.md +121 -6
  336. package/docs/tr/packages/vite-intlayer/intlayerPrune.md +77 -4
  337. package/docs/tr/self_hosting.md +47 -50
  338. package/docs/uk/analytics.md +222 -0
  339. package/docs/uk/configuration.md +25 -8
  340. package/docs/uk/dictionary/nesting.md +47 -30
  341. package/docs/uk/formatters.md +128 -185
  342. package/docs/uk/intlayer_CMS.md +152 -0
  343. package/docs/uk/intlayer_with_angular_21.md +9 -9
  344. package/docs/uk/intlayer_with_nextjs_14.md +1 -26
  345. package/docs/uk/intlayer_with_solid_start.md +1078 -0
  346. package/docs/uk/packages/react-intlayer/useDictionary.md +2 -19
  347. package/docs/uk/packages/vite-intlayer/exports.md +15 -0
  348. package/docs/uk/packages/vite-intlayer/intlayer.md +121 -6
  349. package/docs/uk/packages/vite-intlayer/intlayerPrune.md +77 -4
  350. package/docs/uk/releases/v9.md +0 -15
  351. package/docs/uk/self_hosting.md +60 -50
  352. package/docs/ur/configuration.md +25 -8
  353. package/docs/ur/intlayer_with_angular_21.md +9 -9
  354. package/docs/vi/analytics.md +222 -0
  355. package/docs/vi/configuration.md +24 -8
  356. package/docs/vi/dictionary/nesting.md +37 -184
  357. package/docs/vi/formatters.md +208 -309
  358. package/docs/vi/intlayer_CMS.md +164 -0
  359. package/docs/vi/intlayer_with_angular_21.md +9 -9
  360. package/docs/vi/intlayer_with_nextjs_14.md +0 -25
  361. package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +70 -63
  362. package/docs/vi/intlayer_with_solid_start.md +1078 -0
  363. package/docs/vi/packages/intlayer/getMultilingualUrls.md +4 -18
  364. package/docs/vi/packages/react-intlayer/useIntlayer.md +2 -2
  365. package/docs/vi/packages/vite-intlayer/exports.md +15 -0
  366. package/docs/vi/packages/vite-intlayer/intlayer.md +121 -6
  367. package/docs/vi/packages/vite-intlayer/intlayerPrune.md +77 -4
  368. package/docs/vi/plugins/sync-json.md +6 -6
  369. package/docs/vi/releases/v9.md +12 -0
  370. package/docs/vi/self_hosting.md +61 -50
  371. package/docs/zh/CI_CD.md +4 -0
  372. package/docs/zh/analytics.md +222 -0
  373. package/docs/zh/autoFill.md +28 -9
  374. package/docs/zh/configuration.md +24 -8
  375. package/docs/zh/dictionary/file.md +2 -0
  376. package/docs/zh/dictionary/nesting.md +47 -30
  377. package/docs/zh/formatters.md +140 -188
  378. package/docs/zh/intlayer_CMS.md +164 -0
  379. package/docs/zh/intlayer_with_analog.md +193 -3
  380. package/docs/zh/intlayer_with_angular_19.md +272 -3
  381. package/docs/zh/intlayer_with_angular_21.md +7 -7
  382. package/docs/zh/intlayer_with_create_react_app.md +348 -26
  383. package/docs/zh/intlayer_with_lynx+react.md +263 -4
  384. package/docs/zh/intlayer_with_nextjs_14.md +1 -28
  385. package/docs/zh/intlayer_with_nextjs_15.md +1 -33
  386. package/docs/zh/intlayer_with_nextjs_no_locale_path.md +558 -1
  387. package/docs/zh/intlayer_with_nuxt.md +182 -7
  388. package/docs/zh/intlayer_with_react_router_v7.md +183 -25
  389. package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +306 -42
  390. package/docs/zh/intlayer_with_solid_start.md +1077 -0
  391. package/docs/zh/intlayer_with_storybook.md +260 -3
  392. package/docs/zh/intlayer_with_svelte_kit.md +428 -48
  393. package/docs/zh/intlayer_with_tanstack+solid.md +713 -13
  394. package/docs/zh/intlayer_with_tanstack.md +731 -20
  395. package/docs/zh/intlayer_with_vanilla.md +314 -4
  396. package/docs/zh/intlayer_with_vite+lit.md +465 -4
  397. package/docs/zh/intlayer_with_vite+preact.md +422 -116
  398. package/docs/zh/intlayer_with_vite+react.md +324 -45
  399. package/docs/zh/intlayer_with_vite+react_compiler.md +228 -13
  400. package/docs/zh/intlayer_with_vite+solid.md +462 -32
  401. package/docs/zh/intlayer_with_vite+vanilla.md +497 -4
  402. package/docs/zh/mcp_server.md +3 -9
  403. package/docs/zh/packages/intlayer/getLocalizedUrl.md +26 -24
  404. package/docs/zh/packages/intlayer/getMultilingualUrls.md +4 -18
  405. package/docs/zh/packages/vite-intlayer/exports.md +29 -0
  406. package/docs/zh/packages/vite-intlayer/intlayer.md +121 -6
  407. package/docs/zh/packages/vite-intlayer/intlayerPrune.md +79 -6
  408. package/docs/zh/releases/v9.md +12 -0
  409. package/docs/zh/self_hosting.md +60 -50
  410. package/docs/zh-TW/intlayer_with_angular_21.md +7 -7
  411. package/package.json +6 -6
  412. package/src/generated/blog.entry.ts +27 -27
  413. package/src/generated/docs.entry.ts +234 -214
  414. package/src/generated/frequentQuestions.entry.ts +17 -17
  415. package/src/generated/legal.entry.ts +2 -2
@@ -0,0 +1,222 @@
1
+ ---
2
+ createdAt: 2026-07-08
3
+ updatedAt: 2026-07-08
4
+ title: Intlayer Analytics | Theo dõi hiển thị nội dung và chạy thử nghiệm A/B
5
+ description: Khám phá cách @intlayer/analytics theo dõi lượt xem trang/ngôn ngữ và lượt hiển thị nội dung, cũng như cách sử dụng nó để chạy thử nghiệm A/B trên nội dung Intlayer của bạn.
6
+ keywords:
7
+ - Analytics
8
+ - A/B Testing
9
+ - Audience
10
+ - Internationalization
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 — gói @intlayer/analytics, theo dõi ở cấp độ provider/node, thử nghiệm A/B, dashboard"
24
+ author: aymericzip
25
+ ---
26
+
27
+ # Tài liệu Intlayer Analytics
28
+
29
+ `@intlayer/analytics` là một gói đồng hành tùy chọn cho bạn biết **chính xác nội dung nào được hiển thị** cho khách truy cập của bạn — trang nào, bằng ngôn ngữ (locale) nào và đoạn nội dung được dịch cụ thể nào — để bạn có thể hiểu rõ khán giả của mình và chạy **thử nghiệm A/B trên nội dung**.
30
+
31
+ ## Mục lục
32
+
33
+ <TOC/>
34
+
35
+ ---
36
+
37
+ ## Những gì nó theo dõi
38
+
39
+ `@intlayer/analytics` gom nhóm ba loại sự kiện ẩn danh thành các batch:
40
+
41
+ | Sự kiện | Bắt ở đâu | Cho bạn biết điều gì |
42
+ | ------------------ | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
43
+ | `page_view` | Cấp độ Provider (`IntlayerProvider`) | Trang và ngôn ngữ nào mà một phiên (session) đã xem, khi tải lần đầu, khi chuyển hướng (route change) hoặc chuyển ngôn ngữ. |
44
+ | `content_exposure` | Cấp độ Node (`useIntlayer` / plugin trình biên dịch) | Khóa từ điển (dictionary key) / đường dẫn khóa nào thực sự được giải quyết và hiển thị — và nếu là một phần của thử nghiệm, thì đó là **biến thể (variant)** nào. |
45
+ | `conversion` | Bất cứ nơi nào bạn gọi `useConversion()` | Một mục tiêu đạt được (đăng ký, nhấp chuột, mua hàng...) được quy cho (attributed) biến thể A/B mà phiên đó đã tiếp xúc. |
46
+
47
+ Các sự kiện được thu thập trong bộ nhớ và được gửi dưới dạng một **yêu cầu batch duy nhất khoảng 20 giây một lần** — không bao giờ gửi trên mỗi lần gõ phím hoặc mỗi lần render — do đó, analytics không bao giờ ảnh hưởng đến thời gian render đầu tiên hoặc thêm một yêu cầu cho mỗi tương tác.
48
+
49
+ ## Cách nó hỗ trợ thử nghiệm A/B trên nội dung
50
+
51
+ Intlayer đã cho phép bạn khai báo [Biến thể (Variants)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dynamic_dictionaries/index.md) nội dung (ví dụ: từ điển `hero-banner` có biến thể `control` và `black_friday`). `@intlayer/analytics` khép kín quy trình này:
52
+
53
+ 1. `getVariant(experimentKey, variants)` gán một cách tất định mỗi phiên ẩn danh cho một biến thể — đây là một hàm thuần túy (pure function) của session id và khóa thử nghiệm, vì vậy việc gán là **ổn định trong toàn bộ phiên** và **không cần round-trip đến máy chủ** trước lần render đầu tiên (không bị nhấp nháy (flicker), không thay đổi bố cục (layout shift)).
54
+ 2. Mỗi sự kiện `content_exposure` mang theo `variant` đã được hiển thị.
55
+ 3. `useConversion()` cho phép bạn quy một mục tiêu (ví dụ: `"cta_click"`) cho biến thể đó.
56
+ 4. Điểm cuối (endpoint) kết quả thử nghiệm trên dashboard sẽ so sánh tỷ lệ chuyển đổi trên mỗi biến thể, bao gồm cả ý nghĩa thống kê (kiểm định z).
57
+
58
+ ## Cài đặt
59
+
60
+ `@intlayer/analytics` là một dependency **ngang hàng (peer), tùy chọn** — không bao giờ được tự động cài đặt bởi một gói framework. Hãy thêm nó cùng với `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
+ Nếu bạn không cài đặt nó, mọi điểm tích hợp (integration point) sẽ được coi là một hành động trống (no-op) — xem phần [Không tốn phí khi không được cài đặt](#khong-ton-phi-khi-khong-duoc-cai-dat) bên dưới.
79
+
80
+ ## Cấu hình
81
+
82
+ Analytics **sử dụng lại khối cấu hình `editor` hiện có** — không có schema cấu hình `analytics` riêng biệt để điền vào:
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", // Cũng được sử dụng làm điểm cuối nhận dữ liệu (ingestion endpoint) cho analytics
90
+ clientId: "your-client-id", // Cũng được sử dụng làm khóa dự án analytics
91
+ clientSecret: "your-client-secret",
92
+ },
93
+ };
94
+
95
+ export default config;
96
+ ```
97
+
98
+ - `editor.backendURL` — URL cơ sở mà các sự kiện analytics được gửi đến (`POST {backendURL}/api/analytics/events`).
99
+ - `editor.clientId` — khóa dự án công khai được gắn vào mọi sự kiện được thu nhận. Nó cũng đóng vai trò là **công tắc bật (enable switch)**: analytics hoàn toàn bị vô hiệu hóa (và được loại bỏ bằng tree-shaking, xem bên dưới) cho đến khi `clientId` được định cấu hình.
100
+
101
+ Nếu bạn tự lưu trữ (self-host) Intlayer, analytics sẽ tự động trỏ đến phiên bản của riêng bạn vì nó dùng chung `editor.backendURL`.
102
+
103
+ ## Hỗ trợ Framework
104
+
105
+ Analytics được liên kết với `IntlayerProvider` dùng chung từ `react-intlayer`, vì vậy nó có sẵn ở bất kỳ đâu provider đó được sử dụng:
106
+
107
+ | Framework | Trạng thái |
108
+ | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
109
+ | React | ✅ Có sẵn |
110
+ | Next.js (`next-intlayer`) | ✅ Có sẵn (thông qua `react-intlayer`) |
111
+ | React Native / Expo (`react-native-intlayer`) | ✅ Có sẵn (thông qua `react-intlayer`) |
112
+ | Vue, Svelte, Angular, Solid, Preact, Lit, Astro, Vanilla | 🚧 Đã lên kế hoạch — cùng một client, các ràng buộc cấp provider tuân theo mô hình `@intlayer/editor` |
113
+
114
+ ## Cách sử dụng
115
+
116
+ ### Tự động theo dõi ở cấp độ provider
117
+
118
+ Không cần thay đổi mã nguồn. Khi `@intlayer/analytics` đã được cài đặt và `editor.clientId` được cấu hình, `IntlayerProvider` sẽ tự động:
119
+
120
+ - khởi tạo analytics client khi mount,
121
+ - ghi lại một `page_view` ở lần tải ban đầu,
122
+ - ghi lại một `page_view` mỗi khi thay đổi ngôn ngữ,
123
+ - bắt đầu vòng lặp flush ~20 giây và flush mọi sự kiện còn lại khi unmount / đóng tab (thông qua `navigator.sendBeacon`, với fallback là `fetch(..., { keepalive: true })`).
124
+
125
+ ### Tự động theo dõi ở cấp độ node
126
+
127
+ Mỗi khi `useIntlayer` phân giải một phần nội dung để hiển thị, trình thông dịch sẽ báo cáo một sự kiện `content_exposure` cho chính xác `dictionaryKey` + đường dẫn khóa + ngôn ngữ đó — một lần nữa, không cần thay đổi mã. Các lần hiển thị lặp lại của cùng một node trong cùng một cửa sổ flush sẽ được gộp lại thành một sự kiện duy nhất với thuộc tính `count`, vì vậy một danh sách hiển thị lại (re-render) 50 lần sẽ không gửi 50 sự kiện.
128
+
129
+ ### Theo dõi chuyển đổi cho thử nghiệm A/B
130
+
131
+ Sử dụng `useConversion()` để quy một mục tiêu cho biến thể mà một phiên đã thấy:
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
+ Bắt đầu
150
+ </button>
151
+ );
152
+ };
153
+ ```
154
+
155
+ ### Phân giải biến thể phía client (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
+ ## Quyền riêng tư & Hiệu suất
168
+
169
+ - **Ẩn danh theo thiết kế (Anonymous by design)**: các phiên được xác định bằng một id xoay vòng (rotating id); máy chủ (backend) chỉ lưu trữ **mã băm SHA-256** của id đó — không bao giờ lưu trữ id thô và không bao giờ lưu trữ địa chỉ IP.
170
+ - **Vị trí là tương đối**: chỉ có mã quốc gia, bắt nguồn từ các tiêu đề vị trí địa lý của CDN (ví dụ: `cf-ipcountry`, `x-vercel-ip-country`, ...) — không có IP nào được đọc hoặc lưu trữ.
171
+ - **URL loại trừ tham số tìm kiếm (search params)** theo mặc định, do đó các chuỗi truy vấn (query strings) không bao giờ bị thu thập.
172
+ - **Lấy mẫu (Sampling)**: `sampleRate` cho phép bạn chỉ giữ lại một phần nhỏ các sự kiện hiển thị nội dung trên các ứng dụng có lưu lượng truy cập cao.
173
+ - **Xử lý theo batch**: một yêu cầu được gửi sau khoảng 20 giây (`flushInterval`), hoặc sớm hơn nếu bộ đệm bị đầy (`maxBufferSize`) — không bao giờ gửi một yêu cầu cho mỗi sự kiện.
174
+
175
+ ### Không tốn phí khi không được cài đặt
176
+
177
+ `@intlayer/analytics` tuân theo chính xác cùng một mô hình tùy chọn-dependency như `@intlayer/editor`:
178
+
179
+ - mọi điểm tích hợp đều tải gói này thông qua việc sử dụng **dynamic `import()` được bao bọc trong khối `try/catch`** — một ứng dụng không bao giờ cài đặt `@intlayer/analytics` sẽ không bao giờ bị tăng kích thước bundle hoặc chi phí thời gian chạy, và không bao giờ thấy lỗi;
180
+ - một biến môi trường ở thời điểm biên dịch (`INTLAYER_ANALYTICS_ENABLED`), được đặt tự động thành `'false'` bởi `@intlayer/config` bất cứ khi nào `editor.clientId` không được định cấu hình, cho phép các bundler có thể **loại bỏ mã thừa (dead-code-eliminate)** toàn bộ tích hợp này;
181
+ - analytics bị vô hiệu hóa bên trong iframe xem trước của trình chỉnh sửa / CMS Intlayer, do đó các phiên của trình chỉnh sửa không bao giờ được tính là lưu lượng truy cập thực.
182
+
183
+ ## Dashboard: Trang Analytics
184
+
185
+ Sau khi dự án của bạn đã thu thập các sự kiện, trang **Analytics** trong [Intlayer dashboard](https://app.intlayer.org/analytics) (hiển thị ở thanh bên sau khi dự án được chọn) sẽ hiển thị:
186
+
187
+ - **Người dùng đang hoạt động (Active users)** — số lượng khách truy cập duy nhất trong khoảng thời gian cuộn (rolling window) đã chọn (7 / 30 / 90 ngày).
188
+ - **Người dùng hôm nay** và **người dùng trong 7 ngày qua**.
189
+ - **Lượt xem trang (Page views)** trong khoảng thời gian đã chọn.
190
+ - Một **biểu đồ diễn biến (evolution graph)** của số khách truy cập duy nhất hàng ngày.
191
+ - Các tab phân tích theo **Ngôn ngữ (Locales)** và **Vị trí (Location)**, xếp hạng khán giả của bạn theo ngôn ngữ và quốc gia.
192
+
193
+ ## Tham khảo API Backend (Backend API reference)
194
+
195
+ Tất cả các điểm cuối (endpoint) để đọc đều yêu cầu xác thực; việc thu thập dữ liệu (ingestion) là công khai và được quy cho thông qua thuộc tính `clientId` trong phần body.
196
+
197
+ | Phương thức | Điểm cuối (Endpoint) | Mô tả |
198
+ | ----------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------- |
199
+ | `POST` | `/api/analytics/events` | Thu nhận một lô sự kiện (công khai, được gán bởi `clientId` trong body). |
200
+ | `GET` | `/api/analytics/overview` | Tổng số trang / ngôn ngữ cho dự án đã được xác thực. |
201
+ | `GET` | `/api/analytics/audience?days=30` | Khách truy cập duy nhất, lượt xem trang, chuỗi ngày, phân tích theo ngôn ngữ + quốc gia. |
202
+ | `GET` | `/api/analytics/content-stats` | Tổng số lượt hiển thị theo mỗi nội dung, được nhóm theo khóa từ điển / đường dẫn khóa / ngôn ngữ. |
203
+ | `GET` | `/api/analytics/experiments/:experimentKey` | Tỷ lệ chuyển đổi cho mỗi biến thể và ý nghĩa thống kê cho một thử nghiệm A/B. |
204
+
205
+ Bạn cũng có thể gọi các API này theo chương trình thông qua [CMS SDK](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/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
+ ## Các liên kết hữu ích
217
+
218
+ - [Từ điển Động - Bộ sưu tập & Biến thể (Dynamic Dictionaries)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dynamic_dictionaries/index.md)
219
+ - [Intlayer CMS - CMS SDK](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_CMS.md)
220
+ - [Trình chỉnh sửa Trực quan Intlayer (Visual Editor)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_visual_editor.md)
221
+ - [Tham khảo Cấu hình (Configuration Reference)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/configuration.md)
222
+ - [Hướng dẫn Tự lưu trữ (Self-Hosting Guide)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/self_hosting.md)
@@ -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: Cấu hình (Configuration)
5
5
  description: Tìm hiểu cách cấu hình Intlayer cho ứng dụng của bạn. Hiểu các cài đặt và tùy chọn khác nhau có sẵn để tùy chỉnh Intlayer theo nhu cầu của bạn.
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: "Chuyển `routing.enableProxy` thành ba trạng thái: không đặt (auto), `true`, `false`"
17
20
  - version: 9.0.0
18
21
  date: 2026-07-11
19
22
  changes: "Thêm cấu hình `analytics`"
@@ -235,6 +238,18 @@ const config: IntlayerConfig = {
235
238
  */
236
239
  mode: "prefix-no-default",
237
240
 
241
+ /**
242
+ * Bật proxy định tuyến locale của Intlayer (middleware).
243
+ * Xử lý phát hiện locale, chuyển hướng và ghi lại URL ở dev, preview và SSR.
244
+ * - không đặt (auto): máy chủ dev và preview giữ định tuyến theo URL bằng cách bỏ qua
245
+ * locale lưu trong cookie và header. Tiền tố vẫn được phân giải, locale vẫn được lưu,
246
+ * và phát hiện Accept-Language vẫn áp dụng. Ở production hoạt động như `true`.
247
+ * - true: hành vi đầy đủ trong mọi môi trường.
248
+ * - false: không định tuyến locale.
249
+ * Mặc định: undefined (auto)
250
+ */
251
+ enableProxy: undefined,
252
+
238
253
  /**
239
254
  * Nơi lưu trữ locale được người dùng chọn.
240
255
  * Tùy chọn: 'cookie', 'localStorage', 'sessionStorage', 'header' hoặc một mảng của chúng.
@@ -713,13 +728,14 @@ Tính năng phân tích hoàn toàn là tùy chọn tham gia (opt-in): không c
713
728
 
714
729
  Cài đặt kiểm soát hành vi routing, bao gồm cấu trúc URL, lưu trữ locale và quản lý middleware.
715
730
 
716
- | Trường | Mô tả | Kiểu dữ liệu | Mặc định | Ví dụ | Nhận xét |
717
- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
718
- | `mode` | Chế độ cấu trúc URL cho việc quản lý locale. | `'prefix-no-default'` &#124; <br/> `'prefix-all'` &#124; <br/> `'no-prefix'` &#124; <br/> `'search-params'` | `'prefix-no-default'` | `'prefix-no-default'`: `/dashboard` (en) hoặc `/fr/dashboard` (fr). `'prefix-all'`: `/en/dashboard` . `'no-prefix'`: locale được quản lý theo cách khác. `'search-params'`: `/dashboard?locale=fr` | Không ảnh hưởng đến quản lý cookie hoặc local storage. |
719
- | `storage` | Cấu hình cho việc lưu trữ locale phía 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 }]` | Xem bảng tham số lưu trữ bên dưới. |
720
- | `basePath` | Đường dẫn sở cho các URL ứng dụng. | `string` | `''` | `'/my-app'` | Nếu ứng dụng của bạn nằm tại `https://example.com/my-app`, basePath `'/my-app'` các URL trỏ tới `https://example.com/my-app/en` . |
721
- | `rewrite` | Các quy tắc rewrite URL tùy chỉnh để ghi đè chế độ routing mặc định cho các đường dẫn cụ thể. Hỗ trợ các tham số động `[param]`. | `Record<string, StrictModeLocaleMap<string>>` | `undefined` | Xem Ví dụ bên dưới | Quy tắc rewrite độ ưu tiên cao hơn `mode`.<br/>• Hoạt động với Next.js Vite.<br/>• `getLocalizedUrl()` tự động áp dụng các quy tắc phù hợp.<br/>• Xem [Rewrite URL tùy chỉnh](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/custom_url_rewrites.md). |
722
- | `domains` | Ánh xạ các locale với tên máy chủ tên miền để routing dựa trên tên miền. Khi được thiết lập, URL cho một locale sẽ sử dụng tên miền đó làm sở (URL tuyệt đối) và không có tiền tố locale nào được thêm vào đường dẫn. | `Partial<Record<Locale, string>>` | `undefined` | `{ zh: 'intlayer.zh', fr: 'intlayer.org' }` | • Giao thức mặc định `https://` khi không được bao gồm trong tên máy chủ.<br/>• Bản thân tên miền xác định locale, vậy không tiền tố `/zh/` nào được thêm vào.<br/>• `getLocalizedUrl('/', 'zh')` trả về `https://intlayer.zh/`. |
731
+ | Trường | Mô tả | Kiểu dữ liệu | Mặc định | Ví dụ | Nhận xét |
732
+ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
733
+ | `mode` | Chế độ cấu trúc URL cho việc quản lý locale. | `'prefix-no-default'` &#124; <br/> `'prefix-all'` &#124; <br/> `'no-prefix'` &#124; <br/> `'search-params'` | `'prefix-no-default'` | `'prefix-no-default'`: `/dashboard` (en) hoặc `/fr/dashboard` (fr). `'prefix-all'`: `/en/dashboard` . `'no-prefix'`: locale được quản lý theo cách khác. `'search-params'`: `/dashboard?locale=fr` | Không ảnh hưởng đến quản lý cookie hoặc local storage. |
734
+ | `enableProxy` | Bật proxy định tuyến locale của Intlayer (middleware). | `boolean` &#124; <br/> `undefined` | `undefined` (auto) | `true` | Không đặt (auto): máy chủ dev và preview bỏ qua locale lưu trong cookie/header làm nguồn chuyển hướng; tiền tố, việc lưu locale và phát hiện `Accept-Language` vẫn áp dụng. production hoạt động như `true`.<br/>• `true`: hành vi đầy đủ mọi nơi.<br/>• `false`: không định tuyến locale. Trên Next.js, middleware `intlayerProxy` trở thành pass-through. |
735
+ | `storage` | Cấu hình cho việc lưu trữ locale phía 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 }]` | Xem bảng tham số lưu trữ bên dưới. |
736
+ | `basePath` | Đường dẫn sở cho các URL ứng dụng. | `string` | `''` | `'/my-app'` | Nếu ứng dụng của bạn nằm tại `https://example.com/my-app`, basePath `'/my-app'` các URL trỏ tới `https://example.com/my-app/en` . |
737
+ | `rewrite` | Các quy tắc rewrite URL tùy chỉnh để ghi đè chế độ routing mặc định cho các đường dẫn cụ thể. Hỗ trợ các tham số động `[param]`. | `Record<string, StrictModeLocaleMap<string>>` | `undefined` | Xem dụ bên dưới | • Quy tắc rewrite độ ưu tiên cao hơn `mode`.<br/>• Hoạt động với Next.js Vite.<br/>• `getLocalizedUrl()` tự động áp dụng các quy tắc phù hợp.<br/>• Xem [Rewrite URL tùy chỉnh](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/custom_url_rewrites.md). |
738
+ | `domains` | Ánh xạ các locale với tên máy chủ tên miền để routing dựa trên tên miền. Khi được thiết lập, URL cho một locale sẽ sử dụng tên miền đó làm cơ sở (URL tuyệt đối) và không có tiền tố locale nào được thêm vào đường dẫn. | `Partial<Record<Locale, string>>` | `undefined` | `{ zh: 'intlayer.zh', fr: 'intlayer.org' }` | • Giao thức mặc định là `https://` khi không được bao gồm trong tên máy chủ.<br/>• Bản thân tên miền xác định locale, vì vậy không có tiền tố `/zh/` nào được thêm vào.<br/>• `getLocalizedUrl('/', 'zh')` trả về `https://intlayer.zh/`. |
723
739
 
724
740
  **Ví dụ về `rewrite`**:
725
741
 
@@ -68,199 +68,52 @@ export default firstDictionary;
68
68
  }
69
69
  ```
70
70
 
71
- ## Thiết lập lồng nội dung
71
+ ### Tham chiếu với Nest
72
72
 
73
- <Tabs group="framework">
74
- <Tab label="React" value="react">
75
-
76
- To use nested content in a React component, leverage the `useIntlayer` hook from the `react-intlayer` package. This hook retrieves the correct content based on the specified key. Here's an example of how to use it:
77
-
78
- ```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]}
79
- import type { FC } from "react";
80
- import { useIntlayer } from "react-intlayer";
81
-
82
- const NestComponent: FC = () => {
83
- const { fullNestedContent, partialNestedContent } = useIntlayer(
84
- "key_of_my_second_dictionary"
85
- );
86
-
87
- return (
88
- <div>
89
- <p>Full Nested Content: {JSON.stringify(fullNestedContent)}</p>
90
- <p>Partial Nested Value: {partialNestedContent}</p>
91
- </div>
92
- );
93
- };
94
-
95
- export default NestComponent;
96
- ```
97
-
98
- </Tab>
99
- <Tab label="Next.js" value="nextjs">
100
-
101
- To use nested content in Next.js Client Components, retrieve it via the `useIntlayer` hook. Here's an example:
102
-
103
- ```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]}
104
- "use client";
105
-
106
- import type { FC } from "react";
107
- import { useIntlayer } from "next-intlayer";
108
-
109
- const NestComponent: FC = () => {
110
- const { fullNestedContent, partialNestedContent } = useIntlayer(
111
- "key_of_my_second_dictionary"
112
- );
113
-
114
- return (
115
- <div>
116
- <p>Full Nested Content: {JSON.stringify(fullNestedContent)}</p>
117
- <p>Partial Nested Value: {partialNestedContent}</p>
118
- </div>
119
- );
120
- };
121
-
122
- export default NestComponent;
123
- ```
124
-
125
- </Tab>
126
- <Tab label="Vue" value="vue">
127
-
128
- To use nested content in Vue components, retrieve it via the `useIntlayer` hook. Here's an example:
129
-
130
- ```vue fileName="**/*.vue"
131
- <script setup lang="ts">
132
- import { useIntlayer } from "vue-intlayer";
133
-
134
- const { fullNestedContent, partialNestedContent } = useIntlayer(
135
- "key_of_my_second_dictionary"
136
- );
137
- </script>
138
-
139
- <template>
140
- <div>
141
- <p>Full Nested Content: {{ JSON.stringify(fullNestedContent) }}</p>
142
- <p>Partial Nested Value: {{ partialNestedContent }}</p>
143
- </div>
144
- </template>
145
- ```
146
-
147
- </Tab>
148
- <Tab label="Svelte" value="svelte">
149
-
150
- To use nested content in Svelte components, retrieve it via the `useIntlayer` hook. The store is accessed with `$`. Here's an example:
151
-
152
- ```svelte fileName="**/*.svelte"
153
- <script lang="ts">
154
- import { useIntlayer } from "svelte-intlayer";
155
-
156
- const content = useIntlayer("key_of_my_second_dictionary");
157
- </script>
158
-
159
- <div>
160
- <p>Full Nested Content: {JSON.stringify($content.fullNestedContent)}</p>
161
- <p>Partial Nested Value: {$content.partialNestedContent}</p>
162
- </div>
163
- ```
164
-
165
- </Tab>
166
- <Tab label="Preact" value="preact">
167
-
168
- To use nested content in Preact components, retrieve it via the `useIntlayer` hook. Here's an example:
73
+ Bây giờ, hãy tạo một module nội dung khác sử dụng hàm `nest` để tham chiếu nội dung ở trên. Bạn có thể tham chiếu toàn bộ nội dung hoặc một giá trị lồng nhau cụ thể:
169
74
 
170
- ```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]}
171
- import type { FC } from "preact";
172
- import { useIntlayer } from "preact-intlayer";
173
-
174
- const NestComponent: FC = () => {
175
- const { fullNestedContent, partialNestedContent } = useIntlayer(
176
- "key_of_my_second_dictionary"
177
- );
178
-
179
- return (
180
- <div>
181
- <p>Full Nested Content: {JSON.stringify(fullNestedContent)}</p>
182
- <p>Partial Nested Value: {partialNestedContent}</p>
183
- </div>
184
- );
185
- };
186
-
187
- export default NestComponent;
188
- ```
189
-
190
- </Tab>
191
- <Tab label="Solid" value="solid">
192
-
193
- To use nested content in SolidJS components, retrieve it via the `useIntlayer` hook. Here's an example:
194
-
195
- ```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]}
196
- import type { Component } from "solid-js";
197
- import { useIntlayer } from "solid-intlayer";
198
-
199
- const NestComponent: Component = () => {
200
- const { fullNestedContent, partialNestedContent } = useIntlayer(
201
- "key_of_my_second_dictionary"
202
- );
203
-
204
- return (
205
- <div>
206
- <p>Full Nested Content: {JSON.stringify(fullNestedContent)}</p>
207
- <p>Partial Nested Value: {partialNestedContent}</p>
208
- </div>
209
- );
210
- };
211
-
212
- export default NestComponent;
213
- ```
214
-
215
- </Tab>
216
- <Tab label="Angular" value="angular">
217
-
218
- To use nested content in Angular components, retrieve it via the `useIntlayer` hook. Here's an example:
75
+ ```typescript fileName="secondDictionary.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
76
+ import { nest, type Dictionary } from "intlayer";
219
77
 
220
- ```typescript fileName="app.component.ts" codeFormat="typescript"
221
- import { Component } from "@angular/core";
222
- import { useIntlayer } from "angular-intlayer";
78
+ const myNestingContent = {
79
+ key: "key_of_my_second_dictionary",
80
+ content: {
81
+ // Tham chiếu toàn bộ từ điển:
82
+ fullNestedContent: nest("key_of_my_first_dictionary"),
83
+ // Tham chiếu một giá trị lồng nhau cụ thể:
84
+ partialNestedContent: nest(
85
+ "key_of_my_first_dictionary",
86
+ "subContent.contentNumber"
87
+ ),
88
+ },
89
+ } satisfies Dictionary;
223
90
 
224
- @Component({
225
- selector: "app-nest",
226
- template: `
227
- <div>
228
- <p>
229
- Full Nested Content: {{ JSON.stringify(content().fullNestedContent) }}
230
- </p>
231
- <p>Partial Nested Value: {{ content().partialNestedContent }}</p>
232
- </div>
233
- `,
234
- })
235
- export class NestComponent {
236
- content = useIntlayer("key_of_my_second_dictionary");
237
- JSON = JSON;
238
- }
91
+ export default myNestingContent;
239
92
  ```
240
93
 
241
- </Tab>
242
- <Tab label="Vanilla JS" value="vanilla">
243
-
244
- To use nested content with `vanilla-intlayer`, retrieve it via the `useIntlayer` hook. Here's an example:
245
-
246
- ```typescript fileName="**/*.ts" codeFormat={["typescript", "esm"]}
247
- import { installIntlayer, useIntlayer } from "vanilla-intlayer";
248
-
249
- installIntlayer();
250
-
251
- const content = useIntlayer("key_of_my_second_dictionary").onChange(
252
- (newContent) => {
253
- document.getElementById("nested")!.textContent =
254
- newContent.partialNestedContent;
94
+ ```json fileName="secondDictionary.content.json" contentDeclarationFormat="json"
95
+ {
96
+ "$schema": "https://intlayer.org/schema.json",
97
+ "key": "key_of_my_second_dictionary",
98
+ "content": {
99
+ "fullNestedContent": {
100
+ "nodeType": "nested",
101
+ "nested": {
102
+ "dictionaryKey": "key_of_my_first_dictionary"
103
+ }
104
+ },
105
+ "partialNestedContent": {
106
+ "nodeType": "nested",
107
+ "nested": {
108
+ "dictionaryKey": "key_of_my_first_dictionary",
109
+ "path": "subContent.contentNumber"
110
+ }
111
+ }
255
112
  }
256
- );
257
-
258
- // Initial render
259
- document.getElementById("nested")!.textContent = content.partialNestedContent;
113
+ }
260
114
  ```
261
115
 
262
- </Tab>
263
- </Tabs>
116
+ Làm tham số thứ hai, bạn có thể chỉ định một đường dẫn tới một giá trị lồng nhau trong nội dung đó. Khi không cung cấp đường dẫn, toàn bộ nội dung của từ điển được tham chiếu sẽ được trả về.
264
117
 
265
118
  ## Sử dụng Nesting với React Intlayer
266
119