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,251 @@
1
+ import { SlavicLanguage } from '../classes/slavic-language.js'
2
+
3
+ /**
4
+ * Biblical Hebrew language converter.
5
+ *
6
+ * Supports:
7
+ * - Three-form pluralization (one/few/many)
8
+ * - Gender agreement (masculine/feminine)
9
+ * - Optional "ו" (and) conjunction control
10
+ */
11
+ export class BiblicalHebrew extends SlavicLanguage {
12
+ negativeWord = 'מינוס'
13
+ decimalSeparatorWord = 'נקודה'
14
+ zeroWord = 'אפס'
15
+ usePerDigitDecimals = true
16
+
17
+ // Biblical Hebrew (masculine forms as default - historically accurate)
18
+ onesWords = {
19
+ 1: 'אחד',
20
+ 2: 'שניים',
21
+ 3: 'שלשה',
22
+ 4: 'ארבעה',
23
+ 5: 'חמשה',
24
+ 6: 'ששה',
25
+ 7: 'שבעה',
26
+ 8: 'שמונה',
27
+ 9: 'תשעה'
28
+ }
29
+
30
+ teensWords = {
31
+ 0: 'עשרה',
32
+ 1: 'אחד עשר',
33
+ 2: 'שנים עשר',
34
+ 3: 'שלשה עשר',
35
+ 4: 'ארבעה עשר',
36
+ 5: 'חמשה עשר',
37
+ 6: 'ששה עשר',
38
+ 7: 'שבעה עשר',
39
+ 8: 'שמונה עשר',
40
+ 9: 'תשעה עשר'
41
+ }
42
+
43
+ twentiesWords = {
44
+ 2: 'עשרים',
45
+ 3: 'שלשים',
46
+ 4: 'ארבעים',
47
+ 5: 'חמישים',
48
+ 6: 'ששים',
49
+ 7: 'שבעים',
50
+ 8: 'שמונים',
51
+ 9: 'תשעים'
52
+ }
53
+
54
+ hundredsWords = {
55
+ 1: 'מאה',
56
+ 2: 'מאתיים',
57
+ 3: 'מאות'
58
+ }
59
+
60
+ pluralForms = {
61
+ 1: 'אלף',
62
+ 2: 'אלפיים',
63
+ 3: 'שלשה אלפים',
64
+ 4: 'ארבעה אלפים',
65
+ 5: 'חמשה אלפים',
66
+ 6: 'ששה אלפים',
67
+ 7: 'שבעה אלפים',
68
+ 8: 'שמונה אלפים',
69
+ 9: 'תשעה אלפים'
70
+ }
71
+
72
+ // Feminine forms for thousands (when feminine=true is specified)
73
+ femininePluralForms = {
74
+ 1: 'אלף',
75
+ 2: 'אלפיים',
76
+ 3: 'שלשת אלפים',
77
+ 4: 'ארבעת אלפים',
78
+ 5: 'חמשת אלפים',
79
+ 6: 'ששת אלפים',
80
+ 7: 'שבעת אלפים',
81
+ 8: 'שמונת אלפים',
82
+ 9: 'תשעת אלפים'
83
+ }
84
+
85
+ scale = {
86
+ 1: 'אלף', // thousand (singular)
87
+ 2: 'מיליון', // million
88
+ 3: 'מיליארד', // billion
89
+ 4: 'טריליון', // trillion
90
+ 5: 'קוודרליון', // quadrillion
91
+ 6: 'קווינטיליון' // quintillion
92
+ }
93
+
94
+ scalePlural = {
95
+ 1: 'אלפים', // thousands
96
+ 2: 'מיליונים', // millions
97
+ 3: 'מיליארדים', // billions
98
+ 4: 'טריליונים', // trillions
99
+ 5: 'קוודרליונים', // quadrillions
100
+ 6: 'קווינטיליונים' // quintillions
101
+ }
102
+
103
+ // Feminine forms (for when gender='feminine' is specified)
104
+ onesFeminineWords = {
105
+ 1: 'אחת',
106
+ 2: 'שתים',
107
+ 3: 'שלש',
108
+ 4: 'ארבע',
109
+ 5: 'חמש',
110
+ 6: 'שש',
111
+ 7: 'שבע',
112
+ 8: 'שמונה',
113
+ 9: 'תשע'
114
+ }
115
+
116
+ teensFeminineWords = {
117
+ 0: 'עשר',
118
+ 1: 'אחת עשרה',
119
+ 2: 'שתים עשרה',
120
+ 3: 'שלש עשרה',
121
+ 4: 'ארבע עשרה',
122
+ 5: 'חמש עשרה',
123
+ 6: 'שש עשרה',
124
+ 7: 'שבע עשרה',
125
+ 8: 'שמונה עשרה',
126
+ 9: 'תשע עשרה'
127
+ }
128
+
129
+ constructor (options = {}) {
130
+ super(options)
131
+
132
+ this.setOptions({
133
+ andWord: 'ו',
134
+ gender: 'masculine'
135
+ }, options)
136
+
137
+ if (this.options.gender === 'feminine') {
138
+ this.onesWords = this.onesFeminineWords
139
+ this.teensWords = this.teensFeminineWords
140
+ this.pluralForms = this.femininePluralForms
141
+ }
142
+ }
143
+
144
+ /** Converts integer part with Biblical Hebrew three-form pluralization. */
145
+ integerToWords (integerPart) {
146
+ if (integerPart === 0n) {
147
+ return this.zeroWord
148
+ }
149
+ const words = []
150
+ const segments = this.splitToSegments(integerPart.toString(), 3)
151
+ let index = segments.length
152
+ for (const x of segments) {
153
+ index = index - 1
154
+ if (x === 0n) {
155
+ continue
156
+ }
157
+
158
+ const [n1, n2, n3] = this.extractDigits(x)
159
+
160
+ if (index > 0) {
161
+ // For thousands and above, handle the full chunk value
162
+ const chunkWords = []
163
+ let hasHundreds = false
164
+
165
+ // Process hundreds in this chunk
166
+ if (n3 > 0n) {
167
+ hasHundreds = true
168
+ if (n3 <= 2n) {
169
+ chunkWords.push(this.hundredsWords[n3])
170
+ } else {
171
+ chunkWords.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])
172
+ }
173
+ }
174
+
175
+ // Process tens in this chunk
176
+ if (n2 > 1n) {
177
+ // Add conjunction if there were hundreds before
178
+ const tensWord = this.twentiesWords[n2]
179
+ chunkWords.push(hasHundreds ? this.options.andWord + tensWord : tensWord)
180
+ }
181
+
182
+ // Process ones in this chunk
183
+ if (n2 === 1n) {
184
+ // Add conjunction if there were hundreds before
185
+ const onesWord = this.teensWords[n1]
186
+ chunkWords.push(hasHundreds ? this.options.andWord + onesWord : onesWord)
187
+ } else if (n1 > 0n) {
188
+ // For "one million", "one billion", etc., don't add the word "one"
189
+ if (x === 1n && index > 1) {
190
+ // Skip adding "one" for millions/billions/etc.
191
+ } else if (x <= 9n && chunkWords.length === 0 && index === 1) {
192
+ // Use special forms for 1-9 thousand
193
+ chunkWords.push(this.pluralForms[n1])
194
+ } else {
195
+ const onesWord = this.onesWords[n1]
196
+ // Add conjunction if there were hundreds or tens before
197
+ chunkWords.push((hasHundreds || n2 > 0n) ? this.options.andWord + onesWord : onesWord)
198
+ }
199
+ }
200
+
201
+ // Add scale word (thousand, million, billion, etc.)
202
+ if (x > 9n || index > 1) {
203
+ // For numbers > 9 or higher scales, use appropriate scale word
204
+ if (x === 1n) {
205
+ // Singular form (e.g., "one thousand", "one million")
206
+ chunkWords.push(this.scale[index])
207
+ } else if (x === 2n && index === 1) {
208
+ // Special dual form for "two thousand" (already in thousands[2])
209
+ return [this.pluralForms[2], ...words].join(' ')
210
+ } else if (x === 2n) {
211
+ // For two million, two billion, etc. - use plural form
212
+ chunkWords.push(this.scalePlural[index])
213
+ } else if (index === 1) {
214
+ // For thousands (10+), always use singular "אלף"
215
+ chunkWords.push(this.scale[index])
216
+ } else {
217
+ // For millions/billions/etc. use plural form
218
+ chunkWords.push(this.scalePlural[index])
219
+ }
220
+ }
221
+
222
+ words.push(chunkWords.join(' '))
223
+ continue
224
+ }
225
+
226
+ if (n3 > 0n) {
227
+ if (n3 <= 2n) {
228
+ words.push(this.hundredsWords[n3])
229
+ } else {
230
+ words.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])
231
+ }
232
+ }
233
+
234
+ if (n2 > 1n) {
235
+ words.push(this.twentiesWords[n2])
236
+ }
237
+
238
+ if (n2 === 1n) {
239
+ words.push(this.teensWords[n1])
240
+ } else if (n1 > 0n) {
241
+ words.push(this.onesWords[n1])
242
+ }
243
+ }
244
+
245
+ if (words.length > 1) {
246
+ words[words.length - 1] = this.options.andWord + words.at(-1)
247
+ }
248
+
249
+ return words.join(' ')
250
+ }
251
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Modern Hebrew language converter.
3
+ *
4
+ * Supports:
5
+ * - Right-to-left text orientation
6
+ * - Feminine grammatical forms (default in Modern Hebrew)
7
+ * - Three-form pluralization (singular/few/many)
8
+ * - Optional "ve" (ו) conjunction via options
9
+ */
10
+ export class Hebrew extends SlavicLanguage {
11
+ constructor(options?: {});
12
+ onesWords: {
13
+ 1: string;
14
+ 2: string;
15
+ 3: string;
16
+ 4: string;
17
+ 5: string;
18
+ 6: string;
19
+ 7: string;
20
+ 8: string;
21
+ 9: string;
22
+ };
23
+ teensWords: {
24
+ 0: string;
25
+ 1: string;
26
+ 2: string;
27
+ 3: string;
28
+ 4: string;
29
+ 5: string;
30
+ 6: string;
31
+ 7: string;
32
+ 8: string;
33
+ 9: string;
34
+ };
35
+ twentiesWords: {
36
+ 2: string;
37
+ 3: string;
38
+ 4: string;
39
+ 5: string;
40
+ 6: string;
41
+ 7: string;
42
+ 8: string;
43
+ 9: string;
44
+ };
45
+ hundredsWords: {
46
+ 1: string;
47
+ 2: string;
48
+ 3: string;
49
+ };
50
+ pluralForms: {
51
+ 1: string;
52
+ 2: string;
53
+ 3: string;
54
+ 4: string;
55
+ 5: string;
56
+ 6: string;
57
+ 7: string;
58
+ 8: string;
59
+ 9: string;
60
+ };
61
+ scale: {
62
+ 1: string;
63
+ 2: string;
64
+ 3: string;
65
+ 4: string;
66
+ 5: string;
67
+ 6: string;
68
+ };
69
+ scalePlural: {
70
+ 1: string;
71
+ 2: string;
72
+ 3: string;
73
+ 4: string;
74
+ 5: string;
75
+ 6: string;
76
+ };
77
+ /** Converts integer part to Hebrew words with special handling for thousands. */
78
+ integerToWords(integerPart: any): string;
79
+ }
80
+ import { SlavicLanguage } from '../classes/slavic-language.js';
@@ -0,0 +1,206 @@
1
+ import { SlavicLanguage } from '../classes/slavic-language.js'
2
+
3
+ /**
4
+ * Modern Hebrew language converter.
5
+ *
6
+ * Supports:
7
+ * - Right-to-left text orientation
8
+ * - Feminine grammatical forms (default in Modern Hebrew)
9
+ * - Three-form pluralization (singular/few/many)
10
+ * - Optional "ve" (ו) conjunction via options
11
+ */
12
+ export class Hebrew extends SlavicLanguage {
13
+ negativeWord = 'מינוס'
14
+ decimalSeparatorWord = 'נקודה'
15
+ zeroWord = 'אפס'
16
+ usePerDigitDecimals = true
17
+
18
+ // Feminine forms (default in Modern Hebrew)
19
+ onesWords = {
20
+ 1: 'אחת',
21
+ 2: 'שתים',
22
+ 3: 'שלש',
23
+ 4: 'ארבע',
24
+ 5: 'חמש',
25
+ 6: 'שש',
26
+ 7: 'שבע',
27
+ 8: 'שמונה',
28
+ 9: 'תשע'
29
+ }
30
+
31
+ teensWords = {
32
+ 0: 'עשר',
33
+ 1: 'אחת עשרה',
34
+ 2: 'שתים עשרה',
35
+ 3: 'שלש עשרה',
36
+ 4: 'ארבע עשרה',
37
+ 5: 'חמש עשרה',
38
+ 6: 'שש עשרה',
39
+ 7: 'שבע עשרה',
40
+ 8: 'שמונה עשרה',
41
+ 9: 'תשע עשרה'
42
+ }
43
+
44
+ twentiesWords = {
45
+ 2: 'עשרים',
46
+ 3: 'שלשים',
47
+ 4: 'ארבעים',
48
+ 5: 'חמישים',
49
+ 6: 'ששים',
50
+ 7: 'שבעים',
51
+ 8: 'שמונים',
52
+ 9: 'תשעים'
53
+ }
54
+
55
+ hundredsWords = {
56
+ 1: 'מאה',
57
+ 2: 'מאתיים',
58
+ 3: 'מאות'
59
+ }
60
+
61
+ pluralForms = {
62
+ 1: 'אלף',
63
+ 2: 'אלפיים',
64
+ 3: 'שלשת אלפים',
65
+ 4: 'ארבעת אלפים',
66
+ 5: 'חמשת אלפים',
67
+ 6: 'ששת אלפים',
68
+ 7: 'שבעת אלפים',
69
+ 8: 'שמונת אלפים',
70
+ 9: 'תשעת אלפים'
71
+ }
72
+
73
+ scale = {
74
+ 1: 'אלף', // thousand (singular)
75
+ 2: 'מיליון', // million
76
+ 3: 'מיליארד', // billion
77
+ 4: 'טריליון', // trillion
78
+ 5: 'קוודרליון', // quadrillion
79
+ 6: 'קווינטיליון' // quintillion
80
+ }
81
+
82
+ scalePlural = {
83
+ 1: 'אלפים', // thousands
84
+ 2: 'מיליונים', // millions
85
+ 3: 'מיליארדים', // billions
86
+ 4: 'טריליונים', // trillions
87
+ 5: 'קוודרליונים', // quadrillions
88
+ 6: 'קווינטיליונים' // quintillions
89
+ }
90
+
91
+ constructor (options = {}) {
92
+ super(options)
93
+
94
+ this.setOptions({
95
+ andWord: 'ו'
96
+ }, options)
97
+ }
98
+
99
+ /** Converts integer part to Hebrew words with special handling for thousands. */
100
+ integerToWords (integerPart) {
101
+ if (integerPart === 0n) {
102
+ return this.zeroWord
103
+ }
104
+ const words = []
105
+ const segments = this.splitToSegments(integerPart.toString(), 3)
106
+ let index = segments.length
107
+ for (const x of segments) {
108
+ index = index - 1
109
+ if (x === 0n) {
110
+ continue
111
+ }
112
+
113
+ const [n1, n2, n3] = this.extractDigits(x)
114
+
115
+ if (index > 0) {
116
+ // For thousands and above, handle the full chunk value
117
+ const chunkWords = []
118
+ let hasHundreds = false
119
+
120
+ // Process hundreds in this chunk
121
+ if (n3 > 0n) {
122
+ hasHundreds = true
123
+ if (n3 <= 2n) {
124
+ chunkWords.push(this.hundredsWords[n3])
125
+ } else {
126
+ chunkWords.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])
127
+ }
128
+ }
129
+
130
+ // Process tens in this chunk
131
+ if (n2 > 1n) {
132
+ // Add conjunction if there were hundreds before
133
+ const tensWord = this.twentiesWords[n2]
134
+ chunkWords.push(hasHundreds ? this.options.andWord + tensWord : tensWord)
135
+ }
136
+
137
+ // Process ones in this chunk
138
+ if (n2 === 1n) {
139
+ // Add conjunction if there were hundreds before
140
+ const onesWord = this.teensWords[n1]
141
+ chunkWords.push(hasHundreds ? this.options.andWord + onesWord : onesWord)
142
+ } else if (n1 > 0n) {
143
+ // For "one million", "one billion", etc., don't add the word "one"
144
+ if (x === 1n && index > 1) {
145
+ // Skip adding "one" for millions/billions/etc.
146
+ } else if (x <= 9n && chunkWords.length === 0 && index === 1) {
147
+ // Use special forms for 1-9 thousand
148
+ chunkWords.push(this.pluralForms[n1])
149
+ } else {
150
+ const onesWord = this.onesWords[n1]
151
+ // Add conjunction if there were hundreds or tens before
152
+ chunkWords.push((hasHundreds || n2 > 0n) ? this.options.andWord + onesWord : onesWord)
153
+ }
154
+ }
155
+
156
+ // Add scale word (thousand, million, billion, etc.)
157
+ if (x > 9n || index > 1) {
158
+ // For numbers > 9 or higher scales, use appropriate scale word
159
+ if (x === 1n) {
160
+ // Singular form (e.g., "one thousand", "one million")
161
+ chunkWords.push(this.scale[index])
162
+ } else if (x === 2n && index === 1) {
163
+ // Special dual form for "two thousand" (already in thousands[2])
164
+ return [this.pluralForms[2], ...words].join(' ')
165
+ } else if (x === 2n) {
166
+ // For two million, two billion, etc. - use plural form
167
+ chunkWords.push(this.scalePlural[index])
168
+ } else if (index === 1) {
169
+ // For thousands (10+), always use singular "אלף"
170
+ chunkWords.push(this.scale[index])
171
+ } else {
172
+ // For millions/billions/etc. use plural form
173
+ chunkWords.push(this.scalePlural[index])
174
+ }
175
+ }
176
+
177
+ words.push(chunkWords.join(' '))
178
+ continue
179
+ }
180
+
181
+ if (n3 > 0n) {
182
+ if (n3 <= 2n) {
183
+ words.push(this.hundredsWords[n3])
184
+ } else {
185
+ words.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])
186
+ }
187
+ }
188
+
189
+ if (n2 > 1n) {
190
+ words.push(this.twentiesWords[n2])
191
+ }
192
+
193
+ if (n2 === 1n) {
194
+ words.push(this.teensWords[n1])
195
+ } else if (n1 > 0n) {
196
+ words.push(this.onesWords[n1])
197
+ }
198
+ }
199
+
200
+ if (words.length > 1) {
201
+ words[words.length - 1] = this.options.andWord + words.at(-1)
202
+ }
203
+
204
+ return words.join(' ')
205
+ }
206
+ }
@@ -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';
@@ -0,0 +1,131 @@
1
+ import { SouthAsianLanguage } from '../classes/south-asian-language.js'
2
+
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 {
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
+ }