Romanized Hindi / Nepali to English Translator

ЁЯХЙя╕П 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>