marathi-transliterate 1.2.0 → 1.4.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/README.md CHANGED
@@ -14,6 +14,8 @@ Most existing Sanskrit/IAST transliteration libraries convert `sakhar` to **स
14
14
 
15
15
  In everyday reality, people in Maharashtra type phonetically:
16
16
  - `sakhar` → **साखर**
17
+ - `jaad` → **जाड**
18
+ - `daba` → **डबा**
17
19
  - `kanda` → **कांदा**
18
20
  - `batata` → **बटाटा**
19
21
  - `mith` → **मीठ**
@@ -53,6 +55,9 @@ import { transliterate, transliterateWord } from 'marathi-transliterate';
53
55
 
54
56
  // Single word transliteration
55
57
  transliterateWord('sakhar'); // → 'साखर'
58
+ transliterateWord('jaad'); // → 'जाड'
59
+ transliterateWord('Daba'); // → 'डबा'
60
+ transliterateWord('D'); // → 'ड' (vs 'd' → 'द')
56
61
  transliterateWord('kanda'); // → 'कांदा'
57
62
  transliterateWord('batata'); // → 'बटाटा'
58
63
  transliterateWord('namaskar'); // → 'नमस्कार'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "marathi-transliterate",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "description": "Zero-dependency, offline-first Marathi / Devanagari phonetic transliteration library. Converts English typing to Marathi (e.g. sakhar -> साखर) seamlessly in plain JS, Node.js, and frontend frameworks.",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
package/src/dictionary.js CHANGED
@@ -3,6 +3,276 @@
3
3
  * Kirana/grocery items, customer names, units, and shop terms.
4
4
  */
5
5
  export const MARATHI_DICTIONARY = {
6
+ // --- Popular Marathi Kirana Brands, Masale & Staples with Anusvara ---
7
+ 'rambandhu': 'रामबंधू',
8
+ 'rambandhoo': 'रामबंधू',
9
+ 'rambandhuu': 'रामबंधू',
10
+ 'bandhu': 'बंधू',
11
+ 'bandhuu': 'बंधू',
12
+ 'bandhoo': 'बंधू',
13
+ 'pravin': 'प्रवीण',
14
+ 'suhana': 'सुहाना',
15
+ 'everest': 'एव्हरेस्ट',
16
+ 'badshah': 'बादशाह',
17
+ 'rambandhupapad': 'रामबंधू पापड',
18
+ 'shingada': 'शिंगाडा',
19
+ 'bhendi': 'भेंडी',
20
+ 'bundi': 'बुंदी',
21
+ 'tambaku': 'तंबाखू',
22
+ 'gulabjam': 'गुलाबजाम',
23
+ 'gulabjamun': 'गुलाबजामून',
24
+
25
+ // --- Comprehensive Maharashtrian FMCG, Brands & Staples ---
26
+ 'everestmasale': 'एव्हरेस्ट मसाले',
27
+ 'tikhalal': 'तिखाललाल',
28
+ 'badshahmasala': 'बादशाह मसाला',
29
+ 'suhanamasale': 'सुहाना मसाले',
30
+ 'pravinmasale': 'प्रवीण मसाले',
31
+ 'bedekar': 'बेडेकर',
32
+ 'bedekarmasale': 'बेडेकर मसाले',
33
+ 'katdare': 'काटदरे',
34
+ 'kpra': 'के-प्र',
35
+ 'suruchi': 'सुरुची',
36
+ 'khamkar': 'खामकर',
37
+ 'mdh': 'एमडीएच',
38
+ 'mdhmasala': 'एमडीएच मसाला',
39
+ 'catch': 'कॅच',
40
+ 'catchmasala': 'कॅच मसाला',
41
+ 'goldie': 'गोल्डी',
42
+ 'chitalebandhu': 'चितळे बंधू',
43
+ 'gokul': 'गोकुळ',
44
+ 'warana': 'वारणा',
45
+ 'katraj': 'कात्रज',
46
+ 'amul': 'अमुल',
47
+ 'amuldudh': 'अमुल दूध',
48
+ 'amulbutter': 'अमुल बटर',
49
+ 'amulghee': 'अमुल तूप',
50
+ 'gowardhan': 'गोवर्धन',
51
+ 'gowardhanghee': 'गोवर्धन तूप',
52
+ 'motherdairy': 'मदर डेअरी',
53
+ 'patanjali': 'पतंजली',
54
+ 'haldiram': 'हल्दीराम',
55
+ 'balajiwafers': 'बालाजी वेफर्स',
56
+ 'lijjat': 'लिज्जत',
57
+ 'lijjatpapad': 'लिज्जत पापड',
58
+ 'tata': 'टाटा',
59
+ 'tatatea': 'टाटा चहा',
60
+ 'tatapremium': 'टाटा प्रीमियम',
61
+ 'tatagold': 'टाटा गोल्ड',
62
+ 'tatani': 'टाटा मीठ',
63
+ 'tatamith': 'टाटा मीठ',
64
+ 'tatansalt': 'टाटा सॉल्ट',
65
+ 'redlabel': 'रेड लेबल',
66
+ 'tajmahal': 'ताजमहाल',
67
+ 'waghbakri': 'वाघ बकरी',
68
+ 'society': 'सोसायटी',
69
+ 'societytea': 'सोसायटी चहा',
70
+ 'girnar': 'गिरनार',
71
+ 'gemini': 'जेमिनी',
72
+ 'geminioil': 'जेमिनी तेल',
73
+ 'fortune': 'फॉर्च्युन',
74
+ 'fortuneoil': 'फॉर्च्युन तेल',
75
+ 'saffola': 'सॅफोला',
76
+ 'saffolaoil': 'सॅफोला तेल',
77
+ 'dhara': 'धारा',
78
+ 'dharaoil': 'धारा तेल',
79
+ 'aashirvaad': 'आशीर्वाद',
80
+ 'aashirvaadatta': 'आशीर्वाद आटा',
81
+ 'pillsbury': 'पिल्सबरी',
82
+ 'surfexcel': 'सर्फ एक्सेल',
83
+ 'vimbar': 'विम बार',
84
+ 'vimliquid': 'विम लिक्विड',
85
+ 'pril': 'प्रिल',
86
+ 'lifebuoy': 'लाइफबॉय',
87
+ 'lux': 'लक्स',
88
+ 'santoor': 'संतूर',
89
+ 'medimix': 'मेडिमिक्स',
90
+ 'godrejno1': 'गोदरेज नं. १',
91
+ 'cinthol': 'सिंथॉल',
92
+ 'pears': 'पिअर्स',
93
+ 'dove': 'डव्ह',
94
+ 'vicco': 'व्हिको',
95
+ 'viccovajradanti': 'व्हिको वज्रदंती',
96
+ 'goodknight': 'गुड नाइट',
97
+ 'allout': 'ऑल आउट',
98
+ 'mortein': 'मॉर्टिन',
99
+ 'hit': 'हिट',
100
+ 'parleg': 'पारले-जी',
101
+ 'monaco': 'मोनाको',
102
+ 'krackjack': 'क्रॅकजॅक',
103
+ 'yippee': 'यिप्पी',
104
+ 'cadbury': 'कॅडबरी',
105
+ 'dairymilk': 'डेअरी मिल्क',
106
+ 'bournvita': 'बोर्नव्हिटा',
107
+ 'horlicks': 'हॉर्लिक्स',
108
+ 'boost': 'बूस्ट',
109
+ 'complan': 'कॉम्प्लॅन',
110
+ 'nescafe': 'नेस्कॅफे',
111
+ 'bru': 'ब्रू कॉफी',
112
+ 'godamasala': 'गोडा मसाला',
113
+ 'kandalasun': 'कांदा लसूण',
114
+ 'kandalasunmasala': 'कांदा लसूण मसाला',
115
+ 'misalmasala': 'मिसळ मसाला',
116
+ 'pavbhaji': 'पाव भाजी',
117
+ 'pavbhajimasala': 'पाव भाजी मसाला',
118
+ 'garammasala': 'गरम मसाला',
119
+ 'chanamasala': 'चना मसाला',
120
+ 'cholemasala': 'छोले मसाला',
121
+ 'chaatmasala': 'चाट मसाला',
122
+ 'sambharmasala': 'सांभार मसाला',
123
+ 'rasammasala': 'रसम मसाला',
124
+ 'biryanimasala': 'बिर्याणी मसाला',
125
+ 'pulaomasala': 'पुलाव मसाला',
126
+ 'chickenmasala': 'चिकन मसाला',
127
+ 'muttonmasala': 'मटन मसाला',
128
+ 'fishmasala': 'फिश मसाला',
129
+ 'kitchenking': 'किचन किंग',
130
+ 'maggimasala': 'मॅगी मसाला',
131
+ 'panipuri': 'पाणीपुरी',
132
+ 'panipurimasala': 'पाणीपुरी मसाला',
133
+ 'jaljira': 'जलजिरा',
134
+ 'dhanapowder': 'धने पावडर',
135
+ 'jeerapowder': 'जिरे पावडर',
136
+ 'haldipowder': 'हळद पावडर',
137
+ 'mirchipowder': 'मिरची पावडर',
138
+ 'kashmirimirchi': 'काश्मिरी मिरची',
139
+ 'chakrifool': 'चक्रीफूल',
140
+ 'shahjeera': 'शहाजिरे',
141
+ 'jaiphal': 'जायफळ',
142
+ 'jaipatri': 'जायपत्री',
143
+ 'kasurimethi': 'कसुरी मेथी',
144
+ 'methidana': 'मेथी दाणा',
145
+ 'ajwain': 'ओवा',
146
+ 'ova': 'ओवा',
147
+ 'khadamasala': 'खडा मसाला',
148
+ 'kalimirch': 'काळी मिरी',
149
+ 'mira': 'मिरे',
150
+ 'varai': 'वरई',
151
+ 'rajgiraatta': 'राजगिरा पीठ',
152
+ 'rajgiraladu': 'राजगिरा लाडू',
153
+ 'upwasbhajani': 'उपवास भाजणी',
154
+ 'thalipeeth': 'थालिपीठ',
155
+ 'thalipeethbhajani': 'थालिपीठ भाजणी',
156
+ 'batatakees': 'बटाटा कीस',
157
+ 'upwaspapad': 'उपवास पापड',
158
+ 'sendhanamak': 'सेंधव मीठ',
159
+ 'saindhav': 'सैंधव मीठ',
160
+ 'singhadapith': 'शिंगाडा पीठ',
161
+ 'moongdal': 'मूग डाळ',
162
+ 'chanadal': 'चना डाळ',
163
+ 'uraddal': 'उडीद डाळ',
164
+ 'masoordal': 'मसूर डाळ',
165
+ 'kabulichana': 'काबुली चना',
166
+ 'kalachana': 'काळा चना',
167
+ 'harbara': 'हरभरा',
168
+ 'harbaradal': 'हरभरा डाळ',
169
+ 'safedvatana': 'पांढरा वटाणा',
170
+ 'hirvavatana': 'हिरवा वटाणा',
171
+ 'chawli': 'चवळी',
172
+ 'singdana': 'शेंगदाणा',
173
+ 'singdane': 'शेंगदाणे',
174
+ 'soyabean': 'सोयाबीन',
175
+ 'wheatflour': 'गहू पीठ',
176
+ 'jowarflour': 'ज्वारी पीठ',
177
+ 'bajraflour': 'बाजरी पीठ',
178
+ 'nachaniflour': 'नाचणी पीठ',
179
+ 'riceflour': 'तांदूळ पीठ',
180
+ 'wadakolam': 'वाडा कोलम',
181
+ 'sonamasoori': 'सोना मसुरी',
182
+ 'indrayani': 'इंद्रायणी',
183
+ 'tukda': 'तुकडा बासमती',
184
+ 'jadapohe': 'जाड पोहे',
185
+ 'patalpohe': 'पातळ पोहे',
186
+ 'makkapoha': 'मका पोहे',
187
+ 'kurmure': 'कुरमुरे',
188
+ 'chirmure': 'चिरमुरे',
189
+ 'sandge': 'सांडगे',
190
+ 'sandage': 'सांडगे',
191
+ 'batatapapad': 'बटाटा पापड',
192
+ 'pohapapad': 'पोहे पापड',
193
+ 'udadpapad': 'उडीद पापड',
194
+ 'moongpapad': 'मूग पापड',
195
+ 'ambalonche': 'आंबा लोणचे',
196
+ 'limbulonche': 'लिंबू लोणचे',
197
+ 'mirchilonche': 'मिरची लोणचे',
198
+ 'mixlonche': 'मिक्स्ड लोणचे',
199
+ 'kolhapurigul': 'कोल्हापुरी गूळ',
200
+ 'organicgul': 'सेंद्रिय गूळ',
201
+ 'khadisakhar': 'खडीसाखर',
202
+ 'shengdanatel': 'शेंगदाणा तेल',
203
+ 'groundnutoil': 'शेंगदाणा तेल',
204
+ 'soyabeanoil': 'सोयाबीन तेल',
205
+ 'sunfloweroil': 'सूर्यफूल तेल',
206
+ 'tiltel': 'तीळ तेल',
207
+ 'khobrel': 'खोबरेल तेल',
208
+ 'coconutoil': 'खोबरेल तेल',
209
+ 'sarson': 'मोहरी तेल',
210
+ 'mustardoil': 'मोहरी तेल',
211
+ 'gaayghee': 'गाय तूप',
212
+ 'mhaisghee': 'म्हैस तूप',
213
+ 'vanaspati': 'वनस्पती तूप',
214
+ 'dalda': 'डालडा',
215
+ 'khoya': 'खोया',
216
+ 'mawa': 'मावा',
217
+ 'kande': 'कांदे',
218
+ 'tomato': 'टोमॅटो',
219
+ 'tamatar': 'टोमॅटो',
220
+ 'aalelasun': 'आले लसूण पेस्ट',
221
+ 'gingergarlic': 'आले लसूण पेस्ट',
222
+ 'pudina': 'पुदिना',
223
+ 'karipatta': 'कढीपत्ता',
224
+ 'kadipatta': 'कढीपत्ता',
225
+ 'hirvimirchi': 'हिरवी मिरची',
226
+ 'lalmirchi': 'लाल मिरची',
227
+ 'shevga': 'शेवगा शेंगा',
228
+ 'shevgasheng': 'शेवगा शेंग',
229
+ 'vangi': 'वांगी',
230
+ 'dudhi': 'दुधी भोपळा',
231
+ 'lalbhopla': 'लाल भोपळा',
232
+ 'gavar': 'गवार',
233
+ 'tondli': 'तोंडली',
234
+ 'ghosale': 'घोसाळे',
235
+ 'flower': 'फ्लॉवर',
236
+ 'cabbage': 'कोबी',
237
+ 'kobi': 'कोबी',
238
+ 'shimlamirchi': 'शिमला मिरची',
239
+ 'gajar': 'गाजर',
240
+ 'beet': 'बीट',
241
+ 'kakdi': 'काकडी',
242
+ 'palak': 'पालक',
243
+ 'shepu': 'शेपू',
244
+ 'amba': 'आंबा',
245
+ 'aamba': 'आंबा',
246
+ 'kairi': 'कैरी',
247
+ 'safarchand': 'सफरचंद',
248
+ 'draksha': 'द्राक्षे',
249
+ 'santre': 'संत्री',
250
+ 'mosambi': 'मोसंबी',
251
+ 'dalimb': 'डाळिंब',
252
+ 'chikoo': 'चिकू',
253
+ 'peru': 'पेरू',
254
+ 'ananas': 'अननस',
255
+ 'papayi': 'पपई',
256
+ 'kalingad': 'कलिंगड',
257
+ 'kharbuj': 'खरबूज',
258
+ 'sitaphal': 'सीताफळ',
259
+ 'ramphal': 'रामफळ',
260
+ 'jambhul': 'जांभूळ',
261
+ 'dhoopbatti': 'धूप बत्ती',
262
+ 'bhimsenikapoor': 'भीमसेनी कापूर',
263
+ 'kunku': 'कुंकू',
264
+ 'chandan': 'चंदन',
265
+ 'chandantika': 'चंदन टिका',
266
+ 'poojasupari': 'पूजा सुपारी',
267
+ 'olanaral': 'ओला नारळ',
268
+ 'sukhanaral': 'सुका नारळ',
269
+ 'sukhekhobre': 'सुके खोबरे',
270
+ 'kaapsachivat': 'कापसाची वात',
271
+ 'golvat': 'गोल वात',
272
+ 'laambvat': 'लांब वात',
273
+ 'samaitel': 'सई तेल',
274
+ 'poojatel': 'पूजा तेल',
275
+
6
276
  // --- Grocery & Kirana Staples ---
7
277
  'sakhar': 'साखर',
8
278
  'saakhar': 'साखर',
@@ -552,6 +822,212 @@ export const MARATHI_DICTIONARY = {
552
822
  'sejal': 'सेजल',
553
823
  'nilesh': 'निलेश',
554
824
  'shailesh': 'शैलेश',
555
- 'kamlesh': 'कमलेश'
825
+ 'kamlesh': 'कमलेश',
826
+
827
+ // --- Grocery & Household with ड / ढ / ट / ठ / द / ध ---
828
+ "jaad": "जाड",
829
+ "jad": "जाड",
830
+ "jada": "जाडा",
831
+ "jaada": "जाडा",
832
+ "jadi": "जाडी",
833
+ "jaadi": "जाडी",
834
+ "barik": "बारीक",
835
+ "bareek": "बारीक",
836
+ "baareek": "बारीक",
837
+ "jadpoha": "जाड पोहे",
838
+ "jaadpoha": "जाड पोहे",
839
+ "jaadpohe": "जाड पोहे",
840
+ "jadrava": "जाड रवा",
841
+ "jaadrava": "जाड रवा",
842
+ "barikpoha": "बारीक पोहे",
843
+ "barikpohe": "बारीक पोहे",
844
+ "barikrava": "बारीक रवा",
845
+ "daba": "डबा",
846
+ "dabba": "डबा",
847
+ "dabi": "डबी",
848
+ "dabbi": "डबी",
849
+ "papad": "पापड",
850
+ "paapad": "पापड",
851
+ "kadak": "कडक",
852
+ "laddu": "लाडू",
853
+ "ladoo": "लाडू",
854
+ "laadu": "लाडू",
855
+ "peda": "पेढा",
856
+ "pedha": "पेढा",
857
+ "pendha": "पेंढा",
858
+ "bhendi": "भेंडी",
859
+ "bhindi": "भेंडी",
860
+ "bhende": "भेंडे",
861
+ "thik": "ठीक",
862
+ "theek": "ठीक",
863
+ "dhag": "ढग",
864
+ "dhol": "ढोल",
865
+ "dholak": "ढोलक",
866
+ "dholki": "ढोलकी",
867
+ "khadda": "खड्डा",
868
+ "khada": "खड्डा",
869
+ "tambda": "तांबडा",
870
+ "tambadi": "तांबडी",
871
+ "pandhra": "पांढरा",
872
+ "pandhari": "पांढरी",
873
+ "korda": "कोरडा",
874
+ "kordi": "कोरडी",
875
+ "thanda": "थंड",
876
+ "thand": "थंड",
877
+ "god": "गोड",
878
+ "godd": "गोड",
879
+ "dodka": "दोडका",
880
+ "dodke": "दोडके",
881
+ "karela": "कारले",
882
+ "karle": "कारले",
883
+ "bhopla": "भोपळा",
884
+ "ghevda": "घेवडा",
885
+ "ghevada": "घेवडा",
886
+ "danda": "दांडा",
887
+ "dandi": "दांडी",
888
+ "dada": "दादा",
889
+ "dadi": "दादी",
890
+ "undi": "उंडी",
891
+ "and": "अंडे",
892
+ "ande": "अंडे",
893
+ "anda": "अंडे",
894
+ "eggs": "अंडी",
895
+ "egg": "अंडे",
896
+ "powder": "पावडर",
897
+ "pavdar": "पावडर",
898
+ "detergent": "डिटर्जंट",
899
+ "doctor": "डॉक्टर",
900
+ "order": "ऑर्डर",
901
+ "board": "बोर्ड",
902
+ "card": "कार्ड",
903
+ "credit": "क्रेडिट",
904
+ "debit": "डेबिट",
905
+ "disco": "डिस्को",
906
+ "diesel": "डिझेल",
907
+ "petrol": "पेट्रोल",
908
+ "speed": "स्पीड",
909
+ "driver": "ड्रायव्हर",
910
+ "drive": "ड्राइव्ह",
911
+
912
+ // --- Enhanced Marathi Daily Essentials & Corner Cases ---
913
+ "ratri": "रात्री",
914
+ "raatri": "रात्री",
915
+ "vikri": "विक्री",
916
+ "kharedi": "खरेदी",
917
+ "supari": "सुपारी",
918
+ "chutney": "चटणी",
919
+ "chatani": "चटणी",
920
+ "limbu": "लिंबू",
921
+ "nimbu": "लिंबू",
922
+ "bhakri": "भाकरी",
923
+ "poli": "पोळी",
924
+ "chikki": "चिक्की",
925
+ "farsan": "फरसाण",
926
+ "chivda": "चिवडा",
927
+ "bhadang": "भडंग",
928
+ "shev": "शेव",
929
+ "bakarwadi": "बाकरवडी",
930
+ "shrikhand": "श्रीखंड",
931
+ "amrakhand": "आम्रखंड",
932
+ "basundi": "बासुंदी",
933
+ "kurdaya": "कुरडया",
934
+ "papadya": "पापड्या",
935
+ "khari": "खारी",
936
+ "toast": "टोस्ट",
937
+ "pav": "पाव",
938
+ "bread": "ब्रेड",
939
+ "butter": "बटर",
940
+ "loni": "लोणी",
941
+ "sauce": "सॉस",
942
+ "jam": "जॅम",
943
+ "noodle": "नुडल्स",
944
+ "noodles": "नुडल्स",
945
+ "pasta": "पास्ता",
946
+ "macaroni": "मॅकरोनी",
947
+ "cornflakes": "कॉर्नफ्लेक्स",
948
+ "oats": "ओट्स",
949
+ "sendha": "सेंधा",
950
+ "sendhav": "सेंधव",
951
+ "rocksalt": "सेंधव मीठ",
952
+ "sabudana": "साबुदाणा",
953
+ "bhagar": "भगर",
954
+ "rajgira": "राजगिरा",
955
+ "singhada": "शिंगाडा",
956
+ "makhana": "मखाना",
957
+ "dryfruit": "ड्रायफ्रूट",
958
+ "dryfruits": "ड्रायफ्रूट्स",
959
+ "custard": "कस्टर्ड",
960
+ "bakingpowder": "बेकिंग पावडर",
961
+ "bakingsoda": "बेकिंग सोडा",
962
+ "soda": "सोडा",
963
+ "eno": "इनो",
964
+ "matchbox": "काडीपेटी",
965
+ "diya": "दिवा",
966
+ "vaat": "वात",
967
+ "kapus": "कापूस",
968
+ "gangajal": "गंगाजल",
969
+ "gulabjal": "गुलाबजल",
970
+ "kumkum": "कुंकू",
971
+ "haladikunku": "हळदीकुंकू",
972
+ "rangoli": "रांगोळी",
973
+ "shampoo": "शॅम्पू",
974
+ "conditioner": "कंडिशनर",
975
+ "harpic": "हार्पिक",
976
+ "lizol": "लायझोल",
977
+ "phenyl": "फिनाईल",
978
+ "closeup": "क्लोजअप",
979
+ "pepsodent": "पेप्सोडेंट",
980
+ "sensodyne": "सेन्सॉडीन",
981
+ "brush": "ब्रश",
982
+ "dettol": "डेटॉल",
983
+ "savlon": "सॅव्हलॉन",
984
+ "rin": "रिन",
985
+ "tide": "टाईड",
986
+ "aerial": "एरियल",
987
+ "wheel": "व्हील",
988
+ "ghadi": "घडी",
989
+ "nirma": "निरमा",
990
+ "vim": "विम",
991
+ "exo": "एक्सो",
992
+ "prill": "प्रिल",
993
+ "scrubber": "स्क्रबर",
994
+ "sponge": "स्पंज",
995
+ "jhadu": "झाडू",
996
+ "pocha": "पोछा",
997
+ "bucket": "बादली",
998
+ "badli": "बादली",
999
+ "mug": "मग",
1000
+ "duster": "डस्टर",
1001
+ "tissue": "टिश्यू",
1002
+ "foil": "फॉइल",
1003
+ "plastic": "प्लास्टिक",
1004
+ "pishvi": "पिशवी",
1005
+ "kilo": "किलो",
1006
+ "gram": "ग्रॅम",
1007
+ "liter": "लिटर",
1008
+ "militre": "मिली",
1009
+ "darzon": "डझन",
1010
+ "dozen": "डझन",
1011
+ "dazan": "डझन",
1012
+ "nag": "नग",
1013
+ "box": "बॉक्स",
1014
+ "carton": "खोके",
1015
+ "goni": "गोणी",
1016
+ "pote": "पोते",
1017
+ "truck": "ट्रक",
1018
+ "tractor": "ट्रॅक्टर",
1019
+ "tempo": "टॅम्पो",
1020
+
1021
+ "pani": "पाणी",
1022
+ "paani": "पाणी",
1023
+ "water": "पाणी",
1024
+ "paan": "पान",
1025
+ "chaan": "छान",
1026
+ "chan": "छान",
1027
+ "man": "मन",
1028
+ "aan": "आण",
1029
+ "bana": "बाण",
1030
+ "dane": "दाणे",
1031
+ "dana": "दाणा",
556
1032
  };
557
1033
 
package/src/index.js CHANGED
@@ -128,18 +128,98 @@ export function getSuggestions(word, options = {}) {
128
128
  const phonetic = phoneticTransliterateWord(word);
129
129
  if (phonetic) add(phonetic);
130
130
 
131
- // 4. Smart Marathi ळ (LLA) and ल (LA) variants expansion
131
+ // 4. Smart Marathi phonetic variants expansion (ळ/ल, ड/द, ढ/ध, ट/त, ठ/थ, ण/न, ष/श, झ/ज, ई/इ, ऊ/उ)
132
132
  const initialCandidates = [...suggestions];
133
133
  for (const s of initialCandidates) {
134
+ // 4a. ळ (LLA) and ल (LA) - e.g. "keli" -> "केळी", "bhusal" -> "भुसाळ"
134
135
  if (s.includes("ल")) {
135
- // Special Marathi phonetic rule: words ending in "al" often end in "ाळ" (e.g. bhusal -> भुसाळ)
136
- if (clean.endsWith("al") && s.endsWith("ल")) {
136
+ if (clean.endsWith("al") && s.endsWith("ल") && !s.endsWith("ाल")) {
137
137
  add(s.slice(0, -1) + "ाळ");
138
138
  }
139
139
  add(s.replace(/ल/g, "ळ"));
140
140
  } else if (s.includes("ळ")) {
141
141
  add(s.replace(/ळ/g, "ल"));
142
142
  }
143
+
144
+ // 4b. ड (DDA) and द (DA) - e.g. "Jaad" -> "जाड", "Daba" -> "डबा", "kadak" -> "कडक"
145
+ if (s.includes("द")) {
146
+ if (clean.endsWith("ad") && s.endsWith("द") && !s.endsWith("ाद")) {
147
+ add(s.slice(0, -1) + "ाड");
148
+ }
149
+ add(s.replace(/द/g, "ड"));
150
+ } else if (s.includes("ड")) {
151
+ add(s.replace(/ड/g, "द"));
152
+ }
153
+
154
+ // 4c. ढ (DDHA) and ध (DHA) - e.g. "dhag" -> "ढग", "dhol" -> "ढोल"
155
+ if (s.includes("ध")) {
156
+ add(s.replace(/ध/g, "ढ"));
157
+ } else if (s.includes("ढ")) {
158
+ add(s.replace(/ढ/g, "ध"));
159
+ }
160
+
161
+ // 4d. ट (TTA) and त (TA) - e.g. "batata" -> "बटाटा", "tomato" -> "टोमॅटो"
162
+ if (s.includes("त")) {
163
+ add(s.replace(/त/g, "ट"));
164
+ } else if (s.includes("ट")) {
165
+ add(s.replace(/त/g, "त"));
166
+ }
167
+
168
+ // 4e. ठ (TTHA) and थ (THA) - e.g. "thik" -> "ठीक", "path" -> "पाठ"
169
+ if (s.includes("थ")) {
170
+ add(s.replace(/थ/g, "ठ"));
171
+ } else if (s.includes("ठ")) {
172
+ add(s.replace(/ठ/g, "थ"));
173
+ }
174
+
175
+ // 4f. ण (NNA) and न (NA) - e.g. "pani" -> "पाणी", "bana" -> "बाण", "dane" -> "दाणे"
176
+ if (s.includes("न")) {
177
+ add(s.replace(/न/g, "ण"));
178
+ } else if (s.includes("ण")) {
179
+ add(s.replace(/ण/g, "न"));
180
+ }
181
+
182
+ // 4g. ष (SSA) and श (SHA) - e.g. "vishesh" -> "विशेष"
183
+ if (s.includes("श")) {
184
+ add(s.replace(/श/g, "ष"));
185
+ } else if (s.includes("ष")) {
186
+ add(s.replace(/ष/g, "श"));
187
+ }
188
+
189
+ // 4h. झ (JHA) and ज (JA) - e.g. "jhadu" -> "झाडू"
190
+ if (s.includes("ज") && (clean.includes("jh") || clean.includes("zh") || clean.includes("z"))) {
191
+ add(s.replace(/ज/g, "झ"));
192
+ }
193
+
194
+ // 4i. Authentic Marathi final dirgha vowel rules (मराठी शुद्धलेखन: अंत्य इकार/उकार दीर्घ)
195
+ if (s.endsWith("ि")) {
196
+ add(s.slice(0, -1) + "ी");
197
+ } else if (s.endsWith("ी")) {
198
+ add(s.slice(0, -1) + "ि");
199
+ }
200
+ if (s.endsWith("ु")) {
201
+ add(s.slice(0, -1) + "ू");
202
+ } else if (s.endsWith("ू")) {
203
+ add(s.slice(0, -1) + "ु");
204
+ }
205
+
206
+ // 4j. Word-ending "a" kana variants (e.g. rama -> रामा & राम)
207
+ if (clean.endsWith("a") && s.endsWith("ा")) {
208
+ add(s.slice(0, -1));
209
+ }
210
+
211
+ // 4k. Smart Anusvara (टिंब) variants expansion (मराठी शुद्धलेखन)
212
+ // Automatically generates standard Marathi Anusvara spellings for conjunct nasals
213
+ // e.g. "बन्धु" -> "बंधू" / "बंधु", "सम्पत" -> "संपत", "आनन्द" -> "आनंद"
214
+ const anusvarRegex = /(?:न्|म्|ङ्|ञ्|ण्)(?=[क-ह])/g;
215
+ if (anusvarRegex.test(s)) {
216
+ const withAnusvar = s.replace(anusvarRegex, "ं");
217
+ add(withAnusvar);
218
+ if (withAnusvar.endsWith("ु")) add(withAnusvar.slice(0, -1) + "ू");
219
+ if (withAnusvar.endsWith("ू")) add(withAnusvar.slice(0, -1) + "ु");
220
+ if (withAnusvar.endsWith("ि")) add(withAnusvar.slice(0, -1) + "ी");
221
+ if (withAnusvar.endsWith("ी")) add(withAnusvar.slice(0, -1) + "ि");
222
+ }
143
223
  }
144
224
 
145
225
  // 5. Prefix matches from dictionary (if clean.length >= 3)
package/src/phonetics.js CHANGED
@@ -5,108 +5,119 @@
5
5
 
6
6
  const CONSONANTS = [
7
7
  // Multi-character special combinations
8
- { en: 'dny', mr: 'ज्ञ' },
9
- { en: 'jn', mr: 'ज्ञ' },
10
- { en: 'gy', mr: 'ज्ञ' },
11
- { en: 'ksh', mr: 'क्ष' },
12
- { en: 'shr', mr: 'श्र' },
13
- { en: 'chh', mr: 'छ' },
14
- { en: 'ch', mr: 'च' },
15
- { en: 'kh', mr: 'ख' },
16
- { en: 'gh', mr: 'घ' },
17
- { en: 'jh', mr: 'झ' },
18
- { en: 'zh', mr: 'झ' },
19
- { en: 'th', mr: 'थ' },
20
- { en: 'dh', mr: 'ध' },
21
- { en: 'ph', mr: 'फ' },
22
- { en: 'bh', mr: 'भ' },
23
- { en: 'shh', mr: 'ष' },
24
- { en: 'sh', mr: 'श' },
25
- { en: 'ng', mr: 'ङ' },
26
-
27
- // Single consonants
28
- { en: 'k', mr: 'क' },
29
- { en: 'g', mr: 'ग' },
30
- { en: 'j', mr: 'ज' },
31
- { en: 't', mr: 'त' },
32
- { en: 'd', mr: 'द' },
33
- { en: 'n', mr: 'न' },
34
- { en: 'p', mr: 'प' },
35
- { en: 'f', mr: 'फ' },
36
- { en: 'b', mr: 'ब' },
37
- { en: 'm', mr: 'म' },
38
- { en: 'y', mr: 'य' },
39
- { en: 'r', mr: 'र' },
40
- { en: 'l', mr: 'ल' },
41
- { en: 'L', mr: 'ळ' },
42
- { en: 'v', mr: 'व' },
43
- { en: 'w', mr: 'व' },
44
- { en: 's', mr: 'स' },
45
- { en: 'h', mr: 'ह' },
46
- { en: 'x', mr: 'क्ष' },
47
- { en: 'z', mr: 'झ' },
48
- { en: 'T', mr: 'ट' },
49
- { en: 'D', mr: 'ड' },
50
- { en: 'N', mr: 'ण' }
8
+ { en: "dny", mr: "ज्ञ" },
9
+ { en: "jn", mr: "ज्ञ" },
10
+ { en: "gy", mr: "ज्ञ" },
11
+ { en: "ksh", mr: "क्ष" },
12
+ { en: "shr", mr: "श्र" },
13
+ { en: "chh", mr: "छ" },
14
+ { en: "ch", mr: "च" },
15
+ { en: "kh", mr: "ख" },
16
+ { en: "gh", mr: "घ" },
17
+ { en: "jh", mr: "झ" },
18
+ { en: "zh", mr: "झ" },
19
+ { en: "Dh", mr: "ढ", caseSensitive: true },
20
+ { en: "DH", mr: "ढ", caseSensitive: true },
21
+ { en: "dh", mr: "ध" },
22
+ { en: "Th", mr: "ठ", caseSensitive: true },
23
+ { en: "TH", mr: "ठ", caseSensitive: true },
24
+ { en: "th", mr: "थ" },
25
+ { en: "ph", mr: "फ" },
26
+ { en: "bh", mr: "भ" },
27
+ { en: "shh", mr: "ष" },
28
+ { en: "Sh", mr: "ष", caseSensitive: true },
29
+ { en: "SH", mr: "ष", caseSensitive: true },
30
+ { en: "sh", mr: "श" },
31
+ { en: "ck", mr: "क" },
32
+ { en: "NG", mr: "ङ", caseSensitive: true },
33
+ { en: "ng", mr: "ंग" },
34
+ { en: "c", mr: "क" },
35
+
36
+ // Single consonants - case-sensitive retroflex & special Marathi sounds FIRST
37
+ { en: "T", mr: "ट", caseSensitive: true },
38
+ { en: "D", mr: "ड", caseSensitive: true },
39
+ { en: "N", mr: "ण", caseSensitive: true },
40
+ { en: "L", mr: "ळ", caseSensitive: true },
41
+
42
+ // Single consonants - standard
43
+ { en: "k", mr: "क" },
44
+ { en: "g", mr: "ग" },
45
+ { en: "j", mr: "ज" },
46
+ { en: "t", mr: "त" },
47
+ { en: "d", mr: "द" },
48
+ { en: "n", mr: "न" },
49
+ { en: "p", mr: "प" },
50
+ { en: "f", mr: "फ" },
51
+ { en: "b", mr: "ब" },
52
+ { en: "m", mr: "म" },
53
+ { en: "y", mr: "य" },
54
+ { en: "r", mr: "र" },
55
+ { en: "l", mr: "ल" },
56
+ { en: "v", mr: "व" },
57
+ { en: "w", mr: "व" },
58
+ { en: "s", mr: "स" },
59
+ { en: "h", mr: "ह" },
60
+ { en: "x", mr: "क्ष" },
61
+ { en: "z", mr: "झ" }
51
62
  ];
52
63
 
53
64
  const INDEPENDENT_VOWELS = [
54
- { en: 'aa', mr: 'आ' },
55
- { en: 'A', mr: 'आ' },
56
- { en: 'a', mr: 'अ' },
57
- { en: 'ee', mr: 'ई' },
58
- { en: 'ii', mr: 'ई' },
59
- { en: 'i', mr: 'इ' },
60
- { en: 'oo', mr: 'ऊ' },
61
- { en: 'uu', mr: 'ऊ' },
62
- { en: 'u', mr: 'उ' },
63
- { en: 'ai', mr: 'ऐ' },
64
- { en: 'ay', mr: 'ऐ' },
65
- { en: 'au', mr: 'औ' },
66
- { en: 'ou', mr: 'औ' },
67
- { en: 'ow', mr: 'औ' },
68
- { en: 'e', mr: 'ए' },
69
- { en: 'o', mr: 'ओ' },
70
- { en: 'am', mr: 'अं' },
71
- { en: 'an', mr: 'अं' },
72
- { en: 'ri', mr: 'ऋ' },
73
- { en: 'ru', mr: 'ऋ' }
65
+ { en: "aa", mr: "आ" },
66
+ { en: "A", mr: "आ" },
67
+ { en: "a", mr: "अ" },
68
+ { en: "ee", mr: "ई" },
69
+ { en: "ii", mr: "ई" },
70
+ { en: "i", mr: "इ" },
71
+ { en: "oo", mr: "ऊ" },
72
+ { en: "uu", mr: "ऊ" },
73
+ { en: "u", mr: "उ" },
74
+ { en: "ai", mr: "ऐ" },
75
+ { en: "ay", mr: "ऐ" },
76
+ { en: "au", mr: "औ" },
77
+ { en: "ou", mr: "औ" },
78
+ { en: "ow", mr: "औ" },
79
+ { en: "e", mr: "ए" },
80
+ { en: "o", mr: "ओ" },
81
+ { en: "am", mr: "अं" },
82
+ { en: "an", mr: "अं" },
83
+ { en: "ri", mr: "ऋ" },
84
+ { en: "ru", mr: "ऋ" },
85
+ { en: "R", mr: "ऋ", caseSensitive: true }
74
86
  ];
75
87
 
76
88
  const MATRAS = [
77
- { en: 'aa', mr: 'ा' },
78
- { en: 'A', mr: 'ा' },
79
- { en: 'a', mr: '' }, // Inherent vowel: cancels halant, no visible matra
80
- { en: 'ee', mr: 'ी' },
81
- { en: 'ii', mr: 'ी' },
82
- { en: 'i', mr: 'ि' },
83
- { en: 'oo', mr: 'ू' },
84
- { en: 'uu', mr: 'ू' },
85
- { en: 'u', mr: 'ु' },
86
- { en: 'ai', mr: 'ै' },
87
- { en: 'ay', mr: 'ै' },
88
- { en: 'au', mr: 'ौ' },
89
- { en: 'ou', mr: 'ौ' },
90
- { en: 'ow', mr: 'ौ' },
91
- { en: 'e', mr: 'े' },
92
- { en: 'o', mr: 'ो' },
93
- { en: 'am', mr: 'ं' },
94
- { en: 'an', mr: 'ं' },
95
- { en: 'ri', mr: 'ृ' },
96
- { en: 'ru', mr: 'ृ' }
89
+ { en: "aa", mr: "ा" },
90
+ { en: "A", mr: "ा" },
91
+ { en: "a", mr: "" }, // Inherent vowel: cancels halant; at word end becomes kana
92
+ { en: "ee", mr: "ी" },
93
+ { en: "ii", mr: "ी" },
94
+ { en: "i", mr: "ि" },
95
+ { en: "oo", mr: "ू" },
96
+ { en: "uu", mr: "ू" },
97
+ { en: "u", mr: "ु" },
98
+ { en: "ai", mr: "ै" },
99
+ { en: "ay", mr: "ै" },
100
+ { en: "au", mr: "ौ" },
101
+ { en: "ou", mr: "ौ" },
102
+ { en: "ow", mr: "ौ" },
103
+ { en: "e", mr: "े" },
104
+ { en: "o", mr: "ो" },
105
+ { en: "am", mr: "ं" },
106
+ { en: "an", mr: "ं" },
107
+ { en: "R", mr: "ृ", caseSensitive: true }
97
108
  ];
98
109
 
99
110
  /**
100
111
  * Phonetically transliterates a single Roman word to Devanagari.
101
- * @param {string} text - Single English word (e.g. "shantanu", "ramesh")
112
+ * @param {string} text - Single English word (e.g. "shantanu", "ramesh", "Jaad", "Daba")
102
113
  * @returns {string} - Devanagari representation
103
114
  */
104
115
  export function phoneticTransliterateWord(text) {
105
- if (!text) return '';
116
+ if (!text) return "";
106
117
  const clean = text.trim();
107
- if (!clean) return '';
118
+ if (!clean) return "";
108
119
 
109
- let res = '';
120
+ let res = "";
110
121
  let i = 0;
111
122
  const n = clean.length;
112
123
 
@@ -121,8 +132,20 @@ export function phoneticTransliterateWord(text) {
121
132
  // Check independent vowel at the beginning of a word or after non-alpha
122
133
  let matchedVowel = false;
123
134
  if (i === 0 || !/[a-zA-Z]/.test(clean[i - 1])) {
135
+ const initialNasal = clean.substring(i, i + 2).toLowerCase();
136
+ if (initialNasal === 'am' || initialNasal === 'an') {
137
+ const charAfter = clean[i + 2];
138
+ const isFollowedByVowel = charAfter && /[aeiouA]/i.test(charAfter);
139
+ if (!isFollowedByVowel) {
140
+ res += 'अं';
141
+ i += 2;
142
+ matchedVowel = true;
143
+ }
144
+ }
124
145
  for (const v of INDEPENDENT_VOWELS) {
125
- if (clean.substring(i, i + v.en.length).toLowerCase() === v.en.toLowerCase()) {
146
+ const sub = clean.substring(i, i + v.en.length);
147
+ const isMatch = v.caseSensitive ? sub === v.en : sub.toLowerCase() === v.en.toLowerCase();
148
+ if (isMatch) {
126
149
  res += v.mr;
127
150
  i += v.en.length;
128
151
  matchedVowel = true;
@@ -136,8 +159,7 @@ export function phoneticTransliterateWord(text) {
136
159
  let matchedConsonant = false;
137
160
  for (const c of CONSONANTS) {
138
161
  const sub = clean.substring(i, i + c.en.length);
139
- const isCaseSensitive = c.en === 'L' || c.en === 'T' || c.en === 'D' || c.en === 'N';
140
- const isMatch = isCaseSensitive ? sub === c.en : sub.toLowerCase() === c.en.toLowerCase();
162
+ const isMatch = c.caseSensitive ? sub === c.en : sub.toLowerCase() === c.en.toLowerCase();
141
163
 
142
164
  if (isMatch) {
143
165
  res += c.mr;
@@ -146,24 +168,47 @@ export function phoneticTransliterateWord(text) {
146
168
 
147
169
  // Check for attached vowel matra
148
170
  let matchedMatra = false;
149
- for (const m of MATRAS) {
171
+
172
+ // Check 2-letter nasal matras (am, an) representing Marathi Anusvara (ं)
173
+ // when followed by a consonant or at end of word.
174
+ // e.g. 'bandhu' -> 'ब' + 'ं' + 'धु' = 'बंधु', 'sampat' -> 'संपत', 'pankaj' -> 'पंकज'
175
+ const nextTwo = clean.substring(i, i + 2).toLowerCase();
176
+ if (nextTwo === 'am' || nextTwo === 'an') {
177
+ const charAfter = clean[i + 2];
178
+ const isFollowedByVowel = charAfter && /[aeiouA]/i.test(charAfter);
179
+ if (!isFollowedByVowel) {
180
+ res += 'ं';
181
+ i += 2;
182
+ matchedMatra = true;
183
+ }
184
+ }
185
+
186
+ if (!matchedMatra) {
187
+ for (const m of MATRAS) {
150
188
  const nextSub = clean.substring(i, i + m.en.length);
151
- const mCaseSensitive = m.en === 'A';
189
+ const mCaseSensitive = m.caseSensitive || m.en === "A";
152
190
  const mMatch = mCaseSensitive ? nextSub === m.en : nextSub.toLowerCase() === m.en.toLowerCase();
153
191
 
154
192
  if (mMatch) {
155
- res += m.mr;
193
+ // When user types trailing "a" at the end of word (e.g. daba -> डबा, patrika -> पत्रिका),
194
+ // in casual Marathi it represents the kana "ा"
195
+ if (m.en === "a" && i + 1 === n && i > 0) {
196
+ res += "ा";
197
+ } else {
198
+ res += m.mr;
199
+ }
156
200
  i += m.en.length;
157
201
  matchedMatra = true;
158
202
  break;
159
203
  }
160
204
  }
205
+ }
161
206
 
162
207
  // If no vowel followed and next character is also a consonant, apply halant (virama ्)
163
208
  // In Marathi/Hindi phonetics, word-final consonants do NOT get halant
164
209
  if (!matchedMatra) {
165
210
  if (i < n && /[a-zA-Z]/.test(clean[i])) {
166
- res += '्';
211
+ res += "्";
167
212
  }
168
213
  }
169
214
 
@@ -178,5 +223,8 @@ export function phoneticTransliterateWord(text) {
178
223
  }
179
224
  }
180
225
 
226
+ // Standard Marathi Shuddhalekhan Rule: nasal conjuncts before consonants become Anusvara
227
+ res = res.replace(/(?:न्|म्|ङ्|ञ्|ण्)(?=[क-ह])/g, "ं");
228
+
181
229
  return res;
182
230
  }