diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/KeyboardParser.kt b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/KeyboardParser.kt index 920027e6a..3e907b374 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/KeyboardParser.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/KeyboardParser.kt @@ -35,7 +35,7 @@ import java.util.Locale * Functional keys are pre-defined and can't be changed, with exception of comma, period and similar * keys in symbol layouts. * By default, all normal keys have the same width and flags, which may cause issues with the - * requirements of certain non-latin languages. todo: add labelFlags to Json parser, or determine automatically? + * requirements of certain non-latin languages. */ abstract class KeyboardParser(private val params: KeyboardParams, private val context: Context) { private val infos = layoutInfos(params) @@ -754,7 +754,7 @@ abstract class KeyboardParser(private val params: KeyboardParams, private val co fun parseFromAssets(params: KeyboardParams, context: Context): ArrayList> { val id = params.mId - val layoutName = params.mId.mSubtype.keyboardLayoutSetName + val layoutName = params.mId.mSubtype.keyboardLayoutSetName.substringBefore("+") val layoutFileNames = context.assets.list("layouts")!! return when { id.mElementId == KeyboardId.ELEMENT_SYMBOLS && ScriptUtils.getScriptFromSpellCheckerLocale(params.mId.locale) == ScriptUtils.SCRIPT_ARABIC @@ -769,22 +769,12 @@ abstract class KeyboardParser(private val params: KeyboardParams, private val co id.mElementId == KeyboardId.ELEMENT_PHONE -> JsonKeyboardParser(params, context).parseLayoutFromAssets("phone") id.mElementId == KeyboardId.ELEMENT_PHONE_SYMBOLS -> JsonKeyboardParser(params, context).parseLayoutFromAssets("phone_symbols") layoutFileNames.contains("$layoutName.json") -> JsonKeyboardParser(params, context).parseLayoutFromAssets(layoutName) - layoutFileNames.contains("${getSimpleLayoutName(layoutName, params)}.txt") + layoutFileNames.contains("$layoutName.txt") -> SimpleKeyboardParser(params, context).parseLayoutFromAssets(layoutName) else -> throw IllegalStateException("can't parse layout $layoutName with id $id and elementId ${id.mElementId}") } } - @JvmStatic // unsupported without JvmStatic - // todo: should be removed in the end (after removing old parser), and the internal layout names changed for easier finding - // currently it's spread out everywhere... method.xml, locale_and_extra_value_to_keyboard_layout_set_map, getKeyboardLayoutNameForLocale, ... - protected fun getSimpleLayoutName(layoutName: String, params: KeyboardParams): String = when (layoutName) { - "swiss", "german", "serbian_qwertz" -> "qwertz" - "nordic", "spanish" -> if (params.mId.locale.language == "eo") "eo" else "qwerty" - "south_slavic", "east_slavic" -> params.mId.locale.language // layouts are split per language now, much less convoluted - else -> layoutName - } - // todo: layoutInfos should be stored in method.xml (imeSubtypeExtraValue) // or somewhere else... some replacement for keyboard_layout_set xml maybe // move it after old parser is removed diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/SimpleKeyboardParser.kt b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/SimpleKeyboardParser.kt index b3372cb86..17a2cbb3f 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/SimpleKeyboardParser.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/SimpleKeyboardParser.kt @@ -6,6 +6,7 @@ import org.dslul.openboard.inputmethod.keyboard.internal.KeyboardParams import org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser.floris.KeyData import org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser.floris.toTextKey import org.dslul.openboard.inputmethod.latin.common.splitOnWhitespace +import org.dslul.openboard.inputmethod.latin.utils.SubtypeLocaleUtils /** * Parser for simple layouts, defined only as rows of (normal) keys with moreKeys. @@ -14,12 +15,10 @@ import org.dslul.openboard.inputmethod.latin.common.splitOnWhitespace * merged with defaults. */ class SimpleKeyboardParser(private val params: KeyboardParams, private val context: Context) : KeyboardParser(params, context) { - private val addExtraKeys = // todo (after removing old parser): add turkish layout that maps to qwerty, but enables extra keys - params.mId.isAlphabetKeyboard && params.mId.locale.language != "eo" - && params.mId.mSubtype.keyboardLayoutSetName in listOf("nordic", "spanish", "german", "swiss", "serbian_qwertz") + private val addExtraKeys = params.mId.mSubtype.keyboardLayoutSetName.endsWith("+") override fun getLayoutFromAssets(layoutName: String) = - context.assets.open("layouts/${getSimpleLayoutName(layoutName, params)}.txt").reader().readText() + context.assets.open("layouts/$layoutName.txt").reader().readText() override fun parseCoreLayout(layoutContent: String): MutableList> { val rowStrings = layoutContent.replace("\r\n", "\n").split("\n\n") diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java index 7209f36ad..29db95971 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java @@ -65,6 +65,12 @@ public final class Constants { */ public static final String KEYBOARD_MODE = "keyboard"; + // some extra values: + // TrySuppressingImeSwitcher: not documented, but used in Android source + // AsciiCapable: not used, but recommended for Android 9- because of known issues + // SupportTouchPositionCorrection: never read, never used outside AOSP keyboard -> can be removed? + // EmojiCapable: there is some description in Constants, but actually it's never read + // KeyboardLayoutSet: obvious public static final class ExtraValue { /** * The subtype extra value used to indicate that this subtype is capable of diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SubtypeSettings.kt b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SubtypeSettings.kt index 374445109..ef06229b2 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SubtypeSettings.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SubtypeSettings.kt @@ -56,20 +56,7 @@ fun addEnabledSubtype(prefs: SharedPreferences, subtype: InputMethodSubtype) { /** returns whether subtype was actually removed, does not remove last subtype */ fun removeEnabledSubtype(prefs: SharedPreferences, subtype: InputMethodSubtype) { require(initialized) - val subtypeString = subtype.prefString() - val oldSubtypeString = prefs.getString(Settings.PREF_ENABLED_INPUT_STYLES, "")!! - val newString = (oldSubtypeString.split(SUBTYPE_SEPARATOR) - subtypeString).joinToString(SUBTYPE_SEPARATOR) - if (newString == oldSubtypeString) - return // already removed - prefs.edit { putString(Settings.PREF_ENABLED_INPUT_STYLES, newString) } - if (subtypeString == prefs.getString(Settings.PREF_SELECTED_INPUT_STYLE, "")) { - // switch subtype if the currently used one has been disabled - val nextSubtype = RichInputMethodManager.getInstance().getNextSubtypeInThisIme(true) - if (subtypeString == nextSubtype?.prefString()) - KeyboardSwitcher.getInstance().switchToSubtype(getDefaultEnabledSubtypes().first()) - else - KeyboardSwitcher.getInstance().switchToSubtype(nextSubtype) - } + removeEnabledSubtype(prefs, subtype.prefString()) enabledSubtypes.remove(subtype) RichInputMethodManager.getInstance().refreshSubtypeCaches() } @@ -246,6 +233,8 @@ private fun loadEnabledSubtypes(context: Context) { if (subtype == null) { if (DebugFlags.DEBUG_ENABLED) Toast.makeText(context, "subtype $localeAndLayout could not be loaded", Toast.LENGTH_LONG).show() + else // don't remove in debug mode + removeEnabledSubtype(prefs, localeAndLayout.joinToString(LOCALE_LAYOUT_SEPARATOR)) continue } @@ -253,6 +242,22 @@ private fun loadEnabledSubtypes(context: Context) { } } +private fun removeEnabledSubtype(prefs: SharedPreferences, subtypeString: String) { + val oldSubtypeString = prefs.getString(Settings.PREF_ENABLED_INPUT_STYLES, "")!! + val newString = (oldSubtypeString.split(SUBTYPE_SEPARATOR) - subtypeString).joinToString(SUBTYPE_SEPARATOR) + if (newString == oldSubtypeString) + return // already removed + prefs.edit { putString(Settings.PREF_ENABLED_INPUT_STYLES, newString) } + if (subtypeString == prefs.getString(Settings.PREF_SELECTED_INPUT_STYLE, "")) { + // switch subtype if the currently used one has been disabled + val nextSubtype = RichInputMethodManager.getInstance().getNextSubtypeInThisIme(true) + if (subtypeString == nextSubtype?.prefString()) + KeyboardSwitcher.getInstance().switchToSubtype(getDefaultEnabledSubtypes().first()) + else + KeyboardSwitcher.getInstance().switchToSubtype(nextSubtype) + } +} + var initialized = false private set private val enabledSubtypes = mutableListOf() diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java index b74b1f549..a496d349f 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java @@ -92,33 +92,23 @@ public final class AndroidSpellCheckerService extends SpellCheckerService return mRecommendedThreshold; } - // todo: this needs to be adjusted! private static String getKeyboardLayoutNameForLocale(final Locale locale) { // See b/19963288. if (locale.getLanguage().equals("sr") || locale.getLanguage().equals("mk")) { - return "south_slavic"; + return locale.getLanguage(); } final int script = ScriptUtils.getScriptFromSpellCheckerLocale(locale); - switch (script) { - case ScriptUtils.SCRIPT_LATIN: - return "qwerty"; - case ScriptUtils.SCRIPT_ARMENIAN: - return "armenian_phonetic"; - case ScriptUtils.SCRIPT_CYRILLIC: - return "east_slavic"; - case ScriptUtils.SCRIPT_GREEK: - return "greek"; - case ScriptUtils.SCRIPT_HEBREW: - return "hebrew"; - case ScriptUtils.SCRIPT_BULGARIAN: - return "bulgarian"; - case ScriptUtils.SCRIPT_GEORGIAN: - return "georgian"; - case ScriptUtils.SCRIPT_BENGALI: - return "bengali_unijoy"; - default: - throw new RuntimeException("Wrong script supplied: " + script); - } + return switch (script) { + case ScriptUtils.SCRIPT_LATIN -> "qwerty"; + case ScriptUtils.SCRIPT_ARMENIAN -> "armenian_phonetic"; + case ScriptUtils.SCRIPT_CYRILLIC -> "ru"; + case ScriptUtils.SCRIPT_GREEK -> "greek"; + case ScriptUtils.SCRIPT_HEBREW -> "hebrew"; + case ScriptUtils.SCRIPT_BULGARIAN -> "bulgarian"; + case ScriptUtils.SCRIPT_GEORGIAN -> "georgian"; + case ScriptUtils.SCRIPT_BENGALI -> "bengali_unijoy"; + default -> throw new RuntimeException("Wrong script supplied: " + script); + }; } @Override diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/SubtypeLocaleUtils.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/SubtypeLocaleUtils.java index a3dd0e77b..510026368 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/SubtypeLocaleUtils.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/SubtypeLocaleUtils.java @@ -8,7 +8,6 @@ package org.dslul.openboard.inputmethod.latin.utils; import android.content.Context; import android.content.res.Resources; -import org.dslul.openboard.inputmethod.latin.utils.Log; import android.view.inputmethod.InputMethodSubtype; import org.dslul.openboard.inputmethod.latin.R; @@ -51,27 +50,16 @@ public final class SubtypeLocaleUtils { // Keyboard layout to subtype name resource id map. private static final HashMap sKeyboardLayoutToNameIdsMap = new HashMap<>(); // Exceptional locale whose name should be displayed in Locale.ROOT. - private static final HashMap sExceptionalLocaleDisplayedInRootLocale = - new HashMap<>(); + private static final HashMap sExceptionalLocaleDisplayedInRootLocale = new HashMap<>(); // Exceptional locale to subtype name resource id map. private static final HashMap sExceptionalLocaleToNameIdsMap = new HashMap<>(); // Exceptional locale to subtype name with layout resource id map. - private static final HashMap sExceptionalLocaleToWithLayoutNameIdsMap = - new HashMap<>(); - private static final String SUBTYPE_NAME_RESOURCE_PREFIX = - "string/subtype_"; - private static final String SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX = - "string/subtype_generic_"; - private static final String SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX = - "string/subtype_with_layout_"; - private static final String SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX = - "string/subtype_no_language_"; - private static final String SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX = - "string/subtype_in_root_locale_"; - // Keyboard layout set name for the subtypes that don't have a keyboardLayoutSet extra value. - // This is for compatibility to keep the same subtype ids as pre-JellyBean. - private static final HashMap sLocaleAndExtraValueToKeyboardLayoutSetMap = - new HashMap<>(); + private static final HashMap sExceptionalLocaleToWithLayoutNameIdsMap = new HashMap<>(); + private static final String SUBTYPE_NAME_RESOURCE_PREFIX = "string/subtype_"; + private static final String SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX = "string/subtype_generic_"; + private static final String SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX = "string/subtype_with_layout_"; + private static final String SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX = "string/subtype_no_language_"; + private static final String SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX = "string/subtype_in_root_locale_"; private SubtypeLocaleUtils() { // Intentional empty constructor for utility class. @@ -80,7 +68,7 @@ public final class SubtypeLocaleUtils { // Note that this initialization method can be called multiple times. public static void init(final Context context) { synchronized (sInitializeLock) { - if (sInitialized == false) { + if (!sInitialized) { initLocked(context); sInitialized = true; } @@ -93,8 +81,7 @@ public final class SubtypeLocaleUtils { sResources = res; final String[] predefinedLayoutSet = res.getStringArray(R.array.predefined_layouts); - final String[] layoutDisplayNames = res.getStringArray( - R.array.predefined_layout_display_names); + final String[] layoutDisplayNames = res.getStringArray(R.array.predefined_layout_display_names); for (int i = 0; i < predefinedLayoutSet.length; i++) { final String layoutName = predefinedLayoutSet[i]; sKeyboardLayoutToDisplayNameMap.put(layoutName, layoutDisplayNames[i]); @@ -103,42 +90,27 @@ public final class SubtypeLocaleUtils { sKeyboardLayoutToNameIdsMap.put(layoutName, resId); // Register subtype name resource id of "No language" with key "zz_" final String noLanguageResName = SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX + layoutName; - final int noLanguageResId = res.getIdentifier( - noLanguageResName, null, RESOURCE_PACKAGE_NAME); + final int noLanguageResId = res.getIdentifier(noLanguageResName, null, RESOURCE_PACKAGE_NAME); final String key = getNoLanguageLayoutKey(layoutName); sKeyboardLayoutToNameIdsMap.put(key, noLanguageResId); } - final String[] exceptionalLocaleInRootLocale = res.getStringArray( - R.array.subtype_locale_displayed_in_root_locale); - for (int i = 0; i < exceptionalLocaleInRootLocale.length; i++) { - final String localeString = exceptionalLocaleInRootLocale[i]; + final String[] exceptionalLocaleInRootLocale = res.getStringArray(R.array.subtype_locale_displayed_in_root_locale); + for (final String localeString : exceptionalLocaleInRootLocale) { final String resourceName = SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX + localeString; final int resId = res.getIdentifier(resourceName, null, RESOURCE_PACKAGE_NAME); sExceptionalLocaleDisplayedInRootLocale.put(localeString, resId); } - final String[] exceptionalLocales = res.getStringArray( - R.array.subtype_locale_exception_keys); - for (int i = 0; i < exceptionalLocales.length; i++) { - final String localeString = exceptionalLocales[i]; + final String[] exceptionalLocales = res.getStringArray(R.array.subtype_locale_exception_keys); + for (final String localeString : exceptionalLocales) { final String resourceName = SUBTYPE_NAME_RESOURCE_PREFIX + localeString; final int resId = res.getIdentifier(resourceName, null, RESOURCE_PACKAGE_NAME); sExceptionalLocaleToNameIdsMap.put(localeString, resId); - final String resourceNameWithLayout = - SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX + localeString; - final int resIdWithLayout = res.getIdentifier( - resourceNameWithLayout, null, RESOURCE_PACKAGE_NAME); + final String resourceNameWithLayout = SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX + localeString; + final int resIdWithLayout = res.getIdentifier(resourceNameWithLayout, null, RESOURCE_PACKAGE_NAME); sExceptionalLocaleToWithLayoutNameIdsMap.put(localeString, resIdWithLayout); } - - final String[] keyboardLayoutSetMap = res.getStringArray( - R.array.locale_and_extra_value_to_keyboard_layout_set_map); - for (int i = 0; i + 1 < keyboardLayoutSetMap.length; i += 2) { - final String key = keyboardLayoutSetMap[i]; - final String keyboardLayoutSet = keyboardLayoutSetMap[i + 1]; - sLocaleAndExtraValueToKeyboardLayoutSetMap.put(key, keyboardLayoutSet); - } } public static boolean isExceptionalLocale(final String localeString) { @@ -304,8 +276,7 @@ public final class SubtypeLocaleUtils { } @Nullable - public static String getKeyboardLayoutSetDisplayName( - @NonNull final InputMethodSubtype subtype) { + public static String getKeyboardLayoutSetDisplayName(@NonNull final InputMethodSubtype subtype) { final String layoutName = getKeyboardLayoutSetName(subtype); return getKeyboardLayoutSetDisplayName(layoutName); } @@ -318,17 +289,12 @@ public final class SubtypeLocaleUtils { @NonNull public static String getKeyboardLayoutSetName(final InputMethodSubtype subtype) { String keyboardLayoutSet = subtype.getExtraValueOf(KEYBOARD_LAYOUT_SET); - if (keyboardLayoutSet == null) { - // This subtype doesn't have a keyboardLayoutSet extra value, so lookup its keyboard - // layout set in sLocaleAndExtraValueToKeyboardLayoutSetMap to keep it compatible with - // pre-JellyBean. - final String key = subtype.getLocale() + ":" + subtype.getExtraValue(); - keyboardLayoutSet = sLocaleAndExtraValueToKeyboardLayoutSetMap.get(key); + if (keyboardLayoutSet == null && subtype.isAsciiCapable()) { + keyboardLayoutSet = QWERTY; } - // TODO: Remove this null check when InputMethodManager.getCurrentInputMethodSubtype is - // fixed. + // TODO: Remove this null check when InputMethodManager.getCurrentInputMethodSubtype is fixed. if (keyboardLayoutSet == null) { - android.util.Log.w(TAG, "KeyboardLayoutSet not found, use QWERTY: " + + Log.w(TAG, "KeyboardLayoutSet not found, use QWERTY: " + "locale=" + subtype.getLocale() + " extraValue=" + subtype.getExtraValue()); return QWERTY; } diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 127947706..5d1ec8efe 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -82,51 +82,6 @@ %s (PC) - - - en_US:TrySuppressingImeSwitcher,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - qwerty - en_GB:TrySuppressingImeSwitcher,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - qwerty - ar:SupportTouchPositionCorrection,EmojiCapable - arabic - cs:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - qwertz - da:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - nordic - de:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - qwertz - es:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - spanish - fi:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - nordic - fr:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - azerty - fr_CA:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - qwerty - hr:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - qwertz - hu:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - qwertz - it:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - qwerty - iw:SupportTouchPositionCorrection,EmojiCapable - hebrew - nb:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - nordic - nl:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - qwerty - pl:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - qwerty - ru:SupportTouchPositionCorrection,EmojiCapable - east_slavic - sr:SupportTouchPositionCorrection,EmojiCapable - south_slavic - sv:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - nordic - tr:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable - qwerty - org.dslul.openboard.inputmethod.latin.HIDE_SOFT_INPUT diff --git a/app/src/main/res/xml/method.xml b/app/src/main/res/xml/method.xml index 7cdfa197d..ed9c9e01c 100644 --- a/app/src/main/res/xml/method.xml +++ b/app/src/main/res/xml/method.xml @@ -14,36 +14,36 @@ ar: Arabic/arabic ar: Arabic/arabic_pc az_AZ: Azerbaijani (Azerbaijan)/qwerty - be_BY: Belarusian (Belarus)/east_slavic + be_BY: Belarusian (Belarus)/be bg: Bulgarian/bulgarian bg: Bulgarian/bulgarian_bds bg: Bulgarian/bulgarian_bekl bn_BD: Bengali (Bangladesh)/bengali_unijoy bn_BD: Bengali (Bangladesh) (Akkhor)/bengali_akkhor bn_IN: Bengali (India)/bengali - ca: Catalan/spanish + ca: Catalan/qwerty+ cs: Czech/qwertz - da: Danish/nordic + da: Danish/qwerty+ de: German/qwertz - de_DE: German (Germany)/german - de_CH: German (Switzerland)/swiss + de_DE: German (Germany)/qwertz+ + de_CH: German (Switzerland)/qwertz+ el: Greek/greek en_AU: English (Australia)/qwerty en_IN: English (India)/qwerty en_US: English (United States)/qwerty en_GB: English (Great Britain)/qwerty - eo: Esperanto/spanish - es: Spanish/spanish - es_US: Spanish (United States)/spanish - es_419: Spanish (Latin America)/spanish - et_EE: Estonian (Estonia)/nordic - eu_ES: Basque (Spain)/spanish + eo: Esperanto/qwerty+ + es: Spanish/qwerty+ + es_US: Spanish (United States)/qwerty+ + es_419: Spanish (Latin America)/qwerty+ + et_EE: Estonian (Estonia)/qwerty+ + eu_ES: Basque (Spain)/qwerty+ fa: Persian/farsi - fi: Finnish/nordic + fi: Finnish/qwerty+ fr: French/azerty fr_CA: French (Canada)/qwerty - fr_CH: French (Switzerland)/swiss - gl_ES: Galician (Spain)/spanish + fr_CH: French (Switzerland)/qwertz+ + gl_ES: Galician (Spain)/qwerty+ hi: Hindi/hindi hi: Hindi/hindi_compact hi_ZZ: Hinglish/qwerty # This is a preliminary keyboard layout. @@ -54,22 +54,22 @@ in: Indonesian/qwerty # "id" is the official language code of Indonesian. is: Icelandic/qwerty it: Italian/qwerty - it_CH: Italian (Switzerland)/swiss + it_CH: Italian (Switzerland)/qwertz+ iw: Hebrew/hebrew # "he" is the official language code of Hebrew. ka_GE: Georgian (Georgia)/georgian - kk: Kazakh/east_slavic + kk: Kazakh/kk km_KH: Khmer (Cambodia)/khmer kn_IN: Kannada (India)/kannada - ky: Kyrgyz/east_slavic + ky: Kyrgyz/ky lo_LA: Lao (Laos)/lao lt: Lithuanian/qwerty lv: Latvian/qwerty - mk: Macedonian/south_slavic + mk: Macedonian/mk ml_IN: Malayalam (India)/malayalam mn_MN: Mongolian (Mongolia)/mongolian mr_IN: Marathi (India)/marathi ms_MY: Malay (Malaysia)/qwerty - nb: Norwegian Bokmål/nordic + nb: Norwegian Bokmål/qwerty+ ne_NP: Nepali (Nepal) Romanized/nepali_romanized ne_NP: Nepali (Nepal) Traditional/nepali_traditional nl: Dutch/qwerty @@ -78,23 +78,23 @@ pt_BR: Portuguese (Brazil)/qwerty pt_PT: Portuguese (Portugal)/qwerty ro: Romanian/qwerty - ru: Russian/east_slavic + ru: Russian/ru si_LK: Sinhala (Sri Lanka)/sinhala # This is a preliminary keyboard layout. sk: Slovak/qwerty sl: Slovenian/qwerty - sr: Serbian/south_slavic + sr: Serbian/sr sr_ZZ: Serbian (Latin)/serbian_qwertz # This is a preliminary keyboard layout. - sv: Swedish/nordic + sv: Swedish/qwerty+ sw: Swahili/qwerty ta_IN: Tamil (India)/tamil ta_LK: Tamil (Sri Lanka)/tamil # Disabled in conjunction with si_LK. ta_SG: Tamil (Singapore)/tamil te_IN: Telugu (India)/telugu th: Thai/thai - tl: Tagalog/spanish + tl: Tagalog/qwerty+ tr: Turkish/qwerty ur_PK: Urdu Pakistan - uk: Ukrainian/east_slavic + uk: Ukrainian/uk uz_UZ: Uzbek (Uzbekistan)/uzbek # This is a preliminary keyboard layout. vi: Vietnamese/qwerty zu: Zulu/qwerty @@ -144,7 +144,7 @@ android:imeSubtypeLocale="af" android:languageTag="af" android:imeSubtypeMode="keyboard" - android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable" android:isAsciiCapable="true" /> @@ -518,7 +518,7 @@ android:imeSubtypeLocale="iw" android:languageTag="he" android:imeSubtypeMode="keyboard" - android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable" + android:imeSubtypeExtraValue="KeyboardLayoutSet=hebrew,SupportTouchPositionCorrection,EmojiCapable" android:isAsciiCapable="false" /> - + - -->