]> gitweb.fperrin.net Git - Dictionary.git/blob - src/com/hughes/android/dictionary/engine/Language.java
go
[Dictionary.git] / src / com / hughes / android / dictionary / engine / Language.java
1 package com.hughes.android.dictionary.engine;\r
2 \r
3 import java.util.Comparator;\r
4 import java.util.LinkedHashMap;\r
5 import java.util.Locale;\r
6 import java.util.Map;\r
7 \r
8 import com.ibm.icu.text.Collator;\r
9 \r
10 public class Language {\r
11 \r
12   static final Map<String, Language> symbolToLangauge = new LinkedHashMap<String, Language>();\r
13 \r
14   final String symbol;\r
15   final Locale locale;\r
16 \r
17   Collator sortCollator;\r
18   final Comparator<String> sortComparator;\r
19 \r
20   private Collator findCollator;\r
21   final Comparator<String> findComparator;\r
22 \r
23   public Language(final Locale locale) {\r
24     this.symbol = locale.getLanguage();\r
25     this.locale = locale;\r
26 \r
27     this.sortComparator = new Comparator<String>() {\r
28       public int compare(final String s1, final String s2) {\r
29         return getSortCollator().compare(textNorm(s1, false), textNorm(s2, false));\r
30       }\r
31     };\r
32 \r
33     this.findComparator = new Comparator<String>() {\r
34       public int compare(final String s1, final String s2) {\r
35         return getFindCollator().compare(textNorm(s1, false), textNorm(s2, false));\r
36       }\r
37     };\r
38     \r
39     symbolToLangauge.put(symbol.toLowerCase(), this);\r
40   }\r
41 \r
42   public String textNorm(final String s, final boolean toLower) {\r
43     return toLower ? s.toLowerCase() : s;\r
44   }\r
45 \r
46   @Override\r
47   public String toString() {\r
48     return locale.toString();\r
49   }\r
50   \r
51   public String getSymbol() {\r
52     return symbol;\r
53   }\r
54   \r
55   public synchronized Collator getFindCollator() {\r
56     if (findCollator == null) {\r
57       findCollator = Collator.getInstance(locale);\r
58       findCollator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);\r
59       findCollator.setStrength(Collator.SECONDARY);\r
60     }\r
61     return findCollator;\r
62   }\r
63 \r
64   public synchronized Collator getSortCollator() {\r
65     if (sortCollator == null) {\r
66       sortCollator = Collator.getInstance(locale);\r
67       sortCollator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);\r
68       sortCollator.setStrength(Collator.IDENTICAL);\r
69     }\r
70     return sortCollator;\r
71   }\r
72 \r
73   // ----------------------------------------------------------------\r
74 \r
75   public static final Language en = new Language(Locale.ENGLISH);\r
76   public static final Language fr = new Language(Locale.FRENCH);\r
77   public static final Language it = new Language(Locale.ITALIAN);\r
78 \r
79   public static final Language de = new Language(Locale.GERMAN) {\r
80     @Override\r
81     public String textNorm(String token, final boolean toLower) {\r
82       if (toLower) {\r
83         token = token.toLowerCase();\r
84       }\r
85       boolean sub = false;\r
86       // This is meant to be fast: occurrences of ae, oe, ue are probably rare.\r
87       for (int ePos = token.indexOf('e', 1); ePos != -1; ePos = token.indexOf(\r
88           'e', ePos + 1)) {\r
89         final char pre = Character.toLowerCase(token.charAt(ePos - 1));\r
90         if (pre == 'a' || pre == 'o' || pre == 'u') {\r
91           sub = true;\r
92           break;\r
93         }\r
94       }\r
95       if (!sub) {\r
96         return token;\r
97       }\r
98       \r
99       token = token.replaceAll("ae", "ä");\r
100       token = token.replaceAll("oe", "ö");\r
101       token = token.replaceAll("ue", "ü");\r
102 \r
103       token = token.replaceAll("Ae", "Ä");\r
104       token = token.replaceAll("Oe", "Ö");\r
105       token = token.replaceAll("Ue", "Ü");\r
106 \r
107       token = token.replaceAll("AE", "Ä");\r
108       token = token.replaceAll("OE", "Ö");\r
109       token = token.replaceAll("UE", "Ü");\r
110       \r
111       return token;   \r
112     }\r
113   };\r
114   \r
115   static {\r
116     for (final String lang : Locale.getISOLanguages()) {\r
117       if (lookup(lang) == null) {\r
118         new Language(new Locale(lang));\r
119       }\r
120     }\r
121   }\r
122 \r
123   // ----------------------------------------------------------------\r
124 \r
125   public static Language lookup(final String symbol) {\r
126     return symbolToLangauge.get(symbol.toLowerCase());\r
127   }\r
128 \r
129 }\r