]> 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   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), textNorm(s2));\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), textNorm(s2));\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) {\r
43     return 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) {\r
82       boolean sub = false;\r
83       for (int ePos = token.indexOf('e', 1); ePos != -1; ePos = token.indexOf(\r
84           'e', ePos + 1)) {\r
85         final char pre = Character.toLowerCase(token.charAt(ePos - 1));\r
86         if (pre == 'a' || pre == 'o' || pre == 'u') {\r
87           sub = true;\r
88           break;\r
89         }\r
90       }\r
91       if (!sub) {\r
92         return token;\r
93       }\r
94       token = token.replaceAll("ae", "ä");\r
95       token = token.replaceAll("oe", "ö");\r
96       token = token.replaceAll("ue", "ü");\r
97 \r
98       token = token.replaceAll("Ae", "Ä");\r
99       token = token.replaceAll("Oe", "Ö");\r
100       token = token.replaceAll("Ue", "Ü");\r
101       return token;   \r
102     }\r
103   };\r
104   \r
105   static {\r
106     for (final String lang : Locale.getISOLanguages()) {\r
107       if (lookup(lang) == null) {\r
108         new Language(new Locale(lang));\r
109       }\r
110     }\r
111   }\r
112 \r
113   // ----------------------------------------------------------------\r
114 \r
115   public static Language lookup(final String symbol) {\r
116     return symbolToLangauge.get(symbol.toLowerCase());\r
117   }\r
118 \r
119 }\r