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
17package com.android.inputmethod.keyboard.internal;
18
19import android.content.Context;
20import android.content.res.Resources;
21
22import com.android.inputmethod.latin.CollectionUtils;
23import com.android.inputmethod.latin.R;
24
25import 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 */
47public 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: "ij" 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: "ij" 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: "ij" 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 Bokmål */
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: "ij" 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: "ij" 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: "ij" 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: "ij" 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 Bokmål */
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