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