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,25 +1,19 @@
1
- import GreedyScaleLanguage from '../classes/greedy-scale-language.js'
2
-
3
- /**
4
- * @typedef {Object} DutchOptions
5
- * @property {boolean} [includeOptionalAnd=false] Include optional "en" separator.
6
- * @property {boolean} [noHundredPairs=false] Disable comma before hundreds.
7
- * @property {boolean} [accentOne=true] Use accented "één" for one.
8
- */
1
+ import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'
9
2
 
10
3
  /**
11
4
  * Dutch language converter.
12
5
  *
13
- * Features:
14
- * - Optional "en" (and) separator for tens (includeOptionalAnd)
15
- * - Optional comma before hundreds (noHundredPairs)
6
+ * Supports:
7
+ * - Optional "en" (and) separator for tens
8
+ * - Optional comma before hundreds
16
9
  * - Compound word formation without hyphenation
17
10
  */
18
11
  export class Dutch extends GreedyScaleLanguage {
19
12
  negativeWord = 'min'
20
13
  decimalSeparatorWord = 'komma'
21
14
  zeroWord = 'nul'
22
- scaleWordPairs = [
15
+
16
+ scaleWords = [
23
17
  [1_000_000_000_000_000_000_000_000_000n, 'quadriljard'],
24
18
  [1_000_000_000_000_000_000_000_000n, 'quadriljoen'],
25
19
  [1_000_000_000_000_000_000_000n, 'triljard'],
@@ -60,147 +54,102 @@ export class Dutch extends GreedyScaleLanguage {
60
54
  [0n, 'nul']
61
55
  ]
62
56
 
63
- /**
64
- * Initializes the Dutch converter with language-specific options.
65
- *
66
- * @param {DutchOptions} [options={}] Configuration options.
67
- */
68
- constructor ({ includeOptionalAnd = false, noHundredPairs = false, accentOne = true } = {}) {
57
+ constructor (options = {}) {
69
58
  super()
70
59
 
71
- this.includeOptionalAnd = includeOptionalAnd
72
-
73
- this.noHundredPairs = noHundredPairs
60
+ this.setOptions({
61
+ includeOptionalAnd: false,
62
+ noHundredPairing: false,
63
+ accentOne: true
64
+ }, options)
74
65
 
75
- this.accentOne = accentOne
76
- if (!this.accentOne) {
77
- this.scaleWordPairs[this.scaleWordPairs.length - 2][1] = 'een'
66
+ if (!this.options.accentOne) {
67
+ this.scaleWords[this.scaleWords.length - 2][1] = 'een'
78
68
  }
79
69
  }
80
70
 
81
- /**
82
- * Merges two adjacent word-number pairs according to Dutch grammar rules.
83
- *
84
- * Dutch-specific rules:
85
- * - Implicit "één": `mergeScales({ 'één': 1n }, { 'duizend': 1000n })` `{ 'duizend': 1000n }`
86
- * - Reversed digit order for tens + units: `mergeScales({ 'twintig': 20n }, { 'één': 1n })` `{ 'ééntwintig': 21n }`
87
- * - Optional "en" separator based on includeOptionalAnd option
88
- * - Compound words without separators for most combinations
89
- * - Converts 'één' to 'een' in compound words (no accent in compounds)
90
- * - Space separators for large numbers (millions+)
91
- *
92
- * @param {Object} current The left operand as `{ word: BigInt }`.
93
- * @param {Object} next The right operand as `{ word: BigInt }`.
94
- * @returns {Object} Merged pair with combined word and resulting numeric value.
95
- *
96
- * @example
97
- * mergeScales({ 'één': 1n }, { 'duizend': 1000n }); // { 'duizend': 1000n }
98
- * mergeScales({ 'twintig': 20n }, { 'drie': 3n }); // { 'drieentwintig': 23n }
99
- */
100
- mergeScales (current, next) {
101
- let cText = Object.keys(current)[0]
102
- let nText = Object.keys(next)[0]
103
- const cNumber = Object.values(current)[0] // BigInt
104
- const nNumber = Object.values(next)[0] // BigInt
71
+ /** Combines two word-sets according to Dutch grammar rules. */
72
+ combineWordSets (preceding, following) {
73
+ let precedingWord = Object.keys(preceding)[0]
74
+ let followingWord = Object.keys(following)[0]
75
+ const precedingValue = Object.values(preceding)[0] // BigInt
76
+ const followingValue = Object.values(following)[0] // BigInt
105
77
 
106
78
  // Implicit "een": omit before large multipliers ("miljoen" not "een miljoen")
107
- if (cNumber === 1n) {
108
- if (nNumber < 1_000_000n) {
109
- return next
79
+ if (precedingValue === 1n) {
80
+ if (followingValue < 1_000_000n) {
81
+ return following
110
82
  }
111
- cText = this.accentOne ? 'één' : 'een'
83
+ precedingWord = this.options.accentOne ? 'één' : 'een'
112
84
  }
113
85
 
114
86
  // Handle multiplication and spacing
115
- if (nNumber > cNumber) {
87
+ if (followingValue > precedingValue) {
116
88
  let hadSpace = false
117
89
  // Large scale words (millions+): add space before multiplier
118
- if (nNumber >= 1_000_000n) {
119
- cText += ' '
90
+ if (followingValue >= 1_000_000n) {
91
+ precedingWord += ' '
120
92
  hadSpace = true
121
- } else if (nNumber > 100n) {
93
+ } else if (followingValue > 100n) {
122
94
  // Hundreds and above: add space after multiplier
123
- nText += ' '
95
+ followingWord += ' '
124
96
  hadSpace = true
125
97
  }
126
98
  // Convert 'één' to 'een' in compounds (when no space or accentOne disabled)
127
- if (!hadSpace || !this.accentOne) {
128
- cText = cText.replace(/één/g, 'een')
129
- nText = nText.replace(/één/g, 'een')
99
+ if (!hadSpace || !this.options.accentOne) {
100
+ precedingWord = precedingWord.replace(/één/g, 'een')
101
+ followingWord = followingWord.replace(/één/g, 'een')
130
102
  }
131
- return { [`${cText}${nText}`]: cNumber * nNumber }
103
+ return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }
132
104
  }
133
105
 
134
106
  // Track if we're adding a space (which keeps words separate)
135
107
  let hasSpace = false
136
108
 
137
- if (nNumber < 10n && cNumber > 10n && cNumber < 100n) {
138
- const temporary = nText
139
- nText = cText
109
+ if (followingValue < 10n && precedingValue > 10n && precedingValue < 100n) {
110
+ const temporary = followingWord
111
+ followingWord = precedingWord
140
112
  const andTxt = temporary.endsWith('e') ? 'ën' : 'en'
141
- cText = `${temporary}${andTxt}`
142
- } else if (nNumber < 13n && cNumber < 1000n && this.includeOptionalAnd) {
143
- cText = `${cText}en`
144
- } else if (nNumber < 13n && cNumber >= 1000n && this.includeOptionalAnd) {
145
- nText = ` en ${nText}`
113
+ precedingWord = `${temporary}${andTxt}`
114
+ } else if (followingValue < 13n && precedingValue < 1000n && this.options.includeOptionalAnd) {
115
+ precedingWord = `${precedingWord}en`
116
+ } else if (followingValue < 13n && precedingValue >= 1000n && this.options.includeOptionalAnd) {
117
+ followingWord = ` en ${followingWord}`
146
118
  hasSpace = true
147
- } else if (cNumber >= 1_000_000n) {
148
- cText += ' '
119
+ } else if (precedingValue >= 1_000_000n) {
120
+ precedingWord += ' '
149
121
  hasSpace = true
150
- } else if (cNumber === 1000n) {
151
- cText += ' '
122
+ } else if (precedingValue === 1000n) {
123
+ precedingWord += ' '
152
124
  hasSpace = true
153
125
  }
154
126
 
155
127
  // Convert 'één' to 'een' in direct compounds (no space)
156
128
  // Keep 'één' only if there's a space AND accentOne=true
157
129
  if (!hasSpace) {
158
- cText = cText.replace(/één/g, 'een')
159
- nText = nText.replace(/één/g, 'een')
160
- } else if (!this.accentOne) {
161
- cText = cText.replace(/één/g, 'een')
162
- nText = nText.replace(/één/g, 'een')
130
+ precedingWord = precedingWord.replace(/één/g, 'een')
131
+ followingWord = followingWord.replace(/één/g, 'een')
132
+ } else if (!this.options.accentOne) {
133
+ precedingWord = precedingWord.replace(/één/g, 'een')
134
+ followingWord = followingWord.replace(/één/g, 'een')
163
135
  }
164
136
 
165
- return { [`${cText}${nText}`]: cNumber + nNumber }
137
+ return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }
166
138
  }
167
139
 
168
- convertWholePart (value) {
169
- if (value >= 1100n && value < 10_000n && !this.noHundredPairs) {
170
- const high = value / 100n
171
- const low = value % 100n
140
+ integerToWords (integerPart) {
141
+ if (integerPart >= 1100n && integerPart < 10_000n && !this.options.noHundredPairing) {
142
+ const high = integerPart / 100n
143
+ const low = integerPart % 100n
172
144
  if (high % 10n !== 0n) {
173
- let result = super.convertWholePart(high) + 'honderd'
145
+ let result = super.integerToWords(high) + 'honderd'
174
146
  if (low) {
175
147
  result +=
176
- (this.includeOptionalAnd ? ' en ' : ' ') + super.convertWholePart(low)
148
+ (this.options.includeOptionalAnd ? ' en ' : ' ') + super.integerToWords(low)
177
149
  }
178
150
  return result
179
151
  }
180
152
  }
181
- return super.convertWholePart(value)
153
+ return super.integerToWords(integerPart)
182
154
  }
183
155
  }
184
-
185
- /**
186
- * Converts a number to Dutch cardinal (written) form.
187
- *
188
- * @param {number|string|bigint} value The number to convert.
189
- * @param {Object} [options] Conversion options (see Dutch class options).
190
- * @param {boolean} [options.includeOptionalAnd=false] Include optional 'en' (and) separator.
191
- * @param {boolean} [options.noHundredPairs=false] Don't combine hundreds with tens/units.
192
- * @param {boolean} [options.accentOne=true] Use accented 'één' for standalone 1.
193
- * @returns {string} The number expressed in Dutch words.
194
- * @throws {TypeError} If value is NaN or invalid type.
195
- * @throws {Error} If value is an invalid number string.
196
- *
197
- * @example
198
- * convertToWords(1); // 'één' (default accent)
199
- * convertToWords(1, { accentOne: false }); // 'een'
200
- * convertToWords(21); // 'eenentwintig' (no accent in compounds)
201
- * convertToWords(42); // 'tweeenveertig'
202
- * convertToWords('1.5'); // 'één komma vijf'
203
- */
204
- export default function convertToWords (value, options = {}) {
205
- return new Dutch(options).convertToWords(value)
206
- }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Punjabi language converter.
3
+ *
4
+ * Supports:
5
+ * - Indian numbering system (ਹਜ਼ਾਰ, ਲੱਖ, ਕਰੋੜ)
6
+ * - Gurmukhi script
7
+ * - Complete word forms for 0-99
8
+ */
9
+ export class Punjabi 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 Punjabi extends SouthAsianLanguage {
3
+ /**
4
+ * Punjabi language converter.
5
+ *
6
+ * Supports:
7
+ * - Indian numbering system (ਹਜ਼ਾਰ, ਲੱਖ, ਕਰੋੜ)
8
+ * - Gurmukhi script
9
+ * - Complete word forms for 0-99
10
+ */
11
+ export class Punjabi 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 Punjabi extends SouthAsianLanguage {
120
129
  'ਸ਼ੰਖ'
121
130
  ]
122
131
  }
123
-
124
- export default function convertToWords (value, options = {}) {
125
- return new Punjabi(options).convertToWords(value)
126
- }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Polish language converter.
3
+ *
4
+ * Supports:
5
+ * - Three-form pluralization (one/few/many)
6
+ * - Polish-specific declension patterns
7
+ * - Distinctive Polish phonology and orthography
8
+ */
9
+ export class Polish 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
+ /** Implements Polish-specific three-form pluralization rules. */
78
+ pluralize(n: any, forms: any): any;
79
+ }
80
+ import { SlavicLanguage } from '../classes/slavic-language.js';
@@ -1,39 +1,19 @@
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
  * Polish language converter.
10
5
  *
11
- * Implements Polish number words using the Slavic language pattern:
12
- * - Polish number words (jeden, dwa, trzy, cztery, pięć...)
13
- * - Complex Slavic three-form pluralization (tysiąc/tysiące/tysięcy)
6
+ * Supports:
7
+ * - Three-form pluralization (one/few/many)
14
8
  * - Polish-specific declension patterns
15
9
  * - Distinctive Polish phonology and orthography
16
- *
17
- * Key Features:
18
- * - Three-form pluralization system shared across Slavic languages
19
- * * Form 1 (singular): 1 (e.g., "tysiąc")
20
- * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., "tysiące")
21
- * * Form 3 (many): all other numbers (e.g., "tysięcy")
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
- *
25
- * Features:
26
- * - Polish diacritical marks (ą, ć, ę, ł, ń, ś, ź, ż)
27
- * - Gender and case agreement
28
- * - Polish-specific number word endings
29
- *
30
- * Inherits from SlavicLanguage for complex pluralization algorithms.
31
10
  */
32
11
  export class Polish extends SlavicLanguage {
33
12
  negativeWord = 'minus'
34
13
  decimalSeparatorWord = 'przecinek'
35
14
  zeroWord = 'zero'
36
- ones = {
15
+
16
+ onesWords = {
37
17
  1: 'jeden',
38
18
  2: 'dwa',
39
19
  3: 'trzy',
@@ -45,7 +25,19 @@ export class Polish extends SlavicLanguage {
45
25
  9: 'dziewięć'
46
26
  }
47
27
 
48
- tens = {
28
+ onesFeminineWords = {
29
+ 1: 'jedna',
30
+ 2: 'dwie',
31
+ 3: 'trzy',
32
+ 4: 'cztery',
33
+ 5: 'pięć',
34
+ 6: 'sześć',
35
+ 7: 'siedem',
36
+ 8: 'osiem',
37
+ 9: 'dziewięć'
38
+ }
39
+
40
+ teensWords = {
49
41
  0: 'dziesięć',
50
42
  1: 'jedenaście',
51
43
  2: 'dwanaście',
@@ -58,7 +50,7 @@ export class Polish extends SlavicLanguage {
58
50
  9: 'dziewiętnaście'
59
51
  }
60
52
 
61
- twenties = {
53
+ twentiesWords = {
62
54
  2: 'dwadzieścia',
63
55
  3: 'trzydzieści',
64
56
  4: 'czterdzieści',
@@ -69,7 +61,7 @@ export class Polish extends SlavicLanguage {
69
61
  9: 'dziewięćdziesiąt'
70
62
  }
71
63
 
72
- hundreds = {
64
+ hundredsWords = {
73
65
  1: 'sto',
74
66
  2: 'dwieście',
75
67
  3: 'trzysta',
@@ -81,7 +73,7 @@ export class Polish extends SlavicLanguage {
81
73
  9: 'dziewięćset'
82
74
  }
83
75
 
84
- thousands = {
76
+ pluralForms = {
85
77
  1: ['tysiąc', 'tysiące', 'tysięcy'], // 10^ 3
86
78
  2: ['milion', 'miliony', 'milionów'], // 10^ 6
87
79
  3: ['miliard', 'miliardy', 'miliardów'], // 10^ 9
@@ -95,17 +87,12 @@ export class Polish extends SlavicLanguage {
95
87
  }
96
88
 
97
89
  /**
98
- * Implements Polish-specific three-form pluralization rules.
99
- *
100
- * Polish three-form system:
101
- * - Form 1 (singular): exactly n=1 (e.g., "tysiąc")
102
- * - Form 2 (few): n ends in 2-4, excluding teens (22-24, 32-34...) (e.g., "tysiące")
103
- * - Form 3 (many): all other numbers (e.g., "tysięcy")
104
- *
105
- * @param {bigint} n The number to classify.
106
- * @param {Array<string>} forms Array of [singular, few, many] word forms.
107
- * @returns {string} The appropriate form for the number n.
90
+ * Polish omits "one" before scale words.
91
+ * e.g., 1000 is "tysiąc" not "jeden tysiąc"
108
92
  */
93
+ omitOneBeforeScale = true
94
+
95
+ /** Implements Polish-specific three-form pluralization rules. */
109
96
  pluralize (n, forms) {
110
97
  if (n === 1n) {
111
98
  return forms[0]
@@ -120,70 +107,4 @@ export class Polish extends SlavicLanguage {
120
107
 
121
108
  return forms[2]
122
109
  }
123
-
124
- /**
125
- * Converts a whole number to Polish cardinal form.
126
- *
127
- * Algorithm (chunk-based decomposition):
128
- * 1. Split number into chunks of 3 digits (right-to-left): ones, thousands, millions, etc.
129
- * 2. For each non-zero chunk:
130
- * a. Extract hundreds digit (n3), tens digit (n2), ones digit (n1)
131
- * b. Add hundreds word (e.g., "sto", "dwieście")
132
- * c. Add tens/ones (handles teens 10-19 separately from compound tens)
133
- * d. Add pluralized magnitude word (e.g., "tysiące", "miliony")
134
- * 3. Join all words with spaces
135
- *
136
- * Example: 1234 → chunks [1, 234] → "jeden tysiąc dwieście trzydzieści cztery"
137
- * - Chunk 1 (index=1, thousands): "jeden" + "tysiąc"
138
- * - Chunk 234 (index=0): "dwieście" + "trzydzieści" + "cztery"
139
- *
140
- * Special case: When chunk=1 at thousands+ levels, omit the ones word to avoid
141
- * redundancy with the pluralized magnitude (e.g., just "tysiąc" not "jeden tysiąc").
142
- *
143
- * @param {bigint} number The whole number to convert.
144
- * @returns {string} The number expressed in Polish words.
145
- */
146
- convertWholePart (number) {
147
- if (number === 0n) {
148
- return this.zeroWord
149
- }
150
- const words = []
151
- const chunks = this.splitByX(number.toString(), 3)
152
- let index = chunks.length
153
- for (const x of chunks) {
154
- index = index - 1
155
- if (x === 0n) {
156
- continue
157
- }
158
- const [n1, n2, n3] = this.getDigits(x)
159
- if (n3 > 0n) {
160
- words.push(this.hundreds[n3])
161
- }
162
- if (n2 > 1n) {
163
- words.push(this.twenties[n2])
164
- }
165
- if (n2 === 1n) {
166
- words.push(this.tens[n1])
167
- } else if (n1 > 0n && !(index > 0 && x === 1n)) {
168
- words.push(this.ones[n1])
169
- }
170
- if (index > 0) {
171
- words.push(this.pluralize(x, this.thousands[index]))
172
- }
173
- }
174
- return words.join(' ')
175
- }
176
- }
177
-
178
- /**
179
- * Converts a number to Polish cardinal (written) form.
180
- *
181
- * @param {number|string|bigint} value The number to convert.
182
- * @param {SlavicOptions} [options={}] Configuration options.
183
- * @returns {string} The number expressed in Polish words.
184
- * @throws {TypeError} If value is NaN or invalid type.
185
- * @throws {Error} If value is an invalid number string.
186
- */
187
- export default function convertToWords (value, options = {}) {
188
- return new Polish(options).convertToWords(value)
189
110
  }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * (European) Portuguese language converter.
3
+ *
4
+ * Supports:
5
+ * - Gender-aware hundreds (duzentos, trezentos)
6
+ * - "e" (and) conjunction for number combinations
7
+ * - Post-processing to normalize word flow
8
+ */
9
+ export class Portuguese extends GreedyScaleLanguage {
10
+ static POSTCLEAN_REGEX: RegExp;
11
+ scaleWords: (string | bigint)[][];
12
+ hundredsWords: {
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
+ finalizeWords(words: any): any;
24
+ /** Combines two word-sets according to Portuguese grammar rules. */
25
+ combineWordSets(preceding: any, following: any): {
26
+ [x: string]: any;
27
+ };
28
+ }
29
+ import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js';