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