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