if (c != 0) {\r
return c;\r
}\r
- return StringUtil.reverse(s1).compareTo(StringUtil.reverse(s2));\r
+ return StringUtil.flipCase(StringUtil.reverse(s1)).compareTo(StringUtil.flipCase(StringUtil.reverse(s2)));\r
}};\r
}\r
\r
\r
\r
// ----------------------------------------------------------------\r
+ \r
+ static final String normalizeTokenForSort(final String token, final boolean vowelETranslation) {\r
+ final StringBuilder result = new StringBuilder();\r
+ for (int i = 0; i < token.length(); ++i) {\r
+ Character c = token.charAt(i);\r
+ c = Character.toLowerCase(c);\r
+ // only check for lowercase 'e' in subsequent position means don't treat acronyms as umlauted: SAE.\r
+ if (vowelETranslation && (c == 'a' || c == 'o' || c == 'u') && i + 1 < token.length() && token.charAt(i + 1) == 'e') {\r
+ if (c == 'a') {\r
+ result.append('ä');\r
+ } else if (c == 'o') {\r
+ result.append('ö');\r
+ } else if (c == 'u') {\r
+ result.append('ü');\r
+ }\r
+ ++i;\r
+ } else if (c >= 'a' && c <= 'z' || c >= '0' && c <= '9') {\r
+ result.append(c);\r
+ } else if (c == 'ß') {\r
+ result.append("ss");\r
+ } else if (c == 'ä') {\r
+ result.append(c);\r
+ } else if (c == 'ö') {\r
+ result.append(c);\r
+ } else if (c == 'ü') {\r
+ result.append(c);\r
+ }\r
+ }\r
+ return result.toString();\r
+ }\r
\r
public static final Language EN = new Language("EN") {\r
@Override\r
public String normalizeTokenForSort(final String token) {\r
- return token.toLowerCase().replaceAll("ß", "ss").replaceAll("ä", "a")\r
- .replaceAll("ö", "o").replaceAll("ü", "u").replaceAll("[^A-Za-z0-9]",\r
- "");\r
+ return Language.normalizeTokenForSort(token, false);\r
}\r
};\r
-\r
+ \r
public static final Language DE = new Language("DE") {\r
@Override\r
String normalizeTokenForSort(final String token) {\r
- return token.toLowerCase().replaceAll("ß", "ss").replaceAll("ä", "a")\r
- .replaceAll("ae", "a").replaceAll("ö", "o").replaceAll("oe", "o")\r
- .replaceAll("ü", "u").replaceAll("ue", "u").replaceAll(\r
- "[^A-Za-z0-9]", "");\r
+ return Language.normalizeTokenForSort(token, true);\r
}\r
};\r
\r