n2words 1.24.0 → 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 (349) hide show
  1. package/README.md +285 -156
  2. package/dist/ArabicConverter.js +3 -0
  3. package/dist/ArabicConverter.js.map +1 -0
  4. package/dist/AzerbaijaniConverter.js +3 -0
  5. package/dist/AzerbaijaniConverter.js.map +1 -0
  6. package/dist/BanglaConverter.js +3 -0
  7. package/dist/BanglaConverter.js.map +1 -0
  8. package/dist/BiblicalHebrewConverter.js +3 -0
  9. package/dist/BiblicalHebrewConverter.js.map +1 -0
  10. package/dist/CroatianConverter.js +3 -0
  11. package/dist/CroatianConverter.js.map +1 -0
  12. package/dist/CzechConverter.js +3 -0
  13. package/dist/CzechConverter.js.map +1 -0
  14. package/dist/DanishConverter.js +3 -0
  15. package/dist/DanishConverter.js.map +1 -0
  16. package/dist/DutchConverter.js +3 -0
  17. package/dist/DutchConverter.js.map +1 -0
  18. package/dist/EnglishConverter.js +3 -0
  19. package/dist/EnglishConverter.js.map +1 -0
  20. package/dist/FilipinoConverter.js +3 -0
  21. package/dist/FilipinoConverter.js.map +1 -0
  22. package/dist/FrenchBelgiumConverter.js +3 -0
  23. package/dist/FrenchBelgiumConverter.js.map +1 -0
  24. package/dist/FrenchConverter.js +3 -0
  25. package/dist/FrenchConverter.js.map +1 -0
  26. package/dist/GermanConverter.js +3 -0
  27. package/dist/GermanConverter.js.map +1 -0
  28. package/dist/GreekConverter.js +3 -0
  29. package/dist/GreekConverter.js.map +1 -0
  30. package/dist/GujaratiConverter.js +3 -0
  31. package/dist/GujaratiConverter.js.map +1 -0
  32. package/dist/HebrewConverter.js +3 -0
  33. package/dist/HebrewConverter.js.map +1 -0
  34. package/dist/HindiConverter.js +3 -0
  35. package/dist/HindiConverter.js.map +1 -0
  36. package/dist/HungarianConverter.js +3 -0
  37. package/dist/HungarianConverter.js.map +1 -0
  38. package/dist/IndonesianConverter.js +3 -0
  39. package/dist/IndonesianConverter.js.map +1 -0
  40. package/dist/ItalianConverter.js +3 -0
  41. package/dist/ItalianConverter.js.map +1 -0
  42. package/dist/JapaneseConverter.js +3 -0
  43. package/dist/JapaneseConverter.js.map +1 -0
  44. package/dist/KannadaConverter.js +3 -0
  45. package/dist/KannadaConverter.js.map +1 -0
  46. package/dist/KoreanConverter.js +3 -0
  47. package/dist/KoreanConverter.js.map +1 -0
  48. package/dist/LatvianConverter.js +3 -0
  49. package/dist/LatvianConverter.js.map +1 -0
  50. package/dist/LithuanianConverter.js +3 -0
  51. package/dist/LithuanianConverter.js.map +1 -0
  52. package/dist/MalayConverter.js +3 -0
  53. package/dist/MalayConverter.js.map +1 -0
  54. package/dist/MarathiConverter.js +3 -0
  55. package/dist/MarathiConverter.js.map +1 -0
  56. package/dist/NorwegianBokmalConverter.js +3 -0
  57. package/dist/NorwegianBokmalConverter.js.map +1 -0
  58. package/dist/PersianConverter.js +3 -0
  59. package/dist/PersianConverter.js.map +1 -0
  60. package/dist/PolishConverter.js +3 -0
  61. package/dist/PolishConverter.js.map +1 -0
  62. package/dist/PortugueseConverter.js +3 -0
  63. package/dist/PortugueseConverter.js.map +1 -0
  64. package/dist/PunjabiConverter.js +3 -0
  65. package/dist/PunjabiConverter.js.map +1 -0
  66. package/dist/RomanianConverter.js +3 -0
  67. package/dist/RomanianConverter.js.map +1 -0
  68. package/dist/RussianConverter.js +3 -0
  69. package/dist/RussianConverter.js.map +1 -0
  70. package/dist/SerbianCyrillicConverter.js +3 -0
  71. package/dist/SerbianCyrillicConverter.js.map +1 -0
  72. package/dist/SerbianLatinConverter.js +3 -0
  73. package/dist/SerbianLatinConverter.js.map +1 -0
  74. package/dist/SimplifiedChineseConverter.js +3 -0
  75. package/dist/SimplifiedChineseConverter.js.map +1 -0
  76. package/dist/SpanishConverter.js +3 -0
  77. package/dist/SpanishConverter.js.map +1 -0
  78. package/dist/SwahiliConverter.js +3 -0
  79. package/dist/SwahiliConverter.js.map +1 -0
  80. package/dist/SwedishConverter.js +3 -0
  81. package/dist/SwedishConverter.js.map +1 -0
  82. package/dist/TamilConverter.js +3 -0
  83. package/dist/TamilConverter.js.map +1 -0
  84. package/dist/TeluguConverter.js +3 -0
  85. package/dist/TeluguConverter.js.map +1 -0
  86. package/dist/ThaiConverter.js +3 -0
  87. package/dist/ThaiConverter.js.map +1 -0
  88. package/dist/TraditionalChineseConverter.js +3 -0
  89. package/dist/TraditionalChineseConverter.js.map +1 -0
  90. package/dist/TurkishConverter.js +3 -0
  91. package/dist/TurkishConverter.js.map +1 -0
  92. package/dist/UkrainianConverter.js +3 -0
  93. package/dist/UkrainianConverter.js.map +1 -0
  94. package/dist/UrduConverter.js +3 -0
  95. package/dist/UrduConverter.js.map +1 -0
  96. package/dist/VietnameseConverter.js +3 -0
  97. package/dist/VietnameseConverter.js.map +1 -0
  98. package/dist/n2words.js +3 -2
  99. package/dist/n2words.js.map +1 -1
  100. package/lib/classes/abstract-language.d.ts +178 -0
  101. package/lib/classes/abstract-language.js +192 -185
  102. package/lib/classes/greedy-scale-language.d.ts +109 -0
  103. package/lib/classes/greedy-scale-language.js +96 -90
  104. package/lib/classes/slavic-language.d.ts +148 -0
  105. package/lib/classes/slavic-language.js +136 -106
  106. package/lib/classes/south-asian-language.d.ts +70 -0
  107. package/lib/classes/south-asian-language.js +58 -65
  108. package/lib/classes/turkic-language.d.ts +26 -0
  109. package/lib/classes/turkic-language.js +22 -26
  110. package/lib/languages/ar.d.ts +30 -0
  111. package/lib/languages/ar.js +49 -133
  112. package/lib/languages/az.d.ts +12 -0
  113. package/lib/languages/az.js +7 -23
  114. package/lib/languages/bn.d.ts +11 -0
  115. package/lib/languages/bn.js +12 -7
  116. package/lib/languages/cs.d.ts +88 -0
  117. package/lib/languages/cs.js +44 -113
  118. package/lib/languages/da.d.ts +15 -0
  119. package/lib/languages/da.js +40 -87
  120. package/lib/languages/de.d.ts +14 -0
  121. package/lib/languages/de.js +34 -68
  122. package/lib/languages/el.d.ts +14 -0
  123. package/lib/languages/el.js +22 -48
  124. package/lib/languages/en.d.ts +16 -0
  125. package/lib/languages/en.js +22 -59
  126. package/lib/languages/es.d.ts +15 -0
  127. package/lib/languages/es.js +49 -81
  128. package/lib/languages/fa.d.ts +47 -0
  129. package/lib/languages/fa.js +90 -73
  130. package/lib/languages/fil.d.ts +16 -0
  131. package/lib/languages/fil.js +35 -76
  132. package/lib/languages/fr-BE.d.ts +11 -0
  133. package/lib/languages/fr-BE.js +15 -51
  134. package/lib/languages/fr.d.ts +15 -0
  135. package/lib/languages/fr.js +33 -72
  136. package/lib/languages/gu.d.ts +11 -0
  137. package/lib/languages/gu.js +10 -34
  138. package/lib/languages/hbo.d.ts +113 -0
  139. package/lib/languages/hbo.js +251 -0
  140. package/lib/languages/he.d.ts +80 -0
  141. package/lib/languages/he.js +41 -164
  142. package/lib/languages/hi.d.ts +11 -0
  143. package/lib/languages/hi.js +12 -7
  144. package/lib/languages/hr.d.ts +80 -0
  145. package/lib/languages/hr.js +51 -95
  146. package/lib/languages/hu.d.ts +22 -0
  147. package/lib/languages/hu.js +35 -53
  148. package/lib/languages/id.d.ts +37 -0
  149. package/lib/languages/id.js +29 -44
  150. package/lib/languages/it.d.ts +37 -0
  151. package/lib/languages/it.js +36 -52
  152. package/lib/languages/ja.d.ts +17 -0
  153. package/lib/languages/ja.js +22 -75
  154. package/lib/languages/kn.d.ts +11 -0
  155. package/lib/languages/kn.js +10 -39
  156. package/lib/languages/ko.d.ts +14 -0
  157. package/lib/languages/ko.js +17 -45
  158. package/lib/languages/lt.d.ts +70 -0
  159. package/lib/languages/lt.js +28 -63
  160. package/lib/languages/lv.d.ts +70 -0
  161. package/lib/languages/lv.js +35 -58
  162. package/lib/languages/mr.d.ts +11 -0
  163. package/lib/languages/mr.js +10 -34
  164. package/lib/languages/ms.d.ts +31 -0
  165. package/lib/languages/ms.js +24 -20
  166. package/lib/languages/nb.d.ts +12 -0
  167. package/lib/languages/nb.js +36 -56
  168. package/lib/languages/nl.d.ts +16 -0
  169. package/lib/languages/nl.js +58 -109
  170. package/lib/languages/pa.d.ts +11 -0
  171. package/lib/languages/{pa-Guru.js → pa.js} +12 -7
  172. package/lib/languages/pl.d.ts +80 -0
  173. package/lib/languages/pl.js +26 -105
  174. package/lib/languages/pt.d.ts +29 -0
  175. package/lib/languages/pt.js +29 -64
  176. package/lib/languages/ro.d.ts +158 -0
  177. package/lib/languages/ro.js +60 -167
  178. package/lib/languages/ru.d.ts +85 -0
  179. package/lib/languages/ru.js +17 -37
  180. package/lib/languages/sr-Cyrl.d.ts +80 -0
  181. package/lib/languages/sr-Cyrl.js +113 -0
  182. package/lib/languages/sr-Latn.d.ts +80 -0
  183. package/lib/languages/sr-Latn.js +54 -98
  184. package/lib/languages/sv.d.ts +14 -0
  185. package/lib/languages/sv.js +26 -63
  186. package/lib/languages/sw.d.ts +39 -0
  187. package/lib/languages/sw.js +26 -21
  188. package/lib/languages/ta.d.ts +20 -0
  189. package/lib/languages/ta.js +26 -26
  190. package/lib/languages/te.d.ts +22 -0
  191. package/lib/languages/te.js +28 -38
  192. package/lib/languages/th.d.ts +17 -0
  193. package/lib/languages/th.js +25 -31
  194. package/lib/languages/tr.d.ts +12 -0
  195. package/lib/languages/tr.js +11 -38
  196. package/lib/languages/uk.d.ts +85 -0
  197. package/lib/languages/uk.js +18 -44
  198. package/lib/languages/ur.d.ts +11 -0
  199. package/lib/languages/ur.js +12 -7
  200. package/lib/languages/vi.d.ts +72 -0
  201. package/lib/languages/vi.js +25 -71
  202. package/lib/languages/zh-Hans.d.ts +21 -0
  203. package/lib/languages/zh-Hans.js +33 -87
  204. package/lib/languages/zh-Hant.d.ts +21 -0
  205. package/lib/languages/zh-Hant.js +111 -0
  206. package/lib/n2words.d.ts +209 -0
  207. package/lib/n2words.js +474 -191
  208. package/package.json +106 -67
  209. package/dist/languages/ar.js +0 -2
  210. package/dist/languages/ar.js.map +0 -1
  211. package/dist/languages/az.js +0 -2
  212. package/dist/languages/az.js.map +0 -1
  213. package/dist/languages/bn.js +0 -2
  214. package/dist/languages/bn.js.map +0 -1
  215. package/dist/languages/cs.js +0 -2
  216. package/dist/languages/cs.js.map +0 -1
  217. package/dist/languages/da.js +0 -2
  218. package/dist/languages/da.js.map +0 -1
  219. package/dist/languages/de.js +0 -2
  220. package/dist/languages/de.js.map +0 -1
  221. package/dist/languages/el.js +0 -2
  222. package/dist/languages/el.js.map +0 -1
  223. package/dist/languages/en.js +0 -2
  224. package/dist/languages/en.js.map +0 -1
  225. package/dist/languages/es.js +0 -2
  226. package/dist/languages/es.js.map +0 -1
  227. package/dist/languages/fa.js +0 -2
  228. package/dist/languages/fa.js.map +0 -1
  229. package/dist/languages/fil.js +0 -2
  230. package/dist/languages/fil.js.map +0 -1
  231. package/dist/languages/fr-BE.js +0 -2
  232. package/dist/languages/fr-BE.js.map +0 -1
  233. package/dist/languages/fr.js +0 -2
  234. package/dist/languages/fr.js.map +0 -1
  235. package/dist/languages/gu.js +0 -2
  236. package/dist/languages/gu.js.map +0 -1
  237. package/dist/languages/he.js +0 -2
  238. package/dist/languages/he.js.map +0 -1
  239. package/dist/languages/hi.js +0 -2
  240. package/dist/languages/hi.js.map +0 -1
  241. package/dist/languages/hr.js +0 -2
  242. package/dist/languages/hr.js.map +0 -1
  243. package/dist/languages/hu.js +0 -2
  244. package/dist/languages/hu.js.map +0 -1
  245. package/dist/languages/id.js +0 -2
  246. package/dist/languages/id.js.map +0 -1
  247. package/dist/languages/it.js +0 -2
  248. package/dist/languages/it.js.map +0 -1
  249. package/dist/languages/ja.js +0 -2
  250. package/dist/languages/ja.js.map +0 -1
  251. package/dist/languages/kn.js +0 -2
  252. package/dist/languages/kn.js.map +0 -1
  253. package/dist/languages/ko.js +0 -2
  254. package/dist/languages/ko.js.map +0 -1
  255. package/dist/languages/lt.js +0 -2
  256. package/dist/languages/lt.js.map +0 -1
  257. package/dist/languages/lv.js +0 -2
  258. package/dist/languages/lv.js.map +0 -1
  259. package/dist/languages/mr.js +0 -2
  260. package/dist/languages/mr.js.map +0 -1
  261. package/dist/languages/ms.js +0 -2
  262. package/dist/languages/ms.js.map +0 -1
  263. package/dist/languages/nb.js +0 -2
  264. package/dist/languages/nb.js.map +0 -1
  265. package/dist/languages/nl.js +0 -2
  266. package/dist/languages/nl.js.map +0 -1
  267. package/dist/languages/pa-Guru.js +0 -2
  268. package/dist/languages/pa-Guru.js.map +0 -1
  269. package/dist/languages/pl.js +0 -2
  270. package/dist/languages/pl.js.map +0 -1
  271. package/dist/languages/pt.js +0 -2
  272. package/dist/languages/pt.js.map +0 -1
  273. package/dist/languages/ro.js +0 -2
  274. package/dist/languages/ro.js.map +0 -1
  275. package/dist/languages/ru.js +0 -2
  276. package/dist/languages/ru.js.map +0 -1
  277. package/dist/languages/sr-Latn.js +0 -2
  278. package/dist/languages/sr-Latn.js.map +0 -1
  279. package/dist/languages/sv.js +0 -2
  280. package/dist/languages/sv.js.map +0 -1
  281. package/dist/languages/sw.js +0 -2
  282. package/dist/languages/sw.js.map +0 -1
  283. package/dist/languages/ta.js +0 -2
  284. package/dist/languages/ta.js.map +0 -1
  285. package/dist/languages/te.js +0 -2
  286. package/dist/languages/te.js.map +0 -1
  287. package/dist/languages/th.js +0 -2
  288. package/dist/languages/th.js.map +0 -1
  289. package/dist/languages/tr.js +0 -2
  290. package/dist/languages/tr.js.map +0 -1
  291. package/dist/languages/uk.js +0 -2
  292. package/dist/languages/uk.js.map +0 -1
  293. package/dist/languages/ur.js +0 -2
  294. package/dist/languages/ur.js.map +0 -1
  295. package/dist/languages/vi.js +0 -2
  296. package/dist/languages/vi.js.map +0 -1
  297. package/dist/languages/zh-Hans.js +0 -2
  298. package/dist/languages/zh-Hans.js.map +0 -1
  299. package/typings/classes/abstract-language.d.ts +0 -144
  300. package/typings/classes/greedy-scale-language.d.ts +0 -148
  301. package/typings/classes/slavic-language.d.ts +0 -145
  302. package/typings/classes/south-asian-language.d.ts +0 -101
  303. package/typings/classes/turkic-language.d.ts +0 -42
  304. package/typings/languages/ar.d.ts +0 -93
  305. package/typings/languages/az.d.ts +0 -25
  306. package/typings/languages/bn.d.ts +0 -1
  307. package/typings/languages/cs.d.ts +0 -120
  308. package/typings/languages/da.d.ts +0 -53
  309. package/typings/languages/de.d.ts +0 -26
  310. package/typings/languages/el.d.ts +0 -11
  311. package/typings/languages/en.d.ts +0 -30
  312. package/typings/languages/es.d.ts +0 -43
  313. package/typings/languages/fa.d.ts +0 -81
  314. package/typings/languages/fil.d.ts +0 -12
  315. package/typings/languages/fr-BE.d.ts +0 -41
  316. package/typings/languages/fr.d.ts +0 -43
  317. package/typings/languages/gu.d.ts +0 -12
  318. package/typings/languages/he.d.ts +0 -197
  319. package/typings/languages/hi.d.ts +0 -1
  320. package/typings/languages/hr.d.ts +0 -110
  321. package/typings/languages/hu.d.ts +0 -37
  322. package/typings/languages/id.d.ts +0 -69
  323. package/typings/languages/it.d.ts +0 -51
  324. package/typings/languages/ja.d.ts +0 -58
  325. package/typings/languages/kn.d.ts +0 -11
  326. package/typings/languages/ko.d.ts +0 -25
  327. package/typings/languages/lt.d.ts +0 -110
  328. package/typings/languages/lv.d.ts +0 -99
  329. package/typings/languages/mr.d.ts +0 -12
  330. package/typings/languages/ms.d.ts +0 -37
  331. package/typings/languages/nb.d.ts +0 -27
  332. package/typings/languages/nl.d.ts +0 -65
  333. package/typings/languages/pa-Guru.d.ts +0 -1
  334. package/typings/languages/pl.d.ts +0 -116
  335. package/typings/languages/pt.d.ts +0 -39
  336. package/typings/languages/ro.d.ts +0 -229
  337. package/typings/languages/ru.d.ts +0 -108
  338. package/typings/languages/sr-Latn.d.ts +0 -98
  339. package/typings/languages/sv.d.ts +0 -30
  340. package/typings/languages/sw.d.ts +0 -1
  341. package/typings/languages/ta.d.ts +0 -1
  342. package/typings/languages/te.d.ts +0 -1
  343. package/typings/languages/th.d.ts +0 -1
  344. package/typings/languages/tr.d.ts +0 -46
  345. package/typings/languages/uk.d.ts +0 -117
  346. package/typings/languages/ur.d.ts +0 -1
  347. package/typings/languages/vi.d.ts +0 -116
  348. package/typings/languages/zh-Hans.d.ts +0 -57
  349. package/typings/n2words.d.ts +0 -177
@@ -1,45 +1,22 @@
1
- import SlavicLanguage from '../classes/slavic-language.js'
1
+ import { SlavicLanguage } from '../classes/slavic-language.js'
2
2
 
3
3
  /**
4
- * @typedef {Object} HebrewOptions
5
- * @property {string} [and='ו'] Conjunction character (typically 'ו' for and).
6
- * @property {boolean} [biblical=false] Use biblical scale words instead of modern ones.
7
- * @property {boolean} [feminine=false] Use feminine forms for numbers.
8
- */
9
-
10
- /**
11
- * Hebrew language converter.
12
- *
13
- * Implements Hebrew number words using the Slavic language pattern:
14
- * - Hebrew alphabet and right-to-left text
15
- * - Hebrew number words (אחת, שתים, שלוש, ארבע...)
16
- * - Feminine number forms (default in Hebrew)
17
- * - Optional "ve" (ו, "and") conjunction between number groups
4
+ * Modern Hebrew language converter.
18
5
  *
19
- * Key Features:
20
- * - Three-form pluralization system shared across Slavic languages
21
- * * Form 1 (singular): 1 (e.g., "אלף")
22
- * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., "אלפים")
23
- * * Form 3 (many): all other numbers (e.g., "אלף")
24
- * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)
25
- * - Large number handling via thousands[] array with indexed [singular, few, many] forms
26
- *
27
- * Features:
6
+ * Supports:
28
7
  * - Right-to-left text orientation
29
- * - Feminine grammatical gender for numbers
30
- * - Three-form pluralization (similar to Slavic pattern)
31
- * - Conjunction control via "and" option
32
- *
33
- * Inherits from SlavicLanguage for complex pluralization algorithms.
8
+ * - Feminine grammatical forms (default in Modern Hebrew)
9
+ * - Three-form pluralization (singular/few/many)
10
+ * - Optional "ve" (ו) conjunction via options
34
11
  */
35
12
  export class Hebrew extends SlavicLanguage {
36
13
  negativeWord = 'מינוס'
37
14
  decimalSeparatorWord = 'נקודה'
38
15
  zeroWord = 'אפס'
39
- convertDecimalsPerDigit = true
16
+ usePerDigitDecimals = true
40
17
 
41
- // Modern Hebrew (feminine forms)
42
- ones = {
18
+ // Feminine forms (default in Modern Hebrew)
19
+ onesWords = {
43
20
  1: 'אחת',
44
21
  2: 'שתים',
45
22
  3: 'שלש',
@@ -51,7 +28,7 @@ export class Hebrew extends SlavicLanguage {
51
28
  9: 'תשע'
52
29
  }
53
30
 
54
- tens = {
31
+ teensWords = {
55
32
  0: 'עשר',
56
33
  1: 'אחת עשרה',
57
34
  2: 'שתים עשרה',
@@ -64,7 +41,7 @@ export class Hebrew extends SlavicLanguage {
64
41
  9: 'תשע עשרה'
65
42
  }
66
43
 
67
- twenties = {
44
+ twentiesWords = {
68
45
  2: 'עשרים',
69
46
  3: 'שלשים',
70
47
  4: 'ארבעים',
@@ -75,13 +52,13 @@ export class Hebrew extends SlavicLanguage {
75
52
  9: 'תשעים'
76
53
  }
77
54
 
78
- hundreds = {
55
+ hundredsWords = {
79
56
  1: 'מאה',
80
57
  2: 'מאתיים',
81
58
  3: 'מאות'
82
59
  }
83
60
 
84
- thousands = {
61
+ pluralForms = {
85
62
  1: 'אלף',
86
63
  2: 'אלפיים',
87
64
  3: 'שלשת אלפים',
@@ -111,116 +88,29 @@ export class Hebrew extends SlavicLanguage {
111
88
  6: 'קווינטיליונים' // quintillions
112
89
  }
113
90
 
114
- // Biblical Hebrew (masculine forms)
115
- biblicalOnes = {
116
- 1: 'אחד',
117
- 2: 'שניים',
118
- 3: 'שלשה',
119
- 4: 'ארבעה',
120
- 5: 'חמשה',
121
- 6: 'ששה',
122
- 7: 'שבעה',
123
- 8: 'שמונה',
124
- 9: 'תשעה'
125
- }
91
+ constructor (options = {}) {
92
+ super(options)
126
93
 
127
- biblicalTens = {
128
- 0: 'עשרה',
129
- 1: 'אחד עשר',
130
- 2: 'שנים עשר',
131
- 3: 'שלשה עשר',
132
- 4: 'ארבעה עשר',
133
- 5: 'חמשה עשר',
134
- 6: 'ששה עשר',
135
- 7: 'שבעה עשר',
136
- 8: 'שמונה עשר',
137
- 9: 'תשעה עשר'
94
+ this.setOptions({
95
+ andWord: 'ו'
96
+ }, options)
138
97
  }
139
98
 
140
- biblicalTwenties = {
141
- 2: 'עשרים',
142
- 3: 'שלשים',
143
- 4: 'ארבעים',
144
- 5: 'חמישים',
145
- 6: 'ששים',
146
- 7: 'שבעים',
147
- 8: 'שמונים',
148
- 9: 'תשעים'
149
- }
150
-
151
- biblicalHundreds = {
152
- 1: 'מאה',
153
- 2: 'מאתיים',
154
- 3: 'מאות'
155
- }
156
-
157
- biblicalThousands = {
158
- 1: 'אלף',
159
- 2: 'אלפיים',
160
- 3: 'שלשת אלפים',
161
- 4: 'ארבעת אלפים',
162
- 5: 'חמשת אלפים',
163
- 6: 'ששת אלפים',
164
- 7: 'שבעת אלפים',
165
- 8: 'שמונת אלפים',
166
- 9: 'תשעת אלפים'
167
- }
168
-
169
- biblicalScale = {
170
- 1: 'אלף',
171
- 2: 'מיליון',
172
- 3: 'מיליארד',
173
- 4: 'טריליון',
174
- 5: 'קוודרליון',
175
- 6: 'קווינטיליון'
176
- }
177
-
178
- biblicalScalePlural = {
179
- 1: 'אלפים',
180
- 2: 'מיליונים',
181
- 3: 'מיליארדים',
182
- 4: 'טריליונים',
183
- 5: 'קוודרליונים',
184
- 6: 'קווינטיליונים'
185
- }
186
-
187
- /**
188
- * Initializes the Hebrew converter with language-specific options.
189
- *
190
- * @param {HebrewOptions} [options={}] Configuration options.
191
- */
192
- constructor ({ and = 'ו', biblical = false, feminine = false } = {}) {
193
- super({ feminine })
194
-
195
- this.and = and
196
- this.feminine = feminine
197
-
198
- this.biblical = biblical
199
- if (this.biblical) {
200
- this.ones = this.biblicalOnes
201
- this.tens = this.biblicalTens
202
- this.twenties = this.biblicalTwenties
203
- this.hundreds = this.biblicalHundreds
204
- this.thousands = this.biblicalThousands
205
- this.scale = this.biblicalScale
206
- this.scalePlural = this.biblicalScalePlural
207
- }
208
- }
209
-
210
- convertWholePart (number) {
211
- if (number === 0n) {
99
+ /** Converts integer part to Hebrew words with special handling for thousands. */
100
+ integerToWords (integerPart) {
101
+ if (integerPart === 0n) {
212
102
  return this.zeroWord
213
103
  }
214
104
  const words = []
215
- const chunks = this.splitByX(number.toString(), 3)
216
- let index = chunks.length
217
- for (const x of chunks) {
105
+ const segments = this.splitToSegments(integerPart.toString(), 3)
106
+ let index = segments.length
107
+ for (const x of segments) {
218
108
  index = index - 1
219
109
  if (x === 0n) {
220
110
  continue
221
111
  }
222
112
 
223
- const [n1, n2, n3] = this.getDigits(x)
113
+ const [n1, n2, n3] = this.extractDigits(x)
224
114
 
225
115
  if (index > 0) {
226
116
  // For thousands and above, handle the full chunk value
@@ -231,35 +121,35 @@ export class Hebrew extends SlavicLanguage {
231
121
  if (n3 > 0n) {
232
122
  hasHundreds = true
233
123
  if (n3 <= 2n) {
234
- chunkWords.push(this.hundreds[n3])
124
+ chunkWords.push(this.hundredsWords[n3])
235
125
  } else {
236
- chunkWords.push(this.ones[n3] + ' ' + this.hundreds[3])
126
+ chunkWords.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])
237
127
  }
238
128
  }
239
129
 
240
130
  // Process tens in this chunk
241
131
  if (n2 > 1n) {
242
132
  // Add conjunction if there were hundreds before
243
- const tensWord = this.twenties[n2]
244
- chunkWords.push(hasHundreds ? this.and + tensWord : tensWord)
133
+ const tensWord = this.twentiesWords[n2]
134
+ chunkWords.push(hasHundreds ? this.options.andWord + tensWord : tensWord)
245
135
  }
246
136
 
247
137
  // Process ones in this chunk
248
138
  if (n2 === 1n) {
249
139
  // Add conjunction if there were hundreds before
250
- const onesWord = this.tens[n1]
251
- chunkWords.push(hasHundreds ? this.and + onesWord : onesWord)
140
+ const onesWord = this.teensWords[n1]
141
+ chunkWords.push(hasHundreds ? this.options.andWord + onesWord : onesWord)
252
142
  } else if (n1 > 0n) {
253
143
  // For "one million", "one billion", etc., don't add the word "one"
254
144
  if (x === 1n && index > 1) {
255
145
  // Skip adding "one" for millions/billions/etc.
256
146
  } else if (x <= 9n && chunkWords.length === 0 && index === 1) {
257
147
  // Use special forms for 1-9 thousand
258
- chunkWords.push(this.thousands[n1])
148
+ chunkWords.push(this.pluralForms[n1])
259
149
  } else {
260
- const onesWord = this.ones[n1]
150
+ const onesWord = this.onesWords[n1]
261
151
  // Add conjunction if there were hundreds or tens before
262
- chunkWords.push((hasHundreds || n2 > 0n) ? this.and + onesWord : onesWord)
152
+ chunkWords.push((hasHundreds || n2 > 0n) ? this.options.andWord + onesWord : onesWord)
263
153
  }
264
154
  }
265
155
 
@@ -271,7 +161,7 @@ export class Hebrew extends SlavicLanguage {
271
161
  chunkWords.push(this.scale[index])
272
162
  } else if (x === 2n && index === 1) {
273
163
  // Special dual form for "two thousand" (already in thousands[2])
274
- return [this.thousands[2], ...words].join(' ')
164
+ return [this.pluralForms[2], ...words].join(' ')
275
165
  } else if (x === 2n) {
276
166
  // For two million, two billion, etc. - use plural form
277
167
  chunkWords.push(this.scalePlural[index])
@@ -290,40 +180,27 @@ export class Hebrew extends SlavicLanguage {
290
180
 
291
181
  if (n3 > 0n) {
292
182
  if (n3 <= 2n) {
293
- words.push(this.hundreds[n3])
183
+ words.push(this.hundredsWords[n3])
294
184
  } else {
295
- words.push(this.ones[n3] + ' ' + this.hundreds[3])
185
+ words.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])
296
186
  }
297
187
  }
298
188
 
299
189
  if (n2 > 1n) {
300
- words.push(this.twenties[n2])
190
+ words.push(this.twentiesWords[n2])
301
191
  }
302
192
 
303
193
  if (n2 === 1n) {
304
- words.push(this.tens[n1])
194
+ words.push(this.teensWords[n1])
305
195
  } else if (n1 > 0n) {
306
- words.push(this.ones[n1])
196
+ words.push(this.onesWords[n1])
307
197
  }
308
198
  }
309
199
 
310
200
  if (words.length > 1) {
311
- words[words.length - 1] = this.and + words.at(-1)
201
+ words[words.length - 1] = this.options.andWord + words.at(-1)
312
202
  }
313
203
 
314
204
  return words.join(' ')
315
205
  }
316
206
  }
317
-
318
- /**
319
- * Converts a number to Hebrew cardinal (written) form.
320
- *
321
- * @param {number|string|bigint} value The number to convert.
322
- * @param {HebrewOptions} [options={}] Configuration options.
323
- * @returns {string} The number expressed in Hebrew words.
324
- * @throws {TypeError} If value is NaN or invalid type.
325
- * @throws {Error} If value is an invalid number string.
326
- */
327
- export default function convertToWords (value, options = {}) {
328
- return new Hebrew(options).convertToWords(value)
329
- }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Hindi language converter.
3
+ *
4
+ * Supports:
5
+ * - Indian numbering system (हज़ार, लाख, करोड़)
6
+ * - Devanagari script
7
+ * - Complete word forms for 0-99
8
+ */
9
+ export class Hindi extends SouthAsianLanguage {
10
+ }
11
+ import { SouthAsianLanguage } from '../classes/south-asian-language.js';
@@ -1,11 +1,20 @@
1
- import SouthAsianLanguage from '../classes/south-asian-language.js'
1
+ import { SouthAsianLanguage } from '../classes/south-asian-language.js'
2
2
 
3
- class Hindi extends SouthAsianLanguage {
3
+ /**
4
+ * Hindi language converter.
5
+ *
6
+ * Supports:
7
+ * - Indian numbering system (हज़ार, लाख, करोड़)
8
+ * - Devanagari script
9
+ * - Complete word forms for 0-99
10
+ */
11
+ export class Hindi extends SouthAsianLanguage {
4
12
  negativeWord = 'माइनस'
5
13
  decimalSeparatorWord = 'दशमलव'
6
14
  zeroWord = 'शून्य'
7
15
  hundredWord = 'सौ'
8
- belowHundred = [
16
+
17
+ belowHundredWords = [
9
18
  'शून्य',
10
19
  'एक',
11
20
  'दो',
@@ -120,7 +129,3 @@ class Hindi extends SouthAsianLanguage {
120
129
  'शंख'
121
130
  ]
122
131
  }
123
-
124
- export default function convertToWords (value, options = {}) {
125
- return new Hindi(options).convertToWords(value)
126
- }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Croatian language converter.
3
+ *
4
+ * Supports:
5
+ * - Three-form pluralization (one/few/many)
6
+ * - Gender agreement (jedan/jedna, dva/dvije)
7
+ * - Croatian-specific declension endings
8
+ */
9
+ export class Croatian 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
+ /** Selects Croatian plural form: 1 = singular, 2-4 = few, else = many. */
78
+ pluralize(n: any, forms: any): any;
79
+ }
80
+ import { SlavicLanguage } from '../classes/slavic-language.js';
@@ -1,52 +1,43 @@
1
- import SlavicLanguage from '../classes/slavic-language.js'
2
-
3
- /**
4
- * @typedef {Object} SlavicOptions
5
- * @property {boolean} [feminine=false] Use feminine forms for numbers.
6
- */
1
+ import { SlavicLanguage } from '../classes/slavic-language.js'
7
2
 
8
3
  /**
9
4
  * Croatian language converter.
10
5
  *
11
- * Implements Croatian number words using the Slavic language pattern:
12
- * - Croatian number words (jedan/jedna, dva/dvije, tri, četiri...)
13
- * - Gender-aware forms (masculine/feminine)
14
- * - Slavic three-form pluralization (tisuća/tisuće/tisuća)
6
+ * Supports:
7
+ * - Three-form pluralization (one/few/many)
8
+ * - Gender agreement (jedan/jedna, dva/dvije)
15
9
  * - Croatian-specific declension endings
16
- *
17
- * Key Features:
18
- * - Three-form pluralization system shared across Slavic languages
19
- * * Form 1 (singular): 1 (e.g., "tisuća")
20
- * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., "tisuće")
21
- * * Form 3 (many): all other numbers (e.g., "tisuća")
22
- * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)
23
- * - Large number handling via thousands[] array with indexed [singular, few, many] forms
24
- * - Gender-specific number forms for 1 and 2 (masculine/feminine dual forms)
25
- *
26
- * Features:
27
- * - Dual gender forms for 1 and 2 (jedan/jedna, dva/dvije)
28
- * - Latin script orthography
29
- * - Similar structure to Serbian
30
- *
31
- * Inherits from SlavicLanguage for complex pluralization algorithms.
32
10
  */
33
11
  export class Croatian extends SlavicLanguage {
34
12
  negativeWord = 'minus'
35
13
  decimalSeparatorWord = 'zarez'
36
14
  zeroWord = 'nula'
37
- ones = {
38
- 1: ['jedan', 'jedna'],
39
- 2: ['dva', 'dvije'],
40
- 3: ['tri', 'tri'],
41
- 4: ['četiri', 'četiri'],
42
- 5: ['pet', 'pet'],
43
- 6: ['šest', 'šest'],
44
- 7: ['sedam', 'sedam'],
45
- 8: ['osam', 'osam'],
46
- 9: ['devet', 'devet']
15
+
16
+ onesWords = {
17
+ 1: 'jedan',
18
+ 2: 'dva',
19
+ 3: 'tri',
20
+ 4: 'četiri',
21
+ 5: 'pet',
22
+ 6: 'šest',
23
+ 7: 'sedam',
24
+ 8: 'osam',
25
+ 9: 'devet'
47
26
  }
48
27
 
49
- tens = {
28
+ onesFeminineWords = {
29
+ 1: 'jedna',
30
+ 2: 'dvije',
31
+ 3: 'tri',
32
+ 4: 'četiri',
33
+ 5: 'pet',
34
+ 6: 'šest',
35
+ 7: 'sedam',
36
+ 8: 'osam',
37
+ 9: 'devet'
38
+ }
39
+
40
+ teensWords = {
50
41
  0: 'deset',
51
42
  1: 'jedanaest',
52
43
  2: 'dvanaest',
@@ -59,7 +50,7 @@ export class Croatian extends SlavicLanguage {
59
50
  9: 'devetnaest'
60
51
  }
61
52
 
62
- twenties = {
53
+ twentiesWords = {
63
54
  2: 'dvadeset',
64
55
  3: 'trideset',
65
56
  4: 'četrdeset',
@@ -70,7 +61,7 @@ export class Croatian extends SlavicLanguage {
70
61
  9: 'devedeset'
71
62
  }
72
63
 
73
- hundreds = {
64
+ hundredsWords = {
74
65
  1: 'sto',
75
66
  2: 'dvjesto',
76
67
  3: 'tristo',
@@ -82,20 +73,29 @@ export class Croatian extends SlavicLanguage {
82
73
  9: 'devetsto'
83
74
  }
84
75
 
85
- SCALE = {
86
- 0: ['', '', '', false],
87
- 1: ['tisuća', 'tisuće', 'tisuća', true], // 10 ^ 3
88
- 2: ['milijun', 'milijuna', 'milijuna', false], // 10 ^ 6
89
- 3: ['milijarda', 'milijarde', 'milijarda', false], // 10 ^ 9
90
- 4: ['bilijun', 'bilijuna', 'bilijuna', false], // 10 ^ 12
91
- 5: ['bilijarda', 'bilijarde', 'bilijarda', false], // 10 ^ 15
92
- 6: ['trilijun', 'trilijuna', 'trilijuna', false], // 10 ^ 18
93
- 7: ['trilijarda', 'trilijarde', 'trilijarda', false], // 10 ^ 21
94
- 8: ['kvadrilijun', 'kvadrilijuna', 'kvadrilijuna', false], // 10 ^ 24
95
- 9: ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda', false], // 10 ^ 27
96
- 10: ['kvintilijun', 'kvintilijuna', 'kvintilijuna', false] // 10 ^ 30
76
+ pluralForms = {
77
+ 1: ['tisuća', 'tisuće', 'tisuća'], // 10 ^ 3
78
+ 2: ['milijun', 'milijuna', 'milijuna'], // 10 ^ 6
79
+ 3: ['milijarda', 'milijarde', 'milijarda'], // 10 ^ 9
80
+ 4: ['bilijun', 'bilijuna', 'bilijuna'], // 10 ^ 12
81
+ 5: ['bilijarda', 'bilijarde', 'bilijarda'], // 10 ^ 15
82
+ 6: ['trilijun', 'trilijuna', 'trilijuna'], // 10 ^ 18
83
+ 7: ['trilijarda', 'trilijarde', 'trilijarda'], // 10 ^ 21
84
+ 8: ['kvadrilijun', 'kvadrilijuna', 'kvadrilijuna'], // 10 ^ 24
85
+ 9: ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda'], // 10 ^ 27
86
+ 10: ['kvintilijun', 'kvintilijuna', 'kvintilijuna'] // 10 ^ 30
87
+ }
88
+
89
+ /**
90
+ * Maps segment indices to whether they are grammatically feminine.
91
+ * In Croatian, thousands (index 1) are feminine, others are masculine.
92
+ * @type {Object.<number, boolean>}
93
+ */
94
+ scaleGenders = {
95
+ 1: true // thousands are feminine (others default to false)
97
96
  }
98
97
 
98
+ /** Selects Croatian plural form: 1 = singular, 2-4 = few, else = many. */
99
99
  pluralize (n, forms) {
100
100
  const lastDigit = n % 10n
101
101
  const lastTwoDigits = n % 100n
@@ -110,48 +110,4 @@ export class Croatian extends SlavicLanguage {
110
110
 
111
111
  return forms[2]
112
112
  }
113
-
114
- convertWholePart (number) {
115
- if (number === 0n) {
116
- return this.zeroWord
117
- }
118
- const words = []
119
- const chunks = this.splitByX(number.toString(), 3)
120
- let index = chunks.length
121
- for (const x of chunks) {
122
- index = index - 1
123
- const [n1, n2, n3] = this.getDigits(x)
124
- if (n3 > 0n) {
125
- words.push(this.hundreds[n3])
126
- }
127
- if (n2 > 1n) {
128
- words.push(this.twenties[n2])
129
- }
130
- if (n2 === 1n) {
131
- words.push(this.tens[n1])
132
- } else if (n1 > 0n) {
133
- const isFeminine = (this.feminine || this.SCALE[index][3])
134
- const genderIndex = isFeminine ? 1 : 0
135
- words.push(this.ones[n1][genderIndex])
136
- }
137
- if ((index > 0) && (x !== 0n)) {
138
- words.push(this.pluralize(x, this.SCALE[index]))
139
- }
140
- }
141
- return words.join(' ')
142
- }
143
- }
144
-
145
- /**
146
- * Converts a number to Croatian cardinal (written) form.
147
- *
148
- * @param {number|string|bigint} value The number to convert.
149
- * @param {Object} [options={}] Configuration options.
150
- * @param {boolean} [options.feminine=false] Use feminine forms for numbers.
151
- * @returns {string} The number expressed in Croatian words.
152
- * @throws {TypeError} If value is NaN or invalid type.
153
- * @throws {Error} If value is an invalid number string.
154
- */
155
- export default function convertToWords (value, options = {}) {
156
- return new Croatian(options).convertToWords(value)
157
113
  }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Hungarian language converter.
3
+ *
4
+ * Supports:
5
+ * - Agglutinative structure (no spaces between compound parts)
6
+ * - Special handling for "egy" (one) omission
7
+ * - Pre-composed twenties (huszonegy through huszonkilenc)
8
+ */
9
+ export class Hungarian extends GreedyScaleLanguage {
10
+ scaleWords: (string | bigint)[][];
11
+ /** Converts tens (30-99) with agglutinative composition. */
12
+ tensToCardinal(number: any): string | undefined;
13
+ /** Converts hundreds (100-999) with "száz" composition. */
14
+ hundredsToCardinal(number: any): string;
15
+ /** Converts thousands (1000-999999) with "ezer" composition. */
16
+ thousandsToCardinal(number: any): string;
17
+ /** Converts large numbers (millions and above) with scale words. */
18
+ bigNumberToCardinal(number: any): string;
19
+ /** Converts integer part using Hungarian agglutinative rules. */
20
+ integerToWords(integerPart: any, zeroWord?: string): string;
21
+ }
22
+ import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js';