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"); you may not
      5  * use this file except in compliance with the License. You may obtain a copy of
      6  * 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, WITHOUT
     12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     13  * License for the specific language governing permissions and limitations under
     14  * 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.latin.CollectionUtils;
     23 import com.android.inputmethod.latin.R;
     24 
     25 import java.util.HashMap;
     26 
     27 /**
     28  * !!!!! DO NOT EDIT THIS FILE !!!!!
     29  *
     30  * This file is generated by tools/maketext. The base template file is
     31  *   tools/maketext/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/maketext/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/maketext
     41  *   $ maketext -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(Context context) {
     64         loadStringResourcesInternal(context, RESOURCE_NAMES, R.string.english_ime_name);
     65     }
     66 
     67     /* package for test */
     68     void loadStringResourcesInternal(Context context, final String[] resourceNames,
     69             int referenceId) {
     70         final Resources res = context.getResources();
     71         final String packageName = res.getResourcePackageName(referenceId);
     72         for (final String resName : resourceNames) {
     73             final int resId = res.getIdentifier(resName, "string", packageName);
     74             mResourceNameToTextsMap.put(resName, res.getString(resId));
     75         }
     76     }
     77 
     78     public String getText(final String name) {
     79         String text = mResourceNameToTextsMap.get(name);
     80         if (text != null) {
     81             return text;
     82         }
     83         final Integer id = sNameToIdsMap.get(name);
     84         if (id == null) throw new RuntimeException("Unknown label: " + name);
     85         text = (id < mTexts.length) ? mTexts[id] : null;
     86         return (text == null) ? LANGUAGE_DEFAULT[id] : text;
     87     }
     88 
     89     private static final String[] RESOURCE_NAMES = {
     90         // These texts' name should be aligned with the @string/<name> in values/strings.xml.
     91         // Labels for action.
     92         "label_go_key",
     93         // "label_search_key",
     94         "label_send_key",
     95         "label_next_key",
     96         "label_done_key",
     97         "label_previous_key",
     98         // Other labels.
     99         "label_to_alpha_key",
    100         "label_to_symbol_key",
    101         "label_to_symbol_with_microphone_key",
    102         "label_pause_key",
    103         "label_wait_key",
    104     };
    105 
    106     private static final String[] NAMES = {
    107         /*  0 */ "more_keys_for_a",
    108         /*  1 */ "more_keys_for_e",
    109         /*  2 */ "more_keys_for_i",
    110         /*  3 */ "more_keys_for_o",
    111         /*  4 */ "more_keys_for_u",
    112         /*  5 */ "more_keys_for_s",
    113         /*  6 */ "more_keys_for_n",
    114         /*  7 */ "more_keys_for_c",
    115         /*  8 */ "more_keys_for_y",
    116         /*  9 */ "more_keys_for_d",
    117         /* 10 */ "more_keys_for_r",
    118         /* 11 */ "more_keys_for_t",
    119         /* 12 */ "more_keys_for_z",
    120         /* 13 */ "more_keys_for_k",
    121         /* 14 */ "more_keys_for_l",
    122         /* 15 */ "more_keys_for_g",
    123         /* 16 */ "more_keys_for_v",
    124         /* 17 */ "more_keys_for_h",
    125         /* 18 */ "more_keys_for_j",
    126         /* 19 */ "more_keys_for_w",
    127         /* 20 */ "keylabel_for_nordic_row1_11",
    128         /* 21 */ "keylabel_for_nordic_row2_10",
    129         /* 22 */ "keylabel_for_nordic_row2_11",
    130         /* 23 */ "more_keys_for_nordic_row2_10",
    131         /* 24 */ "more_keys_for_nordic_row2_11",
    132         /* 25 */ "keylabel_for_east_slavic_row1_9",
    133         /* 26 */ "keylabel_for_east_slavic_row1_12",
    134         /* 27 */ "keylabel_for_east_slavic_row2_1",
    135         /* 28 */ "keylabel_for_east_slavic_row2_11",
    136         /* 29 */ "keylabel_for_east_slavic_row3_5",
    137         /* 30 */ "more_keys_for_cyrillic_u",
    138         /* 31 */ "more_keys_for_cyrillic_en",
    139         /* 32 */ "more_keys_for_cyrillic_ghe",
    140         /* 33 */ "more_keys_for_east_slavic_row2_1",
    141         /* 34 */ "more_keys_for_cyrillic_o",
    142         /* 35 */ "more_keys_for_cyrillic_soft_sign",
    143         /* 36 */ "keylabel_for_south_slavic_row1_6",
    144         /* 37 */ "keylabel_for_south_slavic_row2_11",
    145         /* 38 */ "keylabel_for_south_slavic_row3_1",
    146         /* 39 */ "keylabel_for_south_slavic_row3_8",
    147         /* 40 */ "more_keys_for_cyrillic_ie",
    148         /* 41 */ "more_keys_for_cyrillic_i",
    149         /* 42 */ "more_keys_for_single_quote",
    150         /* 43 */ "more_keys_for_double_quote",
    151         /* 44 */ "more_keys_for_tablet_double_quote",
    152         /* 45 */ "more_keys_for_currency_dollar",
    153         /* 46 */ "more_keys_for_currency_euro",
    154         /* 47 */ "more_keys_for_currency_pound",
    155         /* 48 */ "more_keys_for_currency_general",
    156         /* 49 */ "more_keys_for_punctuation",
    157         /* 50 */ "more_keys_for_star",
    158         /* 51 */ "more_keys_for_bullet",
    159         /* 52 */ "more_keys_for_plus",
    160         /* 53 */ "more_keys_for_left_parenthesis",
    161         /* 54 */ "more_keys_for_right_parenthesis",
    162         /* 55 */ "more_keys_for_less_than",
    163         /* 56 */ "more_keys_for_greater_than",
    164         /* 57 */ "more_keys_for_arabic_diacritics",
    165         /* 58 */ "keyhintlabel_for_arabic_diacritics",
    166         /* 59 */ "keylabel_for_symbols_1",
    167         /* 60 */ "keylabel_for_symbols_2",
    168         /* 61 */ "keylabel_for_symbols_3",
    169         /* 62 */ "keylabel_for_symbols_4",
    170         /* 63 */ "keylabel_for_symbols_5",
    171         /* 64 */ "keylabel_for_symbols_6",
    172         /* 65 */ "keylabel_for_symbols_7",
    173         /* 66 */ "keylabel_for_symbols_8",
    174         /* 67 */ "keylabel_for_symbols_9",
    175         /* 68 */ "keylabel_for_symbols_0",
    176         /* 69 */ "additional_more_keys_for_symbols_1",
    177         /* 70 */ "additional_more_keys_for_symbols_2",
    178         /* 71 */ "additional_more_keys_for_symbols_3",
    179         /* 72 */ "additional_more_keys_for_symbols_4",
    180         /* 73 */ "additional_more_keys_for_symbols_5",
    181         /* 74 */ "additional_more_keys_for_symbols_6",
    182         /* 75 */ "additional_more_keys_for_symbols_7",
    183         /* 76 */ "additional_more_keys_for_symbols_8",
    184         /* 77 */ "additional_more_keys_for_symbols_9",
    185         /* 78 */ "additional_more_keys_for_symbols_0",
    186         /* 79 */ "more_keys_for_symbols_1",
    187         /* 80 */ "more_keys_for_symbols_2",
    188         /* 81 */ "more_keys_for_symbols_3",
    189         /* 82 */ "more_keys_for_symbols_4",
    190         /* 83 */ "more_keys_for_symbols_5",
    191         /* 84 */ "more_keys_for_symbols_6",
    192         /* 85 */ "more_keys_for_symbols_7",
    193         /* 86 */ "more_keys_for_symbols_8",
    194         /* 87 */ "more_keys_for_symbols_9",
    195         /* 88 */ "more_keys_for_symbols_0",
    196         /* 89 */ "keylabel_for_comma",
    197         /* 90 */ "more_keys_for_comma",
    198         /* 91 */ "keylabel_for_symbols_question",
    199         /* 92 */ "keylabel_for_symbols_semicolon",
    200         /* 93 */ "keylabel_for_symbols_percent",
    201         /* 94 */ "more_keys_for_symbols_exclamation",
    202         /* 95 */ "more_keys_for_symbols_question",
    203         /* 96 */ "more_keys_for_symbols_semicolon",
    204         /* 97 */ "more_keys_for_symbols_percent",
    205         /* 98 */ "keylabel_for_tablet_comma",
    206         /* 99 */ "keyhintlabel_for_tablet_comma",
    207         /* 100 */ "more_keys_for_tablet_comma",
    208         /* 101 */ "keyhintlabel_for_tablet_period",
    209         /* 102 */ "more_keys_for_tablet_period",
    210         /* 103 */ "keylabel_for_apostrophe",
    211         /* 104 */ "keyhintlabel_for_apostrophe",
    212         /* 105 */ "more_keys_for_apostrophe",
    213         /* 106 */ "more_keys_for_q",
    214         /* 107 */ "more_keys_for_x",
    215         /* 108 */ "keylabel_for_q",
    216         /* 109 */ "keylabel_for_w",
    217         /* 110 */ "keylabel_for_y",
    218         /* 111 */ "keylabel_for_x",
    219         /* 112 */ "keylabel_for_spanish_row2_10",
    220         /* 113 */ "more_keys_for_am_pm",
    221         /* 114 */ "settings_as_more_key",
    222         /* 115 */ "shortcut_as_more_key",
    223         /* 116 */ "action_next_as_more_key",
    224         /* 117 */ "action_previous_as_more_key",
    225         /* 118 */ "label_to_more_symbol_key",
    226         /* 119 */ "label_to_more_symbol_for_tablet_key",
    227         /* 120 */ "label_tab_key",
    228         /* 121 */ "label_to_phone_numeric_key",
    229         /* 122 */ "label_to_phone_symbols_key",
    230         /* 123 */ "label_time_am",
    231         /* 124 */ "label_time_pm",
    232         /* 125 */ "label_to_symbol_key_pcqwerty",
    233         /* 126 */ "keylabel_for_popular_domain",
    234         /* 127 */ "more_keys_for_popular_domain",
    235         /* 128 */ "more_keys_for_smiley",
    236     };
    237 
    238     private static final String EMPTY = "";
    239 
    240     /* Default texts */
    241     private static final String[] LANGUAGE_DEFAULT = {
    242         /* 0~ */
    243         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    244         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    245         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    246         EMPTY, EMPTY, EMPTY,
    247         /* ~41 */
    248         /* 42 */ "!fixedColumnOrder!4,\u2018,\u2019,\u201A,\u201B",
    249         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
    250         // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;</string>
    251         /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB,\u00BB",
    252         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
    253         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
    254         /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
    255         // U+00A2: "" CENT SIGN
    256         // U+00A3: "" POUND SIGN
    257         // U+20AC: "" EURO SIGN
    258         // U+00A5: "" YEN SIGN
    259         // U+20B1: "" PESO SIGN
    260         /* 45 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
    261         /* 46 */ "\u00A2,\u00A3,$,\u00A5,\u20B1",
    262         /* 47 */ "\u00A2,$,\u20AC,\u00A5,\u20B1",
    263         /* 48 */ "\u00A2,$,\u20AC,\u00A3,\u00A5,\u20B1",
    264         /* 49 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\\,,?,@,&,\\%,+,;,/,(,)",
    265         // U+2020: "" DAGGER
    266         // U+2021: "" DOUBLE DAGGER
    267         // U+2605: "" BLACK STAR
    268         /* 50 */ "\u2020,\u2021,\u2605",
    269         // U+266A: "" EIGHTH NOTE
    270         // U+2665: "" BLACK HEART SUIT
    271         // U+2660: "" BLACK SPADE SUIT
    272         // U+2666: "" BLACK DIAMOND SUIT
    273         // U+2663: "" BLACK CLUB SUIT
    274         /* 51 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
    275         // U+00B1: "" PLUS-MINUS SIGN
    276         /* 52 */ "\u00B1",
    277         // The all letters need to be mirrored are found at
    278         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
    279         /* 53 */ "!fixedColumnOrder!3,<,{,[",
    280         /* 54 */ "!fixedColumnOrder!3,>,},]",
    281         // U+2039: "" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
    282         // U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
    283         // U+2264: "" LESS-THAN OR EQUAL TO
    284         // U+2265: "" GREATER-THAN EQUAL TO
    285         // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    286         // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
    287         // The following characters don't need BIDI mirroring.
    288         // U+2018: "" LEFT SINGLE QUOTATION MARK
    289         // U+2019: "" RIGHT SINGLE QUOTATION MARK
    290         // U+201A: "" SINGLE LOW-9 QUOTATION MARK
    291         // U+201B: "" SINGLE HIGH-REVERSED-9 QUOTATION MARK
    292         // U+201C: "" LEFT DOUBLE QUOTATION MARK
    293         // U+201D: "" RIGHT DOUBLE QUOTATION MARK
    294         // U+201E: "" DOUBLE LOW-9 QUOTATION MARK
    295         // U+201F: "" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
    296         /* 55 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
    297         /* 56 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
    298         /* 57 */ EMPTY,
    299         /* 58 */ EMPTY,
    300         /* 59 */ "1",
    301         /* 60 */ "2",
    302         /* 61 */ "3",
    303         /* 62 */ "4",
    304         /* 63 */ "5",
    305         /* 64 */ "6",
    306         /* 65 */ "7",
    307         /* 66 */ "8",
    308         /* 67 */ "9",
    309         /* 68 */ "0",
    310         /* 69~ */
    311         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    312         /* ~78 */
    313         // U+00B9: "" SUPERSCRIPT ONE
    314         // U+00BD: "" VULGAR FRACTION ONE HALF
    315         // U+2153: "" VULGAR FRACTION ONE THIRD
    316         // U+00BC: "" VULGAR FRACTION ONE QUARTER
    317         // U+215B: "" VULGAR FRACTION ONE EIGHTH
    318         /* 79 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
    319         // U+00B2: "" SUPERSCRIPT TWO
    320         // U+2154: "" VULGAR FRACTION TWO THIRDS
    321         /* 80 */ "\u00B2,\u2154",
    322         // U+00B3: "" SUPERSCRIPT THREE
    323         // U+00BE: "" VULGAR FRACTION THREE QUARTERS
    324         // U+215C: "" VULGAR FRACTION THREE EIGHTHS
    325         /* 81 */ "\u00B3,\u00BE,\u215C",
    326         // U+2074: "" SUPERSCRIPT FOUR
    327         /* 82 */ "\u2074",
    328         // U+215D: "" VULGAR FRACTION FIVE EIGHTHS
    329         /* 83 */ "\u215D",
    330         /* 84 */ EMPTY,
    331         // U+215E: "" VULGAR FRACTION SEVEN EIGHTHS
    332         /* 85 */ "\u215E",
    333         /* 86 */ EMPTY,
    334         /* 87 */ EMPTY,
    335         // U+207F: "" SUPERSCRIPT LATIN SMALL LETTER N
    336         // U+2205: "" EMPTY SET
    337         /* 88 */ "\u207F,\u2205",
    338         /* 89 */ ",",
    339         /* 90 */ EMPTY,
    340         /* 91 */ "?",
    341         /* 92 */ ";",
    342         /* 93 */ "%",
    343         // U+00A1: "" INVERTED EXCLAMATION MARK
    344         /* 94 */ "\u00A1",
    345         // U+00BF: "" INVERTED QUESTION MARK
    346         /* 95 */ "\u00BF",
    347         /* 96 */ EMPTY,
    348         // U+2030: "" PER MILLE SIGN
    349         /* 97 */ "\u2030",
    350         /* 98 */ ",",
    351         /* 99 */ "!",
    352         /* 100 */ "!",
    353         /* 101 */ "?",
    354         /* 102 */ "?",
    355         /* 103 */ "\'",
    356         /* 104 */ "\"",
    357         /* 105 */ "\"",
    358         /* 106 */ EMPTY,
    359         /* 107 */ EMPTY,
    360         /* 108 */ "q",
    361         /* 109 */ "w",
    362         /* 110 */ "y",
    363         /* 111 */ "x",
    364         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    365         /* 112 */ "\u00F1",
    366         /* 113 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
    367         /* 114 */ "!icon/settings_key|!code/key_settings",
    368         /* 115 */ "!icon/shortcut_key|!code/key_shortcut",
    369         /* 116 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
    370         /* 117 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
    371         // Label for "switch to more symbol" modifier key.  Must be short to fit on key!
    372         /* 118 */ "= \\ <",
    373         // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
    374         /* 119 */ "~ \\ {",
    375         // Label for "Tab" key.  Must be short to fit on key!
    376         /* 120 */ "Tab",
    377         // Label for "switch to phone numeric" key.  Must be short to fit on key!
    378         /* 121 */ "123",
    379         // Label for "switch to phone symbols" key.  Must be short to fit on key!
    380         // U+FF0A: "" FULLWIDTH ASTERISK
    381         // U+FF03: "" FULLWIDTH NUMBER SIGN
    382         /* 122 */ "\uFF0A\uFF03",
    383         // Key label for "ante meridiem"
    384         /* 123 */ "AM",
    385         // Key label for "post meridiem"
    386         /* 124 */ "PM",
    387         // Label for "switch to symbols" key on PC QWERTY layout
    388         /* 125 */ "Sym",
    389         /* 126 */ ".com",
    390         // popular web domains for the locale - most popular, displayed on the keyboard
    391         /* 127 */ "!hasLabels!,.net,.org,.gov,.edu",
    392         /* 128 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ",
    393     };
    394 
    395     /* Language af: Afrikaans */
    396     private static final String[] LANGUAGE_af = {
    397         // This is the same as Dutch except more keys of y and demoting vowels with diaeresis.
    398         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    399         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    400         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    401         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    402         // U+00E6: "" LATIN SMALL LETTER AE
    403         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    404         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    405         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    406         /* 0 */ "\u00E1,\u00E2,\u00E4,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
    407         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
    408         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
    409         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
    410         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
    411         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
    412         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
    413         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
    414         /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
    415         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
    416         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
    417         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
    418         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
    419         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
    420         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
    421         // U+0133: "" LATIN SMALL LIGATURE IJ
    422         /* 2 */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133",
    423         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    424         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    425         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    426         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    427         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    428         // U+0153: "" LATIN SMALL LIGATURE OE
    429         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    430         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    431         /* 3 */ "\u00F3,\u00F4,\u00F6,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
    432         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    433         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    434         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    435         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    436         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    437         /* 4 */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B",
    438         /* 5 */ null,
    439         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    440         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
    441         /* 6 */ "\u00F1,\u0144",
    442         /* 7 */ null,
    443         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
    444         // U+0133: "" LATIN SMALL LIGATURE IJ
    445         /* 8 */ "\u00FD,\u0133",
    446     };
    447 
    448     /* Language ar: Arabic */
    449     private static final String[] LANGUAGE_ar = {
    450         /* 0~ */
    451         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    452         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    453         null, null, null, null, null, null, null, null, null, null, null, null, null,
    454         /* ~42 */
    455         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
    456         // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
    457         /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB",
    458         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
    459         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
    460         /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
    461         /* 45~ */
    462         null, null, null, null,
    463         /* ~48 */
    464         // U+061F: "" ARABIC QUESTION MARK
    465         // U+060C: "" ARABIC COMMA
    466         // U+061B: "" ARABIC SEMICOLON
    467         /* 49 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
    468         // U+2605: "" BLACK STAR
    469         // U+066D: "" ARABIC FIVE POINTED STAR
    470         /* 50 */ "\u2605,\u066D",
    471         // U+266A: "" EIGHTH NOTE
    472         /* 51 */ "\u266A",
    473         /* 52 */ null,
    474         // The all letters need to be mirrored are found at
    475         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
    476         // U+FD3E: "" ORNATE LEFT PARENTHESIS
    477         // U+FD3F: "" ORNATE RIGHT PARENTHESIS
    478         /* 53 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
    479         /* 54 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
    480         // U+2264: "" LESS-THAN OR EQUAL TO
    481         // U+2265: "" GREATER-THAN EQUAL TO
    482         // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    483         // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
    484         // U+2039: "" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
    485         // U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
    486         // The following characters don't need BIDI mirroring.
    487         // U+2018: "" LEFT SINGLE QUOTATION MARK
    488         // U+2019: "" RIGHT SINGLE QUOTATION MARK
    489         // U+201A: "" SINGLE LOW-9 QUOTATION MARK
    490         // U+201B: "" SINGLE HIGH-REVERSED-9 QUOTATION MARK
    491         // U+201C: "" LEFT DOUBLE QUOTATION MARK
    492         // U+201D: "" RIGHT DOUBLE QUOTATION MARK
    493         // U+201E: "" DOUBLE LOW-9 QUOTATION MARK
    494         // U+201F: "" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
    495         /* 55 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
    496         /* 56 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
    497         // U+0655: "" ARABIC HAMZA BELOW
    498         // U+0654: "" ARABIC HAMZA ABOVE
    499         // U+0652: "" ARABIC SUKUN
    500         // U+064D: "" ARABIC KASRATAN
    501         // U+064C: "" ARABIC DAMMATAN
    502         // U+064B: "" ARABIC FATHATAN
    503         // U+0651: "" ARABIC SHADDA
    504         // U+0656: "" ARABIC SUBSCRIPT ALEF
    505         // U+0670: "" ARABIC LETTER SUPERSCRIPT ALEF
    506         // U+0653: "" ARABIC MADDAH ABOVE
    507         // U+0650: "" ARABIC KASRA
    508         // U+064F: "" ARABIC DAMMA
    509         // U+064E: "" ARABIC FATHA
    510         // U+0640: "" ARABIC TATWEEL
    511         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
    512         /* 57 */ "!fixedColumnOrder!7,\u0655,\u0654,\u0652,\u064D,\u064C,\u064B,\u0651,\u0656,\u0670,\u0653,\u0650,\u064F,\u064E,\u0640\u0640\u0640|\u0640",
    513         /* 58 */ "\u0651",
    514         // U+0661: "" ARABIC-INDIC DIGIT ONE
    515         /* 59 */ "\u0661",
    516         // U+0662: "" ARABIC-INDIC DIGIT TWO
    517         /* 60 */ "\u0662",
    518         // U+0663: "" ARABIC-INDIC DIGIT THREE
    519         /* 61 */ "\u0663",
    520         // U+0664: "" ARABIC-INDIC DIGIT FOUR
    521         /* 62 */ "\u0664",
    522         // U+0665: "" ARABIC-INDIC DIGIT FIVE
    523         /* 63 */ "\u0665",
    524         // U+0666: "" ARABIC-INDIC DIGIT SIX
    525         /* 64 */ "\u0666",
    526         // U+0667: "" ARABIC-INDIC DIGIT SEVEN
    527         /* 65 */ "\u0667",
    528         // U+0668: "" ARABIC-INDIC DIGIT EIGHT
    529         /* 66 */ "\u0668",
    530         // U+0669: "" ARABIC-INDIC DIGIT NINE
    531         /* 67 */ "\u0669",
    532         // U+0660: "" ARABIC-INDIC DIGIT ZERO
    533         /* 68 */ "\u0660",
    534         /* 69 */ "1",
    535         /* 70 */ "2",
    536         /* 71 */ "3",
    537         /* 72 */ "4",
    538         /* 73 */ "5",
    539         /* 74 */ "6",
    540         /* 75 */ "7",
    541         /* 76 */ "8",
    542         /* 77 */ "9",
    543         // U+066B: "" ARABIC DECIMAL SEPARATOR
    544         // U+066C: "" ARABIC THOUSANDS SEPARATOR
    545         /* 78 */ "0,\u066B,\u066C",
    546         /* 79~ */
    547         null, null, null, null, null, null, null, null, null, null,
    548         /* ~88 */
    549         // U+060C: "" ARABIC COMMA
    550         /* 89 */ "\u060C",
    551         /* 90 */ "\\,",
    552         /* 91 */ "\u061F",
    553         /* 92 */ "\u061B",
    554         // U+066A: "" ARABIC PERCENT SIGN
    555         /* 93 */ "\u066A",
    556         /* 94 */ null,
    557         /* 95 */ "?",
    558         /* 96 */ ";",
    559         // U+2030: "" PER MILLE SIGN
    560         /* 97 */ "\\%,\u2030",
    561         /* 98~ */
    562         null, null, null, null, null,
    563         /* ~102 */
    564         // U+060C: "" ARABIC COMMA
    565         // U+061B: "" ARABIC SEMICOLON
    566         // U+061F: "" ARABIC QUESTION MARK
    567         /* 103 */ "\u060C",
    568         /* 104 */ "\u061F",
    569         /* 105 */ "\u061F,\u061B,!,:,-,/,\',\"",
    570     };
    571 
    572     /* Language be: Belarusian */
    573     private static final String[] LANGUAGE_be = {
    574         /* 0~ */
    575         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    576         null, null, null, null, null, null, null, null, null, null,
    577         /* ~24 */
    578         // U+045E: "" CYRILLIC SMALL LETTER SHORT U
    579         /* 25 */ "\u045E",
    580         // U+0451: "" CYRILLIC SMALL LETTER IO
    581         /* 26 */ "\u0451",
    582         // U+044B: "" CYRILLIC SMALL LETTER YERU
    583         /* 27 */ "\u044B",
    584         // U+044D: "" CYRILLIC SMALL LETTER E
    585         /* 28 */ "\u044D",
    586         // U+0456: "" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
    587         /* 29 */ "\u0456",
    588         /* 30~ */
    589         null, null, null, null, null,
    590         /* ~34 */
    591         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
    592         /* 35 */ "\u044A",
    593         /* 36~ */
    594         null, null, null, null,
    595         /* ~39 */
    596         // U+0451: "" CYRILLIC SMALL LETTER IO
    597         /* 40 */ "\u0451",
    598     };
    599 
    600     /* Language ca: Catalan */
    601     private static final String[] LANGUAGE_ca = {
    602         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    603         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    604         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    605         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    606         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    607         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    608         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
    609         // U+00E6: "" LATIN SMALL LETTER AE
    610         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    611         // U+00AA: "" FEMININE ORDINAL INDICATOR
    612         /* 0 */ "\u00E0,\u00E1,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
    613         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
    614         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
    615         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
    616         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
    617         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
    618         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
    619         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
    620         /* 1 */ "\u00E8,\u00E9,\u00EB,\u00EA,\u0119,\u0117,\u0113",
    621         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
    622         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
    623         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
    624         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
    625         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
    626         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
    627         /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
    628         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    629         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    630         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    631         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    632         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    633         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    634         // U+0153: "" LATIN SMALL LIGATURE OE
    635         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    636         // U+00BA: "" MASCULINE ORDINAL INDICATOR
    637         /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
    638         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    639         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    640         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    641         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    642         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    643         /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
    644         /* 5 */ null,
    645         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    646         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
    647         /* 6 */ "\u00F1,\u0144",
    648         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
    649         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
    650         // U+010D: "" LATIN SMALL LETTER C WITH CARON
    651         /* 7 */ "\u00E7,\u0107,\u010D",
    652         /* 8~ */
    653         null, null, null, null, null, null,
    654         /* ~13 */
    655         // U+0140: "" LATIN SMALL LETTER L WITH MIDDLE DOT
    656         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
    657         /* 14 */ "\u0140,\u0142",
    658     };
    659 
    660     /* Language cs: Czech */
    661     private static final String[] LANGUAGE_cs = {
    662         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    663         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    664         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    665         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    666         // U+00E6: "" LATIN SMALL LETTER AE
    667         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    668         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    669         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    670         /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
    671         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
    672         // U+011B: "" LATIN SMALL LETTER E WITH CARON
    673         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
    674         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
    675         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
    676         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
    677         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
    678         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
    679         /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
    680         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
    681         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
    682         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
    683         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
    684         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
    685         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
    686         /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
    687         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    688         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    689         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    690         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    691         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    692         // U+0153: "" LATIN SMALL LIGATURE OE
    693         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    694         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    695         /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
    696         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    697         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
    698         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    699         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    700         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    701         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    702         /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B",
    703         // U+0161: "" LATIN SMALL LETTER S WITH CARON
    704         // U+00DF: "" LATIN SMALL LETTER SHARP S
    705         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
    706         /* 5 */ "\u0161,\u00DF,\u015B",
    707         // U+0148: "" LATIN SMALL LETTER N WITH CARON
    708         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    709         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
    710         /* 6 */ "\u0148,\u00F1,\u0144",
    711         // U+010D: "" LATIN SMALL LETTER C WITH CARON
    712         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
    713         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
    714         /* 7 */ "\u010D,\u00E7,\u0107",
    715         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
    716         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
    717         /* 8 */ "\u00FD,\u00FF",
    718         // U+010F: "" LATIN SMALL LETTER D WITH CARON
    719         /* 9 */ "\u010F",
    720         // U+0159: "" LATIN SMALL LETTER R WITH CARON
    721         /* 10 */ "\u0159",
    722         // U+0165: "" LATIN SMALL LETTER T WITH CARON
    723         /* 11 */ "\u0165",
    724         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
    725         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
    726         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
    727         /* 12 */ "\u017E,\u017A,\u017C",
    728     };
    729 
    730     /* Language da: Danish */
    731     private static final String[] LANGUAGE_da = {
    732         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    733         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    734         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    735         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    736         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    737         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    738         /* 0 */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101",
    739         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
    740         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
    741         /* 1 */ "\u00E9,\u00EB",
    742         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
    743         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
    744         /* 2 */ "\u00ED,\u00EF",
    745         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    746         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    747         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    748         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    749         // U+0153: "" LATIN SMALL LIGATURE OE
    750         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    751         /* 3 */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D",
    752         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    753         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    754         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    755         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    756         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    757         /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
    758         // U+00DF: "" LATIN SMALL LETTER SHARP S
    759         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
    760         // U+0161: "" LATIN SMALL LETTER S WITH CARON
    761         /* 5 */ "\u00DF,\u015B,\u0161",
    762         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    763         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
    764         /* 6 */ "\u00F1,\u0144",
    765         /* 7 */ null,
    766         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
    767         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
    768         /* 8 */ "\u00FD,\u00FF",
    769         // U+00F0: "" LATIN SMALL LETTER ETH
    770         /* 9 */ "\u00F0",
    771         /* 10~ */
    772         null, null, null, null,
    773         /* ~13 */
    774         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
    775         /* 14 */ "\u0142",
    776         /* 15~ */
    777         null, null, null, null, null,
    778         /* ~19 */
    779         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    780         /* 20 */ "\u00E5",
    781         // U+00E6: "" LATIN SMALL LETTER AE
    782         /* 21 */ "\u00E6",
    783         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    784         /* 22 */ "\u00F8",
    785         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    786         /* 23 */ "\u00E4",
    787         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    788         /* 24 */ "\u00F6",
    789     };
    790 
    791     /* Language de: German */
    792     private static final String[] LANGUAGE_de = {
    793         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    794         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    795         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    796         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    797         // U+00E6: "" LATIN SMALL LETTER AE
    798         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    799         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    800         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    801         /* 0 */ "\u00E4,\u00E2,\u00E0,\u00E1,\u00E6,\u00E3,\u00E5,\u0101",
    802         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
    803         /* 1 */ "\u0117",
    804         /* 2 */ null,
    805         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    806         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    807         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    808         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    809         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    810         // U+0153: "" LATIN SMALL LIGATURE OE
    811         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    812         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    813         /* 3 */ "\u00F6,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u00F8,\u014D",
    814         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    815         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    816         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    817         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    818         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    819         /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
    820         // U+00DF: "" LATIN SMALL LETTER SHARP S
    821         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
    822         // U+0161: "" LATIN SMALL LETTER S WITH CARON
    823         /* 5 */ "\u00DF,\u015B,\u0161",
    824         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    825         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
    826         /* 6 */ "\u00F1,\u0144",
    827     };
    828 
    829     /* Language en: English */
    830     private static final String[] LANGUAGE_en = {
    831         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    832         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    833         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    834         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    835         // U+00E6: "" LATIN SMALL LETTER AE
    836         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    837         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    838         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    839         /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
    840         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
    841         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
    842         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
    843         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
    844         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
    845         /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
    846         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
    847         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
    848         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
    849         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
    850         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
    851         /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
    852         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    853         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    854         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    855         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    856         // U+0153: "" LATIN SMALL LIGATURE OE
    857         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    858         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    859         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    860         /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
    861         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    862         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    863         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    864         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    865         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    866         /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
    867         // U+00DF: "" LATIN SMALL LETTER SHARP S
    868         /* 5 */ "\u00DF",
    869         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    870         /* 6 */ "\u00F1",
    871         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
    872         /* 7 */ "\u00E7",
    873     };
    874 
    875     /* Language eo: Esperanto */
    876     private static final String[] LANGUAGE_eo = {
    877         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
    878         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
    879         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
    880         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
    881         // U+00E6: "" LATIN SMALL LETTER AE
    882         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
    883         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
    884         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
    885         // U+0103: "" LATIN SMALL LETTER A WITH BREVE
    886         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
    887         // U+00AA: "" FEMININE ORDINAL INDICATOR
    888         /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
    889         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
    890         // U+011B: "" LATIN SMALL LETTER E WITH CARON
    891         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
    892         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
    893         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
    894         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
    895         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
    896         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
    897         /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
    898         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
    899         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
    900         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
    901         // U+0129: "" LATIN SMALL LETTER I WITH TILDE
    902         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
    903         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
    904         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
    905         // U+0131: "" LATIN SMALL LETTER DOTLESS I
    906         // U+0133: "" LATIN SMALL LIGATURE IJ
    907         /* 2 */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133",
    908         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
    909         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
    910         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
    911         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
    912         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
    913         // U+0153: "" LATIN SMALL LIGATURE OE
    914         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
    915         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
    916         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
    917         // U+00BA: "" MASCULINE ORDINAL INDICATOR
    918         /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D,\u0151,\u00BA",
    919         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
    920         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
    921         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
    922         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
    923         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
    924         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
    925         // U+0169: "" LATIN SMALL LETTER U WITH TILDE
    926         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
    927         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
    928         // U+00B5: "" MICRO SIGN
    929         /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B,\u0169,\u0171,\u0173,\u00B5",
    930         // U+00DF: "" LATIN SMALL LETTER SHARP S
    931         // U+0161: "" LATIN SMALL LETTER S WITH CARON
    932         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
    933         // U+0219: "" LATIN SMALL LETTER S WITH COMMA BELOW
    934         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
    935         /* 5 */ "\u00DF,\u0161,\u015B,\u0219,\u015F",
    936         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
    937         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
    938         // U+0146: "" LATIN SMALL LETTER N WITH CEDILLA
    939         // U+0148: "" LATIN SMALL LETTER N WITH CARON
    940         // U+0149: "" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
    941         // U+014B: "" LATIN SMALL LETTER ENG
    942         /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
    943         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
    944         // U+010D: "" LATIN SMALL LETTER C WITH CARON
    945         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
    946         // U+010B: "" LATIN SMALL LETTER C WITH DOT ABOVE
    947         /* 7 */ "\u0107,\u010D,\u00E7,\u010B",
    948         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
    949         // U+0177: "" LATIN SMALL LETTER Y WITH CIRCUMFLEX
    950         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
    951         // U+00FE: "" LATIN SMALL LETTER THORN
    952         /* 8 */ "y,\u00FD,\u0177,\u00FF,\u00FE",
    953         // U+00F0: "" LATIN SMALL LETTER ETH
    954         // U+010F: "" LATIN SMALL LETTER D WITH CARON
    955         // U+0111: "" LATIN SMALL LETTER D WITH STROKE
    956         /* 9 */ "\u00F0,\u010F,\u0111",
    957         // U+0159: "" LATIN SMALL LETTER R WITH CARON
    958         // U+0155: "" LATIN SMALL LETTER R WITH ACUTE
    959         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
    960         /* 10 */ "\u0159,\u0155,\u0157",
    961         // U+0165: "" LATIN SMALL LETTER T WITH CARON
    962         // U+021B: "" LATIN SMALL LETTER T WITH COMMA BELOW
    963         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
    964         // U+0167: "" LATIN SMALL LETTER T WITH STROKE
    965         /* 11 */ "\u0165,\u021B,\u0163,\u0167",
    966         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
    967         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
    968         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
    969         /* 12 */ "\u017A,\u017C,\u017E",
    970         // U+0137: "" LATIN SMALL LETTER K WITH CEDILLA
    971         // U+0138: "" LATIN SMALL LETTER KRA
    972         /* 13 */ "\u0137,\u0138",
    973         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
    974         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
    975         // U+013E: "" LATIN SMALL LETTER L WITH CARON
    976         // U+0140: "" LATIN SMALL LETTER L WITH MIDDLE DOT
    977         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
    978         /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
    979         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
    980         // U+0121: "" LATIN SMALL LETTER G WITH DOT ABOVE
    981         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
    982         /* 15 */ "\u011F,\u0121,\u0123",
    983         // U+0175: "" LATIN SMALL LETTER W WITH CIRCUMFLEX
    984         /* 16 */ "w,\u0175",
    985         // U+0125: "" LATIN SMALL LETTER H WITH CIRCUMFLEX
    986         // U+0127: "" LATIN SMALL LETTER H WITH STROKE
    987         /* 17 */ "\u0125,\u0127",
    988         /* 18 */ null,
    989         // U+0175: "" LATIN SMALL LETTER W WITH CIRCUMFLEX
    990         /* 19 */ "w,\u0175",
    991         /* 20~ */
    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, null, null, null, null, null, null,
    995         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    996         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
    997         null, null, null, null, null, null, null, null, null, null, null,
    998         /* ~105 */
    999         /* 106 */ "q",
   1000         /* 107 */ "x",
   1001         // U+015D: "" LATIN SMALL LETTER S WITH CIRCUMFLEX
   1002         /* 108 */ "\u015D",
   1003         // U+011D: "" LATIN SMALL LETTER G WITH CIRCUMFLEX
   1004         /* 109 */ "\u011D",
   1005         // U+016D: "" LATIN SMALL LETTER U WITH BREVE
   1006         /* 110 */ "\u016D",
   1007         // U+0109: "" LATIN SMALL LETTER C WITH CIRCUMFLEX
   1008         /* 111 */ "\u0109",
   1009         // U+0135: "" LATIN SMALL LETTER J WITH CIRCUMFLEX
   1010         /* 112 */ "\u0135",
   1011     };
   1012 
   1013     /* Language es: Spanish */
   1014     private static final String[] LANGUAGE_es = {
   1015         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1016         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1017         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1018         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1019         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1020         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1021         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   1022         // U+00E6: "" LATIN SMALL LETTER AE
   1023         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1024         // U+00AA: "" FEMININE ORDINAL INDICATOR
   1025         /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
   1026         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1027         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1028         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1029         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1030         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1031         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1032         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1033         /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
   1034         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1035         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1036         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1037         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1038         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1039         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1040         /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
   1041         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1042         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1043         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1044         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1045         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1046         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1047         // U+0153: "" LATIN SMALL LIGATURE OE
   1048         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1049         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   1050         /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
   1051         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1052         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1053         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1054         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1055         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1056         /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
   1057         /* 5 */ null,
   1058         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   1059         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1060         /* 6 */ "\u00F1,\u0144",
   1061         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1062         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   1063         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   1064         /* 7 */ "\u00E7,\u0107,\u010D",
   1065         /* 8~ */
   1066         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1067         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1068         null, null, null, null, null, null, null, null, null, null, null,
   1069         /* ~48 */
   1070         // U+00A1: "" INVERTED EXCLAMATION MARK
   1071         // U+00BF: "" INVERTED QUESTION MARK
   1072         /* 49 */ "!fixedColumnOrder!9,\u00A1,\",\',#,-,:,!,\\,,?,\u00BF,@,&,\\%,+,;,/,(,)",
   1073         /* 50~ */
   1074         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1075         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1076         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1077         null, null, null, null, null,
   1078         /* ~99 */
   1079         // U+00A1: "" INVERTED EXCLAMATION MARK
   1080         /* 100 */ "!,\u00A1",
   1081         /* 101 */ null,
   1082         // U+00BF: "" INVERTED QUESTION MARK
   1083         /* 102 */ "?,\u00BF",
   1084     };
   1085 
   1086     /* Language et: Estonian */
   1087     private static final String[] LANGUAGE_et = {
   1088         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1089         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1090         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1091         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1092         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1093         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1094         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1095         // U+00E6: "" LATIN SMALL LETTER AE
   1096         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   1097         /* 0 */ "\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
   1098         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1099         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1100         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1101         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1102         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1103         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1104         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1105         // U+011B: "" LATIN SMALL LETTER E WITH CARON
   1106         /* 1 */ "\u0113,\u00E8,\u0117,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
   1107         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1108         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1109         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1110         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1111         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1112         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1113         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   1114         /* 2 */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131",
   1115         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1116         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1117         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1118         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1119         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1120         // U+0153: "" LATIN SMALL LIGATURE OE
   1121         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   1122         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1123         /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
   1124         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1125         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1126         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
   1127         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1128         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1129         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1130         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
   1131         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   1132         /* 4 */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
   1133         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   1134         // U+00DF: "" LATIN SMALL LETTER SHARP S
   1135         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   1136         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   1137         /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
   1138         // U+0146: "" LATIN SMALL LETTER N WITH CEDILLA
   1139         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   1140         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1141         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1142         /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
   1143         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   1144         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1145         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   1146         /* 7 */ "\u010D,\u00E7,\u0107",
   1147         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   1148         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   1149         /* 8 */ "\u00FD,\u00FF",
   1150         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   1151         /* 9 */ "\u010F",
   1152         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
   1153         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   1154         // U+0155: "" LATIN SMALL LETTER R WITH ACUTE
   1155         /* 10 */ "\u0157,\u0159,\u0155",
   1156         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
   1157         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   1158         /* 11 */ "\u0163,\u0165",
   1159         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   1160         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   1161         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   1162         /* 12 */ "\u017E,\u017C,\u017A",
   1163         // U+0137: "" LATIN SMALL LETTER K WITH CEDILLA
   1164         /* 13 */ "\u0137",
   1165         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
   1166         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   1167         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
   1168         // U+013E: "" LATIN SMALL LETTER L WITH CARON
   1169         /* 14 */ "\u013C,\u0142,\u013A,\u013E",
   1170         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
   1171         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   1172         /* 15 */ "\u0123,\u011F",
   1173         /* 16~ */
   1174         null, null, null, null,
   1175         /* ~19 */
   1176         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1177         /* 20 */ "\u00FC",
   1178         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1179         /* 21 */ "\u00F6",
   1180         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1181         /* 22 */ "\u00E4",
   1182         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1183         /* 23 */ "\u00F5",
   1184     };
   1185 
   1186     /* Language fa: Persian */
   1187     private static final String[] LANGUAGE_fa = {
   1188         /* 0~ */
   1189         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1190         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1191         null, null, null, null, null, null, null, null, null, null, null, null, null,
   1192         /* ~42 */
   1193         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
   1194         // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
   1195         /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\",\'",
   1196         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
   1197         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
   1198         /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
   1199         /* 45~ */
   1200         null, null, null, null,
   1201         /* ~48 */
   1202         // U+061F: "" ARABIC QUESTION MARK
   1203         // U+060C: "" ARABIC COMMA
   1204         // U+061B: "" ARABIC SEMICOLON
   1205         /* 49 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
   1206         // U+2605: "" BLACK STAR
   1207         // U+066D: "" ARABIC FIVE POINTED STAR
   1208         /* 50 */ "\u2605,\u066D",
   1209         // U+266A: "" EIGHTH NOTE
   1210         /* 51 */ "\u266A",
   1211         /* 52 */ null,
   1212         // The all letters need to be mirrored are found at
   1213         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
   1214         // U+FD3E: "" ORNATE LEFT PARENTHESIS
   1215         // U+FD3F: "" ORNATE RIGHT PARENTHESIS
   1216         /* 53 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
   1217         /* 54 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
   1218         // U+2264: "" LESS-THAN OR EQUAL TO
   1219         // U+2265: "" GREATER-THAN EQUAL TO
   1220         // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
   1221         // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
   1222         // U+2039: "" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
   1223         // U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
   1224         // The following characters don't need BIDI mirroring.
   1225         // U+2018: "" LEFT SINGLE QUOTATION MARK
   1226         // U+2019: "" RIGHT SINGLE QUOTATION MARK
   1227         // U+201A: "" SINGLE LOW-9 QUOTATION MARK
   1228         // U+201B: "" SINGLE HIGH-REVERSED-9 QUOTATION MARK
   1229         // U+201C: "" LEFT DOUBLE QUOTATION MARK
   1230         // U+201D: "" RIGHT DOUBLE QUOTATION MARK
   1231         // U+201E: "" DOUBLE LOW-9 QUOTATION MARK
   1232         // U+201F: "" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
   1233         /* 55 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
   1234         /* 56 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
   1235         // U+0655: "" ARABIC HAMZA BELOW
   1236         // U+0652: "" ARABIC SUKUN
   1237         // U+0651: "" ARABIC SHADDA
   1238         // U+064C: "" ARABIC DAMMATAN
   1239         // U+064D: "" ARABIC KASRATAN
   1240         // U+064B: "" ARABIC FATHATAN
   1241         // U+0654: "" ARABIC HAMZA ABOVE
   1242         // U+0656: "" ARABIC SUBSCRIPT ALEF
   1243         // U+0670: "" ARABIC LETTER SUPERSCRIPT ALEF
   1244         // U+0653: "" ARABIC MADDAH ABOVE
   1245         // U+064F: "" ARABIC DAMMA
   1246         // U+0650: "" ARABIC KASRA
   1247         // U+064E: "" ARABIC FATHA
   1248         // U+0640: "" ARABIC TATWEEL
   1249         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
   1250         /* 57 */ "!fixedColumnOrder!7,\u0655,\u0652,\u0651,\u064C,\u064D,\u064B,\u0654,\u0656,\u0670,\u0653,\u064F,\u0650,\u064E,\u0640\u0640\u0640|\u0640",
   1251         /* 58 */ "\u064B",
   1252         // U+06F1: "" EXTENDED ARABIC-INDIC DIGIT ONE
   1253         /* 59 */ "\u06F1",
   1254         // U+06F2: "" EXTENDED ARABIC-INDIC DIGIT TWO
   1255         /* 60 */ "\u06F2",
   1256         // U+06F3: "" EXTENDED ARABIC-INDIC DIGIT THREE
   1257         /* 61 */ "\u06F3",
   1258         // U+06F4: "" EXTENDED ARABIC-INDIC DIGIT FOUR
   1259         /* 62 */ "\u06F4",
   1260         // U+06F5: "" EXTENDED ARABIC-INDIC DIGIT FIVE
   1261         /* 63 */ "\u06F5",
   1262         // U+06F6: "" EXTENDED ARABIC-INDIC DIGIT SIX
   1263         /* 64 */ "\u06F6",
   1264         // U+06F7: "" EXTENDED ARABIC-INDIC DIGIT SEVEN
   1265         /* 65 */ "\u06F7",
   1266         // U+06F8: "" EXTENDED ARABIC-INDIC DIGIT EIGHT
   1267         /* 66 */ "\u06F8",
   1268         // U+06F9: "" EXTENDED ARABIC-INDIC DIGIT NINE
   1269         /* 67 */ "\u06F9",
   1270         // U+06F0: "" EXTENDED ARABIC-INDIC DIGIT ZERO
   1271         /* 68 */ "\u06F0",
   1272         /* 69 */ "1",
   1273         /* 70 */ "2",
   1274         /* 71 */ "3",
   1275         /* 72 */ "4",
   1276         /* 73 */ "5",
   1277         /* 74 */ "6",
   1278         /* 75 */ "7",
   1279         /* 76 */ "8",
   1280         /* 77 */ "9",
   1281         // U+066B: "" ARABIC DECIMAL SEPARATOR
   1282         // U+066C: "" ARABIC THOUSANDS SEPARATOR
   1283         /* 78 */ "0,\u066B,\u066C",
   1284         /* 79~ */
   1285         null, null, null, null, null, null, null, null, null, null,
   1286         /* ~88 */
   1287         // U+060C: "" ARABIC COMMA
   1288         /* 89 */ "\u060C",
   1289         /* 90 */ "\\,",
   1290         /* 91 */ "\u061F",
   1291         /* 92 */ "\u061B",
   1292         // U+066A: "" ARABIC PERCENT SIGN
   1293         /* 93 */ "\u066A",
   1294         /* 94 */ null,
   1295         /* 95 */ "?",
   1296         /* 96 */ ";",
   1297         // U+2030: "" PER MILLE SIGN
   1298         /* 97 */ "\\%,\u2030",
   1299         // U+060C: "" ARABIC COMMA
   1300         // U+061B: "" ARABIC SEMICOLON
   1301         // U+061F: "" ARABIC QUESTION MARK
   1302         // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
   1303         // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
   1304         /* 98 */ "\u060C",
   1305         /* 99 */ "!",
   1306         /* 100 */ "!,\\,",
   1307         /* 101 */ "\u061F",
   1308         /* 102 */ "\u061F,?",
   1309         /* 103 */ "\u060C",
   1310         /* 104 */ "\u061F",
   1311         /* 105 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
   1312     };
   1313 
   1314     /* Language fi: Finnish */
   1315     private static final String[] LANGUAGE_fi = {
   1316         // U+00E6: "" LATIN SMALL LETTER AE
   1317         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1318         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1319         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1320         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1321         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1322         /* 0 */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
   1323         /* 1 */ null,
   1324         /* 2 */ null,
   1325         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1326         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1327         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1328         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1329         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1330         // U+0153: "" LATIN SMALL LIGATURE OE
   1331         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1332         /* 3 */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
   1333         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1334         /* 4 */ "\u00FC",
   1335         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   1336         // U+00DF: "" LATIN SMALL LETTER SHARP S
   1337         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   1338         /* 5 */ "\u0161,\u00DF,\u015B",
   1339         /* 6~ */
   1340         null, null, null, null, null, null,
   1341         /* ~11 */
   1342         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   1343         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   1344         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   1345         /* 12 */ "\u017E,\u017A,\u017C",
   1346         /* 13~ */
   1347         null, null, null, null, null, null, null,
   1348         /* ~19 */
   1349         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1350         /* 20 */ "\u00E5",
   1351         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1352         /* 21 */ "\u00F6",
   1353         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1354         /* 22 */ "\u00E4",
   1355         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1356         /* 23 */ "\u00F8",
   1357         // U+00E6: "" LATIN SMALL LETTER AE
   1358         /* 24 */ "\u00E6",
   1359     };
   1360 
   1361     /* Language fr: French */
   1362     private static final String[] LANGUAGE_fr = {
   1363         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1364         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1365         // U+00E6: "" LATIN SMALL LETTER AE
   1366         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1367         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1368         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1369         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1370         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1371         // U+00AA: "" FEMININE ORDINAL INDICATOR
   1372         /* 0 */ "\u00E0,\u00E2,%,\u00E6,\u00E1,\u00E4,\u00E3,\u00E5,\u0101,\u00AA",
   1373         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1374         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1375         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1376         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1377         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1378         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1379         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1380         /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,%,\u0119,\u0117,\u0113",
   1381         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1382         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1383         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1384         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1385         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1386         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1387         /* 2 */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
   1388         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1389         // U+0153: "" LATIN SMALL LIGATURE OE
   1390         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1391         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1392         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1393         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1394         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1395         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1396         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   1397         /* 3 */ "\u00F4,\u0153,%,\u00F6,\u00F2,\u00F3,\u00F5,\u00F8,\u014D,\u00BA",
   1398         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1399         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1400         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1401         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1402         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1403         /* 4 */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B",
   1404         /* 5 */ null,
   1405         /* 6 */ null,
   1406         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1407         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   1408         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   1409         /* 7 */ "\u00E7,\u0107,\u010D",
   1410         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   1411         /* 8 */ "%,\u00FF",
   1412     };
   1413 
   1414     /* Language hi: Hindi */
   1415     private static final String[] LANGUAGE_hi = {
   1416         /* 0~ */
   1417         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1418         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1419         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1420         null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1421         /* ~58 */
   1422         // U+0967: "" DEVANAGARI DIGIT ONE
   1423         /* 59 */ "\u0967",
   1424         // U+0968: "" DEVANAGARI DIGIT TWO
   1425         /* 60 */ "\u0968",
   1426         // U+0969: "" DEVANAGARI DIGIT THREE
   1427         /* 61 */ "\u0969",
   1428         // U+096A: "" DEVANAGARI DIGIT FOUR
   1429         /* 62 */ "\u096A",
   1430         // U+096B: "" DEVANAGARI DIGIT FIVE
   1431         /* 63 */ "\u096B",
   1432         // U+096C: "" DEVANAGARI DIGIT SIX
   1433         /* 64 */ "\u096C",
   1434         // U+096D: "" DEVANAGARI DIGIT SEVEN
   1435         /* 65 */ "\u096D",
   1436         // U+096E: "" DEVANAGARI DIGIT EIGHT
   1437         /* 66 */ "\u096E",
   1438         // U+096F: "" DEVANAGARI DIGIT NINE
   1439         /* 67 */ "\u096F",
   1440         // U+0966: "" DEVANAGARI DIGIT ZERO
   1441         /* 68 */ "\u0966",
   1442         /* 69 */ "1",
   1443         /* 70 */ "2",
   1444         /* 71 */ "3",
   1445         /* 72 */ "4",
   1446         /* 73 */ "5",
   1447         /* 74 */ "6",
   1448         /* 75 */ "7",
   1449         /* 76 */ "8",
   1450         /* 77 */ "9",
   1451         /* 78 */ "0",
   1452     };
   1453 
   1454     /* Language hr: Croatian */
   1455     private static final String[] LANGUAGE_hr = {
   1456         /* 0~ */
   1457         null, null, null, null, null,
   1458         /* ~4 */
   1459         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   1460         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   1461         // U+00DF: "" LATIN SMALL LETTER SHARP S
   1462         /* 5 */ "\u0161,\u015B,\u00DF",
   1463         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   1464         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1465         /* 6 */ "\u00F1,\u0144",
   1466         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   1467         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   1468         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1469         /* 7 */ "\u010D,\u0107,\u00E7",
   1470         /* 8 */ null,
   1471         // U+0111: "" LATIN SMALL LETTER D WITH STROKE
   1472         /* 9 */ "\u0111",
   1473         /* 10 */ null,
   1474         /* 11 */ null,
   1475         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   1476         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   1477         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   1478         /* 12 */ "\u017E,\u017A,\u017C",
   1479     };
   1480 
   1481     /* Language hu: Hungarian */
   1482     private static final String[] LANGUAGE_hu = {
   1483         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1484         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1485         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1486         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1487         // U+00E6: "" LATIN SMALL LETTER AE
   1488         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1489         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1490         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1491         /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
   1492         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1493         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1494         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1495         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1496         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1497         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1498         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1499         /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
   1500         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1501         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1502         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1503         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1504         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1505         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1506         /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
   1507         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1508         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1509         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   1510         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1511         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1512         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1513         // U+0153: "" LATIN SMALL LIGATURE OE
   1514         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1515         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1516         /* 3 */ "\u00F3,\u00F6,\u0151,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
   1517         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1518         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1519         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   1520         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1521         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1522         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1523         /* 4 */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B",
   1524     };
   1525 
   1526     /* Language is: Icelandic */
   1527     private static final String[] LANGUAGE_is = {
   1528         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1529         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1530         // U+00E6: "" LATIN SMALL LETTER AE
   1531         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1532         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1533         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1534         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1535         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1536         /* 0 */ "\u00E1,\u00E4,\u00E6,\u00E5,\u00E0,\u00E2,\u00E3,\u0101",
   1537         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1538         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1539         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1540         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1541         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1542         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1543         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1544         /* 1 */ "\u00E9,\u00EB,\u00E8,\u00EA,\u0119,\u0117,\u0113",
   1545         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1546         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1547         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1548         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1549         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1550         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1551         /* 2 */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
   1552         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1553         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1554         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1555         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1556         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1557         // U+0153: "" LATIN SMALL LIGATURE OE
   1558         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1559         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1560         /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
   1561         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1562         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1563         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1564         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1565         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1566         /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
   1567         /* 5~ */
   1568         null, null, null,
   1569         /* ~7 */
   1570         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   1571         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   1572         /* 8 */ "\u00FD,\u00FF",
   1573         // U+00F0: "" LATIN SMALL LETTER ETH
   1574         /* 9 */ "\u00F0",
   1575         /* 10 */ null,
   1576         // U+00FE: "" LATIN SMALL LETTER THORN
   1577         /* 11 */ "\u00FE",
   1578         /* 12~ */
   1579         null, null, null, null, null, null, null, null,
   1580         /* ~19 */
   1581         // U+00F0: "" LATIN SMALL LETTER ETH
   1582         /* 20 */ "\u00F0",
   1583         // U+00E6: "" LATIN SMALL LETTER AE
   1584         /* 21 */ "\u00E6",
   1585         // U+00FE: "" LATIN SMALL LETTER THORN
   1586         /* 22 */ "\u00FE",
   1587     };
   1588 
   1589     /* Language it: Italian */
   1590     private static final String[] LANGUAGE_it = {
   1591         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1592         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1593         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1594         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1595         // U+00E6: "" LATIN SMALL LETTER AE
   1596         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1597         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1598         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1599         // U+00AA: "" FEMININE ORDINAL INDICATOR
   1600         /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u00AA",
   1601         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1602         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1603         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1604         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1605         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1606         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1607         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1608         /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u0117,\u0113",
   1609         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1610         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1611         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1612         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1613         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1614         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1615         /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B",
   1616         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1617         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1618         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1619         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1620         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1621         // U+0153: "" LATIN SMALL LIGATURE OE
   1622         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1623         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1624         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   1625         /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F6,\u00F5,\u0153,\u00F8,\u014D,\u00BA",
   1626         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1627         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1628         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1629         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1630         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1631         /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B",
   1632     };
   1633 
   1634     /* Language iw: Hebrew */
   1635     private static final String[] LANGUAGE_iw = {
   1636         /* 0~ */
   1637         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1638         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1639         null, null, null, null, null, null, null, null, null, null, null, null, null,
   1640         /* ~42 */
   1641         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
   1642         // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
   1643         /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB",
   1644         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
   1645         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
   1646         /* 44 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
   1647         /* 45~ */
   1648         null, null, null, null, null,
   1649         /* ~49 */
   1650         // U+2605: "" BLACK STAR
   1651         /* 50 */ "\u2605",
   1652         /* 51 */ null,
   1653         // U+00B1: "" PLUS-MINUS SIGN
   1654         // U+FB29: "" HEBREW LETTER ALTERNATIVE PLUS SIGN
   1655         /* 52 */ "\u00B1,\uFB29",
   1656         // The all letters need to be mirrored are found at
   1657         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
   1658         /* 53 */ "!fixedColumnOrder!3,<|>,{|},[|]",
   1659         /* 54 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
   1660         // U+2264: "" LESS-THAN OR EQUAL TO
   1661         // U+2265: "" GREATER-THAN EQUAL TO
   1662         // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
   1663         // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
   1664         // U+2039: "" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
   1665         // U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
   1666         // The following characters don't need BIDI mirroring.
   1667         // U+2018: "" LEFT SINGLE QUOTATION MARK
   1668         // U+2019: "" RIGHT SINGLE QUOTATION MARK
   1669         // U+201A: "" SINGLE LOW-9 QUOTATION MARK
   1670         // U+201B: "" SINGLE HIGH-REVERSED-9 QUOTATION MARK
   1671         // U+201C: "" LEFT DOUBLE QUOTATION MARK
   1672         // U+201D: "" RIGHT DOUBLE QUOTATION MARK
   1673         // U+201E: "" DOUBLE LOW-9 QUOTATION MARK
   1674         // U+201F: "" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
   1675         /* 55 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
   1676         /* 56 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
   1677     };
   1678 
   1679     /* Language ky: Kirghiz */
   1680     private static final String[] LANGUAGE_ky = {
   1681         /* 0~ */
   1682         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1683         null, null, null, null, null, null, null, null, null, null,
   1684         /* ~24 */
   1685         // U+0449: "" CYRILLIC SMALL LETTER SHCHA
   1686         /* 25 */ "\u0449",
   1687         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   1688         /* 26 */ "\u044A",
   1689         // U+044B: "" CYRILLIC SMALL LETTER YERU
   1690         /* 27 */ "\u044B",
   1691         // U+044D: "" CYRILLIC SMALL LETTER E
   1692         /* 28 */ "\u044D",
   1693         // U+0438: "" CYRILLIC SMALL LETTER I
   1694         /* 29 */ "\u0438",
   1695         // U+04AF: "" CYRILLIC SMALL LETTER STRAIGHT U
   1696         /* 30 */ "\u04AF",
   1697         // U+04A3: "" CYRILLIC SMALL LETTER EN WITH DESCENDER
   1698         /* 31 */ "\u04A3",
   1699         /* 32 */ null,
   1700         /* 33 */ null,
   1701         // U+04E9: "" CYRILLIC SMALL LETTER BARRED O
   1702         /* 34 */ "\u04E9",
   1703         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   1704         /* 35 */ "\u044A",
   1705         /* 36~ */
   1706         null, null, null, null,
   1707         /* ~39 */
   1708         // U+0451: "" CYRILLIC SMALL LETTER IO
   1709         /* 40 */ "\u0451",
   1710     };
   1711 
   1712     /* Language lt: Lithuanian */
   1713     private static final String[] LANGUAGE_lt = {
   1714         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   1715         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1716         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1717         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1718         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1719         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1720         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1721         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1722         // U+00E6: "" LATIN SMALL LETTER AE
   1723         /* 0 */ "\u0105,\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6",
   1724         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1725         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1726         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1727         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1728         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1729         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1730         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1731         // U+011B: "" LATIN SMALL LETTER E WITH CARON
   1732         /* 1 */ "\u0117,\u0119,\u0113,\u00E8,\u00E9,\u00EA,\u00EB,\u011B",
   1733         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1734         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1735         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1736         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1737         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1738         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1739         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   1740         /* 2 */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
   1741         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1742         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1743         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1744         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1745         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1746         // U+0153: "" LATIN SMALL LIGATURE OE
   1747         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   1748         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1749         /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
   1750         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1751         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
   1752         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1753         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1754         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1755         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1756         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1757         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
   1758         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   1759         /* 4 */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
   1760         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   1761         // U+00DF: "" LATIN SMALL LETTER SHARP S
   1762         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   1763         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   1764         /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
   1765         // U+0146: "" LATIN SMALL LETTER N WITH CEDILLA
   1766         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   1767         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1768         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1769         /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
   1770         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   1771         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1772         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   1773         /* 7 */ "\u010D,\u00E7,\u0107",
   1774         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   1775         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   1776         /* 8 */ "\u00FD,\u00FF",
   1777         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   1778         /* 9 */ "\u010F",
   1779         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
   1780         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   1781         // U+0155: "" LATIN SMALL LETTER R WITH ACUTE
   1782         /* 10 */ "\u0157,\u0159,\u0155",
   1783         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
   1784         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   1785         /* 11 */ "\u0163,\u0165",
   1786         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   1787         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   1788         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   1789         /* 12 */ "\u017E,\u017C,\u017A",
   1790         // U+0137: "" LATIN SMALL LETTER K WITH CEDILLA
   1791         /* 13 */ "\u0137",
   1792         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
   1793         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   1794         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
   1795         // U+013E: "" LATIN SMALL LETTER L WITH CARON
   1796         /* 14 */ "\u013C,\u0142,\u013A,\u013E",
   1797         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
   1798         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   1799         /* 15 */ "\u0123,\u011F",
   1800     };
   1801 
   1802     /* Language lv: Latvian */
   1803     private static final String[] LANGUAGE_lv = {
   1804         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1805         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1806         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1807         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1808         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1809         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1810         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1811         // U+00E6: "" LATIN SMALL LETTER AE
   1812         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   1813         /* 0 */ "\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0105",
   1814         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1815         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1816         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1817         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1818         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1819         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1820         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1821         // U+011B: "" LATIN SMALL LETTER E WITH CARON
   1822         /* 1 */ "\u0113,\u0117,\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
   1823         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1824         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1825         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1826         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1827         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1828         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1829         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   1830         /* 2 */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
   1831         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1832         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1833         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1834         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1835         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1836         // U+0153: "" LATIN SMALL LIGATURE OE
   1837         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   1838         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1839         /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u0153,\u0151,\u00F8",
   1840         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1841         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
   1842         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1843         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1844         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1845         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1846         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
   1847         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   1848         /* 4 */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171",
   1849         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   1850         // U+00DF: "" LATIN SMALL LETTER SHARP S
   1851         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   1852         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   1853         /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
   1854         // U+0146: "" LATIN SMALL LETTER N WITH CEDILLA
   1855         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   1856         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1857         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   1858         /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
   1859         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   1860         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   1861         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   1862         /* 7 */ "\u010D,\u00E7,\u0107",
   1863         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   1864         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   1865         /* 8 */ "\u00FD,\u00FF",
   1866         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   1867         /* 9 */ "\u010F",
   1868         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
   1869         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   1870         // U+0155: "" LATIN SMALL LETTER R WITH ACUTE
   1871         /* 10 */ "\u0157,\u0159,\u0155",
   1872         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
   1873         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   1874         /* 11 */ "\u0163,\u0165",
   1875         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   1876         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   1877         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   1878         /* 12 */ "\u017E,\u017C,\u017A",
   1879         // U+0137: "" LATIN SMALL LETTER K WITH CEDILLA
   1880         /* 13 */ "\u0137",
   1881         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
   1882         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   1883         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
   1884         // U+013E: "" LATIN SMALL LETTER L WITH CARON
   1885         /* 14 */ "\u013C,\u0142,\u013A,\u013E",
   1886         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
   1887         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   1888         /* 15 */ "\u0123,\u011F",
   1889     };
   1890 
   1891     /* Language mk: Macedonian */
   1892     private static final String[] LANGUAGE_mk = {
   1893         /* 0~ */
   1894         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1895         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1896         null, null, null, null, null, null,
   1897         /* ~35 */
   1898         // U+0455: "" CYRILLIC SMALL LETTER DZE
   1899         /* 36 */ "\u0455",
   1900         // U+045C: "" CYRILLIC SMALL LETTER KJE
   1901         /* 37 */ "\u045C",
   1902         // U+0437: "" CYRILLIC SMALL LETTER ZE
   1903         /* 38 */ "\u0437",
   1904         // U+0453: "" CYRILLIC SMALL LETTER GJE
   1905         /* 39 */ "\u0453",
   1906         // U+0450: "" CYRILLIC SMALL LETTER IE WITH GRAVE
   1907         /* 40 */ "\u0450",
   1908         // U+045D: "" CYRILLIC SMALL LETTER I WITH GRAVE
   1909         /* 41 */ "\u045D",
   1910         /* 42 */ null,
   1911         // U+2018: "" LEFT SINGLE QUOTATION MARK
   1912         // U+2019: "" RIGHT SINGLE QUOTATION MARK
   1913         // U+201A: "" SINGLE LOW-9 QUOTATION MARK
   1914         // U+201B: "" SINGLE HIGH-REVERSED-9 QUOTATION MARK
   1915         // U+201C: "" LEFT DOUBLE QUOTATION MARK
   1916         // U+201D: "" RIGHT DOUBLE QUOTATION MARK
   1917         // U+201E: "" DOUBLE LOW-9 QUOTATION MARK
   1918         // U+201F: "" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
   1919         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
   1920         // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201E;,&#x201C;,&#x201D;,&#x201F;,&#x00AB;,&#x00BB;</string>
   1921         /* 43 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB",
   1922         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
   1923         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
   1924         /* 44 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
   1925     };
   1926 
   1927     /* Language nb: Norwegian Bokml */
   1928     private static final String[] LANGUAGE_nb = {
   1929         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1930         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1931         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1932         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1933         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1934         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1935         /* 0 */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101",
   1936         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1937         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1938         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1939         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1940         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1941         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1942         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1943         /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
   1944         /* 2 */ null,
   1945         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   1946         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   1947         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   1948         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1949         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   1950         // U+0153: "" LATIN SMALL LIGATURE OE
   1951         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   1952         /* 3 */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D",
   1953         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   1954         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   1955         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   1956         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   1957         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   1958         /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
   1959         /* 5~ */
   1960         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   1961         /* ~19 */
   1962         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1963         /* 20 */ "\u00E5",
   1964         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   1965         /* 21 */ "\u00F8",
   1966         // U+00E6: "" LATIN SMALL LETTER AE
   1967         /* 22 */ "\u00E6",
   1968         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   1969         /* 23 */ "\u00F6",
   1970         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1971         /* 24 */ "\u00E4",
   1972     };
   1973 
   1974     /* Language nl: Dutch */
   1975     private static final String[] LANGUAGE_nl = {
   1976         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   1977         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   1978         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   1979         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   1980         // U+00E6: "" LATIN SMALL LETTER AE
   1981         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   1982         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   1983         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   1984         /* 0 */ "\u00E1,\u00E4,\u00E2,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
   1985         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   1986         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   1987         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   1988         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   1989         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   1990         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   1991         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   1992         /* 1 */ "\u00E9,\u00EB,\u00EA,\u00E8,\u0119,\u0117,\u0113",
   1993         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   1994         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   1995         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   1996         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   1997         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   1998         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   1999         // U+0133: "" LATIN SMALL LIGATURE IJ
   2000         /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
   2001         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2002         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2003         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2004         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2005         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2006         // U+0153: "" LATIN SMALL LIGATURE OE
   2007         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2008         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2009         /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
   2010         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2011         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2012         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2013         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2014         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2015         /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
   2016         /* 5 */ null,
   2017         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2018         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2019         /* 6 */ "\u00F1,\u0144",
   2020         /* 7 */ null,
   2021         // U+0133: "" LATIN SMALL LIGATURE IJ
   2022         /* 8 */ "\u0133",
   2023     };
   2024 
   2025     /* Language pl: Polish */
   2026     private static final String[] LANGUAGE_pl = {
   2027         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   2028         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2029         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2030         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2031         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2032         // U+00E6: "" LATIN SMALL LETTER AE
   2033         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2034         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2035         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2036         /* 0 */ "\u0105,\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
   2037         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2038         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2039         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2040         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2041         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2042         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2043         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2044         /* 1 */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113",
   2045         /* 2 */ null,
   2046         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2047         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2048         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2049         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2050         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2051         // U+0153: "" LATIN SMALL LIGATURE OE
   2052         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2053         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2054         /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
   2055         /* 4 */ null,
   2056         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2057         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2058         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2059         /* 5 */ "\u015B,\u00DF,\u0161",
   2060         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2061         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2062         /* 6 */ "\u0144,\u00F1",
   2063         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2064         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2065         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2066         /* 7 */ "\u0107,\u00E7,\u010D",
   2067         /* 8~ */
   2068         null, null, null, null,
   2069         /* ~11 */
   2070         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   2071         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   2072         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   2073         /* 12 */ "\u017C,\u017A,\u017E",
   2074         /* 13 */ null,
   2075         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   2076         /* 14 */ "\u0142",
   2077     };
   2078 
   2079     /* Language pt: Portuguese */
   2080     private static final String[] LANGUAGE_pt = {
   2081         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2082         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2083         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2084         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2085         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2086         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2087         // U+00E6: "" LATIN SMALL LETTER AE
   2088         // U+00AA: "" FEMININE ORDINAL INDICATOR
   2089         /* 0 */ "\u00E1,\u00E3,\u00E0,\u00E2,\u00E4,\u00E5,\u00E6,\u00AA",
   2090         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2091         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2092         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2093         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2094         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2095         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2096         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2097         /* 1 */ "\u00E9,\u00EA,\u00E8,\u0119,\u0117,\u0113,\u00EB",
   2098         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2099         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2100         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2101         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2102         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   2103         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2104         /* 2 */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B",
   2105         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2106         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2107         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2108         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2109         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2110         // U+0153: "" LATIN SMALL LIGATURE OE
   2111         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2112         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2113         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   2114         /* 3 */ "\u00F3,\u00F5,\u00F4,\u00F2,\u00F6,\u0153,\u00F8,\u014D,\u00BA",
   2115         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2116         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2117         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2118         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2119         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2120         /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
   2121         /* 5 */ null,
   2122         /* 6 */ null,
   2123         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2124         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2125         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2126         /* 7 */ "\u00E7,\u010D,\u0107",
   2127     };
   2128 
   2129     /* Language rm: Raeto-Romance */
   2130     private static final String[] LANGUAGE_rm = {
   2131         /* 0~ */
   2132         null, null, null,
   2133         /* ~2 */
   2134         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2135         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2136         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2137         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2138         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2139         // U+0153: "" LATIN SMALL LIGATURE OE
   2140         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2141         /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u0153,\u00F8",
   2142     };
   2143 
   2144     /* Language ro: Romanian */
   2145     private static final String[] LANGUAGE_ro = {
   2146         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2147         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2148         // U+0103: "" LATIN SMALL LETTER A WITH BREVE
   2149         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2150         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2151         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2152         // U+00E6: "" LATIN SMALL LETTER AE
   2153         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2154         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2155         /* 0 */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101",
   2156         /* 1 */ null,
   2157         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2158         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2159         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2160         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2161         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   2162         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2163         /* 2 */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
   2164         /* 3 */ null,
   2165         /* 4 */ null,
   2166         // U+0219: "" LATIN SMALL LETTER S WITH COMMA BELOW
   2167         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2168         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2169         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2170         /* 5 */ "\u0219,\u00DF,\u015B,\u0161",
   2171         /* 6~ */
   2172         null, null, null, null, null,
   2173         /* ~10 */
   2174         // U+021B: "" LATIN SMALL LETTER T WITH COMMA BELOW
   2175         /* 11 */ "\u021B",
   2176     };
   2177 
   2178     /* Language ru: Russian */
   2179     private static final String[] LANGUAGE_ru = {
   2180         /* 0~ */
   2181         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2182         null, null, null, null, null, null, null, null, null, null,
   2183         /* ~24 */
   2184         // U+0449: "" CYRILLIC SMALL LETTER SHCHA
   2185         /* 25 */ "\u0449",
   2186         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   2187         /* 26 */ "\u044A",
   2188         // U+044B: "" CYRILLIC SMALL LETTER YERU
   2189         /* 27 */ "\u044B",
   2190         // U+044D: "" CYRILLIC SMALL LETTER E
   2191         /* 28 */ "\u044D",
   2192         // U+0438: "" CYRILLIC SMALL LETTER I
   2193         /* 29 */ "\u0438",
   2194         /* 30~ */
   2195         null, null, null, null, null,
   2196         /* ~34 */
   2197         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   2198         /* 35 */ "\u044A",
   2199         /* 36~ */
   2200         null, null, null, null,
   2201         /* ~39 */
   2202         // U+0451: "" CYRILLIC SMALL LETTER IO
   2203         /* 40 */ "\u0451",
   2204     };
   2205 
   2206     /* Language sk: Slovak */
   2207     private static final String[] LANGUAGE_sk = {
   2208         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2209         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2210         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2211         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2212         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2213         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2214         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2215         // U+00E6: "" LATIN SMALL LETTER AE
   2216         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   2217         /* 0 */ "\u00E1,\u00E4,\u0101,\u00E0,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
   2218         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2219         // U+011B: "" LATIN SMALL LETTER E WITH CARON
   2220         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2221         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2222         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   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         /* 1 */ "\u00E9,\u011B,\u0113,\u0117,\u00E8,\u00EA,\u00EB,\u0119",
   2227         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   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+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2232         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2233         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   2234         /* 2 */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131",
   2235         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2236         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2237         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2238         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2239         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2240         // U+0153: "" LATIN SMALL LIGATURE OE
   2241         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   2242         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2243         /* 3 */ "\u00F4,\u00F3,\u00F6,\u00F2,\u00F5,\u0153,\u0151,\u00F8",
   2244         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2245         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
   2246         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2247         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2248         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
   2249         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2250         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2251         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   2252         /* 4 */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\u0171",
   2253         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2254         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2255         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2256         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   2257         /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
   2258         // U+0148: "" LATIN SMALL LETTER N WITH CARON
   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 */ "\u0148,\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+0155: "" LATIN SMALL LETTER R WITH ACUTE
   2274         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   2275         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
   2276         /* 10 */ "\u0155,\u0159,\u0157",
   2277         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   2278         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
   2279         /* 11 */ "\u0165,\u0163",
   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+013E: "" LATIN SMALL LETTER L WITH CARON
   2287         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
   2288         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
   2289         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   2290         /* 14 */ "\u013E,\u013A,\u013C,\u0142",
   2291         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
   2292         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   2293         /* 15 */ "\u0123,\u011F",
   2294     };
   2295 
   2296     /* Language sl: Slovenian */
   2297     private static final String[] LANGUAGE_sl = {
   2298         /* 0~ */
   2299         null, null, null, null, null,
   2300         /* ~4 */
   2301         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2302         /* 5 */ "\u0161",
   2303         /* 6 */ null,
   2304         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2305         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2306         /* 7 */ "\u010D,\u0107",
   2307         /* 8 */ null,
   2308         // U+0111: "" LATIN SMALL LETTER D WITH STROKE
   2309         /* 9 */ "\u0111",
   2310         /* 10 */ null,
   2311         /* 11 */ null,
   2312         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   2313         /* 12 */ "\u017E",
   2314     };
   2315 
   2316     /* Language sr: Serbian */
   2317     private static final String[] LANGUAGE_sr = {
   2318         /* 0~ */
   2319         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2320         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2321         null, null, null, null, null, null,
   2322         /* ~35 */
   2323         // TODO: Move these to sr-Latn once we can handle IETF language tag with script name specified.
   2324         // BEGIN: More keys definitions for Serbian (Latin)
   2325         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2326         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2327         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2328         // <string name="more_keys_for_s">&#x0161;,&#x00DF;,&#x015B;</string>
   2329         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2330         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2331         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2332         // <string name="more_keys_for_c">&#x010D;,&#x00E7;,&#x0107;</string>
   2333         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   2334         // <string name="more_keys_for_d">&#x010F;</string>
   2335         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   2336         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   2337         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   2338         // <string name="more_keys_for_z">&#x017E;,&#x017A;,&#x017C;</string>
   2339         // END: More keys definitions for Serbian (Latin)
   2340         // BEGIN: More keys definitions for Serbian (Cyrillic)
   2341         // U+0437: "" CYRILLIC SMALL LETTER ZE
   2342         /* 36 */ "\u0437",
   2343         // U+045B: "" CYRILLIC SMALL LETTER TSHE
   2344         /* 37 */ "\u045B",
   2345         // U+0455: "" CYRILLIC SMALL LETTER DZE
   2346         /* 38 */ "\u0455",
   2347         // U+0452: "" CYRILLIC SMALL LETTER DJE
   2348         /* 39 */ "\u0452",
   2349         // U+0450: "" CYRILLIC SMALL LETTER IE WITH GRAVE
   2350         /* 40 */ "\u0450",
   2351         // U+045D: "" CYRILLIC SMALL LETTER I WITH GRAVE
   2352         /* 41 */ "\u045D",
   2353         /* 42 */ null,
   2354         // END: More keys definitions for Serbian (Cyrillic)
   2355         // U+2018: "" LEFT SINGLE QUOTATION MARK
   2356         // U+2019: "" RIGHT SINGLE QUOTATION MARK
   2357         // U+201A: "" SINGLE LOW-9 QUOTATION MARK
   2358         // U+201B: "" SINGLE HIGH-REVERSED-9 QUOTATION MARK
   2359         // U+201C: "" LEFT DOUBLE QUOTATION MARK
   2360         // U+201D: "" RIGHT DOUBLE QUOTATION MARK
   2361         // U+201E: "" DOUBLE LOW-9 QUOTATION MARK
   2362         // U+201F: "" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
   2363         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
   2364         // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201E;,&#x201C;,&#x201D;,&#x201F;,&#x00AB;,&#x00BB;</string>
   2365         /* 43 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB",
   2366         // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
   2367         // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
   2368         /* 44 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
   2369     };
   2370 
   2371     /* Language sv: Swedish */
   2372     private static final String[] LANGUAGE_sv = {
   2373         /* 0 */ null,
   2374         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2375         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2376         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2377         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2378         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2379         /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119",
   2380         /* 2 */ null,
   2381         // U+0153: "" LATIN SMALL LIGATURE OE
   2382         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2383         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2384         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2385         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2386         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2387         /* 3 */ "\u0153,\u00F4,\u00F2,\u00F3,\u00F5,\u014D",
   2388         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2389         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2390         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2391         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2392         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2393         /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
   2394         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2395         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2396         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2397         /* 5 */ "\u00DF,\u015B,\u0161",
   2398         /* 6~ */
   2399         null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2400         /* ~19 */
   2401         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2402         /* 20 */ "\u00E5",
   2403         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2404         /* 21 */ "\u00F6",
   2405         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2406         /* 22 */ "\u00E4",
   2407         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2408         /* 23 */ "\u00F8",
   2409         // U+00E6: "" LATIN SMALL LETTER AE
   2410         /* 24 */ "\u00E6",
   2411     };
   2412 
   2413     /* Language sw: Swahili */
   2414     private static final String[] LANGUAGE_sw = {
   2415         // This is the same as English except more_keys_for_g.
   2416         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2417         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2418         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2419         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2420         // U+00E6: "" LATIN SMALL LETTER AE
   2421         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2422         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2423         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2424         /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
   2425         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2426         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2427         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2428         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2429         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2430         /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
   2431         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2432         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2433         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2434         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2435         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2436         /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
   2437         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2438         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2439         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2440         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2441         // U+0153: "" LATIN SMALL LIGATURE OE
   2442         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2443         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2444         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2445         /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
   2446         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2447         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2448         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2449         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2450         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2451         /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
   2452         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2453         /* 5 */ "\u00DF",
   2454         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2455         /* 6 */ "\u00F1",
   2456         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2457         /* 7 */ "\u00E7",
   2458         /* 8~ */
   2459         null, null, null, null, null, null, null,
   2460         /* ~14 */
   2461         /* 15 */ "g\'",
   2462     };
   2463 
   2464     /* Language tl: Tagalog */
   2465     private static final String[] LANGUAGE_tl = {
   2466         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2467         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2468         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2469         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2470         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2471         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2472         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   2473         // U+00E6: "" LATIN SMALL LETTER AE
   2474         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2475         // U+00AA: "" FEMININE ORDINAL INDICATOR
   2476         /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
   2477         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2478         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2479         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2480         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2481         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2482         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2483         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2484         /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
   2485         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2486         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2487         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2488         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2489         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   2490         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2491         /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
   2492         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2493         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2494         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2495         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2496         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2497         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2498         // U+0153: "" LATIN SMALL LIGATURE OE
   2499         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2500         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   2501         /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
   2502         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2503         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2504         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2505         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2506         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2507         /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
   2508         /* 5 */ null,
   2509         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2510         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2511         /* 6 */ "\u00F1,\u0144",
   2512         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2513         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2514         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2515         /* 7 */ "\u00E7,\u0107,\u010D",
   2516     };
   2517 
   2518     /* Language tr: Turkish */
   2519     private static final String[] LANGUAGE_tr = {
   2520         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2521         /* 0 */ "\u00E2",
   2522         /* 1 */ null,
   2523         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   2524         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2525         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2526         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2527         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2528         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   2529         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2530         /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
   2531         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2532         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2533         // U+0153: "" LATIN SMALL LIGATURE OE
   2534         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2535         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2536         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2537         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2538         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2539         /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
   2540         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2541         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2542         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2543         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2544         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2545         /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
   2546         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   2547         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2548         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2549         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2550         /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
   2551         /* 6 */ null,
   2552         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2553         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2554         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2555         /* 7 */ "\u00E7,\u0107,\u010D",
   2556         /* 8~ */
   2557         null, null, null, null, null, null, null,
   2558         /* ~14 */
   2559         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   2560         /* 15 */ "\u011F",
   2561     };
   2562 
   2563     /* Language uk: Ukrainian */
   2564     private static final String[] LANGUAGE_uk = {
   2565         /* 0~ */
   2566         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
   2567         null, null, null, null, null, null, null, null, null, null,
   2568         /* ~24 */
   2569         // U+0449: "" CYRILLIC SMALL LETTER SHCHA
   2570         /* 25 */ "\u0449",
   2571         // U+0457: "" CYRILLIC SMALL LETTER YI
   2572         /* 26 */ "\u0457",
   2573         // U+0456: "" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
   2574         /* 27 */ "\u0456",
   2575         // U+0454: "" CYRILLIC SMALL LETTER UKRAINIAN IE
   2576         /* 28 */ "\u0454",
   2577         // U+0438: "" CYRILLIC SMALL LETTER I
   2578         /* 29 */ "\u0438",
   2579         /* 30 */ null,
   2580         /* 31 */ null,
   2581         // U+0491: "" CYRILLIC SMALL LETTER GHE WITH UPTURN
   2582         /* 32 */ "\u0491",
   2583         // U+0457: "" CYRILLIC SMALL LETTER YI
   2584         /* 33 */ "\u0457",
   2585         /* 34 */ null,
   2586         // U+044A: "" CYRILLIC SMALL LETTER HARD SIGN
   2587         /* 35 */ "\u044A",
   2588     };
   2589 
   2590     /* Language vi: Vietnamese */
   2591     private static final String[] LANGUAGE_vi = {
   2592         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2593         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2594         // U+1EA3: "" LATIN SMALL LETTER A WITH HOOK ABOVE
   2595         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2596         // U+1EA1: "" LATIN SMALL LETTER A WITH DOT BELOW
   2597         // U+0103: "" LATIN SMALL LETTER A WITH BREVE
   2598         // U+1EB1: "" LATIN SMALL LETTER A WITH BREVE AND GRAVE
   2599         // U+1EAF: "" LATIN SMALL LETTER A WITH BREVE AND ACUTE
   2600         // U+1EB3: "" LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
   2601         // U+1EB5: "" LATIN SMALL LETTER A WITH BREVE AND TILDE
   2602         // U+1EB7: "" LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
   2603         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2604         // U+1EA7: "" LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
   2605         // U+1EA5: "" LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
   2606         // U+1EA9: "" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
   2607         // U+1EAB: "" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
   2608         // U+1EAD: "" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
   2609         /* 0 */ "\u00E0,\u00E1,\u1EA3,\u00E3,\u1EA1,\u0103,\u1EB1,\u1EAF,\u1EB3,\u1EB5,\u1EB7,\u00E2,\u1EA7,\u1EA5,\u1EA9,\u1EAB,\u1EAD",
   2610         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2611         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2612         // U+1EBB: "" LATIN SMALL LETTER E WITH HOOK ABOVE
   2613         // U+1EBD: "" LATIN SMALL LETTER E WITH TILDE
   2614         // U+1EB9: "" LATIN SMALL LETTER E WITH DOT BELOW
   2615         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2616         // U+1EC1: "" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
   2617         // U+1EBF: "" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
   2618         // U+1EC3: "" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
   2619         // U+1EC5: "" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
   2620         // U+1EC7: "" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
   2621         /* 1 */ "\u00E8,\u00E9,\u1EBB,\u1EBD,\u1EB9,\u00EA,\u1EC1,\u1EBF,\u1EC3,\u1EC5,\u1EC7",
   2622         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2623         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2624         // U+1EC9: "" LATIN SMALL LETTER I WITH HOOK ABOVE
   2625         // U+0129: "" LATIN SMALL LETTER I WITH TILDE
   2626         // U+1ECB: "" LATIN SMALL LETTER I WITH DOT BELOW
   2627         /* 2 */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB",
   2628         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2629         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2630         // U+1ECF: "" LATIN SMALL LETTER O WITH HOOK ABOVE
   2631         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2632         // U+1ECD: "" LATIN SMALL LETTER O WITH DOT BELOW
   2633         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2634         // U+1ED3: "" LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
   2635         // U+1ED1: "" LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
   2636         // U+1ED5: "" LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
   2637         // U+1ED7: "" LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
   2638         // U+1ED9: "" LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
   2639         // U+01A1: "" LATIN SMALL LETTER O WITH HORN
   2640         // U+1EDD: "" LATIN SMALL LETTER O WITH HORN AND GRAVE
   2641         // U+1EDB: "" LATIN SMALL LETTER O WITH HORN AND ACUTE
   2642         // U+1EDF: "" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
   2643         // U+1EE1: "" LATIN SMALL LETTER O WITH HORN AND TILDE
   2644         // U+1EE3: "" LATIN SMALL LETTER O WITH HORN AND DOT BELOW
   2645         /* 3 */ "\u00F2,\u00F3,\u1ECF,\u00F5,\u1ECD,\u00F4,\u1ED3,\u1ED1,\u1ED5,\u1ED7,\u1ED9,\u01A1,\u1EDD,\u1EDB,\u1EDF,\u1EE1,\u1EE3",
   2646         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2647         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2648         // U+1EE7: "" LATIN SMALL LETTER U WITH HOOK ABOVE
   2649         // U+0169: "" LATIN SMALL LETTER U WITH TILDE
   2650         // U+1EE5: "" LATIN SMALL LETTER U WITH DOT BELOW
   2651         // U+01B0: "" LATIN SMALL LETTER U WITH HORN
   2652         // U+1EEB: "" LATIN SMALL LETTER U WITH HORN AND GRAVE
   2653         // U+1EE9: "" LATIN SMALL LETTER U WITH HORN AND ACUTE
   2654         // U+1EED: "" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
   2655         // U+1EEF: "" LATIN SMALL LETTER U WITH HORN AND TILDE
   2656         // U+1EF1: "" LATIN SMALL LETTER U WITH HORN AND DOT BELOW
   2657         /* 4 */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1",
   2658         /* 5~ */
   2659         null, null, null,
   2660         /* ~7 */
   2661         // U+1EF3: "" LATIN SMALL LETTER Y WITH GRAVE
   2662         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   2663         // U+1EF7: "" LATIN SMALL LETTER Y WITH HOOK ABOVE
   2664         // U+1EF9: "" LATIN SMALL LETTER Y WITH TILDE
   2665         // U+1EF5: "" LATIN SMALL LETTER Y WITH DOT BELOW
   2666         /* 8 */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5",
   2667         // U+0111: "" LATIN SMALL LETTER D WITH STROKE
   2668         /* 9 */ "\u0111",
   2669     };
   2670 
   2671     /* Language zu: Zulu */
   2672     private static final String[] LANGUAGE_zu = {
   2673         // This is the same as English
   2674         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2675         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2676         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2677         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2678         // U+00E6: "" LATIN SMALL LETTER AE
   2679         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2680         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2681         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2682         /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
   2683         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2684         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2685         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2686         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2687         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2688         /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
   2689         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2690         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2691         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2692         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2693         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2694         /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
   2695         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2696         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2697         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2698         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2699         // U+0153: "" LATIN SMALL LIGATURE OE
   2700         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2701         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2702         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2703         /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
   2704         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2705         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2706         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2707         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2708         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2709         /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
   2710         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2711         /* 5 */ "\u00DF",
   2712         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2713         /* 6 */ "\u00F1",
   2714         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2715         /* 7 */ "\u00E7",
   2716     };
   2717 
   2718     /* Language zz: No language */
   2719     private static final String[] LANGUAGE_zz = {
   2720         // U+00E0: "" LATIN SMALL LETTER A WITH GRAVE
   2721         // U+00E1: "" LATIN SMALL LETTER A WITH ACUTE
   2722         // U+00E2: "" LATIN SMALL LETTER A WITH CIRCUMFLEX
   2723         // U+00E3: "" LATIN SMALL LETTER A WITH TILDE
   2724         // U+00E4: "" LATIN SMALL LETTER A WITH DIAERESIS
   2725         // U+00E5: "" LATIN SMALL LETTER A WITH RING ABOVE
   2726         // U+00E6: "" LATIN SMALL LETTER AE
   2727         // U+0101: "" LATIN SMALL LETTER A WITH MACRON
   2728         // U+0103: "" LATIN SMALL LETTER A WITH BREVE
   2729         // U+0105: "" LATIN SMALL LETTER A WITH OGONEK
   2730         // U+00AA: "" FEMININE ORDINAL INDICATOR
   2731         /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
   2732         // U+00E8: "" LATIN SMALL LETTER E WITH GRAVE
   2733         // U+00E9: "" LATIN SMALL LETTER E WITH ACUTE
   2734         // U+00EA: "" LATIN SMALL LETTER E WITH CIRCUMFLEX
   2735         // U+00EB: "" LATIN SMALL LETTER E WITH DIAERESIS
   2736         // U+0113: "" LATIN SMALL LETTER E WITH MACRON
   2737         // U+0115: "" LATIN SMALL LETTER E WITH BREVE
   2738         // U+0117: "" LATIN SMALL LETTER E WITH DOT ABOVE
   2739         // U+0119: "" LATIN SMALL LETTER E WITH OGONEK
   2740         // U+011B: "" LATIN SMALL LETTER E WITH CARON
   2741         /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B",
   2742         // U+00EC: "" LATIN SMALL LETTER I WITH GRAVE
   2743         // U+00ED: "" LATIN SMALL LETTER I WITH ACUTE
   2744         // U+00EE: "" LATIN SMALL LETTER I WITH CIRCUMFLEX
   2745         // U+00EF: "" LATIN SMALL LETTER I WITH DIAERESIS
   2746         // U+0129: "" LATIN SMALL LETTER I WITH TILDE
   2747         // U+012B: "" LATIN SMALL LETTER I WITH MACRON
   2748         // U+012D: "" LATIN SMALL LETTER I WITH BREVE
   2749         // U+012F: "" LATIN SMALL LETTER I WITH OGONEK
   2750         // U+0131: "" LATIN SMALL LETTER DOTLESS I
   2751         // U+0133: "" LATIN SMALL LIGATURE IJ
   2752         /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
   2753         // U+00F2: "" LATIN SMALL LETTER O WITH GRAVE
   2754         // U+00F3: "" LATIN SMALL LETTER O WITH ACUTE
   2755         // U+00F4: "" LATIN SMALL LETTER O WITH CIRCUMFLEX
   2756         // U+00F5: "" LATIN SMALL LETTER O WITH TILDE
   2757         // U+00F6: "" LATIN SMALL LETTER O WITH DIAERESIS
   2758         // U+00F8: "" LATIN SMALL LETTER O WITH STROKE
   2759         // U+014D: "" LATIN SMALL LETTER O WITH MACRON
   2760         // U+014F: "" LATIN SMALL LETTER O WITH BREVE
   2761         // U+0151: "" LATIN SMALL LETTER O WITH DOUBLE ACUTE
   2762         // U+0153: "" LATIN SMALL LIGATURE OE
   2763         // U+00BA: "" MASCULINE ORDINAL INDICATOR
   2764         /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA",
   2765         // U+00F9: "" LATIN SMALL LETTER U WITH GRAVE
   2766         // U+00FA: "" LATIN SMALL LETTER U WITH ACUTE
   2767         // U+00FB: "" LATIN SMALL LETTER U WITH CIRCUMFLEX
   2768         // U+00FC: "" LATIN SMALL LETTER U WITH DIAERESIS
   2769         // U+0169: "" LATIN SMALL LETTER U WITH TILDE
   2770         // U+016B: "" LATIN SMALL LETTER U WITH MACRON
   2771         // U+016D: "" LATIN SMALL LETTER U WITH BREVE
   2772         // U+016F: "" LATIN SMALL LETTER U WITH RING ABOVE
   2773         // U+0171: "" LATIN SMALL LETTER U WITH DOUBLE ACUTE
   2774         // U+0173: "" LATIN SMALL LETTER U WITH OGONEK
   2775         /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173",
   2776         // U+00DF: "" LATIN SMALL LETTER SHARP S
   2777         // U+015B: "" LATIN SMALL LETTER S WITH ACUTE
   2778         // U+015D: "" LATIN SMALL LETTER S WITH CIRCUMFLEX
   2779         // U+015F: "" LATIN SMALL LETTER S WITH CEDILLA
   2780         // U+0161: "" LATIN SMALL LETTER S WITH CARON
   2781         // U+017F: "" LATIN SMALL LETTER LONG S
   2782         /* 5 */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F",
   2783         // U+00F1: "" LATIN SMALL LETTER N WITH TILDE
   2784         // U+0144: "" LATIN SMALL LETTER N WITH ACUTE
   2785         // U+0146: "" LATIN SMALL LETTER N WITH CEDILLA
   2786         // U+0148: "" LATIN SMALL LETTER N WITH CARON
   2787         // U+0149: "" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
   2788         // U+014B: "" LATIN SMALL LETTER ENG
   2789         /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
   2790         // U+00E7: "" LATIN SMALL LETTER C WITH CEDILLA
   2791         // U+0107: "" LATIN SMALL LETTER C WITH ACUTE
   2792         // U+0109: "" LATIN SMALL LETTER C WITH CIRCUMFLEX
   2793         // U+010B: "" LATIN SMALL LETTER C WITH DOT ABOVE
   2794         // U+010D: "" LATIN SMALL LETTER C WITH CARON
   2795         /* 7 */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
   2796         // U+00FD: "" LATIN SMALL LETTER Y WITH ACUTE
   2797         // U+0177: "" LATIN SMALL LETTER Y WITH CIRCUMFLEX
   2798         // U+00FF: "" LATIN SMALL LETTER Y WITH DIAERESIS
   2799         // U+0133: "" LATIN SMALL LIGATURE IJ
   2800         /* 8 */ "\u00FD,\u0177,\u00FF,\u0133",
   2801         // U+010F: "" LATIN SMALL LETTER D WITH CARON
   2802         // U+0111: "" LATIN SMALL LETTER D WITH STROKE
   2803         // U+00F0: "" LATIN SMALL LETTER ETH
   2804         /* 9 */ "\u010F,\u0111,\u00F0",
   2805         // U+0155: "" LATIN SMALL LETTER R WITH ACUTE
   2806         // U+0157: "" LATIN SMALL LETTER R WITH CEDILLA
   2807         // U+0159: "" LATIN SMALL LETTER R WITH CARON
   2808         /* 10 */ "\u0155,\u0157,\u0159",
   2809         // U+00FE: "" LATIN SMALL LETTER THORN
   2810         // U+0163: "" LATIN SMALL LETTER T WITH CEDILLA
   2811         // U+0165: "" LATIN SMALL LETTER T WITH CARON
   2812         // U+0167: "" LATIN SMALL LETTER T WITH STROKE
   2813         /* 11 */ "\u00FE,\u0163,\u0165,\u0167",
   2814         // U+017A: "" LATIN SMALL LETTER Z WITH ACUTE
   2815         // U+017C: "" LATIN SMALL LETTER Z WITH DOT ABOVE
   2816         // U+017E: "" LATIN SMALL LETTER Z WITH CARON
   2817         /* 12 */ "\u017A,\u017C,\u017E",
   2818         // U+0137: "" LATIN SMALL LETTER K WITH CEDILLA
   2819         // U+0138: "" LATIN SMALL LETTER KRA
   2820         /* 13 */ "\u0137,\u0138",
   2821         // U+013A: "" LATIN SMALL LETTER L WITH ACUTE
   2822         // U+013C: "" LATIN SMALL LETTER L WITH CEDILLA
   2823         // U+013E: "" LATIN SMALL LETTER L WITH CARON
   2824         // U+0140: "" LATIN SMALL LETTER L WITH MIDDLE DOT
   2825         // U+0142: "" LATIN SMALL LETTER L WITH STROKE
   2826         /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
   2827         // U+011D: "" LATIN SMALL LETTER G WITH CIRCUMFLEX
   2828         // U+011F: "" LATIN SMALL LETTER G WITH BREVE
   2829         // U+0121: "" LATIN SMALL LETTER G WITH DOT ABOVE
   2830         // U+0123: "" LATIN SMALL LETTER G WITH CEDILLA
   2831         /* 15 */ "\u011D,\u011F,\u0121,\u0123",
   2832         /* 16 */ null,
   2833         // U+0125: "" LATIN SMALL LETTER H WITH CIRCUMFLEX
   2834         /* 17 */ "\u0125",
   2835         // U+0135: "" LATIN SMALL LETTER J WITH CIRCUMFLEX
   2836         /* 18 */ "\u0135",
   2837         // U+0175: "" LATIN SMALL LETTER W WITH CIRCUMFLEX
   2838         /* 19 */ "\u0175",
   2839     };
   2840 
   2841     private static final Object[] LANGUAGES_AND_TEXTS = {
   2842         "DEFAULT", LANGUAGE_DEFAULT, /* default */
   2843         "af", LANGUAGE_af, /* Afrikaans */
   2844         "ar", LANGUAGE_ar, /* Arabic */
   2845         "be", LANGUAGE_be, /* Belarusian */
   2846         "ca", LANGUAGE_ca, /* Catalan */
   2847         "cs", LANGUAGE_cs, /* Czech */
   2848         "da", LANGUAGE_da, /* Danish */
   2849         "de", LANGUAGE_de, /* German */
   2850         "en", LANGUAGE_en, /* English */
   2851         "eo", LANGUAGE_eo, /* Esperanto */
   2852         "es", LANGUAGE_es, /* Spanish */
   2853         "et", LANGUAGE_et, /* Estonian */
   2854         "fa", LANGUAGE_fa, /* Persian */
   2855         "fi", LANGUAGE_fi, /* Finnish */
   2856         "fr", LANGUAGE_fr, /* French */
   2857         "hi", LANGUAGE_hi, /* Hindi */
   2858         "hr", LANGUAGE_hr, /* Croatian */
   2859         "hu", LANGUAGE_hu, /* Hungarian */
   2860         "is", LANGUAGE_is, /* Icelandic */
   2861         "it", LANGUAGE_it, /* Italian */
   2862         "iw", LANGUAGE_iw, /* Hebrew */
   2863         "ky", LANGUAGE_ky, /* Kirghiz */
   2864         "lt", LANGUAGE_lt, /* Lithuanian */
   2865         "lv", LANGUAGE_lv, /* Latvian */
   2866         "mk", LANGUAGE_mk, /* Macedonian */
   2867         "nb", LANGUAGE_nb, /* Norwegian Bokml */
   2868         "nl", LANGUAGE_nl, /* Dutch */
   2869         "pl", LANGUAGE_pl, /* Polish */
   2870         "pt", LANGUAGE_pt, /* Portuguese */
   2871         "rm", LANGUAGE_rm, /* Raeto-Romance */
   2872         "ro", LANGUAGE_ro, /* Romanian */
   2873         "ru", LANGUAGE_ru, /* Russian */
   2874         "sk", LANGUAGE_sk, /* Slovak */
   2875         "sl", LANGUAGE_sl, /* Slovenian */
   2876         "sr", LANGUAGE_sr, /* Serbian */
   2877         "sv", LANGUAGE_sv, /* Swedish */
   2878         "sw", LANGUAGE_sw, /* Swahili */
   2879         "tl", LANGUAGE_tl, /* Tagalog */
   2880         "tr", LANGUAGE_tr, /* Turkish */
   2881         "uk", LANGUAGE_uk, /* Ukrainian */
   2882         "vi", LANGUAGE_vi, /* Vietnamese */
   2883         "zu", LANGUAGE_zu, /* Zulu */
   2884         "zz", LANGUAGE_zz, /* No language */
   2885     };
   2886 
   2887     static {
   2888         int id = 0;
   2889         for (final String name : NAMES) {
   2890             sNameToIdsMap.put(name, id++);
   2891         }
   2892 
   2893         for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
   2894             final String language = (String)LANGUAGES_AND_TEXTS[i];
   2895             final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
   2896             sLocaleToTextsMap.put(language, texts);
   2897         }
   2898     }
   2899 }
   2900