1289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard/*
2289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard * Copyright (C) 2012 The Android Open Source Project
3289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard *
4289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard * Licensed under the Apache License, Version 2.0 (the "License");
5289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard * you may not use this file except in compliance with the License.
6289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard * You may obtain a copy of the License at
7289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard *
8289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard *      http://www.apache.org/licenses/LICENSE-2.0
9289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard *
10289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard * Unless required by applicable law or agreed to in writing, software
11289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard * distributed under the License is distributed on an "AS IS" BASIS,
12289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard * See the License for the specific language governing permissions and
14289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard * limitations under the License.
15289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard */
16289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard
17289299bf66de5fb0c8a378f2366c0760da27077bJean Chalardpackage com.android.inputmethod.latin.utils;
18289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard
19289299bf66de5fb0c8a378f2366c0760da27077bJean Chalardimport java.util.Locale;
20289299bf66de5fb0c8a378f2366c0760da27077bJean Chalardimport java.util.TreeMap;
21289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard
22289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard/**
23289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard * A class to help with handling different writing scripts.
24289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard */
25289299bf66de5fb0c8a378f2366c0760da27077bJean Chalardpublic class ScriptUtils {
2698596e51a1ec262bd0f90154e156928e1458d4fcDan Zivkovic
275f6c303f0ba70c0bcfd73d06b63f0175669dafc1Jean Chalard    // Used for hardware keyboards
285f6c303f0ba70c0bcfd73d06b63f0175669dafc1Jean Chalard    public static final int SCRIPT_UNKNOWN = -1;
2998596e51a1ec262bd0f90154e156928e1458d4fcDan Zivkovic
30ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_ARABIC = 0;
31ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_ARMENIAN = 1;
32ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_BENGALI = 2;
33ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_CYRILLIC = 3;
34ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_DEVANAGARI = 4;
35ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_GEORGIAN = 5;
36ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_GREEK = 6;
37ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_HEBREW = 7;
38ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_KANNADA = 8;
39ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_KHMER = 9;
40ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_LAO = 10;
41ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_LATIN = 11;
42ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_MALAYALAM = 12;
43ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_MYANMAR = 13;
44ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_SINHALA = 14;
453a729d4ed8f3018663af74abc2ae4ac3f4bb33d7Jean Chalard    public static final int SCRIPT_TAMIL = 15;
46ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_TELUGU = 16;
47ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard    public static final int SCRIPT_THAI = 17;
4898596e51a1ec262bd0f90154e156928e1458d4fcDan Zivkovic
49cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic    private static final TreeMap<String, Integer> mLanguageCodeToScriptCode;
5098596e51a1ec262bd0f90154e156928e1458d4fcDan Zivkovic
51289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard    static {
52cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode = new TreeMap<>();
53cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("", SCRIPT_LATIN); // default
54cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("ar", SCRIPT_ARABIC);
55cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("hy", SCRIPT_ARMENIAN);
56cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("bn", SCRIPT_BENGALI);
57cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("bg", SCRIPT_CYRILLIC);
58cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("sr", SCRIPT_CYRILLIC);
59cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("ru", SCRIPT_CYRILLIC);
60cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("ka", SCRIPT_GEORGIAN);
61cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("el", SCRIPT_GREEK);
6216c262abe57a1cc481930391e800c35867f3d0b4Chieu Nguyen        mLanguageCodeToScriptCode.put("iw", SCRIPT_HEBREW);
63cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("km", SCRIPT_KHMER);
64cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("lo", SCRIPT_LAO);
65cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("ml", SCRIPT_MALAYALAM);
66cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("my", SCRIPT_MYANMAR);
67cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("si", SCRIPT_SINHALA);
68cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("ta", SCRIPT_TAMIL);
69cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("te", SCRIPT_TELUGU);
70cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        mLanguageCodeToScriptCode.put("th", SCRIPT_THAI);
71289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard    }
72cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic
73289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard    /*
74289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard     * Returns whether the code point is a letter that makes sense for the specified
75289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard     * locale for this spell checker.
76289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard     * The dictionaries supported by Latin IME are described in res/xml/spellchecker.xml
77289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard     * and is limited to EFIGS languages and Russian.
78289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard     * Hence at the moment this explicitly tests for Cyrillic characters or Latin characters
79289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard     * as appropriate, and explicitly excludes CJK, Arabic and Hebrew characters.
80289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard     */
81292deb632cbab232334190e68d29184094d6d51bJean Chalard    public static boolean isLetterPartOfScript(final int codePoint, final int scriptId) {
82292deb632cbab232334190e68d29184094d6d51bJean Chalard        switch (scriptId) {
83292deb632cbab232334190e68d29184094d6d51bJean Chalard        case SCRIPT_ARABIC:
84292deb632cbab232334190e68d29184094d6d51bJean Chalard            // Arabic letters can be in any of the following blocks:
85292deb632cbab232334190e68d29184094d6d51bJean Chalard            // Arabic U+0600..U+06FF
863a729d4ed8f3018663af74abc2ae4ac3f4bb33d7Jean Chalard            // Arabic Supplement, Thaana U+0750..U+077F, U+0780..U+07BF
87292deb632cbab232334190e68d29184094d6d51bJean Chalard            // Arabic Extended-A U+08A0..U+08FF
88292deb632cbab232334190e68d29184094d6d51bJean Chalard            // Arabic Presentation Forms-A U+FB50..U+FDFF
89292deb632cbab232334190e68d29184094d6d51bJean Chalard            // Arabic Presentation Forms-B U+FE70..U+FEFF
90292deb632cbab232334190e68d29184094d6d51bJean Chalard            return (codePoint >= 0x600 && codePoint <= 0x6FF)
913a729d4ed8f3018663af74abc2ae4ac3f4bb33d7Jean Chalard                    || (codePoint >= 0x750 && codePoint <= 0x7BF)
92292deb632cbab232334190e68d29184094d6d51bJean Chalard                    || (codePoint >= 0x8A0 && codePoint <= 0x8FF)
93292deb632cbab232334190e68d29184094d6d51bJean Chalard                    || (codePoint >= 0xFB50 && codePoint <= 0xFDFF)
94292deb632cbab232334190e68d29184094d6d51bJean Chalard                    || (codePoint >= 0xFE70 && codePoint <= 0xFEFF);
950dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard        case SCRIPT_ARMENIAN:
960dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard            // Armenian letters are in the Armenian unicode block, U+0530..U+058F and
970dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard            // Alphabetic Presentation Forms block, U+FB00..U+FB4F, but only in the Armenian part
980dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard            // of that block, which is U+FB13..U+FB17.
990dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard            return (codePoint >= 0x530 && codePoint <= 0x58F
1000dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard                    || codePoint >= 0xFB13 && codePoint <= 0xFB17);
101ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard        case SCRIPT_BENGALI:
102ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Bengali unicode block is U+0980..U+09FF
103ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            return (codePoint >= 0x980 && codePoint <= 0x9FF);
104ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard        case SCRIPT_CYRILLIC:
105ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // All Cyrillic characters are in the 400~52F block. There are some in the upper
106ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Unicode range, but they are archaic characters that are not used in modern
107ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Russian and are not used by our dictionary.
108ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            return codePoint >= 0x400 && codePoint <= 0x52F && Character.isLetter(codePoint);
109ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard        case SCRIPT_DEVANAGARI:
110ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Devanagari unicode block is +0900..U+097F
111ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            return (codePoint >= 0x900 && codePoint <= 0x97F);
1120dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard        case SCRIPT_GEORGIAN:
1130dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard            // Georgian letters are in the Georgian unicode block, U+10A0..U+10FF,
1140dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard            // or Georgian supplement block, U+2D00..U+2D2F
1150dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard            return (codePoint >= 0x10A0 && codePoint <= 0x10FF
1160dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard                    || codePoint >= 0x2D00 && codePoint <= 0x2D2F);
117ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard        case SCRIPT_GREEK:
118ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Greek letters are either in the 370~3FF range (Greek & Coptic), or in the
119ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // 1F00~1FFF range (Greek extended). Our dictionary contains both sort of characters.
120ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Our dictionary also contains a few words with 0xF2; it would be best to check
121ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // if that's correct, but a web search does return results for these words so
122ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // they are probably okay.
123ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            return (codePoint >= 0x370 && codePoint <= 0x3FF)
124ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard                    || (codePoint >= 0x1F00 && codePoint <= 0x1FFF)
125ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard                    || codePoint == 0xF2;
126ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard        case SCRIPT_HEBREW:
127ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Hebrew letters are in the Hebrew unicode block, which spans from U+0590 to U+05FF,
128ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // or in the Alphabetic Presentation Forms block, U+FB00..U+FB4F, but only in the
129ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Hebrew part of that block, which is U+FB1D..U+FB4F.
130ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            return (codePoint >= 0x590 && codePoint <= 0x5FF
131ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard                    || codePoint >= 0xFB1D && codePoint <= 0xFB4F);
132ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard        case SCRIPT_KANNADA:
133ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Kannada unicode block is U+0C80..U+0CFF
134ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            return (codePoint >= 0xC80 && codePoint <= 0xCFF);
135a9c12692ed11a4712ceb743f446e51a735eeabb6Jean Chalard        case SCRIPT_KHMER:
136a9c12692ed11a4712ceb743f446e51a735eeabb6Jean Chalard            // Khmer letters are in unicode block U+1780..U+17FF, and the Khmer symbols block
137a9c12692ed11a4712ceb743f446e51a735eeabb6Jean Chalard            // is U+19E0..U+19FF
138a9c12692ed11a4712ceb743f446e51a735eeabb6Jean Chalard            return (codePoint >= 0x1780 && codePoint <= 0x17FF
139a9c12692ed11a4712ceb743f446e51a735eeabb6Jean Chalard                    || codePoint >= 0x19E0 && codePoint <= 0x19FF);
140a9c12692ed11a4712ceb743f446e51a735eeabb6Jean Chalard        case SCRIPT_LAO:
141a9c12692ed11a4712ceb743f446e51a735eeabb6Jean Chalard            // The Lao block is U+0E80..U+0EFF
142a9c12692ed11a4712ceb743f446e51a735eeabb6Jean Chalard            return (codePoint >= 0xE80 && codePoint <= 0xEFF);
143ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard        case SCRIPT_LATIN:
144ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Our supported latin script dictionaries (EFIGS) at the moment only include
145ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // characters in the C0, C1, Latin Extended A and B, IPA extensions unicode
146ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // blocks. As it happens, those are back-to-back in the code range 0x40 to 0x2AF,
147ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // so the below is a very efficient way to test for it. As for the 0-0x3F, it's
148ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // excluded from isLetter anyway.
149ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            return codePoint <= 0x2AF && Character.isLetter(codePoint);
150ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard        case SCRIPT_MALAYALAM:
151ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Malayalam unicode block is U+0D00..U+0D7F
152ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            return (codePoint >= 0xD00 && codePoint <= 0xD7F);
1537c5cd5ec89c0d90c3dbac032c61ee04468ecdc87Jean Chalard        case SCRIPT_MYANMAR:
1547c5cd5ec89c0d90c3dbac032c61ee04468ecdc87Jean Chalard            // Myanmar has three unicode blocks :
1557c5cd5ec89c0d90c3dbac032c61ee04468ecdc87Jean Chalard            // Myanmar U+1000..U+109F
1567c5cd5ec89c0d90c3dbac032c61ee04468ecdc87Jean Chalard            // Myanmar extended-A U+AA60..U+AA7F
1577c5cd5ec89c0d90c3dbac032c61ee04468ecdc87Jean Chalard            // Myanmar extended-B U+A9E0..U+A9FF
1587c5cd5ec89c0d90c3dbac032c61ee04468ecdc87Jean Chalard            return (codePoint >= 0x1000 && codePoint <= 0x109F
1597c5cd5ec89c0d90c3dbac032c61ee04468ecdc87Jean Chalard                    || codePoint >= 0xAA60 && codePoint <= 0xAA7F
1607c5cd5ec89c0d90c3dbac032c61ee04468ecdc87Jean Chalard                    || codePoint >= 0xA9E0 && codePoint <= 0xA9FF);
1617c5cd5ec89c0d90c3dbac032c61ee04468ecdc87Jean Chalard        case SCRIPT_SINHALA:
1627c5cd5ec89c0d90c3dbac032c61ee04468ecdc87Jean Chalard            // Sinhala unicode block is U+0D80..U+0DFF
1637c5cd5ec89c0d90c3dbac032c61ee04468ecdc87Jean Chalard            return (codePoint >= 0xD80 && codePoint <= 0xDFF);
1643a729d4ed8f3018663af74abc2ae4ac3f4bb33d7Jean Chalard        case SCRIPT_TAMIL:
1653a729d4ed8f3018663af74abc2ae4ac3f4bb33d7Jean Chalard            // Tamil unicode block is U+0B80..U+0BFF
1663a729d4ed8f3018663af74abc2ae4ac3f4bb33d7Jean Chalard            return (codePoint >= 0xB80 && codePoint <= 0xBFF);
167ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard        case SCRIPT_TELUGU:
168ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Telugu unicode block is U+0C00..U+0C7F
169ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            return (codePoint >= 0xC00 && codePoint <= 0xC7F);
170ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard        case SCRIPT_THAI:
171ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            // Thai unicode block is U+0E00..U+0E7F
172ae4e2036252555fbed0fc63cee0b5879408788e7Jean Chalard            return (codePoint >= 0xE00 && codePoint <= 0xE7F);
1735f6c303f0ba70c0bcfd73d06b63f0175669dafc1Jean Chalard        case SCRIPT_UNKNOWN:
1745f6c303f0ba70c0bcfd73d06b63f0175669dafc1Jean Chalard            return true;
175289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard        default:
176289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard            // Should never come here
177292deb632cbab232334190e68d29184094d6d51bJean Chalard            throw new RuntimeException("Impossible value of script: " + scriptId);
178289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard        }
179289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard    }
180289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard
18198596e51a1ec262bd0f90154e156928e1458d4fcDan Zivkovic    /**
18298596e51a1ec262bd0f90154e156928e1458d4fcDan Zivkovic     * @param locale spell checker locale
183cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic     * @return internal Latin IME script code that maps to a language code
184cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic     * {@see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes}
18598596e51a1ec262bd0f90154e156928e1458d4fcDan Zivkovic     */
1860dab3171d442a4d0acc87cc0019bfcbd4ea4123fJean Chalard    public static int getScriptFromSpellCheckerLocale(final Locale locale) {
187cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        String language = locale.getLanguage();
188cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        Integer script = mLanguageCodeToScriptCode.get(language);
189cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        if (script == null) {
190cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic            // Default to Latin.
191cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic            script = mLanguageCodeToScriptCode.get("");
192289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard        }
193cf84f8ce0c65923dc9a66e386c17ab9de338accfDan Zivkovic        return script;
194289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard    }
195289299bf66de5fb0c8a378f2366c0760da27077bJean Chalard}
196