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,226 @@
1
+ import { AbstractLanguage } from '../classes/abstract-language.js'
2
+
3
+ /**
4
+ * Tamil language converter.
5
+ *
6
+ * Supports:
7
+ * - Tamil numbering system
8
+ * - Tamil script
9
+ * - Complete word forms for 0-99
10
+ */
11
+ export class Tamil extends AbstractLanguage {
12
+ negativeWord = 'மைனஸ்'
13
+ decimalSeparatorWord = 'புள்ளி'
14
+ zeroWord = 'பூஜ்ஜியம்'
15
+ usePerDigitDecimals = true // Enable digit-by-digit decimal conversion
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
+ hundredsWords = [
121
+ '',
122
+ 'நூறு',
123
+ 'இருநூறு',
124
+ 'முன்னூறு',
125
+ 'நானூறு',
126
+ 'ஐநூறு',
127
+ 'அறுநூறு',
128
+ 'எழுநூறு',
129
+ 'எண்நூறு',
130
+ 'தொள்ளாயிரம்'
131
+ ]
132
+
133
+ // Ones words map 1–9 for decimal reading
134
+ onesWords = [
135
+ 'ஒன்று',
136
+ 'இரண்டு',
137
+ 'மூன்று',
138
+ 'நான்கு',
139
+ 'ஐந்து',
140
+ 'ஆறு',
141
+ 'ஏழு',
142
+ 'எட்டு',
143
+ 'ஒன்பது'
144
+ ]
145
+
146
+ scaleWords = [
147
+ '',
148
+ 'ஆயிரம்',
149
+ 'லட்சம்',
150
+ 'கோடி',
151
+ 'அரபு',
152
+ 'கராபு',
153
+ 'நீல்',
154
+ 'பத்ம',
155
+ 'சங்கு'
156
+ ]
157
+
158
+ /** Convert numbers below 100 to Tamil words. */
159
+ convertBelowHundred (number) {
160
+ return this.belowHundredWords[number]
161
+ }
162
+
163
+ convertBelowThousand (number) {
164
+ if (number === 0) return ''
165
+ if (number < 100) return this.convertBelowHundred(number)
166
+
167
+ const hundreds = Math.trunc(number / 100)
168
+ const remainder = number % 100
169
+ let hundredPart = this.hundredsWords[hundreds]
170
+
171
+ if (remainder > 0) {
172
+ if (hundredPart.endsWith('ம்')) {
173
+ hundredPart = hundredPart.replace(/ம்$/, 'த்து')
174
+ } else if (hundredPart.endsWith('று')) {
175
+ hundredPart = hundredPart.slice(0, -2) + 'ற்று'
176
+ }
177
+ }
178
+
179
+ const parts = [hundredPart]
180
+ if (remainder > 0) {
181
+ parts.push(this.convertBelowHundred(remainder))
182
+ }
183
+
184
+ return parts.join(' ').trim()
185
+ }
186
+
187
+ splitIndian (number) {
188
+ const numStr = number.toString()
189
+ if (numStr.length <= 3) return [Number(numStr)]
190
+
191
+ const groups = []
192
+ const last3 = numStr.slice(-3)
193
+ groups.unshift(Number(last3))
194
+
195
+ let remaining = numStr.slice(0, -3)
196
+ while (remaining.length > 0) {
197
+ const group = remaining.slice(-2)
198
+ groups.unshift(Number(group))
199
+ remaining = remaining.slice(0, -2)
200
+ }
201
+
202
+ return groups
203
+ }
204
+
205
+ integerToWords (integerPart) {
206
+ if (integerPart === 0n) return this.zeroWord
207
+
208
+ const groups = this.splitIndian(integerPart)
209
+ const groupCount = groups.length
210
+ const words = []
211
+
212
+ for (let i = 0; i < groupCount; i++) {
213
+ const groupValue = groups[i]
214
+ if (groupValue === 0) continue
215
+
216
+ const scaleIndex = groupCount - i - 1
217
+ const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ஒரு' : this.convertBelowThousand(groupValue)
218
+ words.push(groupWords)
219
+ if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {
220
+ words.push(this.scaleWords[scaleIndex])
221
+ }
222
+ }
223
+
224
+ return words.join(' ').trim()
225
+ }
226
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Telugu language converter.
3
+ *
4
+ * Supports:
5
+ * - Telugu numbering system
6
+ * - Telugu script
7
+ * - Complete word forms for 0-99
8
+ */
9
+ export class Telugu extends AbstractLanguage {
10
+ belowHundredWords: string[];
11
+ hundredsWords: string[];
12
+ onesWords: string[];
13
+ scaleWords: string[];
14
+ /** Convert numbers below 100 to Telugu words. */
15
+ convertBelowHundred(number: any): string;
16
+ /** Convert numbers below 1000 to Telugu words. */
17
+ convertBelowThousand(number: any): string;
18
+ /** Split a number using Indian-style grouping (3-2-2 digits from right). */
19
+ splitIndian(number: any): number[];
20
+ integerToWords(integerPart: any): string;
21
+ }
22
+ import { AbstractLanguage } from '../classes/abstract-language.js';
@@ -0,0 +1,219 @@
1
+ import { AbstractLanguage } from '../classes/abstract-language.js'
2
+
3
+ /**
4
+ * Telugu language converter.
5
+ *
6
+ * Supports:
7
+ * - Telugu numbering system
8
+ * - Telugu script
9
+ * - Complete word forms for 0-99
10
+ */
11
+ export class Telugu extends AbstractLanguage {
12
+ negativeWord = 'మైనస్'
13
+ decimalSeparatorWord = 'పాయింట్'
14
+ zeroWord = 'సున్నా'
15
+ usePerDigitDecimals = true // Enable digit-by-digit decimal conversion
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
+ hundredsWords = [
121
+ '',
122
+ 'వంద',
123
+ 'రెండు వందలు',
124
+ 'మూడు వందలు',
125
+ 'నాలుగు వందలు',
126
+ 'ఐదు వందలు',
127
+ 'ఆరు వందలు',
128
+ 'ఏడు వందలు',
129
+ 'ఎనిమిది వందలు',
130
+ 'తొమ్మిది వందలు'
131
+ ]
132
+
133
+ // Ones words map 1–9 for decimal reading
134
+ onesWords = [
135
+ 'ఒకటి',
136
+ 'రెండు',
137
+ 'మూడు',
138
+ 'నాలుగు',
139
+ 'ఐదు',
140
+ 'ఆరు',
141
+ 'ఏడు',
142
+ 'ఎనిమిది',
143
+ 'తొమ్మిది'
144
+ ]
145
+
146
+ scaleWords = [
147
+ '',
148
+ 'వెయ్యి',
149
+ 'లక్ష',
150
+ 'కోటి',
151
+ 'అరబ్',
152
+ 'ఖరబ్',
153
+ 'నిల్',
154
+ 'పడ్మ',
155
+ 'శంకు'
156
+ ]
157
+
158
+ /** Convert numbers below 100 to Telugu words. */
159
+ convertBelowHundred (number) {
160
+ return this.belowHundredWords[number]
161
+ }
162
+
163
+ /** Convert numbers below 1000 to Telugu words. */
164
+ convertBelowThousand (number) {
165
+ if (number === 0) return ''
166
+ if (number < 100) return this.convertBelowHundred(number)
167
+
168
+ const hundreds = Math.trunc(number / 100)
169
+ const remainder = number % 100
170
+ const parts = [this.hundredsWords[hundreds]]
171
+
172
+ if (remainder > 0) {
173
+ parts.push(this.convertBelowHundred(remainder))
174
+ }
175
+
176
+ return parts.join(' ').trim()
177
+ }
178
+
179
+ /** Split a number using Indian-style grouping (3-2-2 digits from right). */
180
+ splitIndian (number) {
181
+ const numStr = number.toString()
182
+ if (numStr.length <= 3) return [Number(numStr)]
183
+
184
+ const groups = []
185
+ const last3 = numStr.slice(-3)
186
+ groups.unshift(Number(last3))
187
+
188
+ let remaining = numStr.slice(0, -3)
189
+ while (remaining.length > 0) {
190
+ const group = remaining.slice(-2)
191
+ groups.unshift(Number(group))
192
+ remaining = remaining.slice(0, -2)
193
+ }
194
+
195
+ return groups
196
+ }
197
+
198
+ integerToWords (integerPart) {
199
+ if (integerPart === 0n) return this.zeroWord
200
+
201
+ const groups = this.splitIndian(integerPart)
202
+ const groupCount = groups.length
203
+ const words = []
204
+
205
+ for (let i = 0; i < groupCount; i++) {
206
+ const groupValue = groups[i]
207
+ if (groupValue === 0) continue
208
+
209
+ const scaleIndex = groupCount - i - 1
210
+ const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ఒక' : this.convertBelowThousand(groupValue)
211
+ words.push(groupWords)
212
+ if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {
213
+ words.push(this.scaleWords[scaleIndex])
214
+ }
215
+ }
216
+
217
+ return words.join(' ').trim()
218
+ }
219
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Thai language converter.
3
+ *
4
+ * Supports:
5
+ * - Thai numerals (ศูนย์, หนึ่ง, สอง, สาม)
6
+ * - No word separators (continuous Thai script)
7
+ * - Digit-by-digit decimal reading
8
+ */
9
+ export class Thai extends AbstractLanguage {
10
+ onesWords: string[];
11
+ /** Converts numbers below one million to Thai words. */
12
+ convertBelowMillion(number: any): string;
13
+ /** Split a number into million-sized groups for processing. */
14
+ splitMillionGroups(number: any): number[];
15
+ integerToWords(integerPart: any): string;
16
+ }
17
+ import { AbstractLanguage } from '../classes/abstract-language.js';
@@ -0,0 +1,117 @@
1
+ import { AbstractLanguage } from '../classes/abstract-language.js'
2
+
3
+ /**
4
+ * Thai language converter.
5
+ *
6
+ * Supports:
7
+ * - Thai numerals (ศูนย์, หนึ่ง, สอง, สาม)
8
+ * - No word separators (continuous Thai script)
9
+ * - Digit-by-digit decimal reading
10
+ */
11
+ export class Thai extends AbstractLanguage {
12
+ negativeWord = 'ลบ'
13
+ decimalSeparatorWord = 'จุด'
14
+ zeroWord = 'ศูนย์'
15
+ wordSeparator = ''
16
+ usePerDigitDecimals = true // Enable digit-by-digit decimal conversion
17
+
18
+ // Ones words map 1–9
19
+ onesWords = ['หนึ่ง', 'สอง', 'สาม', 'สี่', 'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า']
20
+
21
+ /** Converts numbers below one million to Thai words. */
22
+ convertBelowMillion (number) {
23
+ if (number === 0) return ''
24
+
25
+ let value = number
26
+ const parts = []
27
+
28
+ const hundredThousands = Math.trunc(value / 100000)
29
+ value %= 100000
30
+ const tenThousands = Math.trunc(value / 10000)
31
+ value %= 10000
32
+ const thousands = Math.trunc(value / 1000)
33
+ value %= 1000
34
+ const hundreds = Math.trunc(value / 100)
35
+ value %= 100
36
+ const tens = Math.trunc(value / 10)
37
+ const ones = value % 10
38
+
39
+ if (hundredThousands > 0) {
40
+ parts.push(this.onesWords[hundredThousands - 1] + 'แสน')
41
+ }
42
+
43
+ if (tenThousands > 0) {
44
+ if (tenThousands === 1) {
45
+ parts.push('หนึ่งหมื่น')
46
+ } else {
47
+ parts.push(this.onesWords[tenThousands - 1] + 'หมื่น')
48
+ }
49
+ }
50
+
51
+ if (thousands > 0) {
52
+ parts.push(this.onesWords[thousands - 1] + 'พัน')
53
+ }
54
+
55
+ if (hundreds > 0) {
56
+ parts.push(this.onesWords[hundreds - 1] + 'ร้อย')
57
+ }
58
+
59
+ if (tens > 0) {
60
+ if (tens === 1) {
61
+ parts.push('สิบ')
62
+ } else if (tens === 2) {
63
+ parts.push('ยี่สิบ')
64
+ } else {
65
+ parts.push(this.onesWords[tens - 1] + 'สิบ')
66
+ }
67
+ }
68
+
69
+ if (ones > 0) {
70
+ const hasHigher = hundredThousands > 0 || tenThousands > 0 || thousands > 0 || hundreds > 0 || tens > 0
71
+ if (ones === 1 && (tens > 0 || hasHigher)) {
72
+ parts.push('เอ็ด')
73
+ } else {
74
+ parts.push(this.onesWords[ones - 1])
75
+ }
76
+ }
77
+
78
+ return parts.join('')
79
+ }
80
+
81
+ /** Split a number into million-sized groups for processing. */
82
+ splitMillionGroups (number) {
83
+ const groups = []
84
+ let remaining = number
85
+
86
+ const million = 1_000_000n
87
+ while (remaining > 0n) {
88
+ const chunk = Number(remaining % million)
89
+ groups.unshift(chunk)
90
+ remaining = remaining / million
91
+ }
92
+
93
+ return groups
94
+ }
95
+
96
+ integerToWords (integerPart) {
97
+ if (integerPart === 0n) {
98
+ return this.zeroWord
99
+ }
100
+
101
+ const groups = this.splitMillionGroups(integerPart)
102
+ const parts = []
103
+
104
+ for (let i = 0; i < groups.length; i++) {
105
+ const groupValue = groups[i]
106
+ if (groupValue === 0) continue
107
+
108
+ parts.push(this.convertBelowMillion(groupValue))
109
+ const remaining = groups.length - i - 1
110
+ if (remaining > 0) {
111
+ parts.push('ล้าน'.repeat(remaining))
112
+ }
113
+ }
114
+
115
+ return parts.join('')
116
+ }
117
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Turkish language converter.
3
+ *
4
+ * Supports:
5
+ * - Omits 'bir' (one) before hundreds and thousands
6
+ * - Optional space removal via dropSpaces option
7
+ */
8
+ export class Turkish extends TurkicLanguage {
9
+ constructor(options?: {});
10
+ scaleWords: (string | bigint)[][];
11
+ }
12
+ import { TurkicLanguage } from '../classes/turkic-language.js';
@@ -0,0 +1,56 @@
1
+ import { TurkicLanguage } from '../classes/turkic-language.js'
2
+
3
+ /**
4
+ * Turkish language converter.
5
+ *
6
+ * Supports:
7
+ * - Omits 'bir' (one) before hundreds and thousands
8
+ * - Optional space removal via dropSpaces option
9
+ */
10
+ export class Turkish extends TurkicLanguage {
11
+ negativeWord = 'eksi'
12
+ decimalSeparatorWord = 'virgül'
13
+ zeroWord = 'sıfır'
14
+ wordSeparator = ' '
15
+
16
+ scaleWords = [
17
+ [1_000_000_000_000_000_000n, 'kentilyon'],
18
+ [1_000_000_000_000_000n, 'katrilyon'],
19
+ [1_000_000_000_000n, 'trilyon'],
20
+ [1_000_000_000n, 'milyar'],
21
+ [1_000_000n, 'milyon'],
22
+ [1000n, 'bin'],
23
+ [100n, 'yüz'],
24
+ [90n, 'doksan'],
25
+ [80n, 'seksen'],
26
+ [70n, 'yetmiş'],
27
+ [60n, 'altmış'],
28
+ [50n, 'elli'],
29
+ [40n, 'kırk'],
30
+ [30n, 'otuz'],
31
+ [20n, 'yirmi'],
32
+ [10n, 'on'],
33
+ [9n, 'dokuz'],
34
+ [8n, 'sekiz'],
35
+ [7n, 'yedi'],
36
+ [6n, 'altı'],
37
+ [5n, 'beş'],
38
+ [4n, 'dört'],
39
+ [3n, 'üç'],
40
+ [2n, 'iki'],
41
+ [1n, 'bir'],
42
+ [0n, 'sıfır']
43
+ ]
44
+
45
+ constructor (options = {}) {
46
+ super()
47
+
48
+ this.setOptions({
49
+ dropSpaces: false
50
+ }, options)
51
+
52
+ if (this.options.dropSpaces) {
53
+ this.wordSeparator = ''
54
+ }
55
+ }
56
+ }