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