n2words 1.23.1 → 2.0.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 (322) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +317 -59
  3. package/dist/ArabicConverter.js +3 -0
  4. package/dist/ArabicConverter.js.map +1 -0
  5. package/dist/AzerbaijaniConverter.js +3 -0
  6. package/dist/AzerbaijaniConverter.js.map +1 -0
  7. package/dist/BanglaConverter.js +3 -0
  8. package/dist/BanglaConverter.js.map +1 -0
  9. package/dist/BiblicalHebrewConverter.js +3 -0
  10. package/dist/BiblicalHebrewConverter.js.map +1 -0
  11. package/dist/CroatianConverter.js +3 -0
  12. package/dist/CroatianConverter.js.map +1 -0
  13. package/dist/CzechConverter.js +3 -0
  14. package/dist/CzechConverter.js.map +1 -0
  15. package/dist/DanishConverter.js +3 -0
  16. package/dist/DanishConverter.js.map +1 -0
  17. package/dist/DutchConverter.js +3 -0
  18. package/dist/DutchConverter.js.map +1 -0
  19. package/dist/EnglishConverter.js +3 -0
  20. package/dist/EnglishConverter.js.map +1 -0
  21. package/dist/FilipinoConverter.js +3 -0
  22. package/dist/FilipinoConverter.js.map +1 -0
  23. package/dist/FrenchBelgiumConverter.js +3 -0
  24. package/dist/FrenchBelgiumConverter.js.map +1 -0
  25. package/dist/FrenchConverter.js +3 -0
  26. package/dist/FrenchConverter.js.map +1 -0
  27. package/dist/GermanConverter.js +3 -0
  28. package/dist/GermanConverter.js.map +1 -0
  29. package/dist/GreekConverter.js +3 -0
  30. package/dist/GreekConverter.js.map +1 -0
  31. package/dist/GujaratiConverter.js +3 -0
  32. package/dist/GujaratiConverter.js.map +1 -0
  33. package/dist/HebrewConverter.js +3 -0
  34. package/dist/HebrewConverter.js.map +1 -0
  35. package/dist/HindiConverter.js +3 -0
  36. package/dist/HindiConverter.js.map +1 -0
  37. package/dist/HungarianConverter.js +3 -0
  38. package/dist/HungarianConverter.js.map +1 -0
  39. package/dist/IndonesianConverter.js +3 -0
  40. package/dist/IndonesianConverter.js.map +1 -0
  41. package/dist/ItalianConverter.js +3 -0
  42. package/dist/ItalianConverter.js.map +1 -0
  43. package/dist/JapaneseConverter.js +3 -0
  44. package/dist/JapaneseConverter.js.map +1 -0
  45. package/dist/KannadaConverter.js +3 -0
  46. package/dist/KannadaConverter.js.map +1 -0
  47. package/dist/KoreanConverter.js +3 -0
  48. package/dist/KoreanConverter.js.map +1 -0
  49. package/dist/LatvianConverter.js +3 -0
  50. package/dist/LatvianConverter.js.map +1 -0
  51. package/dist/LithuanianConverter.js +3 -0
  52. package/dist/LithuanianConverter.js.map +1 -0
  53. package/dist/MalayConverter.js +3 -0
  54. package/dist/MalayConverter.js.map +1 -0
  55. package/dist/MarathiConverter.js +3 -0
  56. package/dist/MarathiConverter.js.map +1 -0
  57. package/dist/NorwegianBokmalConverter.js +3 -0
  58. package/dist/NorwegianBokmalConverter.js.map +1 -0
  59. package/dist/PersianConverter.js +3 -0
  60. package/dist/PersianConverter.js.map +1 -0
  61. package/dist/PolishConverter.js +3 -0
  62. package/dist/PolishConverter.js.map +1 -0
  63. package/dist/PortugueseConverter.js +3 -0
  64. package/dist/PortugueseConverter.js.map +1 -0
  65. package/dist/PunjabiConverter.js +3 -0
  66. package/dist/PunjabiConverter.js.map +1 -0
  67. package/dist/RomanianConverter.js +3 -0
  68. package/dist/RomanianConverter.js.map +1 -0
  69. package/dist/RussianConverter.js +3 -0
  70. package/dist/RussianConverter.js.map +1 -0
  71. package/dist/SerbianCyrillicConverter.js +3 -0
  72. package/dist/SerbianCyrillicConverter.js.map +1 -0
  73. package/dist/SerbianLatinConverter.js +3 -0
  74. package/dist/SerbianLatinConverter.js.map +1 -0
  75. package/dist/SimplifiedChineseConverter.js +3 -0
  76. package/dist/SimplifiedChineseConverter.js.map +1 -0
  77. package/dist/SpanishConverter.js +3 -0
  78. package/dist/SpanishConverter.js.map +1 -0
  79. package/dist/SwahiliConverter.js +3 -0
  80. package/dist/SwahiliConverter.js.map +1 -0
  81. package/dist/SwedishConverter.js +3 -0
  82. package/dist/SwedishConverter.js.map +1 -0
  83. package/dist/TamilConverter.js +3 -0
  84. package/dist/TamilConverter.js.map +1 -0
  85. package/dist/TeluguConverter.js +3 -0
  86. package/dist/TeluguConverter.js.map +1 -0
  87. package/dist/ThaiConverter.js +3 -0
  88. package/dist/ThaiConverter.js.map +1 -0
  89. package/dist/TraditionalChineseConverter.js +3 -0
  90. package/dist/TraditionalChineseConverter.js.map +1 -0
  91. package/dist/TurkishConverter.js +3 -0
  92. package/dist/TurkishConverter.js.map +1 -0
  93. package/dist/UkrainianConverter.js +3 -0
  94. package/dist/UkrainianConverter.js.map +1 -0
  95. package/dist/UrduConverter.js +3 -0
  96. package/dist/UrduConverter.js.map +1 -0
  97. package/dist/VietnameseConverter.js +3 -0
  98. package/dist/VietnameseConverter.js.map +1 -0
  99. package/dist/n2words.js +3 -2
  100. package/dist/n2words.js.map +1 -1
  101. package/lib/classes/abstract-language.d.ts +158 -34
  102. package/lib/classes/abstract-language.js +223 -115
  103. package/lib/classes/greedy-scale-language.d.ts +109 -0
  104. package/lib/classes/greedy-scale-language.js +201 -0
  105. package/lib/classes/slavic-language.d.ts +148 -0
  106. package/lib/classes/slavic-language.js +281 -0
  107. package/lib/classes/south-asian-language.d.ts +70 -0
  108. package/lib/classes/south-asian-language.js +154 -0
  109. package/lib/classes/turkic-language.d.ts +26 -0
  110. package/lib/classes/turkic-language.js +59 -0
  111. package/lib/languages/ar.d.ts +30 -0
  112. package/lib/languages/ar.js +159 -0
  113. package/lib/languages/az.d.ts +12 -0
  114. package/lib/languages/az.js +42 -0
  115. package/lib/languages/bn.d.ts +11 -0
  116. package/lib/languages/bn.js +131 -0
  117. package/lib/languages/cs.d.ts +88 -0
  118. package/lib/languages/cs.js +143 -0
  119. package/lib/languages/da.d.ts +15 -0
  120. package/lib/languages/da.js +120 -0
  121. package/lib/languages/de.d.ts +14 -0
  122. package/lib/languages/de.js +101 -0
  123. package/lib/languages/el.d.ts +14 -0
  124. package/lib/languages/el.js +90 -0
  125. package/lib/languages/en.d.ts +16 -0
  126. package/lib/languages/en.js +86 -0
  127. package/lib/languages/es.d.ts +15 -0
  128. package/lib/languages/es.js +121 -0
  129. package/lib/languages/fa.d.ts +47 -0
  130. package/lib/languages/fa.js +144 -0
  131. package/lib/languages/fil.d.ts +16 -0
  132. package/lib/languages/fil.js +121 -0
  133. package/lib/languages/fr-BE.d.ts +11 -0
  134. package/lib/languages/fr-BE.js +25 -0
  135. package/lib/languages/fr.d.ts +15 -0
  136. package/lib/languages/fr.js +106 -0
  137. package/lib/languages/gu.d.ts +11 -0
  138. package/lib/languages/gu.js +132 -0
  139. package/lib/languages/hbo.d.ts +113 -0
  140. package/lib/languages/hbo.js +251 -0
  141. package/lib/languages/he.d.ts +80 -0
  142. package/lib/languages/he.js +206 -0
  143. package/lib/languages/hi.d.ts +11 -0
  144. package/lib/languages/hi.js +131 -0
  145. package/lib/languages/hr.d.ts +80 -0
  146. package/lib/languages/hr.js +113 -0
  147. package/lib/languages/hu.d.ts +22 -0
  148. package/lib/languages/hu.js +137 -0
  149. package/lib/languages/id.d.ts +37 -0
  150. package/lib/languages/id.js +159 -0
  151. package/lib/languages/it.d.ts +37 -0
  152. package/lib/languages/it.js +132 -0
  153. package/lib/languages/ja.d.ts +17 -0
  154. package/lib/languages/ja.js +137 -0
  155. package/lib/languages/kn.d.ts +11 -0
  156. package/lib/languages/kn.js +42 -0
  157. package/lib/languages/ko.d.ts +14 -0
  158. package/lib/languages/ko.js +55 -0
  159. package/lib/{i18n/pl.d.ts → languages/lt.d.ts} +18 -15
  160. package/lib/languages/lt.js +136 -0
  161. package/lib/{i18n/lt.d.ts → languages/lv.d.ts} +16 -14
  162. package/lib/languages/lv.js +130 -0
  163. package/lib/languages/mr.d.ts +11 -0
  164. package/lib/languages/mr.js +132 -0
  165. package/lib/languages/ms.d.ts +31 -0
  166. package/lib/languages/ms.js +150 -0
  167. package/lib/languages/nb.d.ts +12 -0
  168. package/lib/languages/nb.js +100 -0
  169. package/lib/languages/nl.d.ts +16 -0
  170. package/lib/languages/nl.js +155 -0
  171. package/lib/languages/pa.d.ts +11 -0
  172. package/lib/languages/pa.js +131 -0
  173. package/lib/{i18n/uk.d.ts → languages/pl.d.ts} +16 -14
  174. package/lib/languages/pl.js +110 -0
  175. package/lib/languages/pt.d.ts +29 -0
  176. package/lib/languages/pt.js +112 -0
  177. package/lib/languages/ro.d.ts +158 -0
  178. package/lib/languages/ro.js +273 -0
  179. package/lib/languages/ru.d.ts +85 -0
  180. package/lib/languages/ru.js +96 -0
  181. package/lib/languages/sr-Cyrl.d.ts +80 -0
  182. package/lib/languages/sr-Cyrl.js +113 -0
  183. package/lib/{i18n/cz.d.ts → languages/sr-Latn.d.ts} +26 -14
  184. package/lib/languages/sr-Latn.js +113 -0
  185. package/lib/languages/sv.d.ts +14 -0
  186. package/lib/languages/sv.js +90 -0
  187. package/lib/languages/sw.d.ts +39 -0
  188. package/lib/languages/sw.js +126 -0
  189. package/lib/languages/ta.d.ts +20 -0
  190. package/lib/languages/ta.js +226 -0
  191. package/lib/languages/te.d.ts +22 -0
  192. package/lib/languages/te.js +219 -0
  193. package/lib/languages/th.d.ts +17 -0
  194. package/lib/languages/th.js +117 -0
  195. package/lib/languages/tr.d.ts +12 -0
  196. package/lib/languages/tr.js +56 -0
  197. package/lib/languages/uk.d.ts +85 -0
  198. package/lib/{i18n → languages}/uk.js +33 -32
  199. package/lib/languages/ur.d.ts +11 -0
  200. package/lib/languages/ur.js +131 -0
  201. package/lib/{i18n → languages}/vi.d.ts +15 -13
  202. package/lib/languages/vi.js +147 -0
  203. package/lib/languages/zh-Hans.d.ts +21 -0
  204. package/lib/languages/zh-Hans.js +111 -0
  205. package/lib/languages/zh-Hant.d.ts +21 -0
  206. package/lib/languages/zh-Hant.js +111 -0
  207. package/lib/n2words.d.ts +207 -7
  208. package/lib/n2words.js +535 -81
  209. package/package.json +126 -79
  210. package/dist/ar.js +0 -2
  211. package/dist/ar.js.map +0 -1
  212. package/dist/az.js +0 -2
  213. package/dist/az.js.map +0 -1
  214. package/dist/cz.js +0 -2
  215. package/dist/cz.js.map +0 -1
  216. package/dist/de.js +0 -2
  217. package/dist/de.js.map +0 -1
  218. package/dist/dk.js +0 -2
  219. package/dist/dk.js.map +0 -1
  220. package/dist/en.js +0 -2
  221. package/dist/en.js.map +0 -1
  222. package/dist/es.js +0 -2
  223. package/dist/es.js.map +0 -1
  224. package/dist/fa.js +0 -2
  225. package/dist/fa.js.map +0 -1
  226. package/dist/fr-BE.js +0 -2
  227. package/dist/fr-BE.js.map +0 -1
  228. package/dist/fr.js +0 -2
  229. package/dist/fr.js.map +0 -1
  230. package/dist/he.js +0 -2
  231. package/dist/he.js.map +0 -1
  232. package/dist/hr.js +0 -2
  233. package/dist/hr.js.map +0 -1
  234. package/dist/hu.js +0 -2
  235. package/dist/hu.js.map +0 -1
  236. package/dist/id.js +0 -2
  237. package/dist/id.js.map +0 -1
  238. package/dist/it.js +0 -2
  239. package/dist/it.js.map +0 -1
  240. package/dist/ko.js +0 -2
  241. package/dist/ko.js.map +0 -1
  242. package/dist/lt.js +0 -2
  243. package/dist/lt.js.map +0 -1
  244. package/dist/lv.js +0 -2
  245. package/dist/lv.js.map +0 -1
  246. package/dist/n2words.d.ts +0 -2
  247. package/dist/nl.js +0 -2
  248. package/dist/nl.js.map +0 -1
  249. package/dist/no.js +0 -2
  250. package/dist/no.js.map +0 -1
  251. package/dist/pl.js +0 -2
  252. package/dist/pl.js.map +0 -1
  253. package/dist/pt.js +0 -2
  254. package/dist/pt.js.map +0 -1
  255. package/dist/ro.js +0 -2
  256. package/dist/ro.js.map +0 -1
  257. package/dist/ru.js +0 -2
  258. package/dist/ru.js.map +0 -1
  259. package/dist/sr.js +0 -2
  260. package/dist/sr.js.map +0 -1
  261. package/dist/tr.js +0 -2
  262. package/dist/tr.js.map +0 -1
  263. package/dist/uk.js +0 -2
  264. package/dist/uk.js.map +0 -1
  265. package/dist/vi.js +0 -2
  266. package/dist/vi.js.map +0 -1
  267. package/dist/zh.js +0 -2
  268. package/dist/zh.js.map +0 -1
  269. package/lib/classes/base-language.d.ts +0 -58
  270. package/lib/classes/base-language.js +0 -172
  271. package/lib/i18n/ar.d.ts +0 -41
  272. package/lib/i18n/ar.js +0 -209
  273. package/lib/i18n/az.d.ts +0 -15
  274. package/lib/i18n/az.js +0 -66
  275. package/lib/i18n/cz.js +0 -135
  276. package/lib/i18n/de.d.ts +0 -17
  277. package/lib/i18n/de.js +0 -103
  278. package/lib/i18n/dk.d.ts +0 -14
  279. package/lib/i18n/dk.js +0 -110
  280. package/lib/i18n/en.d.ts +0 -22
  281. package/lib/i18n/en.js +0 -86
  282. package/lib/i18n/es.d.ts +0 -16
  283. package/lib/i18n/es.js +0 -110
  284. package/lib/i18n/fa.d.ts +0 -54
  285. package/lib/i18n/fa.js +0 -106
  286. package/lib/i18n/fr-BE.d.ts +0 -11
  287. package/lib/i18n/fr-BE.js +0 -20
  288. package/lib/i18n/fr.d.ts +0 -15
  289. package/lib/i18n/fr.js +0 -99
  290. package/lib/i18n/he.d.ts +0 -61
  291. package/lib/i18n/he.js +0 -132
  292. package/lib/i18n/hr.d.ts +0 -68
  293. package/lib/i18n/hr.js +0 -129
  294. package/lib/i18n/hu.d.ts +0 -17
  295. package/lib/i18n/hu.js +0 -135
  296. package/lib/i18n/id.d.ts +0 -43
  297. package/lib/i18n/id.js +0 -156
  298. package/lib/i18n/it.d.ts +0 -29
  299. package/lib/i18n/it.js +0 -137
  300. package/lib/i18n/ko.d.ts +0 -15
  301. package/lib/i18n/ko.js +0 -56
  302. package/lib/i18n/lt.js +0 -138
  303. package/lib/i18n/lv.d.ts +0 -57
  304. package/lib/i18n/lv.js +0 -120
  305. package/lib/i18n/nl.d.ts +0 -20
  306. package/lib/i18n/nl.js +0 -125
  307. package/lib/i18n/no.d.ts +0 -15
  308. package/lib/i18n/no.js +0 -77
  309. package/lib/i18n/pl.js +0 -126
  310. package/lib/i18n/pt.d.ts +0 -26
  311. package/lib/i18n/pt.js +0 -118
  312. package/lib/i18n/ro.d.ts +0 -109
  313. package/lib/i18n/ro.js +0 -360
  314. package/lib/i18n/ru.d.ts +0 -30
  315. package/lib/i18n/ru.js +0 -198
  316. package/lib/i18n/sr.d.ts +0 -56
  317. package/lib/i18n/sr.js +0 -127
  318. package/lib/i18n/tr.d.ts +0 -15
  319. package/lib/i18n/tr.js +0 -64
  320. package/lib/i18n/vi.js +0 -151
  321. package/lib/i18n/zh.d.ts +0 -18
  322. package/lib/i18n/zh.js +0 -78
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Ukrainian language converter.
3
+ *
4
+ * Supports:
5
+ * - Three-form pluralization (one/few/many)
6
+ * - Gender agreement (один/одна, два/дві)
7
+ * - Ukrainian orthography and phonology
8
+ */
9
+ export class Ukrainian extends SlavicLanguage {
10
+ onesWords: {
11
+ 1: string;
12
+ 2: string;
13
+ 3: string;
14
+ 4: string;
15
+ 5: string;
16
+ 6: string;
17
+ 7: string;
18
+ 8: string;
19
+ 9: string;
20
+ };
21
+ onesFeminineWords: {
22
+ 1: string;
23
+ 2: string;
24
+ 3: string;
25
+ 4: string;
26
+ 5: string;
27
+ 6: string;
28
+ 7: string;
29
+ 8: string;
30
+ 9: string;
31
+ };
32
+ teensWords: {
33
+ 0: string;
34
+ 1: string;
35
+ 2: string;
36
+ 3: string;
37
+ 4: string;
38
+ 5: string;
39
+ 6: string;
40
+ 7: string;
41
+ 8: string;
42
+ 9: string;
43
+ };
44
+ twentiesWords: {
45
+ 2: string;
46
+ 3: string;
47
+ 4: string;
48
+ 5: string;
49
+ 6: string;
50
+ 7: string;
51
+ 8: string;
52
+ 9: string;
53
+ };
54
+ hundredsWords: {
55
+ 1: string;
56
+ 2: string;
57
+ 3: string;
58
+ 4: string;
59
+ 5: string;
60
+ 6: string;
61
+ 7: string;
62
+ 8: string;
63
+ 9: string;
64
+ };
65
+ pluralForms: {
66
+ 1: string[];
67
+ 2: string[];
68
+ 3: string[];
69
+ 4: string[];
70
+ 5: string[];
71
+ 6: string[];
72
+ 7: string[];
73
+ 8: string[];
74
+ 9: string[];
75
+ 10: string[];
76
+ };
77
+ /**
78
+ * Ukrainian thousands (тисяча) are feminine, requiring одна/двi forms.
79
+ * Other scales (million, billion, etc.) are masculine.
80
+ */
81
+ scaleGenders: {
82
+ 1: boolean;
83
+ };
84
+ }
85
+ import { SlavicLanguage } from '../classes/slavic-language.js';
@@ -1,7 +1,19 @@
1
- import { N2WordsRU } from './ru.js';
1
+ import { SlavicLanguage } from '../classes/slavic-language.js'
2
2
 
3
- export class N2WordsUK extends N2WordsRU {
4
- ones = {
3
+ /**
4
+ * Ukrainian language converter.
5
+ *
6
+ * Supports:
7
+ * - Three-form pluralization (one/few/many)
8
+ * - Gender agreement (один/одна, два/дві)
9
+ * - Ukrainian orthography and phonology
10
+ */
11
+ export class Ukrainian extends SlavicLanguage {
12
+ negativeWord = 'мiнус'
13
+ decimalSeparatorWord = 'кома'
14
+ zeroWord = 'нуль'
15
+
16
+ onesWords = {
5
17
  1: 'один',
6
18
  2: 'два',
7
19
  3: 'три',
@@ -11,9 +23,9 @@ export class N2WordsUK extends N2WordsRU {
11
23
  7: 'сiм',
12
24
  8: 'вiсiм',
13
25
  9: 'дев\'ять'
14
- };
26
+ }
15
27
 
16
- onesFeminine = {
28
+ onesFeminineWords = {
17
29
  1: 'одна',
18
30
  2: 'двi',
19
31
  3: 'три',
@@ -23,9 +35,9 @@ export class N2WordsUK extends N2WordsRU {
23
35
  7: 'сiм',
24
36
  8: 'вiсiм',
25
37
  9: 'дев\'ять'
26
- };
38
+ }
27
39
 
28
- tens = {
40
+ teensWords = {
29
41
  0: 'десять',
30
42
  1: 'одинадцять',
31
43
  2: 'дванадцять',
@@ -36,9 +48,9 @@ export class N2WordsUK extends N2WordsRU {
36
48
  7: 'сiмнадцять',
37
49
  8: 'вiсiмнадцять',
38
50
  9: 'дев\'ятнадцять'
39
- };
51
+ }
40
52
 
41
- twenties = {
53
+ twentiesWords = {
42
54
  2: 'двадцять',
43
55
  3: 'тридцять',
44
56
  4: 'сорок',
@@ -47,9 +59,9 @@ export class N2WordsUK extends N2WordsRU {
47
59
  7: 'сiмдесят',
48
60
  8: 'вiсiмдесят',
49
61
  9: 'дев\'яносто'
50
- };
62
+ }
51
63
 
52
- hundreds = {
64
+ hundredsWords = {
53
65
  1: 'сто',
54
66
  2: 'двiстi',
55
67
  3: 'триста',
@@ -59,9 +71,9 @@ export class N2WordsUK extends N2WordsRU {
59
71
  7: 'сiмсот',
60
72
  8: 'вiсiмсот',
61
73
  9: 'дев\'ятсот'
62
- };
74
+ }
63
75
 
64
- thousands = {
76
+ pluralForms = {
65
77
  1: ['тисяча', 'тисячi', 'тисяч'], // 10^ 3
66
78
  2: ['мiльйон', 'мiльйони', 'мiльйонiв'], // 10^ 6
67
79
  3: ['мiльярд', 'мiльярди', 'мiльярдiв'], // 10^ 9
@@ -71,25 +83,14 @@ export class N2WordsUK extends N2WordsRU {
71
83
  7: ['секстильйон', 'секстильйони', 'секстильйонiв'], // 10^ 21
72
84
  8: ['септильйон', 'септильйони', 'септильйонiв'], // 10^ 24
73
85
  9: ['октильйон', 'октильйони', 'октильйонiв'], // 10^ 27
74
- 10: ['нонiльйон', 'нонiльйони', 'нонiльйонiв'], // 10^ 30
75
- };
76
-
77
- constructor(options) {
78
- super(Object.assign({
79
- negativeWord: 'мiнус',
80
- separatorWord: 'кома',
81
- zero: 'нуль'
82
- }, options));
86
+ 10: ['нонiльйон', 'нонiльйони', 'нонiльйонiв'] // 10^ 30
83
87
  }
84
- }
85
88
 
86
- /**
87
- * Converts a value to cardinal (written) form.
88
- * @param {number|string|bigint} value Number to be convert.
89
- * @param {object} [options] Options for class.
90
- * @returns {string} Value in cardinal (written) format.
91
- * @throws {Error} Value cannot be invalid.
92
- */
93
- export default function floatToCardinal (value, options = {}) {
94
- return new N2WordsUK(options).floatToCardinal(value);
89
+ /**
90
+ * Ukrainian thousands (тисяча) are feminine, requiring одна/двi forms.
91
+ * Other scales (million, billion, etc.) are masculine.
92
+ */
93
+ scaleGenders = {
94
+ 1: true // thousands are feminine
95
+ }
95
96
  }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Urdu language converter.
3
+ *
4
+ * Supports:
5
+ * - Indian numbering system (ہزار, لاکھ, کروڑ)
6
+ * - Urdu script (right-to-left)
7
+ * - Complete word forms for 0-99
8
+ */
9
+ export class Urdu extends SouthAsianLanguage {
10
+ }
11
+ import { SouthAsianLanguage } from '../classes/south-asian-language.js';
@@ -0,0 +1,131 @@
1
+ import { SouthAsianLanguage } from '../classes/south-asian-language.js'
2
+
3
+ /**
4
+ * Urdu language converter.
5
+ *
6
+ * Supports:
7
+ * - Indian numbering system (ہزار, لاکھ, کروڑ)
8
+ * - Urdu script (right-to-left)
9
+ * - Complete word forms for 0-99
10
+ */
11
+ export class Urdu extends SouthAsianLanguage {
12
+ negativeWord = 'منفی'
13
+ decimalSeparatorWord = 'اعشاریہ'
14
+ zeroWord = 'صفر'
15
+ hundredWord = 'سو'
16
+
17
+ belowHundredWords = [
18
+ 'صفر',
19
+ 'ایک',
20
+ 'دو',
21
+ 'تین',
22
+ 'چار',
23
+ 'پانچ',
24
+ 'چھ',
25
+ 'سات',
26
+ 'آٹھ',
27
+ 'نو',
28
+ 'دس',
29
+ 'گیارہ',
30
+ 'بارہ',
31
+ 'تیرہ',
32
+ 'چودہ',
33
+ 'پندرہ',
34
+ 'سولہ',
35
+ 'سترہ',
36
+ 'اٹھارہ',
37
+ 'انیس',
38
+ 'بیس',
39
+ 'اکیس',
40
+ 'بائیس',
41
+ 'تیئیس',
42
+ 'چوبیس',
43
+ 'پچیس',
44
+ 'چھبیس',
45
+ 'ستائیس',
46
+ 'اٹھائیس',
47
+ 'انتیس',
48
+ 'تیس',
49
+ 'اکتیس',
50
+ 'بتیس',
51
+ 'تینتیس',
52
+ 'چونتیس',
53
+ 'پینتیس',
54
+ 'چھتیس',
55
+ 'سینتیس',
56
+ 'اڑتیس',
57
+ 'انتالیس',
58
+ 'چالیس',
59
+ 'اکتالیس',
60
+ 'بیالیس',
61
+ 'تینتالیس',
62
+ 'چوالیس',
63
+ 'پینتالیس',
64
+ 'چھالیس',
65
+ 'سینتالیس',
66
+ 'اڑتالیس',
67
+ 'انچاس',
68
+ 'پچاس',
69
+ 'اکاون',
70
+ 'باون',
71
+ 'ترپن',
72
+ 'چون',
73
+ 'پچپن',
74
+ 'چھپن',
75
+ 'ستاون',
76
+ 'اٹھاون',
77
+ 'انسٹھ',
78
+ 'ساٹھ',
79
+ 'اکسٹھ',
80
+ 'باسٹھ',
81
+ 'ترسٹھ',
82
+ 'چونسٹھ',
83
+ 'پینسٹھ',
84
+ 'چھیاسٹھ',
85
+ 'سڑسٹھ',
86
+ 'اڑسٹھ',
87
+ 'انہتر',
88
+ 'ستر',
89
+ 'اکہتر',
90
+ 'بہتر',
91
+ 'تہتر',
92
+ 'چوہتر',
93
+ 'پچھتر',
94
+ 'چھہتر',
95
+ 'ستتر',
96
+ 'اٹھہتر',
97
+ 'اناسی',
98
+ 'اسی',
99
+ 'اکیاسی',
100
+ 'بیاسی',
101
+ 'تریاسی',
102
+ 'چوراسی',
103
+ 'پچاسی',
104
+ 'چھیاسی',
105
+ 'ستاسی',
106
+ 'اٹھاسی',
107
+ 'نواسی',
108
+ 'نوے',
109
+ 'اکانوے',
110
+ 'بانوے',
111
+ 'ترانوے',
112
+ 'چورانوے',
113
+ 'پچانوے',
114
+ 'چھیانوے',
115
+ 'ستانوے',
116
+ 'اٹھانوے',
117
+ 'ننانوے'
118
+ ]
119
+
120
+ scaleWords = [
121
+ '',
122
+ 'ہزار',
123
+ 'لاکھ',
124
+ 'کروڑ',
125
+ 'ارب',
126
+ 'کھرب',
127
+ 'نیل',
128
+ 'پدم',
129
+ 'شنکھ'
130
+ ]
131
+ }
@@ -1,14 +1,13 @@
1
1
  /**
2
- * Converts a value to cardinal (written) form.
3
- * @param {number|string|bigint} value Number to be convert.
4
- * @param {object} [options] Options for class.
5
- * @returns {string} Value in cardinal (written) format.
6
- * @throws {Error} Value cannot be invalid.
2
+ * Vietnamese language converter.
3
+ *
4
+ * Supports:
5
+ * - Special pronunciation rules (lăm for 5, mốt for final 1)
6
+ * - "Lẻ" (odd/extra) when tens place is zero
7
+ * - Vietnamese diacritical marks
7
8
  */
8
- export default function floatToCardinal(value: number | string | bigint, options?: object): string;
9
- export class N2WordsID extends AbstractLanguage {
10
- constructor(options: any);
11
- base: {
9
+ export class Vietnamese extends AbstractLanguage {
10
+ belowTwentyWords: {
12
11
  0: string;
13
12
  1: string;
14
13
  2: string;
@@ -30,7 +29,7 @@ export class N2WordsID extends AbstractLanguage {
30
29
  18: string;
31
30
  19: string;
32
31
  };
33
- tens: {
32
+ twentiesWords: {
34
33
  20: string;
35
34
  30: string;
36
35
  40: string;
@@ -40,7 +39,7 @@ export class N2WordsID extends AbstractLanguage {
40
39
  80: string;
41
40
  90: string;
42
41
  };
43
- thousands: {
42
+ scaleWords: {
44
43
  1: string;
45
44
  2: string;
46
45
  3: string;
@@ -62,9 +61,12 @@ export class N2WordsID extends AbstractLanguage {
62
61
  19: string;
63
62
  20: string;
64
63
  };
64
+ /** Convert numbers less than 100 to Vietnamese words. */
65
65
  convertLess100(number: any): any;
66
+ /** Convert numbers less than 1000 to Vietnamese words. */
66
67
  convertLess1000(number: any): any;
68
+ /** Convert numbers greater than 1000 to Vietnamese words. */
67
69
  convertMore1000(number: any): any;
68
- toCardinal(number: any): any;
70
+ integerToWords(integerPart: any): any;
69
71
  }
70
- import AbstractLanguage from '../classes/abstract-language.js';
72
+ import { AbstractLanguage } from '../classes/abstract-language.js';
@@ -0,0 +1,147 @@
1
+ import { AbstractLanguage } from '../classes/abstract-language.js'
2
+
3
+ /**
4
+ * Vietnamese language converter.
5
+ *
6
+ * Supports:
7
+ * - Special pronunciation rules (lăm for 5, mốt for final 1)
8
+ * - "Lẻ" (odd/extra) when tens place is zero
9
+ * - Vietnamese diacritical marks
10
+ */
11
+ export class Vietnamese extends AbstractLanguage {
12
+ negativeWord = 'âm'
13
+ decimalSeparatorWord = 'phẩy'
14
+ zeroWord = 'không'
15
+
16
+ belowTwentyWords = {
17
+ 0: 'không',
18
+ 1: 'một',
19
+ 2: 'hai',
20
+ 3: 'ba',
21
+ 4: 'bốn',
22
+ 5: 'năm',
23
+ 6: 'sáu',
24
+ 7: 'bảy',
25
+ 8: 'tám',
26
+ 9: 'chín',
27
+ 10: 'mười',
28
+ 11: 'mười một',
29
+ 12: 'mười hai',
30
+ 13: 'mười ba',
31
+ 14: 'mười bốn',
32
+ 15: 'mười lăm',
33
+ 16: 'mười sáu',
34
+ 17: 'mười bảy',
35
+ 18: 'mười tám',
36
+ 19: 'mười chín'
37
+ }
38
+
39
+ twentiesWords = {
40
+ 20: 'hai mươi',
41
+ 30: 'ba mươi',
42
+ 40: 'bốn mươi',
43
+ 50: 'năm mươi',
44
+ 60: 'sáu mươi',
45
+ 70: 'bảy mươi',
46
+ 80: 'tám mươi',
47
+ 90: 'chín mươi'
48
+ }
49
+
50
+ scaleWords = {
51
+ 1: 'nghìn', // 10^1
52
+ 2: 'triệu', // 10^2
53
+ 3: 'tỷ', // 10^3
54
+ 4: 'nghìn tỷ',
55
+ 5: 'trăm nghìn tỷ',
56
+ 6: 'Quintillion',
57
+ 7: 'Sextillion',
58
+ 8: 'Septillion',
59
+ 9: 'Octillion',
60
+ 10: 'Nonillion',
61
+ 11: 'Decillion',
62
+ 12: 'Undecillion',
63
+ 13: 'Duodecillion',
64
+ 14: 'Tredecillion',
65
+ 15: 'Quattuordecillion',
66
+ 16: 'Sexdecillion',
67
+ 17: 'Septendecillion',
68
+ 18: 'Octodecillion',
69
+ 19: 'Novemdecillion',
70
+ 20: 'Vigintillion'
71
+ }
72
+
73
+ /** Convert numbers less than 100 to Vietnamese words. */
74
+ convertLess100 (number) {
75
+ const unitsPart = number % 10
76
+ const tensPart = number - unitsPart
77
+ const tensPartText = this.twentiesWords[tensPart]
78
+ if (unitsPart === 0) {
79
+ return tensPartText
80
+ }
81
+ const unitsPartText = this.belowTwentyWords[unitsPart]
82
+ let suffix = unitsPartText
83
+ if (unitsPart === 1) {
84
+ suffix = 'mốt'
85
+ }
86
+ if (unitsPart === 5) {
87
+ suffix = 'lăm'
88
+ }
89
+ return tensPartText + ' ' + suffix
90
+ }
91
+
92
+ /** Convert numbers less than 1000 to Vietnamese words. */
93
+ convertLess1000 (number) {
94
+ const words = []
95
+ const tensUnitsPart = number % 100
96
+ const hundredsPart = number - tensUnitsPart
97
+ if (hundredsPart > 0) {
98
+ words.push(this.belowTwentyWords[hundredsPart / 100], 'trăm')
99
+ }
100
+ if (tensUnitsPart > 0 && tensUnitsPart < 10) {
101
+ if (words.length > 0) {
102
+ words.push('lẻ')
103
+ }
104
+ if (tensUnitsPart === 5) {
105
+ words.push('năm')
106
+ } else {
107
+ words.push(this.belowTwentyWords[tensUnitsPart])
108
+ }
109
+ }
110
+ if (tensUnitsPart >= 10) {
111
+ words.push(this.integerToWords(tensUnitsPart))
112
+ }
113
+ return words.join(' ')
114
+ }
115
+
116
+ /** Convert numbers greater than 1000 to Vietnamese words. */
117
+ convertMore1000 (number) {
118
+ const words = []
119
+ let division = number / 1000n
120
+ let power = 1
121
+ while (division >= 1000n) {
122
+ division = division / 1000n
123
+ power = power + 1
124
+ }
125
+ const r = number - (division * BigInt(Math.pow(1000, power)))
126
+ words.push(this.integerToWords(division), this.scaleWords[power])
127
+ if (r > 0n) {
128
+ if (r <= 99n) {
129
+ words.push('lẻ')
130
+ }
131
+ words.push(this.integerToWords(r))
132
+ }
133
+ return words.join(' ')
134
+ }
135
+
136
+ integerToWords (integerPart) {
137
+ if (integerPart < 20n) {
138
+ return this.belowTwentyWords[Number(integerPart)]
139
+ } else {
140
+ if (integerPart < 100n) {
141
+ return this.convertLess100(Number(integerPart))
142
+ } else {
143
+ return (integerPart < 1000n ? this.convertLess1000(Number(integerPart)) : this.convertMore1000(integerPart))
144
+ }
145
+ }
146
+ }
147
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Simplified Chinese language converter.
3
+ *
4
+ * Supports:
5
+ * - Simplified Chinese characters (简体中文)
6
+ * - No word separators (concatenated format)
7
+ * - Optional formal (financial) vs common numerals
8
+ */
9
+ export class SimplifiedChinese extends GreedyScaleLanguage {
10
+ constructor(options?: {});
11
+ scaleWords: (string | bigint)[][];
12
+ /** Combines two word-sets according to Chinese grammar rules. */
13
+ combineWordSets(preceding: any, following: any): any;
14
+ /** Returns the number of digits in a number. */
15
+ digit(number_: any): any;
16
+ /** Counts the number of zero digits in a number. */
17
+ zeroDigit(number_: any): number;
18
+ /** Converts decimal digits to words by reading each digit individually. */
19
+ decimalDigitsToWords(decimalString: any): string[];
20
+ }
21
+ import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js';
@@ -0,0 +1,111 @@
1
+ import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'
2
+
3
+ /**
4
+ * Simplified Chinese language converter.
5
+ *
6
+ * Supports:
7
+ * - Simplified Chinese characters (简体中文)
8
+ * - No word separators (concatenated format)
9
+ * - Optional formal (financial) vs common numerals
10
+ */
11
+ export class SimplifiedChinese extends GreedyScaleLanguage {
12
+ negativeWord = '负'
13
+ decimalSeparatorWord = '点'
14
+ zeroWord = '零'
15
+ wordSeparator = ''
16
+
17
+ constructor (options = {}) {
18
+ super()
19
+
20
+ this.setOptions({
21
+ formal: true
22
+ }, options)
23
+
24
+ if (this.options.formal) {
25
+ this.scaleWords = [
26
+ [1_000_000_000_000n, '万'],
27
+ [100_000_000n, '亿'],
28
+ [10_000n, '万'],
29
+ [1000n, '仟'],
30
+ [100n, '佰'],
31
+ [10n, '拾'],
32
+ [9n, '玖'],
33
+ [8n, '捌'],
34
+ [7n, '柒'],
35
+ [6n, '陆'],
36
+ [5n, '伍'],
37
+ [4n, '肆'],
38
+ [3n, '叁'],
39
+ [2n, '贰'],
40
+ [1n, '壹'],
41
+ [0n, '零']
42
+ ]
43
+ } else {
44
+ this.scaleWords = [
45
+ [1_000_000_000_000n, '万'],
46
+ [100_000_000n, '亿'],
47
+ [10_000n, '万'],
48
+ [1000n, '千'],
49
+ [100n, '百'],
50
+ [10n, '十'],
51
+ [9n, '九'],
52
+ [8n, '八'],
53
+ [7n, '七'],
54
+ [6n, '六'],
55
+ [5n, '五'],
56
+ [4n, '四'],
57
+ [3n, '三'],
58
+ [2n, '二'],
59
+ [1n, '一'],
60
+ [0n, '零']
61
+ ]
62
+ }
63
+ }
64
+
65
+ /** Combines two word-sets according to Chinese grammar rules. */
66
+ combineWordSets (preceding, following) {
67
+ const precedingWord = Object.keys(preceding)[0]
68
+ const precedingValue = Object.values(preceding)[0]
69
+ const followingWord = Object.keys(following)[0]
70
+ const followingValue = Object.values(following)[0]
71
+
72
+ // Implicit one: omit 1 before single digits (< 10)
73
+ if (precedingValue === 1n && followingValue < 10n) {
74
+ return following
75
+ }
76
+
77
+ // Multiply when following > preceding (scale words like 仁, 万, 亿)
78
+ if (followingValue > precedingValue) {
79
+ return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }
80
+ }
81
+
82
+ // Insert "零" (zero) when position skip levels (e.g., 1003 = 千零三)
83
+ // zeroDigit() checks if gap exists between preceding and following magnitude
84
+ if (this.zeroDigit(precedingValue) > this.digit(followingValue)) {
85
+ return { [`${precedingWord}${this.zeroWord}${followingWord}`]: precedingValue + followingValue }
86
+ }
87
+
88
+ // Default: concatenate without zero insertion
89
+ return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }
90
+ }
91
+
92
+ /** Returns the number of digits in a number. */
93
+ digit (number_) {
94
+ return number_.toString().length
95
+ }
96
+
97
+ /** Counts the number of zero digits in a number. */
98
+ zeroDigit (number_) {
99
+ return [...number_.toString()].filter(c => c === '0').length
100
+ }
101
+
102
+ /** Converts decimal digits to words by reading each digit individually. */
103
+ decimalDigitsToWords (decimalString) {
104
+ const words = []
105
+ for (let i = 0; i < decimalString.length; i++) {
106
+ const digitValue = BigInt(decimalString[i])
107
+ words.push(this.integerToWords(digitValue))
108
+ }
109
+ return words
110
+ }
111
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Traditional Chinese language converter.
3
+ *
4
+ * Supports:
5
+ * - Traditional Chinese characters (繁體中文)
6
+ * - No word separators (concatenated format)
7
+ * - Optional formal (financial) vs common numerals
8
+ */
9
+ export class TraditionalChinese extends GreedyScaleLanguage {
10
+ constructor(options?: {});
11
+ scaleWords: (string | bigint)[][];
12
+ /** Combines two word-sets with Traditional Chinese grammar rules and zero insertion. */
13
+ combineWordSets(preceding: any, following: any): any;
14
+ /** Returns the number of digits in a number. */
15
+ digit(number_: any): any;
16
+ /** Counts the number of zero digits in a number. */
17
+ zeroDigit(number_: any): number;
18
+ /** Converts decimal digits to words by reading each digit individually. */
19
+ decimalDigitsToWords(decimalString: any): string[];
20
+ }
21
+ import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js';