@polyglot-bundles/vi-word-lists 0.2.10 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/package.json +21 -1
  2. package/src/index.ts +569 -569
  3. package/src/json/a1/a1-colors.json +80 -0
  4. package/src/json/a1/a1-family.json +66 -0
  5. package/src/json/a1/a1-food.json +80 -0
  6. package/src/json/a1/a1-greetings.json +80 -0
  7. package/src/json/a1/a1-numbers.json +80 -0
  8. package/src/json/a1/a1-vocabulary-01.json +411 -411
  9. package/src/json/a1/a1-vocabulary-02.json +411 -411
  10. package/src/json/a1/a1-vocabulary-03.json +411 -411
  11. package/src/json/a1/a1-vocabulary-04.json +419 -419
  12. package/src/json/a2/a2-body-parts.json +150 -0
  13. package/src/json/a2/a2-clothing.json +115 -0
  14. package/src/json/a2/a2-places.json +115 -0
  15. package/src/json/a2/a2-vocabulary-01.json +411 -411
  16. package/src/json/a2/a2-vocabulary-02.json +411 -411
  17. package/src/json/a2/a2-vocabulary-03.json +411 -411
  18. package/src/json/a2/a2-vocabulary-04.json +411 -411
  19. package/src/json/a2/a2-vocabulary-05.json +411 -411
  20. package/src/json/a2/a2-vocabulary-06.json +411 -411
  21. package/src/json/a2/a2-vocabulary-07.json +411 -411
  22. package/src/json/a2/a2-vocabulary-08.json +411 -411
  23. package/src/json/a2/a2-vocabulary-09.json +411 -411
  24. package/src/json/a2/a2-vocabulary-10.json +411 -411
  25. package/src/json/a2/a2-vocabulary-11.json +411 -411
  26. package/src/json/a2/a2-vocabulary-12.json +411 -411
  27. package/src/json/b1/b1-emotions.json +115 -0
  28. package/src/json/b1/b1-professions.json +115 -0
  29. package/src/json/b1/b1-vocabulary-01.json +411 -411
  30. package/src/json/b1/b1-vocabulary-02.json +411 -411
  31. package/src/json/b1/b1-vocabulary-03.json +411 -411
  32. package/src/json/b1/b1-vocabulary-04.json +411 -411
  33. package/src/json/b1/b1-vocabulary-05.json +411 -411
  34. package/src/json/b1/b1-vocabulary-06.json +411 -411
  35. package/src/json/b1/b1-vocabulary-07.json +411 -411
  36. package/src/json/b1/b1-vocabulary-08.json +411 -411
  37. package/src/json/b1/b1-vocabulary-09.json +411 -411
  38. package/src/json/b1/b1-vocabulary-10.json +411 -411
  39. package/src/json/b1/b1-vocabulary-11.json +411 -411
  40. package/src/json/b1/b1-vocabulary-12.json +411 -411
  41. package/src/json/b1/b1-vocabulary-13.json +411 -411
  42. package/src/json/b1/b1-vocabulary-14.json +411 -411
  43. package/src/json/b1/b1-vocabulary-15.json +411 -411
  44. package/src/json/b1/b1-vocabulary-16.json +411 -411
  45. package/src/json/b1/b1-vocabulary-17.json +411 -411
  46. package/src/json/b1/b1-vocabulary-18.json +411 -411
  47. package/src/json/b1/b1-vocabulary-19.json +411 -411
  48. package/src/json/b1/b1-vocabulary-20.json +411 -411
  49. package/src/json/b1/b1-vocabulary-21.json +411 -411
  50. package/src/json/b1/b1-vocabulary-22.json +411 -411
  51. package/src/json/b1/b1-vocabulary-23.json +411 -411
  52. package/src/json/b1/b1-vocabulary-24.json +403 -403
  53. package/src/json/b1/b1-weather.json +115 -0
  54. package/src/json/b2/abstract-concepts.json +48 -18
  55. package/src/json/pre-a1/survival-phrases.json +57 -21
  56. package/src/levels/a2.ts +16 -0
  57. package/src/levels/b1.ts +16 -0
  58. package/src/levels/b2.ts +16 -0
  59. package/src/levels/pre-a1.ts +16 -0
  60. package/src/vocab.ts +28 -0
  61. package/dist/a1-vocabulary-01-DkApdwc5.js +0 -417
  62. package/dist/a1-vocabulary-01-DkApdwc5.js.map +0 -1
  63. package/dist/a1-vocabulary-02-DWFR43qH.js +0 -417
  64. package/dist/a1-vocabulary-02-DWFR43qH.js.map +0 -1
  65. package/dist/a1-vocabulary-03-DRFWCfmP.js +0 -417
  66. package/dist/a1-vocabulary-03-DRFWCfmP.js.map +0 -1
  67. package/dist/a1-vocabulary-04-BG3wU_GD.js +0 -425
  68. package/dist/a1-vocabulary-04-BG3wU_GD.js.map +0 -1
  69. package/dist/a2-vocabulary-01-BvayhMGP.js +0 -417
  70. package/dist/a2-vocabulary-01-BvayhMGP.js.map +0 -1
  71. package/dist/a2-vocabulary-02-BOnrtBmL.js +0 -417
  72. package/dist/a2-vocabulary-02-BOnrtBmL.js.map +0 -1
  73. package/dist/a2-vocabulary-03-6ay88srv.js +0 -417
  74. package/dist/a2-vocabulary-03-6ay88srv.js.map +0 -1
  75. package/dist/a2-vocabulary-04-ukmGr9rc.js +0 -417
  76. package/dist/a2-vocabulary-04-ukmGr9rc.js.map +0 -1
  77. package/dist/a2-vocabulary-05-oAxmpsUQ.js +0 -417
  78. package/dist/a2-vocabulary-05-oAxmpsUQ.js.map +0 -1
  79. package/dist/a2-vocabulary-06-Bfp7zhPf.js +0 -417
  80. package/dist/a2-vocabulary-06-Bfp7zhPf.js.map +0 -1
  81. package/dist/a2-vocabulary-07-D2V3bY78.js +0 -417
  82. package/dist/a2-vocabulary-07-D2V3bY78.js.map +0 -1
  83. package/dist/a2-vocabulary-08-B081QwtI.js +0 -417
  84. package/dist/a2-vocabulary-08-B081QwtI.js.map +0 -1
  85. package/dist/a2-vocabulary-09-D3oZl1x7.js +0 -417
  86. package/dist/a2-vocabulary-09-D3oZl1x7.js.map +0 -1
  87. package/dist/a2-vocabulary-10-GOfTyNQ0.js +0 -417
  88. package/dist/a2-vocabulary-10-GOfTyNQ0.js.map +0 -1
  89. package/dist/a2-vocabulary-11-BSbghXOM.js +0 -417
  90. package/dist/a2-vocabulary-11-BSbghXOM.js.map +0 -1
  91. package/dist/a2-vocabulary-12-CzNCmckp.js +0 -417
  92. package/dist/a2-vocabulary-12-CzNCmckp.js.map +0 -1
  93. package/dist/abstract-concepts-KNlFYB8f.js +0 -90
  94. package/dist/abstract-concepts-KNlFYB8f.js.map +0 -1
  95. package/dist/b1-vocabulary-01-Bm9ZIMBE.js +0 -417
  96. package/dist/b1-vocabulary-01-Bm9ZIMBE.js.map +0 -1
  97. package/dist/b1-vocabulary-02-ClfT72Yp.js +0 -417
  98. package/dist/b1-vocabulary-02-ClfT72Yp.js.map +0 -1
  99. package/dist/b1-vocabulary-03-BInffiGG.js +0 -417
  100. package/dist/b1-vocabulary-03-BInffiGG.js.map +0 -1
  101. package/dist/b1-vocabulary-04-0wG09twP.js +0 -417
  102. package/dist/b1-vocabulary-04-0wG09twP.js.map +0 -1
  103. package/dist/b1-vocabulary-05-MrDkdCbh.js +0 -417
  104. package/dist/b1-vocabulary-05-MrDkdCbh.js.map +0 -1
  105. package/dist/b1-vocabulary-06-uyXDLJa6.js +0 -417
  106. package/dist/b1-vocabulary-06-uyXDLJa6.js.map +0 -1
  107. package/dist/b1-vocabulary-07-0Q9DCwsk.js +0 -417
  108. package/dist/b1-vocabulary-07-0Q9DCwsk.js.map +0 -1
  109. package/dist/b1-vocabulary-08-Cx9Giw8r.js +0 -417
  110. package/dist/b1-vocabulary-08-Cx9Giw8r.js.map +0 -1
  111. package/dist/b1-vocabulary-09-Bdf0_vRF.js +0 -417
  112. package/dist/b1-vocabulary-09-Bdf0_vRF.js.map +0 -1
  113. package/dist/b1-vocabulary-10-DgkE3aUr.js +0 -417
  114. package/dist/b1-vocabulary-10-DgkE3aUr.js.map +0 -1
  115. package/dist/b1-vocabulary-11-BtbOvYEA.js +0 -417
  116. package/dist/b1-vocabulary-11-BtbOvYEA.js.map +0 -1
  117. package/dist/b1-vocabulary-12-DhsAY-fb.js +0 -417
  118. package/dist/b1-vocabulary-12-DhsAY-fb.js.map +0 -1
  119. package/dist/b1-vocabulary-13-DahuIhzT.js +0 -417
  120. package/dist/b1-vocabulary-13-DahuIhzT.js.map +0 -1
  121. package/dist/b1-vocabulary-14-CNtBzVbj.js +0 -417
  122. package/dist/b1-vocabulary-14-CNtBzVbj.js.map +0 -1
  123. package/dist/b1-vocabulary-15-DTkPzQt9.js +0 -417
  124. package/dist/b1-vocabulary-15-DTkPzQt9.js.map +0 -1
  125. package/dist/b1-vocabulary-16-DjWPRN4R.js +0 -417
  126. package/dist/b1-vocabulary-16-DjWPRN4R.js.map +0 -1
  127. package/dist/b1-vocabulary-17-CtEw6s11.js +0 -417
  128. package/dist/b1-vocabulary-17-CtEw6s11.js.map +0 -1
  129. package/dist/b1-vocabulary-18-oHrVWgvy.js +0 -417
  130. package/dist/b1-vocabulary-18-oHrVWgvy.js.map +0 -1
  131. package/dist/b1-vocabulary-19-CJL9dY39.js +0 -417
  132. package/dist/b1-vocabulary-19-CJL9dY39.js.map +0 -1
  133. package/dist/b1-vocabulary-20-CkCK3v5F.js +0 -417
  134. package/dist/b1-vocabulary-20-CkCK3v5F.js.map +0 -1
  135. package/dist/b1-vocabulary-21-DC7mnzou.js +0 -417
  136. package/dist/b1-vocabulary-21-DC7mnzou.js.map +0 -1
  137. package/dist/b1-vocabulary-22-TA2ZbEGq.js +0 -417
  138. package/dist/b1-vocabulary-22-TA2ZbEGq.js.map +0 -1
  139. package/dist/b1-vocabulary-23-GXvUq-lw.js +0 -417
  140. package/dist/b1-vocabulary-23-GXvUq-lw.js.map +0 -1
  141. package/dist/b1-vocabulary-24-DG99cDKl.js +0 -409
  142. package/dist/b1-vocabulary-24-DG99cDKl.js.map +0 -1
  143. package/dist/basic-greetings-D6zZUiZN.js +0 -65
  144. package/dist/basic-greetings-D6zZUiZN.js.map +0 -1
  145. package/dist/body-parts-Cd5RZQ8b.js +0 -115
  146. package/dist/body-parts-Cd5RZQ8b.js.map +0 -1
  147. package/dist/clothing-CAlp3Oh2.js +0 -90
  148. package/dist/clothing-CAlp3Oh2.js.map +0 -1
  149. package/dist/colors-2SRz-V9K.js +0 -65
  150. package/dist/colors-2SRz-V9K.js.map +0 -1
  151. package/dist/emotions-CzjzZipP.js +0 -90
  152. package/dist/emotions-CzjzZipP.js.map +0 -1
  153. package/dist/family-members-DVusKf9y.js +0 -55
  154. package/dist/family-members-DVusKf9y.js.map +0 -1
  155. package/dist/food-basics-fIJkEI5s.js +0 -65
  156. package/dist/food-basics-fIJkEI5s.js.map +0 -1
  157. package/dist/index.d.ts +0 -5
  158. package/dist/index.d.ts.map +0 -1
  159. package/dist/index.js +0 -541
  160. package/dist/index.js.map +0 -1
  161. package/dist/index.test.d.ts +0 -2
  162. package/dist/index.test.d.ts.map +0 -1
  163. package/dist/json/a1/a1-vocabulary-01.json +0 -412
  164. package/dist/json/a1/a1-vocabulary-02.json +0 -412
  165. package/dist/json/a1/a1-vocabulary-03.json +0 -412
  166. package/dist/json/a1/a1-vocabulary-04.json +0 -420
  167. package/dist/json/a1/basic-greetings.json +0 -60
  168. package/dist/json/a1/colors.json +0 -60
  169. package/dist/json/a1/family-members.json +0 -50
  170. package/dist/json/a1/food-basics.json +0 -60
  171. package/dist/json/a1/numbers-1-10.json +0 -60
  172. package/dist/json/a2/a2-vocabulary-01.json +0 -412
  173. package/dist/json/a2/a2-vocabulary-02.json +0 -412
  174. package/dist/json/a2/a2-vocabulary-03.json +0 -412
  175. package/dist/json/a2/a2-vocabulary-04.json +0 -412
  176. package/dist/json/a2/a2-vocabulary-05.json +0 -412
  177. package/dist/json/a2/a2-vocabulary-06.json +0 -412
  178. package/dist/json/a2/a2-vocabulary-07.json +0 -412
  179. package/dist/json/a2/a2-vocabulary-08.json +0 -412
  180. package/dist/json/a2/a2-vocabulary-09.json +0 -412
  181. package/dist/json/a2/a2-vocabulary-10.json +0 -412
  182. package/dist/json/a2/a2-vocabulary-11.json +0 -412
  183. package/dist/json/a2/a2-vocabulary-12.json +0 -412
  184. package/dist/json/a2/body-parts.json +0 -110
  185. package/dist/json/a2/clothing.json +0 -85
  186. package/dist/json/a2/places.json +0 -85
  187. package/dist/json/b1/b1-vocabulary-01.json +0 -412
  188. package/dist/json/b1/b1-vocabulary-02.json +0 -412
  189. package/dist/json/b1/b1-vocabulary-03.json +0 -412
  190. package/dist/json/b1/b1-vocabulary-04.json +0 -412
  191. package/dist/json/b1/b1-vocabulary-05.json +0 -412
  192. package/dist/json/b1/b1-vocabulary-06.json +0 -412
  193. package/dist/json/b1/b1-vocabulary-07.json +0 -412
  194. package/dist/json/b1/b1-vocabulary-08.json +0 -412
  195. package/dist/json/b1/b1-vocabulary-09.json +0 -412
  196. package/dist/json/b1/b1-vocabulary-10.json +0 -412
  197. package/dist/json/b1/b1-vocabulary-11.json +0 -412
  198. package/dist/json/b1/b1-vocabulary-12.json +0 -412
  199. package/dist/json/b1/b1-vocabulary-13.json +0 -412
  200. package/dist/json/b1/b1-vocabulary-14.json +0 -412
  201. package/dist/json/b1/b1-vocabulary-15.json +0 -412
  202. package/dist/json/b1/b1-vocabulary-16.json +0 -412
  203. package/dist/json/b1/b1-vocabulary-17.json +0 -412
  204. package/dist/json/b1/b1-vocabulary-18.json +0 -412
  205. package/dist/json/b1/b1-vocabulary-19.json +0 -412
  206. package/dist/json/b1/b1-vocabulary-20.json +0 -412
  207. package/dist/json/b1/b1-vocabulary-21.json +0 -412
  208. package/dist/json/b1/b1-vocabulary-22.json +0 -412
  209. package/dist/json/b1/b1-vocabulary-23.json +0 -412
  210. package/dist/json/b1/b1-vocabulary-24.json +0 -404
  211. package/dist/json/b1/emotions.json +0 -85
  212. package/dist/json/b1/professions.json +0 -85
  213. package/dist/json/b1/weather.json +0 -85
  214. package/dist/json/b2/abstract-concepts.json +0 -85
  215. package/dist/json/pre-a1/survival-phrases.json +0 -100
  216. package/dist/levels/a1.d.ts +0 -10
  217. package/dist/levels/a1.d.ts.map +0 -1
  218. package/dist/levels/a1.js +0 -7
  219. package/dist/levels/a1.js.map +0 -1
  220. package/dist/numbers-1-10-3UZLCKyp.js +0 -65
  221. package/dist/numbers-1-10-3UZLCKyp.js.map +0 -1
  222. package/dist/places-CF2IKsXX.js +0 -90
  223. package/dist/places-CF2IKsXX.js.map +0 -1
  224. package/dist/professions-DtpFIeQk.js +0 -90
  225. package/dist/professions-DtpFIeQk.js.map +0 -1
  226. package/dist/survival-phrases-CiRt_AYV.js +0 -105
  227. package/dist/survival-phrases-CiRt_AYV.js.map +0 -1
  228. package/dist/weather-CeIruwIc.js +0 -90
  229. package/dist/weather-CeIruwIc.js.map +0 -1
  230. package/src/json/a1/basic-greetings.json +0 -60
  231. package/src/json/a1/colors.json +0 -60
  232. package/src/json/a1/family-members.json +0 -50
  233. package/src/json/a1/food-basics.json +0 -60
  234. package/src/json/a1/numbers-1-10.json +0 -60
  235. package/src/json/a2/body-parts.json +0 -110
  236. package/src/json/a2/clothing.json +0 -85
  237. package/src/json/a2/places.json +0 -85
  238. package/src/json/b1/emotions.json +0 -85
  239. package/src/json/b1/professions.json +0 -85
  240. package/src/json/b1/weather.json +0 -85
package/src/index.ts CHANGED
@@ -1,569 +1,569 @@
1
- /**
2
- * Vietnamese Word Lists
3
- *
4
- * CEFR-aligned vocabulary collections for Vietnamese language learning.
5
- * Uses descriptor-based lazy loading: metadata is eager, each set's
6
- * JSON is loaded on demand via `descriptor.load()`.
7
- */
8
-
9
- import {
10
- createWordListCatalog,
11
- jsonDescriptor,
12
- type ExamGrade,
13
- type WordListDifficulty,
14
- type WordListItem,
15
- type WordListSet,
16
- } from "@syllst/word-lists";
17
-
18
- // ─── Sources ───────────────────────────────────────────────────────────────
19
-
20
- const SUBTITLE_FREQUENCY_LIST = { name: "Subtitle frequency list", url: "https://github.com/hermitdave/FrequencyWords" };
21
- const UNKNOWN_SOURCE = { name: "Unknown source" };
22
-
23
- // ─── Descriptors ───────────────────────────────────────────────────────────
24
-
25
- const descriptors = [
26
- jsonDescriptor({
27
- id: "a1-vocabulary-01",
28
- name: "A1 Frequency Band 1 (1-50)",
29
- description: "A1 level Vietnamese frequency vocabulary",
30
- examGrade: "A1",
31
- category: "general",
32
- difficulty: "beginner",
33
- itemCount: 50,
34
- source: SUBTITLE_FREQUENCY_LIST,
35
- }, () => import("./json/a1/a1-vocabulary-01.json")),
36
- jsonDescriptor({
37
- id: "a1-vocabulary-02",
38
- name: "A1 Frequency Band 2 (51-100)",
39
- description: "A1 level Vietnamese frequency vocabulary",
40
- examGrade: "A1",
41
- category: "general",
42
- difficulty: "beginner",
43
- itemCount: 50,
44
- source: SUBTITLE_FREQUENCY_LIST,
45
- }, () => import("./json/a1/a1-vocabulary-02.json")),
46
- jsonDescriptor({
47
- id: "a1-vocabulary-03",
48
- name: "A1 Frequency Band 3 (101-150)",
49
- description: "A1 level Vietnamese frequency vocabulary",
50
- examGrade: "A1",
51
- category: "general",
52
- difficulty: "beginner",
53
- itemCount: 50,
54
- source: SUBTITLE_FREQUENCY_LIST,
55
- }, () => import("./json/a1/a1-vocabulary-03.json")),
56
- jsonDescriptor({
57
- id: "a1-vocabulary-04",
58
- name: "A1 Frequency Band 4 (151-200)",
59
- description: "A1 level Vietnamese frequency vocabulary",
60
- examGrade: "A1",
61
- category: "general",
62
- difficulty: "beginner",
63
- itemCount: 50,
64
- source: SUBTITLE_FREQUENCY_LIST,
65
- }, () => import("./json/a1/a1-vocabulary-04.json")),
66
- jsonDescriptor({
67
- id: "a1-basic-greetings",
68
- name: "Basic Greetings",
69
- description: "Basic Greetings vocabulary list",
70
- examGrade: "A1",
71
- category: "general",
72
- difficulty: "beginner",
73
- itemCount: 10,
74
- source: UNKNOWN_SOURCE,
75
- }, () => import("./json/a1/basic-greetings.json")),
76
- jsonDescriptor({
77
- id: "a1-colors",
78
- name: "Colors",
79
- description: "Colors vocabulary list",
80
- examGrade: "A1",
81
- category: "general",
82
- difficulty: "beginner",
83
- itemCount: 10,
84
- source: UNKNOWN_SOURCE,
85
- }, () => import("./json/a1/colors.json")),
86
- jsonDescriptor({
87
- id: "a1-family-members",
88
- name: "Family Members",
89
- description: "Family Members vocabulary list",
90
- examGrade: "A1",
91
- category: "general",
92
- difficulty: "beginner",
93
- itemCount: 8,
94
- source: UNKNOWN_SOURCE,
95
- }, () => import("./json/a1/family-members.json")),
96
- jsonDescriptor({
97
- id: "a1-food-basics",
98
- name: "Food Basics",
99
- description: "Food Basics vocabulary list",
100
- examGrade: "A1",
101
- category: "general",
102
- difficulty: "beginner",
103
- itemCount: 10,
104
- source: UNKNOWN_SOURCE,
105
- }, () => import("./json/a1/food-basics.json")),
106
- jsonDescriptor({
107
- id: "a1-numbers-1-10",
108
- name: "Numbers 1-10",
109
- description: "Numbers 1-10 vocabulary list",
110
- examGrade: "A1",
111
- category: "general",
112
- difficulty: "beginner",
113
- itemCount: 10,
114
- source: UNKNOWN_SOURCE,
115
- }, () => import("./json/a1/numbers-1-10.json")),
116
- jsonDescriptor({
117
- id: "pre-a1-survival-phrases",
118
- name: "Survival Phrases",
119
- description: "Essential yes/no, greetings, and basic commands",
120
- examGrade: "Pre-A1",
121
- category: "survival",
122
- difficulty: "beginner",
123
- itemCount: 18,
124
- source: { name: "Vietnamese essential phrases" },
125
- }, () => import("./json/pre-a1/survival-phrases.json")),
126
- jsonDescriptor({
127
- id: "a2-body-parts",
128
- name: "Body Parts",
129
- description: "Human body parts and anatomy",
130
- examGrade: "A2",
131
- category: "anatomy",
132
- difficulty: "intermediate",
133
- itemCount: 20,
134
- source: { name: "Vietnamese frequency and thematic vocabulary" },
135
- }, () => import("./json/a2/body-parts.json")),
136
- jsonDescriptor({
137
- id: "a2-clothing",
138
- name: "Clothing",
139
- description: "Clothing and accessories",
140
- examGrade: "A2",
141
- category: "clothing",
142
- difficulty: "intermediate",
143
- itemCount: 15,
144
- source: { name: "Vietnamese frequency and thematic vocabulary" },
145
- }, () => import("./json/a2/clothing.json")),
146
- jsonDescriptor({
147
- id: "a2-places",
148
- name: "Places",
149
- description: "Common places and buildings",
150
- examGrade: "A2",
151
- category: "places",
152
- difficulty: "intermediate",
153
- itemCount: 15,
154
- source: { name: "Vietnamese frequency and thematic vocabulary" },
155
- }, () => import("./json/a2/places.json")),
156
- jsonDescriptor({
157
- id: "b1-emotions",
158
- name: "Emotions",
159
- description: "Emotions and feelings",
160
- examGrade: "B1",
161
- category: "emotions",
162
- difficulty: "intermediate",
163
- itemCount: 15,
164
- source: { name: "Vietnamese frequency and thematic vocabulary" },
165
- }, () => import("./json/b1/emotions.json")),
166
- jsonDescriptor({
167
- id: "b1-professions",
168
- name: "Professions",
169
- description: "Jobs and professions",
170
- examGrade: "B1",
171
- category: "work",
172
- difficulty: "intermediate",
173
- itemCount: 15,
174
- source: { name: "Vietnamese frequency and thematic vocabulary" },
175
- }, () => import("./json/b1/professions.json")),
176
- jsonDescriptor({
177
- id: "b1-weather",
178
- name: "Weather",
179
- description: "Weather and climate terms",
180
- examGrade: "B1",
181
- category: "nature",
182
- difficulty: "intermediate",
183
- itemCount: 15,
184
- source: { name: "Vietnamese frequency and thematic vocabulary" },
185
- }, () => import("./json/b1/weather.json")),
186
- jsonDescriptor({
187
- id: "b2-abstract-concepts",
188
- name: "Abstract Concepts",
189
- description: "Abstract philosophical and social concepts",
190
- examGrade: "B2",
191
- category: "abstract",
192
- difficulty: "advanced",
193
- itemCount: 15,
194
- source: { name: "Vietnamese frequency and thematic vocabulary" },
195
- }, () => import("./json/b2/abstract-concepts.json")),
196
- jsonDescriptor({
197
- id: "a2-vocabulary-01",
198
- name: "A2 Frequency Band 1 (1-50)",
199
- description: "A2 level Vietnamese frequency vocabulary",
200
- examGrade: "A2",
201
- category: "general",
202
- difficulty: "intermediate",
203
- itemCount: 50,
204
- source: SUBTITLE_FREQUENCY_LIST,
205
- }, () => import("./json/a2/a2-vocabulary-01.json")),
206
- jsonDescriptor({
207
- id: "a2-vocabulary-02",
208
- name: "A2 Frequency Band 2 (51-100)",
209
- description: "A2 level Vietnamese frequency vocabulary",
210
- examGrade: "A2",
211
- category: "general",
212
- difficulty: "intermediate",
213
- itemCount: 50,
214
- source: SUBTITLE_FREQUENCY_LIST,
215
- }, () => import("./json/a2/a2-vocabulary-02.json")),
216
- jsonDescriptor({
217
- id: "a2-vocabulary-03",
218
- name: "A2 Frequency Band 3 (101-150)",
219
- description: "A2 level Vietnamese frequency vocabulary",
220
- examGrade: "A2",
221
- category: "general",
222
- difficulty: "intermediate",
223
- itemCount: 50,
224
- source: SUBTITLE_FREQUENCY_LIST,
225
- }, () => import("./json/a2/a2-vocabulary-03.json")),
226
- jsonDescriptor({
227
- id: "a2-vocabulary-04",
228
- name: "A2 Frequency Band 4 (151-200)",
229
- description: "A2 level Vietnamese frequency vocabulary",
230
- examGrade: "A2",
231
- category: "general",
232
- difficulty: "intermediate",
233
- itemCount: 50,
234
- source: SUBTITLE_FREQUENCY_LIST,
235
- }, () => import("./json/a2/a2-vocabulary-04.json")),
236
- jsonDescriptor({
237
- id: "a2-vocabulary-05",
238
- name: "A2 Frequency Band 5 (201-250)",
239
- description: "A2 level Vietnamese frequency vocabulary",
240
- examGrade: "A2",
241
- category: "general",
242
- difficulty: "intermediate",
243
- itemCount: 50,
244
- source: SUBTITLE_FREQUENCY_LIST,
245
- }, () => import("./json/a2/a2-vocabulary-05.json")),
246
- jsonDescriptor({
247
- id: "a2-vocabulary-06",
248
- name: "A2 Frequency Band 6 (251-300)",
249
- description: "A2 level Vietnamese frequency vocabulary",
250
- examGrade: "A2",
251
- category: "general",
252
- difficulty: "intermediate",
253
- itemCount: 50,
254
- source: SUBTITLE_FREQUENCY_LIST,
255
- }, () => import("./json/a2/a2-vocabulary-06.json")),
256
- jsonDescriptor({
257
- id: "a2-vocabulary-07",
258
- name: "A2 Frequency Band 7 (301-350)",
259
- description: "A2 level Vietnamese frequency vocabulary",
260
- examGrade: "A2",
261
- category: "general",
262
- difficulty: "intermediate",
263
- itemCount: 50,
264
- source: SUBTITLE_FREQUENCY_LIST,
265
- }, () => import("./json/a2/a2-vocabulary-07.json")),
266
- jsonDescriptor({
267
- id: "a2-vocabulary-08",
268
- name: "A2 Frequency Band 8 (351-400)",
269
- description: "A2 level Vietnamese frequency vocabulary",
270
- examGrade: "A2",
271
- category: "general",
272
- difficulty: "intermediate",
273
- itemCount: 50,
274
- source: SUBTITLE_FREQUENCY_LIST,
275
- }, () => import("./json/a2/a2-vocabulary-08.json")),
276
- jsonDescriptor({
277
- id: "a2-vocabulary-09",
278
- name: "A2 Frequency Band 9 (401-450)",
279
- description: "A2 level Vietnamese frequency vocabulary",
280
- examGrade: "A2",
281
- category: "general",
282
- difficulty: "intermediate",
283
- itemCount: 50,
284
- source: SUBTITLE_FREQUENCY_LIST,
285
- }, () => import("./json/a2/a2-vocabulary-09.json")),
286
- jsonDescriptor({
287
- id: "a2-vocabulary-10",
288
- name: "A2 Frequency Band 10 (451-500)",
289
- description: "A2 level Vietnamese frequency vocabulary",
290
- examGrade: "A2",
291
- category: "general",
292
- difficulty: "intermediate",
293
- itemCount: 50,
294
- source: SUBTITLE_FREQUENCY_LIST,
295
- }, () => import("./json/a2/a2-vocabulary-10.json")),
296
- jsonDescriptor({
297
- id: "a2-vocabulary-11",
298
- name: "A2 Frequency Band 11 (501-550)",
299
- description: "A2 level Vietnamese frequency vocabulary",
300
- examGrade: "A2",
301
- category: "general",
302
- difficulty: "intermediate",
303
- itemCount: 50,
304
- source: SUBTITLE_FREQUENCY_LIST,
305
- }, () => import("./json/a2/a2-vocabulary-11.json")),
306
- jsonDescriptor({
307
- id: "a2-vocabulary-12",
308
- name: "A2 Frequency Band 12 (551-600)",
309
- description: "A2 level Vietnamese frequency vocabulary",
310
- examGrade: "A2",
311
- category: "general",
312
- difficulty: "intermediate",
313
- itemCount: 50,
314
- source: SUBTITLE_FREQUENCY_LIST,
315
- }, () => import("./json/a2/a2-vocabulary-12.json")),
316
- jsonDescriptor({
317
- id: "b1-vocabulary-01",
318
- name: "B1 Frequency Band 1 (1-50)",
319
- description: "B1 level Vietnamese frequency vocabulary",
320
- examGrade: "B1",
321
- category: "general",
322
- difficulty: "intermediate",
323
- itemCount: 50,
324
- source: SUBTITLE_FREQUENCY_LIST,
325
- }, () => import("./json/b1/b1-vocabulary-01.json")),
326
- jsonDescriptor({
327
- id: "b1-vocabulary-02",
328
- name: "B1 Frequency Band 2 (51-100)",
329
- description: "B1 level Vietnamese frequency vocabulary",
330
- examGrade: "B1",
331
- category: "general",
332
- difficulty: "intermediate",
333
- itemCount: 50,
334
- source: SUBTITLE_FREQUENCY_LIST,
335
- }, () => import("./json/b1/b1-vocabulary-02.json")),
336
- jsonDescriptor({
337
- id: "b1-vocabulary-03",
338
- name: "B1 Frequency Band 3 (101-150)",
339
- description: "B1 level Vietnamese frequency vocabulary",
340
- examGrade: "B1",
341
- category: "general",
342
- difficulty: "intermediate",
343
- itemCount: 50,
344
- source: SUBTITLE_FREQUENCY_LIST,
345
- }, () => import("./json/b1/b1-vocabulary-03.json")),
346
- jsonDescriptor({
347
- id: "b1-vocabulary-04",
348
- name: "B1 Frequency Band 4 (151-200)",
349
- description: "B1 level Vietnamese frequency vocabulary",
350
- examGrade: "B1",
351
- category: "general",
352
- difficulty: "intermediate",
353
- itemCount: 50,
354
- source: SUBTITLE_FREQUENCY_LIST,
355
- }, () => import("./json/b1/b1-vocabulary-04.json")),
356
- jsonDescriptor({
357
- id: "b1-vocabulary-05",
358
- name: "B1 Frequency Band 5 (201-250)",
359
- description: "B1 level Vietnamese frequency vocabulary",
360
- examGrade: "B1",
361
- category: "general",
362
- difficulty: "intermediate",
363
- itemCount: 50,
364
- source: SUBTITLE_FREQUENCY_LIST,
365
- }, () => import("./json/b1/b1-vocabulary-05.json")),
366
- jsonDescriptor({
367
- id: "b1-vocabulary-06",
368
- name: "B1 Frequency Band 6 (251-300)",
369
- description: "B1 level Vietnamese frequency vocabulary",
370
- examGrade: "B1",
371
- category: "general",
372
- difficulty: "intermediate",
373
- itemCount: 50,
374
- source: SUBTITLE_FREQUENCY_LIST,
375
- }, () => import("./json/b1/b1-vocabulary-06.json")),
376
- jsonDescriptor({
377
- id: "b1-vocabulary-07",
378
- name: "B1 Frequency Band 7 (301-350)",
379
- description: "B1 level Vietnamese frequency vocabulary",
380
- examGrade: "B1",
381
- category: "general",
382
- difficulty: "intermediate",
383
- itemCount: 50,
384
- source: SUBTITLE_FREQUENCY_LIST,
385
- }, () => import("./json/b1/b1-vocabulary-07.json")),
386
- jsonDescriptor({
387
- id: "b1-vocabulary-08",
388
- name: "B1 Frequency Band 8 (351-400)",
389
- description: "B1 level Vietnamese frequency vocabulary",
390
- examGrade: "B1",
391
- category: "general",
392
- difficulty: "intermediate",
393
- itemCount: 50,
394
- source: SUBTITLE_FREQUENCY_LIST,
395
- }, () => import("./json/b1/b1-vocabulary-08.json")),
396
- jsonDescriptor({
397
- id: "b1-vocabulary-09",
398
- name: "B1 Frequency Band 9 (401-450)",
399
- description: "B1 level Vietnamese frequency vocabulary",
400
- examGrade: "B1",
401
- category: "general",
402
- difficulty: "intermediate",
403
- itemCount: 50,
404
- source: SUBTITLE_FREQUENCY_LIST,
405
- }, () => import("./json/b1/b1-vocabulary-09.json")),
406
- jsonDescriptor({
407
- id: "b1-vocabulary-10",
408
- name: "B1 Frequency Band 10 (451-500)",
409
- description: "B1 level Vietnamese frequency vocabulary",
410
- examGrade: "B1",
411
- category: "general",
412
- difficulty: "intermediate",
413
- itemCount: 50,
414
- source: SUBTITLE_FREQUENCY_LIST,
415
- }, () => import("./json/b1/b1-vocabulary-10.json")),
416
- jsonDescriptor({
417
- id: "b1-vocabulary-11",
418
- name: "B1 Frequency Band 11 (501-550)",
419
- description: "B1 level Vietnamese frequency vocabulary",
420
- examGrade: "B1",
421
- category: "general",
422
- difficulty: "intermediate",
423
- itemCount: 50,
424
- source: SUBTITLE_FREQUENCY_LIST,
425
- }, () => import("./json/b1/b1-vocabulary-11.json")),
426
- jsonDescriptor({
427
- id: "b1-vocabulary-12",
428
- name: "B1 Frequency Band 12 (551-600)",
429
- description: "B1 level Vietnamese frequency vocabulary",
430
- examGrade: "B1",
431
- category: "general",
432
- difficulty: "intermediate",
433
- itemCount: 50,
434
- source: SUBTITLE_FREQUENCY_LIST,
435
- }, () => import("./json/b1/b1-vocabulary-12.json")),
436
- jsonDescriptor({
437
- id: "b1-vocabulary-13",
438
- name: "B1 Frequency Band 13 (601-650)",
439
- description: "B1 level Vietnamese frequency vocabulary",
440
- examGrade: "B1",
441
- category: "general",
442
- difficulty: "intermediate",
443
- itemCount: 50,
444
- source: SUBTITLE_FREQUENCY_LIST,
445
- }, () => import("./json/b1/b1-vocabulary-13.json")),
446
- jsonDescriptor({
447
- id: "b1-vocabulary-14",
448
- name: "B1 Frequency Band 14 (651-700)",
449
- description: "B1 level Vietnamese frequency vocabulary",
450
- examGrade: "B1",
451
- category: "general",
452
- difficulty: "intermediate",
453
- itemCount: 50,
454
- source: SUBTITLE_FREQUENCY_LIST,
455
- }, () => import("./json/b1/b1-vocabulary-14.json")),
456
- jsonDescriptor({
457
- id: "b1-vocabulary-15",
458
- name: "B1 Frequency Band 15 (701-750)",
459
- description: "B1 level Vietnamese frequency vocabulary",
460
- examGrade: "B1",
461
- category: "general",
462
- difficulty: "intermediate",
463
- itemCount: 50,
464
- source: SUBTITLE_FREQUENCY_LIST,
465
- }, () => import("./json/b1/b1-vocabulary-15.json")),
466
- jsonDescriptor({
467
- id: "b1-vocabulary-16",
468
- name: "B1 Frequency Band 16 (751-800)",
469
- description: "B1 level Vietnamese frequency vocabulary",
470
- examGrade: "B1",
471
- category: "general",
472
- difficulty: "intermediate",
473
- itemCount: 50,
474
- source: SUBTITLE_FREQUENCY_LIST,
475
- }, () => import("./json/b1/b1-vocabulary-16.json")),
476
- jsonDescriptor({
477
- id: "b1-vocabulary-17",
478
- name: "B1 Frequency Band 17 (801-850)",
479
- description: "B1 level Vietnamese frequency vocabulary",
480
- examGrade: "B1",
481
- category: "general",
482
- difficulty: "intermediate",
483
- itemCount: 50,
484
- source: SUBTITLE_FREQUENCY_LIST,
485
- }, () => import("./json/b1/b1-vocabulary-17.json")),
486
- jsonDescriptor({
487
- id: "b1-vocabulary-18",
488
- name: "B1 Frequency Band 18 (851-900)",
489
- description: "B1 level Vietnamese frequency vocabulary",
490
- examGrade: "B1",
491
- category: "general",
492
- difficulty: "intermediate",
493
- itemCount: 50,
494
- source: SUBTITLE_FREQUENCY_LIST,
495
- }, () => import("./json/b1/b1-vocabulary-18.json")),
496
- jsonDescriptor({
497
- id: "b1-vocabulary-19",
498
- name: "B1 Frequency Band 19 (901-950)",
499
- description: "B1 level Vietnamese frequency vocabulary",
500
- examGrade: "B1",
501
- category: "general",
502
- difficulty: "intermediate",
503
- itemCount: 50,
504
- source: SUBTITLE_FREQUENCY_LIST,
505
- }, () => import("./json/b1/b1-vocabulary-19.json")),
506
- jsonDescriptor({
507
- id: "b1-vocabulary-20",
508
- name: "B1 Frequency Band 20 (951-1000)",
509
- description: "B1 level Vietnamese frequency vocabulary",
510
- examGrade: "B1",
511
- category: "general",
512
- difficulty: "intermediate",
513
- itemCount: 50,
514
- source: SUBTITLE_FREQUENCY_LIST,
515
- }, () => import("./json/b1/b1-vocabulary-20.json")),
516
- jsonDescriptor({
517
- id: "b1-vocabulary-21",
518
- name: "B1 Frequency Band 21 (1001-1050)",
519
- description: "B1 level Vietnamese frequency vocabulary",
520
- examGrade: "B1",
521
- category: "general",
522
- difficulty: "intermediate",
523
- itemCount: 50,
524
- source: SUBTITLE_FREQUENCY_LIST,
525
- }, () => import("./json/b1/b1-vocabulary-21.json")),
526
- jsonDescriptor({
527
- id: "b1-vocabulary-22",
528
- name: "B1 Frequency Band 22 (1051-1100)",
529
- description: "B1 level Vietnamese frequency vocabulary",
530
- examGrade: "B1",
531
- category: "general",
532
- difficulty: "intermediate",
533
- itemCount: 50,
534
- source: SUBTITLE_FREQUENCY_LIST,
535
- }, () => import("./json/b1/b1-vocabulary-22.json")),
536
- jsonDescriptor({
537
- id: "b1-vocabulary-23",
538
- name: "B1 Frequency Band 23 (1101-1150)",
539
- description: "B1 level Vietnamese frequency vocabulary",
540
- examGrade: "B1",
541
- category: "general",
542
- difficulty: "intermediate",
543
- itemCount: 50,
544
- source: SUBTITLE_FREQUENCY_LIST,
545
- }, () => import("./json/b1/b1-vocabulary-23.json")),
546
- jsonDescriptor({
547
- id: "b1-vocabulary-24",
548
- name: "B1 Frequency Band 24 (1151-1200)",
549
- description: "B1 level Vietnamese frequency vocabulary",
550
- examGrade: "B1",
551
- category: "general",
552
- difficulty: "intermediate",
553
- itemCount: 49,
554
- source: SUBTITLE_FREQUENCY_LIST,
555
- }, () => import("./json/b1/b1-vocabulary-24.json")),
556
- ] as const;
557
-
558
- export const vietnameseWordListCatalog = createWordListCatalog([...descriptors]);
559
-
560
- // Backward-compatible re-exports (deprecated — prefer catalog API)
561
- export const {
562
- getDescriptorById,
563
- getDescriptorsByExamGrade,
564
- getDescriptorsByCategory,
565
- getDescriptorsByDifficulty,
566
- getCategories,
567
- } = vietnameseWordListCatalog;
568
-
569
- export type { ExamGrade, WordListDifficulty, WordListItem, WordListSet };
1
+ /**
2
+ * Vietnamese Word Lists
3
+ *
4
+ * CEFR-aligned vocabulary collections for Vietnamese language learning.
5
+ * Uses descriptor-based lazy loading: metadata is eager, each set's
6
+ * JSON is loaded on demand via `descriptor.load()`.
7
+ */
8
+
9
+ import {
10
+ createWordListCatalog,
11
+ jsonDescriptor,
12
+ type ExamGrade,
13
+ type WordListDifficulty,
14
+ type WordListItem,
15
+ type WordListSet,
16
+ } from "@syllst/word-lists";
17
+
18
+ // ─── Sources ───────────────────────────────────────────────────────────────
19
+
20
+ const SUBTITLE_FREQUENCY_LIST = { name: "Subtitle frequency list", url: "https://github.com/hermitdave/FrequencyWords" };
21
+ const UNKNOWN_SOURCE = { name: "Unknown source" };
22
+
23
+ // ─── Descriptors ───────────────────────────────────────────────────────────
24
+
25
+ const descriptors = [
26
+ jsonDescriptor({
27
+ id: "a1-vocabulary-01",
28
+ name: "A1 Frequency Band 1 (1-50)",
29
+ description: "A1 level Vietnamese frequency vocabulary",
30
+ examGrade: "A1",
31
+ category: "general",
32
+ difficulty: "beginner",
33
+ itemCount: 50,
34
+ source: SUBTITLE_FREQUENCY_LIST,
35
+ }, () => import("./json/a1/a1-vocabulary-01.json")),
36
+ jsonDescriptor({
37
+ id: "a1-vocabulary-02",
38
+ name: "A1 Frequency Band 2 (51-100)",
39
+ description: "A1 level Vietnamese frequency vocabulary",
40
+ examGrade: "A1",
41
+ category: "general",
42
+ difficulty: "beginner",
43
+ itemCount: 50,
44
+ source: SUBTITLE_FREQUENCY_LIST,
45
+ }, () => import("./json/a1/a1-vocabulary-02.json")),
46
+ jsonDescriptor({
47
+ id: "a1-vocabulary-03",
48
+ name: "A1 Frequency Band 3 (101-150)",
49
+ description: "A1 level Vietnamese frequency vocabulary",
50
+ examGrade: "A1",
51
+ category: "general",
52
+ difficulty: "beginner",
53
+ itemCount: 50,
54
+ source: SUBTITLE_FREQUENCY_LIST,
55
+ }, () => import("./json/a1/a1-vocabulary-03.json")),
56
+ jsonDescriptor({
57
+ id: "a1-vocabulary-04",
58
+ name: "A1 Frequency Band 4 (151-200)",
59
+ description: "A1 level Vietnamese frequency vocabulary",
60
+ examGrade: "A1",
61
+ category: "general",
62
+ difficulty: "beginner",
63
+ itemCount: 50,
64
+ source: SUBTITLE_FREQUENCY_LIST,
65
+ }, () => import("./json/a1/a1-vocabulary-04.json")),
66
+ jsonDescriptor({
67
+ id: "a1-greetings",
68
+ name: "Basic Greetings",
69
+ description: "Basic greeting phrases in Vietnamese",
70
+ examGrade: "A1",
71
+ category: "greetings",
72
+ difficulty: "beginner",
73
+ itemCount: 10,
74
+ source: UNKNOWN_SOURCE,
75
+ }, () => import("./json/a1/a1-greetings.json")),
76
+ jsonDescriptor({
77
+ id: "a1-colors",
78
+ name: "Colors",
79
+ description: "Common colors in Vietnamese",
80
+ examGrade: "A1",
81
+ category: "colors",
82
+ difficulty: "beginner",
83
+ itemCount: 10,
84
+ source: UNKNOWN_SOURCE,
85
+ }, () => import("./json/a1/a1-colors.json")),
86
+ jsonDescriptor({
87
+ id: "a1-family",
88
+ name: "Family Members",
89
+ description: "Family member vocabulary in Vietnamese",
90
+ examGrade: "A1",
91
+ category: "family",
92
+ difficulty: "beginner",
93
+ itemCount: 8,
94
+ source: UNKNOWN_SOURCE,
95
+ }, () => import("./json/a1/a1-family.json")),
96
+ jsonDescriptor({
97
+ id: "a1-food",
98
+ name: "Food Basics",
99
+ description: "Basic food vocabulary in Vietnamese",
100
+ examGrade: "A1",
101
+ category: "food",
102
+ difficulty: "beginner",
103
+ itemCount: 10,
104
+ source: UNKNOWN_SOURCE,
105
+ }, () => import("./json/a1/a1-food.json")),
106
+ jsonDescriptor({
107
+ id: "a1-numbers",
108
+ name: "Numbers 1-10",
109
+ description: "Numbers 1-10 in Vietnamese",
110
+ examGrade: "A1",
111
+ category: "numbers",
112
+ difficulty: "beginner",
113
+ itemCount: 10,
114
+ source: UNKNOWN_SOURCE,
115
+ }, () => import("./json/a1/a1-numbers.json")),
116
+ jsonDescriptor({
117
+ id: "pre-a1-survival-phrases",
118
+ name: "Survival Phrases",
119
+ description: "Essential yes/no, greetings, and basic commands",
120
+ examGrade: "Pre-A1",
121
+ category: "survival",
122
+ difficulty: "beginner",
123
+ itemCount: 18,
124
+ source: { name: "Vietnamese essential phrases" },
125
+ }, () => import("./json/pre-a1/survival-phrases.json")),
126
+ jsonDescriptor({
127
+ id: "a2-body-parts",
128
+ name: "Body Parts",
129
+ description: "Human body parts and anatomy",
130
+ examGrade: "A2",
131
+ category: "anatomy",
132
+ difficulty: "intermediate",
133
+ itemCount: 20,
134
+ source: { name: "Vietnamese frequency and thematic vocabulary" },
135
+ }, () => import("./json/a2/a2-body-parts.json")),
136
+ jsonDescriptor({
137
+ id: "a2-clothing",
138
+ name: "Clothing",
139
+ description: "Clothing and accessories",
140
+ examGrade: "A2",
141
+ category: "clothing",
142
+ difficulty: "intermediate",
143
+ itemCount: 15,
144
+ source: { name: "Vietnamese frequency and thematic vocabulary" },
145
+ }, () => import("./json/a2/a2-clothing.json")),
146
+ jsonDescriptor({
147
+ id: "a2-places",
148
+ name: "Places",
149
+ description: "Common places and buildings",
150
+ examGrade: "A2",
151
+ category: "places",
152
+ difficulty: "intermediate",
153
+ itemCount: 15,
154
+ source: { name: "Vietnamese frequency and thematic vocabulary" },
155
+ }, () => import("./json/a2/a2-places.json")),
156
+ jsonDescriptor({
157
+ id: "b1-emotions",
158
+ name: "Emotions",
159
+ description: "Emotions and feelings",
160
+ examGrade: "B1",
161
+ category: "emotions",
162
+ difficulty: "intermediate",
163
+ itemCount: 15,
164
+ source: { name: "Vietnamese frequency and thematic vocabulary" },
165
+ }, () => import("./json/b1/b1-emotions.json")),
166
+ jsonDescriptor({
167
+ id: "b1-professions",
168
+ name: "Professions",
169
+ description: "Jobs and professions",
170
+ examGrade: "B1",
171
+ category: "work",
172
+ difficulty: "intermediate",
173
+ itemCount: 15,
174
+ source: { name: "Vietnamese frequency and thematic vocabulary" },
175
+ }, () => import("./json/b1/b1-professions.json")),
176
+ jsonDescriptor({
177
+ id: "b1-weather",
178
+ name: "Weather",
179
+ description: "Weather and climate terms",
180
+ examGrade: "B1",
181
+ category: "nature",
182
+ difficulty: "intermediate",
183
+ itemCount: 15,
184
+ source: { name: "Vietnamese frequency and thematic vocabulary" },
185
+ }, () => import("./json/b1/b1-weather.json")),
186
+ jsonDescriptor({
187
+ id: "b2-abstract-concepts",
188
+ name: "Abstract Concepts",
189
+ description: "Abstract philosophical and social concepts",
190
+ examGrade: "B2",
191
+ category: "abstract",
192
+ difficulty: "advanced",
193
+ itemCount: 15,
194
+ source: { name: "Vietnamese frequency and thematic vocabulary" },
195
+ }, () => import("./json/b2/abstract-concepts.json")),
196
+ jsonDescriptor({
197
+ id: "a2-vocabulary-01",
198
+ name: "A2 Frequency Band 1 (1-50)",
199
+ description: "A2 level Vietnamese frequency vocabulary",
200
+ examGrade: "A2",
201
+ category: "general",
202
+ difficulty: "intermediate",
203
+ itemCount: 50,
204
+ source: SUBTITLE_FREQUENCY_LIST,
205
+ }, () => import("./json/a2/a2-vocabulary-01.json")),
206
+ jsonDescriptor({
207
+ id: "a2-vocabulary-02",
208
+ name: "A2 Frequency Band 2 (51-100)",
209
+ description: "A2 level Vietnamese frequency vocabulary",
210
+ examGrade: "A2",
211
+ category: "general",
212
+ difficulty: "intermediate",
213
+ itemCount: 50,
214
+ source: SUBTITLE_FREQUENCY_LIST,
215
+ }, () => import("./json/a2/a2-vocabulary-02.json")),
216
+ jsonDescriptor({
217
+ id: "a2-vocabulary-03",
218
+ name: "A2 Frequency Band 3 (101-150)",
219
+ description: "A2 level Vietnamese frequency vocabulary",
220
+ examGrade: "A2",
221
+ category: "general",
222
+ difficulty: "intermediate",
223
+ itemCount: 50,
224
+ source: SUBTITLE_FREQUENCY_LIST,
225
+ }, () => import("./json/a2/a2-vocabulary-03.json")),
226
+ jsonDescriptor({
227
+ id: "a2-vocabulary-04",
228
+ name: "A2 Frequency Band 4 (151-200)",
229
+ description: "A2 level Vietnamese frequency vocabulary",
230
+ examGrade: "A2",
231
+ category: "general",
232
+ difficulty: "intermediate",
233
+ itemCount: 50,
234
+ source: SUBTITLE_FREQUENCY_LIST,
235
+ }, () => import("./json/a2/a2-vocabulary-04.json")),
236
+ jsonDescriptor({
237
+ id: "a2-vocabulary-05",
238
+ name: "A2 Frequency Band 5 (201-250)",
239
+ description: "A2 level Vietnamese frequency vocabulary",
240
+ examGrade: "A2",
241
+ category: "general",
242
+ difficulty: "intermediate",
243
+ itemCount: 50,
244
+ source: SUBTITLE_FREQUENCY_LIST,
245
+ }, () => import("./json/a2/a2-vocabulary-05.json")),
246
+ jsonDescriptor({
247
+ id: "a2-vocabulary-06",
248
+ name: "A2 Frequency Band 6 (251-300)",
249
+ description: "A2 level Vietnamese frequency vocabulary",
250
+ examGrade: "A2",
251
+ category: "general",
252
+ difficulty: "intermediate",
253
+ itemCount: 50,
254
+ source: SUBTITLE_FREQUENCY_LIST,
255
+ }, () => import("./json/a2/a2-vocabulary-06.json")),
256
+ jsonDescriptor({
257
+ id: "a2-vocabulary-07",
258
+ name: "A2 Frequency Band 7 (301-350)",
259
+ description: "A2 level Vietnamese frequency vocabulary",
260
+ examGrade: "A2",
261
+ category: "general",
262
+ difficulty: "intermediate",
263
+ itemCount: 50,
264
+ source: SUBTITLE_FREQUENCY_LIST,
265
+ }, () => import("./json/a2/a2-vocabulary-07.json")),
266
+ jsonDescriptor({
267
+ id: "a2-vocabulary-08",
268
+ name: "A2 Frequency Band 8 (351-400)",
269
+ description: "A2 level Vietnamese frequency vocabulary",
270
+ examGrade: "A2",
271
+ category: "general",
272
+ difficulty: "intermediate",
273
+ itemCount: 50,
274
+ source: SUBTITLE_FREQUENCY_LIST,
275
+ }, () => import("./json/a2/a2-vocabulary-08.json")),
276
+ jsonDescriptor({
277
+ id: "a2-vocabulary-09",
278
+ name: "A2 Frequency Band 9 (401-450)",
279
+ description: "A2 level Vietnamese frequency vocabulary",
280
+ examGrade: "A2",
281
+ category: "general",
282
+ difficulty: "intermediate",
283
+ itemCount: 50,
284
+ source: SUBTITLE_FREQUENCY_LIST,
285
+ }, () => import("./json/a2/a2-vocabulary-09.json")),
286
+ jsonDescriptor({
287
+ id: "a2-vocabulary-10",
288
+ name: "A2 Frequency Band 10 (451-500)",
289
+ description: "A2 level Vietnamese frequency vocabulary",
290
+ examGrade: "A2",
291
+ category: "general",
292
+ difficulty: "intermediate",
293
+ itemCount: 50,
294
+ source: SUBTITLE_FREQUENCY_LIST,
295
+ }, () => import("./json/a2/a2-vocabulary-10.json")),
296
+ jsonDescriptor({
297
+ id: "a2-vocabulary-11",
298
+ name: "A2 Frequency Band 11 (501-550)",
299
+ description: "A2 level Vietnamese frequency vocabulary",
300
+ examGrade: "A2",
301
+ category: "general",
302
+ difficulty: "intermediate",
303
+ itemCount: 50,
304
+ source: SUBTITLE_FREQUENCY_LIST,
305
+ }, () => import("./json/a2/a2-vocabulary-11.json")),
306
+ jsonDescriptor({
307
+ id: "a2-vocabulary-12",
308
+ name: "A2 Frequency Band 12 (551-600)",
309
+ description: "A2 level Vietnamese frequency vocabulary",
310
+ examGrade: "A2",
311
+ category: "general",
312
+ difficulty: "intermediate",
313
+ itemCount: 50,
314
+ source: SUBTITLE_FREQUENCY_LIST,
315
+ }, () => import("./json/a2/a2-vocabulary-12.json")),
316
+ jsonDescriptor({
317
+ id: "b1-vocabulary-01",
318
+ name: "B1 Frequency Band 1 (1-50)",
319
+ description: "B1 level Vietnamese frequency vocabulary",
320
+ examGrade: "B1",
321
+ category: "general",
322
+ difficulty: "intermediate",
323
+ itemCount: 50,
324
+ source: SUBTITLE_FREQUENCY_LIST,
325
+ }, () => import("./json/b1/b1-vocabulary-01.json")),
326
+ jsonDescriptor({
327
+ id: "b1-vocabulary-02",
328
+ name: "B1 Frequency Band 2 (51-100)",
329
+ description: "B1 level Vietnamese frequency vocabulary",
330
+ examGrade: "B1",
331
+ category: "general",
332
+ difficulty: "intermediate",
333
+ itemCount: 50,
334
+ source: SUBTITLE_FREQUENCY_LIST,
335
+ }, () => import("./json/b1/b1-vocabulary-02.json")),
336
+ jsonDescriptor({
337
+ id: "b1-vocabulary-03",
338
+ name: "B1 Frequency Band 3 (101-150)",
339
+ description: "B1 level Vietnamese frequency vocabulary",
340
+ examGrade: "B1",
341
+ category: "general",
342
+ difficulty: "intermediate",
343
+ itemCount: 50,
344
+ source: SUBTITLE_FREQUENCY_LIST,
345
+ }, () => import("./json/b1/b1-vocabulary-03.json")),
346
+ jsonDescriptor({
347
+ id: "b1-vocabulary-04",
348
+ name: "B1 Frequency Band 4 (151-200)",
349
+ description: "B1 level Vietnamese frequency vocabulary",
350
+ examGrade: "B1",
351
+ category: "general",
352
+ difficulty: "intermediate",
353
+ itemCount: 50,
354
+ source: SUBTITLE_FREQUENCY_LIST,
355
+ }, () => import("./json/b1/b1-vocabulary-04.json")),
356
+ jsonDescriptor({
357
+ id: "b1-vocabulary-05",
358
+ name: "B1 Frequency Band 5 (201-250)",
359
+ description: "B1 level Vietnamese frequency vocabulary",
360
+ examGrade: "B1",
361
+ category: "general",
362
+ difficulty: "intermediate",
363
+ itemCount: 50,
364
+ source: SUBTITLE_FREQUENCY_LIST,
365
+ }, () => import("./json/b1/b1-vocabulary-05.json")),
366
+ jsonDescriptor({
367
+ id: "b1-vocabulary-06",
368
+ name: "B1 Frequency Band 6 (251-300)",
369
+ description: "B1 level Vietnamese frequency vocabulary",
370
+ examGrade: "B1",
371
+ category: "general",
372
+ difficulty: "intermediate",
373
+ itemCount: 50,
374
+ source: SUBTITLE_FREQUENCY_LIST,
375
+ }, () => import("./json/b1/b1-vocabulary-06.json")),
376
+ jsonDescriptor({
377
+ id: "b1-vocabulary-07",
378
+ name: "B1 Frequency Band 7 (301-350)",
379
+ description: "B1 level Vietnamese frequency vocabulary",
380
+ examGrade: "B1",
381
+ category: "general",
382
+ difficulty: "intermediate",
383
+ itemCount: 50,
384
+ source: SUBTITLE_FREQUENCY_LIST,
385
+ }, () => import("./json/b1/b1-vocabulary-07.json")),
386
+ jsonDescriptor({
387
+ id: "b1-vocabulary-08",
388
+ name: "B1 Frequency Band 8 (351-400)",
389
+ description: "B1 level Vietnamese frequency vocabulary",
390
+ examGrade: "B1",
391
+ category: "general",
392
+ difficulty: "intermediate",
393
+ itemCount: 50,
394
+ source: SUBTITLE_FREQUENCY_LIST,
395
+ }, () => import("./json/b1/b1-vocabulary-08.json")),
396
+ jsonDescriptor({
397
+ id: "b1-vocabulary-09",
398
+ name: "B1 Frequency Band 9 (401-450)",
399
+ description: "B1 level Vietnamese frequency vocabulary",
400
+ examGrade: "B1",
401
+ category: "general",
402
+ difficulty: "intermediate",
403
+ itemCount: 50,
404
+ source: SUBTITLE_FREQUENCY_LIST,
405
+ }, () => import("./json/b1/b1-vocabulary-09.json")),
406
+ jsonDescriptor({
407
+ id: "b1-vocabulary-10",
408
+ name: "B1 Frequency Band 10 (451-500)",
409
+ description: "B1 level Vietnamese frequency vocabulary",
410
+ examGrade: "B1",
411
+ category: "general",
412
+ difficulty: "intermediate",
413
+ itemCount: 50,
414
+ source: SUBTITLE_FREQUENCY_LIST,
415
+ }, () => import("./json/b1/b1-vocabulary-10.json")),
416
+ jsonDescriptor({
417
+ id: "b1-vocabulary-11",
418
+ name: "B1 Frequency Band 11 (501-550)",
419
+ description: "B1 level Vietnamese frequency vocabulary",
420
+ examGrade: "B1",
421
+ category: "general",
422
+ difficulty: "intermediate",
423
+ itemCount: 50,
424
+ source: SUBTITLE_FREQUENCY_LIST,
425
+ }, () => import("./json/b1/b1-vocabulary-11.json")),
426
+ jsonDescriptor({
427
+ id: "b1-vocabulary-12",
428
+ name: "B1 Frequency Band 12 (551-600)",
429
+ description: "B1 level Vietnamese frequency vocabulary",
430
+ examGrade: "B1",
431
+ category: "general",
432
+ difficulty: "intermediate",
433
+ itemCount: 50,
434
+ source: SUBTITLE_FREQUENCY_LIST,
435
+ }, () => import("./json/b1/b1-vocabulary-12.json")),
436
+ jsonDescriptor({
437
+ id: "b1-vocabulary-13",
438
+ name: "B1 Frequency Band 13 (601-650)",
439
+ description: "B1 level Vietnamese frequency vocabulary",
440
+ examGrade: "B1",
441
+ category: "general",
442
+ difficulty: "intermediate",
443
+ itemCount: 50,
444
+ source: SUBTITLE_FREQUENCY_LIST,
445
+ }, () => import("./json/b1/b1-vocabulary-13.json")),
446
+ jsonDescriptor({
447
+ id: "b1-vocabulary-14",
448
+ name: "B1 Frequency Band 14 (651-700)",
449
+ description: "B1 level Vietnamese frequency vocabulary",
450
+ examGrade: "B1",
451
+ category: "general",
452
+ difficulty: "intermediate",
453
+ itemCount: 50,
454
+ source: SUBTITLE_FREQUENCY_LIST,
455
+ }, () => import("./json/b1/b1-vocabulary-14.json")),
456
+ jsonDescriptor({
457
+ id: "b1-vocabulary-15",
458
+ name: "B1 Frequency Band 15 (701-750)",
459
+ description: "B1 level Vietnamese frequency vocabulary",
460
+ examGrade: "B1",
461
+ category: "general",
462
+ difficulty: "intermediate",
463
+ itemCount: 50,
464
+ source: SUBTITLE_FREQUENCY_LIST,
465
+ }, () => import("./json/b1/b1-vocabulary-15.json")),
466
+ jsonDescriptor({
467
+ id: "b1-vocabulary-16",
468
+ name: "B1 Frequency Band 16 (751-800)",
469
+ description: "B1 level Vietnamese frequency vocabulary",
470
+ examGrade: "B1",
471
+ category: "general",
472
+ difficulty: "intermediate",
473
+ itemCount: 50,
474
+ source: SUBTITLE_FREQUENCY_LIST,
475
+ }, () => import("./json/b1/b1-vocabulary-16.json")),
476
+ jsonDescriptor({
477
+ id: "b1-vocabulary-17",
478
+ name: "B1 Frequency Band 17 (801-850)",
479
+ description: "B1 level Vietnamese frequency vocabulary",
480
+ examGrade: "B1",
481
+ category: "general",
482
+ difficulty: "intermediate",
483
+ itemCount: 50,
484
+ source: SUBTITLE_FREQUENCY_LIST,
485
+ }, () => import("./json/b1/b1-vocabulary-17.json")),
486
+ jsonDescriptor({
487
+ id: "b1-vocabulary-18",
488
+ name: "B1 Frequency Band 18 (851-900)",
489
+ description: "B1 level Vietnamese frequency vocabulary",
490
+ examGrade: "B1",
491
+ category: "general",
492
+ difficulty: "intermediate",
493
+ itemCount: 50,
494
+ source: SUBTITLE_FREQUENCY_LIST,
495
+ }, () => import("./json/b1/b1-vocabulary-18.json")),
496
+ jsonDescriptor({
497
+ id: "b1-vocabulary-19",
498
+ name: "B1 Frequency Band 19 (901-950)",
499
+ description: "B1 level Vietnamese frequency vocabulary",
500
+ examGrade: "B1",
501
+ category: "general",
502
+ difficulty: "intermediate",
503
+ itemCount: 50,
504
+ source: SUBTITLE_FREQUENCY_LIST,
505
+ }, () => import("./json/b1/b1-vocabulary-19.json")),
506
+ jsonDescriptor({
507
+ id: "b1-vocabulary-20",
508
+ name: "B1 Frequency Band 20 (951-1000)",
509
+ description: "B1 level Vietnamese frequency vocabulary",
510
+ examGrade: "B1",
511
+ category: "general",
512
+ difficulty: "intermediate",
513
+ itemCount: 50,
514
+ source: SUBTITLE_FREQUENCY_LIST,
515
+ }, () => import("./json/b1/b1-vocabulary-20.json")),
516
+ jsonDescriptor({
517
+ id: "b1-vocabulary-21",
518
+ name: "B1 Frequency Band 21 (1001-1050)",
519
+ description: "B1 level Vietnamese frequency vocabulary",
520
+ examGrade: "B1",
521
+ category: "general",
522
+ difficulty: "intermediate",
523
+ itemCount: 50,
524
+ source: SUBTITLE_FREQUENCY_LIST,
525
+ }, () => import("./json/b1/b1-vocabulary-21.json")),
526
+ jsonDescriptor({
527
+ id: "b1-vocabulary-22",
528
+ name: "B1 Frequency Band 22 (1051-1100)",
529
+ description: "B1 level Vietnamese frequency vocabulary",
530
+ examGrade: "B1",
531
+ category: "general",
532
+ difficulty: "intermediate",
533
+ itemCount: 50,
534
+ source: SUBTITLE_FREQUENCY_LIST,
535
+ }, () => import("./json/b1/b1-vocabulary-22.json")),
536
+ jsonDescriptor({
537
+ id: "b1-vocabulary-23",
538
+ name: "B1 Frequency Band 23 (1101-1150)",
539
+ description: "B1 level Vietnamese frequency vocabulary",
540
+ examGrade: "B1",
541
+ category: "general",
542
+ difficulty: "intermediate",
543
+ itemCount: 50,
544
+ source: SUBTITLE_FREQUENCY_LIST,
545
+ }, () => import("./json/b1/b1-vocabulary-23.json")),
546
+ jsonDescriptor({
547
+ id: "b1-vocabulary-24",
548
+ name: "B1 Frequency Band 24 (1151-1200)",
549
+ description: "B1 level Vietnamese frequency vocabulary",
550
+ examGrade: "B1",
551
+ category: "general",
552
+ difficulty: "intermediate",
553
+ itemCount: 49,
554
+ source: SUBTITLE_FREQUENCY_LIST,
555
+ }, () => import("./json/b1/b1-vocabulary-24.json")),
556
+ ] as const;
557
+
558
+ export const vietnameseWordListCatalog = createWordListCatalog([...descriptors]);
559
+
560
+ // Backward-compatible re-exports (deprecated — prefer catalog API)
561
+ export const {
562
+ getDescriptorById,
563
+ getDescriptorsByExamGrade,
564
+ getDescriptorsByCategory,
565
+ getDescriptorsByDifficulty,
566
+ getCategories,
567
+ } = vietnameseWordListCatalog;
568
+
569
+ export type { ExamGrade, WordListDifficulty, WordListItem, WordListSet };