@intlayer/docs 8.12.5-canary.0 → 9.0.0-canary.2

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 (411) hide show
  1. package/dist/cjs/generated/docs.entry.cjs +320 -0
  2. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  3. package/dist/esm/generated/docs.entry.mjs +320 -0
  4. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  5. package/dist/types/generated/docs.entry.d.ts +16 -0
  6. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  7. package/docs/ar/cli/doc-review.md +110 -4
  8. package/docs/ar/cli/index.md +1 -1
  9. package/docs/ar/cli/scan.md +1 -1
  10. package/docs/ar/configuration.md +36 -3
  11. package/docs/ar/dictionary/condition.md +167 -5
  12. package/docs/ar/dictionary/enumeration.md +540 -6
  13. package/docs/ar/dictionary/file.md +151 -1
  14. package/docs/ar/dictionary/gender.md +168 -7
  15. package/docs/ar/dictionary/nesting.md +173 -65
  16. package/docs/ar/dictionary/plurial.md +174 -5
  17. package/docs/ar/dictionary/translation.md +156 -2
  18. package/docs/ar/dynamic_dictionaries/collections.md +1 -1
  19. package/docs/ar/dynamic_dictionaries/dynamic_content.md +1 -1
  20. package/docs/ar/dynamic_dictionaries/index.md +1 -1
  21. package/docs/ar/dynamic_dictionaries/variants.md +1 -1
  22. package/docs/ar/intlayer_with_vite+react.md +31 -31
  23. package/docs/ar/releases/v8.md +187 -1
  24. package/docs/ar/releases/v9.md +232 -0
  25. package/docs/bn/cli/index.md +1 -1
  26. package/docs/bn/cli/scan.md +1 -1
  27. package/docs/bn/configuration.md +36 -3
  28. package/docs/cs/cli/index.md +1 -1
  29. package/docs/cs/cli/scan.md +1 -1
  30. package/docs/cs/configuration.md +35 -2
  31. package/docs/de/cli/doc-review.md +110 -4
  32. package/docs/de/cli/index.md +1 -1
  33. package/docs/de/cli/scan.md +1 -1
  34. package/docs/de/configuration.md +35 -2
  35. package/docs/de/dictionary/condition.md +167 -5
  36. package/docs/de/dictionary/enumeration.md +777 -7
  37. package/docs/de/dictionary/file.md +151 -1
  38. package/docs/de/dictionary/gender.md +168 -7
  39. package/docs/de/dictionary/nesting.md +173 -65
  40. package/docs/de/dictionary/plurial.md +347 -7
  41. package/docs/de/dictionary/translation.md +156 -2
  42. package/docs/de/dynamic_dictionaries/collections.md +1 -1
  43. package/docs/de/dynamic_dictionaries/dynamic_content.md +1 -1
  44. package/docs/de/dynamic_dictionaries/index.md +1 -1
  45. package/docs/de/dynamic_dictionaries/variants.md +1 -1
  46. package/docs/de/intlayer_with_vite+react.md +48 -48
  47. package/docs/de/migration_from_i18next_to_intlayer.md +1 -1
  48. package/docs/de/migration_from_next-i18next_to_intlayer.md +1 -1
  49. package/docs/de/migration_from_next-intl_to_intlayer.md +1 -1
  50. package/docs/de/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  51. package/docs/de/migration_from_react-i18next_to_intlayer.md +1 -1
  52. package/docs/de/migration_from_vue-i18n_to_intlayer.md +1 -1
  53. package/docs/de/releases/v8.md +197 -1
  54. package/docs/de/releases/v9.md +232 -0
  55. package/docs/en/CI_CD.md +7 -7
  56. package/docs/en/cli/ci.md +62 -8
  57. package/docs/en/cli/doc-review.md +110 -4
  58. package/docs/en/cli/index.md +1 -1
  59. package/docs/en/cli/scan.md +1 -1
  60. package/docs/en/compat/i18n-js.md +44 -0
  61. package/docs/en/compat/i18next.md +59 -0
  62. package/docs/en/compat/index.md +51 -0
  63. package/docs/en/compat/lingui.md +44 -0
  64. package/docs/en/compat/next-i18next.md +57 -0
  65. package/docs/en/compat/next-intl.md +59 -0
  66. package/docs/en/compat/next-translate.md +45 -0
  67. package/docs/en/compat/ngx-translate.md +45 -0
  68. package/docs/en/compat/nuxtjs-i18n.md +46 -0
  69. package/docs/en/compat/polyglot.md +45 -0
  70. package/docs/en/compat/react-i18next.md +58 -0
  71. package/docs/en/compat/react-intl.md +55 -0
  72. package/docs/en/compat/svelte-i18n.md +47 -0
  73. package/docs/en/compat/transloco.md +45 -0
  74. package/docs/en/compat/vue-i18n.md +58 -0
  75. package/docs/en/configuration.md +35 -2
  76. package/docs/en/dictionary/condition.md +163 -1
  77. package/docs/en/dictionary/enumeration.md +309 -7
  78. package/docs/en/dictionary/file.md +151 -1
  79. package/docs/en/dictionary/gender.md +162 -1
  80. package/docs/en/dictionary/nesting.md +173 -9
  81. package/docs/en/dictionary/plurial.md +155 -10
  82. package/docs/en/dictionary/translation.md +145 -52
  83. package/docs/en/dynamic_dictionaries/collections.md +1 -1
  84. package/docs/en/dynamic_dictionaries/dynamic_content.md +1 -1
  85. package/docs/en/dynamic_dictionaries/index.md +1 -1
  86. package/docs/en/dynamic_dictionaries/variants.md +1 -1
  87. package/docs/en/migration_from_i18next_to_intlayer.md +1 -1
  88. package/docs/en/migration_from_next-i18next_to_intlayer.md +1 -1
  89. package/docs/en/migration_from_next-intl_to_intlayer.md +1 -1
  90. package/docs/en/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  91. package/docs/en/migration_from_react-i18next_to_intlayer.md +1 -1
  92. package/docs/en/migration_from_vue-i18n_to_intlayer.md +1 -1
  93. package/docs/en/releases/v8.md +187 -1
  94. package/docs/en/releases/v9.md +220 -0
  95. package/docs/en-GB/cli/doc-review.md +110 -4
  96. package/docs/en-GB/cli/index.md +1 -1
  97. package/docs/en-GB/cli/scan.md +1 -1
  98. package/docs/en-GB/configuration.md +35 -2
  99. package/docs/en-GB/dictionary/condition.md +364 -1
  100. package/docs/en-GB/dictionary/enumeration.md +577 -5
  101. package/docs/en-GB/dictionary/file.md +317 -1
  102. package/docs/en-GB/dictionary/gender.md +375 -2
  103. package/docs/en-GB/dictionary/nesting.md +368 -71
  104. package/docs/en-GB/dictionary/plurial.md +347 -7
  105. package/docs/en-GB/dictionary/translation.md +320 -32
  106. package/docs/en-GB/dynamic_dictionaries/collections.md +1 -1
  107. package/docs/en-GB/dynamic_dictionaries/dynamic_content.md +1 -1
  108. package/docs/en-GB/dynamic_dictionaries/index.md +1 -1
  109. package/docs/en-GB/dynamic_dictionaries/variants.md +1 -1
  110. package/docs/en-GB/releases/v8.md +1 -1
  111. package/docs/en-GB/releases/v9.md +220 -0
  112. package/docs/es/cli/doc-review.md +110 -4
  113. package/docs/es/cli/index.md +1 -1
  114. package/docs/es/cli/scan.md +1 -1
  115. package/docs/es/configuration.md +36 -3
  116. package/docs/es/dictionary/condition.md +167 -5
  117. package/docs/es/dictionary/enumeration.md +537 -12
  118. package/docs/es/dictionary/file.md +151 -1
  119. package/docs/es/dictionary/gender.md +168 -7
  120. package/docs/es/dictionary/nesting.md +173 -65
  121. package/docs/es/dictionary/plurial.md +347 -7
  122. package/docs/es/dictionary/translation.md +156 -2
  123. package/docs/es/dynamic_dictionaries/collections.md +1 -1
  124. package/docs/es/dynamic_dictionaries/dynamic_content.md +1 -1
  125. package/docs/es/dynamic_dictionaries/index.md +1 -1
  126. package/docs/es/dynamic_dictionaries/variants.md +1 -1
  127. package/docs/es/migration_from_i18next_to_intlayer.md +1 -1
  128. package/docs/es/migration_from_next-i18next_to_intlayer.md +1 -1
  129. package/docs/es/migration_from_next-intl_to_intlayer.md +1 -1
  130. package/docs/es/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  131. package/docs/es/migration_from_react-i18next_to_intlayer.md +1 -1
  132. package/docs/es/migration_from_vue-i18n_to_intlayer.md +1 -1
  133. package/docs/es/releases/v8.md +187 -1
  134. package/docs/es/releases/v9.md +228 -0
  135. package/docs/fr/cli/doc-review.md +110 -4
  136. package/docs/fr/cli/index.md +1 -1
  137. package/docs/fr/cli/scan.md +1 -1
  138. package/docs/fr/configuration.md +49 -16
  139. package/docs/fr/dictionary/condition.md +369 -6
  140. package/docs/fr/dictionary/enumeration.md +540 -6
  141. package/docs/fr/dictionary/file.md +151 -1
  142. package/docs/fr/dictionary/gender.md +168 -7
  143. package/docs/fr/dictionary/nesting.md +357 -86
  144. package/docs/fr/dictionary/plurial.md +174 -5
  145. package/docs/fr/dictionary/translation.md +156 -2
  146. package/docs/fr/dynamic_dictionaries/collections.md +1 -1
  147. package/docs/fr/dynamic_dictionaries/dynamic_content.md +1 -1
  148. package/docs/fr/dynamic_dictionaries/index.md +1 -1
  149. package/docs/fr/dynamic_dictionaries/variants.md +1 -1
  150. package/docs/fr/migration_from_i18next_to_intlayer.md +1 -1
  151. package/docs/fr/migration_from_next-i18next_to_intlayer.md +1 -1
  152. package/docs/fr/migration_from_next-intl_to_intlayer.md +1 -1
  153. package/docs/fr/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  154. package/docs/fr/migration_from_react-i18next_to_intlayer.md +1 -1
  155. package/docs/fr/migration_from_vue-i18n_to_intlayer.md +1 -1
  156. package/docs/fr/releases/v8.md +187 -1
  157. package/docs/fr/releases/v9.md +220 -0
  158. package/docs/hi/cli/doc-review.md +110 -4
  159. package/docs/hi/cli/index.md +1 -1
  160. package/docs/hi/cli/scan.md +1 -1
  161. package/docs/hi/configuration.md +49 -16
  162. package/docs/hi/dictionary/condition.md +167 -5
  163. package/docs/hi/dictionary/enumeration.md +540 -6
  164. package/docs/hi/dictionary/file.md +151 -1
  165. package/docs/hi/dictionary/gender.md +168 -7
  166. package/docs/hi/dictionary/nesting.md +173 -65
  167. package/docs/hi/dictionary/plurial.md +174 -5
  168. package/docs/hi/dictionary/translation.md +155 -5
  169. package/docs/hi/dynamic_dictionaries/collections.md +1 -1
  170. package/docs/hi/dynamic_dictionaries/dynamic_content.md +1 -1
  171. package/docs/hi/dynamic_dictionaries/index.md +1 -1
  172. package/docs/hi/dynamic_dictionaries/variants.md +1 -1
  173. package/docs/hi/releases/v8.md +188 -2
  174. package/docs/hi/releases/v9.md +232 -0
  175. package/docs/id/cli/doc-review.md +110 -4
  176. package/docs/id/cli/index.md +1 -1
  177. package/docs/id/cli/scan.md +1 -1
  178. package/docs/id/configuration.md +35 -2
  179. package/docs/id/dictionary/condition.md +167 -5
  180. package/docs/id/dictionary/enumeration.md +540 -6
  181. package/docs/id/dictionary/file.md +318 -2
  182. package/docs/id/dictionary/gender.md +381 -8
  183. package/docs/id/dictionary/nesting.md +357 -86
  184. package/docs/id/dictionary/plurial.md +174 -5
  185. package/docs/id/dictionary/translation.md +156 -2
  186. package/docs/id/dynamic_dictionaries/collections.md +1 -1
  187. package/docs/id/dynamic_dictionaries/dynamic_content.md +1 -1
  188. package/docs/id/dynamic_dictionaries/index.md +1 -1
  189. package/docs/id/dynamic_dictionaries/variants.md +1 -1
  190. package/docs/id/releases/v8.md +191 -2
  191. package/docs/id/releases/v9.md +232 -0
  192. package/docs/it/cli/doc-review.md +110 -4
  193. package/docs/it/cli/index.md +1 -1
  194. package/docs/it/cli/scan.md +1 -1
  195. package/docs/it/configuration.md +49 -16
  196. package/docs/it/dictionary/condition.md +167 -5
  197. package/docs/it/dictionary/enumeration.md +540 -6
  198. package/docs/it/dictionary/file.md +318 -2
  199. package/docs/it/dictionary/gender.md +168 -7
  200. package/docs/it/dictionary/nesting.md +173 -65
  201. package/docs/it/dictionary/plurial.md +347 -7
  202. package/docs/it/dictionary/translation.md +156 -2
  203. package/docs/it/dynamic_dictionaries/collections.md +1 -1
  204. package/docs/it/dynamic_dictionaries/dynamic_content.md +1 -1
  205. package/docs/it/dynamic_dictionaries/index.md +1 -1
  206. package/docs/it/dynamic_dictionaries/variants.md +1 -1
  207. package/docs/it/intlayer_with_vite+react.md +0 -48
  208. package/docs/it/migration_from_i18next_to_intlayer.md +1 -1
  209. package/docs/it/migration_from_next-i18next_to_intlayer.md +1 -1
  210. package/docs/it/migration_from_next-intl_to_intlayer.md +1 -1
  211. package/docs/it/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  212. package/docs/it/migration_from_react-i18next_to_intlayer.md +1 -1
  213. package/docs/it/migration_from_vue-i18n_to_intlayer.md +1 -1
  214. package/docs/it/releases/v8.md +200 -2
  215. package/docs/it/releases/v9.md +232 -0
  216. package/docs/ja/cli/doc-review.md +110 -4
  217. package/docs/ja/cli/index.md +1 -1
  218. package/docs/ja/cli/scan.md +1 -1
  219. package/docs/ja/configuration.md +50 -17
  220. package/docs/ja/dictionary/condition.md +167 -5
  221. package/docs/ja/dictionary/enumeration.md +540 -6
  222. package/docs/ja/dictionary/file.md +151 -1
  223. package/docs/ja/dictionary/gender.md +168 -7
  224. package/docs/ja/dictionary/nesting.md +173 -65
  225. package/docs/ja/dictionary/plurial.md +174 -5
  226. package/docs/ja/dictionary/translation.md +169 -8
  227. package/docs/ja/dynamic_dictionaries/collections.md +1 -1
  228. package/docs/ja/dynamic_dictionaries/dynamic_content.md +1 -1
  229. package/docs/ja/dynamic_dictionaries/index.md +1 -1
  230. package/docs/ja/dynamic_dictionaries/variants.md +1 -1
  231. package/docs/ja/intlayer_with_vite+react.md +290 -0
  232. package/docs/ja/migration_from_i18next_to_intlayer.md +1 -1
  233. package/docs/ja/migration_from_next-i18next_to_intlayer.md +1 -1
  234. package/docs/ja/migration_from_next-intl_to_intlayer.md +1 -1
  235. package/docs/ja/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  236. package/docs/ja/migration_from_react-i18next_to_intlayer.md +1 -1
  237. package/docs/ja/migration_from_vue-i18n_to_intlayer.md +1 -1
  238. package/docs/ja/releases/v8.md +193 -4
  239. package/docs/ja/releases/v9.md +232 -0
  240. package/docs/ko/cli/doc-review.md +110 -4
  241. package/docs/ko/cli/index.md +1 -1
  242. package/docs/ko/cli/scan.md +1 -1
  243. package/docs/ko/configuration.md +49 -16
  244. package/docs/ko/dictionary/condition.md +167 -5
  245. package/docs/ko/dictionary/enumeration.md +540 -6
  246. package/docs/ko/dictionary/file.md +151 -1
  247. package/docs/ko/dictionary/gender.md +168 -7
  248. package/docs/ko/dictionary/nesting.md +173 -65
  249. package/docs/ko/dictionary/plurial.md +174 -5
  250. package/docs/ko/dictionary/translation.md +169 -8
  251. package/docs/ko/dynamic_dictionaries/collections.md +1 -1
  252. package/docs/ko/dynamic_dictionaries/dynamic_content.md +1 -1
  253. package/docs/ko/dynamic_dictionaries/index.md +1 -1
  254. package/docs/ko/dynamic_dictionaries/variants.md +1 -1
  255. package/docs/ko/intlayer_with_vite+react.md +48 -490
  256. package/docs/ko/migration_from_i18next_to_intlayer.md +1 -1
  257. package/docs/ko/migration_from_next-i18next_to_intlayer.md +1 -1
  258. package/docs/ko/migration_from_next-intl_to_intlayer.md +1 -1
  259. package/docs/ko/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  260. package/docs/ko/migration_from_react-i18next_to_intlayer.md +1 -1
  261. package/docs/ko/migration_from_vue-i18n_to_intlayer.md +1 -1
  262. package/docs/ko/releases/v8.md +192 -1
  263. package/docs/ko/releases/v9.md +232 -0
  264. package/docs/nl/cli/index.md +1 -1
  265. package/docs/nl/cli/scan.md +1 -1
  266. package/docs/nl/configuration.md +36 -3
  267. package/docs/pl/cli/doc-review.md +110 -4
  268. package/docs/pl/cli/index.md +1 -1
  269. package/docs/pl/cli/scan.md +1 -1
  270. package/docs/pl/configuration.md +35 -2
  271. package/docs/pl/dictionary/condition.md +167 -5
  272. package/docs/pl/dictionary/enumeration.md +540 -6
  273. package/docs/pl/dictionary/file.md +318 -2
  274. package/docs/pl/dictionary/gender.md +168 -7
  275. package/docs/pl/dictionary/nesting.md +173 -65
  276. package/docs/pl/dictionary/plurial.md +174 -5
  277. package/docs/pl/dictionary/translation.md +156 -2
  278. package/docs/pl/dynamic_dictionaries/collections.md +1 -1
  279. package/docs/pl/dynamic_dictionaries/dynamic_content.md +1 -1
  280. package/docs/pl/dynamic_dictionaries/index.md +1 -1
  281. package/docs/pl/dynamic_dictionaries/variants.md +1 -1
  282. package/docs/pl/releases/v8.md +188 -2
  283. package/docs/pl/releases/v9.md +232 -0
  284. package/docs/pt/cli/doc-review.md +110 -4
  285. package/docs/pt/cli/index.md +1 -1
  286. package/docs/pt/cli/scan.md +1 -1
  287. package/docs/pt/configuration.md +49 -16
  288. package/docs/pt/dictionary/condition.md +167 -5
  289. package/docs/pt/dictionary/enumeration.md +540 -6
  290. package/docs/pt/dictionary/file.md +151 -1
  291. package/docs/pt/dictionary/gender.md +168 -7
  292. package/docs/pt/dictionary/nesting.md +173 -65
  293. package/docs/pt/dictionary/plurial.md +347 -7
  294. package/docs/pt/dictionary/translation.md +156 -2
  295. package/docs/pt/dynamic_dictionaries/collections.md +1 -1
  296. package/docs/pt/dynamic_dictionaries/dynamic_content.md +1 -1
  297. package/docs/pt/dynamic_dictionaries/index.md +1 -1
  298. package/docs/pt/dynamic_dictionaries/variants.md +1 -1
  299. package/docs/pt/migration_from_i18next_to_intlayer.md +1 -1
  300. package/docs/pt/migration_from_next-i18next_to_intlayer.md +1 -1
  301. package/docs/pt/migration_from_next-intl_to_intlayer.md +1 -1
  302. package/docs/pt/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  303. package/docs/pt/migration_from_react-i18next_to_intlayer.md +1 -1
  304. package/docs/pt/migration_from_vue-i18n_to_intlayer.md +1 -1
  305. package/docs/pt/releases/v8.md +187 -1
  306. package/docs/pt/releases/v9.md +232 -0
  307. package/docs/ru/cli/doc-review.md +110 -4
  308. package/docs/ru/cli/index.md +1 -1
  309. package/docs/ru/cli/scan.md +1 -1
  310. package/docs/ru/configuration.md +35 -2
  311. package/docs/ru/dictionary/condition.md +366 -39
  312. package/docs/ru/dictionary/enumeration.md +777 -7
  313. package/docs/ru/dictionary/file.md +318 -2
  314. package/docs/ru/dictionary/gender.md +168 -7
  315. package/docs/ru/dictionary/nesting.md +368 -71
  316. package/docs/ru/dictionary/plurial.md +347 -7
  317. package/docs/ru/dictionary/translation.md +321 -33
  318. package/docs/ru/dynamic_dictionaries/collections.md +1 -1
  319. package/docs/ru/dynamic_dictionaries/dynamic_content.md +1 -1
  320. package/docs/ru/dynamic_dictionaries/index.md +1 -1
  321. package/docs/ru/dynamic_dictionaries/variants.md +1 -1
  322. package/docs/ru/intlayer_with_vite+react.md +48 -47
  323. package/docs/ru/migration_from_i18next_to_intlayer.md +1 -1
  324. package/docs/ru/migration_from_next-i18next_to_intlayer.md +1 -1
  325. package/docs/ru/migration_from_next-intl_to_intlayer.md +1 -1
  326. package/docs/ru/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  327. package/docs/ru/migration_from_react-i18next_to_intlayer.md +1 -1
  328. package/docs/ru/migration_from_vue-i18n_to_intlayer.md +1 -1
  329. package/docs/ru/releases/v8.md +194 -2
  330. package/docs/ru/releases/v9.md +232 -0
  331. package/docs/tr/cli/doc-review.md +110 -4
  332. package/docs/tr/cli/index.md +1 -1
  333. package/docs/tr/cli/scan.md +1 -1
  334. package/docs/tr/configuration.md +35 -2
  335. package/docs/tr/dictionary/condition.md +167 -5
  336. package/docs/tr/dictionary/enumeration.md +540 -6
  337. package/docs/tr/dictionary/file.md +151 -1
  338. package/docs/tr/dictionary/gender.md +168 -7
  339. package/docs/tr/dictionary/nesting.md +173 -65
  340. package/docs/tr/dictionary/plurial.md +174 -5
  341. package/docs/tr/dictionary/translation.md +156 -2
  342. package/docs/tr/dynamic_dictionaries/collections.md +1 -1
  343. package/docs/tr/dynamic_dictionaries/dynamic_content.md +1 -1
  344. package/docs/tr/dynamic_dictionaries/index.md +1 -1
  345. package/docs/tr/dynamic_dictionaries/variants.md +1 -1
  346. package/docs/tr/migration_from_i18next_to_intlayer.md +1 -1
  347. package/docs/tr/migration_from_next-i18next_to_intlayer.md +1 -1
  348. package/docs/tr/migration_from_next-intl_to_intlayer.md +1 -1
  349. package/docs/tr/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  350. package/docs/tr/migration_from_react-i18next_to_intlayer.md +1 -1
  351. package/docs/tr/migration_from_vue-i18n_to_intlayer.md +1 -1
  352. package/docs/tr/releases/v8.md +187 -1
  353. package/docs/tr/releases/v9.md +232 -0
  354. package/docs/uk/cli/doc-review.md +110 -4
  355. package/docs/uk/cli/index.md +1 -1
  356. package/docs/uk/cli/scan.md +1 -1
  357. package/docs/uk/configuration.md +35 -2
  358. package/docs/uk/dictionary/condition.md +167 -5
  359. package/docs/uk/dictionary/enumeration.md +540 -6
  360. package/docs/uk/dictionary/file.md +318 -2
  361. package/docs/uk/dictionary/gender.md +381 -8
  362. package/docs/uk/dictionary/nesting.md +173 -65
  363. package/docs/uk/dictionary/plurial.md +174 -5
  364. package/docs/uk/dictionary/translation.md +156 -2
  365. package/docs/uk/dynamic_dictionaries/collections.md +1 -1
  366. package/docs/uk/dynamic_dictionaries/dynamic_content.md +1 -1
  367. package/docs/uk/dynamic_dictionaries/index.md +1 -1
  368. package/docs/uk/dynamic_dictionaries/variants.md +1 -1
  369. package/docs/uk/releases/v8.md +191 -3
  370. package/docs/uk/releases/v9.md +232 -0
  371. package/docs/ur/cli/index.md +1 -1
  372. package/docs/ur/cli/scan.md +1 -1
  373. package/docs/ur/configuration.md +36 -3
  374. package/docs/vi/cli/doc-review.md +110 -4
  375. package/docs/vi/cli/index.md +1 -1
  376. package/docs/vi/cli/scan.md +1 -1
  377. package/docs/vi/configuration.md +50 -17
  378. package/docs/vi/dictionary/condition.md +167 -5
  379. package/docs/vi/dictionary/enumeration.md +591 -14
  380. package/docs/vi/dictionary/file.md +318 -2
  381. package/docs/vi/dictionary/gender.md +168 -7
  382. package/docs/vi/dictionary/nesting.md +357 -86
  383. package/docs/vi/dictionary/plurial.md +174 -5
  384. package/docs/vi/dictionary/translation.md +156 -2
  385. package/docs/vi/dynamic_dictionaries/collections.md +1 -1
  386. package/docs/vi/dynamic_dictionaries/dynamic_content.md +1 -1
  387. package/docs/vi/dynamic_dictionaries/index.md +1 -1
  388. package/docs/vi/dynamic_dictionaries/variants.md +1 -1
  389. package/docs/vi/releases/v8.md +190 -1
  390. package/docs/vi/releases/v9.md +232 -0
  391. package/docs/zh/cli/doc-review.md +110 -4
  392. package/docs/zh/cli/index.md +1 -1
  393. package/docs/zh/cli/scan.md +1 -1
  394. package/docs/zh/configuration.md +49 -16
  395. package/docs/zh/dictionary/condition.md +167 -5
  396. package/docs/zh/dictionary/enumeration.md +540 -6
  397. package/docs/zh/dictionary/file.md +151 -1
  398. package/docs/zh/dictionary/gender.md +168 -7
  399. package/docs/zh/dictionary/nesting.md +173 -65
  400. package/docs/zh/dictionary/plurial.md +174 -5
  401. package/docs/zh/dictionary/translation.md +169 -8
  402. package/docs/zh/dynamic_dictionaries/collections.md +1 -1
  403. package/docs/zh/dynamic_dictionaries/dynamic_content.md +1 -1
  404. package/docs/zh/dynamic_dictionaries/index.md +1 -1
  405. package/docs/zh/dynamic_dictionaries/variants.md +1 -1
  406. package/docs/zh/intlayer_with_vite+react.md +48 -288
  407. package/docs/zh/releases/v8.md +1 -1
  408. package/docs/zh/releases/v9.md +220 -0
  409. package/package.json +7 -7
  410. package/src/generated/docs.entry.ts +320 -0
  411. package/dist/esm/_virtual/_rolldown/runtime.mjs +0 -8
@@ -85,7 +85,10 @@ export default config;
85
85
 
86
86
  ## Sử dụng Dịch thuật trong Các Thành phần React
87
87
 
88
- Với `react-intlayer`, bạn có thể sử dụng các bản dịch trong các thành phần React. Dưới đây là một ví dụ:
88
+ <Tabs group="framework">
89
+ <Tab label="React" value="react">
90
+
91
+ With `react-intlayer`, you can use translations in React components. Here's an example:
89
92
 
90
93
  ```jsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]}
91
94
  import type { FC } from "react";
@@ -104,7 +107,158 @@ const MyComponent: FC = () => {
104
107
  export default MyComponent;
105
108
  ```
106
109
 
107
- Thành phần này lấy bản dịch tương ứng dựa trên locale hiện tại được thiết lập trong ứng dụng của bạn.
110
+ This component fetches the corresponding translation based on the current locale set in your application.
111
+
112
+ </Tab>
113
+ <Tab label="Next.js" value="nextjs">
114
+
115
+ With `next-intlayer`, you can use translations in React Server Components or Client Components. Here's an example in a Client Component:
116
+
117
+ ```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]}
118
+ "use client";
119
+
120
+ import type { FC } from "react";
121
+ import { useIntlayer } from "next-intlayer";
122
+
123
+ const MyComponent: FC = () => {
124
+ const content = useIntlayer("multi_lang");
125
+
126
+ return (
127
+ <div>
128
+ <p>{content.welcomeMessage}</p>
129
+ </div>
130
+ );
131
+ };
132
+
133
+ export default MyComponent;
134
+ ```
135
+
136
+ </Tab>
137
+ <Tab label="Vue" value="vue">
138
+
139
+ With `vue-intlayer`, you can use translations in Vue components. Here's an example:
140
+
141
+ ```vue fileName="**/*.vue"
142
+ <script setup lang="ts">
143
+ import { useIntlayer } from "vue-intlayer";
144
+
145
+ const content = useIntlayer("multi_lang");
146
+ </script>
147
+
148
+ <template>
149
+ <div>
150
+ <p>{{ content.welcomeMessage }}</p>
151
+ </div>
152
+ </template>
153
+ ```
154
+
155
+ </Tab>
156
+ <Tab label="Svelte" value="svelte">
157
+
158
+ With `svelte-intlayer`, you can use translations in Svelte components. The hook returns a Svelte store. Here's an example:
159
+
160
+ ```svelte fileName="**/*.svelte"
161
+ <script lang="ts">
162
+ import { useIntlayer } from "svelte-intlayer";
163
+
164
+ const content = useIntlayer("multi_lang");
165
+ </script>
166
+
167
+ <div>
168
+ <p>{$content.welcomeMessage}</p>
169
+ </div>
170
+ ```
171
+
172
+ </Tab>
173
+ <Tab label="Preact" value="preact">
174
+
175
+ With `preact-intlayer`, you can use translations in Preact components. Here's an example:
176
+
177
+ ```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]}
178
+ import type { FC } from "preact";
179
+ import { useIntlayer } from "preact-intlayer";
180
+
181
+ const MyComponent: FC = () => {
182
+ const content = useIntlayer("multi_lang");
183
+
184
+ return (
185
+ <div>
186
+ <p>{content.welcomeMessage}</p>
187
+ </div>
188
+ );
189
+ };
190
+
191
+ export default MyComponent;
192
+ ```
193
+
194
+ </Tab>
195
+ <Tab label="Solid" value="solid">
196
+
197
+ With `solid-intlayer`, you can use translations in SolidJS components. Here's an example:
198
+
199
+ ```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]}
200
+ import type { Component } from "solid-js";
201
+ import { useIntlayer } from "solid-intlayer";
202
+
203
+ const MyComponent: Component = () => {
204
+ const content = useIntlayer("multi_lang");
205
+
206
+ return (
207
+ <div>
208
+ <p>{content.welcomeMessage}</p>
209
+ </div>
210
+ );
211
+ };
212
+
213
+ export default MyComponent;
214
+ ```
215
+
216
+ </Tab>
217
+ <Tab label="Angular" value="angular">
218
+
219
+ With `angular-intlayer`, you can use translations in Angular components. Here's an example:
220
+
221
+ ```typescript fileName="app.component.ts" codeFormat="typescript"
222
+ import { Component } from "@angular/core";
223
+ import { useIntlayer } from "angular-intlayer";
224
+
225
+ @Component({
226
+ selector: "app-my-component",
227
+ template: `
228
+ <div>
229
+ <p>{{ content().welcomeMessage }}</p>
230
+ </div>
231
+ `,
232
+ })
233
+ export class MyComponent {
234
+ content = useIntlayer("multi_lang");
235
+ }
236
+ ```
237
+
238
+ </Tab>
239
+ <Tab label="Vanilla JS" value="vanilla">
240
+
241
+ With `vanilla-intlayer`, you can use translations by subscribing to content changes. Here's an example:
242
+
243
+ ```typescript fileName="**/*.ts" codeFormat={["typescript", "esm"]}
244
+ import { installIntlayer, useIntlayer } from "vanilla-intlayer";
245
+
246
+ installIntlayer();
247
+
248
+ const content = useIntlayer("multi_lang").onChange((newContent) => {
249
+ document.getElementById("welcome-message")!.textContent = String(
250
+ newContent.welcomeMessage
251
+ );
252
+ });
253
+
254
+ // Initial render
255
+ document.getElementById("welcome-message")!.textContent = String(
256
+ content.welcomeMessage
257
+ );
258
+ ```
259
+
260
+ </Tab>
261
+ </Tabs>
108
262
 
109
263
  ## Đối tượng Nội dung Tùy chỉnh
110
264
 
@@ -14,7 +14,7 @@ slugs:
14
14
  - concept
15
15
  - collections
16
16
  history:
17
- - version: 8.13.0
17
+ - version: 9.0.0
18
18
  date: 2026-06-12
19
19
  changes: "Phát hành tính năng từ điển bộ sưu tập"
20
20
  author: aymericzip
@@ -15,7 +15,7 @@ slugs:
15
15
  - concept
16
16
  - dynamic-records
17
17
  history:
18
- - version: 8.13.0
18
+ - version: 9.0.0
19
19
  date: 2026-06-12
20
20
  changes: "Phát hành tính năng nội dung động"
21
21
  author: aymericzip
@@ -15,7 +15,7 @@ slugs:
15
15
  - concept
16
16
  - dynamic-dictionaries
17
17
  history:
18
- - version: 8.13.0
18
+ - version: 9.0.0
19
19
  date: 2026-06-12
20
20
  changes: "Phát hành tính năng từ điển động"
21
21
  author: aymericzip
@@ -15,7 +15,7 @@ slugs:
15
15
  - concept
16
16
  - variants
17
17
  history:
18
- - version: 8.13.0
18
+ - version: 9.0.0
19
19
  date: 2026-06-12
20
20
  changes: "Phát hành tính năng từ điển biến thể"
21
21
  author: aymericzip
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-09-22
3
- updatedAt: 2026-01-26
3
+ updatedAt: 2026-06-14
4
4
  title: Intlayer v8. Có gì mới?
5
5
  description: Khám phá những điểm mới trong Intlayer v8. Cải tiến chính về trải nghiệm nhà phát triển, xác thực theo schema và quản lý từ điển.
6
6
  keywords:
@@ -409,6 +409,16 @@ Chúng tôi đã giới thiệu các hàm renderer và component độc lập m
409
409
 
410
410
  ---
411
411
 
412
+ ## Tệp Nội dung YAML & Markdown (v8.10.0)
413
+
414
+ Giờ đây, bạn có thể khai báo nội dung trực tiếp bằng các phần mở rộng tệp `.content.md` và `.content.yaml`. Điều này hoàn hảo cho nội dung dạng dài, blog, tài liệu và chính sách bảo mật.
415
+
416
+ Các tệp này hoàn toàn có thể chỉnh sửa từ Visual Editor, mang lại quy trình làm việc hợp lý cho các thành viên không thuộc nhóm kỹ thuật.
417
+
418
+ Để biết thêm chi tiết, xem [Tài liệu Tệp Nội dung YAML](https://intlayer.org/doc/concept/content#yaml-content-file) và [Tài liệu Tệp Nội dung Markdown](https://intlayer.org/doc/concept/content/markdown).
419
+
420
+ ---
421
+
412
422
  ## Viết lại URL tùy chỉnh
413
423
 
414
424
  Intlayer v8 giới thiệu hỗ trợ cho **Viết lại URL tùy chỉnh**, cho phép bạn định nghĩa các đường dẫn theo ngôn ngữ (locale) khác với cấu trúc chuẩn `/locale/path`. Đây là một tính năng mạnh mẽ để cải thiện SEO địa phương và mang lại trải nghiệm người dùng tự nhiên hơn cho những người không nói tiếng Anh.
@@ -753,6 +763,61 @@ export default {
753
763
  </Tab>
754
764
  </Tabs>
755
765
 
766
+ ## Quy tắc số nhiều Unicode CLDR (v8.8.0)
767
+
768
+ Một helper nút `plural` mới đã được giới thiệu dựa trên các quy tắc số nhiều được định nghĩa bởi Dự án Unicode CLDR, giúp cải thiện hỗ trợ cho các ngôn ngữ phức tạp.
769
+
770
+ ```typescript fileName="src/openings.content.ts"
771
+ import { plural, t, type Dictionary } from "intlayer";
772
+
773
+ const openingsContent = {
774
+ key: "total_openings",
775
+ content: {
776
+ totalOpenings: t({
777
+ vi: plural({
778
+ other: "{{count}} cơ hội",
779
+ }),
780
+ en: plural({
781
+ one: "{{count}} opening",
782
+ other: "{{count}} openings",
783
+ }),
784
+ fr: plural({
785
+ one: "{{count}} offre",
786
+ other: "{{count}} offres",
787
+ }),
788
+ }),
789
+ },
790
+ } satisfies Dictionary;
791
+
792
+ export default openingsContent;
793
+ ```
794
+
795
+ Sau đó, bạn có thể truyền số lượng một cách động trong component framework của mình:
796
+
797
+ ```tsx
798
+ import type { FC } from "react";
799
+ import { useIntlayer } from "react-intlayer";
800
+
801
+ const OpeningsComponent: FC<{ count: number }> = ({ count }) => {
802
+ const { totalOpenings } = useIntlayer("total_openings");
803
+
804
+ return (
805
+ <div>
806
+ {/* Trong tiếng Anh: */}
807
+ {/* count=0 → "0 openings" (other) */}
808
+ {/* count=1 → "1 opening" (one) */}
809
+ {/* count=2 → "2 openings" (other) */}
810
+ {/* count=21 → "21 openings" (other) */}
811
+ <p>{totalOpenings(count)}</p>
812
+ </div>
813
+ );
814
+ };
815
+ ```
816
+
817
+ Để biết thêm thông tin, xem [Tài liệu Đa dạng hóa (Pluralization)](https://intlayer.org/doc/concept/content/plural).
818
+
819
+ ---
820
+
756
821
  ## Xác thực Schema Nội dung
757
822
 
758
823
  Intlayer v8 giới thiệu tính năng xác thực schema cho các dictionaries. Bây giờ bạn có thể định nghĩa các schema xác thực có thể tái sử dụng trong cấu hình của mình bằng Zod và áp dụng chúng cho các file nội dung. Điều này đảm bảo nội dung của bạn luôn tuân theo cấu trúc mong đợi, giúp phát hiện lỗi trong quá trình build.
@@ -797,6 +862,34 @@ Nếu nội dung không khớp với schema (ví dụ: title quá ngắn), quá
797
862
 
798
863
  ---
799
864
 
865
+ ## TypeScript: Các bộ truy cập nguyên bản IntlayerNode
866
+
867
+ Kiểu `IntlayerNode` đã được cập nhật để cho phép gọi trực tiếp các phương thức JavaScript nguyên bản (primitive) trên các nút nội dung. Điều này giúp bạn có thể tương tác trực tiếp với nội dung đã được bản địa hóa của mình như thể nó là một chuỗi, số, boolean hoặc mảng nguyên bản tiêu chuẩn.
868
+
869
+ Được hỗ trợ trên React, Preact, Solid, Svelte, Vue và Angular.
870
+
871
+ ### Ví dụ về Chuỗi (String)
872
+
873
+ ```typescript
874
+ content.placeholder; // Trả về IntlayerNode<string>
875
+ content.placeholder.value; // Trả về string
876
+ content.placeholder.toString(); // Trả về string
877
+ content.placeholder.toLowerCase(); // Trả về string
878
+ String(content.placeholder); // Trả về string
879
+ content.placeholder.toUpperCase(); // Trả về chuỗi viết hoa
880
+ content.placeholder.replace("a", "b"); // Trả về chuỗi đã sửa đổi
881
+ ```
882
+
883
+ ### Ví dụ về Mảng (Array)
884
+
885
+ ```typescript
886
+ content.myArrayOfString // Trả về IntlayerNode<Array<string>>
887
+ content.myArrayOfString.find(...) // Trả về phần tử
888
+ content.myArrayOfString.join(', ') // Trả về chuỗi được nối
889
+ ```
890
+
891
+ ---
892
+
800
893
  ### Phát hiện nội dung tự động nâng cao
801
894
 
802
895
  Trong v8, Intlayer tự động nhận diện thông minh cú pháp Markdown, thẻ HTML và các chèn biến trong các chuỗi nội dung của bạn. Điều này có nghĩa là bạn thường có thể bỏ qua các hàm trợ giúp như `md()`, `html()` hoặc `insert()`.
@@ -1002,6 +1095,17 @@ Phần mở rộng Intlayer cho VSCode nhận được các cập nhật lớn t
1002
1095
 
1003
1096
  ---
1004
1097
 
1098
+ ## Công cụ: C++ Watcher & OXC-based LSP (v8.12.0)
1099
+
1100
+ Intlayer v8.12.0 mang lại những cải tiến lớn cho trải nghiệm nhà phát triển:
1101
+
1102
+ - **Parcel Watcher**: Trình theo dõi nội dung (content watcher) đã được di chuyển từ `chokidar` sang `@parcel/watcher`, tận dụng tính năng theo dõi tệp C++ gốc để cung cấp các bản cập nhật nhanh hơn và giảm đáng kể mức tiêu thụ bộ nhớ.
1103
+ - **Language Server Protocol (LSP) mới**: Một LSP hoàn toàn mới hiện đã sẵn sàng. Được xây dựng với phân tích cú pháp dựa trên OXC, nó giúp IDE và các tác nhân AI của bạn liên kết liền mạch các lệnh gọi `useIntlayer('my-key')` với các tệp `.content` tương ứng của chúng và ngược lại.
1104
+
1105
+ Để biết thêm chi tiết, xem [Tài liệu LSP](https://intlayer.org/doc/lsp).
1106
+
1107
+ ---
1108
+
1005
1109
  ## Tối ưu trình biên dịch
1006
1110
 
1007
1111
  Intlayer v8 bao gồm một lớp cache mới cho trình biên dịch Markdown và HTML. Điều này đảm bảo rằng các chuỗi nội dung giống hệt với cùng cấu hình chỉ được phân tích một lần, giảm đáng kể chi phí khi tái kết xuất hoặc khi sử dụng cùng nội dung ở nhiều nơi.
@@ -1057,6 +1161,48 @@ Intlayer v8 bao gồm một lớp cache mới cho trình biên dịch Markdown v
1057
1161
 
1058
1162
  ---
1059
1163
 
1164
+ ## Tối ưu hóa Build Thử nghiệm: Minify & Purge (v8.7.0)
1165
+
1166
+ Intlayer v8.7.0 giới thiệu các tính năng build thử nghiệm mới trong `intlayer.config.ts` của bạn được thiết kế để tối ưu hóa bundle production của bạn:
1167
+
1168
+ - **Thu nhỏ từ điển (Dictionary Minification)**: Thu nhỏ các tệp từ điển để giảm kích thước.
1169
+ - **Loại bỏ khóa không sử dụng (Unused Key Purging)**: Quét và loại bỏ các khóa dịch không sử dụng khỏi từ điển, đổi tên các khóa đang hoạt động thành các ký tự ngắn (ví dụ: `"products" -> "a"`, `"pricing" -> "b"`). Điều này giúp giảm kích thước bundle lên tới 5%.
1170
+ - **Vô hiệu hóa kiểm tra TypeScript**: Tăng tốc độ build bằng cách vô hiệu hóa kiểm tra kiểu dữ liệu (typechecking) TypeScript trong bước biên dịch.
1171
+
1172
+ ```typescript fileName="intlayer.config.ts"
1173
+ import { Locales, type IntlayerConfig } from "intlayer";
1174
+
1175
+ const config: IntlayerConfig = {
1176
+ internationalization: {
1177
+ locales: [Locales.ENGLISH, Locales.FRENCH],
1178
+ defaultLocale: Locales.ENGLISH,
1179
+ },
1180
+ dictionary: {
1181
+ importMode: "dynamic",
1182
+ },
1183
+ build: {
1184
+ /**
1185
+ * Thu nhỏ các từ điển để giảm kích thước bundle.
1186
+ */
1187
+ minify: true,
1188
+
1189
+ /**
1190
+ * Loại bỏ các khóa không sử dụng trong từ điển
1191
+ */
1192
+ purge: true,
1193
+
1194
+ /**
1195
+ * Cho biết liệu quá trình build có nên kiểm tra các kiểu TypeScript hay không
1196
+ */
1197
+ checkTypes: false,
1198
+ },
1199
+ };
1200
+
1201
+ export default config;
1202
+ ```
1203
+
1204
+ ---
1205
+
1060
1206
  ## Tính linh hoạt: Chế độ import hợp nhất
1061
1207
 
1062
1208
  Thuộc tính boolean `live` đã bị đánh dấu là deprecated và được thay bằng thuộc tính `importMode` toàn diện hơn. Điều này cho phép xác định rõ ràng cách các dictionary nên được tải: theo kiểu tĩnh, động, hoặc qua đồng bộ trực tiếp.
@@ -1204,6 +1350,49 @@ Nội dung Markdown và HTML trong Svelte bây giờ tự động được phân
1204
1350
 
1205
1351
  ---
1206
1352
 
1353
+ ## Hỗ trợ Angular: Vite Bundler (v8.11.0)
1354
+
1355
+ Đối với người dùng Angular, Intlayer hiện hỗ trợ nguyên bản trình đóng gói Vite thông qua một plugin esbuild tùy chỉnh mới, giúp tăng tốc thời gian phát triển và build.
1356
+
1357
+ Để biết chi tiết về cấu hình, xem [Tài liệu Môi trường Angular](https://intlayer.org/doc/environment/angular).
1358
+
1359
+ ---
1360
+
1361
+ ## Tạo Sitemap (v8.6.0)
1362
+
1363
+ Intlayer hiện tự động tạo sitemap dựa trên các locale và chế độ định tuyến (routing mode) của bạn. Điều này đặc biệt hữu ích cho việc tối ưu hóa SEO trong các kiến trúc router như TanStack Router:
1364
+
1365
+ ```typescript fileName="src/routes/sitemap.xml.ts"
1366
+ import { createFileRoute } from "@tanstack/react-router";
1367
+ import { generateSitemap } from "intlayer";
1368
+
1369
+ const SITE_URL = (
1370
+ import.meta.env.VITE_SITE_URL ?? "http://localhost:3000"
1371
+ ).replace(/\/$/, "");
1372
+
1373
+ export const Route = createFileRoute("/sitemap.xml")({
1374
+ server: {
1375
+ handlers: {
1376
+ GET: async () => {
1377
+ const sitemap = generateSitemap(
1378
+ [
1379
+ { path: "/", changefreq: "daily", priority: 1.0 },
1380
+ { path: "/about", changefreq: "monthly", priority: 0.8 },
1381
+ ],
1382
+ { siteUrl: SITE_URL }
1383
+ );
1384
+
1385
+ return new Response(sitemap, {
1386
+ headers: { "Content-Type": "application/xml" },
1387
+ });
1388
+ },
1389
+ },
1390
+ },
1391
+ });
1392
+ ```
1393
+
1394
+ ---
1395
+
1207
1396
  ## Ghi chú nâng cấp từ v7
1208
1397
 
1209
1398
  ### Thay đổi cấu hình
@@ -0,0 +1,232 @@
1
+ ---
2
+ createdAt: 2026-06-14
3
+ updatedAt: 2026-06-14
4
+ title: Intlayer v9 Mới - Có gì mới?
5
+ description: Khám phá các tính năng mới trong Intlayer v9. Giới thiệu các package tương thích drop-in cho các thư viện i18n phổ biến và hỗ trợ Collections, Variants, và Dynamic Records.
6
+ keywords:
7
+ - Intlayer
8
+ - Compatibility
9
+ - Migration
10
+ - Collections
11
+ - Variants
12
+ - Dynamic Records
13
+ - i18next
14
+ - next-intl
15
+ - vue-i18n
16
+ slugs:
17
+ - doc
18
+ - releases
19
+ - v9
20
+ author: aymericzip
21
+ ---
22
+
23
+ # Intlayer v9 Mới - Có gì mới?
24
+
25
+ Chào mừng bạn đến với Intlayer v9! Bản phát hành lớn này đánh dấu một cột mốc quan trọng trong việc đơn giản hóa lộ trình migration sang Intlayer với các **Compat Adapter Packages** dành cho các thư viện i18n phổ biến (`react-i18next`, `next-intl`, `vue-i18n`, v.v.) và bổ sung hỗ trợ cho các cấu trúc nội dung phong phú: **Collections**, **Variants**, và **Dynamic Records**.
26
+
27
+ ## Mục lục
28
+
29
+ <TOC levels={[2]} maxDepth={1} />
30
+
31
+ ---
32
+
33
+ ## Compat Adapter Packages
34
+
35
+ Việc migration sang Intlayer từ các thư viện i18n phổ biến giờ đây dễ dàng hơn bao giờ hết. Chúng tôi đã tạo ra năm compat package cung cấp **chính xác các public API tương tự** như các thư viện i18n tiêu chuẩn nhưng ủy quyền toàn bộ việc xử lý translation cho Intlayer tại runtime.
36
+
37
+ ### Cung cấp cùng một Public API với Strict Typing
38
+
39
+ Bằng cách thay thế các import, bạn sẽ nhận được tất cả các lợi ích của Intlayer (bao gồm cả compile-time type safety dựa trên các dictionary thực tế của bạn) với những thay đổi code tối thiểu:
40
+
41
+ - `@intlayer/i18next`
42
+ - `@intlayer/react-i18next`
43
+ - `@intlayer/next-intl`
44
+ - `@intlayer/next-i18next`
45
+ - `@intlayer/vue-i18n`
46
+
47
+ Ví dụ, chỉ cần thay đổi:
48
+
49
+ ```ts
50
+ import { useTranslation } from "react-i18next";
51
+ ```
52
+
53
+ thành:
54
+
55
+ ```ts
56
+ import { useTranslation } from "@intlayer/react-i18next";
57
+ ```
58
+
59
+ Các key của bạn giờ đây sẽ được **strictly typed** dựa trên các Intlayer dictionary của bạn, mang lại khả năng auto-completion dot-path đầy đủ trong IDE của bạn!
60
+
61
+ ### Bundler Alias Plugins (Vite, Next.js, Turbopack)
62
+
63
+ Để cho phép migration mà không cần phải viết lại tất cả các câu lệnh import một cách thủ công, mỗi compat adapter package đều đi kèm một **custom bundler plugin** (Vite hoặc Next.js) dưới subpath `/plugin`.
64
+
65
+ Các plugin này tự động rewrite các import hiện có (ví dụ: `react-i18next` hoặc `next-intl`) thành các package tương đương `@intlayer/*` tại build time.
66
+
67
+ #### Ví dụ Next.js (Webpack / Turbopack)
68
+
69
+ Thay vì `withIntlayer`, hãy bọc cấu hình Next.js của bạn bằng compat plugin:
70
+
71
+ ```ts fileName="next.config.ts"
72
+ import { createNextI18nPlugin } from "@intlayer/next-i18next/plugin";
73
+ import type { NextConfig } from "next";
74
+
75
+ const withIntlayer = createNextI18nPlugin();
76
+ const nextConfig: NextConfig = {};
77
+
78
+ export default withIntlayer(nextConfig);
79
+ ```
80
+
81
+ #### Ví dụ Vite (React, Vue, Solid, Svelte)
82
+
83
+ ```ts fileName="vite.config.ts"
84
+ import vueI18nVitePlugin from "@intlayer/vue-i18n/plugin";
85
+
86
+ export default defineConfig({
87
+ plugins: [vueI18nVitePlugin()],
88
+ });
89
+ ```
90
+
91
+ ---
92
+
93
+ ## Mutualized Runtime Resolver
94
+
95
+ Tất cả các compat adapter giờ đây đều định tuyến việc xử lý translation thông qua một runtime parser duy nhất và được tối ưu hóa cao: `@intlayer/core/messageFormat`.
96
+
97
+ - **Interpolate Message**: Xử lý các cú pháp tiêu chuẩn `{{var}}` (whitespace & dot-paths), các đối số định dạng ICU (`{v, number, percent}` v.v.), và các template `{var}` cơ bản.
98
+ - **Message Node Resolver**: Xử lý các node lồng nhau: `insert()`, `plural()` (quy tắc số nhiều CLDR), `enu()` (enumeration), `gender()`, các thẻ HTML, array, và các callable function node.
99
+ - **Tokenized Tag Parser**: Hỗ trợ các thẻ XML/HTML inline và các thẻ được đánh số (ví dụ: `<1>children</1>`) để hỗ trợ render rich-text một cách dễ dàng.
100
+
101
+ ---
102
+
103
+ ## Chi tiết tính năng: Collections, Variants & Dynamic Records
104
+
105
+ Intlayer v9 mở rộng vượt ra ngoài các đối tượng key-value tĩnh, cho phép các dictionary khai báo các cấu trúc layout động được định kiểu đầy đủ (fully typed) từ đầu đến cuối.
106
+
107
+ ### 1. Collections
108
+
109
+ Định nghĩa một danh sách các item có thứ tự do CMS quản lý (ví dụ: FAQ, sản phẩm, hoặc danh sách blog):
110
+
111
+ ```ts fileName="faq.content.ts"
112
+ import { t, type Dictionary } from "intlayer";
113
+
114
+ export default {
115
+ key: "faq",
116
+ content: [
117
+ {
118
+ question: t({
119
+ vi: "Intlayer là gì?",
120
+ en: "What is Intlayer?",
121
+ fr: "Qu'est-ce qu'Intlayer ?",
122
+ }),
123
+ answer: t({
124
+ vi: "Một bộ công cụ i18n.",
125
+ en: "An i18n toolkit.",
126
+ fr: "Une boîte à outils i18n.",
127
+ }),
128
+ },
129
+ ],
130
+ } satisfies Dictionary;
131
+ ```
132
+
133
+ #### Cách sử dụng:
134
+
135
+ ```ts
136
+ // Lấy tất cả các item
137
+ const allFaqs = useIntlayer("faq"); // -> { question: string, answer: string }[]
138
+
139
+ // Lấy một item duy nhất bằng index
140
+ const faq = useIntlayer("faq", { item: 1 }); // -> { question: string, answer: string }
141
+ ```
142
+
143
+ ### 2. Variants
144
+
145
+ Cung cấp các bản thử nghiệm A/B, seasonal header, feature flag, hoặc các landing page tùy chỉnh:
146
+
147
+ ```ts fileName="hero.content.ts"
148
+ import { t, type Dictionary } from "intlayer";
149
+
150
+ export default {
151
+ key: "hero-banner",
152
+ variant: "default",
153
+ content: {
154
+ control: t({ vi: "Chào mừng", en: "Welcome", fr: "Bienvenue" }),
155
+ black_friday: t({
156
+ vi: "Mua ngay",
157
+ en: "Shop now",
158
+ fr: "Acheter maintenant",
159
+ }),
160
+ },
161
+ } satisfies Dictionary;
162
+ ```
163
+
164
+ #### Cách sử dụng:
165
+
166
+ ```ts
167
+ const banner = useIntlayer("hero-banner", { variant: "black_friday" });
168
+ ```
169
+
170
+ ### 3. Dynamic Records
171
+
172
+ Định nghĩa các dictionary có các mục nhập được tải động tại runtime thông qua các query ID:
173
+
174
+ ```ts fileName="product.content.ts"
175
+ import { t, type Dictionary } from "intlayer";
176
+
177
+ export default {
178
+ key: "product-copy",
179
+ meta: {
180
+ id: "prod_123",
181
+ category: "books",
182
+ },
183
+ content: {
184
+ title: t({ vi: "Clean Code", en: "Clean Code", fr: "Code Propre" }),
185
+ },
186
+ } satisfies Dictionary;
187
+ ```
188
+
189
+ #### Cách sử dụng:
190
+
191
+ ```ts
192
+ // Chỉ tải động item được yêu cầu (yêu cầu Suspense)
193
+ const product = useIntlayer("product-copy", {
194
+ id: "prod_123",
195
+ category: "books",
196
+ });
197
+ ```
198
+
199
+ ---
200
+
201
+ ## Tối ưu hóa Dynamic Loading & Bundle Size
202
+
203
+ Để giữ cho các bundle cực kỳ nhỏ gọn, Intlayer v9 hỗ trợ dynamic lazy loading.
204
+
205
+ Trong cấu hình của bạn, hãy đặt `importMode` thành `'dynamic'` hoặc `'fetch'`:
206
+
207
+ ```ts fileName="intlayer.config.ts"
208
+ export default {
209
+ dictionary: {
210
+ importMode: "dynamic", // "static" | "dynamic" | "fetch"
211
+ },
212
+ };
213
+ ```
214
+
215
+ Tại build time, `@intlayer/swc` và `@intlayer/babel` sẽ quét các file của bạn và thay thế các lệnh gọi `useIntlayer` / `getIntlayer` bằng các wrapper có khả năng tree-shake (`useDictionary` / `useDictionaryDynamic`). Chỉ nội dung được yêu cầu cho collection item, variant, hoặc locale đã chọn mới được tải, giúp ngăn production bundle của bạn chứa các bản dịch không sử dụng.
216
+
217
+ ---
218
+
219
+ ## Lưu ý khi migration từ v8
220
+
221
+ Nếu bạn đang nâng cấp từ v8, lưu ý rằng v9 không bao gồm các breaking change. Tuy nhiên, dưới đây là các thay đổi chính:
222
+
223
+ - **Locales & Dialects**: Nếu sử dụng các dependency i18n bên ngoài, hãy thêm các compat adapter plugin tương ứng của chúng vào cấu hình hoặc thiết lập bundler của bạn để tự động rewrite các import.
224
+ - **Custom Selectors**: Khi gọi `useIntlayer`, tham số thứ hai giờ đây được dành riêng cho một đối tượng option chứa `{ locale, item, variant, id }`. Nếu trước đây bạn đã truyền trực tiếp một chuỗi locale, bạn vẫn có thể làm như vậy, nhưng việc sử dụng đối tượng options được khuyến nghị cho các lựa chọn nâng cao.
225
+
226
+ ---
227
+
228
+ ## Liên kết hữu ích
229
+
230
+ - [Hướng dẫn về Compat Adapter Packages](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/compat/index.md)
231
+ - [Dynamic Dictionaries - Collections, Variants & Dynamic Records](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dynamic_dictionaries/index.md)
232
+ - [Tài liệu tham khảo cấu hình](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/configuration.md)