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