From: Mark Davis Date: Tue, 21 Feb 2012 00:56:17 +0000 (+0000) Subject: ICU-9125 Check for fallback, odd locales; clean up constructors. X-Git-Tag: milestone-59-0-1~4014 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ac906834e2c4ad436148e2d0a0a6e1d952ce55b7;p=icu ICU-9125 Check for fallback, odd locales; clean up constructors. X-SVN-Rev: 31456 --- diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/GenderInfo.java b/icu4j/main/classes/core/src/com/ibm/icu/util/GenderInfo.java index bf247fa4cdc..2325e5e0e3d 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/util/GenderInfo.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/util/GenderInfo.java @@ -35,10 +35,19 @@ public class GenderInfo { * @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; + } + } } /** @@ -46,8 +55,8 @@ public class GenderInfo { * @param locale desired locale * @internal */ - public GenderInfo(Locale locale) { - this(ULocale.forLocale(locale)); + public static GenderInfo getInstance(Locale locale) { + return getInstance(ULocale.forLocale(locale)); } /** @@ -74,9 +83,9 @@ public class GenderInfo { * @param newULocaleToListGender replacement data, copied internally for safety. * @internal */ - public static void setLocaleMapping(Map newULocaleToListGender) { + public static void setLocaleMapping(Map newULocaleToListGender) { localeToListGender.clear(); - for (Entry entry : newULocaleToListGender.entrySet()) { + for (Entry entry : newULocaleToListGender.entrySet()) { localeToListGender.put(entry.getKey(), entry.getValue()); } } @@ -138,17 +147,30 @@ public class GenderInfo { 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 localeToListGender = new HashMap(); + private static Map localeToListGender = new HashMap(); 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); } } } diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/GenderInfoTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/GenderInfoTest.java index 2b0b0e97238..1eea4f0946b 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/GenderInfoTest.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/GenderInfoTest.java @@ -19,9 +19,9 @@ public class GenderInfoTest extends TestFmwk { 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); @@ -47,4 +47,9 @@ public class GenderInfoTest extends TestFmwk { 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)); + } }