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