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
JavaScript
'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