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