Home | History | Annotate | Download | only in internal
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.inputmethod.keyboard.internal;
     18 
     19 import android.content.Context;
     20 import android.content.res.Resources;
     21 
     22 import com.android.inputmethod.annotations.UsedForTesting;
     23 import com.android.inputmethod.latin.utils.CollectionUtils;
     24 
     25 import java.util.HashMap;
     26 
     27 /**
     28  * !!!!! DO NOT EDIT THIS FILE !!!!!
     29  *
     30  * This file is generated by tools/make-keyboard-text. The base template file is
     31  *   tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
     32  *
     33  * This file must be updated when any text resources in keyboard layout files have been changed.
     34  * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions,
     35  * and should be defined in
     36  *   tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml
     37  *
     38  * To update this file, please run the following commands.
     39  *   $ cd $ANDROID_BUILD_TOP
     40  *   $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text
     41  *   $ make-keyboard-text -java packages/inputmethods/LatinIME/java/src
     42  *
     43  * The updated source file will be generated to the following path (this file).
     44  *   packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/
     45  *   KeyboardTextsSet.java
     46  */
     47 public final class KeyboardTextsSet {
     48     // Language to texts map.
     49     private static final HashMap<String, String[]> sLocaleToTextsMap = CollectionUtils.newHashMap();
     50     private static final HashMap<String, Integer> sNameToIdsMap = CollectionUtils.newHashMap();
     51 
     52     private String[] mTexts;
     53     // Resource name to text map.
     54     private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap();
     55 
     56     public void setLanguage(final String language) {
     57         mTexts = sLocaleToTextsMap.get(language);
     58         if (mTexts == null) {
     59             mTexts = LANGUAGE_DEFAULT;
     60         }
     61     }
     62 
     63     public void loadStringResources(final Context context) {
     64         final int referenceId = context.getApplicationInfo().labelRes;
     65         loadStringResourcesInternal(context, RESOURCE_NAMES, referenceId);
     66     }
     67 
     68     @UsedForTesting
     69     void loadStringResourcesInternal(final Context context, final String[] resourceNames,
     70             final int referenceId) {
     71         final Resources res = context.getResources();
     72         final String packageName = res.getResourcePackageName(referenceId);
     73         for (final String resName : resourceNames) {
     74             final int resId = res.getIdentifier(resName, "string", packageName);
     75             mResourceNameToTextsMap.put(resName, res.getString(resId));
     76         }
     77     }
     78 
     79     public String getText(final String name) {
     80         String text = mResourceNameToTextsMap.get(name);
     81         if (text != null) {
     82             return text;
     83         }
     84         final Integer id = sNameToIdsMap.get(name);
     85         if (id == null) throw new RuntimeException("Unknown label: " + name);
     86         text = (id < mTexts.length) ? mTexts[id] : null;
     87         return (text == null) ? LANGUAGE_DEFAULT[id] : text;
     88     }
     89 
     90     private static final String[] RESOURCE_NAMES = {
     91         // These texts' name should be aligned with the @string/<name> in values/strings.xml.
     92         // Labels for action.
     93         "label_go_key",
     94         // "label_search_key",
     95         "label_send_key",
     96         "label_next_key",
     97         "label_done_key",
     98         "label_previous_key",
     99         // Other labels.
    100         "label_pause_key",
    101         "label_wait_key",
    102     };
    103 
    104     private static final String[] NAMES = {
    105         /*  0 */ "more_keys_for_a",
    106         /*  1 */ "more_keys_for_e",
    107         /*  2 */ "more_keys_for_i",
    108         /*  3 */ "more_keys_for_o",
    109         /*  4 */ "more_keys_for_u",
    110         /*  5 */ "more_keys_for_s",
    111         /*  6 */ "more_keys_for_n",
    112         /*  7 */ "more_keys_for_c",
    113         /*  8 */ "more_keys_for_y",
    114         /*  9 */ "more_keys_for_d",
    115         /* 10 */ "more_keys_for_r",
    116         /* 11 */ "more_keys_for_t",
    117         /* 12 */ "more_keys_for_z",
    118         /* 13 */ "more_keys_for_k",
    119         /* 14 */ "more_keys_for_l",
    120         /* 15 */ "more_keys_for_g",
    121         /* 16 */ "more_keys_for_v",
    122         /* 17 */ "more_keys_for_h",
    123         /* 18 */ "more_keys_for_j",
    124         /* 19 */ "more_keys_for_w",
    125         /* 20 */ "keylabel_for_nordic_row1_11",
    126         /* 21 */ "keylabel_for_nordic_row2_10",
    127         /* 22 */ "keylabel_for_nordic_row2_11",
    128         /* 23 */ "more_keys_for_nordic_row2_10",
    129         /* 24 */ "more_keys_for_nordic_row2_11",
    130         /* 25 */ "keylabel_for_east_slavic_row1_9",
    131         /* 26 */ "keylabel_for_east_slavic_row1_12",
    132         /* 27 */ "keylabel_for_east_slavic_row2_1",
    133         /* 28 */ "keylabel_for_east_slavic_row2_11",
    134         /* 29 */ "keylabel_for_east_slavic_row3_5",
    135         /* 30 */ "more_keys_for_cyrillic_u",
    136         /* 31 */ "more_keys_for_cyrillic_ka",
    137         /* 32 */ "more_keys_for_cyrillic_en",
    138         /* 33 */ "more_keys_for_cyrillic_ghe",
    139         /* 34 */ "more_keys_for_east_slavic_row2_1",
    140         /* 35 */ "more_keys_for_cyrillic_a",
    141         /* 36 */ "more_keys_for_cyrillic_o",
    142         /* 37 */ "more_keys_for_cyrillic_soft_sign",
    143         /* 38 */ "more_keys_for_east_slavic_row2_11",
    144         /* 39 */ "keylabel_for_south_slavic_row1_6",
    145         /* 40 */ "keylabel_for_south_slavic_row2_11",
    146         /* 41 */ "keylabel_for_south_slavic_row3_1",
    147         /* 42 */ "keylabel_for_south_slavic_row3_8",
    148         /* 43 */ "more_keys_for_cyrillic_ie",
    149         /* 44 */ "more_keys_for_cyrillic_i",
    150         /* 45 */ "label_to_alpha_key",
    151         /* 46 */ "single_quotes",
    152         /* 47 */ "double_quotes",
    153         /* 48 */ "single_angle_quotes",
    154         /* 49 */ "double_angle_quotes",
    155         /* 50 */ "more_keys_for_currency_dollar",
    156         /* 51 */ "keylabel_for_currency",
    157         /* 52 */ "more_keys_for_currency",
    158         /* 53 */ "more_keys_for_punctuation",
    159         /* 54 */ "more_keys_for_star",
    160         /* 55 */ "more_keys_for_bullet",
    161         /* 56 */ "more_keys_for_plus",
    162         /* 57 */ "more_keys_for_left_parenthesis",
    163         /* 58 */ "more_keys_for_right_parenthesis",
    164         /* 59 */ "more_keys_for_less_than",
    165         /* 60 */ "more_keys_for_greater_than",
    166         /* 61 */ "more_keys_for_arabic_diacritics",
    167         /* 62 */ "keyhintlabel_for_arabic_diacritics",
    168         /* 63 */ "keylabel_for_symbols_1",
    169         /* 64 */ "keylabel_for_symbols_2",
    170         /* 65 */ "keylabel_for_symbols_3",
    171         /* 66 */ "keylabel_for_symbols_4",
    172         /* 67 */ "keylabel_for_symbols_5",
    173         /* 68 */ "keylabel_for_symbols_6",
    174         /* 69 */ "keylabel_for_symbols_7",
    175         /* 70 */ "keylabel_for_symbols_8",
    176         /* 71 */ "keylabel_for_symbols_9",
    177         /* 72 */ "keylabel_for_symbols_0",
    178         /* 73 */ "label_to_symbol_key",
    179         /* 74 */ "label_to_symbol_with_microphone_key",
    180         /* 75 */ "additional_more_keys_for_symbols_1",
    181         /* 76 */ "additional_more_keys_for_symbols_2",
    182         /* 77 */ "additional_more_keys_for_symbols_3",
    183         /* 78 */ "additional_more_keys_for_symbols_4",
    184         /* 79 */ "additional_more_keys_for_symbols_5",
    185         /* 80 */ "additional_more_keys_for_symbols_6",
    186         /* 81 */ "additional_more_keys_for_symbols_7",
    187         /* 82 */ "additional_more_keys_for_symbols_8",
    188         /* 83 */ "additional_more_keys_for_symbols_9",
    189         /* 84 */ "additional_more_keys_for_symbols_0",
    190         /* 85 */ "more_keys_for_symbols_1",
    191         /* 86 */ "more_keys_for_symbols_2",
    192         /* 87 */ "more_keys_for_symbols_3",
    193         /* 88 */ "more_keys_for_symbols_4",
    194         /* 89 */ "more_keys_for_symbols_5",
    195         /* 90 */ "more_keys_for_symbols_6",
    196         /* 91 */ "more_keys_for_symbols_7",
    197         /* 92 */ "more_keys_for_symbols_8",
    198         /* 93 */ "more_keys_for_symbols_9",
    199         /* 94 */ "more_keys_for_symbols_0",
    200         /* 95 */ "keylabel_for_comma",
    201         /* 96 */ "more_keys_for_comma",
    202         /* 97 */ "keylabel_for_symbols_question",
    203         /* 98 */ "keylabel_for_symbols_semicolon",
    204         /* 99 */ "keylabel_for_symbols_percent",
    205         /* 100 */ "more_keys_for_symbols_exclamation",
    206         /* 101 */ "more_keys_for_symbols_question",
    207         /* 102 */ "more_keys_for_symbols_semicolon",
    208         /* 103 */ "more_keys_for_symbols_percent",
    209         /* 104 */ "keylabel_for_tablet_comma",
    210         /* 105 */ "keyhintlabel_for_tablet_comma",
    211         /* 106 */ "more_keys_for_tablet_comma",
    212         /* 107 */ "keyhintlabel_for_period",
    213         /* 108 */ "more_keys_for_period",
    214         /* 109 */ "keylabel_for_apostrophe",
    215         /* 110 */ "keyhintlabel_for_apostrophe",
    216         /* 111 */ "more_keys_for_apostrophe",
    217         /* 112 */ "more_keys_for_q",
    218         /* 113 */ "more_keys_for_x",
    219         /* 114 */ "keylabel_for_q",
    220         /* 115 */ "keylabel_for_w",
    221         /* 116 */ "keylabel_for_y",
    222         /* 117 */ "keylabel_for_x",
    223         /* 118 */ "keylabel_for_spanish_row2_10",
    224         /* 119 */ "more_keys_for_am_pm",
    225         /* 120 */ "settings_as_more_key",
    226         /* 121 */ "shortcut_as_more_key",
    227         /* 122 */ "action_next_as_more_key",
    228         /* 123 */ "action_previous_as_more_key",
    229         /* 124 */ "label_to_more_symbol_key",
    230         /* 125 */ "label_to_more_symbol_for_tablet_key",
    231         /* 126 */ "label_tab_key",
    232         /* 127 */ "label_to_phone_numeric_key",
    233         /* 128 */ "label_to_phone_symbols_key",
    234         /* 129 */ "label_time_am",
    235         /* 130 */ "label_time_pm",
    236         /* 131 */ "keylabel_for_popular_domain",
    237         /* 132 */ "more_keys_for_popular_domain",
    238         /* 133 */ "more_keys_for_smiley",
    239         /* 134 */ "single_laqm_raqm",
    240         /* 135 */ "single_laqm_raqm_rtl",
    241         /* 136 */ "single_raqm_laqm",
    242         /* 137 */ "double_laqm_raqm",
    243         /* 138 */ "double_laqm_raqm_rtl",
    244         /* 139 */ "double_raqm_laqm",
    245         /* 140 */ "single_lqm_rqm",
    246         /* 141 */ "single_9qm_lqm",
    247         /* 142 */ "single_9qm_rqm",
    248         /* 143 */ "double_lqm_rqm",
    249         /* 144 */ "double_9qm_lqm",
    250         /* 145 */ "double_9qm_rqm",
    251         /* 146 */ "more_keys_for_single_quote",
    252         /* 147 */ "more_keys_for_double_quote",
    253         /* 148 */ "more_keys_for_tablet_double_quote",
    254         /* 149 */ "emoji_key_as_more_key",
    255     };
    256 
    257     private static final String EMPTY = "";
    258 
    259     /* Default texts */
    260     private static final String[] LANGUAGE_DEFAULT = {
    261         /* 0~ */
    262         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    263         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    264         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    265         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    266         /* ~44 */
    267         // Label for "switch to alphabetic" key.
    268         /* 45 */ "ABC",
    269         /* 46 */ "!text/single_lqm_rqm",
    270         /* 47 */ "!text/double_lqm_rqm",
    271         /* 48 */ "!text/single_laqm_raqm",
    272         /* 49 */ "!text/double_laqm_raqm",
    273         // U+00A2: "" CENT SIGN
    274         // U+00A3: "" POUND SIGN
    275         // U+20AC: "" EURO SIGN
    276         // U+00A5: "" YEN SIGN
    277         // U+20B1: "" PESO SIGN
    278         /* 50 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
    279         /* 51 */ "$",
    280         /* 52 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
    281         /* 53 */ "!fixedColumnOrder!4,#,!,\\,,?,-,:,',@",
    282         // U+2020: "" DAGGER
    283         // U+2021: "" DOUBLE DAGGER
    284         // U+2605: "" BLACK STAR
    285         /* 54 */ "\u2020,\u2021,\u2605",
    286         // U+266A: "" EIGHTH NOTE
    287         // U+2665: "" BLACK HEART SUIT
    288         // U+2660: "" BLACK SPADE SUIT
    289         // U+2666: "" BLACK DIAMOND SUIT
    290         // U+2663: "" BLACK CLUB SUIT
    291         /* 55 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
    292         // U+00B1: "" PLUS-MINUS SIGN
    293         /* 56 */ "\u00B1",
    294         // The all letters need to be mirrored are found at
    295         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
    296         /* 57 */ "!fixedColumnOrder!3,<,{,[",
    297         /* 58 */ "!fixedColumnOrder!3,>,},]",
    298         // U+2039: "" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
    299         // U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
    300         // U+2264: "" LESS-THAN OR EQUAL TO
    301         // U+2265: "" GREATER-THAN EQUAL TO
    302         // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    303         // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
    304         /* 59 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
    305         /* 60 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
    306         /* 61 */ EMPTY,
    307         /* 62 */ EMPTY,
    308         /* 63 */ "1",
    309         /* 64 */ "2",
    310         /* 65 */ "3",
    311         /* 66 */ "4",
    312         /* 67 */ "5",
    313         /* 68 */ "6",
    314         /* 69 */ "7",
    315         /* 70 */ "8",
    316         /* 71 */ "9",
    317         /* 72 */ "0",
    318         // Label for "switch to symbols" key.
    319         /* 73 */ "?123",
    320         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
    321         // part because it'll be appended by the code.
    322         /* 74 */ "123",
    323         /* 75~ */
    324         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    325         /* ~84 */
    326         // U+00B9: "" SUPERSCRIPT ONE
    327         // U+00BD: "" VULGAR FRACTION ONE HALF
    328         // U+2153: "" VULGAR FRACTION ONE THIRD
    329         // U+00BC: "" VULGAR FRACTION ONE QUARTER
    330         // U+215B: "" VULGAR FRACTION ONE EIGHTH
    331         /* 85 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
    332         // U+00B2: "" SUPERSCRIPT TWO
    333         // U+2154: "" VULGAR FRACTION TWO THIRDS
    334         /* 86 */ "\u00B2,\u2154",
    335         // U+00B3: "" SUPERSCRIPT THREE
    336         // U+00BE: "" VULGAR FRACTION THREE QUARTERS
    337         // U+215C: "" VULGAR FRACTION THREE EIGHTHS
    338         /* 87 */ "\u00B3,\u00BE,\u215C",
    339         // U+2074: "" SUPERSCRIPT FOUR
    340         /* 88 */ "\u2074",
    341         // U+215D: "" VULGAR FRACTION FIVE EIGHTHS
    342         /* 89 */ "\u215D",
    343         /* 90 */ EMPTY,
    344         // U+215E: "" VULGAR FRACTION SEVEN EIGHTHS
    345         /* 91 */ "\u215E",
    346         /* 92 */ EMPTY,
    347         /* 93 */ EMPTY,
    348         // U+207F: "" SUPERSCRIPT LATIN SMALL LETTER N
    349         // U+2205: "" EMPTY SET
    350         /* 94 */ "\u207F,\u2205",
    351         /* 95 */ ",",
    352         /* 96 */ EMPTY,
    353         /* 97 */ "?",
    354         /* 98 */ ";",
    355         /* 99 */ "%",
    356         // U+00A1: "" INVERTED EXCLAMATION MARK
    357         /* 100 */ "\u00A1",
    358         // U+00BF: "" INVERTED QUESTION MARK
    359         /* 101 */ "\u00BF",
    360         /* 102 */ EMPTY,
    361         // U+2030: "" PER MILLE SIGN
    362         /* 103 */ "\u2030",
    363         /* 104 */ ",",
    364         /* 105~ */
    365         EMPTY, EMPTY, EMPTY,
    366         /* ~107 */
    367         // U+2026: "" HORIZONTAL ELLIPSIS
    368         /* 108 */ "\u2026",
    369         /* 109 */ "\'",
    370         /* 110 */ "\"",
    371         /* 111 */ "\"",
    372         /* 112 */ EMPTY,
    373         /* 113 */ EMPTY,
    374         /* 114 */ "q",
    375         /* 115 */ "w",
    376         /* 116 */ "y",
    377         /* 117 */ "x",
    378         /* 118 */ EMPTY,
    379         /* 119 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
    380         /* 120 */ "!icon/settings_key|!code/key_settings",
    381         /* 121 */ "!icon/shortcut_key|!code/key_shortcut",
    382         /* 122 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
    383         /* 123 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
    384         // Label for "switch to more symbol" modifier key.  Must be short to fit on key!
    385         /* 124 */ "= \\ <",
    386         // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
    387         /* 125 */ "~ [ <",
    388         // Label for "Tab" key.  Must be short to fit on key!
    389         /* 126 */ "Tab",
    390         // Label for "switch to phone numeric" key.  Must be short to fit on key!
    391         /* 127 */ "123",
    392         // Label for "switch to phone symbols" key.  Must be short to fit on key!
    393         // U+FF0A: "" FULLWIDTH ASTERISK
    394         // U+FF03: "" FULLWIDTH NUMBER SIGN
    395         /* 128 */ "\uFF0A\uFF03",
    396         // Key label for "ante meridiem"
    397         /* 129 */ "AM",
    398         // Key label for "post meridiem"
    399         /* 130 */ "PM",
    400         /* 131 */ ".com",
    401         // popular web domains for the locale - most popular, displayed on the keyboard
    402         /* 132 */ "!hasLabels!,.net,.org,.gov,.edu",
    403         /* 133 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ",
    404         // U+2039: "" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
    405         // U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
    406         // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    407         // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
    408         // The following characters don't need BIDI mirroring.
    409         // U+2018: "" LEFT SINGLE QUOTATION MARK
    410         // U+2019: "" RIGHT SINGLE QUOTATION MARK
    411         // U+201A: "" SINGLE LOW-9 QUOTATION MARK
    412         // U+201C: "" LEFT DOUBLE QUOTATION MARK
    413         // U+201D: "" RIGHT DOUBLE QUOTATION MARK
    414         // U+201E: "" DOUBLE LOW-9 QUOTATION MARK
    415         // Abbreviations are:
    416         // laqm: LEFT-POINTING ANGLE QUOTATION MARK
    417         // raqm: RIGHT-POINTING ANGLE QUOTATION MARK
    418         // rtl: Right-To-Left script order
    419         // lqm: LEFT QUOTATION MARK
    420         // rqm: RIGHT QUOTATION MARK
    421         // 9qm: LOW-9 QUOTATION MARK
    422         // The following each quotation mark pair consist of
    423         // <opening quotation mark>, <closing quotation mark>
    424         // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
    425         /* 134 */ "\u2039,\u203A",
    426         /* 135 */ "\u2039|\u203A,\u203A|\u2039",
    427         /* 136 */ "\u203A,\u2039",
    428         /* 137 */ "\u00AB,\u00BB",
    429         /* 138 */ "\u00AB|\u00BB,\u00BB|\u00AB",
    430         /* 139 */ "\u00BB,\u00AB",
    431         // The following each quotation mark triplet consists of
    432         // <another quotation mark>, <opening quotation mark>, <closing quotation mark>
    433         // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
    434         /* 140 */ "\u201A,\u2018,\u2019",
    435         /* 141 */ "\u2019,\u201A,\u2018",
    436         /* 142 */ "\u2018,\u201A,\u2019",
    437         /* 143 */ "\u201E,\u201C,\u201D",
    438         /* 144 */ "\u201D,\u201E,\u201C",
    439         /* 145 */ "\u201C,\u201E,\u201D",
    440         /* 146 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
    441         /* 147 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
    442         /* 148 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
    443         /* 149 */ "!icon/emoji_key|!code/key_emoji",
    444     };
    445 
    446     /* Language af: Afrikaans */
    447     private static final String[] LANGUAGE_af = {
    448         // This is the same as Dutch except more keys of y and demoting vowels with diaeresis.
    449         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    450         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    451         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    452         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    453         // U+00E6: "" LATIN SMALL LETTER AE
    454         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    455         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    456         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    457         /* 0 */ "\u00E1,\u00E2,\u00E4,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
    458         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
    459         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
    460         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
    461         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
    462         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
    463         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
    464         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
    465         /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
    466         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
    467         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
    468         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
    469         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
    470         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
    471         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
    472         // U+0133: "" LATIN SMALL LIGATURE IJ
    473         /* 2 */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133",
    474         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    475         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    476         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    477         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    478         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    479         // U+0153: "" LATIN SMALL LIGATURE OE
    480         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    481         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    482         /* 3 */ "\u00F3,\u00F4,\u00F6,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
    483         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    484         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    485         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    486         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    487         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    488         /* 4 */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
    489         /* 5 */ null,
    490         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    491         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
    492         /* 6 */ "\u00F1,\u0144",
    493         /* 7 */ null,
    494         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
    495         // U+0133: "" LATIN SMALL LIGATURE IJ
    496         /* 8 */ "\u00FD,\u0133",
    497     };
    498 
    499     /* Language ar: Arabic */
    500     private static final String[] LANGUAGE_ar = {
    501         /* 0~ */
    502         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    503         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    504         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    505         /* ~44 */
    506         // Label for "switch to alphabetic" key.
    507         // U+0623: "" ARABIC LETTER ALEF
    508         // U+200C: ZERO WIDTH NON-JOINER
    509         // U+0628: "" ARABIC LETTER BEH
    510         // U+062C: "" ARABIC LETTER PEH
    511         /* 45 */ "\u0623\u200C\u0628\u200C\u062C",
    512         /* 46 */ null,
    513         /* 47 */ null,
    514         /* 48 */ "!text/single_laqm_raqm_rtl",
    515         /* 49 */ "!text/double_laqm_raqm_rtl",
    516         /* 50~ */
    517         null, null, null,
    518         /* ~52 */
    519         // U+061F: "" ARABIC QUESTION MARK
    520         // U+060C: "" ARABIC COMMA
    521         // U+061B: "" ARABIC SEMICOLON
    522         /* 53 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
    523         // U+2605: "" BLACK STAR
    524         // U+066D: "" ARABIC FIVE POINTED STAR
    525         /* 54 */ "\u2605,\u066D",
    526         // U+266A: "" EIGHTH NOTE
    527         /* 55 */ "\u266A",
    528         /* 56 */ null,
    529         // The all letters need to be mirrored are found at
    530         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
    531         // U+FD3E: "" ORNATE LEFT PARENTHESIS
    532         // U+FD3F: "" ORNATE RIGHT PARENTHESIS
    533         /* 57 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
    534         /* 58 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
    535         // U+2264: "" LESS-THAN OR EQUAL TO
    536         // U+2265: "" GREATER-THAN EQUAL TO
    537         // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    538         // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
    539         // U+2039: "" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
    540         // U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
    541         /* 59 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
    542         /* 60 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
    543         // U+0655: "" ARABIC HAMZA BELOW
    544         // U+0654: "" ARABIC HAMZA ABOVE
    545         // U+0652: "" ARABIC SUKUN
    546         // U+064D: "" ARABIC KASRATAN
    547         // U+064C: "" ARABIC DAMMATAN
    548         // U+064B: "" ARABIC FATHATAN
    549         // U+0651: "" ARABIC SHADDA
    550         // U+0656: "" ARABIC SUBSCRIPT ALEF
    551         // U+0670: "" ARABIC LETTER SUPERSCRIPT ALEF
    552         // U+0653: "" ARABIC MADDAH ABOVE
    553         // U+0650: "" ARABIC KASRA
    554         // U+064F: "" ARABIC DAMMA
    555         // U+064E: "" ARABIC FATHA
    556         // U+0640: "" ARABIC TATWEEL
    557         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
    558         // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
    559         /* 61 */ "!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",
    560         /* 62 */ "\u0651",
    561         // U+0661: "" ARABIC-INDIC DIGIT ONE
    562         /* 63 */ "\u0661",
    563         // U+0662: "" ARABIC-INDIC DIGIT TWO
    564         /* 64 */ "\u0662",
    565         // U+0663: "" ARABIC-INDIC DIGIT THREE
    566         /* 65 */ "\u0663",
    567         // U+0664: "" ARABIC-INDIC DIGIT FOUR
    568         /* 66 */ "\u0664",
    569         // U+0665: "" ARABIC-INDIC DIGIT FIVE
    570         /* 67 */ "\u0665",
    571         // U+0666: "" ARABIC-INDIC DIGIT SIX
    572         /* 68 */ "\u0666",
    573         // U+0667: "" ARABIC-INDIC DIGIT SEVEN
    574         /* 69 */ "\u0667",
    575         // U+0668: "" ARABIC-INDIC DIGIT EIGHT
    576         /* 70 */ "\u0668",
    577         // U+0669: "" ARABIC-INDIC DIGIT NINE
    578         /* 71 */ "\u0669",
    579         // U+0660: "" ARABIC-INDIC DIGIT ZERO
    580         /* 72 */ "\u0660",
    581         // Label for "switch to symbols" key.
    582         // U+061F: "" ARABIC QUESTION MARK
    583         /* 73 */ "\u0663\u0662\u0661\u061F",
    584         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
    585         // part because it'll be appended by the code.
    586         /* 74 */ "\u0663\u0662\u0661",
    587         /* 75 */ "1",
    588         /* 76 */ "2",
    589         /* 77 */ "3",
    590         /* 78 */ "4",
    591         /* 79 */ "5",
    592         /* 80 */ "6",
    593         /* 81 */ "7",
    594         /* 82 */ "8",
    595         /* 83 */ "9",
    596         // U+066B: "" ARABIC DECIMAL SEPARATOR
    597         // U+066C: "" ARABIC THOUSANDS SEPARATOR
    598         /* 84 */ "0,\u066B,\u066C",
    599         /* 85~ */
    600         null, null, null, null, null, null, null, null, null, null,
    601         /* ~94 */
    602         // U+060C: "" ARABIC COMMA
    603         /* 95 */ "\u060C",
    604         /* 96 */ "\\,",
    605         /* 97 */ "\u061F",
    606         /* 98 */ "\u061B",
    607         // U+066A: "" ARABIC PERCENT SIGN
    608         /* 99 */ "\u066A",
    609         /* 100 */ null,
    610         /* 101 */ "?",
    611         /* 102 */ ";",
    612         // U+2030: "" PER MILLE SIGN
    613         /* 103 */ "\\%,\u2030",
    614         /* 104~ */
    615         null, null, null, null, null,
    616         /* ~108 */
    617         // U+060C: "" ARABIC COMMA
    618         // U+061B: "" ARABIC SEMICOLON
    619         // U+061F: "" ARABIC QUESTION MARK
    620         /* 109 */ "\u060C",
    621         /* 110 */ "\u061F",
    622         /* 111 */ "\u061F,\u061B,!,:,-,/,\',\"",
    623     };
    624 
    625     /* Language az: Azerbaijani */
    626     private static final String[] LANGUAGE_az = {
    627         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    628         /* 0 */ "\u00E2",
    629         // U+0259: "" LATIN SMALL LETTER SCHWA
    630         /* 1 */ "\u0259",
    631         // U+0131: "" LATIN SMALL LETTER DOTLESS I
    632         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
    633         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
    634         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
    635         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
    636         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
    637         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
    638         /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
    639         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    640         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    641         // U+0153: "" LATIN SMALL LIGATURE OE
    642         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    643         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    644         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    645         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    646         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    647         /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
    648         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    649         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    650         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    651         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    652         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    653         /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
    654         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
    655         // U+00DF: "" LATIN SMALL LETTER SHARP S
    656         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
    657         // U+0161: "" LATIN SMALL LETTER S WITH CARON
    658         /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
    659         /* 6 */ null,
    660         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
    661         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
    662         // U+010D: "" LATIN SMALL LETTER C WITH CARON
    663         /* 7 */ "\u00E7,\u0107,\u010D",
    664         /* 8~ */
    665         null, null, null, null, null, null, null,
    666         /* ~14 */
    667         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
    668         /* 15 */ "\u011F",
    669     };
    670 
    671     /* Language be: Belarusian */
    672     private static final String[] LANGUAGE_be = {
    673         /* 0~ */
    674         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    675         null, null, null, null, null, null, null, null, null, null,
    676         /* ~24 */
    677         // U+045E: "" CYRILLIC SMALL LETTER SHORT U
    678         /* 25 */ "\u045E",
    679         // U+0451: "" CYRILLIC SMALL LETTER IO
    680         /* 26 */ "\u0451",
    681         // U+044B: "" CYRILLIC SMALL LETTER YERU
    682         /* 27 */ "\u044B",
    683         // U+044D: "" CYRILLIC SMALL LETTER E
    684         /* 28 */ "\u044D",
    685         // U+0456: "" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
    686         /* 29 */ "\u0456",
    687         /* 30~ */
    688         null, null, null, null, null, null, null,
    689         /* ~36 */
    690         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
    691         /* 37 */ "\u044A",
    692         /* 38~ */
    693         null, null, null, null, null,
    694         /* ~42 */
    695         // U+0451: "" CYRILLIC SMALL LETTER IO
    696         /* 43 */ "\u0451",
    697         /* 44 */ null,
    698         // Label for "switch to alphabetic" key.
    699         // U+0410: "" CYRILLIC CAPITAL LETTER A
    700         // U+0411: "" CYRILLIC CAPITAL LETTER BE
    701         // U+0412: "" CYRILLIC CAPITAL LETTER VE
    702         /* 45 */ "\u0410\u0411\u0412",
    703         /* 46 */ "!text/single_9qm_lqm",
    704         /* 47 */ "!text/double_9qm_lqm",
    705     };
    706 
    707     /* Language bg: Bulgarian */
    708     private static final String[] LANGUAGE_bg = {
    709         /* 0~ */
    710         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    711         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    712         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    713         /* ~44 */
    714         // Label for "switch to alphabetic" key.
    715         // U+0410: "" CYRILLIC CAPITAL LETTER A
    716         // U+0411: "" CYRILLIC CAPITAL LETTER BE
    717         // U+0412: "" CYRILLIC CAPITAL LETTER VE
    718         /* 45 */ "\u0410\u0411\u0412",
    719         /* 46 */ null,
    720         // single_quotes of Bulgarian is default single_quotes_right_left.
    721         /* 47 */ "!text/double_9qm_lqm",
    722     };
    723 
    724     /* Language ca: Catalan */
    725     private static final String[] LANGUAGE_ca = {
    726         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    727         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    728         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    729         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    730         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    731         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    732         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
    733         // U+00E6: "" LATIN SMALL LETTER AE
    734         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    735         // U+00AA: "" FEMININE ORDINAL INDICATOR
    736         /* 0 */ "\u00E0,\u00E1,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
    737         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
    738         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
    739         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
    740         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
    741         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
    742         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
    743         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
    744         /* 1 */ "\u00E8,\u00E9,\u00EB,\u00EA,\u0119,\u0117,\u0113",
    745         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
    746         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
    747         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
    748         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
    749         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
    750         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
    751         /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
    752         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    753         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    754         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    755         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    756         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    757         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    758         // U+0153: "" LATIN SMALL LIGATURE OE
    759         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    760         // U+00BA: "" MASCULINE ORDINAL INDICATOR
    761         /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
    762         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    763         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    764         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    765         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    766         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    767         /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
    768         /* 5 */ null,
    769         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    770         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
    771         /* 6 */ "\u00F1,\u0144",
    772         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
    773         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
    774         // U+010D: "" LATIN SMALL LETTER C WITH CARON
    775         /* 7 */ "\u00E7,\u0107,\u010D",
    776         /* 8~ */
    777         null, null, null, null, null, null,
    778         /* ~13 */
    779         // U+00B7: "" MIDDLE DOT
    780         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
    781         /* 14 */ "l\u00B7l,\u0142",
    782         /* 15~ */
    783         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    784         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    785         null, null, null, null, null, null, null, null,
    786         /* ~52 */
    787         // U+00B7: "" MIDDLE DOT
    788         /* 53 */ "!fixedColumnOrder!4,\u00B7,!,\\,,?,:,;,@",
    789         /* 54~ */
    790         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    791         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    792         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    793         null, null, null, null, null, null, null, null, null,
    794         /* ~107 */
    795         /* 108 */ "?,\u00B7",
    796         /* 109~ */
    797         null, null, null, null, null, null, null, null, null,
    798         /* ~117 */
    799         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
    800         /* 118 */ "\u00E7",
    801     };
    802 
    803     /* Language cs: Czech */
    804     private static final String[] LANGUAGE_cs = {
    805         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    806         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    807         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    808         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    809         // U+00E6: "" LATIN SMALL LETTER AE
    810         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    811         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    812         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    813         /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
    814         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
    815         // U+011B: "" LATIN SMALL LETTER E WITH CARON
    816         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
    817         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
    818         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
    819         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
    820         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
    821         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
    822         /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
    823         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
    824         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
    825         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
    826         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
    827         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
    828         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
    829         /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
    830         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    831         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    832         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    833         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    834         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    835         // U+0153: "" LATIN SMALL LIGATURE OE
    836         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    837         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    838         /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
    839         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    840         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
    841         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    842         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    843         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    844         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    845         /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B",
    846         // U+0161: "" LATIN SMALL LETTER S WITH CARON
    847         // U+00DF: "" LATIN SMALL LETTER SHARP S
    848         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
    849         /* 5 */ "\u0161,\u00DF,\u015B",
    850         // U+0148: "" LATIN SMALL LETTER N WITH CARON
    851         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    852         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
    853         /* 6 */ "\u0148,\u00F1,\u0144",
    854         // U+010D: "" LATIN SMALL LETTER C WITH CARON
    855         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
    856         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
    857         /* 7 */ "\u010D,\u00E7,\u0107",
    858         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
    859         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
    860         /* 8 */ "\u00FD,\u00FF",
    861         // U+010F: "" LATIN SMALL LETTER D WITH CARON
    862         /* 9 */ "\u010F",
    863         // U+0159: "" LATIN SMALL LETTER R WITH CARON
    864         /* 10 */ "\u0159",
    865         // U+0165: "" LATIN SMALL LETTER T WITH CARON
    866         /* 11 */ "\u0165",
    867         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
    868         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
    869         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
    870         /* 12 */ "\u017E,\u017A,\u017C",
    871         /* 13~ */
    872         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    873         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    874         null, null, null,
    875         /* ~45 */
    876         /* 46 */ "!text/single_9qm_lqm",
    877         /* 47 */ "!text/double_9qm_lqm",
    878         /* 48 */ "!text/single_raqm_laqm",
    879         /* 49 */ "!text/double_raqm_laqm",
    880     };
    881 
    882     /* Language da: Danish */
    883     private static final String[] LANGUAGE_da = {
    884         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    885         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    886         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    887         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    888         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    889         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    890         /* 0 */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101",
    891         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
    892         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
    893         /* 1 */ "\u00E9,\u00EB",
    894         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
    895         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
    896         /* 2 */ "\u00ED,\u00EF",
    897         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    898         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    899         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    900         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    901         // U+0153: "" LATIN SMALL LIGATURE OE
    902         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    903         /* 3 */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D",
    904         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    905         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    906         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    907         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    908         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    909         /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
    910         // U+00DF: "" LATIN SMALL LETTER SHARP S
    911         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
    912         // U+0161: "" LATIN SMALL LETTER S WITH CARON
    913         /* 5 */ "\u00DF,\u015B,\u0161",
    914         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    915         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
    916         /* 6 */ "\u00F1,\u0144",
    917         /* 7 */ null,
    918         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
    919         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
    920         /* 8 */ "\u00FD,\u00FF",
    921         // U+00F0: "" LATIN SMALL LETTER ETH
    922         /* 9 */ "\u00F0",
    923         /* 10~ */
    924         null, null, null, null,
    925         /* ~13 */
    926         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
    927         /* 14 */ "\u0142",
    928         /* 15~ */
    929         null, null, null, null, null,
    930         /* ~19 */
    931         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    932         /* 20 */ "\u00E5",
    933         // U+00E6: "" LATIN SMALL LETTER AE
    934         /* 21 */ "\u00E6",
    935         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    936         /* 22 */ "\u00F8",
    937         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    938         /* 23 */ "\u00E4",
    939         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    940         /* 24 */ "\u00F6",
    941         /* 25~ */
    942         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    943         null, null, null, null, null, null,
    944         /* ~45 */
    945         /* 46 */ "!text/single_9qm_lqm",
    946         /* 47 */ "!text/double_9qm_lqm",
    947         /* 48 */ "!text/single_raqm_laqm",
    948         /* 49 */ "!text/double_raqm_laqm",
    949     };
    950 
    951     /* Language de: German */
    952     private static final String[] LANGUAGE_de = {
    953         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    954         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    955         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    956         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    957         // U+00E6: "" LATIN SMALL LETTER AE
    958         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    959         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    960         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    961         /* 0 */ "\u00E4,\u00E2,\u00E0,\u00E1,\u00E6,\u00E3,\u00E5,\u0101",
    962         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
    963         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
    964         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
    965         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
    966         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
    967         /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117",
    968         /* 2 */ null,
    969         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    970         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    971         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    972         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    973         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    974         // U+0153: "" LATIN SMALL LIGATURE OE
    975         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    976         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    977         /* 3 */ "\u00F6,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u00F8,\u014D",
    978         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    979         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    980         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    981         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    982         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    983         /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
    984         // U+00DF: "" LATIN SMALL LETTER SHARP S
    985         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
    986         // U+0161: "" LATIN SMALL LETTER S WITH CARON
    987         /* 5 */ "\u00DF,\u015B,\u0161",
    988         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    989         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
    990         /* 6 */ "\u00F1,\u0144",
    991         /* 7~ */
    992         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    993         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    994         null, null, null, null, null, null, null, null, null,
    995         /* ~45 */
    996         /* 46 */ "!text/single_9qm_lqm",
    997         /* 47 */ "!text/double_9qm_lqm",
    998         /* 48 */ "!text/single_raqm_laqm",
    999         /* 49 */ "!text/double_raqm_laqm",
   1000     };
   1001 
   1002     /* Language el: Greek */
   1003     private static final String[] LANGUAGE_el = {
   1004         /* 0~ */
   1005         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1006         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1007         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1008         /* ~44 */
   1009         // Label for "switch to alphabetic" key.
   1010         // U+0391: "" GREEK CAPITAL LETTER ALPHA
   1011         // U+0392: "" GREEK CAPITAL LETTER BETA
   1012         // U+0393: "" GREEK CAPITAL LETTER GAMMA
   1013         /* 45 */ "\u0391\u0392\u0393",
   1014     };
   1015 
   1016     /* Language en: English */
   1017     private static final String[] LANGUAGE_en = {
   1018         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1019         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1020         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1021         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1022         // U+00E6: "" LATIN SMALL LETTER AE
   1023         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1024         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1025         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1026         /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
   1027         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1028         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1029         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1030         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1031         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1032         /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
   1033         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1034         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1035         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1036         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1037         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1038         /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
   1039         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1040         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1041         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1042         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1043         // U+0153: "" LATIN SMALL LIGATURE OE
   1044         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1045         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1046         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1047         /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
   1048         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1049         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1050         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1051         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1052         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1053         /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
   1054         // U+00DF: "" LATIN SMALL LETTER SHARP S
   1055         /* 5 */ "\u00DF",
   1056         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   1057         /* 6 */ "\u00F1",
   1058         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1059         /* 7 */ "\u00E7",
   1060     };
   1061 
   1062     /* Language eo: Esperanto */
   1063     private static final String[] LANGUAGE_eo = {
   1064         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1065         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1066         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1067         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1068         // U+00E6: "" LATIN SMALL LETTER AE
   1069         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1070         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1071         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1072         // U+0103: "" LATIN SMALL LETTER A WITH BREVE
   1073         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   1074         // U+00AA: "" FEMININE ORDINAL INDICATOR
   1075         /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
   1076         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1077         // U+011B: "" LATIN SMALL LETTER E WITH CARON
   1078         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1079         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1080         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1081         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1082         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1083         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1084         /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
   1085         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1086         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1087         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1088         // U+0129: "" LATIN SMALL LETTER I WITH TILDE
   1089         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1090         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1091         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1092         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   1093         // U+0133: "" LATIN SMALL LIGATURE IJ
   1094         /* 2 */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133",
   1095         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1096         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1097         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1098         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1099         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1100         // U+0153: "" LATIN SMALL LIGATURE OE
   1101         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1102         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1103         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   1104         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   1105         /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D,\u0151,\u00BA",
   1106         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1107         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
   1108         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1109         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1110         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1111         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1112         // U+0169: "" LATIN SMALL LETTER U WITH TILDE
   1113         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   1114         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
   1115         // U+00B5: "" MICRO SIGN
   1116         /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B,\u0169,\u0171,\u0173,\u00B5",
   1117         // U+00DF: "" LATIN SMALL LETTER SHARP S
   1118         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   1119         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   1120         // U+0219: "" LATIN SMALL LETTER S WITH COMMA BELOW
   1121         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   1122         /* 5 */ "\u00DF,\u0161,\u015B,\u0219,\u015F",
   1123         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   1124         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1125         // U+0146: "" LATIN SMALL LETTER N WITH CEDILLA
   1126         // U+0148: "" LATIN SMALL LETTER N WITH CARON
   1127         // U+0149: "" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
   1128         // U+014B: "" LATIN SMALL LETTER ENG
   1129         /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
   1130         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   1131         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   1132         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1133         // U+010B: "" LATIN SMALL LETTER C WITH DOT ABOVE
   1134         /* 7 */ "\u0107,\u010D,\u00E7,\u010B",
   1135         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   1136         // U+0177: "" LATIN SMALL LETTER Y WITH CIRCUMFLEX
   1137         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   1138         // U+00FE: "" LATIN SMALL LETTER THORN
   1139         /* 8 */ "y,\u00FD,\u0177,\u00FF,\u00FE",
   1140         // U+00F0: "" LATIN SMALL LETTER ETH
   1141         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   1142         // U+0111: "" LATIN SMALL LETTER D WITH STROKE
   1143         /* 9 */ "\u00F0,\u010F,\u0111",
   1144         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   1145         // U+0155: "" LATIN SMALL LETTER R WITH ACUTE
   1146         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
   1147         /* 10 */ "\u0159,\u0155,\u0157",
   1148         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   1149         // U+021B: "" LATIN SMALL LETTER T WITH COMMA BELOW
   1150         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
   1151         // U+0167: "" LATIN SMALL LETTER T WITH STROKE
   1152         /* 11 */ "\u0165,\u021B,\u0163,\u0167",
   1153         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   1154         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   1155         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   1156         /* 12 */ "\u017A,\u017C,\u017E",
   1157         // U+0137: "" LATIN SMALL LETTER K WITH CEDILLA
   1158         // U+0138: "" LATIN SMALL LETTER KRA
   1159         /* 13 */ "\u0137,\u0138",
   1160         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
   1161         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
   1162         // U+013E: "" LATIN SMALL LETTER L WITH CARON
   1163         // U+0140: "" LATIN SMALL LETTER L WITH MIDDLE DOT
   1164         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   1165         /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
   1166         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   1167         // U+0121: "" LATIN SMALL LETTER G WITH DOT ABOVE
   1168         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
   1169         /* 15 */ "\u011F,\u0121,\u0123",
   1170         // U+0175: "" LATIN SMALL LETTER W WITH CIRCUMFLEX
   1171         /* 16 */ "w,\u0175",
   1172         // U+0125: "" LATIN SMALL LETTER H WITH CIRCUMFLEX
   1173         // U+0127: "" LATIN SMALL LETTER H WITH STROKE
   1174         /* 17 */ "\u0125,\u0127",
   1175         /* 18 */ null,
   1176         // U+0175: "" LATIN SMALL LETTER W WITH CIRCUMFLEX
   1177         /* 19 */ "w,\u0175",
   1178         /* 20~ */
   1179         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1180         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1181         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1182         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1183         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1184         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1185         null, null,
   1186         /* ~111 */
   1187         /* 112 */ "q",
   1188         /* 113 */ "x",
   1189         // U+015D: "" LATIN SMALL LETTER S WITH CIRCUMFLEX
   1190         /* 114 */ "\u015D",
   1191         // U+011D: "" LATIN SMALL LETTER G WITH CIRCUMFLEX
   1192         /* 115 */ "\u011D",
   1193         // U+016D: "" LATIN SMALL LETTER U WITH BREVE
   1194         /* 116 */ "\u016D",
   1195         // U+0109: "" LATIN SMALL LETTER C WITH CIRCUMFLEX
   1196         /* 117 */ "\u0109",
   1197         // U+0135: "" LATIN SMALL LETTER J WITH CIRCUMFLEX
   1198         /* 118 */ "\u0135",
   1199     };
   1200 
   1201     /* Language es: Spanish */
   1202     private static final String[] LANGUAGE_es = {
   1203         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1204         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1205         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1206         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1207         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1208         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1209         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   1210         // U+00E6: "" LATIN SMALL LETTER AE
   1211         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1212         // U+00AA: "" FEMININE ORDINAL INDICATOR
   1213         /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
   1214         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1215         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1216         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1217         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1218         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1219         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1220         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1221         /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
   1222         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1223         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1224         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1225         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1226         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1227         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1228         /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
   1229         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1230         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1231         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1232         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1233         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1234         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1235         // U+0153: "" LATIN SMALL LIGATURE OE
   1236         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1237         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   1238         /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
   1239         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1240         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1241         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1242         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1243         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1244         /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
   1245         /* 5 */ null,
   1246         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   1247         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1248         /* 6 */ "\u00F1,\u0144",
   1249         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1250         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   1251         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   1252         /* 7 */ "\u00E7,\u0107,\u010D",
   1253         /* 8~ */
   1254         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1255         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1256         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1257         /* ~52 */
   1258         // U+00A1: "" INVERTED EXCLAMATION MARK
   1259         // U+00BF: "" INVERTED QUESTION MARK
   1260         /* 53 */ "!fixedColumnOrder!4,;,!,\\,,?,:,\u00A1,@,\u00BF",
   1261         /* 54~ */
   1262         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1263         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1264         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1265         null, null, null, null, null, null, null,
   1266         /* ~105 */
   1267         // U+00A1: "" INVERTED EXCLAMATION MARK
   1268         /* 106 */ "!,\u00A1",
   1269         /* 107 */ null,
   1270         // U+00BF: "" INVERTED QUESTION MARK
   1271         /* 108 */ "?,\u00BF",
   1272         /* 109 */ "\"",
   1273         /* 110 */ "\'",
   1274         /* 111 */ "\'",
   1275         /* 112~ */
   1276         null, null, null, null, null, null,
   1277         /* ~117 */
   1278         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   1279         /* 118 */ "\u00F1",
   1280     };
   1281 
   1282     /* Language et: Estonian */
   1283     private static final String[] LANGUAGE_et = {
   1284         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1285         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1286         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1287         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1288         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1289         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1290         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1291         // U+00E6: "" LATIN SMALL LETTER AE
   1292         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   1293         /* 0 */ "\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
   1294         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1295         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1296         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1297         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1298         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1299         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1300         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1301         // U+011B: "" LATIN SMALL LETTER E WITH CARON
   1302         /* 1 */ "\u0113,\u00E8,\u0117,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
   1303         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1304         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1305         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1306         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1307         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1308         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1309         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   1310         /* 2 */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131",
   1311         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1312         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1313         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1314         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1315         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1316         // U+0153: "" LATIN SMALL LIGATURE OE
   1317         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   1318         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1319         /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
   1320         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1321         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1322         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
   1323         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1324         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1325         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1326         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
   1327         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   1328         /* 4 */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
   1329         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   1330         // U+00DF: "" LATIN SMALL LETTER SHARP S
   1331         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   1332         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   1333         /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
   1334         // U+0146: "" LATIN SMALL LETTER N WITH CEDILLA
   1335         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   1336         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1337         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1338         /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
   1339         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   1340         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1341         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   1342         /* 7 */ "\u010D,\u00E7,\u0107",
   1343         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   1344         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   1345         /* 8 */ "\u00FD,\u00FF",
   1346         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   1347         /* 9 */ "\u010F",
   1348         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
   1349         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   1350         // U+0155: "" LATIN SMALL LETTER R WITH ACUTE
   1351         /* 10 */ "\u0157,\u0159,\u0155",
   1352         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
   1353         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   1354         /* 11 */ "\u0163,\u0165",
   1355         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   1356         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   1357         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   1358         /* 12 */ "\u017E,\u017C,\u017A",
   1359         // U+0137: "" LATIN SMALL LETTER K WITH CEDILLA
   1360         /* 13 */ "\u0137",
   1361         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
   1362         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   1363         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
   1364         // U+013E: "" LATIN SMALL LETTER L WITH CARON
   1365         /* 14 */ "\u013C,\u0142,\u013A,\u013E",
   1366         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
   1367         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   1368         /* 15 */ "\u0123,\u011F",
   1369         /* 16~ */
   1370         null, null, null, null,
   1371         /* ~19 */
   1372         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1373         /* 20 */ "\u00FC",
   1374         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1375         /* 21 */ "\u00F6",
   1376         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1377         /* 22 */ "\u00E4",
   1378         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1379         /* 23 */ "\u00F5",
   1380         /* 24~ */
   1381         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1382         null, null, null, null, null, null, null,
   1383         /* ~45 */
   1384         /* 46 */ "!text/single_9qm_lqm",
   1385         /* 47 */ "!text/double_9qm_lqm",
   1386     };
   1387 
   1388     /* Language fa: Persian */
   1389     private static final String[] LANGUAGE_fa = {
   1390         /* 0~ */
   1391         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1392         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1393         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1394         /* ~44 */
   1395         // Label for "switch to alphabetic" key.
   1396         // U+0627: "" ARABIC LETTER ALEF
   1397         // U+200C: ZERO WIDTH NON-JOINER
   1398         // U+0628: "" ARABIC LETTER BEH
   1399         // U+067E: "" ARABIC LETTER PEH
   1400         /* 45 */ "\u0627\u200C\u0628\u200C\u067E",
   1401         /* 46 */ null,
   1402         /* 47 */ null,
   1403         /* 48 */ "!text/single_laqm_raqm_rtl",
   1404         /* 49 */ "!text/double_laqm_raqm_rtl",
   1405         /* 50 */ null,
   1406         // U+FDFC: "" RIAL SIGN
   1407         /* 51 */ "\uFDFC",
   1408         /* 52 */ null,
   1409         // U+061F: "" ARABIC QUESTION MARK
   1410         // U+060C: "" ARABIC COMMA
   1411         // U+061B: "" ARABIC SEMICOLON
   1412         /* 53 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
   1413         // U+2605: "" BLACK STAR
   1414         // U+066D: "" ARABIC FIVE POINTED STAR
   1415         /* 54 */ "\u2605,\u066D",
   1416         // U+266A: "" EIGHTH NOTE
   1417         /* 55 */ "\u266A",
   1418         /* 56 */ null,
   1419         // The all letters need to be mirrored are found at
   1420         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
   1421         // U+FD3E: "" ORNATE LEFT PARENTHESIS
   1422         // U+FD3F: "" ORNATE RIGHT PARENTHESIS
   1423         /* 57 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
   1424         /* 58 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
   1425         // U+2264: "" LESS-THAN OR EQUAL TO
   1426         // U+2265: "" GREATER-THAN EQUAL TO
   1427         // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
   1428         // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
   1429         // U+2039: "" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
   1430         // U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
   1431         /* 59 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
   1432         /* 60 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
   1433         // U+0655: "" ARABIC HAMZA BELOW
   1434         // U+0652: "" ARABIC SUKUN
   1435         // U+0651: "" ARABIC SHADDA
   1436         // U+064C: "" ARABIC DAMMATAN
   1437         // U+064D: "" ARABIC KASRATAN
   1438         // U+064B: "" ARABIC FATHATAN
   1439         // U+0654: "" ARABIC HAMZA ABOVE
   1440         // U+0656: "" ARABIC SUBSCRIPT ALEF
   1441         // U+0670: "" ARABIC LETTER SUPERSCRIPT ALEF
   1442         // U+0653: "" ARABIC MADDAH ABOVE
   1443         // U+064F: "" ARABIC DAMMA
   1444         // U+0650: "" ARABIC KASRA
   1445         // U+064E: "" ARABIC FATHA
   1446         // U+0640: "" ARABIC TATWEEL
   1447         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
   1448         // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
   1449         /* 61 */ "!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",
   1450         /* 62 */ "\u064B",
   1451         // U+06F1: "" EXTENDED ARABIC-INDIC DIGIT ONE
   1452         /* 63 */ "\u06F1",
   1453         // U+06F2: "" EXTENDED ARABIC-INDIC DIGIT TWO
   1454         /* 64 */ "\u06F2",
   1455         // U+06F3: "" EXTENDED ARABIC-INDIC DIGIT THREE
   1456         /* 65 */ "\u06F3",
   1457         // U+06F4: "" EXTENDED ARABIC-INDIC DIGIT FOUR
   1458         /* 66 */ "\u06F4",
   1459         // U+06F5: "" EXTENDED ARABIC-INDIC DIGIT FIVE
   1460         /* 67 */ "\u06F5",
   1461         // U+06F6: "" EXTENDED ARABIC-INDIC DIGIT SIX
   1462         /* 68 */ "\u06F6",
   1463         // U+06F7: "" EXTENDED ARABIC-INDIC DIGIT SEVEN
   1464         /* 69 */ "\u06F7",
   1465         // U+06F8: "" EXTENDED ARABIC-INDIC DIGIT EIGHT
   1466         /* 70 */ "\u06F8",
   1467         // U+06F9: "" EXTENDED ARABIC-INDIC DIGIT NINE
   1468         /* 71 */ "\u06F9",
   1469         // U+06F0: "" EXTENDED ARABIC-INDIC DIGIT ZERO
   1470         /* 72 */ "\u06F0",
   1471         // Label for "switch to symbols" key.
   1472         // U+061F: "" ARABIC QUESTION MARK
   1473         /* 73 */ "\u06F3\u06F2\u06F1\u061F",
   1474         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
   1475         // part because it'll be appended by the code.
   1476         /* 74 */ "\u06F3\u06F2\u06F1",
   1477         /* 75 */ "1",
   1478         /* 76 */ "2",
   1479         /* 77 */ "3",
   1480         /* 78 */ "4",
   1481         /* 79 */ "5",
   1482         /* 80 */ "6",
   1483         /* 81 */ "7",
   1484         /* 82 */ "8",
   1485         /* 83 */ "9",
   1486         // U+066B: "" ARABIC DECIMAL SEPARATOR
   1487         // U+066C: "" ARABIC THOUSANDS SEPARATOR
   1488         /* 84 */ "0,\u066B,\u066C",
   1489         /* 85~ */
   1490         null, null, null, null, null, null, null, null, null, null,
   1491         /* ~94 */
   1492         // U+060C: "" ARABIC COMMA
   1493         /* 95 */ "\u060C",
   1494         /* 96 */ "\\,",
   1495         /* 97 */ "\u061F",
   1496         /* 98 */ "\u061B",
   1497         // U+066A: "" ARABIC PERCENT SIGN
   1498         /* 99 */ "\u066A",
   1499         /* 100 */ null,
   1500         /* 101 */ "?",
   1501         /* 102 */ ";",
   1502         // U+2030: "" PER MILLE SIGN
   1503         /* 103 */ "\\%,\u2030",
   1504         // U+060C: "" ARABIC COMMA
   1505         // U+061B: "" ARABIC SEMICOLON
   1506         // U+061F: "" ARABIC QUESTION MARK
   1507         // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
   1508         // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
   1509         /* 104 */ "\u060C",
   1510         /* 105 */ "!",
   1511         /* 106 */ "!,\\,",
   1512         /* 107 */ "\u061F",
   1513         /* 108 */ "\u061F,?",
   1514         /* 109 */ "\u060C",
   1515         /* 110 */ "\u061F",
   1516         /* 111 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
   1517     };
   1518 
   1519     /* Language fi: Finnish */
   1520     private static final String[] LANGUAGE_fi = {
   1521         // U+00E6: "" LATIN SMALL LETTER AE
   1522         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1523         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1524         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1525         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1526         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1527         /* 0 */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
   1528         /* 1 */ null,
   1529         /* 2 */ null,
   1530         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1531         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1532         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1533         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1534         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1535         // U+0153: "" LATIN SMALL LIGATURE OE
   1536         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1537         /* 3 */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
   1538         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1539         /* 4 */ "\u00FC",
   1540         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   1541         // U+00DF: "" LATIN SMALL LETTER SHARP S
   1542         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   1543         /* 5 */ "\u0161,\u00DF,\u015B",
   1544         /* 6~ */
   1545         null, null, null, null, null, null,
   1546         /* ~11 */
   1547         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   1548         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   1549         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   1550         /* 12 */ "\u017E,\u017A,\u017C",
   1551         /* 13~ */
   1552         null, null, null, null, null, null, null,
   1553         /* ~19 */
   1554         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1555         /* 20 */ "\u00E5",
   1556         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1557         /* 21 */ "\u00F6",
   1558         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1559         /* 22 */ "\u00E4",
   1560         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1561         /* 23 */ "\u00F8",
   1562         // U+00E6: "" LATIN SMALL LETTER AE
   1563         /* 24 */ "\u00E6",
   1564     };
   1565 
   1566     /* Language fr: French */
   1567     private static final String[] LANGUAGE_fr = {
   1568         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1569         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1570         // U+00E6: "" LATIN SMALL LETTER AE
   1571         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1572         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1573         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1574         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1575         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1576         // U+00AA: "" FEMININE ORDINAL INDICATOR
   1577         /* 0 */ "\u00E0,\u00E2,%,\u00E6,\u00E1,\u00E4,\u00E3,\u00E5,\u0101,\u00AA",
   1578         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1579         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1580         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1581         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1582         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1583         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1584         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1585         /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,%,\u0119,\u0117,\u0113",
   1586         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1587         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1588         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1589         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1590         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1591         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1592         /* 2 */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
   1593         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1594         // U+0153: "" LATIN SMALL LIGATURE OE
   1595         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1596         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1597         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1598         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1599         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1600         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1601         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   1602         /* 3 */ "\u00F4,\u0153,%,\u00F6,\u00F2,\u00F3,\u00F5,\u00F8,\u014D,\u00BA",
   1603         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1604         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1605         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1606         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1607         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1608         /* 4 */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B",
   1609         /* 5 */ null,
   1610         /* 6 */ null,
   1611         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1612         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   1613         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   1614         /* 7 */ "\u00E7,\u0107,\u010D",
   1615         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   1616         /* 8 */ "%,\u00FF",
   1617     };
   1618 
   1619     /* Language hi: Hindi */
   1620     private static final String[] LANGUAGE_hi = {
   1621         /* 0~ */
   1622         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1623         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1624         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1625         /* ~44 */
   1626         // Label for "switch to alphabetic" key.
   1627         // U+0915: "" DEVANAGARI LETTER KA
   1628         // U+0916: "" DEVANAGARI LETTER KHA
   1629         // U+0917: "" DEVANAGARI LETTER GA
   1630         /* 45 */ "\u0915\u0916\u0917",
   1631         /* 46~ */
   1632         null, null, null, null, null,
   1633         /* ~50 */
   1634         // U+20B9: "" INDIAN RUPEE SIGN
   1635         /* 51 */ "\u20B9",
   1636         /* 52~ */
   1637         null, null, null, null, null, null, null, null, null, null, null,
   1638         /* ~62 */
   1639         // U+0967: "" DEVANAGARI DIGIT ONE
   1640         /* 63 */ "\u0967",
   1641         // U+0968: "" DEVANAGARI DIGIT TWO
   1642         /* 64 */ "\u0968",
   1643         // U+0969: "" DEVANAGARI DIGIT THREE
   1644         /* 65 */ "\u0969",
   1645         // U+096A: "" DEVANAGARI DIGIT FOUR
   1646         /* 66 */ "\u096A",
   1647         // U+096B: "" DEVANAGARI DIGIT FIVE
   1648         /* 67 */ "\u096B",
   1649         // U+096C: "" DEVANAGARI DIGIT SIX
   1650         /* 68 */ "\u096C",
   1651         // U+096D: "" DEVANAGARI DIGIT SEVEN
   1652         /* 69 */ "\u096D",
   1653         // U+096E: "" DEVANAGARI DIGIT EIGHT
   1654         /* 70 */ "\u096E",
   1655         // U+096F: "" DEVANAGARI DIGIT NINE
   1656         /* 71 */ "\u096F",
   1657         // U+0966: "" DEVANAGARI DIGIT ZERO
   1658         /* 72 */ "\u0966",
   1659         // Label for "switch to symbols" key.
   1660         /* 73 */ "?\u0967\u0968\u0969",
   1661         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
   1662         // part because it'll be appended by the code.
   1663         /* 74 */ "\u0967\u0968\u0969",
   1664         /* 75 */ "1",
   1665         /* 76 */ "2",
   1666         /* 77 */ "3",
   1667         /* 78 */ "4",
   1668         /* 79 */ "5",
   1669         /* 80 */ "6",
   1670         /* 81 */ "7",
   1671         /* 82 */ "8",
   1672         /* 83 */ "9",
   1673         /* 84 */ "0",
   1674     };
   1675 
   1676     /* Language hr: Croatian */
   1677     private static final String[] LANGUAGE_hr = {
   1678         /* 0~ */
   1679         null, null, null, null, null,
   1680         /* ~4 */
   1681         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   1682         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   1683         // U+00DF: "" LATIN SMALL LETTER SHARP S
   1684         /* 5 */ "\u0161,\u015B,\u00DF",
   1685         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   1686         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1687         /* 6 */ "\u00F1,\u0144",
   1688         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   1689         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   1690         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1691         /* 7 */ "\u010D,\u0107,\u00E7",
   1692         /* 8 */ null,
   1693         // U+0111: "" LATIN SMALL LETTER D WITH STROKE
   1694         /* 9 */ "\u0111",
   1695         /* 10 */ null,
   1696         /* 11 */ null,
   1697         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   1698         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   1699         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   1700         /* 12 */ "\u017E,\u017A,\u017C",
   1701         /* 13~ */
   1702         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1703         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1704         null, null, null,
   1705         /* ~45 */
   1706         /* 46 */ "!text/single_9qm_rqm",
   1707         /* 47 */ "!text/double_9qm_rqm",
   1708         /* 48 */ "!text/single_raqm_laqm",
   1709         /* 49 */ "!text/double_raqm_laqm",
   1710     };
   1711 
   1712     /* Language hu: Hungarian */
   1713     private static final String[] LANGUAGE_hu = {
   1714         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1715         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1716         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1717         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1718         // U+00E6: "" LATIN SMALL LETTER AE
   1719         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1720         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1721         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1722         /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
   1723         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1724         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1725         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1726         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1727         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1728         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1729         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1730         /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
   1731         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1732         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1733         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1734         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1735         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1736         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1737         /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
   1738         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1739         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1740         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   1741         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1742         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1743         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1744         // U+0153: "" LATIN SMALL LIGATURE OE
   1745         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1746         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1747         /* 3 */ "\u00F3,\u00F6,\u0151,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
   1748         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1749         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1750         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   1751         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1752         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1753         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1754         /* 4 */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B",
   1755         /* 5~ */
   1756         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1757         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1758         null, null, null, null, null, null, null, null, null, null, null,
   1759         /* ~45 */
   1760         /* 46 */ "!text/single_9qm_rqm",
   1761         /* 47 */ "!text/double_9qm_rqm",
   1762         /* 48 */ "!text/single_raqm_laqm",
   1763         /* 49 */ "!text/double_raqm_laqm",
   1764     };
   1765 
   1766     /* Language hy: Armenian */
   1767     private static final String[] LANGUAGE_hy = {
   1768         /* 0~ */
   1769         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1770         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1771         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1772         null, null, null, null, null, null, null, null,
   1773         /* ~52 */
   1774         // U+058A: "" ARMENIAN HYPHEN
   1775         // U+055C: "" ARMENIAN EXCLAMATION MARK
   1776         // U+055D: "" ARMENIAN COMMA
   1777         // U+055E: "" ARMENIAN QUESTION MARK
   1778         // U+0559: "" ARMENIAN MODIFIER LETTER LEFT HALF RING
   1779         // U+055A: "" ARMENIAN APOSTROPHE
   1780         // U+055B: "" ARMENIAN EMPHASIS MARK
   1781         // U+055F: "" ARMENIAN ABBREVIATION MARK
   1782         /* 53 */ "!fixedColumnOrder!8,!,?,\\,,.,\u058A,\u055C,\u055D,\u055E,:,;,@,\u0559,\u055A,\u055B,\u055F",
   1783         /* 54~ */
   1784         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1785         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1786         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1787         null,
   1788         /* ~99 */
   1789         // U+055C: "" ARMENIAN EXCLAMATION MARK
   1790         // U+00A1: "" INVERTED EXCLAMATION MARK
   1791         /* 100 */ "\u055C,\u00A1",
   1792         // U+055E: "" ARMENIAN QUESTION MARK
   1793         // U+00BF: "" INVERTED QUESTION MARK
   1794         /* 101 */ "\u055E,\u00BF",
   1795     };
   1796 
   1797     /* Language is: Icelandic */
   1798     private static final String[] LANGUAGE_is = {
   1799         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1800         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1801         // U+00E6: "" LATIN SMALL LETTER AE
   1802         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1803         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1804         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1805         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1806         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1807         /* 0 */ "\u00E1,\u00E4,\u00E6,\u00E5,\u00E0,\u00E2,\u00E3,\u0101",
   1808         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1809         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1810         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1811         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1812         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1813         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1814         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1815         /* 1 */ "\u00E9,\u00EB,\u00E8,\u00EA,\u0119,\u0117,\u0113",
   1816         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1817         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1818         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1819         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1820         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1821         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1822         /* 2 */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
   1823         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1824         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1825         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1826         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1827         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1828         // U+0153: "" LATIN SMALL LIGATURE OE
   1829         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1830         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1831         /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
   1832         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1833         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1834         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1835         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1836         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1837         /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
   1838         /* 5~ */
   1839         null, null, null,
   1840         /* ~7 */
   1841         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   1842         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   1843         /* 8 */ "\u00FD,\u00FF",
   1844         // U+00F0: "" LATIN SMALL LETTER ETH
   1845         /* 9 */ "\u00F0",
   1846         /* 10 */ null,
   1847         // U+00FE: "" LATIN SMALL LETTER THORN
   1848         /* 11 */ "\u00FE",
   1849         /* 12~ */
   1850         null, null, null, null, null, null, null, null,
   1851         /* ~19 */
   1852         // U+00F0: "" LATIN SMALL LETTER ETH
   1853         /* 20 */ "\u00F0",
   1854         // U+00E6: "" LATIN SMALL LETTER AE
   1855         /* 21 */ "\u00E6",
   1856         // U+00FE: "" LATIN SMALL LETTER THORN
   1857         /* 22 */ "\u00FE",
   1858         /* 23~ */
   1859         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1860         null, null, null, null, null, null, null, null,
   1861         /* ~45 */
   1862         /* 46 */ "!text/single_9qm_lqm",
   1863         /* 47 */ "!text/double_9qm_lqm",
   1864     };
   1865 
   1866     /* Language it: Italian */
   1867     private static final String[] LANGUAGE_it = {
   1868         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1869         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1870         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1871         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1872         // U+00E6: "" LATIN SMALL LETTER AE
   1873         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1874         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1875         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1876         // U+00AA: "" FEMININE ORDINAL INDICATOR
   1877         /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u00AA",
   1878         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1879         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1880         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1881         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1882         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1883         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1884         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1885         /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u0117,\u0113",
   1886         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1887         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1888         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1889         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1890         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1891         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1892         /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B",
   1893         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1894         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1895         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1896         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1897         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1898         // U+0153: "" LATIN SMALL LIGATURE OE
   1899         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1900         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1901         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   1902         /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F6,\u00F5,\u0153,\u00F8,\u014D,\u00BA",
   1903         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1904         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1905         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1906         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1907         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1908         /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B",
   1909     };
   1910 
   1911     /* Language iw: Hebrew */
   1912     private static final String[] LANGUAGE_iw = {
   1913         /* 0~ */
   1914         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1915         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1916         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1917         /* ~44 */
   1918         // Label for "switch to alphabetic" key.
   1919         // U+05D0: "" HEBREW LETTER ALEF
   1920         // U+05D1: "" HEBREW LETTER BET
   1921         // U+05D2: "" HEBREW LETTER GIMEL
   1922         /* 45 */ "\u05D0\u05D1\u05D2",
   1923         // The following characters don't need BIDI mirroring.
   1924         // U+2018: "" LEFT SINGLE QUOTATION MARK
   1925         // U+2019: "" RIGHT SINGLE QUOTATION MARK
   1926         // U+201A: "" SINGLE LOW-9 QUOTATION MARK
   1927         // U+201C: "" LEFT DOUBLE QUOTATION MARK
   1928         // U+201D: "" RIGHT DOUBLE QUOTATION MARK
   1929         // U+201E: "" DOUBLE LOW-9 QUOTATION MARK
   1930         /* 46 */ "\u2018,\u2019,\u201A",
   1931         /* 47 */ "\u201C,\u201D,\u201E",
   1932         /* 48 */ "!text/single_laqm_raqm_rtl",
   1933         /* 49 */ "!text/double_laqm_raqm_rtl",
   1934         /* 50 */ null,
   1935         // U+20AA: "" NEW SHEQEL SIGN
   1936         /* 51 */ "\u20AA",
   1937         /* 52 */ null,
   1938         /* 53 */ null,
   1939         // U+2605: "" BLACK STAR
   1940         /* 54 */ "\u2605",
   1941         /* 55 */ null,
   1942         // U+00B1: "" PLUS-MINUS SIGN
   1943         // U+FB29: "" HEBREW LETTER ALTERNATIVE PLUS SIGN
   1944         /* 56 */ "\u00B1,\uFB29",
   1945         // The all letters need to be mirrored are found at
   1946         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
   1947         /* 57 */ "!fixedColumnOrder!3,<|>,{|},[|]",
   1948         /* 58 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
   1949         // U+2264: "" LESS-THAN OR EQUAL TO
   1950         // U+2265: "" GREATER-THAN EQUAL TO
   1951         // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
   1952         // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
   1953         // U+2039: "" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
   1954         // U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
   1955         /* 59 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
   1956         /* 60 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
   1957         /* 61~ */
   1958         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1959         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1960         null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1961         /* ~104 */
   1962         /* 105 */ "!",
   1963         /* 106 */ "!",
   1964         /* 107 */ "?",
   1965         /* 108 */ "?",
   1966     };
   1967 
   1968     /* Language ka: Georgian */
   1969     private static final String[] LANGUAGE_ka = {
   1970         /* 0~ */
   1971         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1972         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1973         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1974         /* ~44 */
   1975         // Label for "switch to alphabetic" key.
   1976         // U+10D0: "" GEORGIAN LETTER AN
   1977         // U+10D1: "" GEORGIAN LETTER BAN
   1978         // U+10D2: "" GEORGIAN LETTER GAN
   1979         /* 45 */ "\u10D0\u10D1\u10D2",
   1980         /* 46 */ "!text/single_9qm_lqm",
   1981         /* 47 */ "!text/double_9qm_lqm",
   1982     };
   1983 
   1984     /* Language kk: Kazakh */
   1985     private static final String[] LANGUAGE_kk = {
   1986         /* 0~ */
   1987         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1988         null, null, null, null, null, null, null, null, null, null,
   1989         /* ~24 */
   1990         // U+0449: "" CYRILLIC SMALL LETTER SHCHA
   1991         /* 25 */ "\u0449",
   1992         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   1993         /* 26 */ "\u044A",
   1994         // U+044B: "" CYRILLIC SMALL LETTER YERU
   1995         /* 27 */ "\u044B",
   1996         // U+044D: "" CYRILLIC SMALL LETTER E
   1997         /* 28 */ "\u044D",
   1998         // U+0438: "" CYRILLIC SMALL LETTER I
   1999         /* 29 */ "\u0438",
   2000         // U+04AF: "" CYRILLIC SMALL LETTER STRAIGHT U
   2001         // U+04B1: "" CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
   2002         /* 30 */ "\u04AF,\u04B1",
   2003         // U+049B: "" CYRILLIC SMALL LETTER KA WITH DESCENDER
   2004         /* 31 */ "\u049B",
   2005         // U+04A3: "" CYRILLIC SMALL LETTER EN WITH DESCENDER
   2006         /* 32 */ "\u04A3",
   2007         // U+0493: "" CYRILLIC SMALL LETTER GHE WITH STROKE
   2008         /* 33 */ "\u0493",
   2009         // U+0456: "" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
   2010         /* 34 */ "\u0456",
   2011         // U+04D9: "" CYRILLIC SMALL LETTER SCHWA
   2012         /* 35 */ "\u04D9",
   2013         // U+04E9: "" CYRILLIC SMALL LETTER BARRED O
   2014         /* 36 */ "\u04E9",
   2015         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   2016         /* 37 */ "\u044A",
   2017         // U+04BB: "" CYRILLIC SMALL LETTER SHHA
   2018         /* 38 */ "\u04BB",
   2019         /* 39~ */
   2020         null, null, null, null,
   2021         /* ~42 */
   2022         // U+0451: "" CYRILLIC SMALL LETTER IO
   2023         /* 43 */ "\u0451",
   2024         /* 44 */ null,
   2025         // Label for "switch to alphabetic" key.
   2026         // U+0410: "" CYRILLIC CAPITAL LETTER A
   2027         // U+0411: "" CYRILLIC CAPITAL LETTER BE
   2028         // U+0412: "" CYRILLIC CAPITAL LETTER VE
   2029         /* 45 */ "\u0410\u0411\u0412",
   2030     };
   2031 
   2032     /* Language km: Khmer */
   2033     private static final String[] LANGUAGE_km = {
   2034         /* 0~ */
   2035         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2036         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2037         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2038         /* ~44 */
   2039         // Label for "switch to alphabetic" key.
   2040         // U+1780: "" KHMER LETTER KA
   2041         // U+1781: "" KHMER LETTER KHA
   2042         // U+1782: "" KHMER LETTER KO
   2043         /* 45 */ "\u1780\u1781\u1782",
   2044         /* 46~ */
   2045         null, null, null, null,
   2046         /* ~49 */
   2047         // U+17DB: "" KHMER CURRENCY SYMBOL RIEL
   2048         /* 50 */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
   2049     };
   2050 
   2051     /* Language ky: Kirghiz */
   2052     private static final String[] LANGUAGE_ky = {
   2053         /* 0~ */
   2054         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2055         null, null, null, null, null, null, null, null, null, null,
   2056         /* ~24 */
   2057         // U+0449: "" CYRILLIC SMALL LETTER SHCHA
   2058         /* 25 */ "\u0449",
   2059         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   2060         /* 26 */ "\u044A",
   2061         // U+044B: "" CYRILLIC SMALL LETTER YERU
   2062         /* 27 */ "\u044B",
   2063         // U+044D: "" CYRILLIC SMALL LETTER E
   2064         /* 28 */ "\u044D",
   2065         // U+0438: "" CYRILLIC SMALL LETTER I
   2066         /* 29 */ "\u0438",
   2067         // U+04AF: "" CYRILLIC SMALL LETTER STRAIGHT U
   2068         /* 30 */ "\u04AF",
   2069         /* 31 */ null,
   2070         // U+04A3: "" CYRILLIC SMALL LETTER EN WITH DESCENDER
   2071         /* 32 */ "\u04A3",
   2072         /* 33~ */
   2073         null, null, null,
   2074         /* ~35 */
   2075         // U+04E9: "" CYRILLIC SMALL LETTER BARRED O
   2076         /* 36 */ "\u04E9",
   2077         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   2078         /* 37 */ "\u044A",
   2079         /* 38~ */
   2080         null, null, null, null, null,
   2081         /* ~42 */
   2082         // U+0451: "" CYRILLIC SMALL LETTER IO
   2083         /* 43 */ "\u0451",
   2084         /* 44 */ null,
   2085         // Label for "switch to alphabetic" key.
   2086         // U+0410: "" CYRILLIC CAPITAL LETTER A
   2087         // U+0411: "" CYRILLIC CAPITAL LETTER BE
   2088         // U+0412: "" CYRILLIC CAPITAL LETTER VE
   2089         /* 45 */ "\u0410\u0411\u0412",
   2090     };
   2091 
   2092     /* Language lo: Lao */
   2093     private static final String[] LANGUAGE_lo = {
   2094         /* 0~ */
   2095         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2096         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2097         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2098         /* ~44 */
   2099         // Label for "switch to alphabetic" key.
   2100         // U+0E81: "" LAO LETTER KO
   2101         // U+0E82: "" LAO LETTER KHO SUNG
   2102         // U+0E84: "" LAO LETTER KHO TAM
   2103         /* 45 */ "\u0E81\u0E82\u0E84",
   2104         /* 46~ */
   2105         null, null, null, null, null,
   2106         /* ~50 */
   2107         // U+20AD: "" KIP SIGN
   2108         /* 51 */ "\u20AD",
   2109     };
   2110 
   2111     /* Language lt: Lithuanian */
   2112     private static final String[] LANGUAGE_lt = {
   2113         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   2114         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2115         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2116         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2117         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2118         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2119         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2120         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2121         // U+00E6: "" LATIN SMALL LETTER AE
   2122         /* 0 */ "\u0105,\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6",
   2123         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2124         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2125         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2126         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2127         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2128         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2129         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2130         // U+011B: "" LATIN SMALL LETTER E WITH CARON
   2131         /* 1 */ "\u0117,\u0119,\u0113,\u00E8,\u00E9,\u00EA,\u00EB,\u011B",
   2132         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   2133         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2134         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2135         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2136         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2137         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2138         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   2139         /* 2 */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
   2140         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2141         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2142         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2143         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2144         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2145         // U+0153: "" LATIN SMALL LIGATURE OE
   2146         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   2147         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2148         /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
   2149         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2150         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
   2151         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2152         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2153         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2154         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2155         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2156         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
   2157         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   2158         /* 4 */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
   2159         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2160         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2161         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2162         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   2163         /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
   2164         // U+0146: "" LATIN SMALL LETTER N WITH CEDILLA
   2165         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2166         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2167         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2168         /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
   2169         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2170         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2171         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2172         /* 7 */ "\u010D,\u00E7,\u0107",
   2173         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   2174         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   2175         /* 8 */ "\u00FD,\u00FF",
   2176         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   2177         /* 9 */ "\u010F",
   2178         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
   2179         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   2180         // U+0155: "" LATIN SMALL LETTER R WITH ACUTE
   2181         /* 10 */ "\u0157,\u0159,\u0155",
   2182         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
   2183         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   2184         /* 11 */ "\u0163,\u0165",
   2185         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   2186         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   2187         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   2188         /* 12 */ "\u017E,\u017C,\u017A",
   2189         // U+0137: "" LATIN SMALL LETTER K WITH CEDILLA
   2190         /* 13 */ "\u0137",
   2191         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
   2192         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   2193         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
   2194         // U+013E: "" LATIN SMALL LETTER L WITH CARON
   2195         /* 14 */ "\u013C,\u0142,\u013A,\u013E",
   2196         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
   2197         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   2198         /* 15 */ "\u0123,\u011F",
   2199         /* 16~ */
   2200         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2201         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2202         /* ~45 */
   2203         /* 46 */ "!text/single_9qm_lqm",
   2204         /* 47 */ "!text/double_9qm_lqm",
   2205     };
   2206 
   2207     /* Language lv: Latvian */
   2208     private static final String[] LANGUAGE_lv = {
   2209         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2210         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2211         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2212         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2213         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2214         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2215         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2216         // U+00E6: "" LATIN SMALL LETTER AE
   2217         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   2218         /* 0 */ "\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0105",
   2219         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2220         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2221         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2222         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2223         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2224         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2225         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2226         // U+011B: "" LATIN SMALL LETTER E WITH CARON
   2227         /* 1 */ "\u0113,\u0117,\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
   2228         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2229         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   2230         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2231         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2232         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2233         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2234         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   2235         /* 2 */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
   2236         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2237         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2238         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2239         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2240         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2241         // U+0153: "" LATIN SMALL LIGATURE OE
   2242         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   2243         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2244         /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u0153,\u0151,\u00F8",
   2245         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2246         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
   2247         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2248         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2249         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2250         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2251         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
   2252         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   2253         /* 4 */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171",
   2254         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2255         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2256         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2257         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   2258         /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
   2259         // U+0146: "" LATIN SMALL LETTER N WITH CEDILLA
   2260         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2261         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2262         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2263         /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
   2264         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2265         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2266         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2267         /* 7 */ "\u010D,\u00E7,\u0107",
   2268         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   2269         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   2270         /* 8 */ "\u00FD,\u00FF",
   2271         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   2272         /* 9 */ "\u010F",
   2273         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
   2274         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   2275         // U+0155: "" LATIN SMALL LETTER R WITH ACUTE
   2276         /* 10 */ "\u0157,\u0159,\u0155",
   2277         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
   2278         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   2279         /* 11 */ "\u0163,\u0165",
   2280         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   2281         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   2282         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   2283         /* 12 */ "\u017E,\u017C,\u017A",
   2284         // U+0137: "" LATIN SMALL LETTER K WITH CEDILLA
   2285         /* 13 */ "\u0137",
   2286         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
   2287         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   2288         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
   2289         // U+013E: "" LATIN SMALL LETTER L WITH CARON
   2290         /* 14 */ "\u013C,\u0142,\u013A,\u013E",
   2291         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
   2292         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   2293         /* 15 */ "\u0123,\u011F",
   2294         /* 16~ */
   2295         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2296         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2297         /* ~45 */
   2298         /* 46 */ "!text/single_9qm_lqm",
   2299         /* 47 */ "!text/double_9qm_lqm",
   2300     };
   2301 
   2302     /* Language mk: Macedonian */
   2303     private static final String[] LANGUAGE_mk = {
   2304         /* 0~ */
   2305         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2306         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2307         null, null, null, null, null, null, null, null, null,
   2308         /* ~38 */
   2309         // U+0455: "" CYRILLIC SMALL LETTER DZE
   2310         /* 39 */ "\u0455",
   2311         // U+045C: "" CYRILLIC SMALL LETTER KJE
   2312         /* 40 */ "\u045C",
   2313         // U+0437: "" CYRILLIC SMALL LETTER ZE
   2314         /* 41 */ "\u0437",
   2315         // U+0453: "" CYRILLIC SMALL LETTER GJE
   2316         /* 42 */ "\u0453",
   2317         // U+0450: "" CYRILLIC SMALL LETTER IE WITH GRAVE
   2318         /* 43 */ "\u0450",
   2319         // U+045D: "" CYRILLIC SMALL LETTER I WITH GRAVE
   2320         /* 44 */ "\u045D",
   2321         // Label for "switch to alphabetic" key.
   2322         // U+0410: "" CYRILLIC CAPITAL LETTER A
   2323         // U+0411: "" CYRILLIC CAPITAL LETTER BE
   2324         // U+0412: "" CYRILLIC CAPITAL LETTER VE
   2325         /* 45 */ "\u0410\u0411\u0412",
   2326         /* 46 */ "!text/single_9qm_lqm",
   2327         /* 47 */ "!text/double_9qm_lqm",
   2328     };
   2329 
   2330     /* Language mn: Mongolian */
   2331     private static final String[] LANGUAGE_mn = {
   2332         /* 0~ */
   2333         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2334         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2335         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2336         /* ~44 */
   2337         // Label for "switch to alphabetic" key.
   2338         // U+0410: "" CYRILLIC CAPITAL LETTER A
   2339         // U+0411: "" CYRILLIC CAPITAL LETTER BE
   2340         // U+0412: "" CYRILLIC CAPITAL LETTER VE
   2341         /* 45 */ "\u0410\u0411\u0412",
   2342         /* 46~ */
   2343         null, null, null, null, null,
   2344         /* ~50 */
   2345         // U+20AE: "" TUGRIK SIGN
   2346         /* 51 */ "\u20AE",
   2347     };
   2348 
   2349     /* Language nb: Norwegian Bokml */
   2350     private static final String[] LANGUAGE_nb = {
   2351         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2352         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2353         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2354         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2355         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2356         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2357         /* 0 */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101",
   2358         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2359         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2360         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2361         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2362         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2363         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2364         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2365         /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
   2366         /* 2 */ null,
   2367         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2368         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2369         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2370         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2371         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2372         // U+0153: "" LATIN SMALL LIGATURE OE
   2373         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2374         /* 3 */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D",
   2375         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2376         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2377         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2378         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2379         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2380         /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
   2381         /* 5~ */
   2382         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2383         /* ~19 */
   2384         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2385         /* 20 */ "\u00E5",
   2386         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2387         /* 21 */ "\u00F8",
   2388         // U+00E6: "" LATIN SMALL LETTER AE
   2389         /* 22 */ "\u00E6",
   2390         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2391         /* 23 */ "\u00F6",
   2392         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2393         /* 24 */ "\u00E4",
   2394         /* 25~ */
   2395         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2396         null, null, null, null, null, null,
   2397         /* ~45 */
   2398         /* 46 */ "!text/single_9qm_rqm",
   2399         /* 47 */ "!text/double_9qm_rqm",
   2400     };
   2401 
   2402     /* Language ne: Nepali */
   2403     private static final String[] LANGUAGE_ne = {
   2404         /* 0~ */
   2405         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2406         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2407         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2408         /* ~44 */
   2409         // Label for "switch to alphabetic" key.
   2410         // U+0915: "" DEVANAGARI LETTER KA
   2411         // U+0916: "" DEVANAGARI LETTER KHA
   2412         // U+0917: "" DEVANAGARI LETTER GA
   2413         /* 45 */ "\u0915\u0916\u0917",
   2414         /* 46~ */
   2415         null, null, null, null, null,
   2416         /* ~50 */
   2417         // U+0930/U+0941/U+002E "." NEPALESE RUPEE SIGN
   2418         /* 51 */ "\u0930\u0941.",
   2419         /* 52~ */
   2420         null, null, null, null, null, null, null, null, null, null, null,
   2421         /* ~62 */
   2422         // U+0967: "" DEVANAGARI DIGIT ONE
   2423         /* 63 */ "\u0967",
   2424         // U+0968: "" DEVANAGARI DIGIT TWO
   2425         /* 64 */ "\u0968",
   2426         // U+0969: "" DEVANAGARI DIGIT THREE
   2427         /* 65 */ "\u0969",
   2428         // U+096A: "" DEVANAGARI DIGIT FOUR
   2429         /* 66 */ "\u096A",
   2430         // U+096B: "" DEVANAGARI DIGIT FIVE
   2431         /* 67 */ "\u096B",
   2432         // U+096C: "" DEVANAGARI DIGIT SIX
   2433         /* 68 */ "\u096C",
   2434         // U+096D: "" DEVANAGARI DIGIT SEVEN
   2435         /* 69 */ "\u096D",
   2436         // U+096E: "" DEVANAGARI DIGIT EIGHT
   2437         /* 70 */ "\u096E",
   2438         // U+096F: "" DEVANAGARI DIGIT NINE
   2439         /* 71 */ "\u096F",
   2440         // U+0966: "" DEVANAGARI DIGIT ZERO
   2441         /* 72 */ "\u0966",
   2442         // Label for "switch to symbols" key.
   2443         /* 73 */ "?\u0967\u0968\u0969",
   2444         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
   2445         // part because it'll be appended by the code.
   2446         /* 74 */ "\u0967\u0968\u0969",
   2447         /* 75 */ "1",
   2448         /* 76 */ "2",
   2449         /* 77 */ "3",
   2450         /* 78 */ "4",
   2451         /* 79 */ "5",
   2452         /* 80 */ "6",
   2453         /* 81 */ "7",
   2454         /* 82 */ "8",
   2455         /* 83 */ "9",
   2456         /* 84 */ "0",
   2457     };
   2458 
   2459     /* Language nl: Dutch */
   2460     private static final String[] LANGUAGE_nl = {
   2461         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2462         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2463         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2464         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2465         // U+00E6: "" LATIN SMALL LETTER AE
   2466         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2467         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2468         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2469         /* 0 */ "\u00E1,\u00E4,\u00E2,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
   2470         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2471         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2472         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2473         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2474         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2475         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2476         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2477         /* 1 */ "\u00E9,\u00EB,\u00EA,\u00E8,\u0119,\u0117,\u0113",
   2478         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2479         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2480         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2481         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2482         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   2483         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2484         // U+0133: "" LATIN SMALL LIGATURE IJ
   2485         /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
   2486         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2487         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2488         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2489         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2490         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2491         // U+0153: "" LATIN SMALL LIGATURE OE
   2492         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2493         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2494         /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
   2495         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2496         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2497         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2498         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2499         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2500         /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
   2501         /* 5 */ null,
   2502         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2503         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2504         /* 6 */ "\u00F1,\u0144",
   2505         /* 7 */ null,
   2506         // U+0133: "" LATIN SMALL LIGATURE IJ
   2507         /* 8 */ "\u0133",
   2508         /* 9~ */
   2509         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2510         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2511         null, null, null, null, null, null, null,
   2512         /* ~45 */
   2513         /* 46 */ "!text/single_9qm_rqm",
   2514         /* 47 */ "!text/double_9qm_rqm",
   2515     };
   2516 
   2517     /* Language pl: Polish */
   2518     private static final String[] LANGUAGE_pl = {
   2519         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   2520         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2521         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2522         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2523         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2524         // U+00E6: "" LATIN SMALL LETTER AE
   2525         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2526         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2527         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2528         /* 0 */ "\u0105,\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
   2529         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2530         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2531         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2532         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2533         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2534         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2535         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2536         /* 1 */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113",
   2537         /* 2 */ null,
   2538         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2539         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2540         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2541         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2542         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2543         // U+0153: "" LATIN SMALL LIGATURE OE
   2544         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2545         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2546         /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
   2547         /* 4 */ null,
   2548         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2549         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2550         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2551         /* 5 */ "\u015B,\u00DF,\u0161",
   2552         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2553         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2554         /* 6 */ "\u0144,\u00F1",
   2555         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2556         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2557         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2558         /* 7 */ "\u0107,\u00E7,\u010D",
   2559         /* 8~ */
   2560         null, null, null, null,
   2561         /* ~11 */
   2562         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   2563         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   2564         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   2565         /* 12 */ "\u017C,\u017A,\u017E",
   2566         /* 13 */ null,
   2567         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   2568         /* 14 */ "\u0142",
   2569         /* 15~ */
   2570         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2571         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2572         null,
   2573         /* ~45 */
   2574         /* 46 */ "!text/single_9qm_rqm",
   2575         /* 47 */ "!text/double_9qm_rqm",
   2576     };
   2577 
   2578     /* Language pt: Portuguese */
   2579     private static final String[] LANGUAGE_pt = {
   2580         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2581         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2582         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2583         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2584         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2585         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2586         // U+00E6: "" LATIN SMALL LETTER AE
   2587         // U+00AA: "" FEMININE ORDINAL INDICATOR
   2588         /* 0 */ "\u00E1,\u00E3,\u00E0,\u00E2,\u00E4,\u00E5,\u00E6,\u00AA",
   2589         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2590         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2591         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2592         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2593         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2594         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2595         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2596         /* 1 */ "\u00E9,\u00EA,\u00E8,\u0119,\u0117,\u0113,\u00EB",
   2597         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2598         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2599         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2600         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2601         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   2602         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2603         /* 2 */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B",
   2604         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2605         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2606         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2607         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2608         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2609         // U+0153: "" LATIN SMALL LIGATURE OE
   2610         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2611         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2612         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   2613         /* 3 */ "\u00F3,\u00F5,\u00F4,\u00F2,\u00F6,\u0153,\u00F8,\u014D,\u00BA",
   2614         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2615         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2616         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2617         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2618         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2619         /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
   2620         /* 5 */ null,
   2621         /* 6 */ null,
   2622         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2623         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2624         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2625         /* 7 */ "\u00E7,\u010D,\u0107",
   2626     };
   2627 
   2628     /* Language rm: Raeto-Romance */
   2629     private static final String[] LANGUAGE_rm = {
   2630         /* 0~ */
   2631         null, null, null,
   2632         /* ~2 */
   2633         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2634         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2635         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2636         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2637         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2638         // U+0153: "" LATIN SMALL LIGATURE OE
   2639         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2640         /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u0153,\u00F8",
   2641     };
   2642 
   2643     /* Language ro: Romanian */
   2644     private static final String[] LANGUAGE_ro = {
   2645         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2646         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2647         // U+0103: "" LATIN SMALL LETTER A WITH BREVE
   2648         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2649         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2650         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2651         // U+00E6: "" LATIN SMALL LETTER AE
   2652         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2653         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2654         /* 0 */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101",
   2655         /* 1 */ null,
   2656         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2657         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2658         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2659         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2660         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   2661         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2662         /* 2 */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
   2663         /* 3 */ null,
   2664         /* 4 */ null,
   2665         // U+0219: "" LATIN SMALL LETTER S WITH COMMA BELOW
   2666         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2667         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2668         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2669         /* 5 */ "\u0219,\u00DF,\u015B,\u0161",
   2670         /* 6~ */
   2671         null, null, null, null, null,
   2672         /* ~10 */
   2673         // U+021B: "" LATIN SMALL LETTER T WITH COMMA BELOW
   2674         /* 11 */ "\u021B",
   2675         /* 12~ */
   2676         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2677         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2678         null, null, null, null,
   2679         /* ~45 */
   2680         /* 46 */ "!text/single_9qm_rqm",
   2681         /* 47 */ "!text/double_9qm_rqm",
   2682     };
   2683 
   2684     /* Language ru: Russian */
   2685     private static final String[] LANGUAGE_ru = {
   2686         /* 0~ */
   2687         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2688         null, null, null, null, null, null, null, null, null, null,
   2689         /* ~24 */
   2690         // U+0449: "" CYRILLIC SMALL LETTER SHCHA
   2691         /* 25 */ "\u0449",
   2692         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   2693         /* 26 */ "\u044A",
   2694         // U+044B: "" CYRILLIC SMALL LETTER YERU
   2695         /* 27 */ "\u044B",
   2696         // U+044D: "" CYRILLIC SMALL LETTER E
   2697         /* 28 */ "\u044D",
   2698         // U+0438: "" CYRILLIC SMALL LETTER I
   2699         /* 29 */ "\u0438",
   2700         /* 30~ */
   2701         null, null, null, null, null, null, null,
   2702         /* ~36 */
   2703         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   2704         /* 37 */ "\u044A",
   2705         /* 38~ */
   2706         null, null, null, null, null,
   2707         /* ~42 */
   2708         // U+0451: "" CYRILLIC SMALL LETTER IO
   2709         /* 43 */ "\u0451",
   2710         /* 44 */ null,
   2711         // Label for "switch to alphabetic" key.
   2712         // U+0410: "" CYRILLIC CAPITAL LETTER A
   2713         // U+0411: "" CYRILLIC CAPITAL LETTER BE
   2714         // U+0412: "" CYRILLIC CAPITAL LETTER VE
   2715         /* 45 */ "\u0410\u0411\u0412",
   2716         /* 46 */ "!text/single_9qm_lqm",
   2717         /* 47 */ "!text/double_9qm_lqm",
   2718     };
   2719 
   2720     /* Language sk: Slovak */
   2721     private static final String[] LANGUAGE_sk = {
   2722         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2723         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2724         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2725         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2726         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2727         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2728         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2729         // U+00E6: "" LATIN SMALL LETTER AE
   2730         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   2731         /* 0 */ "\u00E1,\u00E4,\u0101,\u00E0,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
   2732         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2733         // U+011B: "" LATIN SMALL LETTER E WITH CARON
   2734         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2735         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2736         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2737         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2738         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2739         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2740         /* 1 */ "\u00E9,\u011B,\u0113,\u0117,\u00E8,\u00EA,\u00EB,\u0119",
   2741         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2742         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2743         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   2744         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2745         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2746         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2747         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   2748         /* 2 */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131",
   2749         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2750         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2751         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2752         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2753         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2754         // U+0153: "" LATIN SMALL LIGATURE OE
   2755         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   2756         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2757         /* 3 */ "\u00F4,\u00F3,\u00F6,\u00F2,\u00F5,\u0153,\u0151,\u00F8",
   2758         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2759         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
   2760         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2761         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2762         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
   2763         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2764         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2765         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   2766         /* 4 */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\u0171",
   2767         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2768         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2769         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2770         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   2771         /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
   2772         // U+0148: "" LATIN SMALL LETTER N WITH CARON
   2773         // U+0146: "" LATIN SMALL LETTER N WITH CEDILLA
   2774         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2775         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2776         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2777         /* 6 */ "\u0148,\u0146,\u00F1,\u0144,\u0144",
   2778         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2779         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2780         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2781         /* 7 */ "\u010D,\u00E7,\u0107",
   2782         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   2783         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   2784         /* 8 */ "\u00FD,\u00FF",
   2785         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   2786         /* 9 */ "\u010F",
   2787         // U+0155: "" LATIN SMALL LETTER R WITH ACUTE
   2788         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   2789         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
   2790         /* 10 */ "\u0155,\u0159,\u0157",
   2791         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   2792         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
   2793         /* 11 */ "\u0165,\u0163",
   2794         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   2795         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   2796         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   2797         /* 12 */ "\u017E,\u017C,\u017A",
   2798         // U+0137: "" LATIN SMALL LETTER K WITH CEDILLA
   2799         /* 13 */ "\u0137",
   2800         // U+013E: "" LATIN SMALL LETTER L WITH CARON
   2801         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
   2802         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
   2803         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   2804         /* 14 */ "\u013E,\u013A,\u013C,\u0142",
   2805         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
   2806         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   2807         /* 15 */ "\u0123,\u011F",
   2808         /* 16~ */
   2809         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2810         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2811         /* ~45 */
   2812         /* 46 */ "!text/single_9qm_lqm",
   2813         /* 47 */ "!text/double_9qm_lqm",
   2814         /* 48 */ "!text/single_raqm_laqm",
   2815         /* 49 */ "!text/double_raqm_laqm",
   2816     };
   2817 
   2818     /* Language sl: Slovenian */
   2819     private static final String[] LANGUAGE_sl = {
   2820         /* 0~ */
   2821         null, null, null, null, null,
   2822         /* ~4 */
   2823         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2824         /* 5 */ "\u0161",
   2825         /* 6 */ null,
   2826         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2827         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2828         /* 7 */ "\u010D,\u0107",
   2829         /* 8 */ null,
   2830         // U+0111: "" LATIN SMALL LETTER D WITH STROKE
   2831         /* 9 */ "\u0111",
   2832         /* 10 */ null,
   2833         /* 11 */ null,
   2834         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   2835         /* 12 */ "\u017E",
   2836         /* 13~ */
   2837         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2838         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2839         null, null, null,
   2840         /* ~45 */
   2841         /* 46 */ "!text/single_9qm_lqm",
   2842         /* 47 */ "!text/double_9qm_lqm",
   2843         /* 48 */ "!text/single_raqm_laqm",
   2844         /* 49 */ "!text/double_raqm_laqm",
   2845     };
   2846 
   2847     /* Language sr: Serbian */
   2848     private static final String[] LANGUAGE_sr = {
   2849         /* 0~ */
   2850         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2851         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2852         null, null, null, null, null, null, null, null, null,
   2853         /* ~38 */
   2854         // TODO: Move these to sr-Latn once we can handle IETF language tag with script name specified.
   2855         // BEGIN: More keys definitions for Serbian (Latin)
   2856         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2857         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2858         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2859         // <string name="more_keys_for_s">&#x0161;,&#x00DF;,&#x015B;</string>
   2860         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2861         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2862         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2863         // <string name="more_keys_for_c">&#x010D;,&#x00E7;,&#x0107;</string>
   2864         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   2865         // <string name="more_keys_for_d">&#x010F;</string>
   2866         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   2867         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   2868         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   2869         // <string name="more_keys_for_z">&#x017E;,&#x017A;,&#x017C;</string>
   2870         // END: More keys definitions for Serbian (Latin)
   2871         // BEGIN: More keys definitions for Serbian (Cyrillic)
   2872         // U+0437: "" CYRILLIC SMALL LETTER ZE
   2873         /* 39 */ "\u0437",
   2874         // U+045B: "" CYRILLIC SMALL LETTER TSHE
   2875         /* 40 */ "\u045B",
   2876         // U+0455: "" CYRILLIC SMALL LETTER DZE
   2877         /* 41 */ "\u0455",
   2878         // U+0452: "" CYRILLIC SMALL LETTER DJE
   2879         /* 42 */ "\u0452",
   2880         // U+0450: "" CYRILLIC SMALL LETTER IE WITH GRAVE
   2881         /* 43 */ "\u0450",
   2882         // U+045D: "" CYRILLIC SMALL LETTER I WITH GRAVE
   2883         /* 44 */ "\u045D",
   2884         // END: More keys definitions for Serbian (Cyrillic)
   2885         // Label for "switch to alphabetic" key.
   2886         // U+0410: "" CYRILLIC CAPITAL LETTER A
   2887         // U+0411: "" CYRILLIC CAPITAL LETTER BE
   2888         // U+0412: "" CYRILLIC CAPITAL LETTER VE
   2889         /* 45 */ "\u0410\u0411\u0412",
   2890         /* 46 */ "!text/single_9qm_lqm",
   2891         /* 47 */ "!text/double_9qm_lqm",
   2892         /* 48 */ "!text/single_raqm_laqm",
   2893         /* 49 */ "!text/double_raqm_laqm",
   2894     };
   2895 
   2896     /* Language sv: Swedish */
   2897     private static final String[] LANGUAGE_sv = {
   2898         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2899         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2900         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2901         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   2902         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2903         /* 0 */ "\u00E1,\u00E0,\u00E2,\u0105,\u00E3",
   2904         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2905         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2906         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2907         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2908         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2909         /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119",
   2910         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2911         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2912         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2913         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2914         /* 2 */ "\u00ED,\u00EC,\u00EE,\u00EF",
   2915         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2916         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2917         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2918         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2919         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2920         /* 3 */ "\u00F3,\u00F2,\u00F4,\u00F5,\u014D",
   2921         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2922         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2923         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2924         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2925         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2926         /* 4 */ "\u00FC,\u00FA,\u00F9,\u00FB,\u016B",
   2927         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2928         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2929         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   2930         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2931         /* 5 */ "\u015B,\u0161,\u015F,\u00DF",
   2932         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2933         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2934         // U+0148: "" LATIN SMALL LETTER N WITH CARON
   2935         /* 6 */ "\u0144,\u00F1,\u0148",
   2936         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2937         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2938         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2939         /* 7 */ "\u00E7,\u0107,\u010D",
   2940         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   2941         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   2942         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2943         /* 8 */ "\u00FD,\u00FF,\u00FC",
   2944         // U+00F0: "" LATIN SMALL LETTER ETH
   2945         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   2946         /* 9 */ "\u00F0,\u010F",
   2947         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   2948         /* 10 */ "\u0159",
   2949         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   2950         // U+00FE: "" LATIN SMALL LETTER THORN
   2951         /* 11 */ "\u0165,\u00FE",
   2952         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   2953         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   2954         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   2955         /* 12 */ "\u017A,\u017E,\u017C",
   2956         /* 13 */ null,
   2957         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   2958         /* 14 */ "\u0142",
   2959         /* 15~ */
   2960         null, null, null, null, null,
   2961         /* ~19 */
   2962         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2963         /* 20 */ "\u00E5",
   2964         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2965         /* 21 */ "\u00F6",
   2966         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2967         /* 22 */ "\u00E4",
   2968         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2969         // U+0153: "" LATIN SMALL LIGATURE OE
   2970         /* 23 */ "\u00F8,\u0153",
   2971         // U+00E6: "" LATIN SMALL LETTER AE
   2972         /* 24 */ "\u00E6",
   2973         /* 25~ */
   2974         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2975         null, null, null, null, null, null, null, null,
   2976         /* ~47 */
   2977         /* 48 */ "!text/single_raqm_laqm",
   2978         /* 49 */ "!text/double_raqm_laqm",
   2979     };
   2980 
   2981     /* Language sw: Swahili */
   2982     private static final String[] LANGUAGE_sw = {
   2983         // This is the same as English except more_keys_for_g.
   2984         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2985         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2986         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2987         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2988         // U+00E6: "" LATIN SMALL LETTER AE
   2989         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2990         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2991         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2992         /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
   2993         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2994         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2995         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2996         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2997         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2998         /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
   2999         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   3000         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   3001         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   3002         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   3003         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   3004         /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
   3005         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   3006         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   3007         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   3008         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   3009         // U+0153: "" LATIN SMALL LIGATURE OE
   3010         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   3011         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   3012         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   3013         /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
   3014         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   3015         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   3016         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   3017         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   3018         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   3019         /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
   3020         // U+00DF: "" LATIN SMALL LETTER SHARP S
   3021         /* 5 */ "\u00DF",
   3022         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   3023         /* 6 */ "\u00F1",
   3024         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   3025         /* 7 */ "\u00E7",
   3026         /* 8~ */
   3027         null, null, null, null, null, null, null,
   3028         /* ~14 */
   3029         /* 15 */ "g\'",
   3030     };
   3031 
   3032     /* Language th: Thai */
   3033     private static final String[] LANGUAGE_th = {
   3034         /* 0~ */
   3035         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   3036         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   3037         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   3038         /* ~44 */
   3039         // Label for "switch to alphabetic" key.
   3040         // U+0E01: "" THAI CHARACTER KO KAI
   3041         // U+0E02: "" THAI CHARACTER KHO KHAI
   3042         // U+0E04: "" THAI CHARACTER KHO KHWAI
   3043         /* 45 */ "\u0E01\u0E02\u0E04",
   3044         /* 46~ */
   3045         null, null, null, null, null,
   3046         /* ~50 */
   3047         // U+0E3F: "" THAI CURRENCY SYMBOL BAHT
   3048         /* 51 */ "\u0E3F",
   3049     };
   3050 
   3051     /* Language tl: Tagalog */
   3052     private static final String[] LANGUAGE_tl = {
   3053         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   3054         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   3055         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   3056         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   3057         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   3058         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   3059         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   3060         // U+00E6: "" LATIN SMALL LETTER AE
   3061         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   3062         // U+00AA: "" FEMININE ORDINAL INDICATOR
   3063         /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
   3064         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   3065         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   3066         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   3067         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   3068         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   3069         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   3070         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   3071         /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
   3072         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   3073         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   3074         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   3075         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   3076         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   3077         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   3078         /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
   3079         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   3080         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   3081         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   3082         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   3083         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   3084         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   3085         // U+0153: "" LATIN SMALL LIGATURE OE
   3086         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   3087         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   3088         /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
   3089         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   3090         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   3091         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   3092         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   3093         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   3094         /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
   3095         /* 5 */ null,
   3096         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   3097         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   3098         /* 6 */ "\u00F1,\u0144",
   3099         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   3100         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   3101         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   3102         /* 7 */ "\u00E7,\u0107,\u010D",
   3103     };
   3104 
   3105     /* Language tr: Turkish */
   3106     private static final String[] LANGUAGE_tr = {
   3107         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   3108         /* 0 */ "\u00E2",
   3109         /* 1 */ null,
   3110         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   3111         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   3112         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   3113         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   3114         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   3115         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   3116         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   3117         /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
   3118         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   3119         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   3120         // U+0153: "" LATIN SMALL LIGATURE OE
   3121         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   3122         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   3123         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   3124         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   3125         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   3126         /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
   3127         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   3128         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   3129         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   3130         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   3131         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   3132         /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
   3133         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   3134         // U+00DF: "" LATIN SMALL LETTER SHARP S
   3135         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   3136         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   3137         /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
   3138         /* 6 */ null,
   3139         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   3140         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   3141         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   3142         /* 7 */ "\u00E7,\u0107,\u010D",
   3143         /* 8~ */
   3144         null, null, null, null, null, null, null,
   3145         /* ~14 */
   3146         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   3147         /* 15 */ "\u011F",
   3148     };
   3149 
   3150     /* Language uk: Ukrainian */
   3151     private static final String[] LANGUAGE_uk = {
   3152         /* 0~ */
   3153         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   3154         null, null, null, null, null, null, null, null, null, null,
   3155         /* ~24 */
   3156         // U+0449: "" CYRILLIC SMALL LETTER SHCHA
   3157         /* 25 */ "\u0449",
   3158         // U+0457: "" CYRILLIC SMALL LETTER YI
   3159         /* 26 */ "\u0457",
   3160         // U+0456: "" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
   3161         /* 27 */ "\u0456",
   3162         // U+0454: "" CYRILLIC SMALL LETTER UKRAINIAN IE
   3163         /* 28 */ "\u0454",
   3164         // U+0438: "" CYRILLIC SMALL LETTER I
   3165         /* 29 */ "\u0438",
   3166         /* 30~ */
   3167         null, null, null,
   3168         /* ~32 */
   3169         // U+0491: "" CYRILLIC SMALL LETTER GHE WITH UPTURN
   3170         /* 33 */ "\u0491",
   3171         // U+0457: "" CYRILLIC SMALL LETTER YI
   3172         /* 34 */ "\u0457",
   3173         /* 35 */ null,
   3174         /* 36 */ null,
   3175         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   3176         /* 37 */ "\u044A",
   3177         /* 38~ */
   3178         null, null, null, null, null, null, null,
   3179         /* ~44 */
   3180         // Label for "switch to alphabetic" key.
   3181         // U+0410: "" CYRILLIC CAPITAL LETTER A
   3182         // U+0411: "" CYRILLIC CAPITAL LETTER BE
   3183         // U+0412: "" CYRILLIC CAPITAL LETTER VE
   3184         /* 45 */ "\u0410\u0411\u0412",
   3185         /* 46 */ "!text/single_9qm_lqm",
   3186         /* 47 */ "!text/double_9qm_lqm",
   3187         /* 48~ */
   3188         null, null, null,
   3189         /* ~50 */
   3190         // U+20B4: "" HRYVNIA SIGN
   3191         /* 51 */ "\u20B4",
   3192     };
   3193 
   3194     /* Language vi: Vietnamese */
   3195     private static final String[] LANGUAGE_vi = {
   3196         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   3197         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   3198         // U+1EA3: "" LATIN SMALL LETTER A WITH HOOK ABOVE
   3199         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   3200         // U+1EA1: "" LATIN SMALL LETTER A WITH DOT BELOW
   3201         // U+0103: "" LATIN SMALL LETTER A WITH BREVE
   3202         // U+1EB1: "" LATIN SMALL LETTER A WITH BREVE AND GRAVE
   3203         // U+1EAF: "" LATIN SMALL LETTER A WITH BREVE AND ACUTE
   3204         // U+1EB3: "" LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
   3205         // U+1EB5: "" LATIN SMALL LETTER A WITH BREVE AND TILDE
   3206         // U+1EB7: "" LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
   3207         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   3208         // U+1EA7: "" LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
   3209         // U+1EA5: "" LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
   3210         // U+1EA9: "" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
   3211         // U+1EAB: "" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
   3212         // U+1EAD: "" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
   3213         /* 0 */ "\u00E0,\u00E1,\u1EA3,\u00E3,\u1EA1,\u0103,\u1EB1,\u1EAF,\u1EB3,\u1EB5,\u1EB7,\u00E2,\u1EA7,\u1EA5,\u1EA9,\u1EAB,\u1EAD",
   3214         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   3215         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   3216         // U+1EBB: "" LATIN SMALL LETTER E WITH HOOK ABOVE
   3217         // U+1EBD: "" LATIN SMALL LETTER E WITH TILDE
   3218         // U+1EB9: "" LATIN SMALL LETTER E WITH DOT BELOW
   3219         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   3220         // U+1EC1: "" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
   3221         // U+1EBF: "" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
   3222         // U+1EC3: "" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
   3223         // U+1EC5: "" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
   3224         // U+1EC7: "" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
   3225         /* 1 */ "\u00E8,\u00E9,\u1EBB,\u1EBD,\u1EB9,\u00EA,\u1EC1,\u1EBF,\u1EC3,\u1EC5,\u1EC7",
   3226         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   3227         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   3228         // U+1EC9: "" LATIN SMALL LETTER I WITH HOOK ABOVE
   3229         // U+0129: "" LATIN SMALL LETTER I WITH TILDE
   3230         // U+1ECB: "" LATIN SMALL LETTER I WITH DOT BELOW
   3231         /* 2 */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB",
   3232         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   3233         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   3234         // U+1ECF: "" LATIN SMALL LETTER O WITH HOOK ABOVE
   3235         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   3236         // U+1ECD: "" LATIN SMALL LETTER O WITH DOT BELOW
   3237         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   3238         // U+1ED3: "" LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
   3239         // U+1ED1: "" LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
   3240         // U+1ED5: "" LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
   3241         // U+1ED7: "" LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
   3242         // U+1ED9: "" LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
   3243         // U+01A1: "" LATIN SMALL LETTER O WITH HORN
   3244         // U+1EDD: "" LATIN SMALL LETTER O WITH HORN AND GRAVE
   3245         // U+1EDB: "" LATIN SMALL LETTER O WITH HORN AND ACUTE
   3246         // U+1EDF: "" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
   3247         // U+1EE1: "" LATIN SMALL LETTER O WITH HORN AND TILDE
   3248         // U+1EE3: "" LATIN SMALL LETTER O WITH HORN AND DOT BELOW
   3249         /* 3 */ "\u00F2,\u00F3,\u1ECF,\u00F5,\u1ECD,\u00F4,\u1ED3,\u1ED1,\u1ED5,\u1ED7,\u1ED9,\u01A1,\u1EDD,\u1EDB,\u1EDF,\u1EE1,\u1EE3",
   3250         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   3251         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   3252         // U+1EE7: "" LATIN SMALL LETTER U WITH HOOK ABOVE
   3253         // U+0169: "" LATIN SMALL LETTER U WITH TILDE
   3254         // U+1EE5: "" LATIN SMALL LETTER U WITH DOT BELOW
   3255         // U+01B0: "" LATIN SMALL LETTER U WITH HORN
   3256         // U+1EEB: "" LATIN SMALL LETTER U WITH HORN AND GRAVE
   3257         // U+1EE9: "" LATIN SMALL LETTER U WITH HORN AND ACUTE
   3258         // U+1EED: "" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
   3259         // U+1EEF: "" LATIN SMALL LETTER U WITH HORN AND TILDE
   3260         // U+1EF1: "" LATIN SMALL LETTER U WITH HORN AND DOT BELOW
   3261         /* 4 */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1",
   3262         /* 5~ */
   3263         null, null, null,
   3264         /* ~7 */
   3265         // U+1EF3: "" LATIN SMALL LETTER Y WITH GRAVE
   3266         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   3267         // U+1EF7: "" LATIN SMALL LETTER Y WITH HOOK ABOVE
   3268         // U+1EF9: "" LATIN SMALL LETTER Y WITH TILDE
   3269         // U+1EF5: "" LATIN SMALL LETTER Y WITH DOT BELOW
   3270         /* 8 */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5",
   3271         // U+0111: "" LATIN SMALL LETTER D WITH STROKE
   3272         /* 9 */ "\u0111",
   3273         /* 10~ */
   3274         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   3275         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   3276         null, null, null, null, null, null, null, null, null, null, null,
   3277         /* ~50 */
   3278         // U+20AB: "" DONG SIGN
   3279         /* 51 */ "\u20AB",
   3280     };
   3281 
   3282     /* Language zu: Zulu */
   3283     private static final String[] LANGUAGE_zu = {
   3284         // This is the same as English
   3285         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   3286         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   3287         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   3288         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   3289         // U+00E6: "" LATIN SMALL LETTER AE
   3290         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   3291         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   3292         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   3293         /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
   3294         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   3295         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   3296         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   3297         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   3298         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   3299         /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
   3300         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   3301         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   3302         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   3303         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   3304         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   3305         /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
   3306         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   3307         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   3308         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   3309         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   3310         // U+0153: "" LATIN SMALL LIGATURE OE
   3311         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   3312         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   3313         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   3314         /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
   3315         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   3316         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   3317         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   3318         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   3319         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   3320         /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
   3321         // U+00DF: "" LATIN SMALL LETTER SHARP S
   3322         /* 5 */ "\u00DF",
   3323         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   3324         /* 6 */ "\u00F1",
   3325         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   3326         /* 7 */ "\u00E7",
   3327     };
   3328 
   3329     /* Language zz: Alphabet */
   3330     private static final String[] LANGUAGE_zz = {
   3331         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   3332         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   3333         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   3334         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   3335         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   3336         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   3337         // U+00E6: "" LATIN SMALL LETTER AE
   3338         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   3339         // U+0103: "" LATIN SMALL LETTER A WITH BREVE
   3340         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   3341         // U+00AA: "" FEMININE ORDINAL INDICATOR
   3342         /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
   3343         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   3344         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   3345         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   3346         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   3347         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   3348         // U+0115: "" LATIN SMALL LETTER E WITH BREVE
   3349         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   3350         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   3351         // U+011B: "" LATIN SMALL LETTER E WITH CARON
   3352         /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B",
   3353         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   3354         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   3355         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   3356         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   3357         // U+0129: "" LATIN SMALL LETTER I WITH TILDE
   3358         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   3359         // U+012D: "" LATIN SMALL LETTER I WITH BREVE
   3360         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   3361         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   3362         // U+0133: "" LATIN SMALL LIGATURE IJ
   3363         /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
   3364         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   3365         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   3366         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   3367         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   3368         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   3369         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   3370         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   3371         // U+014F: "" LATIN SMALL LETTER O WITH BREVE
   3372         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   3373         // U+0153: "" LATIN SMALL LIGATURE OE
   3374         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   3375         /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA",
   3376         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   3377         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   3378         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   3379         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   3380         // U+0169: "" LATIN SMALL LETTER U WITH TILDE
   3381         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   3382         // U+016D: "" LATIN SMALL LETTER U WITH BREVE
   3383         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
   3384         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   3385         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
   3386         /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173",
   3387         // U+00DF: "" LATIN SMALL LETTER SHARP S
   3388         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   3389         // U+015D: "" LATIN SMALL LETTER S WITH CIRCUMFLEX
   3390         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   3391         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   3392         // U+017F: "" LATIN SMALL LETTER LONG S
   3393         /* 5 */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F",
   3394         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   3395         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   3396         // U+0146: "" LATIN SMALL LETTER N WITH CEDILLA
   3397         // U+0148: "" LATIN SMALL LETTER N WITH CARON
   3398         // U+0149: "" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
   3399         // U+014B: "" LATIN SMALL LETTER ENG
   3400         /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
   3401         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   3402         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   3403         // U+0109: "" LATIN SMALL LETTER C WITH CIRCUMFLEX
   3404         // U+010B: "" LATIN SMALL LETTER C WITH DOT ABOVE
   3405         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   3406         /* 7 */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
   3407         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   3408         // U+0177: "" LATIN SMALL LETTER Y WITH CIRCUMFLEX
   3409         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   3410         // U+0133: "" LATIN SMALL LIGATURE IJ
   3411         /* 8 */ "\u00FD,\u0177,\u00FF,\u0133",
   3412         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   3413         // U+0111: "" LATIN SMALL LETTER D WITH STROKE
   3414         // U+00F0: "" LATIN SMALL LETTER ETH
   3415         /* 9 */ "\u010F,\u0111,\u00F0",
   3416         // U+0155: "" LATIN SMALL LETTER R WITH ACUTE
   3417         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
   3418         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   3419         /* 10 */ "\u0155,\u0157,\u0159",
   3420         // U+00FE: "" LATIN SMALL LETTER THORN
   3421         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
   3422         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   3423         // U+0167: "" LATIN SMALL LETTER T WITH STROKE
   3424         /* 11 */ "\u00FE,\u0163,\u0165,\u0167",
   3425         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   3426         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   3427         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   3428         /* 12 */ "\u017A,\u017C,\u017E",
   3429         // U+0137: "" LATIN SMALL LETTER K WITH CEDILLA
   3430         // U+0138: "" LATIN SMALL LETTER KRA
   3431         /* 13 */ "\u0137,\u0138",
   3432         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
   3433         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
   3434         // U+013E: "" LATIN SMALL LETTER L WITH CARON
   3435         // U+0140: "" LATIN SMALL LETTER L WITH MIDDLE DOT
   3436         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   3437         /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
   3438         // U+011D: "" LATIN SMALL LETTER G WITH CIRCUMFLEX
   3439         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   3440         // U+0121: "" LATIN SMALL LETTER G WITH DOT ABOVE
   3441         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
   3442         /* 15 */ "\u011D,\u011F,\u0121,\u0123",
   3443         /* 16 */ null,
   3444         // U+0125: "" LATIN SMALL LETTER H WITH CIRCUMFLEX
   3445         /* 17 */ "\u0125",
   3446         // U+0135: "" LATIN SMALL LETTER J WITH CIRCUMFLEX
   3447         /* 18 */ "\u0135",
   3448         // U+0175: "" LATIN SMALL LETTER W WITH CIRCUMFLEX
   3449         /* 19 */ "\u0175",
   3450     };
   3451 
   3452     private static final Object[] LANGUAGES_AND_TEXTS = {
   3453         "DEFAULT", LANGUAGE_DEFAULT, /* default */
   3454         "af", LANGUAGE_af, /* Afrikaans */
   3455         "ar", LANGUAGE_ar, /* Arabic */
   3456         "az", LANGUAGE_az, /* Azerbaijani */
   3457         "be", LANGUAGE_be, /* Belarusian */
   3458         "bg", LANGUAGE_bg, /* Bulgarian */
   3459         "ca", LANGUAGE_ca, /* Catalan */
   3460         "cs", LANGUAGE_cs, /* Czech */
   3461         "da", LANGUAGE_da, /* Danish */
   3462         "de", LANGUAGE_de, /* German */
   3463         "el", LANGUAGE_el, /* Greek */
   3464         "en", LANGUAGE_en, /* English */
   3465         "eo", LANGUAGE_eo, /* Esperanto */
   3466         "es", LANGUAGE_es, /* Spanish */
   3467         "et", LANGUAGE_et, /* Estonian */
   3468         "fa", LANGUAGE_fa, /* Persian */
   3469         "fi", LANGUAGE_fi, /* Finnish */
   3470         "fr", LANGUAGE_fr, /* French */
   3471         "hi", LANGUAGE_hi, /* Hindi */
   3472         "hr", LANGUAGE_hr, /* Croatian */
   3473         "hu", LANGUAGE_hu, /* Hungarian */
   3474         "hy", LANGUAGE_hy, /* Armenian */
   3475         "is", LANGUAGE_is, /* Icelandic */
   3476         "it", LANGUAGE_it, /* Italian */
   3477         "iw", LANGUAGE_iw, /* Hebrew */
   3478         "ka", LANGUAGE_ka, /* Georgian */
   3479         "kk", LANGUAGE_kk, /* Kazakh */
   3480         "km", LANGUAGE_km, /* Khmer */
   3481         "ky", LANGUAGE_ky, /* Kirghiz */
   3482         "lo", LANGUAGE_lo, /* Lao */
   3483         "lt", LANGUAGE_lt, /* Lithuanian */
   3484         "lv", LANGUAGE_lv, /* Latvian */
   3485         "mk", LANGUAGE_mk, /* Macedonian */
   3486         "mn", LANGUAGE_mn, /* Mongolian */
   3487         "nb", LANGUAGE_nb, /* Norwegian Bokml */
   3488         "ne", LANGUAGE_ne, /* Nepali */
   3489         "nl", LANGUAGE_nl, /* Dutch */
   3490         "pl", LANGUAGE_pl, /* Polish */
   3491         "pt", LANGUAGE_pt, /* Portuguese */
   3492         "rm", LANGUAGE_rm, /* Raeto-Romance */
   3493         "ro", LANGUAGE_ro, /* Romanian */
   3494         "ru", LANGUAGE_ru, /* Russian */
   3495         "sk", LANGUAGE_sk, /* Slovak */
   3496         "sl", LANGUAGE_sl, /* Slovenian */
   3497         "sr", LANGUAGE_sr, /* Serbian */
   3498         "sv", LANGUAGE_sv, /* Swedish */
   3499         "sw", LANGUAGE_sw, /* Swahili */
   3500         "th", LANGUAGE_th, /* Thai */
   3501         "tl", LANGUAGE_tl, /* Tagalog */
   3502         "tr", LANGUAGE_tr, /* Turkish */
   3503         "uk", LANGUAGE_uk, /* Ukrainian */
   3504         "vi", LANGUAGE_vi, /* Vietnamese */
   3505         "zu", LANGUAGE_zu, /* Zulu */
   3506         "zz", LANGUAGE_zz, /* Alphabet */
   3507     };
   3508 
   3509     static {
   3510         int id = 0;
   3511         for (final String name : NAMES) {
   3512             sNameToIdsMap.put(name, id++);
   3513         }
   3514 
   3515         for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
   3516             final String language = (String)LANGUAGES_AND_TEXTS[i];
   3517             final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
   3518             sLocaleToTextsMap.put(language, texts);
   3519         }
   3520     }
   3521 }
   3522