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"));
+  }
 }