UNPKG

amharic-keyboard

Version:

A TypeScript library for translating English text to Amharic, with support for characters, words, and numbers.

891 lines (885 loc) 17.2 kB
'use strict'; /** * Checks if a character is a vowel * @param char The character to check * @returns True if the character is a vowel, false otherwise */ const isVowel = (char) => { return ["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"].includes(char); }; const words = { ha: "ሀ", hu: "ሁ", hi: "ሂ", hA: "ሃ", he: "ሄ", h: "ህ", ho: "ሆ", le: "ለ", lu: "ሉ", li: "ሊ", la: "ላ", lE: "ሌ", l: "ል", lo: "ሎ", lwa: "ሏ", Ha: "ሐ", Hu: "ሑ", Hi: "ሒ", HA: "ሓ", He: "ሔ", H: "ሕ", Ho: "ሖ", Hwa: "ሗ", me: "መ", mu: "ሙ", mi: "ሚ", ma: "ማ", mE: "ሜ", m: "ም", mo: "ሞ", mwa: "ሟ", Se: "ሠ", Su: "ሡ", Si: "ሢ", Sa: "ሣ", SE: "ሤ", S: "ሥ", So: "ሦ", Swa: "ሧ", re: "ረ", ru: "ሩ", ri: "ሪ", ra: "ራ", rE: "ሬ", r: "ር", ro: "ሮ", rwa: "ሯ", se: "ሰ", su: "ሱ", si: "ሲ", sa: "ሳ", sE: "ሴ", s: "ስ", so: "ሶ", swa: "ሷ", she: "ሸ", shu: "ሹ", shi: "ሺ", sha: "ሻ", shE: "ሼ", sh: "ሽ", sho: "ሾ", shwa: "ሿ", qe: "ቀ", qu: "ቁ", qi: "ቂ", qa: "ቃ", qE: "ቄ", q: "ቅ", qo: "ቆ", qwa: "ቇ", Qe: "ቐ", Qu: "ቑ", Qi: "ቒ", Qa: "ቓ", QE: "ቔ", Q: "ቕ", Qo: "ቖ", be: "በ", bu: "ቡ", bi: "ቢ", ba: "ባ", bE: "ቤ", b: "ብ", bo: "ቦ", bwa: "ቧ", ve: "ቨ", vu: "ቩ", vi: "ቪ", va: "ቫ", vE: "ቬ", v: "ቭ", vo: "ቮ", vwa: "ቯ", te: "ተ", tu: "ቱ", ti: "ቲ", ta: "ታ", tE: "ቴ", t: "ት", to: "ቶ", twa: "ቷ", che: "ቸ", chu: "ቹ", chi: "ቺ", cha: "ቻ", chE: "ቼ", ch: "ች", cho: "ቾ", chwa: "ቿ", Xe: "ኀ", Xu: "ኁ", Xi: "ኂ", Xa: "ኃ", XE: "ኄ", X: "ኅ", Xo: "ኆ", Xwa: "ኇ", ne: "ነ", nu: "ኑ", ni: "ኒ", na: "ና", nE: "ኔ", n: "ን", no: "ኖ", nwa: "ኗ", nye: "ኘ", nyu: "ኙ", nyi: "ኚ", nya: "ኛ", nyE: "ኜ", ny: "ኝ", nyo: "ኞ", nywa: "ኟ", a: "አ", au: "ኡ", e: "ኢ", o: "ኣ", aE: "ኤ", i: "ኤ", ae: "እ", ao: "ኦ", awa: "ኧ", x: "ኤክስ", ke: "ከ", ku: "ኩ", ki: "ኪ", ka: "ካ", kE: "ኬ", k: "ክ", c: "ክ", ko: "ኮ", kwa: "ኯ", Ke: "ኸ", Ku: "ኹ", Ki: "ኺ", Ka: "ኻ", KE: "ኼ", K: "ኽ", Ko: "ኾ", we: "ወ", wu: "ዉ", wi: "ዊ", wa: "ዋ", wE: "ዌ", w: "ው", wo: "ዎ", Ae: "ዐ", Au: "ዑ", Ai: "ዒ", Aa: "ዓ", E: "ዔ", A: "ዕ", Ao: "ዖ", ze: "ዘ", zu: "ዙ", zi: "ዚ", za: "ዛ", zE: "ዜ", z: "ዝ", zo: "ዞ", zwa: "ዟ", zhe: "ዠ", zhu: "ዡ", zhi: "ዢ", zha: "ዣ", zhE: "ዤ", zh: "ዥ", zho: "ዦ", zhwa: "ዧ", ye: "የ", yu: "ዩ", u: "ዩ", yi: "ዪ", ya: "ያ", yE: "ዬ", y: "ይ", yo: "ዮ", ywa: "ዯ", de: "ደ", du: "ዱ", di: "ዲ", da: "ዳ", dE: "ዴ", d: "ድ", do: "ዶ", dwa: "ዷ", De: "ዸ", Du: "ዹ", Di: "ዺ", Da: "ዻ", DE: "ዼ", D: "ዽ", Do: "ዾ", Dwa: "ዿ", je: "ጀ", ju: "ጁ", ji: "ጂ", ja: "ጃ", jE: "ጄ", j: "ጅ", jo: "ጆ", jwa: "ጇ", ge: "ገ", gu: "ጉ", gi: "ጊ", ga: "ጋ", gE: "ጌ", g: "ግ", go: "ጎ", gwa: "ጏ", Ge: "ጘ", Gu: "ጙ", Gi: "ጚ", Ga: "ጛ", GE: "ጜ", G: "ጝ", Go: "ጞ", Gwa: "ጟ", Te: "ጠ", Tu: "ጡ", Ti: "ጢ", Ta: "ጣ", TE: "ጤ", T: "ጥ", To: "ጦ", Twa: "ጧ", Che: "ጨ", Chu: "ጩ", Chi: "ጪ", Cha: "ጫ", ChE: "ጬ", C: "ጭ", Cho: "ጮ", Chwa: "ጯ", pe: "ጰ", pu: "ጱ", pi: "ጲ", pa: "ጳ", pE: "ጴ", p: "ጵ", po: "ጶ", pwa: "ጷ", tse: "ጸ", tsu: "ጹ", tsi: "ጺ", tsa: "ጻ", tsE: "ጼ", ts: "ጽ", tso: "ጾ", tswa: "ጿ", Tse: "ፀ", Tsu: "ፁ", Tsi: "ፂ", Tsa: "ፃ", TsE: "ፄ", Ts: "ፅ", Tso: "ፆ", Tswa: "ፇ", fe: "ፈ", fu: "ፉ", fi: "ፊ", fa: "ፋ", fE: "ፌ", f: "ፍ", fo: "ፎ", fwa: "ፏ", Pe: "ፐ", Pu: "ፑ", Pi: "ፒ", Pa: "ፓ", PE: "ፔ", P: "ፕ", Po: "ፖ", Pwa: "ፗ", qwo: "ቈ", qwi: "ቊ", Qwa: "ቋ", qwe: "ቌ", qw: "ቍ", QWo: "ቘ", QWi: "ቚ", QWa: "ቛ", QWe: "ቜ", QW: "ቝ", xwo: "ኈ", xwi: "ኊ", xwa: "ኋ", xwe: "ኌ", xw: "ኍ", kwo: "ኰ", kwi: "ኲ", Kwa: "ኳ", kwe: "ኴ", kw: "ኵ", KWo: "ዀ", KWi: "ዂ", KWa: "ዃ", KWe: "ዄ", KW: "ዅ", gwo: "ጐ", gwi: "ጒ", GWa: "ጓ", gwe: "ጔ", gw: "ጕ", s7o: "ፘ", s7i: "ፙ", s7a: "ፚ", }; const reverseWords = { ሀ: "ha", ሁ: "hu", ሂ: "hi", ሃ: "hA", ሄ: "he", ህ: "h", ሆ: "ho", ለ: "le", ሉ: "lu", ሊ: "li", ላ: "la", ሌ: "lE", ል: "l", ሎ: "lo", ሏ: "lwa", ሐ: "Ha", ሑ: "Hu", ሒ: "Hi", ሓ: "HA", ሔ: "He", ሕ: "H", ሖ: "Ho", ሗ: "Hwa", መ: "me", ሙ: "mu", ሚ: "mi", ማ: "ma", ሜ: "mE", ም: "m", ሞ: "mo", ሟ: "mwa", ሠ: "Se", ሡ: "Su", ሢ: "Si", ሣ: "Sa", ሤ: "SE", ሥ: "S", ሦ: "So", ሧ: "Swa", ረ: "re", ሩ: "ru", ሪ: "ri", ራ: "ra", ሬ: "rE", ር: "r", ሮ: "ro", ሯ: "rwa", ሰ: "se", ሱ: "su", ሲ: "si", ሳ: "sa", ሴ: "sE", ስ: "s", ሶ: "so", ሷ: "swa", ሸ: "she", ሹ: "shu", ሺ: "shi", ሻ: "sha", ሼ: "shE", ሽ: "sh", ሾ: "sho", ሿ: "shwa", ቀ: "qe", ቁ: "qu", ቂ: "qi", ቃ: "qa", ቄ: "qE", ቅ: "q", ቆ: "qo", ቇ: "qwa", ቐ: "Qe", ቑ: "Qu", ቒ: "Qi", ቓ: "Qa", ቔ: "QE", ቕ: "Q", ቖ: "Qo", በ: "be", ቡ: "bu", ቢ: "bi", ባ: "ba", ቤ: "bE", ብ: "b", ቦ: "bo", ቧ: "bwa", ቨ: "ve", ቩ: "vu", ቪ: "vi", ቫ: "va", ቬ: "vE", ቭ: "v", ቮ: "vo", ቯ: "vwa", ተ: "te", ቱ: "tu", ቲ: "ti", ታ: "ta", ቴ: "tE", ት: "t", ቶ: "to", ቷ: "twa", ቸ: "che", ቹ: "chu", ቺ: "chi", ቻ: "cha", ቼ: "chE", ች: "ch", ቾ: "cho", ቿ: "chwa", ኀ: "Xe", ኁ: "Xu", ኂ: "Xi", ኃ: "Xa", ኄ: "XE", ኅ: "X", ኆ: "Xo", ኇ: "Xwa", ነ: "ne", ኑ: "nu", ኒ: "ni", ና: "na", ኔ: "nE", ን: "n", ኖ: "no", ኗ: "nwa", ኘ: "nye", ኙ: "nyu", ኚ: "nyi", ኛ: "nya", ኜ: "nyE", ኝ: "ny", ኞ: "nyo", ኟ: "nywa", አ: "a", ኡ: "au", ኢ: "e", ኣ: "aa", ኤ: "aE", እ: "ae", ኦ: "ao", ኧ: "awa", ከ: "ke", ኩ: "ku", ኪ: "ki", ካ: "ka", ኬ: "kE", ክ: "k", ኮ: "ko", ኯ: "kwa", ኸ: "Ke", ኹ: "Ku", ኺ: "Ki", ኻ: "Ka", ኼ: "KE", ኽ: "K", ኾ: "Ko", ወ: "we", ዉ: "wu", ዊ: "wi", ዋ: "wa", ዌ: "wE", ው: "w", ዎ: "wo", ዐ: "Ae", ዑ: "Au", ዒ: "Ai", ዓ: "Aa", ዔ: "E", ዕ: "A", ዖ: "Ao", ዘ: "ze", ዙ: "zu", ዚ: "zi", ዛ: "za", ዜ: "zE", ዝ: "z", ዞ: "zo", ዟ: "zwa", ዠ: "zhe", ዡ: "zhu", ዢ: "zhi", ዣ: "zha", ዤ: "zhE", ዥ: "zh", ዦ: "zho", ዧ: "zhwa", የ: "ye", ዩ: "yu", ዪ: "yi", ያ: "ya", ዬ: "yE", ይ: "y", ዮ: "yo", ዯ: "ywa", ደ: "de", ዱ: "du", ዲ: "di", ዳ: "da", ዴ: "dE", ድ: "d", ዶ: "do", ዷ: "dwa", ዸ: "De", ዹ: "Du", ዺ: "Di", ዻ: "Da", ዼ: "DE", ዽ: "D", ዾ: "Do", ዿ: "Dwa", ጀ: "je", ጁ: "ju", ጂ: "ji", ጃ: "ja", ጄ: "jE", ጅ: "j", ጆ: "jo", ጇ: "jwa", ገ: "ge", ጉ: "gu", ጊ: "gi", ጋ: "ga", ጌ: "gE", ግ: "g", ጎ: "go", ጏ: "gwa", ጘ: "Ge", ጙ: "Gu", ጚ: "Gi", ጛ: "Ga", ጜ: "GE", ጝ: "G", ጞ: "Go", ጟ: "Gwa", ጠ: "Te", ጡ: "Tu", ጢ: "Ti", ጣ: "Ta", ጤ: "TE", ጥ: "T", ጦ: "To", ጧ: "Twa", ጨ: "Che", ጩ: "Chu", ጪ: "Chi", ጫ: "Cha", ጬ: "ChE", ጭ: "C", ጮ: "Cho", ጯ: "Chwa", ጰ: "pe", ጱ: "pu", ጲ: "pi", ጳ: "pa", ጴ: "pE", ጵ: "p", ጶ: "po", ጷ: "pwa", ጸ: "tse", ጹ: "tsu", ጺ: "tsi", ጻ: "tsa", ጼ: "tsE", ጽ: "ts", ጾ: "tso", ጿ: "tswa", ፀ: "Tse", ፁ: "Tsu", ፂ: "Tsi", ፃ: "Tsa", ፄ: "TsE", ፅ: "Ts", ፆ: "Tso", ፇ: "Tswa", ፈ: "fe", ፉ: "fu", ፊ: "fi", ፋ: "fa", ፌ: "fE", ፍ: "f", ፎ: "fo", ፏ: "fwa", ፐ: "Pe", ፑ: "Pu", ፒ: "Pi", ፓ: "Pa", ፔ: "PE", ፕ: "P", ፖ: "Po", ፗ: "Pwa", ቈ: "qwo", ቊ: "qwi", ቋ: "Qwa", ቌ: "qwe", ቍ: "qw", ቘ: "QWo", ቚ: "QWi", ቛ: "QWa", ቜ: "QWe", ቝ: "QW", ኈ: "xwo", ኊ: "xwi", ኋ: "xwa", ኌ: "xwe", ኍ: "xw", ኰ: "kwo", ኲ: "kwi", ኳ: "Kwa", ኴ: "kwe", ኵ: "kw", ዀ: "KWo", ዂ: "KWi", ዃ: "KWa", ዄ: "KWe", ዅ: "KW", ጐ: "gwo", ጒ: "gwi", ጓ: "GWa", ጔ: "gwe", ጕ: "gw", ፘ: "s7o", ፙ: "s7i", ፚ: "s7a", }; const numbers = [ "፩", "፪", "፫", "፬", "፭", "፮", "፯", "፰", "፱", ]; const underHundred = { "10": "፲", "20": "፳", "30": "፴", "40": "፵", "50": "፶", "60": "፷", "70": "፸", "80": "፹", "90": "፺", }; const overHundred = { "100": "፻", "1000": "፼", "10000": "፼፲"}; /** * Translates a number to Amharic format * @param num The number to translate * @returns The Amharic representation of the number */ const translateNumberToAmharic = (num) => { if (num === 0) return "0"; // Handle numbers 1-9 if (num < 10) { const data = numbers[num - 1]; return data; } // Handle numbers 10-99 if (num < 100) { const tens = Math.floor(num / 10) * 10; const ones = num % 10; if (ones === 0) { return underHundred[tens]; } else { return underHundred[tens] + numbers[ones - 1]; } } // Handle numbers 100-999 if (num < 1000) { const hundreds = Math.floor(num / 100); const remainder = num % 100; let result = hundreds === 1 ? overHundred[100] : numbers[hundreds - 1] + overHundred[100]; if (remainder > 0) { result += translateNumberToAmharic(remainder); } return result; } // Handle numbers 1000-9999 if (num < 10000) { const thousands = Math.floor(num / 1000); const remainder = num % 1000; let result = thousands === 1 ? overHundred[1000] : numbers[thousands - 1] + overHundred[1000]; if (remainder > 0) { result += translateNumberToAmharic(remainder); } return result; } // Handle numbers 10000 and above if (num < 100000) { const tenThousands = Math.floor(num / 10000); const remainder = num % 10000; let result = tenThousands === 1 ? overHundred[10000] : numbers[tenThousands - 1] + overHundred[10000]; if (remainder > 0) { result += translateNumberToAmharic(remainder); } return result; } if (num) // For larger numbers, return as is return num.toString(); else { return ""; } }; /** * Translates English text to Amharic using the mapping in final.ts * @param text The English text to translate * @returns An object containing both the original English text and its Amharic translation */ function translateToAmharic(text) { if (!text) { return { en: "", am: "" }; } let i = 0; let amharicLetterCount = 0; let amharicLetter = ""; while (i < text.length) { // Check for special letters (longer combinations first) const numberRegex = /^\d+/; const match = text.substring(i).match(numberRegex); let fetchingLetter = text[i]; if (match) { const numStr = match[0]; const num = parseInt(numStr, 10); const val = translateNumberToAmharic(num); i += numStr.length; amharicLetter += val; } else if (i > 0 && isVowel(text[i])) { // Try combinations of up to 4 preceding consonants with the current vowel for (let depth = 3; depth >= 0; depth--) { if (depth === 3 && text[i - 1] != " " && text[i - 2] != " " && text[i - 3] != " " && text[i - 1] && text[i - 2] && text[i - 3] && !isVowel(text[i - 1]) && !isVowel(text[i - 2]) && !isVowel(text[i - 3])) { let fetchingLetter = text[i - 3] + text[i - 2] + text[i - 1] + text[i]; const valueData = words[fetchingLetter]; if (valueData) { amharicLetter = amharicLetter.slice(0, amharicLetterCount - 3) + valueData; break; } } if (depth === 2 && text[i - 1] && text[i - 2] && text[i - 1] != " " && text[i - 2] != " " && !isVowel(text[i - 1]) && !isVowel(text[i - 2])) { let fetchingLetter = text[i - 2] + text[i - 1] + text[i]; const valueData = words[fetchingLetter]; if (valueData) { amharicLetter = amharicLetter.slice(0, amharicLetterCount - 2) + valueData; break; } } if (depth === 1 && text[i - 1] && text[i - 1] != " " && !isVowel(text[i - 1])) { let fetchingLetter = text[i - 1] + text[i]; const valueData = words[fetchingLetter]; if (valueData) { amharicLetter = amharicLetter.slice(0, amharicLetterCount - 1) + valueData; break; } } if (depth === 0) { const valueData = words[fetchingLetter]; if (valueData) { amharicLetter += valueData; break; } } } } else if (" " === fetchingLetter) { amharicLetter += " "; } else { const data = words[fetchingLetter]; if (data) amharicLetter += data; } amharicLetterCount = amharicLetter.length; i++; } return { en: text, am: amharicLetter, }; } /** * Translates Amharic text to English using the reverseWords mapping * @param text The Amharic text to translate * @returns An object containing both the original Amharic text and its English translation */ function translateToEnglish(text) { if (!text) { return { am: "", en: "" }; } let englishText = ""; for (let i = 0; i < text.length; i++) { const amharicChar = text[i]; const englishChar = reverseWords[amharicChar]; if (englishChar) { englishText += englishChar; } else { englishText += amharicChar; // If no mapping found, keep the original character } } return { am: text, en: englishText, }; } exports.isVowel = isVowel; exports.translateNumberToAmharic = translateNumberToAmharic; exports.translateToAmharic = translateToAmharic; exports.translateToEnglish = translateToEnglish; //# sourceMappingURL=index.js.map