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

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 (211) hide show
  1. package/package.json +1 -1
  2. package/src/index.ts +569 -569
  3. package/src/json/a1/a1-vocabulary-01.json +411 -411
  4. package/src/json/a1/a1-vocabulary-02.json +411 -411
  5. package/src/json/a1/a1-vocabulary-03.json +411 -411
  6. package/src/json/a1/a1-vocabulary-04.json +419 -419
  7. package/src/json/a2/a2-vocabulary-01.json +411 -411
  8. package/src/json/a2/a2-vocabulary-02.json +411 -411
  9. package/src/json/a2/a2-vocabulary-03.json +411 -411
  10. package/src/json/a2/a2-vocabulary-04.json +411 -411
  11. package/src/json/a2/a2-vocabulary-05.json +411 -411
  12. package/src/json/a2/a2-vocabulary-06.json +411 -411
  13. package/src/json/a2/a2-vocabulary-07.json +411 -411
  14. package/src/json/a2/a2-vocabulary-08.json +411 -411
  15. package/src/json/a2/a2-vocabulary-09.json +411 -411
  16. package/src/json/a2/a2-vocabulary-10.json +411 -411
  17. package/src/json/a2/a2-vocabulary-11.json +411 -411
  18. package/src/json/a2/a2-vocabulary-12.json +411 -411
  19. package/src/json/b1/b1-vocabulary-01.json +411 -411
  20. package/src/json/b1/b1-vocabulary-02.json +411 -411
  21. package/src/json/b1/b1-vocabulary-03.json +411 -411
  22. package/src/json/b1/b1-vocabulary-04.json +411 -411
  23. package/src/json/b1/b1-vocabulary-05.json +411 -411
  24. package/src/json/b1/b1-vocabulary-06.json +411 -411
  25. package/src/json/b1/b1-vocabulary-07.json +411 -411
  26. package/src/json/b1/b1-vocabulary-08.json +411 -411
  27. package/src/json/b1/b1-vocabulary-09.json +411 -411
  28. package/src/json/b1/b1-vocabulary-10.json +411 -411
  29. package/src/json/b1/b1-vocabulary-11.json +411 -411
  30. package/src/json/b1/b1-vocabulary-12.json +411 -411
  31. package/src/json/b1/b1-vocabulary-13.json +411 -411
  32. package/src/json/b1/b1-vocabulary-14.json +411 -411
  33. package/src/json/b1/b1-vocabulary-15.json +411 -411
  34. package/src/json/b1/b1-vocabulary-16.json +411 -411
  35. package/src/json/b1/b1-vocabulary-17.json +411 -411
  36. package/src/json/b1/b1-vocabulary-18.json +411 -411
  37. package/src/json/b1/b1-vocabulary-19.json +411 -411
  38. package/src/json/b1/b1-vocabulary-20.json +411 -411
  39. package/src/json/b1/b1-vocabulary-21.json +411 -411
  40. package/src/json/b1/b1-vocabulary-22.json +411 -411
  41. package/src/json/b1/b1-vocabulary-23.json +411 -411
  42. package/src/json/b1/b1-vocabulary-24.json +403 -403
  43. package/dist/a1-vocabulary-01-DkApdwc5.js +0 -417
  44. package/dist/a1-vocabulary-01-DkApdwc5.js.map +0 -1
  45. package/dist/a1-vocabulary-02-DWFR43qH.js +0 -417
  46. package/dist/a1-vocabulary-02-DWFR43qH.js.map +0 -1
  47. package/dist/a1-vocabulary-03-DRFWCfmP.js +0 -417
  48. package/dist/a1-vocabulary-03-DRFWCfmP.js.map +0 -1
  49. package/dist/a1-vocabulary-04-BG3wU_GD.js +0 -425
  50. package/dist/a1-vocabulary-04-BG3wU_GD.js.map +0 -1
  51. package/dist/a2-vocabulary-01-BvayhMGP.js +0 -417
  52. package/dist/a2-vocabulary-01-BvayhMGP.js.map +0 -1
  53. package/dist/a2-vocabulary-02-BOnrtBmL.js +0 -417
  54. package/dist/a2-vocabulary-02-BOnrtBmL.js.map +0 -1
  55. package/dist/a2-vocabulary-03-6ay88srv.js +0 -417
  56. package/dist/a2-vocabulary-03-6ay88srv.js.map +0 -1
  57. package/dist/a2-vocabulary-04-ukmGr9rc.js +0 -417
  58. package/dist/a2-vocabulary-04-ukmGr9rc.js.map +0 -1
  59. package/dist/a2-vocabulary-05-oAxmpsUQ.js +0 -417
  60. package/dist/a2-vocabulary-05-oAxmpsUQ.js.map +0 -1
  61. package/dist/a2-vocabulary-06-Bfp7zhPf.js +0 -417
  62. package/dist/a2-vocabulary-06-Bfp7zhPf.js.map +0 -1
  63. package/dist/a2-vocabulary-07-D2V3bY78.js +0 -417
  64. package/dist/a2-vocabulary-07-D2V3bY78.js.map +0 -1
  65. package/dist/a2-vocabulary-08-B081QwtI.js +0 -417
  66. package/dist/a2-vocabulary-08-B081QwtI.js.map +0 -1
  67. package/dist/a2-vocabulary-09-D3oZl1x7.js +0 -417
  68. package/dist/a2-vocabulary-09-D3oZl1x7.js.map +0 -1
  69. package/dist/a2-vocabulary-10-GOfTyNQ0.js +0 -417
  70. package/dist/a2-vocabulary-10-GOfTyNQ0.js.map +0 -1
  71. package/dist/a2-vocabulary-11-BSbghXOM.js +0 -417
  72. package/dist/a2-vocabulary-11-BSbghXOM.js.map +0 -1
  73. package/dist/a2-vocabulary-12-CzNCmckp.js +0 -417
  74. package/dist/a2-vocabulary-12-CzNCmckp.js.map +0 -1
  75. package/dist/abstract-concepts-KNlFYB8f.js +0 -90
  76. package/dist/abstract-concepts-KNlFYB8f.js.map +0 -1
  77. package/dist/b1-vocabulary-01-Bm9ZIMBE.js +0 -417
  78. package/dist/b1-vocabulary-01-Bm9ZIMBE.js.map +0 -1
  79. package/dist/b1-vocabulary-02-ClfT72Yp.js +0 -417
  80. package/dist/b1-vocabulary-02-ClfT72Yp.js.map +0 -1
  81. package/dist/b1-vocabulary-03-BInffiGG.js +0 -417
  82. package/dist/b1-vocabulary-03-BInffiGG.js.map +0 -1
  83. package/dist/b1-vocabulary-04-0wG09twP.js +0 -417
  84. package/dist/b1-vocabulary-04-0wG09twP.js.map +0 -1
  85. package/dist/b1-vocabulary-05-MrDkdCbh.js +0 -417
  86. package/dist/b1-vocabulary-05-MrDkdCbh.js.map +0 -1
  87. package/dist/b1-vocabulary-06-uyXDLJa6.js +0 -417
  88. package/dist/b1-vocabulary-06-uyXDLJa6.js.map +0 -1
  89. package/dist/b1-vocabulary-07-0Q9DCwsk.js +0 -417
  90. package/dist/b1-vocabulary-07-0Q9DCwsk.js.map +0 -1
  91. package/dist/b1-vocabulary-08-Cx9Giw8r.js +0 -417
  92. package/dist/b1-vocabulary-08-Cx9Giw8r.js.map +0 -1
  93. package/dist/b1-vocabulary-09-Bdf0_vRF.js +0 -417
  94. package/dist/b1-vocabulary-09-Bdf0_vRF.js.map +0 -1
  95. package/dist/b1-vocabulary-10-DgkE3aUr.js +0 -417
  96. package/dist/b1-vocabulary-10-DgkE3aUr.js.map +0 -1
  97. package/dist/b1-vocabulary-11-BtbOvYEA.js +0 -417
  98. package/dist/b1-vocabulary-11-BtbOvYEA.js.map +0 -1
  99. package/dist/b1-vocabulary-12-DhsAY-fb.js +0 -417
  100. package/dist/b1-vocabulary-12-DhsAY-fb.js.map +0 -1
  101. package/dist/b1-vocabulary-13-DahuIhzT.js +0 -417
  102. package/dist/b1-vocabulary-13-DahuIhzT.js.map +0 -1
  103. package/dist/b1-vocabulary-14-CNtBzVbj.js +0 -417
  104. package/dist/b1-vocabulary-14-CNtBzVbj.js.map +0 -1
  105. package/dist/b1-vocabulary-15-DTkPzQt9.js +0 -417
  106. package/dist/b1-vocabulary-15-DTkPzQt9.js.map +0 -1
  107. package/dist/b1-vocabulary-16-DjWPRN4R.js +0 -417
  108. package/dist/b1-vocabulary-16-DjWPRN4R.js.map +0 -1
  109. package/dist/b1-vocabulary-17-CtEw6s11.js +0 -417
  110. package/dist/b1-vocabulary-17-CtEw6s11.js.map +0 -1
  111. package/dist/b1-vocabulary-18-oHrVWgvy.js +0 -417
  112. package/dist/b1-vocabulary-18-oHrVWgvy.js.map +0 -1
  113. package/dist/b1-vocabulary-19-CJL9dY39.js +0 -417
  114. package/dist/b1-vocabulary-19-CJL9dY39.js.map +0 -1
  115. package/dist/b1-vocabulary-20-CkCK3v5F.js +0 -417
  116. package/dist/b1-vocabulary-20-CkCK3v5F.js.map +0 -1
  117. package/dist/b1-vocabulary-21-DC7mnzou.js +0 -417
  118. package/dist/b1-vocabulary-21-DC7mnzou.js.map +0 -1
  119. package/dist/b1-vocabulary-22-TA2ZbEGq.js +0 -417
  120. package/dist/b1-vocabulary-22-TA2ZbEGq.js.map +0 -1
  121. package/dist/b1-vocabulary-23-GXvUq-lw.js +0 -417
  122. package/dist/b1-vocabulary-23-GXvUq-lw.js.map +0 -1
  123. package/dist/b1-vocabulary-24-DG99cDKl.js +0 -409
  124. package/dist/b1-vocabulary-24-DG99cDKl.js.map +0 -1
  125. package/dist/basic-greetings-D6zZUiZN.js +0 -65
  126. package/dist/basic-greetings-D6zZUiZN.js.map +0 -1
  127. package/dist/body-parts-Cd5RZQ8b.js +0 -115
  128. package/dist/body-parts-Cd5RZQ8b.js.map +0 -1
  129. package/dist/clothing-CAlp3Oh2.js +0 -90
  130. package/dist/clothing-CAlp3Oh2.js.map +0 -1
  131. package/dist/colors-2SRz-V9K.js +0 -65
  132. package/dist/colors-2SRz-V9K.js.map +0 -1
  133. package/dist/emotions-CzjzZipP.js +0 -90
  134. package/dist/emotions-CzjzZipP.js.map +0 -1
  135. package/dist/family-members-DVusKf9y.js +0 -55
  136. package/dist/family-members-DVusKf9y.js.map +0 -1
  137. package/dist/food-basics-fIJkEI5s.js +0 -65
  138. package/dist/food-basics-fIJkEI5s.js.map +0 -1
  139. package/dist/index.d.ts +0 -5
  140. package/dist/index.d.ts.map +0 -1
  141. package/dist/index.js +0 -541
  142. package/dist/index.js.map +0 -1
  143. package/dist/index.test.d.ts +0 -2
  144. package/dist/index.test.d.ts.map +0 -1
  145. package/dist/json/a1/a1-vocabulary-01.json +0 -412
  146. package/dist/json/a1/a1-vocabulary-02.json +0 -412
  147. package/dist/json/a1/a1-vocabulary-03.json +0 -412
  148. package/dist/json/a1/a1-vocabulary-04.json +0 -420
  149. package/dist/json/a1/basic-greetings.json +0 -60
  150. package/dist/json/a1/colors.json +0 -60
  151. package/dist/json/a1/family-members.json +0 -50
  152. package/dist/json/a1/food-basics.json +0 -60
  153. package/dist/json/a1/numbers-1-10.json +0 -60
  154. package/dist/json/a2/a2-vocabulary-01.json +0 -412
  155. package/dist/json/a2/a2-vocabulary-02.json +0 -412
  156. package/dist/json/a2/a2-vocabulary-03.json +0 -412
  157. package/dist/json/a2/a2-vocabulary-04.json +0 -412
  158. package/dist/json/a2/a2-vocabulary-05.json +0 -412
  159. package/dist/json/a2/a2-vocabulary-06.json +0 -412
  160. package/dist/json/a2/a2-vocabulary-07.json +0 -412
  161. package/dist/json/a2/a2-vocabulary-08.json +0 -412
  162. package/dist/json/a2/a2-vocabulary-09.json +0 -412
  163. package/dist/json/a2/a2-vocabulary-10.json +0 -412
  164. package/dist/json/a2/a2-vocabulary-11.json +0 -412
  165. package/dist/json/a2/a2-vocabulary-12.json +0 -412
  166. package/dist/json/a2/body-parts.json +0 -110
  167. package/dist/json/a2/clothing.json +0 -85
  168. package/dist/json/a2/places.json +0 -85
  169. package/dist/json/b1/b1-vocabulary-01.json +0 -412
  170. package/dist/json/b1/b1-vocabulary-02.json +0 -412
  171. package/dist/json/b1/b1-vocabulary-03.json +0 -412
  172. package/dist/json/b1/b1-vocabulary-04.json +0 -412
  173. package/dist/json/b1/b1-vocabulary-05.json +0 -412
  174. package/dist/json/b1/b1-vocabulary-06.json +0 -412
  175. package/dist/json/b1/b1-vocabulary-07.json +0 -412
  176. package/dist/json/b1/b1-vocabulary-08.json +0 -412
  177. package/dist/json/b1/b1-vocabulary-09.json +0 -412
  178. package/dist/json/b1/b1-vocabulary-10.json +0 -412
  179. package/dist/json/b1/b1-vocabulary-11.json +0 -412
  180. package/dist/json/b1/b1-vocabulary-12.json +0 -412
  181. package/dist/json/b1/b1-vocabulary-13.json +0 -412
  182. package/dist/json/b1/b1-vocabulary-14.json +0 -412
  183. package/dist/json/b1/b1-vocabulary-15.json +0 -412
  184. package/dist/json/b1/b1-vocabulary-16.json +0 -412
  185. package/dist/json/b1/b1-vocabulary-17.json +0 -412
  186. package/dist/json/b1/b1-vocabulary-18.json +0 -412
  187. package/dist/json/b1/b1-vocabulary-19.json +0 -412
  188. package/dist/json/b1/b1-vocabulary-20.json +0 -412
  189. package/dist/json/b1/b1-vocabulary-21.json +0 -412
  190. package/dist/json/b1/b1-vocabulary-22.json +0 -412
  191. package/dist/json/b1/b1-vocabulary-23.json +0 -412
  192. package/dist/json/b1/b1-vocabulary-24.json +0 -404
  193. package/dist/json/b1/emotions.json +0 -85
  194. package/dist/json/b1/professions.json +0 -85
  195. package/dist/json/b1/weather.json +0 -85
  196. package/dist/json/b2/abstract-concepts.json +0 -85
  197. package/dist/json/pre-a1/survival-phrases.json +0 -100
  198. package/dist/levels/a1.d.ts +0 -10
  199. package/dist/levels/a1.d.ts.map +0 -1
  200. package/dist/levels/a1.js +0 -7
  201. package/dist/levels/a1.js.map +0 -1
  202. package/dist/numbers-1-10-3UZLCKyp.js +0 -65
  203. package/dist/numbers-1-10-3UZLCKyp.js.map +0 -1
  204. package/dist/places-CF2IKsXX.js +0 -90
  205. package/dist/places-CF2IKsXX.js.map +0 -1
  206. package/dist/professions-DtpFIeQk.js +0 -90
  207. package/dist/professions-DtpFIeQk.js.map +0 -1
  208. package/dist/survival-phrases-CiRt_AYV.js +0 -105
  209. package/dist/survival-phrases-CiRt_AYV.js.map +0 -1
  210. package/dist/weather-CeIruwIc.js +0 -90
  211. package/dist/weather-CeIruwIc.js.map +0 -1
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-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 };