Merge "Fix Locale.getDisplayName."
diff --git a/luni/src/main/java/java/util/Locale.java b/luni/src/main/java/java/util/Locale.java
index 885d150..3161769 100644
--- a/luni/src/main/java/java/util/Locale.java
+++ b/luni/src/main/java/java/util/Locale.java
@@ -1034,13 +1034,14 @@
/**
* Returns this locale's language name, country name, and variant, localized
* to {@code locale}. The exact output form depends on whether this locale
- * corresponds to a specific language, country and variant.
+ * corresponds to a specific language, script, country and variant.
*
* <p>For example:
* <ul>
* <li>{@code new Locale("en").getDisplayName(Locale.US)} -> {@code English}
* <li>{@code new Locale("en", "US").getDisplayName(Locale.US)} -> {@code English (United States)}
* <li>{@code new Locale("en", "US", "POSIX").getDisplayName(Locale.US)} -> {@code English (United States,Computer)}
+ * <li>{@code Locale.fromLanguageTag("zh-Hant-CN").getDisplayName(Locale.US)} -> {@code Chinese (Traditional Han,China)}
* <li>{@code new Locale("en").getDisplayName(Locale.FRANCE)} -> {@code anglais}
* <li>{@code new Locale("en", "US").getDisplayName(Locale.FRANCE)} -> {@code anglais (États-Unis)}
* <li>{@code new Locale("en", "US", "POSIX").getDisplayName(Locale.FRANCE)} -> {@code anglais (États-Unis,informatique)}.
@@ -1059,12 +1060,14 @@
buffer.append(" (");
}
String displayScript = getDisplayScript(locale);
- buffer.append(displayScript.isEmpty() ? countryCode : displayScript);
+ buffer.append(displayScript.isEmpty() ? scriptCode : displayScript);
++count;
}
if (!countryCode.isEmpty()) {
if (count == 1) {
buffer.append(" (");
+ } else if (count == 2) {
+ buffer.append(",");
}
String displayCountry = getDisplayCountry(locale);
buffer.append(displayCountry.isEmpty() ? countryCode : displayCountry);
@@ -1073,7 +1076,7 @@
if (!variantCode.isEmpty()) {
if (count == 1) {
buffer.append(" (");
- } else if (count == 2) {
+ } else if (count == 2 || count == 3) {
buffer.append(",");
}
String displayVariant = getDisplayVariant(locale);
diff --git a/luni/src/test/java/libcore/java/util/LocaleTest.java b/luni/src/test/java/libcore/java/util/LocaleTest.java
index c463269..cadd472 100644
--- a/luni/src/test/java/libcore/java/util/LocaleTest.java
+++ b/luni/src/test/java/libcore/java/util/LocaleTest.java
@@ -69,6 +69,22 @@
assertEquals("Deutsch", Locale.GERMAN.getDisplayLanguage(Locale.GERMAN));
}
+ // https://b/issue?id=13790528
+ public void test_getDisplayName_withScriptsAndVariants() throws Exception {
+ // Script + Country.
+ assertEquals("Chinese (Traditional Han,China)",
+ Locale.forLanguageTag("zh-Hant-CN").getDisplayName(Locale.US));
+ // Script + Variant.
+ assertEquals("Chinese (Traditional Han,VARIANT)",
+ Locale.forLanguageTag("zh-Hant-VARIANT").getDisplayName(Locale.US));
+ // Country + Variant.
+ assertEquals("Chinese (China,VARIANT)",
+ Locale.forLanguageTag("zh-CN-VARIANT").getDisplayName(Locale.US));
+ // Script + Country + variant.
+ assertEquals("Chinese (Traditional Han,China,VARIANT)",
+ Locale.forLanguageTag("zh-Hant-CN-VARIANT").getDisplayName(Locale.US));
+ }
+
public void test_getDisplayCountry_8870289() throws Exception {
assertEquals("Hong Kong", new Locale("", "HK").getDisplayCountry(Locale.US));
assertEquals("Macau", new Locale("", "MO").getDisplayCountry(Locale.US));