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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) 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/plugins/sync-json.md +222 -49
  24. package/docs/ar/releases/v8.md +187 -1
  25. package/docs/ar/releases/v9.md +232 -0
  26. package/docs/bn/cli/index.md +1 -1
  27. package/docs/bn/cli/scan.md +1 -1
  28. package/docs/bn/configuration.md +36 -3
  29. package/docs/cs/cli/index.md +1 -1
  30. package/docs/cs/cli/scan.md +1 -1
  31. package/docs/cs/configuration.md +35 -2
  32. package/docs/de/cli/doc-review.md +110 -4
  33. package/docs/de/cli/index.md +1 -1
  34. package/docs/de/cli/scan.md +1 -1
  35. package/docs/de/configuration.md +35 -2
  36. package/docs/de/dictionary/condition.md +167 -5
  37. package/docs/de/dictionary/enumeration.md +777 -7
  38. package/docs/de/dictionary/file.md +151 -1
  39. package/docs/de/dictionary/gender.md +168 -7
  40. package/docs/de/dictionary/nesting.md +173 -65
  41. package/docs/de/dictionary/plurial.md +347 -7
  42. package/docs/de/dictionary/translation.md +156 -2
  43. package/docs/de/dynamic_dictionaries/collections.md +1 -1
  44. package/docs/de/dynamic_dictionaries/dynamic_content.md +1 -1
  45. package/docs/de/dynamic_dictionaries/index.md +1 -1
  46. package/docs/de/dynamic_dictionaries/variants.md +1 -1
  47. package/docs/de/intlayer_with_vite+react.md +48 -48
  48. package/docs/de/migration_from_i18next_to_intlayer.md +1 -1
  49. package/docs/de/migration_from_next-i18next_to_intlayer.md +1 -1
  50. package/docs/de/migration_from_next-intl_to_intlayer.md +1 -1
  51. package/docs/de/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  52. package/docs/de/migration_from_react-i18next_to_intlayer.md +1 -1
  53. package/docs/de/migration_from_vue-i18n_to_intlayer.md +1 -1
  54. package/docs/de/plugins/sync-json.md +222 -49
  55. package/docs/de/releases/v8.md +197 -1
  56. package/docs/de/releases/v9.md +232 -0
  57. package/docs/en/CI_CD.md +7 -7
  58. package/docs/en/cli/ci.md +62 -8
  59. package/docs/en/cli/doc-review.md +110 -4
  60. package/docs/en/cli/index.md +1 -1
  61. package/docs/en/cli/scan.md +1 -1
  62. package/docs/en/compat/i18n-js.md +44 -0
  63. package/docs/en/compat/i18next.md +59 -0
  64. package/docs/en/compat/index.md +51 -0
  65. package/docs/en/compat/lingui.md +44 -0
  66. package/docs/en/compat/next-i18next.md +57 -0
  67. package/docs/en/compat/next-intl.md +59 -0
  68. package/docs/en/compat/next-translate.md +45 -0
  69. package/docs/en/compat/ngx-translate.md +45 -0
  70. package/docs/en/compat/nuxtjs-i18n.md +46 -0
  71. package/docs/en/compat/polyglot.md +45 -0
  72. package/docs/en/compat/react-i18next.md +58 -0
  73. package/docs/en/compat/react-intl.md +55 -0
  74. package/docs/en/compat/svelte-i18n.md +47 -0
  75. package/docs/en/compat/transloco.md +45 -0
  76. package/docs/en/compat/vue-i18n.md +58 -0
  77. package/docs/en/configuration.md +35 -2
  78. package/docs/en/dictionary/condition.md +163 -1
  79. package/docs/en/dictionary/enumeration.md +309 -7
  80. package/docs/en/dictionary/file.md +151 -1
  81. package/docs/en/dictionary/gender.md +162 -1
  82. package/docs/en/dictionary/nesting.md +173 -9
  83. package/docs/en/dictionary/plurial.md +155 -10
  84. package/docs/en/dictionary/translation.md +145 -52
  85. package/docs/en/dynamic_dictionaries/collections.md +1 -1
  86. package/docs/en/dynamic_dictionaries/dynamic_content.md +1 -1
  87. package/docs/en/dynamic_dictionaries/index.md +1 -1
  88. package/docs/en/dynamic_dictionaries/variants.md +1 -1
  89. package/docs/en/migration_from_i18next_to_intlayer.md +1 -1
  90. package/docs/en/migration_from_next-i18next_to_intlayer.md +1 -1
  91. package/docs/en/migration_from_next-intl_to_intlayer.md +1 -1
  92. package/docs/en/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  93. package/docs/en/migration_from_react-i18next_to_intlayer.md +1 -1
  94. package/docs/en/migration_from_vue-i18n_to_intlayer.md +1 -1
  95. package/docs/en/plugins/sync-json.md +56 -2
  96. package/docs/en/releases/v8.md +187 -1
  97. package/docs/en/releases/v9.md +220 -0
  98. package/docs/en-GB/cli/doc-review.md +110 -4
  99. package/docs/en-GB/cli/index.md +1 -1
  100. package/docs/en-GB/cli/scan.md +1 -1
  101. package/docs/en-GB/configuration.md +35 -2
  102. package/docs/en-GB/dictionary/condition.md +364 -1
  103. package/docs/en-GB/dictionary/enumeration.md +577 -5
  104. package/docs/en-GB/dictionary/file.md +317 -1
  105. package/docs/en-GB/dictionary/gender.md +375 -2
  106. package/docs/en-GB/dictionary/nesting.md +368 -71
  107. package/docs/en-GB/dictionary/plurial.md +347 -7
  108. package/docs/en-GB/dictionary/translation.md +320 -32
  109. package/docs/en-GB/dynamic_dictionaries/collections.md +1 -1
  110. package/docs/en-GB/dynamic_dictionaries/dynamic_content.md +1 -1
  111. package/docs/en-GB/dynamic_dictionaries/index.md +1 -1
  112. package/docs/en-GB/dynamic_dictionaries/variants.md +1 -1
  113. package/docs/en-GB/plugins/sync-json.md +245 -13
  114. package/docs/en-GB/releases/v8.md +1 -1
  115. package/docs/en-GB/releases/v9.md +220 -0
  116. package/docs/es/cli/doc-review.md +110 -4
  117. package/docs/es/cli/index.md +1 -1
  118. package/docs/es/cli/scan.md +1 -1
  119. package/docs/es/configuration.md +36 -3
  120. package/docs/es/dictionary/condition.md +167 -5
  121. package/docs/es/dictionary/enumeration.md +537 -12
  122. package/docs/es/dictionary/file.md +151 -1
  123. package/docs/es/dictionary/gender.md +168 -7
  124. package/docs/es/dictionary/nesting.md +173 -65
  125. package/docs/es/dictionary/plurial.md +347 -7
  126. package/docs/es/dictionary/translation.md +156 -2
  127. package/docs/es/dynamic_dictionaries/collections.md +1 -1
  128. package/docs/es/dynamic_dictionaries/dynamic_content.md +1 -1
  129. package/docs/es/dynamic_dictionaries/index.md +1 -1
  130. package/docs/es/dynamic_dictionaries/variants.md +1 -1
  131. package/docs/es/migration_from_i18next_to_intlayer.md +1 -1
  132. package/docs/es/migration_from_next-i18next_to_intlayer.md +1 -1
  133. package/docs/es/migration_from_next-intl_to_intlayer.md +1 -1
  134. package/docs/es/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  135. package/docs/es/migration_from_react-i18next_to_intlayer.md +1 -1
  136. package/docs/es/migration_from_vue-i18n_to_intlayer.md +1 -1
  137. package/docs/es/plugins/sync-json.md +222 -49
  138. package/docs/es/releases/v8.md +187 -1
  139. package/docs/es/releases/v9.md +228 -0
  140. package/docs/fr/cli/doc-review.md +110 -4
  141. package/docs/fr/cli/index.md +1 -1
  142. package/docs/fr/cli/scan.md +1 -1
  143. package/docs/fr/configuration.md +49 -16
  144. package/docs/fr/dictionary/condition.md +369 -6
  145. package/docs/fr/dictionary/enumeration.md +540 -6
  146. package/docs/fr/dictionary/file.md +151 -1
  147. package/docs/fr/dictionary/gender.md +168 -7
  148. package/docs/fr/dictionary/nesting.md +357 -86
  149. package/docs/fr/dictionary/plurial.md +174 -5
  150. package/docs/fr/dictionary/translation.md +156 -2
  151. package/docs/fr/dynamic_dictionaries/collections.md +1 -1
  152. package/docs/fr/dynamic_dictionaries/dynamic_content.md +1 -1
  153. package/docs/fr/dynamic_dictionaries/index.md +1 -1
  154. package/docs/fr/dynamic_dictionaries/variants.md +1 -1
  155. package/docs/fr/migration_from_i18next_to_intlayer.md +1 -1
  156. package/docs/fr/migration_from_next-i18next_to_intlayer.md +1 -1
  157. package/docs/fr/migration_from_next-intl_to_intlayer.md +1 -1
  158. package/docs/fr/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  159. package/docs/fr/migration_from_react-i18next_to_intlayer.md +1 -1
  160. package/docs/fr/migration_from_vue-i18n_to_intlayer.md +1 -1
  161. package/docs/fr/plugins/sync-json.md +244 -12
  162. package/docs/fr/releases/v8.md +187 -1
  163. package/docs/fr/releases/v9.md +220 -0
  164. package/docs/hi/cli/doc-review.md +110 -4
  165. package/docs/hi/cli/index.md +1 -1
  166. package/docs/hi/cli/scan.md +1 -1
  167. package/docs/hi/configuration.md +49 -16
  168. package/docs/hi/dictionary/condition.md +167 -5
  169. package/docs/hi/dictionary/enumeration.md +540 -6
  170. package/docs/hi/dictionary/file.md +151 -1
  171. package/docs/hi/dictionary/gender.md +168 -7
  172. package/docs/hi/dictionary/nesting.md +173 -65
  173. package/docs/hi/dictionary/plurial.md +174 -5
  174. package/docs/hi/dictionary/translation.md +155 -5
  175. package/docs/hi/dynamic_dictionaries/collections.md +1 -1
  176. package/docs/hi/dynamic_dictionaries/dynamic_content.md +1 -1
  177. package/docs/hi/dynamic_dictionaries/index.md +1 -1
  178. package/docs/hi/dynamic_dictionaries/variants.md +1 -1
  179. package/docs/hi/plugins/sync-json.md +221 -48
  180. package/docs/hi/releases/v8.md +188 -2
  181. package/docs/hi/releases/v9.md +232 -0
  182. package/docs/id/cli/doc-review.md +110 -4
  183. package/docs/id/cli/index.md +1 -1
  184. package/docs/id/cli/scan.md +1 -1
  185. package/docs/id/configuration.md +35 -2
  186. package/docs/id/dictionary/condition.md +167 -5
  187. package/docs/id/dictionary/enumeration.md +540 -6
  188. package/docs/id/dictionary/file.md +318 -2
  189. package/docs/id/dictionary/gender.md +381 -8
  190. package/docs/id/dictionary/nesting.md +357 -86
  191. package/docs/id/dictionary/plurial.md +174 -5
  192. package/docs/id/dictionary/translation.md +156 -2
  193. package/docs/id/dynamic_dictionaries/collections.md +1 -1
  194. package/docs/id/dynamic_dictionaries/dynamic_content.md +1 -1
  195. package/docs/id/dynamic_dictionaries/index.md +1 -1
  196. package/docs/id/dynamic_dictionaries/variants.md +1 -1
  197. package/docs/id/plugins/sync-json.md +222 -49
  198. package/docs/id/releases/v8.md +191 -2
  199. package/docs/id/releases/v9.md +232 -0
  200. package/docs/it/cli/doc-review.md +110 -4
  201. package/docs/it/cli/index.md +1 -1
  202. package/docs/it/cli/scan.md +1 -1
  203. package/docs/it/configuration.md +49 -16
  204. package/docs/it/dictionary/condition.md +167 -5
  205. package/docs/it/dictionary/enumeration.md +540 -6
  206. package/docs/it/dictionary/file.md +318 -2
  207. package/docs/it/dictionary/gender.md +168 -7
  208. package/docs/it/dictionary/nesting.md +173 -65
  209. package/docs/it/dictionary/plurial.md +347 -7
  210. package/docs/it/dictionary/translation.md +156 -2
  211. package/docs/it/dynamic_dictionaries/collections.md +1 -1
  212. package/docs/it/dynamic_dictionaries/dynamic_content.md +1 -1
  213. package/docs/it/dynamic_dictionaries/index.md +1 -1
  214. package/docs/it/dynamic_dictionaries/variants.md +1 -1
  215. package/docs/it/intlayer_with_vite+react.md +0 -48
  216. package/docs/it/migration_from_i18next_to_intlayer.md +1 -1
  217. package/docs/it/migration_from_next-i18next_to_intlayer.md +1 -1
  218. package/docs/it/migration_from_next-intl_to_intlayer.md +1 -1
  219. package/docs/it/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  220. package/docs/it/migration_from_react-i18next_to_intlayer.md +1 -1
  221. package/docs/it/migration_from_vue-i18n_to_intlayer.md +1 -1
  222. package/docs/it/plugins/sync-json.md +224 -51
  223. package/docs/it/releases/v8.md +200 -2
  224. package/docs/it/releases/v9.md +232 -0
  225. package/docs/ja/cli/doc-review.md +110 -4
  226. package/docs/ja/cli/index.md +1 -1
  227. package/docs/ja/cli/scan.md +1 -1
  228. package/docs/ja/configuration.md +50 -17
  229. package/docs/ja/dictionary/condition.md +167 -5
  230. package/docs/ja/dictionary/enumeration.md +540 -6
  231. package/docs/ja/dictionary/file.md +151 -1
  232. package/docs/ja/dictionary/gender.md +168 -7
  233. package/docs/ja/dictionary/nesting.md +173 -65
  234. package/docs/ja/dictionary/plurial.md +174 -5
  235. package/docs/ja/dictionary/translation.md +169 -8
  236. package/docs/ja/dynamic_dictionaries/collections.md +1 -1
  237. package/docs/ja/dynamic_dictionaries/dynamic_content.md +1 -1
  238. package/docs/ja/dynamic_dictionaries/index.md +1 -1
  239. package/docs/ja/dynamic_dictionaries/variants.md +1 -1
  240. package/docs/ja/intlayer_with_vite+react.md +290 -0
  241. package/docs/ja/migration_from_i18next_to_intlayer.md +1 -1
  242. package/docs/ja/migration_from_next-i18next_to_intlayer.md +1 -1
  243. package/docs/ja/migration_from_next-intl_to_intlayer.md +1 -1
  244. package/docs/ja/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  245. package/docs/ja/migration_from_react-i18next_to_intlayer.md +1 -1
  246. package/docs/ja/migration_from_vue-i18n_to_intlayer.md +1 -1
  247. package/docs/ja/plugins/sync-json.md +222 -49
  248. package/docs/ja/releases/v8.md +193 -4
  249. package/docs/ja/releases/v9.md +232 -0
  250. package/docs/ko/cli/doc-review.md +110 -4
  251. package/docs/ko/cli/index.md +1 -1
  252. package/docs/ko/cli/scan.md +1 -1
  253. package/docs/ko/configuration.md +49 -16
  254. package/docs/ko/dictionary/condition.md +167 -5
  255. package/docs/ko/dictionary/enumeration.md +540 -6
  256. package/docs/ko/dictionary/file.md +151 -1
  257. package/docs/ko/dictionary/gender.md +168 -7
  258. package/docs/ko/dictionary/nesting.md +173 -65
  259. package/docs/ko/dictionary/plurial.md +174 -5
  260. package/docs/ko/dictionary/translation.md +169 -8
  261. package/docs/ko/dynamic_dictionaries/collections.md +1 -1
  262. package/docs/ko/dynamic_dictionaries/dynamic_content.md +1 -1
  263. package/docs/ko/dynamic_dictionaries/index.md +1 -1
  264. package/docs/ko/dynamic_dictionaries/variants.md +1 -1
  265. package/docs/ko/intlayer_with_vite+react.md +48 -490
  266. package/docs/ko/migration_from_i18next_to_intlayer.md +1 -1
  267. package/docs/ko/migration_from_next-i18next_to_intlayer.md +1 -1
  268. package/docs/ko/migration_from_next-intl_to_intlayer.md +1 -1
  269. package/docs/ko/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  270. package/docs/ko/migration_from_react-i18next_to_intlayer.md +1 -1
  271. package/docs/ko/migration_from_vue-i18n_to_intlayer.md +1 -1
  272. package/docs/ko/plugins/sync-json.md +223 -50
  273. package/docs/ko/releases/v8.md +192 -1
  274. package/docs/ko/releases/v9.md +232 -0
  275. package/docs/nl/cli/index.md +1 -1
  276. package/docs/nl/cli/scan.md +1 -1
  277. package/docs/nl/configuration.md +36 -3
  278. package/docs/pl/cli/doc-review.md +110 -4
  279. package/docs/pl/cli/index.md +1 -1
  280. package/docs/pl/cli/scan.md +1 -1
  281. package/docs/pl/configuration.md +35 -2
  282. package/docs/pl/dictionary/condition.md +167 -5
  283. package/docs/pl/dictionary/enumeration.md +540 -6
  284. package/docs/pl/dictionary/file.md +318 -2
  285. package/docs/pl/dictionary/gender.md +168 -7
  286. package/docs/pl/dictionary/nesting.md +173 -65
  287. package/docs/pl/dictionary/plurial.md +174 -5
  288. package/docs/pl/dictionary/translation.md +156 -2
  289. package/docs/pl/dynamic_dictionaries/collections.md +1 -1
  290. package/docs/pl/dynamic_dictionaries/dynamic_content.md +1 -1
  291. package/docs/pl/dynamic_dictionaries/index.md +1 -1
  292. package/docs/pl/dynamic_dictionaries/variants.md +1 -1
  293. package/docs/pl/plugins/sync-json.md +246 -14
  294. package/docs/pl/releases/v8.md +188 -2
  295. package/docs/pl/releases/v9.md +232 -0
  296. package/docs/pt/cli/doc-review.md +110 -4
  297. package/docs/pt/cli/index.md +1 -1
  298. package/docs/pt/cli/scan.md +1 -1
  299. package/docs/pt/configuration.md +49 -16
  300. package/docs/pt/dictionary/condition.md +167 -5
  301. package/docs/pt/dictionary/enumeration.md +540 -6
  302. package/docs/pt/dictionary/file.md +151 -1
  303. package/docs/pt/dictionary/gender.md +168 -7
  304. package/docs/pt/dictionary/nesting.md +173 -65
  305. package/docs/pt/dictionary/plurial.md +347 -7
  306. package/docs/pt/dictionary/translation.md +156 -2
  307. package/docs/pt/dynamic_dictionaries/collections.md +1 -1
  308. package/docs/pt/dynamic_dictionaries/dynamic_content.md +1 -1
  309. package/docs/pt/dynamic_dictionaries/index.md +1 -1
  310. package/docs/pt/dynamic_dictionaries/variants.md +1 -1
  311. package/docs/pt/migration_from_i18next_to_intlayer.md +1 -1
  312. package/docs/pt/migration_from_next-i18next_to_intlayer.md +1 -1
  313. package/docs/pt/migration_from_next-intl_to_intlayer.md +1 -1
  314. package/docs/pt/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  315. package/docs/pt/migration_from_react-i18next_to_intlayer.md +1 -1
  316. package/docs/pt/migration_from_vue-i18n_to_intlayer.md +1 -1
  317. package/docs/pt/plugins/sync-json.md +222 -49
  318. package/docs/pt/releases/v8.md +187 -1
  319. package/docs/pt/releases/v9.md +232 -0
  320. package/docs/ru/cli/doc-review.md +110 -4
  321. package/docs/ru/cli/index.md +1 -1
  322. package/docs/ru/cli/scan.md +1 -1
  323. package/docs/ru/configuration.md +35 -2
  324. package/docs/ru/dictionary/condition.md +366 -39
  325. package/docs/ru/dictionary/enumeration.md +777 -7
  326. package/docs/ru/dictionary/file.md +318 -2
  327. package/docs/ru/dictionary/gender.md +168 -7
  328. package/docs/ru/dictionary/nesting.md +368 -71
  329. package/docs/ru/dictionary/plurial.md +347 -7
  330. package/docs/ru/dictionary/translation.md +321 -33
  331. package/docs/ru/dynamic_dictionaries/collections.md +1 -1
  332. package/docs/ru/dynamic_dictionaries/dynamic_content.md +1 -1
  333. package/docs/ru/dynamic_dictionaries/index.md +1 -1
  334. package/docs/ru/dynamic_dictionaries/variants.md +1 -1
  335. package/docs/ru/intlayer_with_vite+react.md +48 -47
  336. package/docs/ru/migration_from_i18next_to_intlayer.md +1 -1
  337. package/docs/ru/migration_from_next-i18next_to_intlayer.md +1 -1
  338. package/docs/ru/migration_from_next-intl_to_intlayer.md +1 -1
  339. package/docs/ru/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  340. package/docs/ru/migration_from_react-i18next_to_intlayer.md +1 -1
  341. package/docs/ru/migration_from_vue-i18n_to_intlayer.md +1 -1
  342. package/docs/ru/plugins/sync-json.md +269 -95
  343. package/docs/ru/releases/v8.md +194 -2
  344. package/docs/ru/releases/v9.md +232 -0
  345. package/docs/tr/cli/doc-review.md +110 -4
  346. package/docs/tr/cli/index.md +1 -1
  347. package/docs/tr/cli/scan.md +1 -1
  348. package/docs/tr/configuration.md +35 -2
  349. package/docs/tr/dictionary/condition.md +167 -5
  350. package/docs/tr/dictionary/enumeration.md +540 -6
  351. package/docs/tr/dictionary/file.md +151 -1
  352. package/docs/tr/dictionary/gender.md +168 -7
  353. package/docs/tr/dictionary/nesting.md +173 -65
  354. package/docs/tr/dictionary/plurial.md +174 -5
  355. package/docs/tr/dictionary/translation.md +156 -2
  356. package/docs/tr/dynamic_dictionaries/collections.md +1 -1
  357. package/docs/tr/dynamic_dictionaries/dynamic_content.md +1 -1
  358. package/docs/tr/dynamic_dictionaries/index.md +1 -1
  359. package/docs/tr/dynamic_dictionaries/variants.md +1 -1
  360. package/docs/tr/migration_from_i18next_to_intlayer.md +1 -1
  361. package/docs/tr/migration_from_next-i18next_to_intlayer.md +1 -1
  362. package/docs/tr/migration_from_next-intl_to_intlayer.md +1 -1
  363. package/docs/tr/migration_from_nuxtjs_i18n_to_intlayer.md +1 -1
  364. package/docs/tr/migration_from_react-i18next_to_intlayer.md +1 -1
  365. package/docs/tr/migration_from_vue-i18n_to_intlayer.md +1 -1
  366. package/docs/tr/plugins/sync-json.md +222 -50
  367. package/docs/tr/releases/v8.md +187 -1
  368. package/docs/tr/releases/v9.md +232 -0
  369. package/docs/uk/cli/doc-review.md +110 -4
  370. package/docs/uk/cli/index.md +1 -1
  371. package/docs/uk/cli/scan.md +1 -1
  372. package/docs/uk/configuration.md +35 -2
  373. package/docs/uk/dictionary/condition.md +167 -5
  374. package/docs/uk/dictionary/enumeration.md +540 -6
  375. package/docs/uk/dictionary/file.md +318 -2
  376. package/docs/uk/dictionary/gender.md +381 -8
  377. package/docs/uk/dictionary/nesting.md +173 -65
  378. package/docs/uk/dictionary/plurial.md +174 -5
  379. package/docs/uk/dictionary/translation.md +156 -2
  380. package/docs/uk/dynamic_dictionaries/collections.md +1 -1
  381. package/docs/uk/dynamic_dictionaries/dynamic_content.md +1 -1
  382. package/docs/uk/dynamic_dictionaries/index.md +1 -1
  383. package/docs/uk/dynamic_dictionaries/variants.md +1 -1
  384. package/docs/uk/plugins/sync-json.md +56 -2
  385. package/docs/uk/releases/v8.md +191 -3
  386. package/docs/uk/releases/v9.md +232 -0
  387. package/docs/ur/cli/index.md +1 -1
  388. package/docs/ur/cli/scan.md +1 -1
  389. package/docs/ur/configuration.md +36 -3
  390. package/docs/vi/cli/doc-review.md +110 -4
  391. package/docs/vi/cli/index.md +1 -1
  392. package/docs/vi/cli/scan.md +1 -1
  393. package/docs/vi/configuration.md +50 -17
  394. package/docs/vi/dictionary/condition.md +167 -5
  395. package/docs/vi/dictionary/enumeration.md +591 -14
  396. package/docs/vi/dictionary/file.md +318 -2
  397. package/docs/vi/dictionary/gender.md +168 -7
  398. package/docs/vi/dictionary/nesting.md +357 -86
  399. package/docs/vi/dictionary/plurial.md +174 -5
  400. package/docs/vi/dictionary/translation.md +156 -2
  401. package/docs/vi/dynamic_dictionaries/collections.md +1 -1
  402. package/docs/vi/dynamic_dictionaries/dynamic_content.md +1 -1
  403. package/docs/vi/dynamic_dictionaries/index.md +1 -1
  404. package/docs/vi/dynamic_dictionaries/variants.md +1 -1
  405. package/docs/vi/plugins/sync-json.md +230 -57
  406. package/docs/vi/releases/v8.md +190 -1
  407. package/docs/vi/releases/v9.md +232 -0
  408. package/docs/zh/cli/doc-review.md +110 -4
  409. package/docs/zh/cli/index.md +1 -1
  410. package/docs/zh/cli/scan.md +1 -1
  411. package/docs/zh/configuration.md +49 -16
  412. package/docs/zh/dictionary/condition.md +167 -5
  413. package/docs/zh/dictionary/enumeration.md +540 -6
  414. package/docs/zh/dictionary/file.md +151 -1
  415. package/docs/zh/dictionary/gender.md +168 -7
  416. package/docs/zh/dictionary/nesting.md +173 -65
  417. package/docs/zh/dictionary/plurial.md +174 -5
  418. package/docs/zh/dictionary/translation.md +169 -8
  419. package/docs/zh/dynamic_dictionaries/collections.md +1 -1
  420. package/docs/zh/dynamic_dictionaries/dynamic_content.md +1 -1
  421. package/docs/zh/dynamic_dictionaries/index.md +1 -1
  422. package/docs/zh/dynamic_dictionaries/variants.md +1 -1
  423. package/docs/zh/intlayer_with_vite+react.md +48 -288
  424. package/docs/zh/plugins/sync-json.md +223 -50
  425. package/docs/zh/releases/v8.md +1 -1
  426. package/docs/zh/releases/v9.md +220 -0
  427. package/package.json +7 -7
  428. package/src/generated/docs.entry.ts +320 -0
  429. package/dist/esm/_virtual/_rolldown/runtime.mjs +0 -8
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-03-13
3
- updatedAt: 2025-12-13
3
+ updatedAt: 2026-06-21
4
4
  title: Sync JSON 플러그인
5
5
  description: Intlayer 사전을 서드파티 i18n JSON 파일(i18next, next-intl, react-intl, vue-i18n 등)과 동기화합니다. 기존 i18n을 유지하면서 Intlayer를 사용하여 메시지를 관리, 번역 및 테스트할 수 있습니다.
6
6
  keywords:
@@ -24,6 +24,9 @@ slugs:
24
24
  - sync-json
25
25
  youtubeVideo: https://www.youtube.com/watch?v=MpGMxniDHNg
26
26
  history:
27
+ - version: 9.0.0
28
+ date: 2026-06-21
29
+ changes: "splitKeys 옵션 추가 (next-intl / react-intl 단일 파일 레이아웃을 위한 최상위 네임스페이스 키당 하나의 사전)"
27
30
  - version: 7.5.0
28
31
  date: 2025-12-13
29
32
  changes: "ICU 및 i18next 형식 지원 추가"
@@ -62,7 +65,63 @@ pnpm add -D @intlayer/sync-json-plugin
62
65
  npm i -D @intlayer/sync-json-plugin
63
66
  ```
64
67
 
65
- ## 빠른 시작
68
+ ## Plugins
69
+
70
+ 이 패키지는 두 가지 플러그인을 제공합니다:
71
+
72
+ - `loadJSON`: JSON 파일을 Intlayer 사전으로 로드합니다.
73
+ - 이 플러그인은 소스에서 JSON 파일을 로드하고 Intlayer 사전으로 로드하는 데 사용됩니다. 모든 코드베이스를 스캔하고 특정 JSON 파일을 검색할 수 있습니다.
74
+ 이 플러그인은 다음 경우에 사용할 수 있습니다.
75
+ - JSON 파일이 로드될 특정 위치를 강제하는 i18n 라이브러리(예: `next-intl`, `i18next`, `react-intl`, `vue-i18n` 등)를 사용하지만, 코드베이스의 원하는 위치에 콘텐츠 선언을 배치하려는 경우.
76
+ - 원격 소스(예: CMS, API 등)에서 메시지를 가져와 JSON 파일에 저장하려는 경우에도 사용할 수 있습니다.
77
+
78
+ > 내부적으로 이 플러그인은 모든 코드베이스를 스캔하고 특정 JSON 파일을 검색하여 Intlayer 사전으로 로드합니다.
79
+ > 이 플러그인은 출력 및 번역을 JSON 파일에 다시 쓰지 않습니다.
80
+
81
+ - `syncJSON`: JSON 파일을 Intlayer 사전과 동기화합니다.
82
+ - 이 플러그인은 JSON 파일을 Intlayer 사전과 동기화하는 데 사용됩니다. 지정된 위치를 스캔하고 특정 JSON 파일의 패턴과 일치하는 JSON을 로드할 수 있습니다. 이 플러그인은 다른 i18n 라이브러리를 사용하면서 Intlayer의 이점을 얻으려는 경우에 유용합니다.
83
+
84
+ ## Using both plugins
85
+
86
+ ```ts fileName="intlayer.config.ts"
87
+ import { Locales, type IntlayerConfig } from "intlayer";
88
+ import { loadJSON, syncJSON } from "@intlayer/sync-json-plugin";
89
+
90
+ const config: IntlayerConfig = {
91
+ internationalization: {
92
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
93
+ defaultLocale: Locales.ENGLISH,
94
+ },
95
+
96
+ // 현재 JSON 파일을 Intlayer 사전과 동기화 상태로 유지
97
+ plugins: [
98
+ /**
99
+ * src에서 {key}.i18n.json 패턴과 일치하는 모든 JSON 파일을 로드합니다.
100
+ */
101
+ loadJSON({
102
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
103
+ locale: Locales.ENGLISH,
104
+ priority: 1, // 이 JSON 파일이 `./locales/en/${key}.json`의 파일보다 우선하도록 보장합니다.
105
+ format: "intlayer", // JSON 콘텐츠의 형식
106
+ }),
107
+ /**
108
+ * 출력 및 번역을 로케일 디렉토리의 JSON 파일로 로드하고 다시 씁니다.
109
+ */
110
+ syncJSON({
111
+ format: "i18next",
112
+ source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
113
+ priority: 0,
114
+ format: "i18next",
115
+ }),
116
+ ],
117
+ };
118
+
119
+ export default config;
120
+ ```
121
+
122
+ ## `syncJSON` plugin
123
+
124
+ ### Quick start
66
125
 
67
126
  플러그인을 `intlayer.config.ts`에 추가하고 기존 JSON 구조를 가리키도록 설정하세요.
68
127
 
@@ -81,6 +140,7 @@ const config: IntlayerConfig = {
81
140
  syncJSON({
82
141
  // 로케일별, 네임스페이스별 레이아웃 (예: next-intl, 네임스페이스가 있는 i18next)
83
142
  source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
143
+ format: "icu",
84
144
  }),
85
145
  ],
86
146
  };
@@ -91,14 +151,27 @@ export default config;
91
151
  대안: 로케일별 단일 파일 (i18next/react-intl 설정에서 일반적임):
92
152
 
93
153
  ```ts fileName="intlayer.config.ts"
94
- plugins: [
95
- syncJSON({
96
- source: ({ locale }) => `./locales/${locale}.json`,
97
- }),
98
- ];
154
+ import { Locales, type IntlayerConfig } from "intlayer";
155
+ import { syncJSON } from "@intlayer/sync-json-plugin";
156
+
157
+ const config: IntlayerConfig = {
158
+ internationalization: {
159
+ locales: [Locales.ENGLISH, Locales.FRENCH],
160
+ defaultLocale: Locales.ENGLISH,
161
+ },
162
+ plugins: [
163
+ syncJSON({
164
+ format: "i18next",
165
+ source: ({ locale }) => `./locales/${locale}.json`,
166
+ format: "i18next",
167
+ }),
168
+ ],
169
+ };
170
+
171
+ export default config;
99
172
  ```
100
173
 
101
- ### 작동 방식
174
+ #### 작동 방식
102
175
 
103
176
  - 읽기: 플러그인은 `source` 빌더에서 JSON 파일을 찾아 Intlayer 사전으로 로드합니다.
104
177
  - 쓰기: 빌드 및 채우기 후, 로컬라이즈된 JSON을 동일한 경로에 다시 씁니다 (포맷 문제를 방지하기 위해 마지막에 개행 포함).
@@ -112,6 +185,7 @@ syncJSON({
112
185
  location?: string, // 선택적 레이블, 기본값: "plugin"
113
186
  priority?: number, // 충돌 해결을 위한 선택적 우선순위, 기본값: 0
114
187
  format?: 'intlayer' | 'icu' | 'i18next', // 선택적 포맷터, Intlayer 런타임 호환성에 사용
188
+ splitKeys?: boolean, // 선택 사항, 단일 파일을 최상위 키당 하나의 사전으로 분할 (자동 감지)
115
189
  });
116
190
  ```
117
191
 
@@ -136,11 +210,43 @@ syncJSON({
136
210
  }),
137
211
  ```
138
212
 
139
- ## 여러 JSON 소스 및 우선순위
213
+ #### `splitKeys` (boolean)
214
+
215
+ **최상위 키가 네임스페이스인** 단일 JSON 파일이 전체 파일을 담는 단일 사전 대신 최상위 키당 하나의 사전이 되어야 하는지 여부를 제어합니다.
216
+
217
+ 이는 `next-intl` 및 `react-intl`과 같은 라이브러리의 네임스페이스 모델과 일치합니다. 이 모델에서는 하나의 `messages/{locale}.json` 파일이 최상위 키별로 여러 네임스페이스를 그룹화하며, 각 네임스페이스는 독립적으로 처리됩니다 (예: `useTranslations('Hero')`는 `Hero` 사전을 해결합니다).
218
+
219
+ - `undefined` (기본값): **자동 감지** — `source` 패턴에 `{key}` 세그먼트가 없는 경우 (하나의 파일이 모든 네임스페이스를 포함) 파일이 분할되고, 그렇지 않은 경우 (키당 하나의 파일) 단일 사전으로 유지됩니다.
220
+ - `true`: 항상 각 최상위 키를 자체 사전으로 분할합니다.
221
+ - `false`: 분할하지 않습니다; 전체 파일이 단일 사전이 됩니다.
222
+
223
+ 단일 `messages/{locale}.json` 파일이 주어졌을 때:
224
+
225
+ ```json fileName="messages/en.json"
226
+ {
227
+ "Hero": { "title": "Full-stack developer" },
228
+ "Nav": { "work": "Work", "about": "About" },
229
+ "About": { "lead": "I build apps end to end." }
230
+ }
231
+ ```
232
+
233
+ ```ts fileName="intlayer.config.ts"
234
+ syncJSON({
235
+ format: "icu",
236
+ source: ({ locale }) => `./messages/${locale}.json`,
237
+ // splitKeys: true, // 패턴에 `{key}` 세그먼트가 없으므로 암시적으로 활성화됨
238
+ }),
239
+ ```
240
+
241
+ 이는 `Hero`, `Nav`, `About` 세 개의 사전을 생성하므로 `useTranslations('Hero')` (next-intl)가 올바르게 해결됩니다. 다시 쓸 때, 모든 네임스페이스는 동일한 로케일별 파일로 재조립됩니다.
242
+
243
+ > `source`에 명시적인 `{key}` 세그먼트를 유지하는 경우 (예: `./locales/${locale}/${key}.json`), 각 파일은 이미 하나의 네임스페이스이므로 분할은 기본적으로 비활성화됩니다.
244
+
245
+ ### Multiple JSON sources and priority
140
246
 
141
247
  여러 `syncJSON` 플러그인을 추가하여 서로 다른 JSON 소스를 동기화할 수 있습니다. 이는 프로젝트에 여러 i18n 라이브러리나 다양한 JSON 구조가 있을 때 유용합니다.
142
248
 
143
- ### 우선순위 시스템
249
+ #### Priority system
144
250
 
145
251
  여러 플러그인이 동일한 사전 키를 대상으로 할 때, `priority` 매개변수가 어떤 플러그인이 우선하는지 결정합니다:
146
252
 
@@ -189,73 +295,140 @@ const config: IntlayerConfig = {
189
295
  export default config;
190
296
  ```
191
297
 
192
- ### 충돌 해결
298
+ ## Load JSON plugin
193
299
 
194
- 동일한 번역 키가 여러 JSON 소스에 존재할 때:
300
+ ### Quick start
195
301
 
196
- 1. 가장 높은 우선순위를 가진 플러그인이 최종 값을 결정합니다.
197
- 2. 낮은 우선순위 소스는 누락된 키에 대한 대체로 사용됩니다.
198
- 3. 이를 통해 점진적으로 새로운 구조로 이전하면서도 레거시 번역을 유지할 수 있습니다.
302
+ `intlayer.config.ts`에 플러그인을 추가하여 기존 JSON 파일을 Intlayer 사전으로 가져옵니다. 이 플러그인은 읽기 전용입니다 (디스크에 쓰지 않음):
199
303
 
200
- ## 통합
304
+ ```ts fileName="intlayer.config.ts"
305
+ import { Locales, type IntlayerConfig } from "intlayer";
306
+ import { loadJSON } from "@intlayer/sync-json-plugin";
201
307
 
202
- 아래는 일반적인 매핑 예시입니다. 런타임은 변경하지 말고 플러그인만 추가하세요.
308
+ const config: IntlayerConfig = {
309
+ internationalization: {
310
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
311
+ defaultLocale: Locales.ENGLISH,
312
+ },
313
+
314
+ plugins: [
315
+ // 소스 트리의 어느 곳에나 있는 JSON 메시지를 가져옵니다.
316
+ loadJSON({
317
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
318
+ // 플러그인 인스턴스당 단일 로케일을 로드합니다 (구성의 defaultLocale로 기본 설정됨).
319
+ locale: Locales.ENGLISH,
320
+ priority: 0,
321
+ }),
322
+ ],
323
+ };
203
324
 
204
- ### i18next
325
+ export default config;
326
+ ```
205
327
 
206
- 일반적인 파일 구조: `./public/locales/{locale}/{namespace}.json` 또는 `./locales/{locale}/{namespace}.json`.
328
+ 대안: 로케일별 레이아웃, 여전히 읽기 전용 (선택된 로케일만 로드됨):
207
329
 
208
330
  ```ts fileName="intlayer.config.ts"
209
- import { syncJSON } from "@intlayer/sync-json-plugin";
331
+ import { Locales, type IntlayerConfig } from "intlayer";
332
+ import { loadJSON } from "@intlayer/sync-json-plugin";
210
333
 
211
- export default {
334
+ const config: IntlayerConfig = {
335
+ internationalization: {
336
+ locales: [Locales.ENGLISH, Locales.FRENCH],
337
+ defaultLocale: Locales.ENGLISH,
338
+ },
212
339
  plugins: [
213
- syncJSON({
214
- format: "i18next",
340
+ loadJSON({
341
+ // 이 패턴에서 Locales.FRENCH에 대한 파일만 로드됩니다.
215
342
  source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
343
+ locale: Locales.FRENCH,
216
344
  }),
217
345
  ],
218
346
  };
347
+
348
+ export default config;
219
349
  ```
220
350
 
221
- ### next-intl
351
+ ### How it works
222
352
 
223
- 로케일별 JSON 메시지(보통 `./messages/{locale}.json`) 또는 네임스페이스별.
353
+ - 발견: `source` 빌더에서 glob을 구축하고 일치하는 JSON 파일을 수집합니다.
354
+ - 가져오기: 각 JSON 파일을 제공된 `locale`로 Intlayer 사전으로 로드합니다.
355
+ - 읽기 전용: 출력 파일을 쓰거나 포맷하지 않습니다. 왕복 동기화가 필요한 경우 `syncJSON`을 사용하세요.
356
+ - 자동 채우기 준비: `fill` 패턴을 정의하여 `intlayer content fill`이 누락된 키를 채울 수 있도록 합니다.
224
357
 
225
- ```ts fileName="intlayer.config.ts"
226
- plugins: [
227
- syncJSON({
228
- source: ({ locale, key }) => `./messages/${locale}/${key}.json`,
229
- }),
230
- ];
358
+ ### API
359
+
360
+ ```ts
361
+ loadJSON({
362
+ // JSON 파일 경로를 빌드합니다. 구조에 로케일 세그먼트가 없는 경우 `locale`은 선택 사항입니다.
363
+ source: ({ key, locale }) => string,
364
+
365
+ // 이 플러그인 인스턴스에 의해 로드된 사전에 대한 대상 로케일
366
+ // configuration.internationalization.defaultLocale로 기본 설정됩니다.
367
+ locale?: Locale,
368
+
369
+ // 소스를 식별하는 선택적 레이블
370
+ location?: string, // default: "plugin"
371
+
372
+ // 다른 소스와의 충돌 해결에 사용되는 우선순위
373
+ priority?: number, // default: 0
374
+
375
+ // JSON 콘텐츠에 대한 선택적 포맷터
376
+ format?: 'intlayer' | 'icu' | 'i18next', // default: 'intlayer'
377
+
378
+ // 단일 파일을 최상위 키당 하나의 사전으로 분할 (자동 감지)
379
+ splitKeys?: boolean,
380
+ });
231
381
  ```
232
382
 
233
- 참고: `docs/ko/intlayer_with_next-intl.md`.
383
+ #### `format` ('intlayer' | 'icu' | 'i18next')
234
384
 
235
- ### react-intl
385
+ JSON 파일을 로드할 때 사전 콘텐츠에 사용할 포맷터를 지정합니다. 이를 통해 다양한 i18n 라이브러리와 호환되는 다양한 메시지 포맷팅 구문을 사용할 수 있습니다.
236
386
 
237
- 로케일별 단일 JSON이 일반적입니다:
387
+ - `'intlayer'`: 기본 Intlayer 포맷터 (기본값).
388
+ - `'icu'`: ICU 메시지 포맷팅을 사용합니다 (react-intl, vue-i18n과 같은 라이브러리와 호환).
389
+ - `'i18next'`: i18next 메시지 포맷팅을 사용합니다 (i18next, next-i18next, Solid-i18next와 호환).
238
390
 
239
- ```ts fileName="intlayer.config.ts"
240
- plugins: [
241
- syncJSON({
242
- source: ({ locale }) => `./locales/${locale}.json`,
243
- }),
244
- ];
391
+ **예시:**
392
+
393
+ ```ts
394
+ loadJSON({
395
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
396
+ locale: Locales.ENGLISH,
397
+ format: "icu", // 호환성을 위해 ICU 포맷팅 사용
398
+ }),
245
399
  ```
246
400
 
247
- ### vue-i18n
401
+ #### `splitKeys` (boolean)
248
402
 
249
- 로케일별 단일 파일 또는 네임스페이스별 파일 하나를 사용합니다:
403
+ [`syncJSON`](#splitkeys-boolean)과 동일한 동작: 단일 JSON 파일이 최상위 키별로 여러 네임스페이스를 그룹화할 때, 각 최상위 키는 자체 사전이 됩니다.
250
404
 
251
- ```ts fileName="intlayer.config.ts"
252
- plugins: [
253
- syncJSON({
254
- source: ({ key, locale }) => `./src/locales/${locale}/${key}.json`,
255
- }),
256
- ];
405
+ - `undefined` (기본값): **자동 감지** — `source` 패턴에 `{key}` 세그먼트가 없는 경우 분할되고, 그렇지 않은 경우 단일 사전이 됩니다.
406
+ - `true` / `false`: 분할을 강제하거나 비활성화합니다.
407
+
408
+ ```ts
409
+ loadJSON({
410
+ source: ({ locale }) => `./messages/${locale}.json`,
411
+ format: "icu",
412
+ // splitKeys 자동 활성화: `Hero`, `Nav`, `About`, … 각각 사전이 됩니다.
413
+ }),
257
414
  ```
258
415
 
416
+ ### Behavior and conventions
417
+
418
+ - `source` 마스크에 로케일 플레이스홀더가 포함된 경우, 선택된 `locale`에 대한 파일만 가져옵니다.
419
+ - 마스크에 `{key}` 세그먼트가 없는 경우, 파일의 각 최상위 키는 기본적으로 자체 사전이 됩니다 ([`splitKeys`](#splitkeys-boolean) 참조). 대신 전체 파일을 단일 `index` 사전으로 로드하려면 `splitKeys: false`로 설정하세요.
420
+ - 키는 `source` 빌더의 `{key}` 플레이스홀더를 대체하여 파일 경로에서 파생됩니다.
421
+ - 플러그인은 발견된 파일만 사용하며 누락된 로케일이나 키를 생성하지 않습니다.
422
+ - `fill` 경로는 `source`에서 추론되며, 선택 시 CLI를 통해 누락된 값을 업데이트하는 데 사용됩니다.
423
+
424
+ ## Conflict resolution
425
+
426
+ 동일한 번역 키가 여러 JSON 소스에 존재할 때:
427
+
428
+ 1. 가장 높은 우선순위를 가진 플러그인이 최종 값을 결정합니다.
429
+ 2. 낮은 우선순위 소스는 누락된 키에 대한 대체로 사용됩니다.
430
+ 3. 이를 통해 점진적으로 새로운 구조로 이전하면서도 레거시 번역을 유지할 수 있습니다.
431
+
259
432
  ## CLI
260
433
 
261
434
  동기화된 JSON 파일은 다른 `.content` 파일로 간주됩니다. 즉, 모든 intlayer 명령어가 동기화된 JSON 파일에 대해 사용 가능합니다. 포함되는 명령어는 다음과 같습니다:
@@ -268,13 +441,13 @@ plugins: [
268
441
 
269
442
  자세한 내용은 [Intlayer CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/cli/index.md)를 참조하세요.
270
443
 
271
- ## 제한 사항 (현재)
444
+ ## Limitations (current)
272
445
 
273
446
  - 타사 라이브러리를 대상으로 할 때 삽입 또는 복수형/ICU 지원이 없습니다.
274
447
  - 비-Intlayer 런타임에 대한 시각적 편집기는 아직 제공되지 않습니다.
275
448
  - JSON 동기화만 지원하며, 비-JSON 카탈로그 형식은 지원되지 않습니다.
276
449
 
277
- ## 점이 중요한 이유
450
+ ## Why this matters
278
451
 
279
452
  - 검증된 i18n 솔루션을 추천하고 Intlayer를 애드온으로 위치시킬 수 있습니다.
280
453
  - 튜토리얼에서 Intlayer를 사용하여 JSON을 관리하도록 제안함으로써 SEO/키워드를 활용할 수 있습니다.
@@ -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 - 무엇이 새로워졌나요?
5
5
  description: Intlayer v8의 신규 기능을 확인하세요. 이번 릴리스는 developer experience 향상, schema validation을 통한 데이터 무결성 보장, 그리고 dictionary management에 대한 제어 강화에 중점을 둡니다.
6
6
  keywords:
@@ -409,6 +409,16 @@ v7에서는 Provider가 정의되지 않은 경우 Markdown 노드가 원시 문
409
409
 
410
410
  ---
411
411
 
412
+ ## YAML 및 Markdown 콘텐츠 파일 (v8.10.0)
413
+
414
+ 이제 `.content.md` 및 `.content.yaml` 파일 확장자를 사용하여 콘텐츠를 직접 선언할 수 있습니다. 이는 긴 형식의 콘텐츠, 블로그, 문서 및 개인정보 처리방침에 적합합니다.
415
+
416
+ 이 파일들은 Visual Editor에서 완전히 편집할 수 있어, 비기술 팀원들에게 간소화된 워크플로우를 제공합니다.
417
+
418
+ 자세한 내용은 [YAML 콘텐츠 파일 문서](https://intlayer.org/doc/concept/content#yaml-content-file) 및 [Markdown 콘텐츠 파일 문서](https://intlayer.org/doc/concept/content/markdown)를 참조하세요.
419
+
420
+ ---
421
+
412
422
  ## 사용자 정의 URL 재작성
413
423
 
414
424
  Intlayer v8은 **사용자 정의 URL 재작성(Custom URL Rewrites)** 을 도입하여 표준 `/locale/path` 구조와 다른 로케일별 경로를 정의할 수 있게 합니다. 이는 로컬 SEO를 개선하고 영어가 아닌 사용자에게 보다 자연스러운 사용자 경험을 제공하는 강력한 기능입니다.
@@ -753,6 +763,63 @@ export default {
753
763
  </Tab>
754
764
  </Tabs>
755
765
 
766
+ ---
767
+
768
+ ## Unicode CLDR 복수형 규칙 (v8.8.0)
769
+
770
+ Unicode CLDR 프로젝트에서 정의한 복수형 규칙을 기반으로 하는 새로운 `plural` 노드 헬퍼가 도입되어 복잡한 언어에 대한 지원이 향상되었습니다.
771
+
772
+ ```typescript fileName="src/openings.content.ts"
773
+ import { plural, t, type Dictionary } from "intlayer";
774
+
775
+ const openingsContent = {
776
+ key: "total_openings",
777
+ content: {
778
+ totalOpenings: t({
779
+ ko: plural({
780
+ other: "{{count}}개의 채용 공고",
781
+ }),
782
+ en: plural({
783
+ one: "{{count}} opening",
784
+ other: "{{count}} openings",
785
+ }),
786
+ fr: plural({
787
+ one: "{{count}} offre",
788
+ other: "{{count}} offres",
789
+ }),
790
+ }),
791
+ },
792
+ } satisfies Dictionary;
793
+
794
+ export default openingsContent;
795
+ ```
796
+
797
+ 이후 프레임워크 컴포넌트에서 동적으로 count를 전달할 수 있습니다:
798
+
799
+ ```tsx
800
+ import type { FC } from "react";
801
+ import { useIntlayer } from "react-intlayer";
802
+
803
+ const OpeningsComponent: FC<{ count: number }> = ({ count }) => {
804
+ const { totalOpenings } = useIntlayer("total_openings");
805
+
806
+ return (
807
+ <div>
808
+ {/* 영어 기준: */}
809
+ {/* count=0 → "0 openings" (other) */}
810
+ {/* count=1 → "1 opening" (one) */}
811
+ {/* count=2 → "2 openings" (other) */}
812
+ {/* count=21 → "21 openings" (other) */}
813
+ <p>{totalOpenings(count)}</p>
814
+ </div>
815
+ );
816
+ };
817
+ ```
818
+
819
+ 자세한 내용은 [복수형 문서](https://intlayer.org/doc/concept/content/plural)를 참조하세요.
820
+
821
+ ---
822
+
756
823
  ## 콘텐츠 스키마 검증
757
824
 
758
825
  Intlayer v8에서는 딕셔너리에 대한 스키마 검증을 도입합니다. 이제 Zod를 사용해 구성 파일에 재사용 가능한 검증 스키마를 정의하고 이를 콘텐츠 파일에 적용할 수 있습니다. 이를 통해 콘텐츠가 항상 예상된 구조를 따르도록 보장하여 빌드 시점에 오류를 포착할 수 있습니다.
@@ -797,6 +864,34 @@ export default aboutPageMetaContent;
797
864
 
798
865
  ---
799
866
 
867
+ ## TypeScript: IntlayerNode 기본형 접근자 (Primitive Accessors)
868
+
869
+ `IntlayerNode` 타입이 업데이트되어 콘텐츠 노드에서 직접 JavaScript 기본형(primitive) 메서드를 호출할 수 있게 되었습니다. 이를 통해 지역화된 콘텐츠를 표준 string, number, boolean 또는 array 기본형인 것처럼 직접 상호작용할 수 있습니다.
870
+
871
+ React, Preact, Solid, Svelte, Vue 및 Angular에서 지원됩니다.
872
+
873
+ ### String 예제
874
+
875
+ ```typescript
876
+ content.placeholder; // IntlayerNode<string> 반환
877
+ content.placeholder.value; // string 반환
878
+ content.placeholder.toString(); // string 반환
879
+ content.placeholder.toLowerCase(); // string 반환
880
+ String(content.placeholder); // string 반환
881
+ content.placeholder.toUpperCase(); // 대문자로 변환된 string 반환
882
+ content.placeholder.replace("a", "b"); // 수정된 string 반환
883
+ ```
884
+
885
+ ### Array 예제
886
+
887
+ ```typescript
888
+ content.myArrayOfString // IntlayerNode<Array<string>> 반환
889
+ content.myArrayOfString.find(...) // 요소 반환
890
+ content.myArrayOfString.join(', ') // 결합된 string 반환
891
+ ```
892
+
893
+ ---
894
+
800
895
  ### 향상된 자동 콘텐츠 감지
801
896
 
802
897
  v8에서 Intlayer는 콘텐츠 문자열에서 Markdown 문법, HTML 태그 및 변수 삽입을 지능적으로 감지합니다. 이는 `md()`, `html()`, 또는 `insert()`와 같은 헬퍼 함수를 종종 생략할 수 있음을 의미합니다.
@@ -1002,6 +1097,17 @@ Intlayer VSCode 확장 기능은 v8에서 국제화 워크플로우를 간소화
1002
1097
 
1003
1098
  ---
1004
1099
 
1100
+ ## 도구: C++ Watcher 및 OXC 기반 LSP (v8.12.0)
1101
+
1102
+ Intlayer v8.12.0은 developer experience에 큰 개선을 가져왔습니다:
1103
+
1104
+ - **Parcel Watcher**: 콘텐츠 감시자(watcher)가 `chokidar`에서 `@parcel/watcher`로 마이그레이션되어, 네이티브 C++ 파일 감시를 활용해 더 빠른 업데이트와 현저히 낮은 메모리 소비를 제공합니다.
1105
+ - **새로운 언어 서버 프로토콜 (LSP)**: 완전히 새로운 LSP를 이제 사용할 수 있습니다. OXC 기반 파싱으로 구축되어, IDE 및 AI 에이전트가 `useIntlayer('my-key')` 호출을 해당하는 `.content` 파일과 원활하게 연결할 수 있도록 돕습니다.
1106
+
1107
+ 자세한 내용은 [LSP 문서](https://intlayer.org/doc/lsp)를 참조하세요.
1108
+
1109
+ ---
1110
+
1005
1111
  ## 컴파일러 최적화
1006
1112
 
1007
1113
  Intlayer v8에는 Markdown 및 HTML 컴파일러를 위한 새로운 캐싱 레이어가 포함되어 있습니다. 이는 동일한 설정을 가진 동일한 콘텐츠 문자열을 한 번만 파싱하도록 하여, 재렌더링 시나 동일한 콘텐츠를 여러 곳에서 사용할 때 발생하는 오버헤드를 크게 줄여줍니다.
@@ -1057,6 +1163,48 @@ Intlayer v8에는 Markdown 및 HTML 컴파일러를 위한 새로운 캐싱 레
1057
1163
 
1058
1164
  ---
1059
1165
 
1166
+ ## 실험적 빌드 최적화: Minify 및 Purge (v8.7.0)
1167
+
1168
+ Intlayer v8.7.0은 프로덕션 번들을 최적화하기 위해 설계된 새로운 실험적 빌드 기능을 `intlayer.config.ts`에 도입합니다:
1169
+
1170
+ - **딕셔너리 경량화 (Minification)**: 크기를 줄이기 위해 딕셔너리 파일을 압축합니다.
1171
+ - **사용되지 않는 키 제거 (Unused Key Purging)**: 딕셔너리에서 사용되지 않는 번역 키를 스캔하여 제거하고, 활성 키의 이름을 짧은 문자(예: `"products" -> "a"`, `"pricing" -> "b"`)로 변경합니다. 이를 통해 번들 크기를 최대 5%까지 줄일 수 있습니다.
1172
+ - **TypeScript 검사 비활성화**: 컴파일 단계에서 TypeScript 타입 검사를 비활성화하여 빌드 속도를 높입니다.
1173
+
1174
+ ```typescript fileName="intlayer.config.ts"
1175
+ import { Locales, type IntlayerConfig } from "intlayer";
1176
+
1177
+ const config: IntlayerConfig = {
1178
+ internationalization: {
1179
+ locales: [Locales.ENGLISH, Locales.FRENCH],
1180
+ defaultLocale: Locales.ENGLISH,
1181
+ },
1182
+ dictionary: {
1183
+ importMode: "dynamic",
1184
+ },
1185
+ build: {
1186
+ /**
1187
+ * 번들 크기를 줄이기 위해 딕셔너리를 경량화(minify)합니다.
1188
+ */
1189
+ minify: true,
1190
+
1191
+ /**
1192
+ * 딕셔너리에서 사용되지 않는 키를 제거(purge)합니다.
1193
+ */
1194
+ purge: true,
1195
+
1196
+ /**
1197
+ * 빌드 시 TypeScript 타입을 확인할지 여부를 나타냅니다.
1198
+ */
1199
+ checkTypes: false,
1200
+ },
1201
+ };
1202
+
1203
+ export default config;
1204
+ ```
1205
+
1206
+ ---
1207
+
1060
1208
  ## 유연성: 통합된 Import 모드
1061
1209
 
1062
1210
  `live` boolean 속성은 더 포괄적인 `importMode` 속성으로 대체(deprecated)되었습니다. 이를 통해 딕셔너리를 정적(static), 동적(dynamic), 또는 라이브 동기화 방식으로 어떻게 로드할지 명시적으로 정의할 수 있습니다.
@@ -1204,6 +1352,49 @@ Svelte에서의 Markdown 및 HTML 콘텐츠는 이제 문자열화될 때 자동
1204
1352
 
1205
1353
  ---
1206
1354
 
1355
+ ## Angular 지원: Vite 번들러 (v8.11.0)
1356
+
1357
+ Angular 사용자를 위해, Intlayer는 이제 새로운 커스텀 esbuild 플러그인을 통해 Vite 번들러를 기본적으로 지원하여 개발 및 빌드 시간을 단축합니다.
1358
+
1359
+ 구성에 대한 자세한 내용은 [Angular 환경 문서](https://intlayer.org/doc/environment/angular)를 참조하세요.
1360
+
1361
+ ---
1362
+
1363
+ ## 사이트맵 생성 (v8.6.0)
1364
+
1365
+ Intlayer는 이제 로케일 및 라우팅 모드를 기반으로 사이트맵을 자동으로 생성합니다. 이는 TanStack Router와 같은 라우터 아키텍처에서 SEO 최적화에 특히 유용합니다:
1366
+
1367
+ ```typescript fileName="src/routes/sitemap.xml.ts"
1368
+ import { createFileRoute } from "@tanstack/react-router";
1369
+ import { generateSitemap } from "intlayer";
1370
+
1371
+ const SITE_URL = (
1372
+ import.meta.env.VITE_SITE_URL ?? "http://localhost:3000"
1373
+ ).replace(/\/$/, "");
1374
+
1375
+ export const Route = createFileRoute("/sitemap.xml")({
1376
+ server: {
1377
+ handlers: {
1378
+ GET: async () => {
1379
+ const sitemap = generateSitemap(
1380
+ [
1381
+ { path: "/", changefreq: "daily", priority: 1.0 },
1382
+ { path: "/about", changefreq: "monthly", priority: 0.8 },
1383
+ ],
1384
+ { siteUrl: SITE_URL }
1385
+ );
1386
+
1387
+ return new Response(sitemap, {
1388
+ headers: { "Content-Type": "application/xml" },
1389
+ });
1390
+ },
1391
+ },
1392
+ },
1393
+ });
1394
+ ```
1395
+
1396
+ ---
1397
+
1207
1398
  ## v7에서의 마이그레이션 노트
1208
1399
 
1209
1400
  ### 구성 변경사항