Fix handling of search order where particular regions have different
default scripts than the base language, such as pa_PK and zh_TW.
Patch by: jat
Review by: pdr
Review at http://gwt-code-reviews.appspot.com/1022801
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9148 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java b/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java
index 82e30ec..c3a7e04 100644
--- a/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java
+++ b/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java
@@ -423,7 +423,15 @@
initialScript = DefaultLanguageScripts.getDefaultScript(language,
region);
}
- List<GwtLocale> thisGroup = new ArrayList<GwtLocale>(this.getAliases());
+ List<GwtLocale> thisGroup = new ArrayList<GwtLocale>();
+ if (initialScript != null) {
+ // Make sure the default script is listed first in the search list,
+ // which ensures that zh_Hant appears before zh in the search list for
+ // zh_TW.
+ thisGroup.add(factory.fromComponents(language, initialScript, region,
+ variant));
+ }
+ thisGroup.add(this);
seen.addAll(thisGroup);
GwtLocale defLocale = factory.getDefault();
seen.add(defLocale);
diff --git a/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java b/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java
index 5e9d3e6..8c424e7 100644
--- a/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java
+++ b/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java
@@ -29,7 +29,7 @@
public class GwtLocaleTest extends TestCase {
private GwtLocaleFactory factory = new GwtLocaleFactoryImpl();
-
+
public void testAliases() {
GwtLocale en = factory.fromString("en");
List<GwtLocale> aliases = en.getAliases();
@@ -105,7 +105,7 @@
// Test equals against some non-GwtLocale class
assertFalse(locales[0].equals(factory));
}
-
+
public void testDefault() {
GwtLocale def1 = factory.getDefault();
GwtLocale def2 = factory.fromString("default");
@@ -173,7 +173,7 @@
} catch (IllegalArgumentException expected) {
}
}
-
+
public void testInheritance() {
GwtLocale en = factory.fromString("en_Latn_US_VARIANT");
List<GwtLocale> chain = en.getInheritanceChain();
@@ -260,9 +260,13 @@
assertContainsAndGetPosition(searchList, factory.fromString("no"));
GwtLocale zhTW = factory.fromString("zh_TW");
searchList = zhTW.getCompleteSearchList();
- assertContainsAndGetPosition(searchList, factory.fromString("zh_Hant"));
+ int hantPos = assertContainsAndGetPosition(searchList,
+ factory.fromString("zh_Hant"));
+ int zhPos = assertContainsAndGetPosition(searchList,
+ factory.fromString("zh"));
assertNotContains(searchList, factory.fromString("zh_Hans"));
- // TODO: explicitly verify search list for zh_TW
+ assertTrue("zh_Hant should appear before zh in zh_TW searchlist "
+ + searchList, hantPos < zhPos);
idx_default = assertContainsAndGetPosition(searchList,
factory.getDefault());
assertEquals(searchList.size() - 1, idx_default);
@@ -274,19 +278,17 @@
int arabPos = assertContainsAndGetPosition(searchList, paArab);
int paPos = assertContainsAndGetPosition(searchList, pa);
assertNotContains(searchList, paGuru);
- // See TODO in {@link GwtLocaleImpl#getCompleteSearchList()} for what is
- // needed for this test to pass (and likewise for zh_Hant appearing before
- // zh in the search list for zh_TW).
- // assertTrue(arabPos < paPos);
+ assertTrue("pa_Arab should appear before pa in pa_PK searchlist "
+ + searchList, arabPos < paPos);
}
-
+
private <T> int assertContainsAndGetPosition(List<T> list, T value) {
int idx = list.indexOf(value);
assertTrue("List " + list + " should have contained " + value,
idx >= 0);
return idx;
}
-
+
private <T> void assertNotContains(List<T> list, T value) {
assertFalse("List " + list + " should not have contained " + value,
list.contains(value));