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