KeyboardTextsSet.java revision 82a6f66783681cdc9a18a9df65cd48afa243b609
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License. You may obtain a copy of
6 * 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, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations under
14 * 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.latin.R;
23
24import java.util.HashMap;
25
26/**
27 * !!!!! DO NOT EDIT THIS FILE !!!!!
28 *
29 * This file is generated by tools/maketext. The base template file is
30 *   tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
31 *
32 * This file must be updated when any text resources in keyboard layout files have been changed.
33 * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions,
34 * and should be defined in
35 *   tools/maketext/res/values-<locale>/donottranslate-more-keys.xml
36 *
37 * To update this file, please run the following commands.
38 *   $ cd $ANDROID_BUILD_TOP
39 *   $ mmm packages/inputmethods/LatinIME/tools/maketext
40 *   $ maketext -java packages/inputmethods/LatinIME/java/src
41 *
42 * The updated source file will be generated to the following path (this file).
43 *   packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/
44 *   KeyboardTextsSet.java
45 */
46public final class KeyboardTextsSet {
47    // Language to texts map.
48    private static final HashMap<String, String[]> sLocaleToTextsMap =
49            new HashMap<String, String[]>();
50    private static final HashMap<String, Integer> sNameToIdsMap =
51            new HashMap<String, Integer>();
52
53    private String[] mTexts;
54    // Resource name to text map.
55    private HashMap<String, String> mResourceNameToTextsMap = new HashMap<String, String>();
56
57    public void setLanguage(final String language) {
58        mTexts = sLocaleToTextsMap.get(language);
59        if (mTexts == null) {
60            mTexts = LANGUAGE_DEFAULT;
61        }
62    }
63
64    public void loadStringResources(Context context) {
65        loadStringResourcesInternal(context, RESOURCE_NAMES, R.string.english_ime_name);
66    }
67
68    /* package for test */
69    void loadStringResourcesInternal(Context context, final String[] resourceNames,
70            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_to_alpha_key",
101        "label_to_symbol_key",
102        "label_to_symbol_with_microphone_key",
103        "label_pause_key",
104        "label_wait_key",
105    };
106
107    private static final String[] NAMES = {
108        /*  0 */ "more_keys_for_a",
109        /*  1 */ "more_keys_for_e",
110        /*  2 */ "more_keys_for_i",
111        /*  3 */ "more_keys_for_o",
112        /*  4 */ "more_keys_for_u",
113        /*  5 */ "more_keys_for_s",
114        /*  6 */ "more_keys_for_n",
115        /*  7 */ "more_keys_for_c",
116        /*  8 */ "more_keys_for_y",
117        /*  9 */ "more_keys_for_d",
118        /* 10 */ "more_keys_for_r",
119        /* 11 */ "more_keys_for_t",
120        /* 12 */ "more_keys_for_z",
121        /* 13 */ "more_keys_for_k",
122        /* 14 */ "more_keys_for_l",
123        /* 15 */ "more_keys_for_g",
124        /* 16 */ "more_keys_for_v",
125        /* 17 */ "more_keys_for_h",
126        /* 18 */ "more_keys_for_j",
127        /* 19 */ "more_keys_for_w",
128        /* 20 */ "keylabel_for_nordic_row1_11",
129        /* 21 */ "keylabel_for_nordic_row2_10",
130        /* 22 */ "keylabel_for_nordic_row2_11",
131        /* 23 */ "more_keys_for_nordic_row2_10",
132        /* 24 */ "more_keys_for_nordic_row2_11",
133        /* 25 */ "keylabel_for_east_slavic_row1_9",
134        /* 26 */ "keylabel_for_east_slavic_row2_1",
135        /* 27 */ "keylabel_for_east_slavic_row3_5",
136        /* 28 */ "more_keys_for_cyrillic_u",
137        /* 29 */ "more_keys_for_cyrillic_ye",
138        /* 30 */ "more_keys_for_cyrillic_en",
139        /* 31 */ "more_keys_for_cyrillic_ha",
140        /* 32 */ "more_keys_for_east_slavic_row2_1",
141        /* 33 */ "more_keys_for_cyrillic_o",
142        /* 34 */ "more_keys_for_cyrillic_soft_sign",
143        /* 35 */ "keylabel_for_south_slavic_row1_6",
144        /* 36 */ "keylabel_for_south_slavic_row2_11",
145        /* 37 */ "keylabel_for_south_slavic_row3_1",
146        /* 38 */ "keylabel_for_south_slavic_row3_8",
147        /* 39 */ "more_keys_for_cyrillic_ie",
148        /* 40 */ "more_keys_for_cyrillic_i",
149        /* 41 */ "more_keys_for_single_quote",
150        /* 42 */ "more_keys_for_double_quote",
151        /* 43 */ "more_keys_for_tablet_double_quote",
152        /* 44 */ "more_keys_for_currency_dollar",
153        /* 45 */ "more_keys_for_currency_euro",
154        /* 46 */ "more_keys_for_currency_pound",
155        /* 47 */ "more_keys_for_currency_general",
156        /* 48 */ "more_keys_for_punctuation",
157        /* 49 */ "more_keys_for_star",
158        /* 50 */ "more_keys_for_bullet",
159        /* 51 */ "more_keys_for_plus",
160        /* 52 */ "more_keys_for_left_parenthesis",
161        /* 53 */ "more_keys_for_right_parenthesis",
162        /* 54 */ "more_keys_for_less_than",
163        /* 55 */ "more_keys_for_greater_than",
164        /* 56 */ "more_keys_for_arabic_diacritics",
165        /* 57 */ "keyhintlabel_for_arabic_diacritics",
166        /* 58 */ "keylabel_for_symbols_1",
167        /* 59 */ "keylabel_for_symbols_2",
168        /* 60 */ "keylabel_for_symbols_3",
169        /* 61 */ "keylabel_for_symbols_4",
170        /* 62 */ "keylabel_for_symbols_5",
171        /* 63 */ "keylabel_for_symbols_6",
172        /* 64 */ "keylabel_for_symbols_7",
173        /* 65 */ "keylabel_for_symbols_8",
174        /* 66 */ "keylabel_for_symbols_9",
175        /* 67 */ "keylabel_for_symbols_0",
176        /* 68 */ "additional_more_keys_for_symbols_1",
177        /* 69 */ "additional_more_keys_for_symbols_2",
178        /* 70 */ "additional_more_keys_for_symbols_3",
179        /* 71 */ "additional_more_keys_for_symbols_4",
180        /* 72 */ "additional_more_keys_for_symbols_5",
181        /* 73 */ "additional_more_keys_for_symbols_6",
182        /* 74 */ "additional_more_keys_for_symbols_7",
183        /* 75 */ "additional_more_keys_for_symbols_8",
184        /* 76 */ "additional_more_keys_for_symbols_9",
185        /* 77 */ "additional_more_keys_for_symbols_0",
186        /* 78 */ "more_keys_for_symbols_1",
187        /* 79 */ "more_keys_for_symbols_2",
188        /* 80 */ "more_keys_for_symbols_3",
189        /* 81 */ "more_keys_for_symbols_4",
190        /* 82 */ "more_keys_for_symbols_5",
191        /* 83 */ "more_keys_for_symbols_6",
192        /* 84 */ "more_keys_for_symbols_7",
193        /* 85 */ "more_keys_for_symbols_8",
194        /* 86 */ "more_keys_for_symbols_9",
195        /* 87 */ "more_keys_for_symbols_0",
196        /* 88 */ "keylabel_for_comma",
197        /* 89 */ "more_keys_for_comma",
198        /* 90 */ "keylabel_for_symbols_exclamation",
199        /* 91 */ "keylabel_for_symbols_question",
200        /* 92 */ "keylabel_for_symbols_semicolon",
201        /* 93 */ "keylabel_for_symbols_percent",
202        /* 94 */ "more_keys_for_symbols_exclamation",
203        /* 95 */ "more_keys_for_symbols_question",
204        /* 96 */ "more_keys_for_symbols_semicolon",
205        /* 97 */ "more_keys_for_symbols_percent",
206        /* 98 */ "keylabel_for_tablet_comma",
207        /* 99 */ "keyhintlabel_for_tablet_comma",
208        /* 100 */ "more_keys_for_tablet_comma",
209        /* 101 */ "keyhintlabel_for_tablet_period",
210        /* 102 */ "more_keys_for_tablet_period",
211        /* 103 */ "keylabel_for_apostrophe",
212        /* 104 */ "keyhintlabel_for_apostrophe",
213        /* 105 */ "more_keys_for_apostrophe",
214        /* 106 */ "more_keys_for_am_pm",
215        /* 107 */ "settings_as_more_key",
216        /* 108 */ "shortcut_as_more_key",
217        /* 109 */ "action_next_as_more_key",
218        /* 110 */ "action_previous_as_more_key",
219        /* 111 */ "label_to_more_symbol_key",
220        /* 112 */ "label_to_more_symbol_for_tablet_key",
221        /* 113 */ "label_tab_key",
222        /* 114 */ "label_to_phone_numeric_key",
223        /* 115 */ "label_to_phone_symbols_key",
224        /* 116 */ "label_time_am",
225        /* 117 */ "label_time_pm",
226        /* 118 */ "label_to_symbol_key_pcqwerty",
227        /* 119 */ "keylabel_for_popular_domain",
228        /* 120 */ "more_keys_for_popular_domain",
229        /* 121 */ "more_keys_for_smiley",
230    };
231
232    private static final String EMPTY = "";
233
234    /* Default texts */
235    private static final String[] LANGUAGE_DEFAULT = {
236        /* 0~ */
237        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
238        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
239        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
240        EMPTY, EMPTY,
241        /* ~40 */
242        /* 41 */ "!fixedColumnOrder!4,\u2018,\u2019,\u201A,\u201B",
243        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
244        // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;</string>
245        /* 42 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB,\u00BB",
246        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
247        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
248        /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
249        // U+00A2: "¢" CENT SIGN
250        // U+00A3: "£" POUND SIGN
251        // U+20AC: "€" EURO SIGN
252        // U+00A5: "¥" YEN SIGN
253        // U+20B1: "₱" PESO SIGN
254        /* 44 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
255        /* 45 */ "\u00A2,\u00A3,$,\u00A5,\u20B1",
256        /* 46 */ "\u00A2,$,\u20AC,\u00A5,\u20B1",
257        /* 47 */ "\u00A2,$,\u20AC,\u00A3,\u00A5,\u20B1",
258        /* 48 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\\,,?,@,&,\\%,+,;,/,(,)",
259        // U+2020: "†" DAGGER
260        // U+2021: "‡" DOUBLE DAGGER
261        // U+2605: "★" BLACK STAR
262        /* 49 */ "\u2020,\u2021,\u2605",
263        // U+266A: "♪" EIGHTH NOTE
264        // U+2665: "♥" BLACK HEART SUIT
265        // U+2660: "♠" BLACK SPADE SUIT
266        // U+2666: "♦" BLACK DIAMOND SUIT
267        // U+2663: "♣" BLACK CLUB SUIT
268        /* 50 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
269        // U+00B1: "±" PLUS-MINUS SIGN
270        /* 51 */ "\u00B1",
271        // The all letters need to be mirrored are found at
272        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
273        /* 52 */ "!fixedColumnOrder!3,<,{,[",
274        /* 53 */ "!fixedColumnOrder!3,>,},]",
275        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
276        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
277        // U+2264: "≤" LESS-THAN OR EQUAL TO
278        // U+2265: "≥" GREATER-THAN EQUAL TO
279        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
280        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
281        // The following characters don't need BIDI mirroring.
282        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
283        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
284        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
285        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
286        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
287        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
288        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
289        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
290        /* 54 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
291        /* 55 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
292        /* 56 */ EMPTY,
293        /* 57 */ EMPTY,
294        /* 58 */ "1",
295        /* 59 */ "2",
296        /* 60 */ "3",
297        /* 61 */ "4",
298        /* 62 */ "5",
299        /* 63 */ "6",
300        /* 64 */ "7",
301        /* 65 */ "8",
302        /* 66 */ "9",
303        /* 67 */ "0",
304        /* 68~ */
305        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
306        /* ~77 */
307        // U+00B9: "¹" SUPERSCRIPT ONE
308        // U+00BD: "½" VULGAR FRACTION ONE HALF
309        // U+2153: "⅓" VULGAR FRACTION ONE THIRD
310        // U+00BC: "¼" VULGAR FRACTION ONE QUARTER
311        // U+215B: "⅛" VULGAR FRACTION ONE EIGHTH
312        /* 78 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
313        // U+00B2: "²" SUPERSCRIPT TWO
314        // U+2154: "⅔" VULGAR FRACTION TWO THIRDS
315        /* 79 */ "\u00B2,\u2154",
316        // U+00B3: "³" SUPERSCRIPT THREE
317        // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
318        // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
319        /* 80 */ "\u00B3,\u00BE,\u215C",
320        // U+2074: "⁴" SUPERSCRIPT FOUR
321        /* 81 */ "\u2074",
322        // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
323        /* 82 */ "\u215D",
324        /* 83 */ EMPTY,
325        // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
326        /* 84 */ "\u215E",
327        /* 85 */ EMPTY,
328        /* 86 */ EMPTY,
329        // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
330        // U+2205: "∅" EMPTY SET
331        /* 87 */ "\u207F,\u2205",
332        /* 88 */ ",",
333        /* 89 */ EMPTY,
334        /* 90 */ "!",
335        /* 91 */ "?",
336        /* 92 */ ";",
337        /* 93 */ "%",
338        // U+00A1: "¡" INVERTED EXCLAMATION MARK
339        /* 94 */ "\u00A1",
340        // U+00BF: "¿" INVERTED QUESTION MARK
341        /* 95 */ "\u00BF",
342        /* 96 */ EMPTY,
343        // U+2030: "‰" PER MILLE SIGN
344        /* 97 */ "\u2030",
345        /* 98 */ ",",
346        /* 99 */ "!",
347        /* 100 */ "!",
348        /* 101 */ "?",
349        /* 102 */ "?",
350        /* 103 */ "\'",
351        /* 104 */ "\"",
352        /* 105 */ "\"",
353        /* 106 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
354        /* 107 */ "!icon/settings_key|!code/key_settings",
355        /* 108 */ "!icon/shortcut_key|!code/key_shortcut",
356        /* 109 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
357        /* 110 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
358        // Label for "switch to more symbol" modifier key.  Must be short to fit on key!
359        /* 111 */ "= \\ <",
360        // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
361        /* 112 */ "~ \\ {",
362        // Label for "Tab" key.  Must be short to fit on key!
363        /* 113 */ "Tab",
364        // Label for "switch to phone numeric" key.  Must be short to fit on key!
365        /* 114 */ "123",
366        // Label for "switch to phone symbols" key.  Must be short to fit on key!
367        // U+FF0A: "*" FULLWIDTH ASTERISK
368        // U+FF03: "#" FULLWIDTH NUMBER SIGN
369        /* 115 */ "\uFF0A\uFF03",
370        // Key label for "ante meridiem"
371        /* 116 */ "AM",
372        // Key label for "post meridiem"
373        /* 117 */ "PM",
374        // Label for "switch to symbols" key on PC QWERTY layout
375        /* 118 */ "Sym",
376        /* 119 */ ".com",
377        // popular web domains for the locale - most popular, displayed on the keyboard
378        /* 120 */ "!hasLabels!,.net,.org,.gov,.edu",
379        /* 121 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ",
380    };
381
382    /* Language ar: Arabic */
383    private static final String[] LANGUAGE_ar = {
384        /* 0~ */
385        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
386        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
387        null, null, null, null, null, null, null, null, null, null, null, null,
388        /* ~41 */
389        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
390        // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
391        /* 42 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB",
392        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
393        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
394        /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
395        /* 44~ */
396        null, null, null, null,
397        /* ~47 */
398        // U+061F: "؟" ARABIC QUESTION MARK
399        // U+060C: "،" ARABIC COMMA
400        // U+061B: "؛" ARABIC SEMICOLON
401        /* 48 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
402        // U+2605: "★" BLACK STAR
403        // U+066D: "٭" ARABIC FIVE POINTED STAR
404        /* 49 */ "\u2605,\u066D",
405        // U+266A: "♪" EIGHTH NOTE
406        /* 50 */ "\u266A",
407        /* 51 */ null,
408        // The all letters need to be mirrored are found at
409        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
410        // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
411        // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
412        /* 52 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
413        /* 53 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
414        // U+2264: "≤" LESS-THAN OR EQUAL TO
415        // U+2265: "≥" GREATER-THAN EQUAL TO
416        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
417        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
418        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
419        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
420        // The following characters don't need BIDI mirroring.
421        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
422        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
423        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
424        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
425        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
426        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
427        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
428        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
429        /* 54 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
430        /* 55 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
431        // U+0655: "ٕ" ARABIC HAMZA BELOW
432        // U+0654: "ٔ" ARABIC HAMZA ABOVE
433        // U+0652: "ْ" ARABIC SUKUN
434        // U+064D: "ٍ" ARABIC KASRATAN
435        // U+064C: "ٌ" ARABIC DAMMATAN
436        // U+064B: "ً" ARABIC FATHATAN
437        // U+0651: "ّ" ARABIC SHADDA
438        // U+0656: "ٖ" ARABIC SUBSCRIPT ALEF
439        // U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF
440        // U+0653: "ٓ" ARABIC MADDAH ABOVE
441        // U+0650: "ِ" ARABIC KASRA
442        // U+064F: "ُ" ARABIC DAMMA
443        // U+064E: "َ" ARABIC FATHA
444        // U+0640: "ـ" ARABIC TATWEEL
445        // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
446        /* 56 */ "!fixedColumnOrder!7,\u0655,\u0654,\u0652,\u064D,\u064C,\u064B,\u0651,\u0656,\u0670,\u0653,\u0650,\u064F,\u064E,\u0640\u0640\u0640|\u0640",
447        /* 57 */ "\u0651",
448        // U+0661: "١" ARABIC-INDIC DIGIT ONE
449        /* 58 */ "\u0661",
450        // U+0662: "٢" ARABIC-INDIC DIGIT TWO
451        /* 59 */ "\u0662",
452        // U+0663: "٣" ARABIC-INDIC DIGIT THREE
453        /* 60 */ "\u0663",
454        // U+0664: "٤" ARABIC-INDIC DIGIT FOUR
455        /* 61 */ "\u0664",
456        // U+0665: "٥" ARABIC-INDIC DIGIT FIVE
457        /* 62 */ "\u0665",
458        // U+0666: "٦" ARABIC-INDIC DIGIT SIX
459        /* 63 */ "\u0666",
460        // U+0667: "٧" ARABIC-INDIC DIGIT SEVEN
461        /* 64 */ "\u0667",
462        // U+0668: "٨" ARABIC-INDIC DIGIT EIGHT
463        /* 65 */ "\u0668",
464        // U+0669: "٩" ARABIC-INDIC DIGIT NINE
465        /* 66 */ "\u0669",
466        // U+0660: "٠" ARABIC-INDIC DIGIT ZERO
467        /* 67 */ "\u0660",
468        /* 68 */ "1",
469        /* 69 */ "2",
470        /* 70 */ "3",
471        /* 71 */ "4",
472        /* 72 */ "5",
473        /* 73 */ "6",
474        /* 74 */ "7",
475        /* 75 */ "8",
476        /* 76 */ "9",
477        // U+066B: "٫" ARABIC DECIMAL SEPARATOR
478        // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
479        /* 77 */ "0,\u066B,\u066C",
480        /* 78~ */
481        null, null, null, null, null, null, null, null, null, null,
482        /* ~87 */
483        // U+060C: "،" ARABIC COMMA
484        /* 88 */ "\u060C",
485        /* 89 */ "\\,",
486        /* 90 */ null,
487        /* 91 */ "\u061F",
488        /* 92 */ "\u061B",
489        // U+066A: "٪" ARABIC PERCENT SIGN
490        /* 93 */ "\u066A",
491        /* 94 */ null,
492        /* 95 */ "?",
493        /* 96 */ ";",
494        // U+2030: "‰" PER MILLE SIGN
495        /* 97 */ "\\%,\u2030",
496        /* 98~ */
497        null, null, null, null, null,
498        /* ~102 */
499        // U+060C: "،" ARABIC COMMA
500        // U+061B: "؛" ARABIC SEMICOLON
501        // U+061F: "؟" ARABIC QUESTION MARK
502        /* 103 */ "\u060C",
503        /* 104 */ "\u061F",
504        /* 105 */ "\u061F,\u061B,!,:,-,/,\',\"",
505    };
506
507    /* Language be: Belarusian */
508    private static final String[] LANGUAGE_be = {
509        /* 0~ */
510        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
511        null, null, null, null, null, null, null, null, null, null,
512        /* ~24 */
513        // U+045E: "ў" CYRILLIC SMALL LETTER SHORT U
514        /* 25 */ "\u045E",
515        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
516        /* 26 */ "\u044B",
517        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
518        /* 27 */ "\u0456",
519        /* 28~ */
520        null, null, null,
521        /* ~30 */
522        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
523        /* 31 */ "\u044A",
524        /* 32 */ null,
525        /* 33 */ null,
526        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
527        /* 34 */ "\u044A",
528    };
529
530    /* Language ca: Catalan */
531    private static final String[] LANGUAGE_ca = {
532        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
533        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
534        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
535        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
536        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
537        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
538        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
539        // U+00E6: "æ" LATIN SMALL LETTER AE
540        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
541        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
542        /* 0 */ "\u00E0,\u00E1,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
543        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
544        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
545        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
546        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
547        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
548        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
549        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
550        /* 1 */ "\u00E8,\u00E9,\u00EB,\u00EA,\u0119,\u0117,\u0113",
551        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
552        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
553        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
554        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
555        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
556        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
557        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
558        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
559        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
560        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
561        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
562        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
563        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
564        // U+0153: "œ" LATIN SMALL LIGATURE OE
565        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
566        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
567        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
568        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
569        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
570        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
571        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
572        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
573        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
574        /* 5 */ null,
575        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
576        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
577        /* 6 */ "\u00F1,\u0144",
578        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
579        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
580        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
581        /* 7 */ "\u00E7,\u0107,\u010D",
582        /* 8~ */
583        null, null, null, null, null, null,
584        /* ~13 */
585        // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT
586        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
587        /* 14 */ "\u0140,\u0142",
588    };
589
590    /* Language cs: Czech */
591    private static final String[] LANGUAGE_cs = {
592        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
593        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
594        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
595        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
596        // U+00E6: "æ" LATIN SMALL LETTER AE
597        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
598        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
599        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
600        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
601        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
602        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
603        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
604        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
605        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
606        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
607        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
608        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
609        /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
610        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
611        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
612        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
613        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
614        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
615        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
616        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
617        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
618        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
619        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
620        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
621        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
622        // U+0153: "œ" LATIN SMALL LIGATURE OE
623        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
624        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
625        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
626        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
627        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
628        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
629        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
630        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
631        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
632        /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B",
633        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
634        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
635        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
636        /* 5 */ "\u0161,\u00DF,\u015B",
637        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
638        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
639        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
640        /* 6 */ "\u0148,\u00F1,\u0144",
641        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
642        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
643        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
644        /* 7 */ "\u010D,\u00E7,\u0107",
645        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
646        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
647        /* 8 */ "\u00FD,\u00FF",
648        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
649        /* 9 */ "\u010F",
650        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
651        /* 10 */ "\u0159",
652        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
653        /* 11 */ "\u0165",
654        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
655        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
656        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
657        /* 12 */ "\u017E,\u017A,\u017C",
658    };
659
660    /* Language da: Danish */
661    private static final String[] LANGUAGE_da = {
662        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
663        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
664        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
665        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
666        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
667        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
668        /* 0 */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101",
669        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
670        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
671        /* 1 */ "\u00E9,\u00EB",
672        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
673        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
674        /* 2 */ "\u00ED,\u00EF",
675        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
676        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
677        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
678        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
679        // U+0153: "œ" LATIN SMALL LIGATURE OE
680        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
681        /* 3 */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D",
682        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
683        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
684        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
685        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
686        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
687        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
688        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
689        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
690        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
691        /* 5 */ "\u00DF,\u015B,\u0161",
692        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
693        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
694        /* 6 */ "\u00F1,\u0144",
695        /* 7 */ null,
696        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
697        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
698        /* 8 */ "\u00FD,\u00FF",
699        // U+00F0: "ð" LATIN SMALL LETTER ETH
700        /* 9 */ "\u00F0",
701        /* 10~ */
702        null, null, null, null,
703        /* ~13 */
704        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
705        /* 14 */ "\u0142",
706        /* 15~ */
707        null, null, null, null, null,
708        /* ~19 */
709        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
710        /* 20 */ "\u00E5",
711        // U+00E6: "æ" LATIN SMALL LETTER AE
712        /* 21 */ "\u00E6",
713        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
714        /* 22 */ "\u00F8",
715        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
716        /* 23 */ "\u00E4",
717        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
718        /* 24 */ "\u00F6",
719    };
720
721    /* Language de: German */
722    private static final String[] LANGUAGE_de = {
723        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
724        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
725        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
726        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
727        // U+00E6: "æ" LATIN SMALL LETTER AE
728        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
729        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
730        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
731        /* 0 */ "\u00E4,\u00E2,\u00E0,\u00E1,\u00E6,\u00E3,\u00E5,\u0101",
732        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
733        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
734        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
735        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
736        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
737        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117",
738        /* 2 */ null,
739        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
740        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
741        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
742        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
743        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
744        // U+0153: "œ" LATIN SMALL LIGATURE OE
745        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
746        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
747        /* 3 */ "\u00F6,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u00F8,\u014D",
748        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
749        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
750        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
751        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
752        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
753        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
754        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
755        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
756        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
757        /* 5 */ "\u00DF,\u015B,\u0161",
758        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
759        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
760        /* 6 */ "\u00F1,\u0144",
761    };
762
763    /* Language en: English */
764    private static final String[] LANGUAGE_en = {
765        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
766        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
767        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
768        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
769        // U+00E6: "æ" LATIN SMALL LETTER AE
770        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
771        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
772        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
773        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
774        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
775        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
776        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
777        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
778        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
779        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113",
780        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
781        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
782        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
783        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
784        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
785        /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
786        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
787        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
788        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
789        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
790        // U+0153: "œ" LATIN SMALL LIGATURE OE
791        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
792        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
793        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
794        /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5",
795        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
796        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
797        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
798        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
799        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
800        /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B",
801        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
802        /* 5 */ "\u00DF",
803        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
804        /* 6 */ "\u00F1",
805        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
806        /* 7 */ "\u00E7",
807    };
808
809    /* Language es: Spanish */
810    private static final String[] LANGUAGE_es = {
811        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
812        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
813        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
814        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
815        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
816        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
817        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
818        // U+00E6: "æ" LATIN SMALL LETTER AE
819        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
820        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
821        /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA",
822        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
823        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
824        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
825        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
826        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
827        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
828        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
829        /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113",
830        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
831        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
832        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
833        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
834        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
835        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
836        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
837        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
838        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
839        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
840        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
841        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
842        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
843        // U+0153: "œ" LATIN SMALL LIGATURE OE
844        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
845        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
846        /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA",
847        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
848        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
849        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
850        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
851        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
852        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
853        /* 5 */ null,
854        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
855        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
856        /* 6 */ "\u00F1,\u0144",
857        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
858        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
859        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
860        /* 7 */ "\u00E7,\u0107,\u010D",
861        /* 8~ */
862        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
863        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
864        null, null, null, null, null, null, null, null, null, null,
865        /* ~47 */
866        // U+00A1: "¡" INVERTED EXCLAMATION MARK
867        // U+00BF: "¿" INVERTED QUESTION MARK
868        /* 48 */ "!fixedColumnOrder!9,\",\',#,-,\u00A1,!,\u00BF,\\,,?,@,&,\\%,+,;,:,/,(,)",
869        /* 49~ */
870        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
871        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
872        null, null, null, null, null, null, null, null, null, null, null,
873        /* ~89 */
874        // U+00A1: "¡" INVERTED EXCLAMATION MARK
875        /* 90 */ "\u00A1",
876        // U+00BF: "¿" INVERTED QUESTION MARK
877        /* 91 */ "\u00BF",
878        /* 92 */ null,
879        /* 93 */ null,
880        /* 94 */ "!",
881        /* 95 */ "?",
882        /* 96~ */
883        null, null, null,
884        /* ~98 */
885        /* 99 */ "\u00A1",
886        /* 100 */ "\u00A1,!",
887        /* 101 */ "\u00BF",
888        /* 102 */ "\u00BF,?",
889    };
890
891    /* Language et: Estonian */
892    private static final String[] LANGUAGE_et = {
893        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
894        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
895        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
896        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
897        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
898        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
899        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
900        // U+00E6: "æ" LATIN SMALL LETTER AE
901        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
902        /* 0 */ "\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
903        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
904        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
905        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
906        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
907        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
908        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
909        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
910        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
911        /* 1 */ "\u0113,\u00E8,\u0117,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
912        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
913        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
914        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
915        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
916        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
917        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
918        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
919        /* 2 */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131",
920        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
921        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
922        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
923        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
924        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
925        // U+0153: "œ" LATIN SMALL LIGATURE OE
926        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
927        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
928        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
929        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
930        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
931        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
932        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
933        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
934        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
935        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
936        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
937        /* 4 */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
938        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
939        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
940        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
941        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
942        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
943        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
944        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
945        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
946        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
947        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
948        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
949        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
950        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
951        /* 7 */ "\u010D,\u00E7,\u0107",
952        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
953        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
954        /* 8 */ "\u00FD,\u00FF",
955        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
956        /* 9 */ "\u010F",
957        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
958        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
959        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
960        /* 10 */ "\u0157,\u0159,\u0155",
961        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
962        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
963        /* 11 */ "\u0163,\u0165",
964        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
965        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
966        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
967        /* 12 */ "\u017E,\u017C,\u017A",
968        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
969        /* 13 */ "\u0137",
970        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
971        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
972        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
973        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
974        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
975        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
976        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
977        /* 15 */ "\u0123,\u011F",
978        /* 16~ */
979        null, null, null, null,
980        /* ~19 */
981        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
982        /* 20 */ "\u00FC",
983        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
984        /* 21 */ "\u00F6",
985        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
986        /* 22 */ "\u00E4",
987        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
988        /* 23 */ "\u00F5",
989    };
990
991    /* Language fa: Persian */
992    private static final String[] LANGUAGE_fa = {
993        /* 0~ */
994        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
995        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
996        null, null, null, null, null, null, null, null, null, null, null, null,
997        /* ~41 */
998        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
999        // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
1000        /* 42 */ "!fixedColumnOrder!4,\u201C,\u201D,\",\'",
1001        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
1002        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
1003        /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
1004        /* 44~ */
1005        null, null, null, null,
1006        /* ~47 */
1007        // U+061F: "؟" ARABIC QUESTION MARK
1008        // U+060C: "،" ARABIC COMMA
1009        // U+061B: "؛" ARABIC SEMICOLON
1010        /* 48 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
1011        // U+2605: "★" BLACK STAR
1012        // U+066D: "٭" ARABIC FIVE POINTED STAR
1013        /* 49 */ "\u2605,\u066D",
1014        // U+266A: "♪" EIGHTH NOTE
1015        /* 50 */ "\u266A",
1016        /* 51 */ null,
1017        // The all letters need to be mirrored are found at
1018        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
1019        // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
1020        // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
1021        /* 52 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
1022        /* 53 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
1023        // U+2264: "≤" LESS-THAN OR EQUAL TO
1024        // U+2265: "≥" GREATER-THAN EQUAL TO
1025        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
1026        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
1027        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
1028        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
1029        // The following characters don't need BIDI mirroring.
1030        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
1031        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
1032        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
1033        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
1034        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
1035        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
1036        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
1037        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
1038        /* 54 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
1039        /* 55 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
1040        // U+0655: "ٕ" ARABIC HAMZA BELOW
1041        // U+0652: "ْ" ARABIC SUKUN
1042        // U+0651: "ّ" ARABIC SHADDA
1043        // U+064C: "ٌ" ARABIC DAMMATAN
1044        // U+064D: "ٍ" ARABIC KASRATAN
1045        // U+064B: "ً" ARABIC FATHATAN
1046        // U+0654: "ٔ" ARABIC HAMZA ABOVE
1047        // U+0656: "ٖ" ARABIC SUBSCRIPT ALEF
1048        // U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF
1049        // U+0653: "ٓ" ARABIC MADDAH ABOVE
1050        // U+064F: "ُ" ARABIC DAMMA
1051        // U+0650: "ِ" ARABIC KASRA
1052        // U+064E: "َ" ARABIC FATHA
1053        // U+0640: "ـ" ARABIC TATWEEL
1054        // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
1055        /* 56 */ "!fixedColumnOrder!7,\u0655,\u0652,\u0651,\u064C,\u064D,\u064B,\u0654,\u0656,\u0670,\u0653,\u064F,\u0650,\u064E,\u0640\u0640\u0640|\u0640",
1056        /* 57 */ "\u064B",
1057        // U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE
1058        /* 58 */ "\u06F1",
1059        // U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO
1060        /* 59 */ "\u06F2",
1061        // U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE
1062        /* 60 */ "\u06F3",
1063        // U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR
1064        /* 61 */ "\u06F4",
1065        // U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE
1066        /* 62 */ "\u06F5",
1067        // U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX
1068        /* 63 */ "\u06F6",
1069        // U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN
1070        /* 64 */ "\u06F7",
1071        // U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT
1072        /* 65 */ "\u06F8",
1073        // U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE
1074        /* 66 */ "\u06F9",
1075        // U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO
1076        /* 67 */ "\u06F0",
1077        /* 68 */ "1",
1078        /* 69 */ "2",
1079        /* 70 */ "3",
1080        /* 71 */ "4",
1081        /* 72 */ "5",
1082        /* 73 */ "6",
1083        /* 74 */ "7",
1084        /* 75 */ "8",
1085        /* 76 */ "9",
1086        // U+066B: "٫" ARABIC DECIMAL SEPARATOR
1087        // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
1088        /* 77 */ "0,\u066B,\u066C",
1089        /* 78~ */
1090        null, null, null, null, null, null, null, null, null, null,
1091        /* ~87 */
1092        // U+060C: "،" ARABIC COMMA
1093        /* 88 */ "\u060C",
1094        /* 89 */ "\\,",
1095        /* 90 */ null,
1096        /* 91 */ "\u061F",
1097        /* 92 */ "\u061B",
1098        // U+066A: "٪" ARABIC PERCENT SIGN
1099        /* 93 */ "\u066A",
1100        /* 94 */ null,
1101        /* 95 */ "?",
1102        /* 96 */ ";",
1103        // U+2030: "‰" PER MILLE SIGN
1104        /* 97 */ "\\%,\u2030",
1105        // U+060C: "،" ARABIC COMMA
1106        // U+061B: "؛" ARABIC SEMICOLON
1107        // U+061F: "؟" ARABIC QUESTION MARK
1108        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
1109        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
1110        /* 98 */ "\u060C",
1111        /* 99 */ "!",
1112        /* 100 */ "!,\\,",
1113        /* 101 */ "\u061F",
1114        /* 102 */ "\u061F,?",
1115        /* 103 */ "\u060C",
1116        /* 104 */ "\u061F",
1117        /* 105 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
1118    };
1119
1120    /* Language fi: Finnish */
1121    private static final String[] LANGUAGE_fi = {
1122        // U+00E6: "æ" LATIN SMALL LETTER AE
1123        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1124        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1125        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1126        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1127        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
1128        /* 0 */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
1129        /* 1 */ null,
1130        /* 2 */ null,
1131        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1132        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1133        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1134        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1135        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1136        // U+0153: "œ" LATIN SMALL LIGATURE OE
1137        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
1138        /* 3 */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
1139        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
1140        /* 4 */ "\u00FC",
1141        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
1142        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
1143        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
1144        /* 5 */ "\u0161,\u00DF,\u015B",
1145        /* 6~ */
1146        null, null, null, null, null, null,
1147        /* ~11 */
1148        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
1149        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
1150        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
1151        /* 12 */ "\u017E,\u017A,\u017C",
1152        /* 13~ */
1153        null, null, null, null, null, null, null,
1154        /* ~19 */
1155        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1156        /* 20 */ "\u00E5",
1157        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1158        /* 21 */ "\u00F6",
1159        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1160        /* 22 */ "\u00E4",
1161        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1162        /* 23 */ "\u00F8",
1163        // U+00E6: "æ" LATIN SMALL LETTER AE
1164        /* 24 */ "\u00E6",
1165    };
1166
1167    /* Language fr: French */
1168    private static final String[] LANGUAGE_fr = {
1169        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1170        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1171        // U+00E6: "æ" LATIN SMALL LETTER AE
1172        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1173        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1174        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1175        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1176        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
1177        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
1178        /* 0 */ "\u00E0,\u00E2,%,\u00E6,\u00E1,\u00E4,\u00E3,\u00E5,\u0101,\u00AA",
1179        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
1180        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
1181        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
1182        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
1183        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
1184        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
1185        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
1186        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,%,\u0119,\u0117,\u0113",
1187        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
1188        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
1189        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
1190        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
1191        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
1192        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
1193        /* 2 */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
1194        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1195        // U+0153: "œ" LATIN SMALL LIGATURE OE
1196        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1197        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1198        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1199        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1200        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1201        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
1202        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
1203        /* 3 */ "\u00F4,\u0153,%,\u00F6,\u00F2,\u00F3,\u00F5,\u00F8,\u014D,\u00BA",
1204        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
1205        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
1206        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
1207        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
1208        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
1209        /* 4 */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B",
1210        /* 5 */ null,
1211        /* 6 */ null,
1212        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
1213        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
1214        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
1215        /* 7 */ "\u00E7,\u0107,\u010D",
1216        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
1217        /* 8 */ "%,\u00FF",
1218    };
1219
1220    /* Language hi: Hindi */
1221    private static final String[] LANGUAGE_hi = {
1222        /* 0~ */
1223        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
1224        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
1225        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
1226        null, null, null, null, null, null, null, null, null, null, null, null, null,
1227        /* ~57 */
1228        // U+0967: "१" DEVANAGARI DIGIT ONE
1229        /* 58 */ "\u0967",
1230        // U+0968: "२" DEVANAGARI DIGIT TWO
1231        /* 59 */ "\u0968",
1232        // U+0969: "३" DEVANAGARI DIGIT THREE
1233        /* 60 */ "\u0969",
1234        // U+096A: "४" DEVANAGARI DIGIT FOUR
1235        /* 61 */ "\u096A",
1236        // U+096B: "५" DEVANAGARI DIGIT FIVE
1237        /* 62 */ "\u096B",
1238        // U+096C: "६" DEVANAGARI DIGIT SIX
1239        /* 63 */ "\u096C",
1240        // U+096D: "७" DEVANAGARI DIGIT SEVEN
1241        /* 64 */ "\u096D",
1242        // U+096E: "८" DEVANAGARI DIGIT EIGHT
1243        /* 65 */ "\u096E",
1244        // U+096F: "९" DEVANAGARI DIGIT NINE
1245        /* 66 */ "\u096F",
1246        // U+0966: "०" DEVANAGARI DIGIT ZERO
1247        /* 67 */ "\u0966",
1248        /* 68 */ "1",
1249        /* 69 */ "2",
1250        /* 70 */ "3",
1251        /* 71 */ "4",
1252        /* 72 */ "5",
1253        /* 73 */ "6",
1254        /* 74 */ "7",
1255        /* 75 */ "8",
1256        /* 76 */ "9",
1257        /* 77 */ "0",
1258    };
1259
1260    /* Language hr: Croatian */
1261    private static final String[] LANGUAGE_hr = {
1262        /* 0~ */
1263        null, null, null, null, null,
1264        /* ~4 */
1265        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
1266        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
1267        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
1268        /* 5 */ "\u0161,\u015B,\u00DF",
1269        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
1270        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
1271        /* 6 */ "\u00F1,\u0144",
1272        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
1273        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
1274        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
1275        /* 7 */ "\u010D,\u0107,\u00E7",
1276        /* 8 */ null,
1277        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
1278        /* 9 */ "\u0111",
1279        /* 10 */ null,
1280        /* 11 */ null,
1281        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
1282        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
1283        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
1284        /* 12 */ "\u017E,\u017A,\u017C",
1285    };
1286
1287    /* Language hu: Hungarian */
1288    private static final String[] LANGUAGE_hu = {
1289        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1290        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1291        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1292        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1293        // U+00E6: "æ" LATIN SMALL LETTER AE
1294        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1295        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1296        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
1297        /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
1298        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
1299        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
1300        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
1301        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
1302        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
1303        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
1304        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
1305        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
1306        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
1307        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
1308        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
1309        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
1310        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
1311        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
1312        /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
1313        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1314        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1315        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
1316        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1317        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1318        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1319        // U+0153: "œ" LATIN SMALL LIGATURE OE
1320        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1321        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
1322        /* 3 */ "\u00F3,\u00F6,\u0151,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
1323        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
1324        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
1325        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
1326        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
1327        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
1328        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
1329        /* 4 */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B",
1330    };
1331
1332    /* Language is: Icelandic */
1333    private static final String[] LANGUAGE_is = {
1334        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1335        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1336        // U+00E6: "æ" LATIN SMALL LETTER AE
1337        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1338        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1339        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1340        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1341        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
1342        /* 0 */ "\u00E1,\u00E4,\u00E6,\u00E5,\u00E0,\u00E2,\u00E3,\u0101",
1343        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
1344        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
1345        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
1346        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
1347        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
1348        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
1349        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
1350        /* 1 */ "\u00E9,\u00EB,\u00E8,\u00EA,\u0119,\u0117,\u0113",
1351        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
1352        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
1353        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
1354        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
1355        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
1356        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
1357        /* 2 */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
1358        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1359        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1360        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1361        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1362        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1363        // U+0153: "œ" LATIN SMALL LIGATURE OE
1364        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1365        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
1366        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
1367        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
1368        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
1369        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
1370        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
1371        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
1372        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
1373        /* 5~ */
1374        null, null, null,
1375        /* ~7 */
1376        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
1377        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
1378        /* 8 */ "\u00FD,\u00FF",
1379        // U+00F0: "ð" LATIN SMALL LETTER ETH
1380        /* 9 */ "\u00F0",
1381        /* 10 */ null,
1382        // U+00FE: "þ" LATIN SMALL LETTER THORN
1383        /* 11 */ "\u00FE",
1384        /* 12~ */
1385        null, null, null, null, null, null, null, null,
1386        /* ~19 */
1387        // U+00F0: "ð" LATIN SMALL LETTER ETH
1388        /* 20 */ "\u00F0",
1389        // U+00E6: "æ" LATIN SMALL LETTER AE
1390        /* 21 */ "\u00E6",
1391        // U+00FE: "þ" LATIN SMALL LETTER THORN
1392        /* 22 */ "\u00FE",
1393    };
1394
1395    /* Language it: Italian */
1396    private static final String[] LANGUAGE_it = {
1397        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1398        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1399        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1400        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1401        // U+00E6: "æ" LATIN SMALL LETTER AE
1402        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1403        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1404        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
1405        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
1406        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u00AA",
1407        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
1408        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
1409        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
1410        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
1411        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
1412        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
1413        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
1414        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u0117,\u0113",
1415        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
1416        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
1417        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
1418        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
1419        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
1420        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
1421        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B",
1422        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1423        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1424        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1425        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1426        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1427        // U+0153: "œ" LATIN SMALL LIGATURE OE
1428        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1429        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
1430        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
1431        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F6,\u00F5,\u0153,\u00F8,\u014D,\u00BA",
1432        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
1433        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
1434        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
1435        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
1436        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
1437        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B",
1438    };
1439
1440    /* Language iw: Hebrew */
1441    private static final String[] LANGUAGE_iw = {
1442        /* 0~ */
1443        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
1444        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
1445        null, null, null, null, null, null, null, null, null, null, null, null,
1446        /* ~41 */
1447        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
1448        // <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
1449        /* 42 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB",
1450        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
1451        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
1452        /* 43 */ "!fixedColumnOrder!4,\u201C,\u201D,\u00AB|\u00BB,\u00BB|\u00AB,\u2018,\u2019,\u201A,\u201B",
1453        /* 44~ */
1454        null, null, null, null, null,
1455        /* ~48 */
1456        // U+2605: "★" BLACK STAR
1457        /* 49 */ "\u2605",
1458        /* 50 */ null,
1459        // U+00B1: "±" PLUS-MINUS SIGN
1460        // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
1461        /* 51 */ "\u00B1,\uFB29",
1462        // The all letters need to be mirrored are found at
1463        // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
1464        /* 52 */ "!fixedColumnOrder!3,<|>,{|},[|]",
1465        /* 53 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
1466        // U+2264: "≤" LESS-THAN OR EQUAL TO
1467        // U+2265: "≥" GREATER-THAN EQUAL TO
1468        // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
1469        // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
1470        // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
1471        // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
1472        // The following characters don't need BIDI mirroring.
1473        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
1474        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
1475        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
1476        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
1477        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
1478        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
1479        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
1480        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
1481        /* 54 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
1482        /* 55 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
1483    };
1484
1485    /* Language ky: Kirghiz */
1486    private static final String[] LANGUAGE_ky = {
1487        /* 0~ */
1488        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
1489        null, null, null, null, null, null, null, null, null, null,
1490        /* ~24 */
1491        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
1492        /* 25 */ "\u0449",
1493        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
1494        /* 26 */ "\u044B",
1495        // U+0438: "и" CYRILLIC SMALL LETTER I
1496        /* 27 */ "\u0438",
1497        // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
1498        /* 28 */ "\u04AF",
1499        /* 29 */ null,
1500        // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER
1501        /* 30 */ "\u04A3",
1502        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
1503        /* 31 */ "\u044A",
1504        /* 32 */ null,
1505        // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
1506        /* 33 */ "\u04E9",
1507        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
1508        /* 34 */ "\u044A",
1509    };
1510
1511    /* Language lt: Lithuanian */
1512    private static final String[] LANGUAGE_lt = {
1513        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
1514        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1515        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
1516        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1517        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1518        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1519        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1520        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1521        // U+00E6: "æ" LATIN SMALL LETTER AE
1522        /* 0 */ "\u0105,\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6",
1523        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
1524        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
1525        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
1526        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
1527        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
1528        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
1529        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
1530        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
1531        /* 1 */ "\u0117,\u0119,\u0113,\u00E8,\u00E9,\u00EA,\u00EB,\u011B",
1532        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
1533        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
1534        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
1535        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
1536        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
1537        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
1538        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
1539        /* 2 */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
1540        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1541        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1542        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1543        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1544        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1545        // U+0153: "œ" LATIN SMALL LIGATURE OE
1546        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
1547        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1548        /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8",
1549        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
1550        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
1551        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
1552        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
1553        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
1554        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
1555        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
1556        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
1557        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
1558        /* 4 */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171",
1559        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
1560        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
1561        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
1562        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
1563        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
1564        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
1565        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
1566        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
1567        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
1568        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
1569        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
1570        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
1571        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
1572        /* 7 */ "\u010D,\u00E7,\u0107",
1573        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
1574        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
1575        /* 8 */ "\u00FD,\u00FF",
1576        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
1577        /* 9 */ "\u010F",
1578        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
1579        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
1580        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
1581        /* 10 */ "\u0157,\u0159,\u0155",
1582        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
1583        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
1584        /* 11 */ "\u0163,\u0165",
1585        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
1586        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
1587        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
1588        /* 12 */ "\u017E,\u017C,\u017A",
1589        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
1590        /* 13 */ "\u0137",
1591        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
1592        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
1593        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
1594        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
1595        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
1596        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
1597        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
1598        /* 15 */ "\u0123,\u011F",
1599    };
1600
1601    /* Language lv: Latvian */
1602    private static final String[] LANGUAGE_lv = {
1603        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
1604        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1605        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1606        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1607        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1608        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1609        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1610        // U+00E6: "æ" LATIN SMALL LETTER AE
1611        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
1612        /* 0 */ "\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0105",
1613        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
1614        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
1615        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
1616        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
1617        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
1618        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
1619        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
1620        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
1621        /* 1 */ "\u0113,\u0117,\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u011B",
1622        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
1623        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
1624        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
1625        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
1626        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
1627        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
1628        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
1629        /* 2 */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
1630        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1631        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1632        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1633        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1634        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1635        // U+0153: "œ" LATIN SMALL LIGATURE OE
1636        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
1637        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1638        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u0153,\u0151,\u00F8",
1639        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
1640        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
1641        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
1642        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
1643        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
1644        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
1645        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
1646        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
1647        /* 4 */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171",
1648        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
1649        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
1650        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
1651        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
1652        /* 5 */ "\u0161,\u00DF,\u015B,\u015F",
1653        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
1654        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
1655        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
1656        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
1657        /* 6 */ "\u0146,\u00F1,\u0144,\u0144",
1658        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
1659        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
1660        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
1661        /* 7 */ "\u010D,\u00E7,\u0107",
1662        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
1663        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
1664        /* 8 */ "\u00FD,\u00FF",
1665        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
1666        /* 9 */ "\u010F",
1667        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
1668        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
1669        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
1670        /* 10 */ "\u0157,\u0159,\u0155",
1671        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
1672        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
1673        /* 11 */ "\u0163,\u0165",
1674        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
1675        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
1676        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
1677        /* 12 */ "\u017E,\u017C,\u017A",
1678        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
1679        /* 13 */ "\u0137",
1680        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
1681        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
1682        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
1683        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
1684        /* 14 */ "\u013C,\u0142,\u013A,\u013E",
1685        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
1686        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
1687        /* 15 */ "\u0123,\u011F",
1688    };
1689
1690    /* Language mk: Macedonian */
1691    private static final String[] LANGUAGE_mk = {
1692        /* 0~ */
1693        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
1694        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
1695        null, null, null, null, null,
1696        /* ~34 */
1697        // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
1698        /* 35 */ "\u0455",
1699        // U+045C: "ќ" CYRILLIC SMALL LETTER KJE
1700        /* 36 */ "\u045C",
1701        // U+0437: "з" CYRILLIC SMALL LETTER ZE
1702        /* 37 */ "\u0437",
1703        // U+0453: "ѓ" CYRILLIC SMALL LETTER GJE
1704        /* 38 */ "\u0453",
1705        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
1706        /* 39 */ "\u0450",
1707        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
1708        /* 40 */ "\u045D",
1709        /* 41 */ null,
1710        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
1711        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
1712        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
1713        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
1714        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
1715        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
1716        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
1717        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
1718        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
1719        // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201E;,&#x201C;,&#x201D;,&#x201F;,&#x00AB;,&#x00BB;</string>
1720        /* 42 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB",
1721        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
1722        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
1723        /* 43 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
1724    };
1725
1726    /* Language nb: Norwegian Bokmål */
1727    private static final String[] LANGUAGE_nb = {
1728        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1729        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1730        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1731        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1732        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1733        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
1734        /* 0 */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101",
1735        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
1736        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
1737        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
1738        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
1739        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
1740        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
1741        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
1742        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
1743        /* 2 */ null,
1744        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1745        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1746        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1747        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1748        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1749        // U+0153: "œ" LATIN SMALL LIGATURE OE
1750        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
1751        /* 3 */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D",
1752        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
1753        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
1754        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
1755        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
1756        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
1757        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
1758        /* 5~ */
1759        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
1760        /* ~19 */
1761        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1762        /* 20 */ "\u00E5",
1763        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1764        /* 21 */ "\u00F8",
1765        // U+00E6: "æ" LATIN SMALL LETTER AE
1766        /* 22 */ "\u00E6",
1767        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1768        /* 23 */ "\u00F6",
1769        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1770        /* 24 */ "\u00E4",
1771    };
1772
1773    /* Language nl: Dutch */
1774    private static final String[] LANGUAGE_nl = {
1775        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1776        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1777        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1778        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1779        // U+00E6: "æ" LATIN SMALL LETTER AE
1780        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1781        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1782        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
1783        /* 0 */ "\u00E1,\u00E4,\u00E2,\u00E0,\u00E6,\u00E3,\u00E5,\u0101",
1784        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
1785        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
1786        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
1787        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
1788        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
1789        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
1790        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
1791        /* 1 */ "\u00E9,\u00EB,\u00EA,\u00E8,\u0119,\u0117,\u0113",
1792        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
1793        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
1794        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
1795        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
1796        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
1797        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
1798        // U+0133: "ij" LATIN SMALL LIGATURE IJ
1799        /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
1800        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1801        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1802        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1803        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1804        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1805        // U+0153: "œ" LATIN SMALL LIGATURE OE
1806        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1807        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
1808        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
1809        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
1810        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
1811        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
1812        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
1813        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
1814        /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B",
1815        /* 5 */ null,
1816        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
1817        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
1818        /* 6 */ "\u00F1,\u0144",
1819        /* 7 */ null,
1820        // U+0133: "ij" LATIN SMALL LIGATURE IJ
1821        /* 8 */ "\u0133",
1822    };
1823
1824    /* Language pl: Polish */
1825    private static final String[] LANGUAGE_pl = {
1826        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
1827        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1828        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1829        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1830        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1831        // U+00E6: "æ" LATIN SMALL LETTER AE
1832        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1833        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1834        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
1835        /* 0 */ "\u0105,\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101",
1836        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
1837        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
1838        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
1839        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
1840        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
1841        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
1842        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
1843        /* 1 */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113",
1844        /* 2 */ null,
1845        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1846        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1847        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1848        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1849        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1850        // U+0153: "œ" LATIN SMALL LIGATURE OE
1851        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1852        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
1853        /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D",
1854        /* 4 */ null,
1855        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
1856        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
1857        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
1858        /* 5 */ "\u015B,\u00DF,\u0161",
1859        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
1860        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
1861        /* 6 */ "\u0144,\u00F1",
1862        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
1863        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
1864        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
1865        /* 7 */ "\u0107,\u00E7,\u010D",
1866        /* 8~ */
1867        null, null, null, null,
1868        /* ~11 */
1869        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
1870        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
1871        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
1872        /* 12 */ "\u017C,\u017A,\u017E",
1873        /* 13 */ null,
1874        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
1875        /* 14 */ "\u0142",
1876    };
1877
1878    /* Language pt: Portuguese */
1879    private static final String[] LANGUAGE_pt = {
1880        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1881        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1882        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1883        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1884        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1885        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1886        // U+00E6: "æ" LATIN SMALL LETTER AE
1887        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
1888        /* 0 */ "\u00E1,\u00E3,\u00E0,\u00E2,\u00E4,\u00E5,\u00E6,\u00AA",
1889        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
1890        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
1891        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
1892        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
1893        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
1894        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
1895        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
1896        /* 1 */ "\u00E9,\u00EA,\u00E8,\u0119,\u0117,\u0113,\u00EB",
1897        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
1898        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
1899        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
1900        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
1901        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
1902        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
1903        /* 2 */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B",
1904        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1905        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1906        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1907        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1908        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1909        // U+0153: "œ" LATIN SMALL LIGATURE OE
1910        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1911        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
1912        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
1913        /* 3 */ "\u00F3,\u00F5,\u00F4,\u00F2,\u00F6,\u0153,\u00F8,\u014D,\u00BA",
1914        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
1915        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
1916        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
1917        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
1918        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
1919        /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B",
1920        /* 5 */ null,
1921        /* 6 */ null,
1922        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
1923        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
1924        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
1925        /* 7 */ "\u00E7,\u010D,\u0107",
1926    };
1927
1928    /* Language rm: Raeto-Romance */
1929    private static final String[] LANGUAGE_rm = {
1930        /* 0~ */
1931        null, null, null,
1932        /* ~2 */
1933        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
1934        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
1935        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
1936        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
1937        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
1938        // U+0153: "œ" LATIN SMALL LIGATURE OE
1939        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
1940        /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u0153,\u00F8",
1941    };
1942
1943    /* Language ro: Romanian */
1944    private static final String[] LANGUAGE_ro = {
1945        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
1946        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
1947        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
1948        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
1949        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
1950        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
1951        // U+00E6: "æ" LATIN SMALL LETTER AE
1952        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
1953        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
1954        /* 0 */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101",
1955        /* 1 */ null,
1956        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
1957        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
1958        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
1959        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
1960        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
1961        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
1962        /* 2 */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
1963        /* 3 */ null,
1964        /* 4 */ null,
1965        // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW
1966        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
1967        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
1968        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
1969        /* 5 */ "\u0219,\u00DF,\u015B,\u0161",
1970        /* 6~ */
1971        null, null, null, null, null,
1972        /* ~10 */
1973        // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW
1974        /* 11 */ "\u021B",
1975    };
1976
1977    /* Language ru: Russian */
1978    private static final String[] LANGUAGE_ru = {
1979        /* 0~ */
1980        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
1981        null, null, null, null, null, null, null, null, null, null,
1982        /* ~24 */
1983        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
1984        /* 25 */ "\u0449",
1985        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
1986        /* 26 */ "\u044B",
1987        // U+0438: "и" CYRILLIC SMALL LETTER I
1988        /* 27 */ "\u0438",
1989        /* 28 */ null,
1990        // U+0451: "ё" CYRILLIC SMALL LETTER IO
1991        /* 29 */ "\u0451",
1992        /* 30 */ null,
1993        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
1994        /* 31 */ "\u044A",
1995        /* 32 */ null,
1996        /* 33 */ null,
1997        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
1998        /* 34 */ "\u044A",
1999    };
2000
2001    /* Language sk: Slovak */
2002    private static final String[] LANGUAGE_sk = {
2003        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
2004        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
2005        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
2006        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
2007        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
2008        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
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 */ "\u00E1,\u00E4,\u0101,\u00E0,\u00E2,\u00E3,\u00E5,\u00E6,\u0105",
2013        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
2014        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
2015        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
2016        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
2017        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
2018        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
2019        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
2020        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
2021        /* 1 */ "\u00E9,\u011B,\u0113,\u0117,\u00E8,\u00EA,\u00EB,\u0119",
2022        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
2023        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
2024        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
2025        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
2026        // U+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 */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131",
2030        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
2031        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
2032        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
2033        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
2034        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
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 */ "\u00F4,\u00F3,\u00F6,\u00F2,\u00F5,\u0153,\u0151,\u00F8",
2039        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
2040        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
2041        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
2042        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
2043        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
2044        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
2045        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
2046        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
2047        /* 4 */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\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+0148: "ň" LATIN SMALL LETTER N WITH CARON
2054        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
2055        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
2056        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
2057        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
2058        /* 6 */ "\u0148,\u0146,\u00F1,\u0144,\u0144",
2059        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
2060        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
2061        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
2062        /* 7 */ "\u010D,\u00E7,\u0107",
2063        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
2064        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
2065        /* 8 */ "\u00FD,\u00FF",
2066        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
2067        /* 9 */ "\u010F",
2068        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
2069        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
2070        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
2071        /* 10 */ "\u0155,\u0159,\u0157",
2072        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
2073        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
2074        /* 11 */ "\u0165,\u0163",
2075        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
2076        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
2077        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
2078        /* 12 */ "\u017E,\u017C,\u017A",
2079        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
2080        /* 13 */ "\u0137",
2081        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
2082        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
2083        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
2084        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
2085        /* 14 */ "\u013E,\u013A,\u013C,\u0142",
2086        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
2087        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
2088        /* 15 */ "\u0123,\u011F",
2089    };
2090
2091    /* Language sl: Slovenian */
2092    private static final String[] LANGUAGE_sl = {
2093        /* 0~ */
2094        null, null, null, null, null,
2095        /* ~4 */
2096        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
2097        /* 5 */ "\u0161",
2098        /* 6 */ null,
2099        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
2100        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
2101        /* 7 */ "\u010D,\u0107",
2102        /* 8 */ null,
2103        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
2104        /* 9 */ "\u0111",
2105        /* 10 */ null,
2106        /* 11 */ null,
2107        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
2108        /* 12 */ "\u017E",
2109    };
2110
2111    /* Language sr: Serbian */
2112    private static final String[] LANGUAGE_sr = {
2113        /* 0~ */
2114        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
2115        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
2116        null, null, null, null, null,
2117        /* ~34 */
2118        // U+0437: "з" CYRILLIC SMALL LETTER ZE
2119        /* 35 */ "\u0437",
2120        // U+045B: "ћ" CYRILLIC SMALL LETTER TSHE
2121        /* 36 */ "\u045B",
2122        // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
2123        /* 37 */ "\u0455",
2124        // U+0452: "ђ" CYRILLIC SMALL LETTER DJE
2125        /* 38 */ "\u0452",
2126        // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
2127        /* 39 */ "\u0450",
2128        // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
2129        /* 40 */ "\u045D",
2130        /* 41 */ null,
2131        // U+2018: "‘" LEFT SINGLE QUOTATION MARK
2132        // U+2019: "’" RIGHT SINGLE QUOTATION MARK
2133        // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
2134        // U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
2135        // U+201C: "“" LEFT DOUBLE QUOTATION MARK
2136        // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
2137        // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
2138        // U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK
2139        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
2140        // <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201E;,&#x201C;,&#x201D;,&#x201F;,&#x00AB;,&#x00BB;</string>
2141        /* 42 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB",
2142        // TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK.
2143        // <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
2144        /* 43 */ "!fixedColumnOrder!5,\u201E,\u201C,\u201D,\u00AB,\u00BB,\u2018,\u2019,\u201A,\u201B",
2145    };
2146
2147    /* Language sv: Swedish */
2148    private static final String[] LANGUAGE_sv = {
2149        /* 0 */ null,
2150        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
2151        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
2152        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
2153        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
2154        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
2155        /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119",
2156        /* 2 */ null,
2157        // U+0153: "œ" LATIN SMALL LIGATURE OE
2158        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
2159        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
2160        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
2161        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
2162        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
2163        /* 3 */ "\u0153,\u00F4,\u00F2,\u00F3,\u00F5,\u014D",
2164        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
2165        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
2166        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
2167        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
2168        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
2169        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
2170        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
2171        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
2172        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
2173        /* 5 */ "\u00DF,\u015B,\u0161",
2174        /* 6~ */
2175        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
2176        /* ~19 */
2177        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
2178        /* 20 */ "\u00E5",
2179        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
2180        /* 21 */ "\u00F6",
2181        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
2182        /* 22 */ "\u00E4",
2183        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
2184        /* 23 */ "\u00F8",
2185        // U+00E6: "æ" LATIN SMALL LETTER AE
2186        /* 24 */ "\u00E6",
2187    };
2188
2189    /* Language tr: Turkish */
2190    private static final String[] LANGUAGE_tr = {
2191        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
2192        /* 0 */ "\u00E2",
2193        /* 1 */ null,
2194        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
2195        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
2196        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
2197        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
2198        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
2199        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
2200        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
2201        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
2202        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
2203        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
2204        // U+0153: "œ" LATIN SMALL LIGATURE OE
2205        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
2206        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
2207        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
2208        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
2209        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
2210        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
2211        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
2212        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
2213        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
2214        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
2215        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
2216        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
2217        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
2218        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
2219        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
2220        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
2221        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
2222        /* 6 */ null,
2223        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
2224        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
2225        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
2226        /* 7 */ "\u00E7,\u0107,\u010D",
2227        /* 8~ */
2228        null, null, null, null, null, null, null,
2229        /* ~14 */
2230        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
2231        /* 15 */ "\u011F",
2232    };
2233
2234    /* Language uk: Ukrainian */
2235    private static final String[] LANGUAGE_uk = {
2236        /* 0~ */
2237        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
2238        null, null, null, null, null, null, null, null, null, null,
2239        /* ~24 */
2240        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
2241        /* 25 */ "\u0449",
2242        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
2243        /* 26 */ "\u0456",
2244        // U+0438: "и" CYRILLIC SMALL LETTER I
2245        /* 27 */ "\u0438",
2246        /* 28~ */
2247        null, null, null,
2248        /* ~30 */
2249        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
2250        /* 31 */ "\u044A",
2251        // U+0457: "ї" CYRILLIC SMALL LETTER YI
2252        /* 32 */ "\u0457",
2253        /* 33 */ null,
2254        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
2255        /* 34 */ "\u044A",
2256    };
2257
2258    /* Language vi: Vietnamese */
2259    private static final String[] LANGUAGE_vi = {
2260        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
2261        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
2262        // U+1EA3: "ả" LATIN SMALL LETTER A WITH HOOK ABOVE
2263        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
2264        // U+1EA1: "ạ" LATIN SMALL LETTER A WITH DOT BELOW
2265        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
2266        // U+1EB1: "ằ" LATIN SMALL LETTER A WITH BREVE AND GRAVE
2267        // U+1EAF: "ắ" LATIN SMALL LETTER A WITH BREVE AND ACUTE
2268        // U+1EB3: "ẳ" LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
2269        // U+1EB5: "ẵ" LATIN SMALL LETTER A WITH BREVE AND TILDE
2270        // U+1EB7: "ặ" LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
2271        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
2272        // U+1EA7: "ầ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
2273        // U+1EA5: "ấ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
2274        // U+1EA9: "ẩ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
2275        // U+1EAB: "ẫ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
2276        // U+1EAD: "ậ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
2277        /* 0 */ "\u00E0,\u00E1,\u1EA3,\u00E3,\u1EA1,\u0103,\u1EB1,\u1EAF,\u1EB3,\u1EB5,\u1EB7,\u00E2,\u1EA7,\u1EA5,\u1EA9,\u1EAB,\u1EAD",
2278        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
2279        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
2280        // U+1EBB: "ẻ" LATIN SMALL LETTER E WITH HOOK ABOVE
2281        // U+1EBD: "ẽ" LATIN SMALL LETTER E WITH TILDE
2282        // U+1EB9: "ẹ" LATIN SMALL LETTER E WITH DOT BELOW
2283        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
2284        // U+1EC1: "ề" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
2285        // U+1EBF: "ế" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
2286        // U+1EC3: "ể" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
2287        // U+1EC5: "ễ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
2288        // U+1EC7: "ệ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
2289        /* 1 */ "\u00E8,\u00E9,\u1EBB,\u1EBD,\u1EB9,\u00EA,\u1EC1,\u1EBF,\u1EC3,\u1EC5,\u1EC7",
2290        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
2291        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
2292        // U+1EC9: "ỉ" LATIN SMALL LETTER I WITH HOOK ABOVE
2293        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
2294        // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW
2295        /* 2 */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB",
2296        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
2297        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
2298        // U+1ECF: "ỏ" LATIN SMALL LETTER O WITH HOOK ABOVE
2299        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
2300        // U+1ECD: "ọ" LATIN SMALL LETTER O WITH DOT BELOW
2301        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
2302        // U+1ED3: "ồ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
2303        // U+1ED1: "ố" LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
2304        // U+1ED5: "ổ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
2305        // U+1ED7: "ỗ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
2306        // U+1ED9: "ộ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
2307        // U+01A1: "ơ" LATIN SMALL LETTER O WITH HORN
2308        // U+1EDD: "ờ" LATIN SMALL LETTER O WITH HORN AND GRAVE
2309        // U+1EDB: "ớ" LATIN SMALL LETTER O WITH HORN AND ACUTE
2310        // U+1EDF: "ở" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
2311        // U+1EE1: "ỡ" LATIN SMALL LETTER O WITH HORN AND TILDE
2312        // U+1EE3: "ợ" LATIN SMALL LETTER O WITH HORN AND DOT BELOW
2313        /* 3 */ "\u00F2,\u00F3,\u1ECF,\u00F5,\u1ECD,\u00F4,\u1ED3,\u1ED1,\u1ED5,\u1ED7,\u1ED9,\u01A1,\u1EDD,\u1EDB,\u1EDF,\u1EE1,\u1EE3",
2314        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
2315        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
2316        // U+1EE7: "ủ" LATIN SMALL LETTER U WITH HOOK ABOVE
2317        // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE
2318        // U+1EE5: "ụ" LATIN SMALL LETTER U WITH DOT BELOW
2319        // U+01B0: "ư" LATIN SMALL LETTER U WITH HORN
2320        // U+1EEB: "ừ" LATIN SMALL LETTER U WITH HORN AND GRAVE
2321        // U+1EE9: "ứ" LATIN SMALL LETTER U WITH HORN AND ACUTE
2322        // U+1EED: "ử" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
2323        // U+1EEF: "ữ" LATIN SMALL LETTER U WITH HORN AND TILDE
2324        // U+1EF1: "ự" LATIN SMALL LETTER U WITH HORN AND DOT BELOW
2325        /* 4 */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1",
2326        /* 5~ */
2327        null, null, null,
2328        /* ~7 */
2329        // U+1EF3: "ỳ" LATIN SMALL LETTER Y WITH GRAVE
2330        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
2331        // U+1EF7: "ỷ" LATIN SMALL LETTER Y WITH HOOK ABOVE
2332        // U+1EF9: "ỹ" LATIN SMALL LETTER Y WITH TILDE
2333        // U+1EF5: "ỵ" LATIN SMALL LETTER Y WITH DOT BELOW
2334        /* 8 */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5",
2335        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
2336        /* 9 */ "\u0111",
2337    };
2338
2339    /* Language zz: No language */
2340    private static final String[] LANGUAGE_zz = {
2341        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
2342        // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
2343        // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
2344        // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
2345        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
2346        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
2347        // U+00E6: "æ" LATIN SMALL LETTER AE
2348        // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
2349        // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
2350        // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
2351        // U+00AA: "ª" FEMININE ORDINAL INDICATOR
2352        /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA",
2353        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
2354        // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
2355        // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
2356        // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
2357        // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
2358        // U+0115: "ĕ" LATIN SMALL LETTER E WITH BREVE
2359        // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
2360        // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
2361        // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
2362        /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B",
2363        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
2364        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
2365        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
2366        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
2367        // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
2368        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
2369        // U+012D: "ĭ" LATIN SMALL LETTER I WITH BREVE
2370        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
2371        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
2372        // U+0133: "ij" LATIN SMALL LIGATURE IJ
2373        /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
2374        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
2375        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
2376        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
2377        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
2378        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
2379        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
2380        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
2381        // U+014F: "ŏ" LATIN SMALL LETTER O WITH BREVE
2382        // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
2383        // U+0153: "œ" LATIN SMALL LIGATURE OE
2384        // U+00BA: "º" MASCULINE ORDINAL INDICATOR
2385        /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA",
2386        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
2387        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
2388        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
2389        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
2390        // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE
2391        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
2392        // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE
2393        // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
2394        // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
2395        // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
2396        /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173",
2397        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
2398        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
2399        // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
2400        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
2401        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
2402        // U+017F: "ſ" LATIN SMALL LETTER LONG S
2403        /* 5 */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F",
2404        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
2405        // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
2406        // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
2407        // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
2408        // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
2409        // U+014B: "ŋ" LATIN SMALL LETTER ENG
2410        /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B",
2411        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
2412        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
2413        // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
2414        // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
2415        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
2416        /* 7 */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
2417        // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
2418        // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX
2419        // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
2420        // U+0133: "ij" LATIN SMALL LIGATURE IJ
2421        /* 8 */ "\u00FD,\u0177,\u00FF,\u0133",
2422        // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
2423        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
2424        // U+00F0: "ð" LATIN SMALL LETTER ETH
2425        /* 9 */ "\u010F,\u0111,\u00F0",
2426        // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
2427        // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
2428        // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
2429        /* 10 */ "\u0155,\u0157,\u0159",
2430        // U+00FE: "þ" LATIN SMALL LETTER THORN
2431        // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
2432        // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
2433        // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
2434        /* 11 */ "\u00FE,\u0163,\u0165,\u0167",
2435        // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
2436        // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
2437        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
2438        /* 12 */ "\u017A,\u017C,\u017E",
2439        // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
2440        // U+0138: "ĸ" LATIN SMALL LETTER KRA
2441        /* 13 */ "\u0137,\u0138",
2442        // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
2443        // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
2444        // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
2445        // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT
2446        // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
2447        /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142",
2448        // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
2449        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
2450        // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE
2451        // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
2452        /* 15 */ "\u011D,\u011F,\u0121,\u0123",
2453        /* 16 */ null,
2454        // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX
2455        /* 17 */ "\u0125",
2456        // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
2457        /* 18 */ "\u0135",
2458        // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
2459        /* 19 */ "\u0175",
2460    };
2461
2462    private static final Object[] LANGUAGES_AND_TEXTS = {
2463        "DEFAULT", LANGUAGE_DEFAULT, /* default */
2464        "ar", LANGUAGE_ar, /* Arabic */
2465        "be", LANGUAGE_be, /* Belarusian */
2466        "ca", LANGUAGE_ca, /* Catalan */
2467        "cs", LANGUAGE_cs, /* Czech */
2468        "da", LANGUAGE_da, /* Danish */
2469        "de", LANGUAGE_de, /* German */
2470        "en", LANGUAGE_en, /* English */
2471        "es", LANGUAGE_es, /* Spanish */
2472        "et", LANGUAGE_et, /* Estonian */
2473        "fa", LANGUAGE_fa, /* Persian */
2474        "fi", LANGUAGE_fi, /* Finnish */
2475        "fr", LANGUAGE_fr, /* French */
2476        "hi", LANGUAGE_hi, /* Hindi */
2477        "hr", LANGUAGE_hr, /* Croatian */
2478        "hu", LANGUAGE_hu, /* Hungarian */
2479        "is", LANGUAGE_is, /* Icelandic */
2480        "it", LANGUAGE_it, /* Italian */
2481        "iw", LANGUAGE_iw, /* Hebrew */
2482        "ky", LANGUAGE_ky, /* Kirghiz */
2483        "lt", LANGUAGE_lt, /* Lithuanian */
2484        "lv", LANGUAGE_lv, /* Latvian */
2485        "mk", LANGUAGE_mk, /* Macedonian */
2486        "nb", LANGUAGE_nb, /* Norwegian Bokmål */
2487        "nl", LANGUAGE_nl, /* Dutch */
2488        "pl", LANGUAGE_pl, /* Polish */
2489        "pt", LANGUAGE_pt, /* Portuguese */
2490        "rm", LANGUAGE_rm, /* Raeto-Romance */
2491        "ro", LANGUAGE_ro, /* Romanian */
2492        "ru", LANGUAGE_ru, /* Russian */
2493        "sk", LANGUAGE_sk, /* Slovak */
2494        "sl", LANGUAGE_sl, /* Slovenian */
2495        "sr", LANGUAGE_sr, /* Serbian */
2496        "sv", LANGUAGE_sv, /* Swedish */
2497        "tr", LANGUAGE_tr, /* Turkish */
2498        "uk", LANGUAGE_uk, /* Ukrainian */
2499        "vi", LANGUAGE_vi, /* Vietnamese */
2500        "zz", LANGUAGE_zz, /* No language */
2501    };
2502
2503    static {
2504        int id = 0;
2505        for (final String name : NAMES) {
2506            sNameToIdsMap.put(name, id++);
2507        }
2508
2509        for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
2510            final String language = (String)LANGUAGES_AND_TEXTS[i];
2511            final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
2512            sLocaleToTextsMap.put(language, texts);
2513        }
2514    }
2515}
2516