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 +5 -0
- package/package.json +1 -1
- package/src/dictionary.js +477 -1
- package/src/index.js +83 -3
- package/src/phonetics.js +142 -94
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.
|
|
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
|
|
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
|
-
|
|
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:
|
|
9
|
-
{ en:
|
|
10
|
-
{ en:
|
|
11
|
-
{ en:
|
|
12
|
-
{ en:
|
|
13
|
-
{ en:
|
|
14
|
-
{ en:
|
|
15
|
-
{ en:
|
|
16
|
-
{ en:
|
|
17
|
-
{ en:
|
|
18
|
-
{ en:
|
|
19
|
-
{ en:
|
|
20
|
-
{ en:
|
|
21
|
-
{ en:
|
|
22
|
-
{ en:
|
|
23
|
-
{ en:
|
|
24
|
-
{ en:
|
|
25
|
-
{ en:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
{ en:
|
|
29
|
-
{ en:
|
|
30
|
-
{ en:
|
|
31
|
-
{ en:
|
|
32
|
-
{ en:
|
|
33
|
-
{ en:
|
|
34
|
-
{ en:
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
{ en:
|
|
38
|
-
{ en:
|
|
39
|
-
{ en:
|
|
40
|
-
{ en:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
{ en:
|
|
44
|
-
{ en:
|
|
45
|
-
{ en:
|
|
46
|
-
{ en:
|
|
47
|
-
{ en:
|
|
48
|
-
{ en:
|
|
49
|
-
{ en:
|
|
50
|
-
{ en:
|
|
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:
|
|
55
|
-
{ en:
|
|
56
|
-
{ en:
|
|
57
|
-
{ en:
|
|
58
|
-
{ en:
|
|
59
|
-
{ en:
|
|
60
|
-
{ en:
|
|
61
|
-
{ en:
|
|
62
|
-
{ en:
|
|
63
|
-
{ en:
|
|
64
|
-
{ en:
|
|
65
|
-
{ en:
|
|
66
|
-
{ en:
|
|
67
|
-
{ en:
|
|
68
|
-
{ en:
|
|
69
|
-
{ en:
|
|
70
|
-
{ en:
|
|
71
|
-
{ en:
|
|
72
|
-
{ en:
|
|
73
|
-
{ en:
|
|
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:
|
|
78
|
-
{ en:
|
|
79
|
-
{ en:
|
|
80
|
-
{ en:
|
|
81
|
-
{ en:
|
|
82
|
-
{ en:
|
|
83
|
-
{ en:
|
|
84
|
-
{ en:
|
|
85
|
-
{ en:
|
|
86
|
-
{ en:
|
|
87
|
-
{ en:
|
|
88
|
-
{ en:
|
|
89
|
-
{ en:
|
|
90
|
-
{ en:
|
|
91
|
-
{ en:
|
|
92
|
-
{ en:
|
|
93
|
-
{ en:
|
|
94
|
-
{ en:
|
|
95
|
-
{ en:
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 ===
|
|
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
|
-
|
|
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
|
}
|