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