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