Adding method to convert java locale into widget-compatible language code.
diff --git a/src/com/android/i18n/addressinput/Util.java b/src/com/android/i18n/addressinput/Util.java
index 7b6bd95..f1a14a2 100644
--- a/src/com/android/i18n/addressinput/Util.java
+++ b/src/com/android/i18n/addressinput/Util.java
@@ -17,6 +17,7 @@
package com.android.i18n.addressinput;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -25,13 +26,15 @@
* Utility functions used by the address widget.
*/
public class Util {
- // In upper-case, since we convert the language code to upper case before doing string
- // comparison.
-
+ /**
+ * This variable is in upper-case, since we convert the language code to upper case before doing
+ * string comparison.
+ */
private static final String LATIN_SCRIPT = "LATN";
- // Cannot instantiate this class - private constructor.
-
+ /**
+ * Cannot instantiate this class - private constructor.
+ */
private Util() {
}
@@ -147,7 +150,40 @@
nameToKeyMap.put(lnames[i].toLowerCase(), keys[i]);
}
}
-
return nameToKeyMap;
}
+
+ /**
+ * Returns a language code that the widget can use when fetching data, based on a {@link
+ * java.util.Locale} language and the current selected country in the address widget. This
+ * method is necessary since we have to determine later whether a language is "local" or "latin"
+ * for certain countries.
+ *
+ * @param language the current user language
+ * @param currentCountry the current selected country
+ * @return a language code string in BCP-47 format (e.g. "en", "zh-Latn", "zh-Hans" or
+ * "en-US").
+ */
+ public static String getWidgetCompatibleLanguageCode(Locale language, String currentCountry) {
+ String country = currentCountry.toUpperCase();
+ // Only do something if the country is China, Taiwan, Japan, or South or North Korea.
+ if (country.equals("CN") || country.equals("TW") || country.equals("JP") ||
+ country.equals("KR") || country.equals("KP")) {
+ String languageTag = language.getLanguage();
+ // Only do something if the language tag is _not_ Chinese, Japanese or Korean.
+ if (!languageTag.equals("zh") && !languageTag.equals("ja") &&
+ !languageTag.equals("ko")) {
+ // Build up the language tag with the country and language specified, and add in the
+ // script-tag of "Latn" explicitly, since this is _not_ a local language.
+ StringBuilder languageTagBuilder = new StringBuilder(languageTag);
+ languageTagBuilder.append("_latn");
+ if (language.getCountry().length() > 0) {
+ languageTagBuilder.append("_");
+ languageTagBuilder.append(language.getCountry());
+ }
+ return languageTagBuilder.toString();
+ }
+ }
+ return language.toString();
+ }
}
diff --git a/test/com/android/i18n/addressinput/UtilTest.java b/test/com/android/i18n/addressinput/UtilTest.java
index df72e05..696098d 100644
--- a/test/com/android/i18n/addressinput/UtilTest.java
+++ b/test/com/android/i18n/addressinput/UtilTest.java
@@ -16,6 +16,8 @@
package com.android.i18n.addressinput;
+import java.util.Locale;
+
import junit.framework.TestCase;
/**
@@ -85,4 +87,35 @@
assertEquals(null, Util.joinAndSkipNulls("-", nullString, nullString));
assertEquals(null, Util.joinAndSkipNulls("-", nullString, "", nullString));
}
+
+ public void testGetWidgetCompatibleLanguageCodeCjkCountry() throws Exception {
+ Locale canadianFrench = new Locale("fr", "CA");
+ // Latin language, CJK country. Need explicit latin tag, and country should be retained.
+ assertEquals("fr_latn_CA", Util.getWidgetCompatibleLanguageCode(canadianFrench, "CN"));
+ Locale canadianFrenchUpper = new Locale("FR", "CA");
+ // Test that the locale returns the same language code, regardless of the case of the initial
+ // input.
+ assertEquals("fr_latn_CA", Util.getWidgetCompatibleLanguageCode(canadianFrenchUpper, "CN"));
+ // No country in the Locale language.
+ assertEquals("fr_latn", Util.getWidgetCompatibleLanguageCode(Locale.FRENCH, "CN"));
+ // CJK language - should be unaltered.
+ assertEquals(Locale.KOREAN.toString(),
+ Util.getWidgetCompatibleLanguageCode(Locale.KOREAN, "CN"));
+ Locale chineseChina = new Locale("zh", "CN");
+ assertEquals("zh_CN",
+ Util.getWidgetCompatibleLanguageCode(chineseChina, "CN"));
+ }
+
+ public void testGetWidgetCompatibleLanguageCodeNonCjkCountry() throws Exception {
+ // Nothing should be changed for non-CJK countries, since their form layout is the same
+ // regardless of language.
+ Locale canadianFrench = new Locale("fr", "CA");
+ assertEquals("fr_CA", Util.getWidgetCompatibleLanguageCode(canadianFrench, "US"));
+ // No country in the Locale language.
+ assertEquals(Locale.FRENCH.toString(),
+ Util.getWidgetCompatibleLanguageCode(Locale.FRENCH, "US"));
+ // CJK language - should be unaltered too.
+ assertEquals(Locale.KOREAN.toString(),
+ Util.getWidgetCompatibleLanguageCode(Locale.KOREAN, "US"));
+ }
}