OpenJDK / bsd-port / jdk9 / jdk
changeset 3198:97e54a18d599
7002320: Locale.forLanguageTag()/toLanguageTag() not working properly with ja_JP_JP locale
Reviewed-by: dougfelt
author | naoto |
---|---|
date | Mon, 13 Dec 2010 13:16:08 -0800 |
parents | 11b73cda876d |
children | 0df2e740bd4e ec02d02d3409 |
files | src/share/classes/java/util/Locale.java test/java/util/Locale/LocaleEnhanceTest.java |
diffstat | 2 files changed, 53 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/util/Locale.java Fri Dec 10 14:02:33 2010 -0800 +++ b/src/share/classes/java/util/Locale.java Mon Dec 13 13:16:08 2010 -0800 @@ -1426,7 +1426,12 @@ LanguageTag tag = LanguageTag.parse(languageTag, null); InternalLocaleBuilder bldr = new InternalLocaleBuilder(); bldr.setLanguageTag(tag); - return getInstance(bldr.getBaseLocale(), bldr.getLocaleExtensions()); + BaseLocale base = bldr.getBaseLocale(); + LocaleExtensions exts = bldr.getLocaleExtensions(); + if (exts.isEmpty() && base.getVariant().length() > 0) { + exts = getCompatibilityExtensions(base.getLanguage(), base.getScript(), base.getRegion(), base.getVariant()); + } + return getInstance(base, exts); } /** @@ -2485,6 +2490,10 @@ public Locale build() { BaseLocale baseloc = _locbld.getBaseLocale(); LocaleExtensions extensions = _locbld.getLocaleExtensions(); + if (extensions.isEmpty() && baseloc.getVariant().length() > 0) { + extensions = getCompatibilityExtensions(baseloc.getLanguage(), baseloc.getScript(), + baseloc.getRegion(), baseloc.getVariant()); + } return Locale.getInstance(baseloc, extensions); } }
--- a/test/java/util/Locale/LocaleEnhanceTest.java Fri Dec 10 14:02:33 2010 -0800 +++ b/test/java/util/Locale/LocaleEnhanceTest.java Mon Dec 13 13:16:08 2010 -0800 @@ -1201,6 +1201,49 @@ } } + public void testBug7002320() { + // forLanguageTag() and Builder.setLanguageTag(String) + // should add a location extension for following two cases. + // + // 1. language/country are "ja"/"JP" and the resolved variant (x-lvariant-*) + // is exactly "JP" and no BCP 47 extensions are available, then add + // a Unicode locale extension "ca-japanese". + // 2. language/country are "th"/"TH" and the resolved variant is exactly + // "TH" and no BCP 47 extensions are available, then add a Unicode locale + // extension "nu-thai". + // + String[][] testdata = { + {"ja-JP-x-lvariant-JP", "ja-JP-u-ca-japanese-x-lvariant-JP"}, // special case 1 + {"ja-JP-x-lvariant-JP-XXX"}, + {"ja-JP-u-ca-japanese-x-lvariant-JP"}, + {"ja-JP-u-ca-gregory-x-lvariant-JP"}, + {"ja-JP-u-cu-jpy-x-lvariant-JP"}, + {"ja-x-lvariant-JP"}, + {"th-TH-x-lvariant-TH", "th-TH-u-nu-thai-x-lvariant-TH"}, // special case 2 + {"th-TH-u-nu-thai-x-lvariant-TH"}, + {"en-US-x-lvariant-JP"}, + }; + + Builder bldr = new Builder(); + + for (String[] data : testdata) { + String in = data[0]; + String expected = (data.length == 1) ? data[0] : data[1]; + + // forLanguageTag + Locale loc = Locale.forLanguageTag(in); + String out = loc.toLanguageTag(); + assertEquals("Language tag roundtrip by forLanguageTag with input: " + in, expected, out); + + // setLanguageTag + bldr.clear(); + bldr.setLanguageTag(in); + loc = bldr.build(); + out = loc.toLanguageTag(); + assertEquals("Language tag roundtrip by Builder.setLanguageTag with input: " + in, expected, out); + } + } + /// /// utility asserts ///