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