Я разрабатываю пользовательскую клавиатуру для амхарского языка в Android, но следующее применимо ко многим другим неанглийским языкам.
Две или более комбинации клавиш переводят на один символ. Итак, если пользователь набирает "S", клавиатура выведет "ሰ"... и если они последуют за ней буквой "A", "ሰ" заменяется на "ሳ".
Мне удалось найти решение, как показано ниже, работая, просматривая символ перед курсором и проверяя его на карте. Тем не менее, мне было интересно, возможно ли более простое и чистое решение.
public void onKey(int primaryCode, int[] keyCodes) {
InputConnection ic = getCurrentInputConnection();
HashMap<String, Integer> en_to_am = new HashMap<String, Integer>();
CharSequence pChar = ic.getTextBeforeCursor(1, 0);
int outKey = 0;
//build a hashmap of 'existing character' + 'new key code' = 'output key code'
en_to_am.put("83", 4656);
en_to_am.put("ሰ65", 4659);
try {
//see if config exists in hashmap for 'existing character' + 'new key code'
if (en_to_am.get(pChar.toString() + primaryCode) != null) {
outKey = en_to_am.get(pChar.toString() + primaryCode);
ic.deleteSurroundingText(1, 0);
} else {
//else just translate latin to amharic (ASCII 83 = ሰ)
if (en_to_am.get("" + primaryCode) != null) {
outKey = en_to_am.get("" + primaryCode);
} else {
//if no translation exists, just output the latin code
outKey = primaryCode;
}
}
} catch (Exception e) {
outKey = primaryCode;
}
char code = (char) outKey;
ic.commitText(String.valueOf(code), 1);
}