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.
- package/LICENSE +1 -1
- package/README.md +317 -59
- package/dist/ArabicConverter.js +3 -0
- package/dist/ArabicConverter.js.map +1 -0
- package/dist/AzerbaijaniConverter.js +3 -0
- package/dist/AzerbaijaniConverter.js.map +1 -0
- package/dist/BanglaConverter.js +3 -0
- package/dist/BanglaConverter.js.map +1 -0
- package/dist/BiblicalHebrewConverter.js +3 -0
- package/dist/BiblicalHebrewConverter.js.map +1 -0
- package/dist/CroatianConverter.js +3 -0
- package/dist/CroatianConverter.js.map +1 -0
- package/dist/CzechConverter.js +3 -0
- package/dist/CzechConverter.js.map +1 -0
- package/dist/DanishConverter.js +3 -0
- package/dist/DanishConverter.js.map +1 -0
- package/dist/DutchConverter.js +3 -0
- package/dist/DutchConverter.js.map +1 -0
- package/dist/EnglishConverter.js +3 -0
- package/dist/EnglishConverter.js.map +1 -0
- package/dist/FilipinoConverter.js +3 -0
- package/dist/FilipinoConverter.js.map +1 -0
- package/dist/FrenchBelgiumConverter.js +3 -0
- package/dist/FrenchBelgiumConverter.js.map +1 -0
- package/dist/FrenchConverter.js +3 -0
- package/dist/FrenchConverter.js.map +1 -0
- package/dist/GermanConverter.js +3 -0
- package/dist/GermanConverter.js.map +1 -0
- package/dist/GreekConverter.js +3 -0
- package/dist/GreekConverter.js.map +1 -0
- package/dist/GujaratiConverter.js +3 -0
- package/dist/GujaratiConverter.js.map +1 -0
- package/dist/HebrewConverter.js +3 -0
- package/dist/HebrewConverter.js.map +1 -0
- package/dist/HindiConverter.js +3 -0
- package/dist/HindiConverter.js.map +1 -0
- package/dist/HungarianConverter.js +3 -0
- package/dist/HungarianConverter.js.map +1 -0
- package/dist/IndonesianConverter.js +3 -0
- package/dist/IndonesianConverter.js.map +1 -0
- package/dist/ItalianConverter.js +3 -0
- package/dist/ItalianConverter.js.map +1 -0
- package/dist/JapaneseConverter.js +3 -0
- package/dist/JapaneseConverter.js.map +1 -0
- package/dist/KannadaConverter.js +3 -0
- package/dist/KannadaConverter.js.map +1 -0
- package/dist/KoreanConverter.js +3 -0
- package/dist/KoreanConverter.js.map +1 -0
- package/dist/LatvianConverter.js +3 -0
- package/dist/LatvianConverter.js.map +1 -0
- package/dist/LithuanianConverter.js +3 -0
- package/dist/LithuanianConverter.js.map +1 -0
- package/dist/MalayConverter.js +3 -0
- package/dist/MalayConverter.js.map +1 -0
- package/dist/MarathiConverter.js +3 -0
- package/dist/MarathiConverter.js.map +1 -0
- package/dist/NorwegianBokmalConverter.js +3 -0
- package/dist/NorwegianBokmalConverter.js.map +1 -0
- package/dist/PersianConverter.js +3 -0
- package/dist/PersianConverter.js.map +1 -0
- package/dist/PolishConverter.js +3 -0
- package/dist/PolishConverter.js.map +1 -0
- package/dist/PortugueseConverter.js +3 -0
- package/dist/PortugueseConverter.js.map +1 -0
- package/dist/PunjabiConverter.js +3 -0
- package/dist/PunjabiConverter.js.map +1 -0
- package/dist/RomanianConverter.js +3 -0
- package/dist/RomanianConverter.js.map +1 -0
- package/dist/RussianConverter.js +3 -0
- package/dist/RussianConverter.js.map +1 -0
- package/dist/SerbianCyrillicConverter.js +3 -0
- package/dist/SerbianCyrillicConverter.js.map +1 -0
- package/dist/SerbianLatinConverter.js +3 -0
- package/dist/SerbianLatinConverter.js.map +1 -0
- package/dist/SimplifiedChineseConverter.js +3 -0
- package/dist/SimplifiedChineseConverter.js.map +1 -0
- package/dist/SpanishConverter.js +3 -0
- package/dist/SpanishConverter.js.map +1 -0
- package/dist/SwahiliConverter.js +3 -0
- package/dist/SwahiliConverter.js.map +1 -0
- package/dist/SwedishConverter.js +3 -0
- package/dist/SwedishConverter.js.map +1 -0
- package/dist/TamilConverter.js +3 -0
- package/dist/TamilConverter.js.map +1 -0
- package/dist/TeluguConverter.js +3 -0
- package/dist/TeluguConverter.js.map +1 -0
- package/dist/ThaiConverter.js +3 -0
- package/dist/ThaiConverter.js.map +1 -0
- package/dist/TraditionalChineseConverter.js +3 -0
- package/dist/TraditionalChineseConverter.js.map +1 -0
- package/dist/TurkishConverter.js +3 -0
- package/dist/TurkishConverter.js.map +1 -0
- package/dist/UkrainianConverter.js +3 -0
- package/dist/UkrainianConverter.js.map +1 -0
- package/dist/UrduConverter.js +3 -0
- package/dist/UrduConverter.js.map +1 -0
- package/dist/VietnameseConverter.js +3 -0
- package/dist/VietnameseConverter.js.map +1 -0
- package/dist/n2words.js +3 -2
- package/dist/n2words.js.map +1 -1
- package/lib/classes/abstract-language.d.ts +158 -34
- package/lib/classes/abstract-language.js +223 -115
- package/lib/classes/greedy-scale-language.d.ts +109 -0
- package/lib/classes/greedy-scale-language.js +201 -0
- package/lib/classes/slavic-language.d.ts +148 -0
- package/lib/classes/slavic-language.js +281 -0
- package/lib/classes/south-asian-language.d.ts +70 -0
- package/lib/classes/south-asian-language.js +154 -0
- package/lib/classes/turkic-language.d.ts +26 -0
- package/lib/classes/turkic-language.js +59 -0
- package/lib/languages/ar.d.ts +30 -0
- package/lib/languages/ar.js +159 -0
- package/lib/languages/az.d.ts +12 -0
- package/lib/languages/az.js +42 -0
- package/lib/languages/bn.d.ts +11 -0
- package/lib/languages/bn.js +131 -0
- package/lib/languages/cs.d.ts +88 -0
- package/lib/languages/cs.js +143 -0
- package/lib/languages/da.d.ts +15 -0
- package/lib/languages/da.js +120 -0
- package/lib/languages/de.d.ts +14 -0
- package/lib/languages/de.js +101 -0
- package/lib/languages/el.d.ts +14 -0
- package/lib/languages/el.js +90 -0
- package/lib/languages/en.d.ts +16 -0
- package/lib/languages/en.js +86 -0
- package/lib/languages/es.d.ts +15 -0
- package/lib/languages/es.js +121 -0
- package/lib/languages/fa.d.ts +47 -0
- package/lib/languages/fa.js +144 -0
- package/lib/languages/fil.d.ts +16 -0
- package/lib/languages/fil.js +121 -0
- package/lib/languages/fr-BE.d.ts +11 -0
- package/lib/languages/fr-BE.js +25 -0
- package/lib/languages/fr.d.ts +15 -0
- package/lib/languages/fr.js +106 -0
- package/lib/languages/gu.d.ts +11 -0
- package/lib/languages/gu.js +132 -0
- package/lib/languages/hbo.d.ts +113 -0
- package/lib/languages/hbo.js +251 -0
- package/lib/languages/he.d.ts +80 -0
- package/lib/languages/he.js +206 -0
- package/lib/languages/hi.d.ts +11 -0
- package/lib/languages/hi.js +131 -0
- package/lib/languages/hr.d.ts +80 -0
- package/lib/languages/hr.js +113 -0
- package/lib/languages/hu.d.ts +22 -0
- package/lib/languages/hu.js +137 -0
- package/lib/languages/id.d.ts +37 -0
- package/lib/languages/id.js +159 -0
- package/lib/languages/it.d.ts +37 -0
- package/lib/languages/it.js +132 -0
- package/lib/languages/ja.d.ts +17 -0
- package/lib/languages/ja.js +137 -0
- package/lib/languages/kn.d.ts +11 -0
- package/lib/languages/kn.js +42 -0
- package/lib/languages/ko.d.ts +14 -0
- package/lib/languages/ko.js +55 -0
- package/lib/{i18n/pl.d.ts → languages/lt.d.ts} +18 -15
- package/lib/languages/lt.js +136 -0
- package/lib/{i18n/lt.d.ts → languages/lv.d.ts} +16 -14
- package/lib/languages/lv.js +130 -0
- package/lib/languages/mr.d.ts +11 -0
- package/lib/languages/mr.js +132 -0
- package/lib/languages/ms.d.ts +31 -0
- package/lib/languages/ms.js +150 -0
- package/lib/languages/nb.d.ts +12 -0
- package/lib/languages/nb.js +100 -0
- package/lib/languages/nl.d.ts +16 -0
- package/lib/languages/nl.js +155 -0
- package/lib/languages/pa.d.ts +11 -0
- package/lib/languages/pa.js +131 -0
- package/lib/{i18n/uk.d.ts → languages/pl.d.ts} +16 -14
- package/lib/languages/pl.js +110 -0
- package/lib/languages/pt.d.ts +29 -0
- package/lib/languages/pt.js +112 -0
- package/lib/languages/ro.d.ts +158 -0
- package/lib/languages/ro.js +273 -0
- package/lib/languages/ru.d.ts +85 -0
- package/lib/languages/ru.js +96 -0
- package/lib/languages/sr-Cyrl.d.ts +80 -0
- package/lib/languages/sr-Cyrl.js +113 -0
- package/lib/{i18n/cz.d.ts → languages/sr-Latn.d.ts} +26 -14
- package/lib/languages/sr-Latn.js +113 -0
- package/lib/languages/sv.d.ts +14 -0
- package/lib/languages/sv.js +90 -0
- package/lib/languages/sw.d.ts +39 -0
- package/lib/languages/sw.js +126 -0
- package/lib/languages/ta.d.ts +20 -0
- package/lib/languages/ta.js +226 -0
- package/lib/languages/te.d.ts +22 -0
- package/lib/languages/te.js +219 -0
- package/lib/languages/th.d.ts +17 -0
- package/lib/languages/th.js +117 -0
- package/lib/languages/tr.d.ts +12 -0
- package/lib/languages/tr.js +56 -0
- package/lib/languages/uk.d.ts +85 -0
- package/lib/{i18n → languages}/uk.js +33 -32
- package/lib/languages/ur.d.ts +11 -0
- package/lib/languages/ur.js +131 -0
- package/lib/{i18n → languages}/vi.d.ts +15 -13
- package/lib/languages/vi.js +147 -0
- package/lib/languages/zh-Hans.d.ts +21 -0
- package/lib/languages/zh-Hans.js +111 -0
- package/lib/languages/zh-Hant.d.ts +21 -0
- package/lib/languages/zh-Hant.js +111 -0
- package/lib/n2words.d.ts +207 -7
- package/lib/n2words.js +535 -81
- package/package.json +126 -79
- package/dist/ar.js +0 -2
- package/dist/ar.js.map +0 -1
- package/dist/az.js +0 -2
- package/dist/az.js.map +0 -1
- package/dist/cz.js +0 -2
- package/dist/cz.js.map +0 -1
- package/dist/de.js +0 -2
- package/dist/de.js.map +0 -1
- package/dist/dk.js +0 -2
- package/dist/dk.js.map +0 -1
- package/dist/en.js +0 -2
- package/dist/en.js.map +0 -1
- package/dist/es.js +0 -2
- package/dist/es.js.map +0 -1
- package/dist/fa.js +0 -2
- package/dist/fa.js.map +0 -1
- package/dist/fr-BE.js +0 -2
- package/dist/fr-BE.js.map +0 -1
- package/dist/fr.js +0 -2
- package/dist/fr.js.map +0 -1
- package/dist/he.js +0 -2
- package/dist/he.js.map +0 -1
- package/dist/hr.js +0 -2
- package/dist/hr.js.map +0 -1
- package/dist/hu.js +0 -2
- package/dist/hu.js.map +0 -1
- package/dist/id.js +0 -2
- package/dist/id.js.map +0 -1
- package/dist/it.js +0 -2
- package/dist/it.js.map +0 -1
- package/dist/ko.js +0 -2
- package/dist/ko.js.map +0 -1
- package/dist/lt.js +0 -2
- package/dist/lt.js.map +0 -1
- package/dist/lv.js +0 -2
- package/dist/lv.js.map +0 -1
- package/dist/n2words.d.ts +0 -2
- package/dist/nl.js +0 -2
- package/dist/nl.js.map +0 -1
- package/dist/no.js +0 -2
- package/dist/no.js.map +0 -1
- package/dist/pl.js +0 -2
- package/dist/pl.js.map +0 -1
- package/dist/pt.js +0 -2
- package/dist/pt.js.map +0 -1
- package/dist/ro.js +0 -2
- package/dist/ro.js.map +0 -1
- package/dist/ru.js +0 -2
- package/dist/ru.js.map +0 -1
- package/dist/sr.js +0 -2
- package/dist/sr.js.map +0 -1
- package/dist/tr.js +0 -2
- package/dist/tr.js.map +0 -1
- package/dist/uk.js +0 -2
- package/dist/uk.js.map +0 -1
- package/dist/vi.js +0 -2
- package/dist/vi.js.map +0 -1
- package/dist/zh.js +0 -2
- package/dist/zh.js.map +0 -1
- package/lib/classes/base-language.d.ts +0 -58
- package/lib/classes/base-language.js +0 -172
- package/lib/i18n/ar.d.ts +0 -41
- package/lib/i18n/ar.js +0 -209
- package/lib/i18n/az.d.ts +0 -15
- package/lib/i18n/az.js +0 -66
- package/lib/i18n/cz.js +0 -135
- package/lib/i18n/de.d.ts +0 -17
- package/lib/i18n/de.js +0 -103
- package/lib/i18n/dk.d.ts +0 -14
- package/lib/i18n/dk.js +0 -110
- package/lib/i18n/en.d.ts +0 -22
- package/lib/i18n/en.js +0 -86
- package/lib/i18n/es.d.ts +0 -16
- package/lib/i18n/es.js +0 -110
- package/lib/i18n/fa.d.ts +0 -54
- package/lib/i18n/fa.js +0 -106
- package/lib/i18n/fr-BE.d.ts +0 -11
- package/lib/i18n/fr-BE.js +0 -20
- package/lib/i18n/fr.d.ts +0 -15
- package/lib/i18n/fr.js +0 -99
- package/lib/i18n/he.d.ts +0 -61
- package/lib/i18n/he.js +0 -132
- package/lib/i18n/hr.d.ts +0 -68
- package/lib/i18n/hr.js +0 -129
- package/lib/i18n/hu.d.ts +0 -17
- package/lib/i18n/hu.js +0 -135
- package/lib/i18n/id.d.ts +0 -43
- package/lib/i18n/id.js +0 -156
- package/lib/i18n/it.d.ts +0 -29
- package/lib/i18n/it.js +0 -137
- package/lib/i18n/ko.d.ts +0 -15
- package/lib/i18n/ko.js +0 -56
- package/lib/i18n/lt.js +0 -138
- package/lib/i18n/lv.d.ts +0 -57
- package/lib/i18n/lv.js +0 -120
- package/lib/i18n/nl.d.ts +0 -20
- package/lib/i18n/nl.js +0 -125
- package/lib/i18n/no.d.ts +0 -15
- package/lib/i18n/no.js +0 -77
- package/lib/i18n/pl.js +0 -126
- package/lib/i18n/pt.d.ts +0 -26
- package/lib/i18n/pt.js +0 -118
- package/lib/i18n/ro.d.ts +0 -109
- package/lib/i18n/ro.js +0 -360
- package/lib/i18n/ru.d.ts +0 -30
- package/lib/i18n/ru.js +0 -198
- package/lib/i18n/sr.d.ts +0 -56
- package/lib/i18n/sr.js +0 -127
- package/lib/i18n/tr.d.ts +0 -15
- package/lib/i18n/tr.js +0 -64
- package/lib/i18n/vi.js +0 -151
- package/lib/i18n/zh.d.ts +0 -18
- 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
|
+
}
|