1 // Copyright 2011 Google Inc. All Rights Reserved.
\r
3 // Licensed under the Apache License, Version 2.0 (the "License");
\r
4 // you may not use this file except in compliance with the License.
\r
5 // You may obtain a copy of the License at
\r
7 // http://www.apache.org/licenses/LICENSE-2.0
\r
9 // Unless required by applicable law or agreed to in writing, software
\r
10 // distributed under the License is distributed on an "AS IS" BASIS,
\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
12 // See the License for the specific language governing permissions and
\r
13 // limitations under the License.
\r
15 package com.hughes.android.dictionary.engine;
\r
17 import java.util.ArrayList;
\r
18 import java.util.LinkedHashMap;
\r
19 import java.util.Locale;
\r
20 import java.util.Map;
\r
21 import java.util.regex.Pattern;
\r
23 import com.hughes.android.dictionary.R;
\r
24 import com.ibm.icu.text.Collator;
\r
26 public class Language {
\r
28 public static final Map<String,Integer> isoCodeToResourceId = new LinkedHashMap<String,Integer>();
\r
30 isoCodeToResourceId.put("AF", R.string.AF);
\r
31 isoCodeToResourceId.put("SQ", R.string.SQ);
\r
32 isoCodeToResourceId.put("AR", R.string.AR);
\r
33 isoCodeToResourceId.put("HY", R.string.HY);
\r
34 isoCodeToResourceId.put("BE", R.string.BE);
\r
35 isoCodeToResourceId.put("BN", R.string.BN);
\r
36 isoCodeToResourceId.put("BS", R.string.BS);
\r
37 isoCodeToResourceId.put("BG", R.string.BG);
\r
38 isoCodeToResourceId.put("CA", R.string.CA);
\r
39 isoCodeToResourceId.put("HR", R.string.HR);
\r
40 isoCodeToResourceId.put("CS", R.string.CS);
\r
41 isoCodeToResourceId.put("ZH", R.string.ZH);
\r
42 isoCodeToResourceId.put("DA", R.string.DA);
\r
43 isoCodeToResourceId.put("NL", R.string.NL);
\r
44 isoCodeToResourceId.put("EN", R.string.EN);
\r
45 isoCodeToResourceId.put("EO", R.string.EO);
\r
46 isoCodeToResourceId.put("ET", R.string.ET);
\r
47 isoCodeToResourceId.put("FI", R.string.FI);
\r
48 isoCodeToResourceId.put("FR", R.string.FR);
\r
49 isoCodeToResourceId.put("DE", R.string.DE);
\r
50 isoCodeToResourceId.put("EL", R.string.EL);
\r
51 isoCodeToResourceId.put("haw", R.string.haw);
\r
52 isoCodeToResourceId.put("HE", R.string.HE);
\r
53 isoCodeToResourceId.put("HI", R.string.HI);
\r
54 isoCodeToResourceId.put("HU", R.string.HU);
\r
55 isoCodeToResourceId.put("IS", R.string.IS);
\r
56 isoCodeToResourceId.put("ID", R.string.ID);
\r
57 isoCodeToResourceId.put("GA", R.string.GA);
\r
58 isoCodeToResourceId.put("IT", R.string.IT);
\r
59 isoCodeToResourceId.put("LA", R.string.LA);
\r
60 isoCodeToResourceId.put("LV", R.string.LV);
\r
61 isoCodeToResourceId.put("LT", R.string.LT);
\r
62 isoCodeToResourceId.put("JA", R.string.JA);
\r
63 isoCodeToResourceId.put("KO", R.string.KO);
\r
64 isoCodeToResourceId.put("KU", R.string.KU);
\r
65 isoCodeToResourceId.put("MS", R.string.MS);
\r
66 isoCodeToResourceId.put("MI", R.string.MI);
\r
67 isoCodeToResourceId.put("MN", R.string.MN);
\r
68 isoCodeToResourceId.put("NE", R.string.NE);
\r
69 isoCodeToResourceId.put("NO", R.string.NO);
\r
70 isoCodeToResourceId.put("FA", R.string.FA);
\r
71 isoCodeToResourceId.put("PL", R.string.PL);
\r
72 isoCodeToResourceId.put("PT", R.string.PT);
\r
73 isoCodeToResourceId.put("PA", R.string.PA);
\r
74 isoCodeToResourceId.put("RO", R.string.RO);
\r
75 isoCodeToResourceId.put("RU", R.string.RU);
\r
76 isoCodeToResourceId.put("SA", R.string.SA);
\r
77 isoCodeToResourceId.put("SR", R.string.SR);
\r
78 isoCodeToResourceId.put("SK", R.string.SK);
\r
79 isoCodeToResourceId.put("SO", R.string.SO);
\r
80 isoCodeToResourceId.put("ES", R.string.ES);
\r
81 isoCodeToResourceId.put("SW", R.string.SW);
\r
82 isoCodeToResourceId.put("SV", R.string.SV);
\r
83 isoCodeToResourceId.put("TG", R.string.TG);
\r
84 isoCodeToResourceId.put("TH", R.string.TH);
\r
85 isoCodeToResourceId.put("BO", R.string.BO);
\r
86 isoCodeToResourceId.put("TR", R.string.TR);
\r
87 isoCodeToResourceId.put("UK", R.string.UK);
\r
88 isoCodeToResourceId.put("UR", R.string.UR);
\r
89 isoCodeToResourceId.put("VI", R.string.VI);
\r
90 isoCodeToResourceId.put("CI", R.string.CI);
\r
91 isoCodeToResourceId.put("YI", R.string.YI);
\r
92 isoCodeToResourceId.put("ZU", R.string.ZU);
\r
94 // Hack to allow lower-case ISO codes to work:
\r
95 for (final String isoCode : new ArrayList<String>(isoCodeToResourceId.keySet())) {
\r
96 isoCodeToResourceId.put(isoCode.toLowerCase(), isoCodeToResourceId.get(isoCode));
\r
101 private static final Map<String, Language> registry = new LinkedHashMap<String, Language>();
\r
103 final String isoCode;
\r
104 final Locale locale;
\r
106 private Collator collator;
\r
108 private Language(final Locale locale, final String isoCode) {
\r
109 this.locale = locale;
\r
110 this.isoCode = isoCode;
\r
112 registry.put(isoCode.toLowerCase(), this);
\r
116 public String toString() {
\r
117 return locale.toString();
\r
120 public String getIsoCode() {
\r
124 public synchronized Collator getCollator() {
\r
125 if (collator == null) {
\r
126 this.collator = Collator.getInstance(locale);
\r
127 this.collator.setStrength(Collator.IDENTICAL);
\r
132 public String getDefaultNormalizerRules() {
\r
133 return ":: Any-Latin; ' ' > ; :: Lower; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC ;";
\r
137 * A practical pattern to identify strong RTL characters. This pattern is not
\r
138 * completely correct according to the Unicode standard. It is simplified for
\r
139 * performance and small code size.
\r
141 private static final String rtlChars =
\r
142 "\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC";
\r
143 private static final Pattern RTL_TOKEN = Pattern.compile("[" + rtlChars + "]");
\r
145 public static String fixBidiText(final String text) {
\r
146 // TODO: fix me!, use me!
\r
150 // ----------------------------------------------------------------
\r
152 public static final Language en = new Language(Locale.ENGLISH, "EN");
\r
153 public static final Language fr = new Language(Locale.FRENCH, "FR");
\r
154 public static final Language it = new Language(Locale.ITALIAN, "IT");
\r
156 public static final Language de = new Language(Locale.GERMAN, "DE") {
\r
158 public String getDefaultNormalizerRules() {
\r
159 return ":: Lower; 'ae' > 'ä'; 'oe' > 'ö'; 'ue' > 'ü'; 'ß' > 'ss'; ";
\r
163 // ----------------------------------------------------------------
\r
165 public static synchronized Language lookup(final String isoCode) {
\r
166 Language lang = registry.get(isoCode.toLowerCase());
\r
167 if (lang == null) {
\r
168 lang = new Language(new Locale(isoCode), isoCode);
\r