* @param uLocale desired locale
* @internal
*/
- public GenderInfo(ULocale uLocale) {
- ULocale language = new ULocale(uLocale.getLanguage()); // in the hard coded data, the language is sufficient. Will change with RB.
- ListGenderStyle tempStyle = localeToListGender.get(language);
- style = tempStyle == null ? ListGenderStyle.NEUTRAL : tempStyle;
+ public static GenderInfo getInstance(ULocale uLocale) {
+ // These can be cached, since they are read-only
+ // poor-man's locale lookup, for hardcoded data
+ while (true) {
+ GenderInfo data = localeToListGender.get(uLocale);
+ if (data != null) {
+ return data;
+ }
+ uLocale = uLocale.getFallback();
+ if (uLocale == null) {
+ return neutral;
+ }
+ }
}
/**
* @param locale desired locale
* @internal
*/
- public GenderInfo(Locale locale) {
- this(ULocale.forLocale(locale));
+ public static GenderInfo getInstance(Locale locale) {
+ return getInstance(ULocale.forLocale(locale));
}
/**
* @param newULocaleToListGender replacement data, copied internally for safety.
* @internal
*/
- public static void setLocaleMapping(Map<ULocale,ListGenderStyle> newULocaleToListGender) {
+ public static void setLocaleMapping(Map<ULocale,GenderInfo> newULocaleToListGender) {
localeToListGender.clear();
- for (Entry<ULocale, ListGenderStyle> entry : newULocaleToListGender.entrySet()) {
+ for (Entry<ULocale, GenderInfo> entry : newULocaleToListGender.entrySet()) {
localeToListGender.put(entry.getKey(), entry.getValue());
}
}
return Gender.OTHER;
}
}
+
+ /**
+ * Only for testing and use with CLDR.
+ * @param genderStyle gender style
+ * @internal
+ */
+ public GenderInfo(ListGenderStyle genderStyle) {
+ style = genderStyle;
+ }
+
+ private static GenderInfo neutral = new GenderInfo(ListGenderStyle.NEUTRAL);
// TODO Get this data from a resource bundle generated from CLDR.
// For now, hard coded.
- private static Map<ULocale,ListGenderStyle> localeToListGender = new HashMap<ULocale,ListGenderStyle>();
+ private static Map<ULocale,GenderInfo> localeToListGender = new HashMap<ULocale,GenderInfo>();
static {
+ GenderInfo taints = new GenderInfo(ListGenderStyle.MALE_TAINTS);
for (String locale : Arrays.asList("ar", "ca", "cs", "hr", "es", "fr", "he", "hi", "it", "lt", "lv", "mr", "nl", "pl", "pt", "ro", "ru", "sk", "sl", "sr", "uk", "ur", "zh")) {
- localeToListGender.put(new ULocale(locale), ListGenderStyle.MALE_TAINTS);
+ localeToListGender.put(new ULocale(locale), taints);
}
+ GenderInfo mixed = new GenderInfo(ListGenderStyle.MIXED_NEUTRAL);
for (String locale : Arrays.asList("el", "is")) {
- localeToListGender.put(new ULocale(locale), ListGenderStyle.MIXED_NEUTRAL);
+ localeToListGender.put(new ULocale(locale), mixed);
}
}
}
new GenderInfoTest().run(args);
}
- public static GenderInfo NEUTRAL_LOCALE = new GenderInfo(ULocale.ENGLISH);
- public static GenderInfo MIXED_NEUTRAL_LOCALE = new GenderInfo(new ULocale("is"));
- public static GenderInfo MALE_TAINTS_LOCALE = new GenderInfo(ULocale.FRANCE);
+ public static GenderInfo NEUTRAL_LOCALE = GenderInfo.getInstance(ULocale.ENGLISH);
+ public static GenderInfo MIXED_NEUTRAL_LOCALE = GenderInfo.getInstance(new ULocale("is"));
+ public static GenderInfo MALE_TAINTS_LOCALE = GenderInfo.getInstance(ULocale.FRENCH);
public void TestEmpty() {
check(Gender.OTHER, Gender.OTHER);
assertEquals("mixed neutral " + mixed0, mixed, MIXED_NEUTRAL_LOCALE.getListGender(mixed0));
assertEquals("male taints " + mixed0, taints, MALE_TAINTS_LOCALE.getListGender(mixed0));
}
+
+ public void TestFallback() {
+ assertEquals("Strange locale = root", GenderInfo.getInstance(ULocale.ROOT), GenderInfo.getInstance(new ULocale("xxx")));
+ assertEquals("Strange locale = root", GenderInfo.getInstance(ULocale.FRANCE), GenderInfo.getInstance(ULocale.CANADA_FRENCH));
+ }
}