diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleValidityChecker.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleValidityChecker.java index b51a48f8ca1..cd812040498 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleValidityChecker.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleValidityChecker.java @@ -131,6 +131,7 @@ public class LocaleValidityChecker { ValueType valueType = null; SpecialCase specialCase = null; StringBuilder prefix = new StringBuilder(); + Set seen = new HashSet(); // TODO: is empty -u- valid? for (String subtag : SEPARATOR.split(extensionString)) { if (subtag.length() == 2) { @@ -160,6 +161,12 @@ public class LocaleValidityChecker { prefix.append('-').append(subtag); subtag = prefix.toString(); } + break; + case multiple: + if (typeCount == 1) { + seen.clear(); + } + break; } switch (specialCase) { case anything: @@ -174,7 +181,8 @@ public class LocaleValidityChecker { } continue; case reorder: - if (!isScriptReorder(subtag)) { + boolean newlyAdded = seen.add(subtag); + if (!newlyAdded || !isScriptReorder(subtag)) { return where.set(Datatype.u, key+"-"+subtag); } continue; diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/TestLocaleValidity.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/TestLocaleValidity.java index b7ba2b52f7d..7dd270fd9dc 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/TestLocaleValidity.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/TestLocaleValidity.java @@ -120,6 +120,7 @@ public class TestLocaleValidity extends TestFmwk { {"{u, kk-falsx}", "en-u-kk-falsx"}, {"{u, kn-falsx}", "en-u-kn-falsx"}, {"{u, kr-symbox}", "en-u-kr-latn-digit-symbox"}, // reorder codes, multiple + {"{u, kr-latn}", "en-u-kr-latn-digit-latn"}, // reorder codes, duplicat {"{u, ks-identix}", "en-u-ks-identix"}, {"{u, kv-currencx}", "en-u-kv-currencx"}, {"{u, nu-ahox}", "en-u-nu-ahox"},