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