ЁЯХЙя╕П Hindi/Nepali Transliterator
Convert Romanized Hindi/Nepali text to Devanagari script
<!-- JS -->
<script>
(function(){
let currentLanguage = 'nepali';
/* --- Mappings --- */
const consonantMap = {
'ksh':'рдХреНрд╖','kshh':'рдХреНрд╖','gya':'рдЬреНрдЮ','gna':'рдЬреНрдЮ','tra':'рддреНрд░',
'chh':'рдЫ','shh':'рд╖',
'ng':'рдЩ','ny':'рдЮ','jh':'рдЭ','ph':'рдл','bh':'рдн','th':'рде','dh':'рдз',
'kh':'рдЦ','gh':'рдШ','ch':'рдЪ','sh':'рд╢',
'ts':'рддреНрд╕',
'k':'рдХ','g':'рдЧ','c':'рдХ','j':'рдЬ','t':'рдд','d':'рдж','n':'рди',
'p':'рдк','b':'рдм','m':'рдо','y':'рдп','r':'рд░','l':'рд▓','v':'рд╡','w':'рд╡','s':'рд╕','h':'рд╣','f':'рдлрд╝',
'T':'рдЯ','Th':'рда','D':'рдб','Dh':'рдв','N':'рдг'
};
const vowelMap = { 'aa':'рдЖ','a':'рдЕ','ii':'рдИ','i':'рдЗ','uu':'рдК','u':'рдЙ','e':'рдП','ai':'рдР','o':'рдУ','au':'рдФ','ri':'рдЛ','ru':'рдЛ' };
const matraMap = { 'aa':'рд╛','a':'','ii':'реА','i':'рд┐','uu':'реВ','u':'реБ','e':'реЗ','ai':'реИ','o':'реЛ','au':'реМ','ri':'реГ','ru':'реГ' };
const digitsMap = {'0':'реж','1':'рез','2':'реи','3':'рей','4':'рек','5':'рел','6':'рем','7':'рен','8':'рео','9':'реп'};
const specialMap = {'om':'реР','aum':'реР','.':'.',',':',','?':'?','!':'!',':':':',';':';'};
/* Examples */
const examples = {
hindi: [
{ rom: 'namaste', dev: 'рдирдорд╕реНрддреЗ' },
{ rom: 'dhanyawad', dev: 'рдзрдиреНрдпрд╡рд╛рдж' },
{ rom: 'main tumse pyar karta hun', dev: 'рдореИрдВ рддреБрдорд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдБ' },
{ rom: 'kaise ho', dev: 'рдХреИрд╕реЗ рд╣реЛ' },
{ rom: 'mera naam rahul hai', dev: 'рдореЗрд░рд╛ рдирд╛рдо рд░рд╛рд╣реБрд▓ рд╣реИ' },
{ rom: 'aap kahan se hain', dev: 'рдЖрдк рдХрд╣рд╛рдБ рд╕реЗ рд╣реИрдВ' },
{ rom: 'bahut accha', dev: 'рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛' },
{ rom: 'hindi bhasha sundar hai', dev: 'рд╣рд┐рдВрджреА рднрд╛рд╖рд╛ рд╕реБрдВрджрд░ рд╣реИ' }
],
nepali: [
{ rom: 'namaste', dev: 'рдирдорд╕реНрддреЗ' },
{ rom: 'dhanyabad', dev: 'рдзрдиреНрдпрдмрд╛рдж' },
{ rom: 'ma timlaai maaya garchu', dev: 'рдо рддрд┐рдореАрд▓рд╛рдИ рдорд╛рдпрд╛ рдЧрд░реНрдЫреБ' },
{ rom: 'kasto cha', dev: 'рдХрд╕реНрддреЛ рдЫ' },
{ rom: 'mero naam ram ho', dev: 'рдореЗрд░реЛ рдирд╛рдо рд░рд╛рдо рд╣реЛ' },
{ rom: 'tapai kahan bata hunuhuncha', dev: 'рддрдкрд╛рдИрдВ рдХрд╣рд╛рдБ рдмрд╛рдЯ рд╣реБрдиреБрд╣реБрдиреНрдЫ' },
{ rom: 'dherai ramro', dev: 'рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ' },
{ rom: 'nepali bhasha mitho cha', dev: 'рдиреЗрдкрд╛рд▓реА рднрд╛рд╖рд╛ рдорд┐рдареЛ рдЫ' }
]
};
/* Keys for tokenizer (longest-first) */
const KEYS = Object.keys({...consonantMap,...vowelMap,...specialMap}).sort((a,b)=>b.length-a.length);
/* --- UI Elements --- */
const inputEl = document.getElementById('romanizedInput');
const outputEl = document.getElementById('devanagariOutput');
const nepaliBtn = document.getElementById('nepaliBtn');
const hindiBtn = document.getElementById('hindiBtn');
const copyBtn = document.getElementById('copyBtn');
const clearBtn = document.getElementById('clearBtn');
const langLabel = document.getElementById('currentLang');
function setLanguage(lang){
currentLanguage = lang;
langLabel.textContent = lang === 'nepali' ? 'Nepali' : 'Hindi';
nepaliBtn.style.background = lang==='nepali' ? '#ff6b35':'#fff';
nepaliBtn.style.color = lang==='nepali' ? '#fff':'#ff6b35';
hindiBtn.style.background = lang==='hindi' ? '#ff6b35':'#fff';
hindiBtn.style.color = lang==='hindi' ? '#fff':'#ff6b35';
transliterate();
}
function tokenize(str){
const tokens=[]; let i=0;
while(i<str.length){
const ch=str[i];
if(/\s/.test(ch)){tokens.push(' ');i++;continue;}
if(/[0-9]/.test(ch)){tokens.push(ch);i++;continue;}
if(/[\.,\?\!\;\:\-\тАФ\(\)\[\]\"\'\/\\@#%&]/.test(ch)){tokens.push(ch);i++;continue;}
let matched=null;
for(let k=0;k<KEYS.length;k++){
const key=KEYS[k];
if(i+key.length<=str.length){
const slice=str.substr(i,key.length);
if(slice===key){matched=slice;break;}
if(slice.toLowerCase()===key.toLowerCase()){matched=slice;break;}
}
}
if(matched){tokens.push(matched);i+=matched.length;}
else{tokens.push(ch);i++;}
}
return tokens;
}
function tokensToDevanagari(tokens){
const OUT=[];
for(let idx=0;idx<tokens.length;idx++){
const tk=tokens[idx];
if(tk===' '){OUT.push(' ');continue;}
if(/^[\.,\?\!\;\:\-\тАФ\(\)\[\]\"\'\/\\@#%&]$/.test(tk)){OUT.push(tk);continue;}
if(digitsMap[tk]){OUT.push(digitsMap[tk]);continue;}
if(specialMap[tk]||specialMap[tk.toLowerCase()]){OUT.push(specialMap[tk]||specialMap[tk.toLowerCase()]);continue;}
const vl=vowelMap[tk.toLowerCase()];
if(vl){OUT.push(vl);continue;}
const cons=consonantMap[tk]||consonantMap[tk.toLowerCase()];
if(cons){
const next=tokens[idx+1];
if(next && vowelMap[next.toLowerCase()]){
const vn=next.toLowerCase();
if(vn==='a'){OUT.push(cons);idx++;continue;}
else{OUT.push(cons+(matraMap[vn]||''));idx++;continue;}
}
if(next && (consonantMap[next]||consonantMap[next.toLowerCase()])){OUT.push(cons+'реН');continue;}
OUT.push(cons);
continue;
}
OUT.push(tk);
}
return OUT.join('').replace(/реН\s/g,' ');
}
function transliterate(){outputEl.value=tokensToDevanagari(tokenize(inputEl.value));}
/* --- Utilities --- */
copyBtn.addEventListener('click',()=>{if(!outputEl.value){alert('Nothing to copy!');return;}navigator.clipboard.writeText(outputEl.value).then(()=>{const orig=copyBtn.textContent;copyBtn.textContent='тЬЕ Copied!';copyBtn.style.background='#16a34a';setTimeout(()=>{copyBtn.textContent=orig;copyBtn.style.background='#10b981';},2000);}).catch(()=>alert('Copy failed.'));});
clearBtn.addEventListener('click',()=>{inputEl.value='';outputEl.value='';});
nepaliBtn.addEventListener('click',()=>setLanguage('nepali'));
hindiBtn.addEventListener('click',()=>setLanguage('hindi'));
inputEl.addEventListener('input',transliterate);
inputEl.addEventListener('keyup',transliterate);
inputEl.addEventListener('paste',()=>setTimeout(transliterate,10));
})();
</script>