From 70fa16f19fb6bde2c520fbc2b94515ff3813658c Mon Sep 17 00:00:00 2001 From: John Emmons Date: Thu, 6 May 2010 21:47:16 +0000 Subject: [PATCH] ICU-7438 Add handling of POSIX variant as u-va-posix language tag X-SVN-Rev: 28031 --- .../com/ibm/icu/impl/locale/LanguageTag.java | 27 ++++++++++++++++--- .../core/src/com/ibm/icu/util/ULocale.java | 7 ++++- .../ibm/icu/dev/test/util/ULocaleTest.java | 6 ++++- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LanguageTag.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LanguageTag.java index 39e549b1aed..4d952720a90 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LanguageTag.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LanguageTag.java @@ -1,6 +1,6 @@ /* ******************************************************************************* - * Copyright (C) 2009, International Business Machines Corporation and * + * Copyright (C) 2010, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -32,6 +32,8 @@ public class LanguageTag { private static final SortedMap EMPTY_EXTENSION_MAP = new TreeMap(); + private static final UnicodeLocaleExtension VA_POSIX = new UnicodeLocaleExtension().put("va", "posix"); + // // Language tag parser instances // @@ -269,6 +271,7 @@ public class LanguageTag { } public String getID() { + boolean putPosixExtension = false; if (_grandfathered.length() > 0) { return _grandfathered; } @@ -291,8 +294,20 @@ public class LanguageTag { } if (_variants.size() > 0) { for (String var : _variants) { - buf.append(SEP); - buf.append(var); + // Special handling of the POSIX variant - treat it as a unicode locale extension + if ( var.equals("posix")) { + if (_extensions.containsKey(UnicodeLocaleExtension.SINGLETON)){ + UnicodeLocaleExtension uext = (UnicodeLocaleExtension) _extensions.get(UnicodeLocaleExtension.SINGLETON); + uext.put("va","posix"); + _extensions.put(UnicodeLocaleExtension.SINGLETON, uext); + } else { + _extensions.put(UnicodeLocaleExtension.SINGLETON, VA_POSIX); + putPosixExtension = true; + } + } else { + buf.append(SEP); + buf.append(var); + } } } if (_extensions.size() > 0) { @@ -304,6 +319,12 @@ public class LanguageTag { buf.append(ext.getValue().getValue()); } } + + // If we added the POSIX extension explicitly, need to remove it here + // otherwise it will hang around until the next call. + if ( putPosixExtension ) { + _extensions.remove(UnicodeLocaleExtension.SINGLETON); + } } if (_privateuse.length() > 0) { if (buf.length() > 0) { diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/ULocale.java b/icu4j/main/classes/core/src/com/ibm/icu/util/ULocale.java index 2eb7c2e24b4..afc891c235e 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/util/ULocale.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/util/ULocale.java @@ -3106,7 +3106,12 @@ public final class ULocale implements Serializable { // convert to legacy key/type String lkey = bcp47ToLDMLKey(bcpKey); String ltype = bcp47ToLDMLType(lkey, bcpType); - kwds.put(lkey, ltype); + // special handling for u-va-posix, since this is a variant, not a keyword + if (lkey.equals("va") && ltype.equals("posix")) { + id = id + "_POSIX"; + } else { + kwds.put(lkey, ltype); + } } } else { kwds.put(String.valueOf(key), ext.getValue()); diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java index fca3374b8a1..c312e3bf5e4 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java @@ -3717,7 +3717,8 @@ public class ULocaleTest extends TestFmwk { {"en_US", "en-US"}, {"iw_IL", "he-IL"}, {"sr_Latn_SR", "sr-Latn-SR"}, - {"en__POSIX", "en-posix"}, + {"en_US_POSIX@ca=japanese", "en-US-u-ca-japanese-va-posix"}, + {"en__POSIX", "en-u-va-posix"}, // {"en_POSIX", "en"}, /* ICU4J locale parser successfully parse en_POSIX as language:en/variant:POSIX */ {"und_555", "und-555"}, {"123", "und"}, @@ -3744,6 +3745,8 @@ public class ULocaleTest extends TestFmwk { {"en@timezone=US/Eastern", "en-u-tz-usnyc"}, {"en@x=x-y-z;a=a-b-c", "en-x-x-y-z"}, {"it@collation=badcollationtype;colStrength=identical;cu=usd-eur", "it-u-ks-identic"}, + {"en_US_POSIX", "en-US-u-va-posix"}, + {"en_US_POSIX@calendar=japanese;currency=EUR","en-US-u-ca-japanese-cu-eur-va-posix"}, }; for (int i = 0; i < locale_to_langtag.length; i++) { @@ -3785,6 +3788,7 @@ public class ULocaleTest extends TestFmwk { {"und-varzero-var1-vartwo", "__VARZERO", Integer.valueOf(12)}, {"en-u-ca-gregory", "en@calendar=gregorian", NOERROR}, {"en-U-cu-USD", "en@currency=usd", NOERROR}, + {"en-us-u-va-posix", "en_US_POSIX", NOERROR}, {"ar-x-1-2-3", "ar@x=1-2-3", NOERROR}, {"fr-u-nu-latn-cu-eur", "fr@currency=eur;numbers=latn", NOERROR}, {"de-k-kext-u-co-phonebk-nu-latn", "de@collation=phonebook;k=kext;numbers=latn", NOERROR},