diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
index 377ec092ab98df448a39dfeb0b10efbb2f37b773..27e3e3006b7013c3c7157ed4138f8eb87031c9ed 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
@@ -27,46 +27,18 @@ import com.android.inputmethod.latin.utils.CollectionUtils;
 import java.util.HashMap;
 import java.util.Locale;
 
-/**
- * !!!!! DO NOT EDIT THIS FILE !!!!!
- *
- * This file is generated by tools/make-keyboard-text. The base template file is
- *   tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
- *
- * This file must be updated when any text resources in keyboard layout files have been changed.
- * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions,
- * and should be defined in
- *   tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml
- *
- * To update this file, please run the following commands.
- *   $ cd $ANDROID_BUILD_TOP
- *   $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text
- *   $ make-keyboard-text -java packages/inputmethods/LatinIME/java/src
- *
- * The updated source file will be generated to the following path (this file).
- *   packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/
- *   KeyboardTextsSet.java
- */
 public final class KeyboardTextsSet {
     public static final String PREFIX_TEXT = "!text/";
     private static final char BACKSLASH = Constants.CODE_BACKSLASH;
     private static final int MAX_STRING_REFERENCE_INDIRECTION = 10;
 
-    // Language to texts map.
-    private static final HashMap<String, String[]> sLanguageToTextsMap =
-            CollectionUtils.newHashMap();
-    private static final HashMap<String, Integer> sNameToIdsMap = CollectionUtils.newHashMap();
-
-    private String[] mTexts;
+    private String[] mTextsTable;
     // Resource name to text map.
     private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap();
 
     public void setLocale(final Locale locale) {
         final String language = locale.getLanguage();
-        mTexts = sLanguageToTextsMap.get(language);
-        if (mTexts == null) {
-            mTexts = LANGUAGE_DEFAULT;
-        }
+        mTextsTable = KeyboardTextsTable.getTextsTable(language);
     }
 
     public void loadStringResources(final Context context) {
@@ -86,14 +58,8 @@ public final class KeyboardTextsSet {
     }
 
     public String getText(final String name) {
-        String text = mResourceNameToTextsMap.get(name);
-        if (text != null) {
-            return text;
-        }
-        final Integer id = sNameToIdsMap.get(name);
-        if (id == null) throw new RuntimeException("Unknown label: " + name);
-        text = (id < mTexts.length) ? mTexts[id] : null;
-        return (text == null) ? LANGUAGE_DEFAULT[id] : text;
+        final String text = mResourceNameToTextsMap.get(name);
+        return (text != null) ? text : KeyboardTextsTable.getText(name, mTextsTable);
     }
 
     private static int searchTextNameEnd(final String text, final int start) {
@@ -170,3487 +136,4 @@ public final class KeyboardTextsSet {
         "label_pause_key",
         "label_wait_key",
     };
-
-    private static final String[] NAMES = {
-        /*  0 */ "more_keys_for_a",
-        /*  1 */ "more_keys_for_e",
-        /*  2 */ "more_keys_for_i",
-        /*  3 */ "more_keys_for_o",
-        /*  4 */ "more_keys_for_u",
-        /*  5 */ "more_keys_for_s",
-        /*  6 */ "more_keys_for_n",
-        /*  7 */ "more_keys_for_c",
-        /*  8 */ "more_keys_for_y",
-        /*  9 */ "more_keys_for_d",
-        /* 10 */ "more_keys_for_r",
-        /* 11 */ "more_keys_for_t",
-        /* 12 */ "more_keys_for_z",
-        /* 13 */ "more_keys_for_k",
-        /* 14 */ "more_keys_for_l",
-        /* 15 */ "more_keys_for_g",
-        /* 16 */ "more_keys_for_v",
-        /* 17 */ "more_keys_for_h",
-        /* 18 */ "more_keys_for_j",
-        /* 19 */ "more_keys_for_w",
-        /* 20 */ "keylabel_for_nordic_row1_11",
-        /* 21 */ "keylabel_for_nordic_row2_10",
-        /* 22 */ "keylabel_for_nordic_row2_11",
-        /* 23 */ "more_keys_for_nordic_row2_10",
-        /* 24 */ "more_keys_for_nordic_row2_11",
-        /* 25 */ "keylabel_for_east_slavic_row1_9",
-        /* 26 */ "keylabel_for_east_slavic_row1_12",
-        /* 27 */ "keylabel_for_east_slavic_row2_1",
-        /* 28 */ "keylabel_for_east_slavic_row2_11",
-        /* 29 */ "keylabel_for_east_slavic_row3_5",
-        /* 30 */ "more_keys_for_cyrillic_u",
-        /* 31 */ "more_keys_for_cyrillic_ka",
-        /* 32 */ "more_keys_for_cyrillic_en",
-        /* 33 */ "more_keys_for_cyrillic_ghe",
-        /* 34 */ "more_keys_for_east_slavic_row2_1",
-        /* 35 */ "more_keys_for_cyrillic_a",
-        /* 36 */ "more_keys_for_cyrillic_o",
-        /* 37 */ "more_keys_for_cyrillic_soft_sign",
-        /* 38 */ "more_keys_for_east_slavic_row2_11",
-        /* 39 */ "keylabel_for_south_slavic_row1_6",
-        /* 40 */ "keylabel_for_south_slavic_row2_11",
-        /* 41 */ "keylabel_for_south_slavic_row3_1",
-        /* 42 */ "keylabel_for_south_slavic_row3_8",
-        /* 43 */ "more_keys_for_cyrillic_ie",
-        /* 44 */ "more_keys_for_cyrillic_i",
-        /* 45 */ "keylabel_for_swiss_row1_11",
-        /* 46 */ "keylabel_for_swiss_row2_10",
-        /* 47 */ "keylabel_for_swiss_row2_11",
-        /* 48 */ "more_keys_for_swiss_row1_11",
-        /* 49 */ "more_keys_for_swiss_row2_10",
-        /* 50 */ "more_keys_for_swiss_row2_11",
-        /* 51 */ "label_to_alpha_key",
-        /* 52 */ "single_quotes",
-        /* 53 */ "double_quotes",
-        /* 54 */ "single_angle_quotes",
-        /* 55 */ "double_angle_quotes",
-        /* 56 */ "more_keys_for_currency_dollar",
-        /* 57 */ "keylabel_for_currency",
-        /* 58 */ "more_keys_for_currency",
-        /* 59 */ "more_keys_for_punctuation",
-        /* 60 */ "more_keys_for_tablet_punctuation",
-        /* 61 */ "more_keys_for_star",
-        /* 62 */ "more_keys_for_bullet",
-        /* 63 */ "more_keys_for_plus",
-        /* 64 */ "more_keys_for_left_parenthesis",
-        /* 65 */ "more_keys_for_right_parenthesis",
-        /* 66 */ "more_keys_for_less_than",
-        /* 67 */ "more_keys_for_greater_than",
-        /* 68 */ "more_keys_for_arabic_diacritics",
-        /* 69 */ "keylabel_for_symbols_1",
-        /* 70 */ "keylabel_for_symbols_2",
-        /* 71 */ "keylabel_for_symbols_3",
-        /* 72 */ "keylabel_for_symbols_4",
-        /* 73 */ "keylabel_for_symbols_5",
-        /* 74 */ "keylabel_for_symbols_6",
-        /* 75 */ "keylabel_for_symbols_7",
-        /* 76 */ "keylabel_for_symbols_8",
-        /* 77 */ "keylabel_for_symbols_9",
-        /* 78 */ "keylabel_for_symbols_0",
-        /* 79 */ "label_to_symbol_key",
-        /* 80 */ "label_to_symbol_with_microphone_key",
-        /* 81 */ "additional_more_keys_for_symbols_1",
-        /* 82 */ "additional_more_keys_for_symbols_2",
-        /* 83 */ "additional_more_keys_for_symbols_3",
-        /* 84 */ "additional_more_keys_for_symbols_4",
-        /* 85 */ "additional_more_keys_for_symbols_5",
-        /* 86 */ "additional_more_keys_for_symbols_6",
-        /* 87 */ "additional_more_keys_for_symbols_7",
-        /* 88 */ "additional_more_keys_for_symbols_8",
-        /* 89 */ "additional_more_keys_for_symbols_9",
-        /* 90 */ "additional_more_keys_for_symbols_0",
-        /* 91 */ "more_keys_for_symbols_1",
-        /* 92 */ "more_keys_for_symbols_2",
-        /* 93 */ "more_keys_for_symbols_3",
-        /* 94 */ "more_keys_for_symbols_4",
-        /* 95 */ "more_keys_for_symbols_5",
-        /* 96 */ "more_keys_for_symbols_6",
-        /* 97 */ "more_keys_for_symbols_7",
-        /* 98 */ "more_keys_for_symbols_8",
-        /* 99 */ "more_keys_for_symbols_9",
-        /* 100 */ "more_keys_for_symbols_0",
-        /* 101 */ "keylabel_for_comma",
-        /* 102 */ "more_keys_for_comma",
-        /* 103 */ "keylabel_for_tablet_comma",
-        /* 104 */ "keyhintlabel_for_tablet_comma",
-        /* 105 */ "more_keys_for_tablet_comma",
-        /* 106 */ "keylabel_for_period",
-        /* 107 */ "keyhintlabel_for_period",
-        /* 108 */ "more_keys_for_period",
-        /* 109 */ "keylabel_for_tablet_period",
-        /* 110 */ "keyhintlabel_for_tablet_period",
-        /* 111 */ "more_keys_for_tablet_period",
-        /* 112 */ "keylabel_for_symbols_question",
-        /* 113 */ "keylabel_for_symbols_semicolon",
-        /* 114 */ "keylabel_for_symbols_percent",
-        /* 115 */ "more_keys_for_exclamation",
-        /* 116 */ "more_keys_for_question",
-        /* 117 */ "more_keys_for_symbols_semicolon",
-        /* 118 */ "more_keys_for_symbols_percent",
-        /* 119 */ "more_keys_for_q",
-        /* 120 */ "more_keys_for_x",
-        /* 121 */ "keylabel_for_q",
-        /* 122 */ "keylabel_for_w",
-        /* 123 */ "keylabel_for_y",
-        /* 124 */ "keylabel_for_x",
-        /* 125 */ "keylabel_for_spanish_row2_10",
-        /* 126 */ "more_keys_for_am_pm",
-        /* 127 */ "settings_as_more_key",
-        /* 128 */ "shortcut_as_more_key",
-        /* 129 */ "action_next_as_more_key",
-        /* 130 */ "action_previous_as_more_key",
-        /* 131 */ "label_to_more_symbol_key",
-        /* 132 */ "label_to_more_symbol_for_tablet_key",
-        /* 133 */ "label_tab_key",
-        /* 134 */ "label_to_phone_numeric_key",
-        /* 135 */ "label_to_phone_symbols_key",
-        /* 136 */ "label_time_am",
-        /* 137 */ "label_time_pm",
-        /* 138 */ "keylabel_for_popular_domain",
-        /* 139 */ "more_keys_for_popular_domain",
-        /* 140 */ "single_laqm_raqm",
-        /* 141 */ "single_laqm_raqm_rtl",
-        /* 142 */ "single_raqm_laqm",
-        /* 143 */ "double_laqm_raqm",
-        /* 144 */ "double_laqm_raqm_rtl",
-        /* 145 */ "double_raqm_laqm",
-        /* 146 */ "single_lqm_rqm",
-        /* 147 */ "single_9qm_lqm",
-        /* 148 */ "single_9qm_rqm",
-        /* 149 */ "double_lqm_rqm",
-        /* 150 */ "double_9qm_lqm",
-        /* 151 */ "double_9qm_rqm",
-        /* 152 */ "more_keys_for_single_quote",
-        /* 153 */ "more_keys_for_double_quote",
-        /* 154 */ "more_keys_for_tablet_double_quote",
-        /* 155 */ "emoji_key_as_more_key",
-    };
-
-    private static final String EMPTY = "";
-
-    /* Default texts */
-    private static final String[] LANGUAGE_DEFAULT = {
-        /* 0~ */
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        /* 51 */ "ABC",
-        /* 52 */ "!text/single_lqm_rqm",
-        /* 53 */ "!text/double_lqm_rqm",
-        /* 54 */ "!text/single_laqm_raqm",
-        /* 55 */ "!text/double_laqm_raqm",
-        // U+00A2: "¢" CENT SIGN
-        // U+00A3: "£" POUND SIGN
-        // U+20AC: "€" EURO SIGN
-        // U+00A5: "Â¥" YEN SIGN
-        // U+20B1: "₱" PESO SIGN
-        /* 56 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
-        /* 57 */ "$",
-        /* 58 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
-        /* 59 */ "!fixedColumnOrder!8,;,/,(,),#,!,\\,,?,&,\\%,+,\",-,:,',@",
-        /* 60 */ "!fixedColumnOrder!7,;,/,(,),#,',\\,,&,\\%,+,\",-,:,@",
-        // U+2020: "†" DAGGER
-        // U+2021: "‡" DOUBLE DAGGER
-        // U+2605: "★" BLACK STAR
-        /* 61 */ "\u2020,\u2021,\u2605",
-        // U+266A: "♪" EIGHTH NOTE
-        // U+2665: "♥" BLACK HEART SUIT
-        // U+2660: "â™ " BLACK SPADE SUIT
-        // U+2666: "♦" BLACK DIAMOND SUIT
-        // U+2663: "♣" BLACK CLUB SUIT
-        /* 62 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
-        // U+00B1: "±" PLUS-MINUS SIGN
-        /* 63 */ "\u00B1",
-        // The all letters need to be mirrored are found at
-        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 64 */ "!fixedColumnOrder!3,<,{,[",
-        /* 65 */ "!fixedColumnOrder!3,>,},]",
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        // U+2264: "≤" LESS-THAN OR EQUAL TO
-        // U+2265: "≥" GREATER-THAN EQUAL TO
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        /* 66 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
-        /* 67 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
-        /* 68 */ EMPTY,
-        /* 69 */ "1",
-        /* 70 */ "2",
-        /* 71 */ "3",
-        /* 72 */ "4",
-        /* 73 */ "5",
-        /* 74 */ "6",
-        /* 75 */ "7",
-        /* 76 */ "8",
-        /* 77 */ "9",
-        /* 78 */ "0",
-        // Label for "switch to symbols" key.
-        /* 79 */ "?123",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 80 */ "123",
-        /* 81~ */
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~90 */
-        // U+00B9: "¹" SUPERSCRIPT ONE
-        // U+00BD: "½" VULGAR FRACTION ONE HALF
-        // U+2153: "â…“" VULGAR FRACTION ONE THIRD
-        // U+00BC: "¼" VULGAR FRACTION ONE QUARTER
-        // U+215B: "â…›" VULGAR FRACTION ONE EIGHTH
-        /* 91 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
-        // U+00B2: "²" SUPERSCRIPT TWO
-        // U+2154: "â…”" VULGAR FRACTION TWO THIRDS
-        /* 92 */ "\u00B2,\u2154",
-        // U+00B3: "³" SUPERSCRIPT THREE
-        // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
-        // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
-        /* 93 */ "\u00B3,\u00BE,\u215C",
-        // U+2074: "⁴" SUPERSCRIPT FOUR
-        /* 94 */ "\u2074",
-        // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
-        /* 95 */ "\u215D",
-        /* 96 */ EMPTY,
-        // U+215E: "â…ž" VULGAR FRACTION SEVEN EIGHTHS
-        /* 97 */ "\u215E",
-        /* 98 */ EMPTY,
-        /* 99 */ EMPTY,
-        // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
-        // U+2205: "∅" EMPTY SET
-        /* 100 */ "\u207F,\u2205",
-        // Comma key
-        /* 101 */ ",",
-        /* 102 */ EMPTY,
-        /* 103 */ ",",
-        /* 104 */ EMPTY,
-        /* 105 */ EMPTY,
-        // Period key
-        /* 106 */ ".",
-        /* 107 */ EMPTY,
-        /* 108 */ "!text/more_keys_for_punctuation",
-        /* 109 */ ".",
-        /* 110 */ EMPTY,
-        /* 111 */ "!text/more_keys_for_tablet_punctuation",
-        /* 112 */ "?",
-        /* 113 */ ";",
-        /* 114 */ "%",
-        // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 115 */ "\u00A1",
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 116 */ "\u00BF",
-        /* 117 */ EMPTY,
-        // U+2030: "‰" PER MILLE SIGN
-        /* 118 */ "\u2030",
-        /* 119 */ EMPTY,
-        /* 120 */ EMPTY,
-        /* 121 */ "q",
-        /* 122 */ "w",
-        /* 123 */ "y",
-        /* 124 */ "x",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 125 */ "\u00F1",
-        /* 126 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
-        /* 127 */ "!icon/settings_key|!code/key_settings",
-        /* 128 */ "!icon/shortcut_key|!code/key_shortcut",
-        /* 129 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
-        /* 130 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
-        // Label for "switch to more symbol" modifier key ("= \ <"). Must be short to fit on key!
-        /* 131 */ "= \\\\ <",
-        // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
-        /* 132 */ "~ [ <",
-        // Label for "Tab" key.  Must be short to fit on key!
-        /* 133 */ "Tab",
-        // Label for "switch to phone numeric" key.  Must be short to fit on key!
-        /* 134 */ "123",
-        // Label for "switch to phone symbols" key.  Must be short to fit on key!
-        // U+FF0A: "*" FULLWIDTH ASTERISK
-        // U+FF03: "#" FULLWIDTH NUMBER SIGN
-        /* 135 */ "\uFF0A\uFF03",
-        // Key label for "ante meridiem"
-        /* 136 */ "AM",
-        // Key label for "post meridiem"
-        /* 137 */ "PM",
-        /* 138 */ ".com",
-        // popular web domains for the locale - most popular, displayed on the keyboard
-        /* 139 */ "!hasLabels!,.net,.org,.gov,.edu",
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // The following characters don't need BIDI mirroring.
-        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
-        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
-        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
-        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        // Abbreviations are:
-        // laqm: LEFT-POINTING ANGLE QUOTATION MARK
-        // raqm: RIGHT-POINTING ANGLE QUOTATION MARK
-        // rtl: Right-To-Left script order
-        // lqm: LEFT QUOTATION MARK
-        // rqm: RIGHT QUOTATION MARK
-        // 9qm: LOW-9 QUOTATION MARK
-        // The following each quotation mark pair consist of
-        // <opening quotation mark>, <closing quotation mark>
-        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
-        /* 140 */ "\u2039,\u203A",
-        /* 141 */ "\u2039|\u203A,\u203A|\u2039",
-        /* 142 */ "\u203A,\u2039",
-        /* 143 */ "\u00AB,\u00BB",
-        /* 144 */ "\u00AB|\u00BB,\u00BB|\u00AB",
-        /* 145 */ "\u00BB,\u00AB",
-        // The following each quotation mark triplet consists of
-        // <another quotation mark>, <opening quotation mark>, <closing quotation mark>
-        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
-        /* 146 */ "\u201A,\u2018,\u2019",
-        /* 147 */ "\u2019,\u201A,\u2018",
-        /* 148 */ "\u2018,\u201A,\u2019",
-        /* 149 */ "\u201E,\u201C,\u201D",
-        /* 150 */ "\u201D,\u201E,\u201C",
-        /* 151 */ "\u201C,\u201E,\u201D",
-        /* 152 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
-        /* 153 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
-        /* 154 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
-        /* 155 */ "!icon/emoji_key|!code/key_emoji",
-    };
-
-    /* Language af: Afrikaans */
-    private static final String[] LANGUAGE_af = {
-        // This is the same as Dutch except more keys of y and demoting vowels with diaeresis.
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E2,\u00E4,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F4,\u00F6,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7 */ null,
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 8 */ "\u00FD,\u0133",
-    };
-
-    /* Language ar: Arabic */
-    private static final String[] LANGUAGE_ar = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0623: "ا" ARABIC LETTER ALEF
-        // U+200C: ZERO WIDTH NON-JOINER
-        // U+0628: "ب" ARABIC LETTER BEH
-        // U+062C: "Ù¾" ARABIC LETTER PEH
-        /* 51 */ "\u0623\u200C\u0628\u200C\u062C",
-        /* 52 */ null,
-        /* 53 */ null,
-        /* 54 */ "!text/single_laqm_raqm_rtl",
-        /* 55 */ "!text/double_laqm_raqm_rtl",
-        /* 56~ */
-        null, null, null,
-        /* ~58 */
-        /* 59 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
-        /* 60 */ null,
-        // U+2605: "★" BLACK STAR
-        // U+066D: "Ù­" ARABIC FIVE POINTED STAR
-        /* 61 */ "\u2605,\u066D",
-        // U+266A: "♪" EIGHTH NOTE
-        /* 62 */ "\u266A",
-        /* 63 */ null,
-        // The all letters need to be mirrored are found at
-        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        // U+FD3E: "ï´¾" ORNATE LEFT PARENTHESIS
-        // U+FD3F: "ï´¿" ORNATE RIGHT PARENTHESIS
-        /* 64 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 65 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
-        // U+2264: "≤" LESS-THAN OR EQUAL TO
-        // U+2265: "≥" GREATER-THAN EQUAL TO
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
-        // U+0655: "Ù•" ARABIC HAMZA BELOW
-        // U+0654: "Ù”" ARABIC HAMZA ABOVE
-        // U+0652: "Ù’" ARABIC SUKUN
-        // U+064D: "ٍ" ARABIC KASRATAN
-        // U+064C: "ٌ" ARABIC DAMMATAN
-        // U+064B: "Ù‹" ARABIC FATHATAN
-        // U+0651: "Ù‘" ARABIC SHADDA
-        // U+0656: "Ù–" ARABIC SUBSCRIPT ALEF
-        // U+0670: "Ù°" ARABIC LETTER SUPERSCRIPT ALEF
-        // U+0653: "Ù“" ARABIC MADDAH ABOVE
-        // U+0650: "ِ" ARABIC KASRA
-        // U+064F: "ُ" ARABIC DAMMA
-        // U+064E: "ÙŽ" ARABIC FATHA
-        // U+0640: "Ù€" ARABIC TATWEEL
-        // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
-        // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
-        /* 68 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        // U+0661: "Ù¡" ARABIC-INDIC DIGIT ONE
-        /* 69 */ "\u0661",
-        // U+0662: "Ù¢" ARABIC-INDIC DIGIT TWO
-        /* 70 */ "\u0662",
-        // U+0663: "Ù£" ARABIC-INDIC DIGIT THREE
-        /* 71 */ "\u0663",
-        // U+0664: "Ù¤" ARABIC-INDIC DIGIT FOUR
-        /* 72 */ "\u0664",
-        // U+0665: "Ù¥" ARABIC-INDIC DIGIT FIVE
-        /* 73 */ "\u0665",
-        // U+0666: "Ù¦" ARABIC-INDIC DIGIT SIX
-        /* 74 */ "\u0666",
-        // U+0667: "Ù§" ARABIC-INDIC DIGIT SEVEN
-        /* 75 */ "\u0667",
-        // U+0668: "Ù¨" ARABIC-INDIC DIGIT EIGHT
-        /* 76 */ "\u0668",
-        // U+0669: "Ù©" ARABIC-INDIC DIGIT NINE
-        /* 77 */ "\u0669",
-        // U+0660: "Ù " ARABIC-INDIC DIGIT ZERO
-        /* 78 */ "\u0660",
-        // Label for "switch to symbols" key.
-        // U+061F: "ØŸ" ARABIC QUESTION MARK
-        /* 79 */ "\u0663\u0662\u0661\u061F",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 80 */ "\u0663\u0662\u0661",
-        /* 81 */ "1",
-        /* 82 */ "2",
-        /* 83 */ "3",
-        /* 84 */ "4",
-        /* 85 */ "5",
-        /* 86 */ "6",
-        /* 87 */ "7",
-        /* 88 */ "8",
-        /* 89 */ "9",
-        // U+066B: "Ù«" ARABIC DECIMAL SEPARATOR
-        // U+066C: "Ù¬" ARABIC THOUSANDS SEPARATOR
-        /* 90 */ "0,\u066B,\u066C",
-        /* 91~ */
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~100 */
-        // U+060C: "،" ARABIC COMMA
-        /* 101 */ "\u060C",
-        /* 102 */ "\\,",
-        // U+061F: "ØŸ" ARABIC QUESTION MARK
-        // U+060C: "،" ARABIC COMMA
-        // U+061B: "Ø›" ARABIC SEMICOLON
-        /* 103 */ "\u060C",
-        /* 104 */ "\u061F",
-        /* 105 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\",\'",
-        /* 106 */ null,
-        // U+0651: "Ù‘" ARABIC SHADDA
-        /* 107 */ "\u0651",
-        /* 108 */ "!text/more_keys_for_arabic_diacritics",
-        /* 109 */ null,
-        /* 110 */ "\u0651",
-        /* 111 */ "!text/more_keys_for_arabic_diacritics",
-        /* 112 */ "\u061F",
-        /* 113 */ "\u061B",
-        // U+066A: "Ùª" ARABIC PERCENT SIGN
-        /* 114 */ "\u066A",
-        /* 115 */ null,
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 116 */ "?,\u00BF",
-        /* 117 */ ";",
-        // U+2030: "‰" PER MILLE SIGN
-        /* 118 */ "\\%,\u2030",
-    };
-
-    /* Language az_AZ: Azerbaijani (Azerbaijan) */
-    private static final String[] LANGUAGE_az_AZ = {
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        /* 0 */ "\u00E2",
-        // U+0259: "É™" LATIN SMALL LETTER SCHWA
-        /* 1 */ "\u0259",
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
-        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
-        /* 6 */ null,
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
-        null, null, null, null, null, null, null,
-        /* ~14 */
-        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u011F",
-    };
-
-    /* Language be_BY: Belarusian (Belarus) */
-    private static final String[] LANGUAGE_be_BY = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~24 */
-        // U+045E: "Ñž" CYRILLIC SMALL LETTER SHORT U
-        /* 25 */ "\u045E",
-        // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
-        /* 26 */ "\u0451",
-        // U+044B: "Ñ‹" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0456: "Ñ–" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-        /* 29 */ "\u0456",
-        /* 30~ */
-        null, null, null, null, null, null, null,
-        /* ~36 */
-        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
-        null, null, null, null, null,
-        /* ~42 */
-        // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language bg: Bulgarian */
-    private static final String[] LANGUAGE_bg = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ null,
-        // single_quotes of Bulgarian is default single_quotes_right_left.
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language ca: Catalan */
-    private static final String[] LANGUAGE_ca = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E1,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EB,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
-        null, null, null, null, null, null,
-        /* ~13 */
-        // U+00B7: "·" MIDDLE DOT
-        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "l\u00B7l,\u0142",
-        /* 15~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~58 */
-        // U+00B7: "·" MIDDLE DOT
-        /* 59 */ "!fixedColumnOrder!9,;,/,(,),#,\u00B7,!,\\,,?,&,\\%,+,\",-,:,',@",
-        /* 60 */ "!fixedColumnOrder!8,;,/,(,),#,\u00B7,',\\,,&,\\%,+,\",-,:,@",
-        /* 61~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null,
-        /* ~124 */
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 125 */ "\u00E7",
-    };
-
-    /* Language cs: Czech */
-    private static final String[] LANGUAGE_cs = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B",
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        /* 5 */ "\u0161,\u00DF,\u015B",
-        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0148,\u00F1,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
-        /* 10 */ "\u0159",
-        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0165",
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017E,\u017A,\u017C",
-        /* 13~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language da: Danish */
-    private static final String[] LANGUAGE_da = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        /* 1 */ "\u00E9,\u00EB",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        /* 2 */ "\u00ED,\u00EF",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u00DF,\u015B,\u0161",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7 */ null,
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 9 */ "\u00F0",
-        /* 10~ */
-        null, null, null, null,
-        /* ~13 */
-        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u0142",
-        /* 15~ */
-        null, null, null, null, null,
-        /* ~19 */
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 21 */ "\u00E6",
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 22 */ "\u00F8",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 23 */ "\u00E4",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 24 */ "\u00F6",
-        /* 25~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language de: German */
-    private static final String[] LANGUAGE_de = {
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E4,\u00E2,\u00E0,\u00E1,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117",
-        /* 2 */ null,
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F6,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u00DF,\u015B,\u0161",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null,
-        /* ~44 */
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 45 */ "\u00FC",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 46 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 47 */ "\u00E4",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        /* 48 */ "\u00E8",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        /* 49 */ "\u00E9",
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        /* 50 */ "\u00E0",
-        /* 51 */ null,
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language el: Greek */
-    private static final String[] LANGUAGE_el = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0391: "Α" GREEK CAPITAL LETTER ALPHA
-        // U+0392: "Î’" GREEK CAPITAL LETTER BETA
-        // U+0393: "Γ" GREEK CAPITAL LETTER GAMMA
-        /* 51 */ "\u0391\u0392\u0393",
-    };
-
-    /* Language en: English */
-    private static final String[] LANGUAGE_en = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u00F1",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u00E7",
-    };
-
-    /* Language eo: Esperanto */
-    private static final String[] LANGUAGE_eo = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
-        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0129: "Ä©" LATIN SMALL LETTER I WITH TILDE
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D,\u0151,\u00BA",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        // U+0169: "Å©" LATIN SMALL LETTER U WITH TILDE
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        // U+00B5: "µ" MICRO SIGN
-        /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B,\u0169,\u0171,\u0173,\u00B5",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+0219: "È™" LATIN SMALL LETTER S WITH COMMA BELOW
-        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u00DF,\u0161,\u015B,\u0219,\u015F",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
-        // U+014B: "Å‹" LATIN SMALL LETTER ENG
-        /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+010B: "Ä‹" LATIN SMALL LETTER C WITH DOT ABOVE
-        /* 7 */ "\u0107,\u010D,\u00E7,\u010B",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+0177: "Å·" LATIN SMALL LETTER Y WITH CIRCUMFLEX
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 8 */ "y,\u00FD,\u0177,\u00FF,\u00FE",
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        // U+0111: "Ä‘" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u00F0,\u010F,\u0111",
-        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
-        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
-        /* 10 */ "\u0159,\u0155,\u0157",
-        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
-        // U+021B: "È›" LATIN SMALL LETTER T WITH COMMA BELOW
-        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
-        /* 11 */ "\u0165,\u021B,\u0163,\u0167",
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017A,\u017C,\u017E",
-        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
-        // U+0138: "ĸ" LATIN SMALL LETTER KRA
-        /* 13 */ "\u0137,\u0138",
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        // U+0140: "Å€" LATIN SMALL LETTER L WITH MIDDLE DOT
-        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
-        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
-        // U+0121: "Ä¡" LATIN SMALL LETTER G WITH DOT ABOVE
-        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
-        /* 15 */ "\u011F,\u0121,\u0123",
-        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
-        /* 16 */ "w,\u0175",
-        // U+0125: "Ä¥" LATIN SMALL LETTER H WITH CIRCUMFLEX
-        // U+0127: "ħ" LATIN SMALL LETTER H WITH STROKE
-        /* 17 */ "\u0125,\u0127",
-        /* 18 */ null,
-        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
-        /* 19 */ "w,\u0175",
-        /* 20~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
-        /* ~118 */
-        /* 119 */ "q",
-        /* 120 */ "x",
-        // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
-        /* 121 */ "\u015D",
-        // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
-        /* 122 */ "\u011D",
-        // U+016D: "Å­" LATIN SMALL LETTER U WITH BREVE
-        /* 123 */ "\u016D",
-        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
-        /* 124 */ "\u0109",
-        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
-        /* 125 */ "\u0135",
-    };
-
-    /* Language es: Spanish */
-    private static final String[] LANGUAGE_es = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~58 */
-        // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 59 */ "!fixedColumnOrder!9,\u00A1,;,/,(,),#,!,\\,,?,\u00BF,&,\\%,+,\",-,:,',@",
-    };
-
-    /* Language et_EE: Estonian (Estonia) */
-    private static final String[] LANGUAGE_et_EE = {
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
-        /* 0 */ "\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u0113,\u00E8,\u0117,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
-        /* 10 */ "\u0157,\u0159,\u0155",
-        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0163,\u0165",
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
-        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
-        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        null, null, null, null,
-        /* ~19 */
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 20 */ "\u00FC",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 21 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 22 */ "\u00E4",
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 23 */ "\u00F5",
-        /* 24~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language fa: Persian */
-    private static final String[] LANGUAGE_fa = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0627: "ا" ARABIC LETTER ALEF
-        // U+200C: ZERO WIDTH NON-JOINER
-        // U+0628: "ب" ARABIC LETTER BEH
-        // U+067E: "Ù¾" ARABIC LETTER PEH
-        /* 51 */ "\u0627\u200C\u0628\u200C\u067E",
-        /* 52 */ null,
-        /* 53 */ null,
-        /* 54 */ "!text/single_laqm_raqm_rtl",
-        /* 55 */ "!text/double_laqm_raqm_rtl",
-        /* 56 */ null,
-        // U+FDFC: "ï·¼" RIAL SIGN
-        /* 57 */ "\uFDFC",
-        /* 58 */ null,
-        // U+061F: "ØŸ" ARABIC QUESTION MARK
-        // U+060C: "،" ARABIC COMMA
-        // U+061B: "Ø›" ARABIC SEMICOLON
-        /* 59 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
-        /* 60 */ null,
-        // U+2605: "★" BLACK STAR
-        // U+066D: "Ù­" ARABIC FIVE POINTED STAR
-        /* 61 */ "\u2605,\u066D",
-        // U+266A: "♪" EIGHTH NOTE
-        /* 62 */ "\u266A",
-        /* 63 */ null,
-        // The all letters need to be mirrored are found at
-        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        // U+FD3E: "ï´¾" ORNATE LEFT PARENTHESIS
-        // U+FD3F: "ï´¿" ORNATE RIGHT PARENTHESIS
-        /* 64 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 65 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
-        // U+2264: "≤" LESS-THAN OR EQUAL TO
-        // U+2265: "≥" GREATER-THAN EQUAL TO
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
-        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
-        // U+0655: "Ù•" ARABIC HAMZA BELOW
-        // U+0652: "Ù’" ARABIC SUKUN
-        // U+0651: "Ù‘" ARABIC SHADDA
-        // U+064C: "ٌ" ARABIC DAMMATAN
-        // U+064D: "ٍ" ARABIC KASRATAN
-        // U+064B: "Ù‹" ARABIC FATHATAN
-        // U+0654: "Ù”" ARABIC HAMZA ABOVE
-        // U+0656: "Ù–" ARABIC SUBSCRIPT ALEF
-        // U+0670: "Ù°" ARABIC LETTER SUPERSCRIPT ALEF
-        // U+0653: "Ù“" ARABIC MADDAH ABOVE
-        // U+064F: "ُ" ARABIC DAMMA
-        // U+0650: "ِ" ARABIC KASRA
-        // U+064E: "ÙŽ" ARABIC FATHA
-        // U+0640: "Ù€" ARABIC TATWEEL
-        // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
-        // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
-        /* 68 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        // U+06F1: "Û±" EXTENDED ARABIC-INDIC DIGIT ONE
-        /* 69 */ "\u06F1",
-        // U+06F2: "Û²" EXTENDED ARABIC-INDIC DIGIT TWO
-        /* 70 */ "\u06F2",
-        // U+06F3: "Û³" EXTENDED ARABIC-INDIC DIGIT THREE
-        /* 71 */ "\u06F3",
-        // U+06F4: "Û´" EXTENDED ARABIC-INDIC DIGIT FOUR
-        /* 72 */ "\u06F4",
-        // U+06F5: "Ûµ" EXTENDED ARABIC-INDIC DIGIT FIVE
-        /* 73 */ "\u06F5",
-        // U+06F6: "Û¶" EXTENDED ARABIC-INDIC DIGIT SIX
-        /* 74 */ "\u06F6",
-        // U+06F7: "Û·" EXTENDED ARABIC-INDIC DIGIT SEVEN
-        /* 75 */ "\u06F7",
-        // U+06F8: "Û¸" EXTENDED ARABIC-INDIC DIGIT EIGHT
-        /* 76 */ "\u06F8",
-        // U+06F9: "Û¹" EXTENDED ARABIC-INDIC DIGIT NINE
-        /* 77 */ "\u06F9",
-        // U+06F0: "Û°" EXTENDED ARABIC-INDIC DIGIT ZERO
-        /* 78 */ "\u06F0",
-        // Label for "switch to symbols" key.
-        // U+061F: "ØŸ" ARABIC QUESTION MARK
-        /* 79 */ "\u06F3\u06F2\u06F1\u061F",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 80 */ "\u06F3\u06F2\u06F1",
-        /* 81 */ "1",
-        /* 82 */ "2",
-        /* 83 */ "3",
-        /* 84 */ "4",
-        /* 85 */ "5",
-        /* 86 */ "6",
-        /* 87 */ "7",
-        /* 88 */ "8",
-        /* 89 */ "9",
-        // U+066B: "Ù«" ARABIC DECIMAL SEPARATOR
-        // U+066C: "Ù¬" ARABIC THOUSANDS SEPARATOR
-        /* 90 */ "0,\u066B,\u066C",
-        /* 91~ */
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~100 */
-        // U+060C: "،" ARABIC COMMA
-        /* 101 */ "\u060C",
-        /* 102 */ "\\,",
-        // U+060C: "،" ARABIC COMMA
-        // U+061B: "Ø›" ARABIC SEMICOLON
-        // U+061F: "ØŸ" ARABIC QUESTION MARK
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        /* 103 */ "\u060C",
-        /* 104 */ "\u061F",
-        /* 105 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
-        /* 106 */ null,
-        // U+064B: "Ù‹" ARABIC FATHATAN
-        /* 107 */ "\u064B",
-        /* 108 */ "!text/more_keys_for_arabic_diacritics",
-        /* 109 */ null,
-        /* 110 */ "\u064B",
-        /* 111 */ "!text/more_keys_for_arabic_diacritics",
-        /* 112 */ "\u061F",
-        /* 113 */ "\u061B",
-        // U+066A: "Ùª" ARABIC PERCENT SIGN
-        /* 114 */ "\u066A",
-        /* 115 */ null,
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 116 */ "?,\u00BF",
-        /* 117 */ ";",
-        // U+2030: "‰" PER MILLE SIGN
-        /* 118 */ "\\%,\u2030",
-    };
-
-    /* Language fi: Finnish */
-    private static final String[] LANGUAGE_fi = {
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
-        /* 1 */ null,
-        /* 2 */ null,
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 4 */ "\u00FC",
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        /* 5 */ "\u0161,\u00DF,\u015B",
-        /* 6~ */
-        null, null, null, null, null, null,
-        /* ~11 */
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017E,\u017A,\u017C",
-        /* 13~ */
-        null, null, null, null, null, null, null,
-        /* ~19 */
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 21 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 22 */ "\u00E4",
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 23 */ "\u00F8",
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 24 */ "\u00E6",
-    };
-
-    /* Language fr: French */
-    private static final String[] LANGUAGE_fr = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E2,%,\u00E6,\u00E1,\u00E4,\u00E3,\u00E5,\u0101,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,%,\u0119,\u0117,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F4,\u0153,%,\u00F6,\u00F2,\u00F3,\u00F5,\u00F8,\u014D,\u00BA",
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B",
-        /* 5 */ null,
-        /* 6 */ null,
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "%,\u00FF",
-        /* 9~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~44 */
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        /* 45 */ "\u00E8",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        /* 46 */ "\u00E9",
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        /* 47 */ "\u00E0",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 48 */ "\u00FC",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 49 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 50 */ "\u00E4",
-    };
-
-    /* Language hi: Hindi */
-    private static final String[] LANGUAGE_hi = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0915: "क" DEVANAGARI LETTER KA
-        // U+0916: "ख" DEVANAGARI LETTER KHA
-        // U+0917: "ग" DEVANAGARI LETTER GA
-        /* 51 */ "\u0915\u0916\u0917",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
-        // U+20B9: "₹" INDIAN RUPEE SIGN
-        /* 57 */ "\u20B9",
-        /* 58~ */
-        null, null, null, null, null, null, null, null, null, null, null,
-        /* ~68 */
-        // U+0967: "१" DEVANAGARI DIGIT ONE
-        /* 69 */ "\u0967",
-        // U+0968: "२" DEVANAGARI DIGIT TWO
-        /* 70 */ "\u0968",
-        // U+0969: "३" DEVANAGARI DIGIT THREE
-        /* 71 */ "\u0969",
-        // U+096A: "४" DEVANAGARI DIGIT FOUR
-        /* 72 */ "\u096A",
-        // U+096B: "५" DEVANAGARI DIGIT FIVE
-        /* 73 */ "\u096B",
-        // U+096C: "६" DEVANAGARI DIGIT SIX
-        /* 74 */ "\u096C",
-        // U+096D: "७" DEVANAGARI DIGIT SEVEN
-        /* 75 */ "\u096D",
-        // U+096E: "८" DEVANAGARI DIGIT EIGHT
-        /* 76 */ "\u096E",
-        // U+096F: "९" DEVANAGARI DIGIT NINE
-        /* 77 */ "\u096F",
-        // U+0966: "०" DEVANAGARI DIGIT ZERO
-        /* 78 */ "\u0966",
-        // Label for "switch to symbols" key.
-        /* 79 */ "?\u0967\u0968\u0969",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 80 */ "\u0967\u0968\u0969",
-        /* 81 */ "1",
-        /* 82 */ "2",
-        /* 83 */ "3",
-        /* 84 */ "4",
-        /* 85 */ "5",
-        /* 86 */ "6",
-        /* 87 */ "7",
-        /* 88 */ "8",
-        /* 89 */ "9",
-        /* 90 */ "0",
-    };
-
-    /* Language hr: Croatian */
-    private static final String[] LANGUAGE_hr = {
-        /* 0~ */
-        null, null, null, null, null,
-        /* ~4 */
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u0161,\u015B,\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u010D,\u0107,\u00E7",
-        /* 8 */ null,
-        // U+0111: "Ä‘" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u0111",
-        /* 10 */ null,
-        /* 11 */ null,
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017E,\u017A,\u017C",
-        /* 13~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language hu: Hungarian */
-    private static final String[] LANGUAGE_hu = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u0151,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B",
-        /* 5~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language hy_AM: Armenian (Armenia) */
-    private static final String[] LANGUAGE_hy_AM = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~58 */
-        // U+058A: "ÖŠ" ARMENIAN HYPHEN
-        // U+055C: "՜" ARMENIAN EXCLAMATION MARK
-        // U+055D: "՝" ARMENIAN COMMA
-        // U+055E: "Õž" ARMENIAN QUESTION MARK
-        // U+0559: "Õ™" ARMENIAN MODIFIER LETTER LEFT HALF RING
-        // U+055A: "Õš" ARMENIAN APOSTROPHE
-        // U+055B: "Õ›" ARMENIAN EMPHASIS MARK
-        // U+055F: "ÕŸ" ARMENIAN ABBREVIATION MARK
-        /* 59 */ "!fixedColumnOrder!8,!,?,\u0559,\u055A,.,\u055C,\\,,\u055E,:,;,\u055F,\u00AB,\u00BB,\u058A,\u055D,\u055B",
-        /* 60~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~102 */
-        // U+058F: "֏" ARMENIAN DRAM SIGN
-        // TODO: Enable this when we have glyph for the following letter
-        // <string name="keylabel_for_currency">&#x058F;</string>
-        // 
-        // U+055D: "՝" ARMENIAN COMMA
-        /* 103 */ "\u055D",
-        /* 104 */ null,
-        /* 105 */ null,
-        // U+0589: "Ö‰" ARMENIAN FULL STOP
-        /* 106 */ "\u0589",
-        /* 107 */ null,
-        /* 108 */ null,
-        /* 109 */ "\u0589",
-        /* 110 */ null,
-        /* 111 */ "!text/more_keys_for_punctuation",
-        /* 112~ */
-        null, null, null,
-        /* ~114 */
-        // U+055C: "՜" ARMENIAN EXCLAMATION MARK
-        // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 115 */ "\u055C,\u00A1",
-        // U+055E: "Õž" ARMENIAN QUESTION MARK
-        // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 116 */ "\u055E,\u00BF",
-    };
-
-    /* Language is: Icelandic */
-    private static final String[] LANGUAGE_is = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E4,\u00E6,\u00E5,\u00E0,\u00E2,\u00E3,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00EB,\u00E8,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
-        /* 5~ */
-        null, null, null,
-        /* ~7 */
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 9 */ "\u00F0",
-        /* 10 */ null,
-        // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 11 */ "\u00FE",
-        /* 12~ */
-        null, null, null, null, null, null, null, null,
-        /* ~19 */
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 20 */ "\u00F0",
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 21 */ "\u00E6",
-        // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 22 */ "\u00FE",
-        /* 23~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language it: Italian */
-    private static final String[] LANGUAGE_it = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u00AA",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B",
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F6,\u00F5,\u0153,\u00F8,\u014D,\u00BA",
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B",
-    };
-
-    /* Language iw: Hebrew */
-    private static final String[] LANGUAGE_iw = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+05D0: "א" HEBREW LETTER ALEF
-        // U+05D1: "ב" HEBREW LETTER BET
-        // U+05D2: "×’" HEBREW LETTER GIMEL
-        /* 51 */ "\u05D0\u05D1\u05D2",
-        // The following characters don't need BIDI mirroring.
-        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
-        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
-        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
-        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
-        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
-        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        /* 52 */ "\u2018,\u2019,\u201A",
-        /* 53 */ "\u201C,\u201D,\u201E",
-        /* 54 */ "!text/single_laqm_raqm_rtl",
-        /* 55 */ "!text/double_laqm_raqm_rtl",
-        /* 56 */ null,
-        // U+20AA: "₪" NEW SHEQEL SIGN
-        /* 57 */ "\u20AA",
-        /* 58 */ null,
-        /* 59 */ "!fixedColumnOrder!8,;,/,(|),)|(,#,!,\\,,?,&,\\%,+,\",-,:,',@",
-        /* 60 */ "!fixedColumnOrder!7,;,/,(|),)|(,#,',\\,,&,\\%,+,\",-,:,@",
-        // U+2605: "★" BLACK STAR
-        /* 61 */ "\u2605",
-        /* 62 */ null,
-        // U+00B1: "±" PLUS-MINUS SIGN
-        // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
-        /* 63 */ "\u00B1,\uFB29",
-        // The all letters need to be mirrored are found at
-        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 64 */ "!fixedColumnOrder!3,<|>,{|},[|]",
-        /* 65 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
-        // U+2264: "≤" LESS-THAN OR EQUAL TO
-        // U+2265: "≥" GREATER-THAN EQUAL TO
-        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
-    };
-
-    /* Language ka_GE: Georgian (Georgia) */
-    private static final String[] LANGUAGE_ka_GE = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+10D0: "ა" GEORGIAN LETTER AN
-        // U+10D1: "ბ" GEORGIAN LETTER BAN
-        // U+10D2: "გ" GEORGIAN LETTER GAN
-        /* 51 */ "\u10D0\u10D1\u10D2",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language kk: Kazakh */
-    private static final String[] LANGUAGE_kk = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 26 */ "\u044A",
-        // U+044B: "Ñ‹" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        // U+04AF: "Ò¯" CYRILLIC SMALL LETTER STRAIGHT U
-        // U+04B1: "Ò±" CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
-        /* 30 */ "\u04AF,\u04B1",
-        // U+049B: "Ò›" CYRILLIC SMALL LETTER KA WITH DESCENDER
-        /* 31 */ "\u049B",
-        // U+04A3: "Ò£" CYRILLIC SMALL LETTER EN WITH DESCENDER
-        /* 32 */ "\u04A3",
-        // U+0493: "Ò“" CYRILLIC SMALL LETTER GHE WITH STROKE
-        /* 33 */ "\u0493",
-        // U+0456: "Ñ–" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-        /* 34 */ "\u0456",
-        // U+04D9: "Ó™" CYRILLIC SMALL LETTER SCHWA
-        /* 35 */ "\u04D9",
-        // U+04E9: "Ó©" CYRILLIC SMALL LETTER BARRED O
-        /* 36 */ "\u04E9",
-        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        // U+04BB: "Ò»" CYRILLIC SMALL LETTER SHHA
-        /* 38 */ "\u04BB",
-        /* 39~ */
-        null, null, null, null,
-        /* ~42 */
-        // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-    };
-
-    /* Language km_KH: Khmer (Cambodia) */
-    private static final String[] LANGUAGE_km_KH = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+1780: "ក" KHMER LETTER KA
-        // U+1781: "ខ" KHMER LETTER KHA
-        // U+1782: "áž‚" KHMER LETTER KO
-        /* 51 */ "\u1780\u1781\u1782",
-        /* 52~ */
-        null, null, null, null,
-        /* ~55 */
-        // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
-        /* 56 */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
-    };
-
-    /* Language ky: Kirghiz */
-    private static final String[] LANGUAGE_ky = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 26 */ "\u044A",
-        // U+044B: "Ñ‹" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        // U+04AF: "Ò¯" CYRILLIC SMALL LETTER STRAIGHT U
-        /* 30 */ "\u04AF",
-        /* 31 */ null,
-        // U+04A3: "Ò£" CYRILLIC SMALL LETTER EN WITH DESCENDER
-        /* 32 */ "\u04A3",
-        /* 33~ */
-        null, null, null,
-        /* ~35 */
-        // U+04E9: "Ó©" CYRILLIC SMALL LETTER BARRED O
-        /* 36 */ "\u04E9",
-        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
-        null, null, null, null, null,
-        /* ~42 */
-        // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-    };
-
-    /* Language lo_LA: Lao (Laos) */
-    private static final String[] LANGUAGE_lo_LA = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0E81: "ກ" LAO LETTER KO
-        // U+0E82: "ຂ" LAO LETTER KHO SUNG
-        // U+0E84: "ຄ" LAO LETTER KHO TAM
-        /* 51 */ "\u0E81\u0E82\u0E84",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
-        // U+20AD: "â‚­" KIP SIGN
-        /* 57 */ "\u20AD",
-    };
-
-    /* Language lt: Lithuanian */
-    private static final String[] LANGUAGE_lt = {
-        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 0 */ "\u0105,\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6",
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u0117,\u0119,\u0113,\u00E8,\u00E9,\u00EA,\u00EB,\u011B",
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
-        /* 10 */ "\u0157,\u0159,\u0155",
-        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0163,\u0165",
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
-        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
-        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language lv: Latvian */
-    private static final String[] LANGUAGE_lv = {
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
-        /* 0 */ "\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0105",
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u0113,\u0117,\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u0153,\u0151,\u00F8",
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171",
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
-        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
-        /* 10 */ "\u0157,\u0159,\u0155",
-        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
-        /* 11 */ "\u0163,\u0165",
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
-        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
-        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language mk: Macedonian */
-    private static final String[] LANGUAGE_mk = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
-        /* ~38 */
-        // U+0455: "Ñ•" CYRILLIC SMALL LETTER DZE
-        /* 39 */ "\u0455",
-        // U+045C: "ќ" CYRILLIC SMALL LETTER KJE
-        /* 40 */ "\u045C",
-        // U+0437: "з" CYRILLIC SMALL LETTER ZE
-        /* 41 */ "\u0437",
-        // U+0453: "Ñ“" CYRILLIC SMALL LETTER GJE
-        /* 42 */ "\u0453",
-        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
-        /* 43 */ "\u0450",
-        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
-        /* 44 */ "\u045D",
-        /* 45~ */
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language mn_MN: Mongolian (Mongolia) */
-    private static final String[] LANGUAGE_mn_MN = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
-        // U+20AE: "â‚®" TUGRIK SIGN
-        /* 57 */ "\u20AE",
-    };
-
-    /* Language nb: Norwegian Bokmål */
-    private static final String[] LANGUAGE_nb = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
-        /* 2 */ null,
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
-        /* 5~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~19 */
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 21 */ "\u00F8",
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 22 */ "\u00E6",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 23 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 24 */ "\u00E4",
-        /* 25~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-    };
-
-    /* Language ne_NP: Nepali (Nepal) */
-    private static final String[] LANGUAGE_ne_NP = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0915: "क" DEVANAGARI LETTER KA
-        // U+0916: "ख" DEVANAGARI LETTER KHA
-        // U+0917: "ग" DEVANAGARI LETTER GA
-        /* 51 */ "\u0915\u0916\u0917",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
-        // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
-        /* 57 */ "\u0930\u0941.",
-        /* 58~ */
-        null, null, null, null, null, null, null, null, null, null, null,
-        /* ~68 */
-        // U+0967: "१" DEVANAGARI DIGIT ONE
-        /* 69 */ "\u0967",
-        // U+0968: "२" DEVANAGARI DIGIT TWO
-        /* 70 */ "\u0968",
-        // U+0969: "३" DEVANAGARI DIGIT THREE
-        /* 71 */ "\u0969",
-        // U+096A: "४" DEVANAGARI DIGIT FOUR
-        /* 72 */ "\u096A",
-        // U+096B: "५" DEVANAGARI DIGIT FIVE
-        /* 73 */ "\u096B",
-        // U+096C: "६" DEVANAGARI DIGIT SIX
-        /* 74 */ "\u096C",
-        // U+096D: "७" DEVANAGARI DIGIT SEVEN
-        /* 75 */ "\u096D",
-        // U+096E: "८" DEVANAGARI DIGIT EIGHT
-        /* 76 */ "\u096E",
-        // U+096F: "९" DEVANAGARI DIGIT NINE
-        /* 77 */ "\u096F",
-        // U+0966: "०" DEVANAGARI DIGIT ZERO
-        /* 78 */ "\u0966",
-        // Label for "switch to symbols" key.
-        /* 79 */ "?\u0967\u0968\u0969",
-        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
-        // part because it'll be appended by the code.
-        /* 80 */ "\u0967\u0968\u0969",
-        /* 81 */ "1",
-        /* 82 */ "2",
-        /* 83 */ "3",
-        /* 84 */ "4",
-        /* 85 */ "5",
-        /* 86 */ "6",
-        /* 87 */ "7",
-        /* 88 */ "8",
-        /* 89 */ "9",
-        /* 90 */ "0",
-    };
-
-    /* Language nl: Dutch */
-    private static final String[] LANGUAGE_nl = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E1,\u00E4,\u00E2,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00EB,\u00EA,\u00E8,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        /* 7 */ null,
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 8 */ "\u0133",
-        /* 9~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-    };
-
-    /* Language pl: Polish */
-    private static final String[] LANGUAGE_pl = {
-        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u0105,\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113",
-        /* 2 */ null,
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
-        /* 4 */ null,
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u015B,\u00DF,\u0161",
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u0144,\u00F1",
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u0107,\u00E7,\u010D",
-        /* 8~ */
-        null, null, null, null,
-        /* ~11 */
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017C,\u017A,\u017E",
-        /* 13 */ null,
-        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u0142",
-        /* 15~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-    };
-
-    /* Language pt: Portuguese */
-    private static final String[] LANGUAGE_pt = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E3,\u00E0,\u00E2,\u00E4,\u00E5,\u00E6,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        /* 1 */ "\u00E9,\u00EA,\u00E8,\u0119,\u0117,\u0113,\u00EB",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F5,\u00F4,\u00F2,\u00F6,\u0153,\u00F8,\u014D,\u00BA",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        /* 6 */ null,
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u00E7,\u010D,\u0107",
-    };
-
-    /* Language rm: Raeto-Romance */
-    private static final String[] LANGUAGE_rm = {
-        /* 0~ */
-        null, null, null,
-        /* ~2 */
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u0153,\u00F8",
-    };
-
-    /* Language ro: Romanian */
-    private static final String[] LANGUAGE_ro = {
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101",
-        /* 1 */ null,
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        /* 3 */ null,
-        /* 4 */ null,
-        // U+0219: "È™" LATIN SMALL LETTER S WITH COMMA BELOW
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u0219,\u00DF,\u015B,\u0161",
-        /* 6~ */
-        null, null, null, null, null,
-        /* ~10 */
-        // U+021B: "È›" LATIN SMALL LETTER T WITH COMMA BELOW
-        /* 11 */ "\u021B",
-        /* 12~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_rqm",
-        /* 53 */ "!text/double_9qm_rqm",
-    };
-
-    /* Language ru: Russian */
-    private static final String[] LANGUAGE_ru = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 26 */ "\u044A",
-        // U+044B: "Ñ‹" CYRILLIC SMALL LETTER YERU
-        /* 27 */ "\u044B",
-        // U+044D: "э" CYRILLIC SMALL LETTER E
-        /* 28 */ "\u044D",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        /* 30~ */
-        null, null, null, null, null, null, null,
-        /* ~36 */
-        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
-        null, null, null, null, null,
-        /* ~42 */
-        // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
-        /* 43 */ "\u0451",
-        /* 44~ */
-        null, null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-    };
-
-    /* Language sk: Slovak */
-    private static final String[] LANGUAGE_sk = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
-        /* 0 */ "\u00E1,\u00E4,\u0101,\u00E0,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        /* 1 */ "\u00E9,\u011B,\u0113,\u0117,\u00E8,\u00EA,\u00EB,\u0119",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        /* 2 */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131",
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        /* 3 */ "\u00F4,\u00F3,\u00F6,\u00F2,\u00F5,\u0153,\u0151,\u00F8",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        /* 4 */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\u0171",
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
-        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
-        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u0148,\u0146,\u00F1,\u0144,\u0144",
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u00E7,\u0107",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u010F",
-        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
-        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
-        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
-        /* 10 */ "\u0155,\u0159,\u0157",
-        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
-        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
-        /* 11 */ "\u0165,\u0163",
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        /* 12 */ "\u017E,\u017C,\u017A",
-        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
-        /* 13 */ "\u0137",
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u013E,\u013A,\u013C,\u0142",
-        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
-        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u0123,\u011F",
-        /* 16~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language sl: Slovenian */
-    private static final String[] LANGUAGE_sl = {
-        /* 0~ */
-        null, null, null, null, null,
-        /* ~4 */
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u0161",
-        /* 6 */ null,
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        /* 7 */ "\u010D,\u0107",
-        /* 8 */ null,
-        // U+0111: "Ä‘" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u0111",
-        /* 10 */ null,
-        /* 11 */ null,
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017E",
-        /* 13~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
-        /* ~51 */
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language sr: Serbian */
-    private static final String[] LANGUAGE_sr = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
-        /* ~38 */
-        // TODO: Move these to sr-Latn once we can handle IETF language tag with script name specified.
-        // BEGIN: More keys definitions for Serbian (Latin)
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // <string name="more_keys_for_s">&#x0161;,&#x00DF;,&#x015B;</string>
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // <string name="more_keys_for_c">&#x010D;,&#x00E7;,&#x0107;</string>
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        // <string name="more_keys_for_d">&#x010F;</string>
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // <string name="more_keys_for_z">&#x017E;,&#x017A;,&#x017C;</string>
-        // END: More keys definitions for Serbian (Latin)
-        // BEGIN: More keys definitions for Serbian (Cyrillic)
-        // U+0437: "з" CYRILLIC SMALL LETTER ZE
-        /* 39 */ "\u0437",
-        // U+045B: "Ñ›" CYRILLIC SMALL LETTER TSHE
-        /* 40 */ "\u045B",
-        // U+0455: "Ñ•" CYRILLIC SMALL LETTER DZE
-        /* 41 */ "\u0455",
-        // U+0452: "Ñ’" CYRILLIC SMALL LETTER DJE
-        /* 42 */ "\u0452",
-        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
-        /* 43 */ "\u0450",
-        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
-        /* 44 */ "\u045D",
-        /* 45~ */
-        null, null, null, null, null, null,
-        /* ~50 */
-        // END: More keys definitions for Serbian (Cyrillic)
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language sv: Swedish */
-    private static final String[] LANGUAGE_sv = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        /* 0 */ "\u00E1,\u00E0,\u00E2,\u0105,\u00E3",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        /* 2 */ "\u00ED,\u00EC,\u00EE,\u00EF",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F3,\u00F2,\u00F4,\u00F5,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FA,\u00F9,\u00FB,\u016B",
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u015B,\u0161,\u015F,\u00DF",
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        /* 6 */ "\u0144,\u00F1,\u0148",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        /* 8 */ "\u00FD,\u00FF,\u00FC",
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        /* 9 */ "\u00F0,\u010F",
-        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
-        /* 10 */ "\u0159",
-        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
-        // U+00FE: "þ" LATIN SMALL LETTER THORN
-        /* 11 */ "\u0165,\u00FE",
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        /* 12 */ "\u017A,\u017E,\u017C",
-        /* 13 */ null,
-        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u0142",
-        /* 15~ */
-        null, null, null, null, null,
-        /* ~19 */
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        /* 20 */ "\u00E5",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        /* 21 */ "\u00F6",
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        /* 22 */ "\u00E4",
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        /* 23 */ "\u00F8,\u0153",
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        /* 24 */ "\u00E6",
-        /* 25~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~53 */
-        /* 54 */ "!text/single_raqm_laqm",
-        /* 55 */ "!text/double_raqm_laqm",
-    };
-
-    /* Language sw: Swahili */
-    private static final String[] LANGUAGE_sw = {
-        // This is the same as English except more_keys_for_g.
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u00F1",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u00E7",
-        /* 8~ */
-        null, null, null, null, null, null, null,
-        /* ~14 */
-        /* 15 */ "g\'",
-    };
-
-    /* Language th: Thai */
-    private static final String[] LANGUAGE_th = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0E01: "ก" THAI CHARACTER KO KAI
-        // U+0E02: "ข" THAI CHARACTER KHO KHAI
-        // U+0E04: "ค" THAI CHARACTER KHO KHWAI
-        /* 51 */ "\u0E01\u0E02\u0E04",
-        /* 52~ */
-        null, null, null, null, null,
-        /* ~56 */
-        // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT
-        /* 57 */ "\u0E3F",
-    };
-
-    /* Language tl: Tagalog */
-    private static final String[] LANGUAGE_tl = {
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
-        /* 5 */ null,
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        /* 6 */ "\u00F1,\u0144",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-    };
-
-    /* Language tr: Turkish */
-    private static final String[] LANGUAGE_tr = {
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        /* 0 */ "\u00E2",
-        /* 1 */ null,
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
-        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
-        /* 6 */ null,
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u010D",
-        /* 8~ */
-        null, null, null, null, null, null, null,
-        /* ~14 */
-        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
-        /* 15 */ "\u011F",
-    };
-
-    /* Language uk: Ukrainian */
-    private static final String[] LANGUAGE_uk = {
-        /* 0~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
-        /* ~24 */
-        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
-        /* 25 */ "\u0449",
-        // U+0457: "Ñ—" CYRILLIC SMALL LETTER YI
-        /* 26 */ "\u0457",
-        // U+0456: "Ñ–" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-        /* 27 */ "\u0456",
-        // U+0454: "Ñ”" CYRILLIC SMALL LETTER UKRAINIAN IE
-        /* 28 */ "\u0454",
-        // U+0438: "и" CYRILLIC SMALL LETTER I
-        /* 29 */ "\u0438",
-        /* 30~ */
-        null, null, null,
-        /* ~32 */
-        // U+0491: "Ò‘" CYRILLIC SMALL LETTER GHE WITH UPTURN
-        /* 33 */ "\u0491",
-        // U+0457: "Ñ—" CYRILLIC SMALL LETTER YI
-        /* 34 */ "\u0457",
-        /* 35 */ null,
-        /* 36 */ null,
-        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 37 */ "\u044A",
-        /* 38~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~50 */
-        // Label for "switch to alphabetic" key.
-        // U+0410: "А" CYRILLIC CAPITAL LETTER A
-        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
-        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
-        /* 51 */ "\u0410\u0411\u0412",
-        /* 52 */ "!text/single_9qm_lqm",
-        /* 53 */ "!text/double_9qm_lqm",
-        /* 54~ */
-        null, null, null,
-        /* ~56 */
-        // U+20B4: "â‚´" HRYVNIA SIGN
-        /* 57 */ "\u20B4",
-    };
-
-    /* Language vi: Vietnamese */
-    private static final String[] LANGUAGE_vi = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+1EA3: "ả" LATIN SMALL LETTER A WITH HOOK ABOVE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+1EA1: "ạ" LATIN SMALL LETTER A WITH DOT BELOW
-        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
-        // U+1EB1: "ằ" LATIN SMALL LETTER A WITH BREVE AND GRAVE
-        // U+1EAF: "ắ" LATIN SMALL LETTER A WITH BREVE AND ACUTE
-        // U+1EB3: "ẳ" LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
-        // U+1EB5: "ẵ" LATIN SMALL LETTER A WITH BREVE AND TILDE
-        // U+1EB7: "ặ" LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+1EA7: "ầ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
-        // U+1EA5: "ấ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
-        // U+1EA9: "ẩ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
-        // U+1EAB: "ẫ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
-        // U+1EAD: "ậ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
-        /* 0 */ "\u00E0,\u00E1,\u1EA3,\u00E3,\u1EA1,\u0103,\u1EB1,\u1EAF,\u1EB3,\u1EB5,\u1EB7,\u00E2,\u1EA7,\u1EA5,\u1EA9,\u1EAB,\u1EAD",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+1EBB: "ẻ" LATIN SMALL LETTER E WITH HOOK ABOVE
-        // U+1EBD: "ẽ" LATIN SMALL LETTER E WITH TILDE
-        // U+1EB9: "ẹ" LATIN SMALL LETTER E WITH DOT BELOW
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+1EC1: "ề" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
-        // U+1EBF: "ế" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
-        // U+1EC3: "ể" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
-        // U+1EC5: "á»…" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
-        // U+1EC7: "ệ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
-        /* 1 */ "\u00E8,\u00E9,\u1EBB,\u1EBD,\u1EB9,\u00EA,\u1EC1,\u1EBF,\u1EC3,\u1EC5,\u1EC7",
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+1EC9: "ỉ" LATIN SMALL LETTER I WITH HOOK ABOVE
-        // U+0129: "Ä©" LATIN SMALL LETTER I WITH TILDE
-        // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW
-        /* 2 */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB",
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+1ECF: "ỏ" LATIN SMALL LETTER O WITH HOOK ABOVE
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+1ECD: "ọ" LATIN SMALL LETTER O WITH DOT BELOW
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+1ED3: "ồ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
-        // U+1ED1: "ố" LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
-        // U+1ED5: "ổ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
-        // U+1ED7: "á»—" LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
-        // U+1ED9: "á»™" LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
-        // U+01A1: "Æ¡" LATIN SMALL LETTER O WITH HORN
-        // U+1EDD: "ờ" LATIN SMALL LETTER O WITH HORN AND GRAVE
-        // U+1EDB: "á»›" LATIN SMALL LETTER O WITH HORN AND ACUTE
-        // U+1EDF: "ở" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
-        // U+1EE1: "ỡ" LATIN SMALL LETTER O WITH HORN AND TILDE
-        // U+1EE3: "ợ" LATIN SMALL LETTER O WITH HORN AND DOT BELOW
-        /* 3 */ "\u00F2,\u00F3,\u1ECF,\u00F5,\u1ECD,\u00F4,\u1ED3,\u1ED1,\u1ED5,\u1ED7,\u1ED9,\u01A1,\u1EDD,\u1EDB,\u1EDF,\u1EE1,\u1EE3",
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+1EE7: "ủ" LATIN SMALL LETTER U WITH HOOK ABOVE
-        // U+0169: "Å©" LATIN SMALL LETTER U WITH TILDE
-        // U+1EE5: "ụ" LATIN SMALL LETTER U WITH DOT BELOW
-        // U+01B0: "Æ°" LATIN SMALL LETTER U WITH HORN
-        // U+1EEB: "ừ" LATIN SMALL LETTER U WITH HORN AND GRAVE
-        // U+1EE9: "ứ" LATIN SMALL LETTER U WITH HORN AND ACUTE
-        // U+1EED: "á»­" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
-        // U+1EEF: "ữ" LATIN SMALL LETTER U WITH HORN AND TILDE
-        // U+1EF1: "á»±" LATIN SMALL LETTER U WITH HORN AND DOT BELOW
-        /* 4 */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1",
-        /* 5~ */
-        null, null, null,
-        /* ~7 */
-        // U+1EF3: "ỳ" LATIN SMALL LETTER Y WITH GRAVE
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+1EF7: "á»·" LATIN SMALL LETTER Y WITH HOOK ABOVE
-        // U+1EF9: "ỹ" LATIN SMALL LETTER Y WITH TILDE
-        // U+1EF5: "ỵ" LATIN SMALL LETTER Y WITH DOT BELOW
-        /* 8 */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5",
-        // U+0111: "Ä‘" LATIN SMALL LETTER D WITH STROKE
-        /* 9 */ "\u0111",
-        /* 10~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null,
-        /* ~56 */
-        // U+20AB: "â‚«" DONG SIGN
-        /* 57 */ "\u20AB",
-    };
-
-    /* Language zu: Zulu */
-    private static final String[] LANGUAGE_zu = {
-        // This is the same as English
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        /* 5 */ "\u00DF",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 6 */ "\u00F1",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        /* 7 */ "\u00E7",
-    };
-
-    /* Language zz: Alphabet */
-    private static final String[] LANGUAGE_zz = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
-        // U+00E6: "æ" LATIN SMALL LETTER AE
-        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
-        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
-        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
-        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
-        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
-        // U+0115: "Ä•" LATIN SMALL LETTER E WITH BREVE
-        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
-        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
-        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
-        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B",
-        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-        // U+0129: "Ä©" LATIN SMALL LETTER I WITH TILDE
-        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
-        // U+012D: "Ä­" LATIN SMALL LETTER I WITH BREVE
-        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
-        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        // U+014F: "ŏ" LATIN SMALL LETTER O WITH BREVE
-        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-        // U+0153: "Å“" LATIN SMALL LIGATURE OE
-        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
-        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA",
-        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-        // U+0169: "Å©" LATIN SMALL LETTER U WITH TILDE
-        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
-        // U+016D: "Å­" LATIN SMALL LETTER U WITH BREVE
-        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173",
-        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
-        // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
-        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
-        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
-        // U+017F: "Å¿" LATIN SMALL LETTER LONG S
-        /* 5 */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F",
-        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
-        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
-        // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
-        // U+014B: "Å‹" LATIN SMALL LETTER ENG
-        /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
-        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
-        // U+010B: "Ä‹" LATIN SMALL LETTER C WITH DOT ABOVE
-        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-        /* 7 */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
-        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-        // U+0177: "Å·" LATIN SMALL LETTER Y WITH CIRCUMFLEX
-        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-        // U+0133: "ij" LATIN SMALL LIGATURE IJ
-        /* 8 */ "\u00FD,\u0177,\u00FF,\u0133",
-        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-        // U+0111: "Ä‘" LATIN SMALL LETTER D WITH STROKE
-        // U+00F0: "ð" LATIN SMALL LETTER ETH
-        /* 9 */ "\u010F,\u0111,\u00F0",
-        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
-        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
-        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
-        /* 10 */ "\u0155,\u0157,\u0159",
-        // U+00FE: "þ" LATIN SMALL LETTER THORN
-        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
-        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
-        // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
-        /* 11 */ "\u00FE,\u0163,\u0165,\u0167",
-        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-        /* 12 */ "\u017A,\u017C,\u017E",
-        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
-        // U+0138: "ĸ" LATIN SMALL LETTER KRA
-        /* 13 */ "\u0137,\u0138",
-        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-        // U+0140: "Å€" LATIN SMALL LETTER L WITH MIDDLE DOT
-        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
-        /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
-        // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
-        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
-        // U+0121: "Ä¡" LATIN SMALL LETTER G WITH DOT ABOVE
-        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
-        /* 15 */ "\u011D,\u011F,\u0121,\u0123",
-        /* 16 */ null,
-        // U+0125: "Ä¥" LATIN SMALL LETTER H WITH CIRCUMFLEX
-        /* 17 */ "\u0125",
-        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
-        /* 18 */ "\u0135",
-        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
-        /* 19 */ "\u0175",
-    };
-
-    // TODO: Use the language + "_" + region representation for the locale string key.
-    // Currently we are dropping the region from the key.
-    private static final Object[] LANGUAGES_AND_TEXTS = {
-        "DEFAULT", LANGUAGE_DEFAULT, /* default */
-        "af", LANGUAGE_af, /* Afrikaans */
-        "ar", LANGUAGE_ar, /* Arabic */
-        "az" /* "az_AZ" */, LANGUAGE_az_AZ, /* Azerbaijani (Azerbaijan) */
-        "be" /* "be_BY" */, LANGUAGE_be_BY, /* Belarusian (Belarus) */
-        "bg", LANGUAGE_bg, /* Bulgarian */
-        "ca", LANGUAGE_ca, /* Catalan */
-        "cs", LANGUAGE_cs, /* Czech */
-        "da", LANGUAGE_da, /* Danish */
-        "de", LANGUAGE_de, /* German */
-        "el", LANGUAGE_el, /* Greek */
-        "en", LANGUAGE_en, /* English */
-        "eo", LANGUAGE_eo, /* Esperanto */
-        "es", LANGUAGE_es, /* Spanish */
-        "et" /* "et_EE" */, LANGUAGE_et_EE, /* Estonian (Estonia) */
-        "fa", LANGUAGE_fa, /* Persian */
-        "fi", LANGUAGE_fi, /* Finnish */
-        "fr", LANGUAGE_fr, /* French */
-        "hi", LANGUAGE_hi, /* Hindi */
-        "hr", LANGUAGE_hr, /* Croatian */
-        "hu", LANGUAGE_hu, /* Hungarian */
-        "hy" /* "hy_AM" */, LANGUAGE_hy_AM, /* Armenian (Armenia) */
-        "is", LANGUAGE_is, /* Icelandic */
-        "it", LANGUAGE_it, /* Italian */
-        "iw", LANGUAGE_iw, /* Hebrew */
-        "ka" /* "ka_GE" */, LANGUAGE_ka_GE, /* Georgian (Georgia) */
-        "kk", LANGUAGE_kk, /* Kazakh */
-        "km" /* "km_KH" */, LANGUAGE_km_KH, /* Khmer (Cambodia) */
-        "ky", LANGUAGE_ky, /* Kirghiz */
-        "lo" /* "lo_LA" */, LANGUAGE_lo_LA, /* Lao (Laos) */
-        "lt", LANGUAGE_lt, /* Lithuanian */
-        "lv", LANGUAGE_lv, /* Latvian */
-        "mk", LANGUAGE_mk, /* Macedonian */
-        "mn" /* "mn_MN" */, LANGUAGE_mn_MN, /* Mongolian (Mongolia) */
-        "nb", LANGUAGE_nb, /* Norwegian Bokmål */
-        "ne" /* "ne_NP" */, LANGUAGE_ne_NP, /* Nepali (Nepal) */
-        "nl", LANGUAGE_nl, /* Dutch */
-        "pl", LANGUAGE_pl, /* Polish */
-        "pt", LANGUAGE_pt, /* Portuguese */
-        "rm", LANGUAGE_rm, /* Raeto-Romance */
-        "ro", LANGUAGE_ro, /* Romanian */
-        "ru", LANGUAGE_ru, /* Russian */
-        "sk", LANGUAGE_sk, /* Slovak */
-        "sl", LANGUAGE_sl, /* Slovenian */
-        "sr", LANGUAGE_sr, /* Serbian */
-        "sv", LANGUAGE_sv, /* Swedish */
-        "sw", LANGUAGE_sw, /* Swahili */
-        "th", LANGUAGE_th, /* Thai */
-        "tl", LANGUAGE_tl, /* Tagalog */
-        "tr", LANGUAGE_tr, /* Turkish */
-        "uk", LANGUAGE_uk, /* Ukrainian */
-        "vi", LANGUAGE_vi, /* Vietnamese */
-        "zu", LANGUAGE_zu, /* Zulu */
-        "zz", LANGUAGE_zz, /* Alphabet */
-    };
-
-    static {
-        int id = 0;
-        for (final String name : NAMES) {
-            sNameToIdsMap.put(name, id++);
-        }
-
-        for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
-            final String language = (String)LANGUAGES_AND_TEXTS[i];
-            final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
-            sLanguageToTextsMap.put(language, texts);
-        }
-    }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
new file mode 100644
index 0000000000000000000000000000000000000000..14991f5878e583a0fc5569706228eee5da9fdd46
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
@@ -0,0 +1,3546 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.internal;
+
+import com.android.inputmethod.latin.utils.CollectionUtils;
+
+import java.util.HashMap;
+
+/**
+ * !!!!! DO NOT EDIT THIS FILE !!!!!
+ *
+ * This file is generated by tools/make-keyboard-text. The base template file is
+ *   tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
+ *
+ * This file must be updated when any text resources in keyboard layout files have been changed.
+ * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions,
+ * and should be defined in
+ *   tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml
+ *
+ * To update this file, please run the following commands.
+ *   $ cd $ANDROID_BUILD_TOP
+ *   $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text
+ *   $ make-keyboard-text -java packages/inputmethods/LatinIME/java/src
+ *
+ * The updated source file will be generated to the following path (this file).
+ *   packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/
+ *   KeyboardTextsTable.java
+ */
+public final class KeyboardTextsTable {
+    // Name to index map.
+    private static final HashMap<String, Integer> sNameToIndexesMap = CollectionUtils.newHashMap();
+    // Language to texts map.
+    private static final HashMap<String, String[]> sLanguageToTextsMap =
+            CollectionUtils.newHashMap();
+
+    public static String getText(final String name, final String[] textsTable) {
+        final Integer indexObj = sNameToIndexesMap.get(name);
+        if (indexObj == null) {
+            throw new RuntimeException("Unknown text name: " + name);
+        }
+        final int index = indexObj;
+        final String text = (index < textsTable.length) ? textsTable[index] : null;
+        return (text != null) ? text : LANGUAGE_DEFAULT[index];
+    }
+
+    public static String[] getTextsTable(final String language) {
+        final String[] textsTable = sLanguageToTextsMap.get(language);
+        return textsTable != null ? textsTable : LANGUAGE_DEFAULT;
+    }
+
+    private static final String[] NAMES = {
+        /*  0 */ "more_keys_for_a",
+        /*  1 */ "more_keys_for_e",
+        /*  2 */ "more_keys_for_i",
+        /*  3 */ "more_keys_for_o",
+        /*  4 */ "more_keys_for_u",
+        /*  5 */ "more_keys_for_s",
+        /*  6 */ "more_keys_for_n",
+        /*  7 */ "more_keys_for_c",
+        /*  8 */ "more_keys_for_y",
+        /*  9 */ "more_keys_for_d",
+        /* 10 */ "more_keys_for_r",
+        /* 11 */ "more_keys_for_t",
+        /* 12 */ "more_keys_for_z",
+        /* 13 */ "more_keys_for_k",
+        /* 14 */ "more_keys_for_l",
+        /* 15 */ "more_keys_for_g",
+        /* 16 */ "more_keys_for_v",
+        /* 17 */ "more_keys_for_h",
+        /* 18 */ "more_keys_for_j",
+        /* 19 */ "more_keys_for_w",
+        /* 20 */ "keylabel_for_nordic_row1_11",
+        /* 21 */ "keylabel_for_nordic_row2_10",
+        /* 22 */ "keylabel_for_nordic_row2_11",
+        /* 23 */ "more_keys_for_nordic_row2_10",
+        /* 24 */ "more_keys_for_nordic_row2_11",
+        /* 25 */ "keylabel_for_east_slavic_row1_9",
+        /* 26 */ "keylabel_for_east_slavic_row1_12",
+        /* 27 */ "keylabel_for_east_slavic_row2_1",
+        /* 28 */ "keylabel_for_east_slavic_row2_11",
+        /* 29 */ "keylabel_for_east_slavic_row3_5",
+        /* 30 */ "more_keys_for_cyrillic_u",
+        /* 31 */ "more_keys_for_cyrillic_ka",
+        /* 32 */ "more_keys_for_cyrillic_en",
+        /* 33 */ "more_keys_for_cyrillic_ghe",
+        /* 34 */ "more_keys_for_east_slavic_row2_1",
+        /* 35 */ "more_keys_for_cyrillic_a",
+        /* 36 */ "more_keys_for_cyrillic_o",
+        /* 37 */ "more_keys_for_cyrillic_soft_sign",
+        /* 38 */ "more_keys_for_east_slavic_row2_11",
+        /* 39 */ "keylabel_for_south_slavic_row1_6",
+        /* 40 */ "keylabel_for_south_slavic_row2_11",
+        /* 41 */ "keylabel_for_south_slavic_row3_1",
+        /* 42 */ "keylabel_for_south_slavic_row3_8",
+        /* 43 */ "more_keys_for_cyrillic_ie",
+        /* 44 */ "more_keys_for_cyrillic_i",
+        /* 45 */ "keylabel_for_swiss_row1_11",
+        /* 46 */ "keylabel_for_swiss_row2_10",
+        /* 47 */ "keylabel_for_swiss_row2_11",
+        /* 48 */ "more_keys_for_swiss_row1_11",
+        /* 49 */ "more_keys_for_swiss_row2_10",
+        /* 50 */ "more_keys_for_swiss_row2_11",
+        /* 51 */ "label_to_alpha_key",
+        /* 52 */ "single_quotes",
+        /* 53 */ "double_quotes",
+        /* 54 */ "single_angle_quotes",
+        /* 55 */ "double_angle_quotes",
+        /* 56 */ "more_keys_for_currency_dollar",
+        /* 57 */ "keylabel_for_currency",
+        /* 58 */ "more_keys_for_currency",
+        /* 59 */ "more_keys_for_punctuation",
+        /* 60 */ "more_keys_for_tablet_punctuation",
+        /* 61 */ "more_keys_for_star",
+        /* 62 */ "more_keys_for_bullet",
+        /* 63 */ "more_keys_for_plus",
+        /* 64 */ "more_keys_for_left_parenthesis",
+        /* 65 */ "more_keys_for_right_parenthesis",
+        /* 66 */ "more_keys_for_less_than",
+        /* 67 */ "more_keys_for_greater_than",
+        /* 68 */ "more_keys_for_arabic_diacritics",
+        /* 69 */ "keylabel_for_symbols_1",
+        /* 70 */ "keylabel_for_symbols_2",
+        /* 71 */ "keylabel_for_symbols_3",
+        /* 72 */ "keylabel_for_symbols_4",
+        /* 73 */ "keylabel_for_symbols_5",
+        /* 74 */ "keylabel_for_symbols_6",
+        /* 75 */ "keylabel_for_symbols_7",
+        /* 76 */ "keylabel_for_symbols_8",
+        /* 77 */ "keylabel_for_symbols_9",
+        /* 78 */ "keylabel_for_symbols_0",
+        /* 79 */ "label_to_symbol_key",
+        /* 80 */ "label_to_symbol_with_microphone_key",
+        /* 81 */ "additional_more_keys_for_symbols_1",
+        /* 82 */ "additional_more_keys_for_symbols_2",
+        /* 83 */ "additional_more_keys_for_symbols_3",
+        /* 84 */ "additional_more_keys_for_symbols_4",
+        /* 85 */ "additional_more_keys_for_symbols_5",
+        /* 86 */ "additional_more_keys_for_symbols_6",
+        /* 87 */ "additional_more_keys_for_symbols_7",
+        /* 88 */ "additional_more_keys_for_symbols_8",
+        /* 89 */ "additional_more_keys_for_symbols_9",
+        /* 90 */ "additional_more_keys_for_symbols_0",
+        /* 91 */ "more_keys_for_symbols_1",
+        /* 92 */ "more_keys_for_symbols_2",
+        /* 93 */ "more_keys_for_symbols_3",
+        /* 94 */ "more_keys_for_symbols_4",
+        /* 95 */ "more_keys_for_symbols_5",
+        /* 96 */ "more_keys_for_symbols_6",
+        /* 97 */ "more_keys_for_symbols_7",
+        /* 98 */ "more_keys_for_symbols_8",
+        /* 99 */ "more_keys_for_symbols_9",
+        /* 100 */ "more_keys_for_symbols_0",
+        /* 101 */ "keylabel_for_comma",
+        /* 102 */ "more_keys_for_comma",
+        /* 103 */ "keylabel_for_tablet_comma",
+        /* 104 */ "keyhintlabel_for_tablet_comma",
+        /* 105 */ "more_keys_for_tablet_comma",
+        /* 106 */ "keylabel_for_period",
+        /* 107 */ "keyhintlabel_for_period",
+        /* 108 */ "more_keys_for_period",
+        /* 109 */ "keylabel_for_tablet_period",
+        /* 110 */ "keyhintlabel_for_tablet_period",
+        /* 111 */ "more_keys_for_tablet_period",
+        /* 112 */ "keylabel_for_symbols_question",
+        /* 113 */ "keylabel_for_symbols_semicolon",
+        /* 114 */ "keylabel_for_symbols_percent",
+        /* 115 */ "more_keys_for_exclamation",
+        /* 116 */ "more_keys_for_question",
+        /* 117 */ "more_keys_for_symbols_semicolon",
+        /* 118 */ "more_keys_for_symbols_percent",
+        /* 119 */ "more_keys_for_q",
+        /* 120 */ "more_keys_for_x",
+        /* 121 */ "keylabel_for_q",
+        /* 122 */ "keylabel_for_w",
+        /* 123 */ "keylabel_for_y",
+        /* 124 */ "keylabel_for_x",
+        /* 125 */ "keylabel_for_spanish_row2_10",
+        /* 126 */ "more_keys_for_am_pm",
+        /* 127 */ "settings_as_more_key",
+        /* 128 */ "shortcut_as_more_key",
+        /* 129 */ "action_next_as_more_key",
+        /* 130 */ "action_previous_as_more_key",
+        /* 131 */ "label_to_more_symbol_key",
+        /* 132 */ "label_to_more_symbol_for_tablet_key",
+        /* 133 */ "label_tab_key",
+        /* 134 */ "label_to_phone_numeric_key",
+        /* 135 */ "label_to_phone_symbols_key",
+        /* 136 */ "label_time_am",
+        /* 137 */ "label_time_pm",
+        /* 138 */ "keylabel_for_popular_domain",
+        /* 139 */ "more_keys_for_popular_domain",
+        /* 140 */ "single_laqm_raqm",
+        /* 141 */ "single_laqm_raqm_rtl",
+        /* 142 */ "single_raqm_laqm",
+        /* 143 */ "double_laqm_raqm",
+        /* 144 */ "double_laqm_raqm_rtl",
+        /* 145 */ "double_raqm_laqm",
+        /* 146 */ "single_lqm_rqm",
+        /* 147 */ "single_9qm_lqm",
+        /* 148 */ "single_9qm_rqm",
+        /* 149 */ "double_lqm_rqm",
+        /* 150 */ "double_9qm_lqm",
+        /* 151 */ "double_9qm_rqm",
+        /* 152 */ "more_keys_for_single_quote",
+        /* 153 */ "more_keys_for_double_quote",
+        /* 154 */ "more_keys_for_tablet_double_quote",
+        /* 155 */ "emoji_key_as_more_key",
+    };
+
+    private static final String EMPTY = "";
+
+    /* Default texts */
+    private static final String[] LANGUAGE_DEFAULT = {
+        /* 0~ */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        /* 51 */ "ABC",
+        /* 52 */ "!text/single_lqm_rqm",
+        /* 53 */ "!text/double_lqm_rqm",
+        /* 54 */ "!text/single_laqm_raqm",
+        /* 55 */ "!text/double_laqm_raqm",
+        // U+00A2: "¢" CENT SIGN
+        // U+00A3: "£" POUND SIGN
+        // U+20AC: "€" EURO SIGN
+        // U+00A5: "Â¥" YEN SIGN
+        // U+20B1: "₱" PESO SIGN
+        /* 56 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
+        /* 57 */ "$",
+        /* 58 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
+        /* 59 */ "!fixedColumnOrder!8,;,/,(,),#,!,\\,,?,&,\\%,+,\",-,:,',@",
+        /* 60 */ "!fixedColumnOrder!7,;,/,(,),#,',\\,,&,\\%,+,\",-,:,@",
+        // U+2020: "†" DAGGER
+        // U+2021: "‡" DOUBLE DAGGER
+        // U+2605: "★" BLACK STAR
+        /* 61 */ "\u2020,\u2021,\u2605",
+        // U+266A: "♪" EIGHTH NOTE
+        // U+2665: "♥" BLACK HEART SUIT
+        // U+2660: "â™ " BLACK SPADE SUIT
+        // U+2666: "♦" BLACK DIAMOND SUIT
+        // U+2663: "♣" BLACK CLUB SUIT
+        /* 62 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
+        // U+00B1: "±" PLUS-MINUS SIGN
+        /* 63 */ "\u00B1",
+        // The all letters need to be mirrored are found at
+        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
+        /* 64 */ "!fixedColumnOrder!3,<,{,[",
+        /* 65 */ "!fixedColumnOrder!3,>,},]",
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        // U+2264: "≤" LESS-THAN OR EQUAL TO
+        // U+2265: "≥" GREATER-THAN EQUAL TO
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        /* 66 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
+        /* 67 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
+        /* 68 */ EMPTY,
+        /* 69 */ "1",
+        /* 70 */ "2",
+        /* 71 */ "3",
+        /* 72 */ "4",
+        /* 73 */ "5",
+        /* 74 */ "6",
+        /* 75 */ "7",
+        /* 76 */ "8",
+        /* 77 */ "9",
+        /* 78 */ "0",
+        // Label for "switch to symbols" key.
+        /* 79 */ "?123",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* 80 */ "123",
+        /* 81~ */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~90 */
+        // U+00B9: "¹" SUPERSCRIPT ONE
+        // U+00BD: "½" VULGAR FRACTION ONE HALF
+        // U+2153: "â…“" VULGAR FRACTION ONE THIRD
+        // U+00BC: "¼" VULGAR FRACTION ONE QUARTER
+        // U+215B: "â…›" VULGAR FRACTION ONE EIGHTH
+        /* 91 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
+        // U+00B2: "²" SUPERSCRIPT TWO
+        // U+2154: "â…”" VULGAR FRACTION TWO THIRDS
+        /* 92 */ "\u00B2,\u2154",
+        // U+00B3: "³" SUPERSCRIPT THREE
+        // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
+        // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
+        /* 93 */ "\u00B3,\u00BE,\u215C",
+        // U+2074: "⁴" SUPERSCRIPT FOUR
+        /* 94 */ "\u2074",
+        // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
+        /* 95 */ "\u215D",
+        /* 96 */ EMPTY,
+        // U+215E: "â…ž" VULGAR FRACTION SEVEN EIGHTHS
+        /* 97 */ "\u215E",
+        /* 98 */ EMPTY,
+        /* 99 */ EMPTY,
+        // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
+        // U+2205: "∅" EMPTY SET
+        /* 100 */ "\u207F,\u2205",
+        // Comma key
+        /* 101 */ ",",
+        /* 102 */ EMPTY,
+        /* 103 */ ",",
+        /* 104 */ EMPTY,
+        /* 105 */ EMPTY,
+        // Period key
+        /* 106 */ ".",
+        /* 107 */ EMPTY,
+        /* 108 */ "!text/more_keys_for_punctuation",
+        /* 109 */ ".",
+        /* 110 */ EMPTY,
+        /* 111 */ "!text/more_keys_for_tablet_punctuation",
+        /* 112 */ "?",
+        /* 113 */ ";",
+        /* 114 */ "%",
+        // U+00A1: "¡" INVERTED EXCLAMATION MARK
+        /* 115 */ "\u00A1",
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* 116 */ "\u00BF",
+        /* 117 */ EMPTY,
+        // U+2030: "‰" PER MILLE SIGN
+        /* 118 */ "\u2030",
+        /* 119 */ EMPTY,
+        /* 120 */ EMPTY,
+        /* 121 */ "q",
+        /* 122 */ "w",
+        /* 123 */ "y",
+        /* 124 */ "x",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* 125 */ "\u00F1",
+        /* 126 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
+        /* 127 */ "!icon/settings_key|!code/key_settings",
+        /* 128 */ "!icon/shortcut_key|!code/key_shortcut",
+        /* 129 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
+        /* 130 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
+        // Label for "switch to more symbol" modifier key ("= \ <"). Must be short to fit on key!
+        /* 131 */ "= \\\\ <",
+        // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
+        /* 132 */ "~ [ <",
+        // Label for "Tab" key.  Must be short to fit on key!
+        /* 133 */ "Tab",
+        // Label for "switch to phone numeric" key.  Must be short to fit on key!
+        /* 134 */ "123",
+        // Label for "switch to phone symbols" key.  Must be short to fit on key!
+        // U+FF0A: "*" FULLWIDTH ASTERISK
+        // U+FF03: "#" FULLWIDTH NUMBER SIGN
+        /* 135 */ "\uFF0A\uFF03",
+        // Key label for "ante meridiem"
+        /* 136 */ "AM",
+        // Key label for "post meridiem"
+        /* 137 */ "PM",
+        /* 138 */ ".com",
+        // popular web domains for the locale - most popular, displayed on the keyboard
+        /* 139 */ "!hasLabels!,.net,.org,.gov,.edu",
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // The following characters don't need BIDI mirroring.
+        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
+        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
+        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
+        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
+        // Abbreviations are:
+        // laqm: LEFT-POINTING ANGLE QUOTATION MARK
+        // raqm: RIGHT-POINTING ANGLE QUOTATION MARK
+        // rtl: Right-To-Left script order
+        // lqm: LEFT QUOTATION MARK
+        // rqm: RIGHT QUOTATION MARK
+        // 9qm: LOW-9 QUOTATION MARK
+        // The following each quotation mark pair consist of
+        // <opening quotation mark>, <closing quotation mark>
+        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
+        /* 140 */ "\u2039,\u203A",
+        /* 141 */ "\u2039|\u203A,\u203A|\u2039",
+        /* 142 */ "\u203A,\u2039",
+        /* 143 */ "\u00AB,\u00BB",
+        /* 144 */ "\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 145 */ "\u00BB,\u00AB",
+        // The following each quotation mark triplet consists of
+        // <another quotation mark>, <opening quotation mark>, <closing quotation mark>
+        // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
+        /* 146 */ "\u201A,\u2018,\u2019",
+        /* 147 */ "\u2019,\u201A,\u2018",
+        /* 148 */ "\u2018,\u201A,\u2019",
+        /* 149 */ "\u201E,\u201C,\u201D",
+        /* 150 */ "\u201D,\u201E,\u201C",
+        /* 151 */ "\u201C,\u201E,\u201D",
+        /* 152 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
+        /* 153 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
+        /* 154 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
+        /* 155 */ "!icon/emoji_key|!code/key_emoji",
+    };
+
+    /* Language af: Afrikaans */
+    private static final String[] LANGUAGE_af = {
+        // This is the same as Dutch except more keys of y and demoting vowels with diaeresis.
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E2,\u00E4,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 2 */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F4,\u00F6,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
+        /* 5 */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        /* 7 */ null,
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 8 */ "\u00FD,\u0133",
+    };
+
+    /* Language ar: Arabic */
+    private static final String[] LANGUAGE_ar = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0623: "ا" ARABIC LETTER ALEF
+        // U+200C: ZERO WIDTH NON-JOINER
+        // U+0628: "ب" ARABIC LETTER BEH
+        // U+062C: "Ù¾" ARABIC LETTER PEH
+        /* 51 */ "\u0623\u200C\u0628\u200C\u062C",
+        /* 52 */ null,
+        /* 53 */ null,
+        /* 54 */ "!text/single_laqm_raqm_rtl",
+        /* 55 */ "!text/double_laqm_raqm_rtl",
+        /* 56~ */
+        null, null, null,
+        /* ~58 */
+        /* 59 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
+        /* 60 */ null,
+        // U+2605: "★" BLACK STAR
+        // U+066D: "Ù­" ARABIC FIVE POINTED STAR
+        /* 61 */ "\u2605,\u066D",
+        // U+266A: "♪" EIGHTH NOTE
+        /* 62 */ "\u266A",
+        /* 63 */ null,
+        // The all letters need to be mirrored are found at
+        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
+        // U+FD3E: "ï´¾" ORNATE LEFT PARENTHESIS
+        // U+FD3F: "ï´¿" ORNATE RIGHT PARENTHESIS
+        /* 64 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
+        /* 65 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
+        // U+2264: "≤" LESS-THAN OR EQUAL TO
+        // U+2265: "≥" GREATER-THAN EQUAL TO
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
+        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+        // U+0655: "Ù•" ARABIC HAMZA BELOW
+        // U+0654: "Ù”" ARABIC HAMZA ABOVE
+        // U+0652: "Ù’" ARABIC SUKUN
+        // U+064D: "ٍ" ARABIC KASRATAN
+        // U+064C: "ٌ" ARABIC DAMMATAN
+        // U+064B: "Ù‹" ARABIC FATHATAN
+        // U+0651: "Ù‘" ARABIC SHADDA
+        // U+0656: "Ù–" ARABIC SUBSCRIPT ALEF
+        // U+0670: "Ù°" ARABIC LETTER SUPERSCRIPT ALEF
+        // U+0653: "Ù“" ARABIC MADDAH ABOVE
+        // U+0650: "ِ" ARABIC KASRA
+        // U+064F: "ُ" ARABIC DAMMA
+        // U+064E: "ÙŽ" ARABIC FATHA
+        // U+0640: "Ù€" ARABIC TATWEEL
+        // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
+        // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
+        /* 68 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
+        // U+0661: "Ù¡" ARABIC-INDIC DIGIT ONE
+        /* 69 */ "\u0661",
+        // U+0662: "Ù¢" ARABIC-INDIC DIGIT TWO
+        /* 70 */ "\u0662",
+        // U+0663: "Ù£" ARABIC-INDIC DIGIT THREE
+        /* 71 */ "\u0663",
+        // U+0664: "Ù¤" ARABIC-INDIC DIGIT FOUR
+        /* 72 */ "\u0664",
+        // U+0665: "Ù¥" ARABIC-INDIC DIGIT FIVE
+        /* 73 */ "\u0665",
+        // U+0666: "Ù¦" ARABIC-INDIC DIGIT SIX
+        /* 74 */ "\u0666",
+        // U+0667: "Ù§" ARABIC-INDIC DIGIT SEVEN
+        /* 75 */ "\u0667",
+        // U+0668: "Ù¨" ARABIC-INDIC DIGIT EIGHT
+        /* 76 */ "\u0668",
+        // U+0669: "Ù©" ARABIC-INDIC DIGIT NINE
+        /* 77 */ "\u0669",
+        // U+0660: "Ù " ARABIC-INDIC DIGIT ZERO
+        /* 78 */ "\u0660",
+        // Label for "switch to symbols" key.
+        // U+061F: "ØŸ" ARABIC QUESTION MARK
+        /* 79 */ "\u0663\u0662\u0661\u061F",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* 80 */ "\u0663\u0662\u0661",
+        /* 81 */ "1",
+        /* 82 */ "2",
+        /* 83 */ "3",
+        /* 84 */ "4",
+        /* 85 */ "5",
+        /* 86 */ "6",
+        /* 87 */ "7",
+        /* 88 */ "8",
+        /* 89 */ "9",
+        // U+066B: "Ù«" ARABIC DECIMAL SEPARATOR
+        // U+066C: "Ù¬" ARABIC THOUSANDS SEPARATOR
+        /* 90 */ "0,\u066B,\u066C",
+        /* 91~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~100 */
+        // U+060C: "،" ARABIC COMMA
+        /* 101 */ "\u060C",
+        /* 102 */ "\\,",
+        // U+061F: "ØŸ" ARABIC QUESTION MARK
+        // U+060C: "،" ARABIC COMMA
+        // U+061B: "Ø›" ARABIC SEMICOLON
+        /* 103 */ "\u060C",
+        /* 104 */ "\u061F",
+        /* 105 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\",\'",
+        /* 106 */ null,
+        // U+0651: "Ù‘" ARABIC SHADDA
+        /* 107 */ "\u0651",
+        /* 108 */ "!text/more_keys_for_arabic_diacritics",
+        /* 109 */ null,
+        /* 110 */ "\u0651",
+        /* 111 */ "!text/more_keys_for_arabic_diacritics",
+        /* 112 */ "\u061F",
+        /* 113 */ "\u061B",
+        // U+066A: "Ùª" ARABIC PERCENT SIGN
+        /* 114 */ "\u066A",
+        /* 115 */ null,
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* 116 */ "?,\u00BF",
+        /* 117 */ ";",
+        // U+2030: "‰" PER MILLE SIGN
+        /* 118 */ "\\%,\u2030",
+    };
+
+    /* Language az_AZ: Azerbaijani (Azerbaijan) */
+    private static final String[] LANGUAGE_az_AZ = {
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        /* 0 */ "\u00E2",
+        // U+0259: "É™" LATIN SMALL LETTER SCHWA
+        /* 1 */ "\u0259",
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
+        /* 6 */ null,
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* 8~ */
+        null, null, null, null, null, null, null,
+        /* ~14 */
+        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u011F",
+    };
+
+    /* Language be_BY: Belarusian (Belarus) */
+    private static final String[] LANGUAGE_be_BY = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~24 */
+        // U+045E: "Ñž" CYRILLIC SMALL LETTER SHORT U
+        /* 25 */ "\u045E",
+        // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
+        /* 26 */ "\u0451",
+        // U+044B: "Ñ‹" CYRILLIC SMALL LETTER YERU
+        /* 27 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* 28 */ "\u044D",
+        // U+0456: "Ñ–" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+        /* 29 */ "\u0456",
+        /* 30~ */
+        null, null, null, null, null, null, null,
+        /* ~36 */
+        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null,
+        /* ~42 */
+        // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
+        /* 43 */ "\u0451",
+        /* 44~ */
+        null, null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language bg: Bulgarian */
+    private static final String[] LANGUAGE_bg = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ null,
+        // single_quotes of Bulgarian is default single_quotes_right_left.
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language ca: Catalan */
+    private static final String[] LANGUAGE_ca = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E0,\u00E1,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E8,\u00E9,\u00EB,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* 5 */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* 8~ */
+        null, null, null, null, null, null,
+        /* ~13 */
+        // U+00B7: "·" MIDDLE DOT
+        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "l\u00B7l,\u0142",
+        /* 15~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~58 */
+        // U+00B7: "·" MIDDLE DOT
+        /* 59 */ "!fixedColumnOrder!9,;,/,(,),#,\u00B7,!,\\,,?,&,\\%,+,\",-,:,',@",
+        /* 60 */ "!fixedColumnOrder!8,;,/,(,),#,\u00B7,',\\,,&,\\%,+,\",-,:,@",
+        /* 61~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null,
+        /* ~124 */
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        /* 125 */ "\u00E7",
+    };
+
+    /* Language cs: Czech */
+    private static final String[] LANGUAGE_cs = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B",
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        /* 5 */ "\u0161,\u00DF,\u015B",
+        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u0148,\u00F1,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u00E7,\u0107",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u010F",
+        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
+        /* 10 */ "\u0159",
+        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
+        /* 11 */ "\u0165",
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        /* 12 */ "\u017E,\u017A,\u017C",
+        /* 13~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language da: Danish */
+    private static final String[] LANGUAGE_da = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        /* 1 */ "\u00E9,\u00EB",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        /* 2 */ "\u00ED,\u00EF",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u00DF,\u015B,\u0161",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        /* 7 */ null,
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        /* 9 */ "\u00F0",
+        /* 10~ */
+        null, null, null, null,
+        /* ~13 */
+        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u0142",
+        /* 15~ */
+        null, null, null, null, null,
+        /* ~19 */
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        /* 20 */ "\u00E5",
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 21 */ "\u00E6",
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 22 */ "\u00F8",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 23 */ "\u00E4",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 24 */ "\u00F6",
+        /* 25~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language de: German */
+    private static final String[] LANGUAGE_de = {
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E4,\u00E2,\u00E0,\u00E1,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117",
+        /* 2 */ null,
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F6,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u00DF,\u015B,\u0161",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        /* 7~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null,
+        /* ~44 */
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        /* 45 */ "\u00FC",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 46 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 47 */ "\u00E4",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        /* 48 */ "\u00E8",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        /* 49 */ "\u00E9",
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        /* 50 */ "\u00E0",
+        /* 51 */ null,
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language el: Greek */
+    private static final String[] LANGUAGE_el = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0391: "Α" GREEK CAPITAL LETTER ALPHA
+        // U+0392: "Î’" GREEK CAPITAL LETTER BETA
+        // U+0393: "Γ" GREEK CAPITAL LETTER GAMMA
+        /* 51 */ "\u0391\u0392\u0393",
+    };
+
+    /* Language en: English */
+    private static final String[] LANGUAGE_en = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* 5 */ "\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* 6 */ "\u00F1",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        /* 7 */ "\u00E7",
+    };
+
+    /* Language eo: Esperanto */
+    private static final String[] LANGUAGE_eo = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
+        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0129: "Ä©" LATIN SMALL LETTER I WITH TILDE
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 2 */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D,\u0151,\u00BA",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        // U+0169: "Å©" LATIN SMALL LETTER U WITH TILDE
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        // U+00B5: "µ" MICRO SIGN
+        /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B,\u0169,\u0171,\u0173,\u00B5",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+0219: "È™" LATIN SMALL LETTER S WITH COMMA BELOW
+        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
+        /* 5 */ "\u00DF,\u0161,\u015B,\u0219,\u015F",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+        // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+        // U+014B: "Å‹" LATIN SMALL LETTER ENG
+        /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+010B: "Ä‹" LATIN SMALL LETTER C WITH DOT ABOVE
+        /* 7 */ "\u0107,\u010D,\u00E7,\u010B",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+0177: "Å·" LATIN SMALL LETTER Y WITH CIRCUMFLEX
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        // U+00FE: "þ" LATIN SMALL LETTER THORN
+        /* 8 */ "y,\u00FD,\u0177,\u00FF,\u00FE",
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        // U+0111: "Ä‘" LATIN SMALL LETTER D WITH STROKE
+        /* 9 */ "\u00F0,\u010F,\u0111",
+        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
+        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
+        /* 10 */ "\u0159,\u0155,\u0157",
+        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
+        // U+021B: "È›" LATIN SMALL LETTER T WITH COMMA BELOW
+        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
+        /* 11 */ "\u0165,\u021B,\u0163,\u0167",
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        /* 12 */ "\u017A,\u017C,\u017E",
+        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
+        // U+0138: "ĸ" LATIN SMALL LETTER KRA
+        /* 13 */ "\u0137,\u0138",
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        // U+0140: "Å€" LATIN SMALL LETTER L WITH MIDDLE DOT
+        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
+        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
+        // U+0121: "Ä¡" LATIN SMALL LETTER G WITH DOT ABOVE
+        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
+        /* 15 */ "\u011F,\u0121,\u0123",
+        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
+        /* 16 */ "w,\u0175",
+        // U+0125: "Ä¥" LATIN SMALL LETTER H WITH CIRCUMFLEX
+        // U+0127: "ħ" LATIN SMALL LETTER H WITH STROKE
+        /* 17 */ "\u0125,\u0127",
+        /* 18 */ null,
+        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
+        /* 19 */ "w,\u0175",
+        /* 20~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null,
+        /* ~118 */
+        /* 119 */ "q",
+        /* 120 */ "x",
+        // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
+        /* 121 */ "\u015D",
+        // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
+        /* 122 */ "\u011D",
+        // U+016D: "Å­" LATIN SMALL LETTER U WITH BREVE
+        /* 123 */ "\u016D",
+        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
+        /* 124 */ "\u0109",
+        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
+        /* 125 */ "\u0135",
+    };
+
+    /* Language es: Spanish */
+    private static final String[] LANGUAGE_es = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* 5 */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* 8~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~58 */
+        // U+00A1: "¡" INVERTED EXCLAMATION MARK
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* 59 */ "!fixedColumnOrder!9,\u00A1,;,/,(,),#,!,\\,,?,\u00BF,&,\\%,+,\",-,:,',@",
+    };
+
+    /* Language et_EE: Estonian (Estonia) */
+    private static final String[] LANGUAGE_et_EE = {
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
+        /* 0 */ "\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
+        /* 1 */ "\u0113,\u00E8,\u0117,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* 2 */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        /* 4 */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
+        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u00E7,\u0107",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u010F",
+        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
+        /* 10 */ "\u0157,\u0159,\u0155",
+        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
+        /* 11 */ "\u0163,\u0165",
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        /* 12 */ "\u017E,\u017C,\u017A",
+        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
+        /* 13 */ "\u0137",
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
+        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
+        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u0123,\u011F",
+        /* 16~ */
+        null, null, null, null,
+        /* ~19 */
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        /* 20 */ "\u00FC",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 21 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 22 */ "\u00E4",
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        /* 23 */ "\u00F5",
+        /* 24~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language fa: Persian */
+    private static final String[] LANGUAGE_fa = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0627: "ا" ARABIC LETTER ALEF
+        // U+200C: ZERO WIDTH NON-JOINER
+        // U+0628: "ب" ARABIC LETTER BEH
+        // U+067E: "Ù¾" ARABIC LETTER PEH
+        /* 51 */ "\u0627\u200C\u0628\u200C\u067E",
+        /* 52 */ null,
+        /* 53 */ null,
+        /* 54 */ "!text/single_laqm_raqm_rtl",
+        /* 55 */ "!text/double_laqm_raqm_rtl",
+        /* 56 */ null,
+        // U+FDFC: "ï·¼" RIAL SIGN
+        /* 57 */ "\uFDFC",
+        /* 58 */ null,
+        // U+061F: "ØŸ" ARABIC QUESTION MARK
+        // U+060C: "،" ARABIC COMMA
+        // U+061B: "Ø›" ARABIC SEMICOLON
+        /* 59 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
+        /* 60 */ null,
+        // U+2605: "★" BLACK STAR
+        // U+066D: "Ù­" ARABIC FIVE POINTED STAR
+        /* 61 */ "\u2605,\u066D",
+        // U+266A: "♪" EIGHTH NOTE
+        /* 62 */ "\u266A",
+        /* 63 */ null,
+        // The all letters need to be mirrored are found at
+        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
+        // U+FD3E: "ï´¾" ORNATE LEFT PARENTHESIS
+        // U+FD3F: "ï´¿" ORNATE RIGHT PARENTHESIS
+        /* 64 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
+        /* 65 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
+        // U+2264: "≤" LESS-THAN OR EQUAL TO
+        // U+2265: "≥" GREATER-THAN EQUAL TO
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
+        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
+        // U+0655: "Ù•" ARABIC HAMZA BELOW
+        // U+0652: "Ù’" ARABIC SUKUN
+        // U+0651: "Ù‘" ARABIC SHADDA
+        // U+064C: "ٌ" ARABIC DAMMATAN
+        // U+064D: "ٍ" ARABIC KASRATAN
+        // U+064B: "Ù‹" ARABIC FATHATAN
+        // U+0654: "Ù”" ARABIC HAMZA ABOVE
+        // U+0656: "Ù–" ARABIC SUBSCRIPT ALEF
+        // U+0670: "Ù°" ARABIC LETTER SUPERSCRIPT ALEF
+        // U+0653: "Ù“" ARABIC MADDAH ABOVE
+        // U+064F: "ُ" ARABIC DAMMA
+        // U+0650: "ِ" ARABIC KASRA
+        // U+064E: "ÙŽ" ARABIC FATHA
+        // U+0640: "Ù€" ARABIC TATWEEL
+        // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
+        // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
+        /* 68 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
+        // U+06F1: "Û±" EXTENDED ARABIC-INDIC DIGIT ONE
+        /* 69 */ "\u06F1",
+        // U+06F2: "Û²" EXTENDED ARABIC-INDIC DIGIT TWO
+        /* 70 */ "\u06F2",
+        // U+06F3: "Û³" EXTENDED ARABIC-INDIC DIGIT THREE
+        /* 71 */ "\u06F3",
+        // U+06F4: "Û´" EXTENDED ARABIC-INDIC DIGIT FOUR
+        /* 72 */ "\u06F4",
+        // U+06F5: "Ûµ" EXTENDED ARABIC-INDIC DIGIT FIVE
+        /* 73 */ "\u06F5",
+        // U+06F6: "Û¶" EXTENDED ARABIC-INDIC DIGIT SIX
+        /* 74 */ "\u06F6",
+        // U+06F7: "Û·" EXTENDED ARABIC-INDIC DIGIT SEVEN
+        /* 75 */ "\u06F7",
+        // U+06F8: "Û¸" EXTENDED ARABIC-INDIC DIGIT EIGHT
+        /* 76 */ "\u06F8",
+        // U+06F9: "Û¹" EXTENDED ARABIC-INDIC DIGIT NINE
+        /* 77 */ "\u06F9",
+        // U+06F0: "Û°" EXTENDED ARABIC-INDIC DIGIT ZERO
+        /* 78 */ "\u06F0",
+        // Label for "switch to symbols" key.
+        // U+061F: "ØŸ" ARABIC QUESTION MARK
+        /* 79 */ "\u06F3\u06F2\u06F1\u061F",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* 80 */ "\u06F3\u06F2\u06F1",
+        /* 81 */ "1",
+        /* 82 */ "2",
+        /* 83 */ "3",
+        /* 84 */ "4",
+        /* 85 */ "5",
+        /* 86 */ "6",
+        /* 87 */ "7",
+        /* 88 */ "8",
+        /* 89 */ "9",
+        // U+066B: "Ù«" ARABIC DECIMAL SEPARATOR
+        // U+066C: "Ù¬" ARABIC THOUSANDS SEPARATOR
+        /* 90 */ "0,\u066B,\u066C",
+        /* 91~ */
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~100 */
+        // U+060C: "،" ARABIC COMMA
+        /* 101 */ "\u060C",
+        /* 102 */ "\\,",
+        // U+060C: "،" ARABIC COMMA
+        // U+061B: "Ø›" ARABIC SEMICOLON
+        // U+061F: "ØŸ" ARABIC QUESTION MARK
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        /* 103 */ "\u060C",
+        /* 104 */ "\u061F",
+        /* 105 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 106 */ null,
+        // U+064B: "Ù‹" ARABIC FATHATAN
+        /* 107 */ "\u064B",
+        /* 108 */ "!text/more_keys_for_arabic_diacritics",
+        /* 109 */ null,
+        /* 110 */ "\u064B",
+        /* 111 */ "!text/more_keys_for_arabic_diacritics",
+        /* 112 */ "\u061F",
+        /* 113 */ "\u061B",
+        // U+066A: "Ùª" ARABIC PERCENT SIGN
+        /* 114 */ "\u066A",
+        /* 115 */ null,
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* 116 */ "?,\u00BF",
+        /* 117 */ ";",
+        // U+2030: "‰" PER MILLE SIGN
+        /* 118 */ "\\%,\u2030",
+    };
+
+    /* Language fi: Finnish */
+    private static final String[] LANGUAGE_fi = {
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
+        /* 1 */ null,
+        /* 2 */ null,
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        /* 4 */ "\u00FC",
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        /* 5 */ "\u0161,\u00DF,\u015B",
+        /* 6~ */
+        null, null, null, null, null, null,
+        /* ~11 */
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        /* 12 */ "\u017E,\u017A,\u017C",
+        /* 13~ */
+        null, null, null, null, null, null, null,
+        /* ~19 */
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        /* 20 */ "\u00E5",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 21 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 22 */ "\u00E4",
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 23 */ "\u00F8",
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 24 */ "\u00E6",
+    };
+
+    /* Language fr: French */
+    private static final String[] LANGUAGE_fr = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E0,\u00E2,%,\u00E6,\u00E1,\u00E4,\u00E3,\u00E5,\u0101,\u00AA",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,%,\u0119,\u0117,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F4,\u0153,%,\u00F6,\u00F2,\u00F3,\u00F5,\u00F8,\u014D,\u00BA",
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B",
+        /* 5 */ null,
+        /* 6 */ null,
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "%,\u00FF",
+        /* 9~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~44 */
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        /* 45 */ "\u00E8",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        /* 46 */ "\u00E9",
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        /* 47 */ "\u00E0",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        /* 48 */ "\u00FC",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 49 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 50 */ "\u00E4",
+    };
+
+    /* Language hi: Hindi */
+    private static final String[] LANGUAGE_hi = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0915: "क" DEVANAGARI LETTER KA
+        // U+0916: "ख" DEVANAGARI LETTER KHA
+        // U+0917: "ग" DEVANAGARI LETTER GA
+        /* 51 */ "\u0915\u0916\u0917",
+        /* 52~ */
+        null, null, null, null, null,
+        /* ~56 */
+        // U+20B9: "₹" INDIAN RUPEE SIGN
+        /* 57 */ "\u20B9",
+        /* 58~ */
+        null, null, null, null, null, null, null, null, null, null, null,
+        /* ~68 */
+        // U+0967: "१" DEVANAGARI DIGIT ONE
+        /* 69 */ "\u0967",
+        // U+0968: "२" DEVANAGARI DIGIT TWO
+        /* 70 */ "\u0968",
+        // U+0969: "३" DEVANAGARI DIGIT THREE
+        /* 71 */ "\u0969",
+        // U+096A: "४" DEVANAGARI DIGIT FOUR
+        /* 72 */ "\u096A",
+        // U+096B: "५" DEVANAGARI DIGIT FIVE
+        /* 73 */ "\u096B",
+        // U+096C: "६" DEVANAGARI DIGIT SIX
+        /* 74 */ "\u096C",
+        // U+096D: "७" DEVANAGARI DIGIT SEVEN
+        /* 75 */ "\u096D",
+        // U+096E: "८" DEVANAGARI DIGIT EIGHT
+        /* 76 */ "\u096E",
+        // U+096F: "९" DEVANAGARI DIGIT NINE
+        /* 77 */ "\u096F",
+        // U+0966: "०" DEVANAGARI DIGIT ZERO
+        /* 78 */ "\u0966",
+        // Label for "switch to symbols" key.
+        /* 79 */ "?\u0967\u0968\u0969",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* 80 */ "\u0967\u0968\u0969",
+        /* 81 */ "1",
+        /* 82 */ "2",
+        /* 83 */ "3",
+        /* 84 */ "4",
+        /* 85 */ "5",
+        /* 86 */ "6",
+        /* 87 */ "7",
+        /* 88 */ "8",
+        /* 89 */ "9",
+        /* 90 */ "0",
+    };
+
+    /* Language hr: Croatian */
+    private static final String[] LANGUAGE_hr = {
+        /* 0~ */
+        null, null, null, null, null,
+        /* ~4 */
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* 5 */ "\u0161,\u015B,\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        /* 7 */ "\u010D,\u0107,\u00E7",
+        /* 8 */ null,
+        // U+0111: "Ä‘" LATIN SMALL LETTER D WITH STROKE
+        /* 9 */ "\u0111",
+        /* 10 */ null,
+        /* 11 */ null,
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        /* 12 */ "\u017E,\u017A,\u017C",
+        /* 13~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language hu: Hungarian */
+    private static final String[] LANGUAGE_hu = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F6,\u0151,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B",
+        /* 5~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language hy_AM: Armenian (Armenia) */
+    private static final String[] LANGUAGE_hy_AM = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~58 */
+        // U+058A: "ÖŠ" ARMENIAN HYPHEN
+        // U+055C: "՜" ARMENIAN EXCLAMATION MARK
+        // U+055D: "՝" ARMENIAN COMMA
+        // U+055E: "Õž" ARMENIAN QUESTION MARK
+        // U+0559: "Õ™" ARMENIAN MODIFIER LETTER LEFT HALF RING
+        // U+055A: "Õš" ARMENIAN APOSTROPHE
+        // U+055B: "Õ›" ARMENIAN EMPHASIS MARK
+        // U+055F: "ÕŸ" ARMENIAN ABBREVIATION MARK
+        /* 59 */ "!fixedColumnOrder!8,!,?,\u0559,\u055A,.,\u055C,\\,,\u055E,:,;,\u055F,\u00AB,\u00BB,\u058A,\u055D,\u055B",
+        /* 60~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~102 */
+        // U+058F: "֏" ARMENIAN DRAM SIGN
+        // TODO: Enable this when we have glyph for the following letter
+        // <string name="keylabel_for_currency">&#x058F;</string>
+        // 
+        // U+055D: "՝" ARMENIAN COMMA
+        /* 103 */ "\u055D",
+        /* 104 */ null,
+        /* 105 */ null,
+        // U+0589: "Ö‰" ARMENIAN FULL STOP
+        /* 106 */ "\u0589",
+        /* 107 */ null,
+        /* 108 */ null,
+        /* 109 */ "\u0589",
+        /* 110 */ null,
+        /* 111 */ "!text/more_keys_for_punctuation",
+        /* 112~ */
+        null, null, null,
+        /* ~114 */
+        // U+055C: "՜" ARMENIAN EXCLAMATION MARK
+        // U+00A1: "¡" INVERTED EXCLAMATION MARK
+        /* 115 */ "\u055C,\u00A1",
+        // U+055E: "Õž" ARMENIAN QUESTION MARK
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        /* 116 */ "\u055E,\u00BF",
+    };
+
+    /* Language is: Icelandic */
+    private static final String[] LANGUAGE_is = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E4,\u00E6,\u00E5,\u00E0,\u00E2,\u00E3,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00EB,\u00E8,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        /* 5~ */
+        null, null, null,
+        /* ~7 */
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        /* 9 */ "\u00F0",
+        /* 10 */ null,
+        // U+00FE: "þ" LATIN SMALL LETTER THORN
+        /* 11 */ "\u00FE",
+        /* 12~ */
+        null, null, null, null, null, null, null, null,
+        /* ~19 */
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        /* 20 */ "\u00F0",
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 21 */ "\u00E6",
+        // U+00FE: "þ" LATIN SMALL LETTER THORN
+        /* 22 */ "\u00FE",
+        /* 23~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language it: Italian */
+    private static final String[] LANGUAGE_it = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u00AA",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B",
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F6,\u00F5,\u0153,\u00F8,\u014D,\u00BA",
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B",
+    };
+
+    /* Language iw: Hebrew */
+    private static final String[] LANGUAGE_iw = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+05D0: "א" HEBREW LETTER ALEF
+        // U+05D1: "ב" HEBREW LETTER BET
+        // U+05D2: "×’" HEBREW LETTER GIMEL
+        /* 51 */ "\u05D0\u05D1\u05D2",
+        // The following characters don't need BIDI mirroring.
+        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
+        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
+        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
+        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
+        /* 52 */ "\u2018,\u2019,\u201A",
+        /* 53 */ "\u201C,\u201D,\u201E",
+        /* 54 */ "!text/single_laqm_raqm_rtl",
+        /* 55 */ "!text/double_laqm_raqm_rtl",
+        /* 56 */ null,
+        // U+20AA: "₪" NEW SHEQEL SIGN
+        /* 57 */ "\u20AA",
+        /* 58 */ null,
+        /* 59 */ "!fixedColumnOrder!8,;,/,(|),)|(,#,!,\\,,?,&,\\%,+,\",-,:,',@",
+        /* 60 */ "!fixedColumnOrder!7,;,/,(|),)|(,#,',\\,,&,\\%,+,\",-,:,@",
+        // U+2605: "★" BLACK STAR
+        /* 61 */ "\u2605",
+        /* 62 */ null,
+        // U+00B1: "±" PLUS-MINUS SIGN
+        // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
+        /* 63 */ "\u00B1,\uFB29",
+        // The all letters need to be mirrored are found at
+        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
+        /* 64 */ "!fixedColumnOrder!3,<|>,{|},[|]",
+        /* 65 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
+        // U+2264: "≤" LESS-THAN OR EQUAL TO
+        // U+2265: "≥" GREATER-THAN EQUAL TO
+        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        /* 66 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
+        /* 67 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+    };
+
+    /* Language ka_GE: Georgian (Georgia) */
+    private static final String[] LANGUAGE_ka_GE = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+10D0: "ა" GEORGIAN LETTER AN
+        // U+10D1: "ბ" GEORGIAN LETTER BAN
+        // U+10D2: "გ" GEORGIAN LETTER GAN
+        /* 51 */ "\u10D0\u10D1\u10D2",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language kk: Kazakh */
+    private static final String[] LANGUAGE_kk = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~24 */
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* 25 */ "\u0449",
+        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 26 */ "\u044A",
+        // U+044B: "Ñ‹" CYRILLIC SMALL LETTER YERU
+        /* 27 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* 28 */ "\u044D",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* 29 */ "\u0438",
+        // U+04AF: "Ò¯" CYRILLIC SMALL LETTER STRAIGHT U
+        // U+04B1: "Ò±" CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+        /* 30 */ "\u04AF,\u04B1",
+        // U+049B: "Ò›" CYRILLIC SMALL LETTER KA WITH DESCENDER
+        /* 31 */ "\u049B",
+        // U+04A3: "Ò£" CYRILLIC SMALL LETTER EN WITH DESCENDER
+        /* 32 */ "\u04A3",
+        // U+0493: "Ò“" CYRILLIC SMALL LETTER GHE WITH STROKE
+        /* 33 */ "\u0493",
+        // U+0456: "Ñ–" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+        /* 34 */ "\u0456",
+        // U+04D9: "Ó™" CYRILLIC SMALL LETTER SCHWA
+        /* 35 */ "\u04D9",
+        // U+04E9: "Ó©" CYRILLIC SMALL LETTER BARRED O
+        /* 36 */ "\u04E9",
+        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 37 */ "\u044A",
+        // U+04BB: "Ò»" CYRILLIC SMALL LETTER SHHA
+        /* 38 */ "\u04BB",
+        /* 39~ */
+        null, null, null, null,
+        /* ~42 */
+        // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
+        /* 43 */ "\u0451",
+        /* 44~ */
+        null, null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+    };
+
+    /* Language km_KH: Khmer (Cambodia) */
+    private static final String[] LANGUAGE_km_KH = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+1780: "ក" KHMER LETTER KA
+        // U+1781: "ខ" KHMER LETTER KHA
+        // U+1782: "áž‚" KHMER LETTER KO
+        /* 51 */ "\u1780\u1781\u1782",
+        /* 52~ */
+        null, null, null, null,
+        /* ~55 */
+        // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
+        /* 56 */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
+    };
+
+    /* Language ky: Kirghiz */
+    private static final String[] LANGUAGE_ky = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~24 */
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* 25 */ "\u0449",
+        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 26 */ "\u044A",
+        // U+044B: "Ñ‹" CYRILLIC SMALL LETTER YERU
+        /* 27 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* 28 */ "\u044D",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* 29 */ "\u0438",
+        // U+04AF: "Ò¯" CYRILLIC SMALL LETTER STRAIGHT U
+        /* 30 */ "\u04AF",
+        /* 31 */ null,
+        // U+04A3: "Ò£" CYRILLIC SMALL LETTER EN WITH DESCENDER
+        /* 32 */ "\u04A3",
+        /* 33~ */
+        null, null, null,
+        /* ~35 */
+        // U+04E9: "Ó©" CYRILLIC SMALL LETTER BARRED O
+        /* 36 */ "\u04E9",
+        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null,
+        /* ~42 */
+        // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
+        /* 43 */ "\u0451",
+        /* 44~ */
+        null, null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+    };
+
+    /* Language lo_LA: Lao (Laos) */
+    private static final String[] LANGUAGE_lo_LA = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0E81: "ກ" LAO LETTER KO
+        // U+0E82: "ຂ" LAO LETTER KHO SUNG
+        // U+0E84: "ຄ" LAO LETTER KHO TAM
+        /* 51 */ "\u0E81\u0E82\u0E84",
+        /* 52~ */
+        null, null, null, null, null,
+        /* ~56 */
+        // U+20AD: "â‚­" KIP SIGN
+        /* 57 */ "\u20AD",
+    };
+
+    /* Language lt: Lithuanian */
+    private static final String[] LANGUAGE_lt = {
+        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 0 */ "\u0105,\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6",
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
+        /* 1 */ "\u0117,\u0119,\u0113,\u00E8,\u00E9,\u00EA,\u00EB,\u011B",
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* 2 */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        /* 4 */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
+        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u00E7,\u0107",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u010F",
+        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
+        /* 10 */ "\u0157,\u0159,\u0155",
+        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
+        /* 11 */ "\u0163,\u0165",
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        /* 12 */ "\u017E,\u017C,\u017A",
+        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
+        /* 13 */ "\u0137",
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
+        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
+        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u0123,\u011F",
+        /* 16~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language lv: Latvian */
+    private static final String[] LANGUAGE_lv = {
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
+        /* 0 */ "\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0105",
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
+        /* 1 */ "\u0113,\u0117,\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* 2 */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u0153,\u0151,\u00F8",
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        /* 4 */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171",
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
+        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u00E7,\u0107",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u010F",
+        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
+        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
+        /* 10 */ "\u0157,\u0159,\u0155",
+        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
+        /* 11 */ "\u0163,\u0165",
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        /* 12 */ "\u017E,\u017C,\u017A",
+        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
+        /* 13 */ "\u0137",
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
+        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
+        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u0123,\u011F",
+        /* 16~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language mk: Macedonian */
+    private static final String[] LANGUAGE_mk = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null,
+        /* ~38 */
+        // U+0455: "Ñ•" CYRILLIC SMALL LETTER DZE
+        /* 39 */ "\u0455",
+        // U+045C: "ќ" CYRILLIC SMALL LETTER KJE
+        /* 40 */ "\u045C",
+        // U+0437: "з" CYRILLIC SMALL LETTER ZE
+        /* 41 */ "\u0437",
+        // U+0453: "Ñ“" CYRILLIC SMALL LETTER GJE
+        /* 42 */ "\u0453",
+        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
+        /* 43 */ "\u0450",
+        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
+        /* 44 */ "\u045D",
+        /* 45~ */
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language mn_MN: Mongolian (Mongolia) */
+    private static final String[] LANGUAGE_mn_MN = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52~ */
+        null, null, null, null, null,
+        /* ~56 */
+        // U+20AE: "â‚®" TUGRIK SIGN
+        /* 57 */ "\u20AE",
+    };
+
+    /* Language nb: Norwegian Bokmål */
+    private static final String[] LANGUAGE_nb = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
+        /* 2 */ null,
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        /* 5~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~19 */
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        /* 20 */ "\u00E5",
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 21 */ "\u00F8",
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 22 */ "\u00E6",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 23 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 24 */ "\u00E4",
+        /* 25~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+    };
+
+    /* Language ne_NP: Nepali (Nepal) */
+    private static final String[] LANGUAGE_ne_NP = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0915: "क" DEVANAGARI LETTER KA
+        // U+0916: "ख" DEVANAGARI LETTER KHA
+        // U+0917: "ग" DEVANAGARI LETTER GA
+        /* 51 */ "\u0915\u0916\u0917",
+        /* 52~ */
+        null, null, null, null, null,
+        /* ~56 */
+        // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
+        /* 57 */ "\u0930\u0941.",
+        /* 58~ */
+        null, null, null, null, null, null, null, null, null, null, null,
+        /* ~68 */
+        // U+0967: "१" DEVANAGARI DIGIT ONE
+        /* 69 */ "\u0967",
+        // U+0968: "२" DEVANAGARI DIGIT TWO
+        /* 70 */ "\u0968",
+        // U+0969: "३" DEVANAGARI DIGIT THREE
+        /* 71 */ "\u0969",
+        // U+096A: "४" DEVANAGARI DIGIT FOUR
+        /* 72 */ "\u096A",
+        // U+096B: "५" DEVANAGARI DIGIT FIVE
+        /* 73 */ "\u096B",
+        // U+096C: "६" DEVANAGARI DIGIT SIX
+        /* 74 */ "\u096C",
+        // U+096D: "७" DEVANAGARI DIGIT SEVEN
+        /* 75 */ "\u096D",
+        // U+096E: "८" DEVANAGARI DIGIT EIGHT
+        /* 76 */ "\u096E",
+        // U+096F: "९" DEVANAGARI DIGIT NINE
+        /* 77 */ "\u096F",
+        // U+0966: "०" DEVANAGARI DIGIT ZERO
+        /* 78 */ "\u0966",
+        // Label for "switch to symbols" key.
+        /* 79 */ "?\u0967\u0968\u0969",
+        // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
+        // part because it'll be appended by the code.
+        /* 80 */ "\u0967\u0968\u0969",
+        /* 81 */ "1",
+        /* 82 */ "2",
+        /* 83 */ "3",
+        /* 84 */ "4",
+        /* 85 */ "5",
+        /* 86 */ "6",
+        /* 87 */ "7",
+        /* 88 */ "8",
+        /* 89 */ "9",
+        /* 90 */ "0",
+    };
+
+    /* Language nl: Dutch */
+    private static final String[] LANGUAGE_nl = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E1,\u00E4,\u00E2,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00EB,\u00EA,\u00E8,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
+        /* 5 */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        /* 7 */ null,
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 8 */ "\u0133",
+        /* 9~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+    };
+
+    /* Language pl: Polish */
+    private static final String[] LANGUAGE_pl = {
+        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u0105,\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113",
+        /* 2 */ null,
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
+        /* 4 */ null,
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u015B,\u00DF,\u0161",
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* 6 */ "\u0144,\u00F1",
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u0107,\u00E7,\u010D",
+        /* 8~ */
+        null, null, null, null,
+        /* ~11 */
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        /* 12 */ "\u017C,\u017A,\u017E",
+        /* 13 */ null,
+        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u0142",
+        /* 15~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+    };
+
+    /* Language pt: Portuguese */
+    private static final String[] LANGUAGE_pt = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E1,\u00E3,\u00E0,\u00E2,\u00E4,\u00E5,\u00E6,\u00AA",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        /* 1 */ "\u00E9,\u00EA,\u00E8,\u0119,\u0117,\u0113,\u00EB",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F3,\u00F5,\u00F4,\u00F2,\u00F6,\u0153,\u00F8,\u014D,\u00BA",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* 5 */ null,
+        /* 6 */ null,
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u00E7,\u010D,\u0107",
+    };
+
+    /* Language rm: Raeto-Romance */
+    private static final String[] LANGUAGE_rm = {
+        /* 0~ */
+        null, null, null,
+        /* ~2 */
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u0153,\u00F8",
+    };
+
+    /* Language ro: Romanian */
+    private static final String[] LANGUAGE_ro = {
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101",
+        /* 1 */ null,
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* 3 */ null,
+        /* 4 */ null,
+        // U+0219: "È™" LATIN SMALL LETTER S WITH COMMA BELOW
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u0219,\u00DF,\u015B,\u0161",
+        /* 6~ */
+        null, null, null, null, null,
+        /* ~10 */
+        // U+021B: "È›" LATIN SMALL LETTER T WITH COMMA BELOW
+        /* 11 */ "\u021B",
+        /* 12~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_rqm",
+        /* 53 */ "!text/double_9qm_rqm",
+    };
+
+    /* Language ru: Russian */
+    private static final String[] LANGUAGE_ru = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~24 */
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* 25 */ "\u0449",
+        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 26 */ "\u044A",
+        // U+044B: "Ñ‹" CYRILLIC SMALL LETTER YERU
+        /* 27 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* 28 */ "\u044D",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* 29 */ "\u0438",
+        /* 30~ */
+        null, null, null, null, null, null, null,
+        /* ~36 */
+        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null,
+        /* ~42 */
+        // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
+        /* 43 */ "\u0451",
+        /* 44~ */
+        null, null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language sk: Slovak */
+    private static final String[] LANGUAGE_sk = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
+        /* 0 */ "\u00E1,\u00E4,\u0101,\u00E0,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        /* 1 */ "\u00E9,\u011B,\u0113,\u0117,\u00E8,\u00EA,\u00EB,\u0119",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        /* 2 */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131",
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        /* 3 */ "\u00F4,\u00F3,\u00F6,\u00F2,\u00F5,\u0153,\u0151,\u00F8",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        /* 4 */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\u0171",
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
+        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
+        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u0148,\u0146,\u00F1,\u0144,\u0144",
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u00E7,\u0107",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u010F",
+        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
+        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
+        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
+        /* 10 */ "\u0155,\u0159,\u0157",
+        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
+        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
+        /* 11 */ "\u0165,\u0163",
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        /* 12 */ "\u017E,\u017C,\u017A",
+        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
+        /* 13 */ "\u0137",
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u013E,\u013A,\u013C,\u0142",
+        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
+        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u0123,\u011F",
+        /* 16~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language sl: Slovenian */
+    private static final String[] LANGUAGE_sl = {
+        /* 0~ */
+        null, null, null, null, null,
+        /* ~4 */
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u0161",
+        /* 6 */ null,
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* 7 */ "\u010D,\u0107",
+        /* 8 */ null,
+        // U+0111: "Ä‘" LATIN SMALL LETTER D WITH STROKE
+        /* 9 */ "\u0111",
+        /* 10 */ null,
+        /* 11 */ null,
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        /* 12 */ "\u017E",
+        /* 13~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null,
+        /* ~51 */
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language sr: Serbian */
+    private static final String[] LANGUAGE_sr = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null,
+        /* ~38 */
+        // TODO: Move these to sr-Latn once we can handle IETF language tag with script name specified.
+        // BEGIN: More keys definitions for Serbian (Latin)
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // <string name="more_keys_for_s">&#x0161;,&#x00DF;,&#x015B;</string>
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // <string name="more_keys_for_c">&#x010D;,&#x00E7;,&#x0107;</string>
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        // <string name="more_keys_for_d">&#x010F;</string>
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // <string name="more_keys_for_z">&#x017E;,&#x017A;,&#x017C;</string>
+        // END: More keys definitions for Serbian (Latin)
+        // BEGIN: More keys definitions for Serbian (Cyrillic)
+        // U+0437: "з" CYRILLIC SMALL LETTER ZE
+        /* 39 */ "\u0437",
+        // U+045B: "Ñ›" CYRILLIC SMALL LETTER TSHE
+        /* 40 */ "\u045B",
+        // U+0455: "Ñ•" CYRILLIC SMALL LETTER DZE
+        /* 41 */ "\u0455",
+        // U+0452: "Ñ’" CYRILLIC SMALL LETTER DJE
+        /* 42 */ "\u0452",
+        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
+        /* 43 */ "\u0450",
+        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
+        /* 44 */ "\u045D",
+        /* 45~ */
+        null, null, null, null, null, null,
+        /* ~50 */
+        // END: More keys definitions for Serbian (Cyrillic)
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language sv: Swedish */
+    private static final String[] LANGUAGE_sv = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        /* 0 */ "\u00E1,\u00E0,\u00E2,\u0105,\u00E3",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        /* 2 */ "\u00ED,\u00EC,\u00EE,\u00EF",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F3,\u00F2,\u00F4,\u00F5,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FC,\u00FA,\u00F9,\u00FB,\u016B",
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* 5 */ "\u015B,\u0161,\u015F,\u00DF",
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+        /* 6 */ "\u0144,\u00F1,\u0148",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        /* 8 */ "\u00FD,\u00FF,\u00FC",
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        /* 9 */ "\u00F0,\u010F",
+        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
+        /* 10 */ "\u0159",
+        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
+        // U+00FE: "þ" LATIN SMALL LETTER THORN
+        /* 11 */ "\u0165,\u00FE",
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        /* 12 */ "\u017A,\u017E,\u017C",
+        /* 13 */ null,
+        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u0142",
+        /* 15~ */
+        null, null, null, null, null,
+        /* ~19 */
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        /* 20 */ "\u00E5",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        /* 21 */ "\u00F6",
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        /* 22 */ "\u00E4",
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        /* 23 */ "\u00F8,\u0153",
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        /* 24 */ "\u00E6",
+        /* 25~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~53 */
+        /* 54 */ "!text/single_raqm_laqm",
+        /* 55 */ "!text/double_raqm_laqm",
+    };
+
+    /* Language sw: Swahili */
+    private static final String[] LANGUAGE_sw = {
+        // This is the same as English except more_keys_for_g.
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* 5 */ "\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* 6 */ "\u00F1",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        /* 7 */ "\u00E7",
+        /* 8~ */
+        null, null, null, null, null, null, null,
+        /* ~14 */
+        /* 15 */ "g\'",
+    };
+
+    /* Language th: Thai */
+    private static final String[] LANGUAGE_th = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0E01: "ก" THAI CHARACTER KO KAI
+        // U+0E02: "ข" THAI CHARACTER KHO KHAI
+        // U+0E04: "ค" THAI CHARACTER KHO KHWAI
+        /* 51 */ "\u0E01\u0E02\u0E04",
+        /* 52~ */
+        null, null, null, null, null,
+        /* ~56 */
+        // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT
+        /* 57 */ "\u0E3F",
+    };
+
+    /* Language tl: Tagalog */
+    private static final String[] LANGUAGE_tl = {
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
+        /* 5 */ null,
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        /* 6 */ "\u00F1,\u0144",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+    };
+
+    /* Language tr: Turkish */
+    private static final String[] LANGUAGE_tr = {
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        /* 0 */ "\u00E2",
+        /* 1 */ null,
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
+        /* 6 */ null,
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* 8~ */
+        null, null, null, null, null, null, null,
+        /* ~14 */
+        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u011F",
+    };
+
+    /* Language uk: Ukrainian */
+    private static final String[] LANGUAGE_uk = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~24 */
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* 25 */ "\u0449",
+        // U+0457: "Ñ—" CYRILLIC SMALL LETTER YI
+        /* 26 */ "\u0457",
+        // U+0456: "Ñ–" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+        /* 27 */ "\u0456",
+        // U+0454: "Ñ”" CYRILLIC SMALL LETTER UKRAINIAN IE
+        /* 28 */ "\u0454",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* 29 */ "\u0438",
+        /* 30~ */
+        null, null, null,
+        /* ~32 */
+        // U+0491: "Ò‘" CYRILLIC SMALL LETTER GHE WITH UPTURN
+        /* 33 */ "\u0491",
+        // U+0457: "Ñ—" CYRILLIC SMALL LETTER YI
+        /* 34 */ "\u0457",
+        /* 35 */ null,
+        /* 36 */ null,
+        // U+044A: "ÑŠ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~50 */
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
+        /* 51 */ "\u0410\u0411\u0412",
+        /* 52 */ "!text/single_9qm_lqm",
+        /* 53 */ "!text/double_9qm_lqm",
+        /* 54~ */
+        null, null, null,
+        /* ~56 */
+        // U+20B4: "â‚´" HRYVNIA SIGN
+        /* 57 */ "\u20B4",
+    };
+
+    /* Language vi: Vietnamese */
+    private static final String[] LANGUAGE_vi = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+1EA3: "ả" LATIN SMALL LETTER A WITH HOOK ABOVE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+1EA1: "ạ" LATIN SMALL LETTER A WITH DOT BELOW
+        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
+        // U+1EB1: "ằ" LATIN SMALL LETTER A WITH BREVE AND GRAVE
+        // U+1EAF: "ắ" LATIN SMALL LETTER A WITH BREVE AND ACUTE
+        // U+1EB3: "ẳ" LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+        // U+1EB5: "ẵ" LATIN SMALL LETTER A WITH BREVE AND TILDE
+        // U+1EB7: "ặ" LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+1EA7: "ầ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+        // U+1EA5: "ấ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+        // U+1EA9: "ẩ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+        // U+1EAB: "ẫ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+        // U+1EAD: "ậ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+        /* 0 */ "\u00E0,\u00E1,\u1EA3,\u00E3,\u1EA1,\u0103,\u1EB1,\u1EAF,\u1EB3,\u1EB5,\u1EB7,\u00E2,\u1EA7,\u1EA5,\u1EA9,\u1EAB,\u1EAD",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+1EBB: "ẻ" LATIN SMALL LETTER E WITH HOOK ABOVE
+        // U+1EBD: "ẽ" LATIN SMALL LETTER E WITH TILDE
+        // U+1EB9: "ẹ" LATIN SMALL LETTER E WITH DOT BELOW
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+1EC1: "ề" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+        // U+1EBF: "ế" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+        // U+1EC3: "ể" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+        // U+1EC5: "á»…" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+        // U+1EC7: "ệ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+        /* 1 */ "\u00E8,\u00E9,\u1EBB,\u1EBD,\u1EB9,\u00EA,\u1EC1,\u1EBF,\u1EC3,\u1EC5,\u1EC7",
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+1EC9: "ỉ" LATIN SMALL LETTER I WITH HOOK ABOVE
+        // U+0129: "Ä©" LATIN SMALL LETTER I WITH TILDE
+        // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW
+        /* 2 */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB",
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+1ECF: "ỏ" LATIN SMALL LETTER O WITH HOOK ABOVE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+1ECD: "ọ" LATIN SMALL LETTER O WITH DOT BELOW
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+1ED3: "ồ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+        // U+1ED1: "ố" LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+        // U+1ED5: "ổ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+        // U+1ED7: "á»—" LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+        // U+1ED9: "á»™" LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+        // U+01A1: "Æ¡" LATIN SMALL LETTER O WITH HORN
+        // U+1EDD: "ờ" LATIN SMALL LETTER O WITH HORN AND GRAVE
+        // U+1EDB: "á»›" LATIN SMALL LETTER O WITH HORN AND ACUTE
+        // U+1EDF: "ở" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+        // U+1EE1: "ỡ" LATIN SMALL LETTER O WITH HORN AND TILDE
+        // U+1EE3: "ợ" LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+        /* 3 */ "\u00F2,\u00F3,\u1ECF,\u00F5,\u1ECD,\u00F4,\u1ED3,\u1ED1,\u1ED5,\u1ED7,\u1ED9,\u01A1,\u1EDD,\u1EDB,\u1EDF,\u1EE1,\u1EE3",
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+1EE7: "ủ" LATIN SMALL LETTER U WITH HOOK ABOVE
+        // U+0169: "Å©" LATIN SMALL LETTER U WITH TILDE
+        // U+1EE5: "ụ" LATIN SMALL LETTER U WITH DOT BELOW
+        // U+01B0: "Æ°" LATIN SMALL LETTER U WITH HORN
+        // U+1EEB: "ừ" LATIN SMALL LETTER U WITH HORN AND GRAVE
+        // U+1EE9: "ứ" LATIN SMALL LETTER U WITH HORN AND ACUTE
+        // U+1EED: "á»­" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+        // U+1EEF: "ữ" LATIN SMALL LETTER U WITH HORN AND TILDE
+        // U+1EF1: "á»±" LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+        /* 4 */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1",
+        /* 5~ */
+        null, null, null,
+        /* ~7 */
+        // U+1EF3: "ỳ" LATIN SMALL LETTER Y WITH GRAVE
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+1EF7: "á»·" LATIN SMALL LETTER Y WITH HOOK ABOVE
+        // U+1EF9: "ỹ" LATIN SMALL LETTER Y WITH TILDE
+        // U+1EF5: "ỵ" LATIN SMALL LETTER Y WITH DOT BELOW
+        /* 8 */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5",
+        // U+0111: "Ä‘" LATIN SMALL LETTER D WITH STROKE
+        /* 9 */ "\u0111",
+        /* 10~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null,
+        /* ~56 */
+        // U+20AB: "â‚«" DONG SIGN
+        /* 57 */ "\u20AB",
+    };
+
+    /* Language zu: Zulu */
+    private static final String[] LANGUAGE_zu = {
+        // This is the same as English
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        /* 5 */ "\u00DF",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        /* 6 */ "\u00F1",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        /* 7 */ "\u00E7",
+    };
+
+    /* Language zz: Alphabet */
+    private static final String[] LANGUAGE_zz = {
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
+        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
+        // U+0105: "Ä…" LATIN SMALL LETTER A WITH OGONEK
+        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+        // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
+        // U+0115: "Ä•" LATIN SMALL LETTER E WITH BREVE
+        // U+0117: "Ä—" LATIN SMALL LETTER E WITH DOT ABOVE
+        // U+0119: "Ä™" LATIN SMALL LETTER E WITH OGONEK
+        // U+011B: "Ä›" LATIN SMALL LETTER E WITH CARON
+        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B",
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0129: "Ä©" LATIN SMALL LETTER I WITH TILDE
+        // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
+        // U+012D: "Ä­" LATIN SMALL LETTER I WITH BREVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        // U+014F: "ŏ" LATIN SMALL LETTER O WITH BREVE
+        // U+0151: "Å‘" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        // U+0153: "Å“" LATIN SMALL LIGATURE OE
+        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA",
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+0169: "Å©" LATIN SMALL LETTER U WITH TILDE
+        // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
+        // U+016D: "Å­" LATIN SMALL LETTER U WITH BREVE
+        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173",
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "Å›" LATIN SMALL LETTER S WITH ACUTE
+        // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
+        // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
+        // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
+        // U+017F: "Å¿" LATIN SMALL LETTER LONG S
+        /* 5 */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F",
+        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+        // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
+        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+        // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+        // U+014B: "Å‹" LATIN SMALL LETTER ENG
+        /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
+        // U+010B: "Ä‹" LATIN SMALL LETTER C WITH DOT ABOVE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
+        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+        // U+0177: "Å·" LATIN SMALL LETTER Y WITH CIRCUMFLEX
+        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+        // U+0133: "ij" LATIN SMALL LIGATURE IJ
+        /* 8 */ "\u00FD,\u0177,\u00FF,\u0133",
+        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+        // U+0111: "Ä‘" LATIN SMALL LETTER D WITH STROKE
+        // U+00F0: "ð" LATIN SMALL LETTER ETH
+        /* 9 */ "\u010F,\u0111,\u00F0",
+        // U+0155: "Å•" LATIN SMALL LETTER R WITH ACUTE
+        // U+0157: "Å—" LATIN SMALL LETTER R WITH CEDILLA
+        // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
+        /* 10 */ "\u0155,\u0157,\u0159",
+        // U+00FE: "þ" LATIN SMALL LETTER THORN
+        // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
+        // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
+        // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
+        /* 11 */ "\u00FE,\u0163,\u0165,\u0167",
+        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        /* 12 */ "\u017A,\u017C,\u017E",
+        // U+0137: "Ä·" LATIN SMALL LETTER K WITH CEDILLA
+        // U+0138: "ĸ" LATIN SMALL LETTER KRA
+        /* 13 */ "\u0137,\u0138",
+        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+        // U+0140: "Å€" LATIN SMALL LETTER L WITH MIDDLE DOT
+        // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
+        /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
+        // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
+        // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
+        // U+0121: "Ä¡" LATIN SMALL LETTER G WITH DOT ABOVE
+        // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
+        /* 15 */ "\u011D,\u011F,\u0121,\u0123",
+        /* 16 */ null,
+        // U+0125: "Ä¥" LATIN SMALL LETTER H WITH CIRCUMFLEX
+        /* 17 */ "\u0125",
+        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
+        /* 18 */ "\u0135",
+        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
+        /* 19 */ "\u0175",
+    };
+
+    // TODO: Use the language + "_" + region representation for the locale string key.
+    // Currently we are dropping the region from the key.
+    private static final Object[] LANGUAGES_AND_TEXTS = {
+        "DEFAULT", LANGUAGE_DEFAULT, /* default */
+        "af", LANGUAGE_af, /* Afrikaans */
+        "ar", LANGUAGE_ar, /* Arabic */
+        "az" /* "az_AZ" */, LANGUAGE_az_AZ, /* Azerbaijani (Azerbaijan) */
+        "be" /* "be_BY" */, LANGUAGE_be_BY, /* Belarusian (Belarus) */
+        "bg", LANGUAGE_bg, /* Bulgarian */
+        "ca", LANGUAGE_ca, /* Catalan */
+        "cs", LANGUAGE_cs, /* Czech */
+        "da", LANGUAGE_da, /* Danish */
+        "de", LANGUAGE_de, /* German */
+        "el", LANGUAGE_el, /* Greek */
+        "en", LANGUAGE_en, /* English */
+        "eo", LANGUAGE_eo, /* Esperanto */
+        "es", LANGUAGE_es, /* Spanish */
+        "et" /* "et_EE" */, LANGUAGE_et_EE, /* Estonian (Estonia) */
+        "fa", LANGUAGE_fa, /* Persian */
+        "fi", LANGUAGE_fi, /* Finnish */
+        "fr", LANGUAGE_fr, /* French */
+        "hi", LANGUAGE_hi, /* Hindi */
+        "hr", LANGUAGE_hr, /* Croatian */
+        "hu", LANGUAGE_hu, /* Hungarian */
+        "hy" /* "hy_AM" */, LANGUAGE_hy_AM, /* Armenian (Armenia) */
+        "is", LANGUAGE_is, /* Icelandic */
+        "it", LANGUAGE_it, /* Italian */
+        "iw", LANGUAGE_iw, /* Hebrew */
+        "ka" /* "ka_GE" */, LANGUAGE_ka_GE, /* Georgian (Georgia) */
+        "kk", LANGUAGE_kk, /* Kazakh */
+        "km" /* "km_KH" */, LANGUAGE_km_KH, /* Khmer (Cambodia) */
+        "ky", LANGUAGE_ky, /* Kirghiz */
+        "lo" /* "lo_LA" */, LANGUAGE_lo_LA, /* Lao (Laos) */
+        "lt", LANGUAGE_lt, /* Lithuanian */
+        "lv", LANGUAGE_lv, /* Latvian */
+        "mk", LANGUAGE_mk, /* Macedonian */
+        "mn" /* "mn_MN" */, LANGUAGE_mn_MN, /* Mongolian (Mongolia) */
+        "nb", LANGUAGE_nb, /* Norwegian Bokmål */
+        "ne" /* "ne_NP" */, LANGUAGE_ne_NP, /* Nepali (Nepal) */
+        "nl", LANGUAGE_nl, /* Dutch */
+        "pl", LANGUAGE_pl, /* Polish */
+        "pt", LANGUAGE_pt, /* Portuguese */
+        "rm", LANGUAGE_rm, /* Raeto-Romance */
+        "ro", LANGUAGE_ro, /* Romanian */
+        "ru", LANGUAGE_ru, /* Russian */
+        "sk", LANGUAGE_sk, /* Slovak */
+        "sl", LANGUAGE_sl, /* Slovenian */
+        "sr", LANGUAGE_sr, /* Serbian */
+        "sv", LANGUAGE_sv, /* Swedish */
+        "sw", LANGUAGE_sw, /* Swahili */
+        "th", LANGUAGE_th, /* Thai */
+        "tl", LANGUAGE_tl, /* Tagalog */
+        "tr", LANGUAGE_tr, /* Turkish */
+        "uk", LANGUAGE_uk, /* Ukrainian */
+        "vi", LANGUAGE_vi, /* Vietnamese */
+        "zu", LANGUAGE_zu, /* Zulu */
+        "zz", LANGUAGE_zz, /* Alphabet */
+    };
+
+    static {
+        for (int index = 0; index < NAMES.length; index++) {
+            sNameToIndexesMap.put(NAMES[index], index);
+        }
+
+        for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
+            final String language = (String)LANGUAGES_AND_TEXTS[i];
+            final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
+            sLanguageToTextsMap.put(language, texts);
+        }
+    }
+}
diff --git a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
deleted file mode 100644
index 7a6284f69efe41f7c4e9ab243c1b536e926aa0a4..0000000000000000000000000000000000000000
--- a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.inputmethod.keyboard.internal;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.text.TextUtils;
-
-import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.latin.Constants;
-import com.android.inputmethod.latin.utils.CollectionUtils;
-
-import java.util.HashMap;
-import java.util.Locale;
-
-/**
- * !!!!! DO NOT EDIT THIS FILE !!!!!
- *
- * This file is generated by tools/make-keyboard-text. The base template file is
- *   tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
- *
- * This file must be updated when any text resources in keyboard layout files have been changed.
- * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions,
- * and should be defined in
- *   tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml
- *
- * To update this file, please run the following commands.
- *   $ cd $ANDROID_BUILD_TOP
- *   $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text
- *   $ make-keyboard-text -java packages/inputmethods/LatinIME/java/src
- *
- * The updated source file will be generated to the following path (this file).
- *   packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/
- *   KeyboardTextsSet.java
- */
-public final class KeyboardTextsSet {
-    public static final String PREFIX_TEXT = "!text/";
-    private static final char BACKSLASH = Constants.CODE_BACKSLASH;
-    private static final int MAX_STRING_REFERENCE_INDIRECTION = 10;
-
-    // Language to texts map.
-    private static final HashMap<String, String[]> sLanguageToTextsMap =
-            CollectionUtils.newHashMap();
-    private static final HashMap<String, Integer> sNameToIdsMap = CollectionUtils.newHashMap();
-
-    private String[] mTexts;
-    // Resource name to text map.
-    private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap();
-
-    public void setLocale(final Locale locale) {
-        final String language = locale.getLanguage();
-        mTexts = sLanguageToTextsMap.get(language);
-        if (mTexts == null) {
-            mTexts = LANGUAGE_DEFAULT;
-        }
-    }
-
-    public void loadStringResources(final Context context) {
-        final int referenceId = context.getApplicationInfo().labelRes;
-        loadStringResourcesInternal(context, RESOURCE_NAMES, referenceId);
-    }
-
-    @UsedForTesting
-    void loadStringResourcesInternal(final Context context, final String[] resourceNames,
-            final int referenceId) {
-        final Resources res = context.getResources();
-        final String packageName = res.getResourcePackageName(referenceId);
-        for (final String resName : resourceNames) {
-            final int resId = res.getIdentifier(resName, "string", packageName);
-            mResourceNameToTextsMap.put(resName, res.getString(resId));
-        }
-    }
-
-    public String getText(final String name) {
-        String text = mResourceNameToTextsMap.get(name);
-        if (text != null) {
-            return text;
-        }
-        final Integer id = sNameToIdsMap.get(name);
-        if (id == null) throw new RuntimeException("Unknown label: " + name);
-        text = (id < mTexts.length) ? mTexts[id] : null;
-        return (text == null) ? LANGUAGE_DEFAULT[id] : text;
-    }
-
-    private static int searchTextNameEnd(final String text, final int start) {
-        final int size = text.length();
-        for (int pos = start; pos < size; pos++) {
-            final char c = text.charAt(pos);
-            // Label name should be consisted of [a-zA-Z_0-9].
-            if ((c >= 'a' && c <= 'z') || c == '_' || (c >= '0' && c <= '9')) {
-                continue;
-            }
-            return pos;
-        }
-        return size;
-    }
-
-    public String resolveTextReference(final String rawText) {
-        if (TextUtils.isEmpty(rawText)) {
-            return null;
-        }
-        int level = 0;
-        String text = rawText;
-        StringBuilder sb;
-        do {
-            level++;
-            if (level >= MAX_STRING_REFERENCE_INDIRECTION) {
-                throw new RuntimeException("too many @string/resource indirection: " + text);
-            }
-
-            final int prefixLen = PREFIX_TEXT.length();
-            final int size = text.length();
-            if (size < prefixLen) {
-                return TextUtils.isEmpty(text) ? null : text;
-            }
-
-            sb = null;
-            for (int pos = 0; pos < size; pos++) {
-                final char c = text.charAt(pos);
-                if (text.startsWith(PREFIX_TEXT, pos)) {
-                    if (sb == null) {
-                        sb = new StringBuilder(text.substring(0, pos));
-                    }
-                    final int end = searchTextNameEnd(text, pos + prefixLen);
-                    final String name = text.substring(pos + prefixLen, end);
-                    sb.append(getText(name));
-                    pos = end - 1;
-                } else if (c == BACKSLASH) {
-                    if (sb != null) {
-                        // Append both escape character and escaped character.
-                        sb.append(text.substring(pos, Math.min(pos + 2, size)));
-                    }
-                    pos++;
-                } else if (sb != null) {
-                    sb.append(c);
-                }
-            }
-
-            if (sb != null) {
-                text = sb.toString();
-            }
-        } while (sb != null);
-        return TextUtils.isEmpty(text) ? null : text;
-    }
-
-    // These texts' name should be aligned with the @string/<name> in
-    // values*/strings-action-keys.xml.
-    private static final String[] RESOURCE_NAMES = {
-        // Labels for action.
-        "label_go_key",
-        "label_send_key",
-        "label_next_key",
-        "label_done_key",
-        "label_previous_key",
-        // Other labels.
-        "label_pause_key",
-        "label_wait_key",
-    };
-
-    private static final String[] NAMES = {
-        /* @NAMES@ */
-    };
-
-    private static final String EMPTY = "";
-
-    /* Default texts */
-    private static final String[] LANGUAGE_DEFAULT = {
-        /* @DEFAULT_TEXTS@ */
-    };
-
-    /* @TEXTS@ */
-    // TODO: Use the language + "_" + region representation for the locale string key.
-    // Currently we are dropping the region from the key.
-    private static final Object[] LANGUAGES_AND_TEXTS = {
-        /* @LANGUAGES_AND_TEXTS@ */
-    };
-
-    static {
-        int id = 0;
-        for (final String name : NAMES) {
-            sNameToIdsMap.put(name, id++);
-        }
-
-        for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
-            final String language = (String)LANGUAGES_AND_TEXTS[i];
-            final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
-            sLanguageToTextsMap.put(language, texts);
-        }
-    }
-}
diff --git a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
new file mode 100644
index 0000000000000000000000000000000000000000..d95de292397fbe9db8725d25b856e0a00036b49b
--- /dev/null
+++ b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.internal;
+
+import com.android.inputmethod.latin.utils.CollectionUtils;
+
+import java.util.HashMap;
+
+/**
+ * !!!!! DO NOT EDIT THIS FILE !!!!!
+ *
+ * This file is generated by tools/make-keyboard-text. The base template file is
+ *   tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
+ *
+ * This file must be updated when any text resources in keyboard layout files have been changed.
+ * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions,
+ * and should be defined in
+ *   tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml
+ *
+ * To update this file, please run the following commands.
+ *   $ cd $ANDROID_BUILD_TOP
+ *   $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text
+ *   $ make-keyboard-text -java packages/inputmethods/LatinIME/java/src
+ *
+ * The updated source file will be generated to the following path (this file).
+ *   packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/
+ *   KeyboardTextsTable.java
+ */
+public final class KeyboardTextsTable {
+    // Name to index map.
+    private static final HashMap<String, Integer> sNameToIndexesMap = CollectionUtils.newHashMap();
+    // Language to texts map.
+    private static final HashMap<String, String[]> sLanguageToTextsMap =
+            CollectionUtils.newHashMap();
+
+    public static String getText(final String name, final String[] textsTable) {
+        final Integer indexObj = sNameToIndexesMap.get(name);
+        if (indexObj == null) {
+            throw new RuntimeException("Unknown text name: " + name);
+        }
+        final int index = indexObj;
+        final String text = (index < textsTable.length) ? textsTable[index] : null;
+        return (text != null) ? text : LANGUAGE_DEFAULT[index];
+    }
+
+    public static String[] getTextsTable(final String language) {
+        final String[] textsTable = sLanguageToTextsMap.get(language);
+        return textsTable != null ? textsTable : LANGUAGE_DEFAULT;
+    }
+
+    private static final String[] NAMES = {
+        /* @NAMES@ */
+    };
+
+    private static final String EMPTY = "";
+
+    /* Default texts */
+    private static final String[] LANGUAGE_DEFAULT = {
+        /* @DEFAULT_TEXTS@ */
+    };
+
+    /* @TEXTS@ */
+    // TODO: Use the language + "_" + region representation for the locale string key.
+    // Currently we are dropping the region from the key.
+    private static final Object[] LANGUAGES_AND_TEXTS = {
+        /* @LANGUAGES_AND_TEXTS@ */
+    };
+
+    static {
+        for (int index = 0; index < NAMES.length; index++) {
+            sNameToIndexesMap.put(NAMES[index], index);
+        }
+
+        for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
+            final String language = (String)LANGUAGES_AND_TEXTS[i];
+            final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
+            sLanguageToTextsMap.put(language, texts);
+        }
+    }
+}
diff --git a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
index a88383025f72ad397049ead9d7c02bb639caad99..dddb3d6c8a96a39e69ba335641e397c35bd7dc2f 100644
--- a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
+++ b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
@@ -32,7 +32,7 @@ import java.util.jar.JarFile;
 public class MoreKeysResources {
     private static final String TEXT_RESOURCE_NAME = "donottranslate-more-keys.xml";
 
-    private static final String JAVA_TEMPLATE = "KeyboardTextsSet.tmpl";
+    private static final String JAVA_TEMPLATE = "KeyboardTextsTable.tmpl";
     private static final String MARK_NAMES = "@NAMES@";
     private static final String MARK_DEFAULT_TEXTS = "@DEFAULT_TEXTS@";
     private static final String MARK_TEXTS = "@TEXTS@";