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