mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-10 07:39:16 +00:00
ICU-9162 Implemented getDisplayScript(), provided actual implementation of getVariant() [#9161]. Also improved the implementation of localized name provider to directly access localized data container classes. Added test cases to verify the behavior with locale extension [#9154].
X-SVN-Rev: 31606
This commit is contained in:
parent
849b2da11d
commit
0b1faa6ffa
11 changed files with 347 additions and 140 deletions
|
@ -10,24 +10,25 @@ import java.util.Locale;
|
|||
import java.util.spi.CurrencyNameProvider;
|
||||
|
||||
import com.ibm.icu.impl.javaspi.ICULocaleServiceProvider;
|
||||
import com.ibm.icu.util.Currency;
|
||||
import com.ibm.icu.text.CurrencyDisplayNames;
|
||||
|
||||
public class CurrencyNameProviderICU extends CurrencyNameProvider {
|
||||
|
||||
@Override
|
||||
public String getSymbol(String currencyCode, Locale locale) {
|
||||
Currency cur = Currency.getInstance(currencyCode);
|
||||
String sym = cur.getSymbol(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale));
|
||||
if (sym.length() == 0 || sym.equals(currencyCode)) {
|
||||
CurrencyDisplayNames curDispNames = CurrencyDisplayNames.getInstance(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale));
|
||||
String sym = curDispNames.getSymbol(currencyCode);
|
||||
if (sym == null || sym.equals(currencyCode)) {
|
||||
return null;
|
||||
}
|
||||
return sym;
|
||||
}
|
||||
|
||||
//@Override
|
||||
public String getDisplayName(String currencyCode, Locale locale) {
|
||||
Currency cur = Currency.getInstance(currencyCode);
|
||||
String name = cur.getDisplayName(locale);
|
||||
if (name.length() == 0 || name.equals(currencyCode)) {
|
||||
CurrencyDisplayNames curDispNames = CurrencyDisplayNames.getInstance(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale));
|
||||
String name = curDispNames.getName(currencyCode);
|
||||
if (name == null || name.equals(currencyCode)) {
|
||||
return null;
|
||||
}
|
||||
return name;
|
||||
|
|
|
@ -10,15 +10,17 @@ import java.util.Locale;
|
|||
import java.util.spi.LocaleNameProvider;
|
||||
|
||||
import com.ibm.icu.impl.javaspi.ICULocaleServiceProvider;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
import com.ibm.icu.impl.locale.AsciiUtil;
|
||||
import com.ibm.icu.text.LocaleDisplayNames;
|
||||
|
||||
public class LocaleNameProviderICU extends LocaleNameProvider {
|
||||
|
||||
@Override
|
||||
public String getDisplayCountry(String countryCode, Locale locale) {
|
||||
String id = "und_" + countryCode;
|
||||
String disp = ULocale.getDisplayCountry(id, ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale));
|
||||
if (disp.length() == 0 || disp.equals(countryCode)) {
|
||||
countryCode = AsciiUtil.toUpperString(countryCode);
|
||||
String disp = LocaleDisplayNames.getInstance(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale))
|
||||
.regionDisplayName(countryCode);
|
||||
if (disp == null || disp.length() == 0 || disp.equals(countryCode)) {
|
||||
return null;
|
||||
}
|
||||
return disp;
|
||||
|
@ -26,8 +28,21 @@ public class LocaleNameProviderICU extends LocaleNameProvider {
|
|||
|
||||
@Override
|
||||
public String getDisplayLanguage(String languageCode, Locale locale) {
|
||||
String disp = ULocale.getDisplayLanguage(languageCode, ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale));
|
||||
if (disp.length() == 0 || disp.equals(languageCode)) {
|
||||
languageCode = AsciiUtil.toLowerString(languageCode);
|
||||
String disp = LocaleDisplayNames.getInstance(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale))
|
||||
.languageDisplayName(languageCode);
|
||||
if (disp == null || disp.length() == 0 || disp.equals(languageCode)) {
|
||||
return null;
|
||||
}
|
||||
return disp;
|
||||
}
|
||||
|
||||
//@Override
|
||||
public String getDisplayScript(String scriptCode, Locale locale) {
|
||||
scriptCode = AsciiUtil.toTitleString(scriptCode);
|
||||
String disp = LocaleDisplayNames.getInstance(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale))
|
||||
.scriptDisplayName(scriptCode);
|
||||
if (disp == null || disp.length() == 0 || disp.equals(scriptCode)) {
|
||||
return null;
|
||||
}
|
||||
return disp;
|
||||
|
@ -35,13 +50,17 @@ public class LocaleNameProviderICU extends LocaleNameProvider {
|
|||
|
||||
@Override
|
||||
public String getDisplayVariant(String variant, Locale locale) {
|
||||
// ICU does not support JDK Locale variant names
|
||||
return null;
|
||||
variant = AsciiUtil.toUpperString(variant);
|
||||
String disp = LocaleDisplayNames.getInstance(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale))
|
||||
.variantDisplayName(variant);
|
||||
if (disp == null || disp.length() == 0 || disp.equals(variant)) {
|
||||
return null;
|
||||
}
|
||||
return disp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Locale[] getAvailableLocales() {
|
||||
return ICULocaleServiceProvider.getAvailableLocales();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -7,47 +7,36 @@
|
|||
package com.ibm.icu.impl.javaspi.util;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import com.ibm.icu.impl.javaspi.ICULocaleServiceProvider;
|
||||
import com.ibm.icu.lang.UCharacter;
|
||||
import com.ibm.icu.util.TimeZone;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
import com.ibm.icu.text.TimeZoneNames;
|
||||
import com.ibm.icu.text.TimeZoneNames.NameType;
|
||||
|
||||
public class TimeZoneNameProviderICU extends java.util.spi.TimeZoneNameProvider {
|
||||
|
||||
@Override
|
||||
public String getDisplayName(String ID, boolean daylight, int style, Locale locale) {
|
||||
TimeZone tz = TimeZone.getFrozenTimeZone(ID);
|
||||
ULocale actualLocale = ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale);
|
||||
String disp = tz.getDisplayName(daylight, style, actualLocale);
|
||||
if (disp.length() == 0) {
|
||||
return null;
|
||||
}
|
||||
// This is ugly hack, but no simple solution to check if
|
||||
// the localized name was picked up.
|
||||
int numDigits = 0;
|
||||
for (int i = 0; i < disp.length(); i++) {
|
||||
char c = disp.charAt(i);
|
||||
if (UCharacter.isDigit(c)) {
|
||||
numDigits++;
|
||||
String dispName = null;
|
||||
boolean[] isSystemID = new boolean[1];
|
||||
String canonicalID = com.ibm.icu.util.TimeZone.getCanonicalID(ID, isSystemID);
|
||||
if (isSystemID[0]) {
|
||||
long date = System.currentTimeMillis();
|
||||
TimeZoneNames tznames = TimeZoneNames.getInstance(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale));
|
||||
switch (style) {
|
||||
case TimeZone.LONG:
|
||||
dispName = daylight ?
|
||||
tznames.getDisplayName(canonicalID, NameType.LONG_DAYLIGHT, date) :
|
||||
tznames.getDisplayName(canonicalID, NameType.LONG_STANDARD, date);
|
||||
break;
|
||||
case TimeZone.SHORT:
|
||||
dispName = daylight ?
|
||||
tznames.getDisplayName(canonicalID, NameType.SHORT_DAYLIGHT, date) :
|
||||
tznames.getDisplayName(canonicalID, NameType.SHORT_STANDARD, date);
|
||||
break;
|
||||
}
|
||||
}
|
||||
// If there are more than 3 numbers, this code assume GMT format was used.
|
||||
if (numDigits >= 3) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (daylight) {
|
||||
// ICU uses standard name for daylight name when the zone does not use
|
||||
// daylight saving time.
|
||||
|
||||
// This is yet another ugly hack to support the JDK's behavior
|
||||
String stdDisp = tz.getDisplayName(false, style, actualLocale);
|
||||
if (disp.equals(stdDisp)) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return disp;
|
||||
return dispName;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*******************************************************************************
|
||||
* Copyright (C) 2008, International Business Machines Corporation and *
|
||||
* Copyright (C) 2008-2012, International Business Machines Corporation and *
|
||||
* others. All Rights Reserved. *
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
@ -11,6 +11,8 @@ import java.text.Collator;
|
|||
import java.util.Locale;
|
||||
|
||||
import com.ibm.icu.dev.test.TestFmwk;
|
||||
import com.ibm.icu.impl.jdkadapter.CollatorICU;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
|
||||
public class CollatorTest extends TestFmwk {
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
@ -129,4 +131,29 @@ public class CollatorTest extends TestFmwk {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void TestCollationKeyword() {
|
||||
// ICU provider variant is appended
|
||||
ULocale uloc0 = new ULocale("de_DE_" + TestUtil.ICU_VARIANT + "@collation=phonebook");
|
||||
Locale loc = uloc0.toLocale();
|
||||
// On Java 7+, locale extension is preserved
|
||||
ULocale uloc = ULocale.forLocale(loc);
|
||||
String nsType = uloc.getKeywordValue("collation");
|
||||
if (nsType == null) {
|
||||
// Java 6 - skip this test
|
||||
return;
|
||||
}
|
||||
|
||||
Collator jdkColl = Collator.getInstance(loc);
|
||||
boolean isPhonebook = false;
|
||||
if (jdkColl instanceof CollatorICU) {
|
||||
ULocale ulocJdkColl = ((CollatorICU)jdkColl).unwrap().getLocale(ULocale.VALID_LOCALE);
|
||||
if (ulocJdkColl.getKeywordValue("collation").equals("phonebook")) {
|
||||
isPhonebook = true;
|
||||
}
|
||||
}
|
||||
if (!isPhonebook) {
|
||||
errln("FAIL: The collation type is not phonebook");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*******************************************************************************
|
||||
* Copyright (C) 2008, International Business Machines Corporation and *
|
||||
* Copyright (C) 2008-2012, International Business Machines Corporation and *
|
||||
* others. All Rights Reserved. *
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
@ -10,6 +10,7 @@ import java.text.DateFormatSymbols;
|
|||
import java.util.Locale;
|
||||
|
||||
import com.ibm.icu.dev.test.TestFmwk;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
|
||||
public class DateFormatSymbolsTest extends TestFmwk {
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
@ -180,4 +181,25 @@ public class DateFormatSymbolsTest extends TestFmwk {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void TestCalendarKeyword() {
|
||||
// ICU provider variant is appended
|
||||
ULocale uloc0 = new ULocale("en_US_" + TestUtil.ICU_VARIANT + "@calendar=japanese");
|
||||
Locale loc = uloc0.toLocale();
|
||||
// On Java 7+, locale extension is preserved
|
||||
ULocale uloc = ULocale.forLocale(loc);
|
||||
String calType = uloc.getKeywordValue("calendar");
|
||||
if (calType == null) {
|
||||
// Java 6 - skip this test
|
||||
return;
|
||||
}
|
||||
|
||||
DateFormatSymbols jdkDfs = DateFormatSymbols.getInstance(loc);
|
||||
com.ibm.icu.text.DateFormatSymbols icuDfs = com.ibm.icu.text.DateFormatSymbols.getInstance(uloc);
|
||||
|
||||
// Check the length of era, so we can check if Japanese calendar is picked up
|
||||
if (jdkDfs.getEras().length != icuDfs.getEras().length) {
|
||||
errln("FAIL: Calendar keyword was ignored");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*******************************************************************************
|
||||
* Copyright (C) 2008, International Business Machines Corporation and *
|
||||
* Copyright (C) 2008-2012, International Business Machines Corporation and *
|
||||
* others. All Rights Reserved. *
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
@ -8,10 +8,13 @@ package com.ibm.icu.dev.test.localespi;
|
|||
|
||||
import java.text.DateFormat;
|
||||
import java.text.ParseException;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
|
||||
import com.ibm.icu.dev.test.TestFmwk;
|
||||
import com.ibm.icu.impl.jdkadapter.CalendarICU;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
|
||||
public class DateFormatTest extends TestFmwk {
|
||||
|
||||
|
@ -193,4 +196,28 @@ public class DateFormatTest extends TestFmwk {
|
|||
errln("FAIL: ICU DateFormat returned a result different from JDK for th_TH_TH");
|
||||
}
|
||||
}
|
||||
|
||||
public void TestCalendarKeyword() {
|
||||
// ICU provider variant is appended
|
||||
ULocale uloc0 = new ULocale("en_US_" + TestUtil.ICU_VARIANT + "@calendar=buddhist");
|
||||
Locale loc = uloc0.toLocale();
|
||||
// On Java 7+, locale extension is preserved
|
||||
ULocale uloc = ULocale.forLocale(loc);
|
||||
String calType = uloc.getKeywordValue("calendar");
|
||||
if (calType == null) {
|
||||
// Java 6 - skip this test
|
||||
return;
|
||||
}
|
||||
|
||||
DateFormat jdkDfmt = DateFormat.getDateInstance(DateFormat.FULL, loc);
|
||||
Calendar cal = jdkDfmt.getCalendar();
|
||||
boolean isBuddhist = false;
|
||||
if (cal instanceof CalendarICU) {
|
||||
com.ibm.icu.util.Calendar icuCal = ((CalendarICU)cal).unwrap();
|
||||
isBuddhist = icuCal.getType().equals("buddhist");
|
||||
}
|
||||
if (!isBuddhist) {
|
||||
errln("FAIL: Calendar types is not Buddhist");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import java.util.Currency;
|
|||
import java.util.Locale;
|
||||
|
||||
import com.ibm.icu.dev.test.TestFmwk;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
|
||||
public class DecimalFormatSymbolsTest extends TestFmwk {
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
@ -156,4 +157,30 @@ public class DecimalFormatSymbolsTest extends TestFmwk {
|
|||
checkEquivalence(decfs.getPerMill(), decfsEnUS.getPerMill(), loc, "getPerMill");
|
||||
checkEquivalence(decfs.getZeroDigit(), decfsEnUS.getZeroDigit(), loc, "getZeroDigit");
|
||||
}
|
||||
|
||||
public void TestKeywords() {
|
||||
// ICU provider variant is appended
|
||||
ULocale uloc0 = new ULocale("en_US_" + TestUtil.ICU_VARIANT + "@numbers=Arab;currency=EUR");
|
||||
Locale loc = uloc0.toLocale();
|
||||
// On Java 7+, locale extension is preserved
|
||||
ULocale uloc = ULocale.forLocale(loc);
|
||||
String nsType = uloc.getKeywordValue("numbers");
|
||||
if (nsType == null) {
|
||||
// Java 6 - skip this test
|
||||
return;
|
||||
}
|
||||
|
||||
DecimalFormatSymbols jdkDecfs = DecimalFormatSymbols.getInstance(loc);
|
||||
com.ibm.icu.text.DecimalFormatSymbols icuDecfs = com.ibm.icu.text.DecimalFormatSymbols.getInstance(uloc);
|
||||
// Check digit 0
|
||||
if (jdkDecfs.getDigit() != icuDecfs.getDigit()) {
|
||||
errln("FAIL: Different decimal digit - via JDK: " + jdkDecfs.getDigit() + ", with ICU: " + icuDecfs.getDigit());
|
||||
}
|
||||
|
||||
String jdkCurrencyCode = jdkDecfs.getCurrency().getCurrencyCode();
|
||||
String icuCurrencyCode = icuDecfs.getCurrency().getCurrencyCode();
|
||||
if (!jdkCurrencyCode.equals(icuCurrencyCode)) {
|
||||
errln("FAIL: Different currency code - via JDK: " + jdkCurrencyCode + ", with ICU: " + icuCurrencyCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,10 @@
|
|||
*/
|
||||
package com.ibm.icu.dev.test.localespi;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.HashSet;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
|
||||
import com.ibm.icu.dev.test.TestFmwk;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
|
@ -16,6 +19,18 @@ public class LocaleNameTest extends TestFmwk {
|
|||
new LocaleNameTest().run(args);
|
||||
}
|
||||
|
||||
private static final Method GETDISPLAYSCRIPT_METHOD;
|
||||
|
||||
static {
|
||||
Method mGetDisplayScript = null;
|
||||
try {
|
||||
mGetDisplayScript = Locale.class.getMethod("getDisplayScript", new Class[] {Locale.class});
|
||||
} catch (Exception e) {
|
||||
// fall through
|
||||
}
|
||||
GETDISPLAYSCRIPT_METHOD = mGetDisplayScript;
|
||||
}
|
||||
|
||||
public void TestLanguageNames() {
|
||||
Locale[] locales = Locale.getAvailableLocales();
|
||||
StringBuffer icuid = new StringBuffer();
|
||||
|
@ -76,6 +91,67 @@ public class LocaleNameTest extends TestFmwk {
|
|||
}
|
||||
}
|
||||
|
||||
public void TestScriptNames() {
|
||||
if (GETDISPLAYSCRIPT_METHOD == null) {
|
||||
logln("INFO: Locale#getDisplayScript(Locale) is not available.");
|
||||
return;
|
||||
}
|
||||
|
||||
Locale[] locales = Locale.getAvailableLocales();
|
||||
for (Locale inLocale : locales) {
|
||||
if (TestUtil.isProblematicIBMLocale(inLocale)) {
|
||||
logln("Skipped " + inLocale);
|
||||
continue;
|
||||
}
|
||||
|
||||
ULocale inULocale = ULocale.forLocale(inLocale);
|
||||
Locale inLocaleICU = TestUtil.toICUExtendedLocale(inLocale);
|
||||
for (ULocale forULocale : ULocale.getAvailableLocales()) {
|
||||
if (forULocale.getScript().length() == 0) {
|
||||
continue;
|
||||
}
|
||||
Locale forLocale = forULocale.toLocale();
|
||||
String icuname = forULocale.getDisplayScript(inULocale);
|
||||
if (icuname.equals(forULocale.getScript()) || icuname.length() == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String name = null;
|
||||
try {
|
||||
name = (String)GETDISPLAYSCRIPT_METHOD.invoke(forLocale, new Object[] {inLocale});
|
||||
} catch (Exception e) {
|
||||
errln("FAIL: JDK Locale#getDisplayScript(\"" + inLocale + "\") throws exception: " + e.getMessage());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (TestUtil.isICUExtendedLocale(inLocale)) {
|
||||
// The name should be taken from ICU
|
||||
if (!name.equals(icuname)) {
|
||||
errln("FAIL: Script name by ICU is " + icuname + ", but got " + name
|
||||
+ " for locale " + forLocale + " in locale " + inLocale);
|
||||
}
|
||||
} else {
|
||||
// The name might be taken from JDK
|
||||
if (!name.equals(icuname)) {
|
||||
logln("INFO: Script name by JDK is " + name + ", but " + icuname +
|
||||
" in ICU, for locale " + forLocale + " in locale " + inLocale);
|
||||
}
|
||||
// Try explicit ICU locale (xx_yy_ICU)
|
||||
try {
|
||||
name = (String)GETDISPLAYSCRIPT_METHOD.invoke(forLocale, new Object[] {inLocaleICU});
|
||||
} catch (Exception e) {
|
||||
errln("FAIL: JDK Locale#getDisplayScript(\"" + inLocaleICU + "\") throws exception: " + e.getMessage());
|
||||
continue;
|
||||
}
|
||||
if (!name.equals(icuname)) {
|
||||
errln("FAIL: Script name by ICU is " + icuname + ", but got " + name
|
||||
+ " for locale " + forLocale + " in locale " + inLocaleICU);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void TestCountryNames() {
|
||||
Locale[] locales = Locale.getAvailableLocales();
|
||||
for (Locale inLocale : locales) {
|
||||
|
@ -121,29 +197,22 @@ public class LocaleNameTest extends TestFmwk {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public void TestVariantNames() {
|
||||
// [Note]
|
||||
// This test passed OK without any error for several reasons.
|
||||
// When I changed ICU provider's special variant from "ICU" to
|
||||
// "ICU4J" (#9155), this test started failing. The primary
|
||||
// reason was mis-use of ULocale.getDisplayVariant(String, ULocale)
|
||||
// in the test code below. The first argument should be complete
|
||||
// locale ID, not variant only string. However, fixing this won't
|
||||
// resolve the issue because of another ICU bug (multiple variant subtag
|
||||
// issue #9160).
|
||||
//
|
||||
// Actually, we do not have LocaleNameProvider#getDisplayVariant
|
||||
// implementation (#9161). The current implementation always returns
|
||||
// null. So, the test case below happened to work, but it did not
|
||||
// check anything meaningful. For now, the test case is disabled.
|
||||
// We'll revisit this test case when #9160 and #9161 are resolved.
|
||||
// 2012-03-01 yoshito
|
||||
logln("ICU does not support LocaleNameProvider#getDisplayVariant");
|
||||
if (true) return;
|
||||
Set<Locale> locales = new HashSet<Locale>();
|
||||
for (Locale l : Locale.getAvailableLocales()) {
|
||||
locales.add(l);
|
||||
}
|
||||
// Add some locales with variant
|
||||
final Locale[] additionalLocales = {
|
||||
new Locale("fr", "FR", "1694acad"),
|
||||
new Locale("de", "DE", "1901"),
|
||||
new Locale("en", "US", "boont"),
|
||||
new Locale("el", "GR", "monoton"),
|
||||
};
|
||||
for (Locale l : additionalLocales) {
|
||||
locales.add(l);
|
||||
}
|
||||
|
||||
Locale[] locales = Locale.getAvailableLocales();
|
||||
StringBuffer icuid = new StringBuffer();
|
||||
for (Locale inLocale : locales) {
|
||||
if (TestUtil.isProblematicIBMLocale(inLocale)) {
|
||||
logln("Skipped " + inLocale);
|
||||
|
@ -153,48 +222,47 @@ public class LocaleNameTest extends TestFmwk {
|
|||
ULocale inULocale = ULocale.forLocale(inLocale);
|
||||
Locale inLocaleICU = TestUtil.toICUExtendedLocale(inLocale);
|
||||
for (Locale forLocale : locales) {
|
||||
if (forLocale.getVariant().length() == 0) {
|
||||
continue;
|
||||
}
|
||||
icuid.setLength(0);
|
||||
icuid.append(forLocale.getLanguage());
|
||||
String country = forLocale.getCountry();
|
||||
String variant = forLocale.getVariant();
|
||||
if (country.length() != 0) {
|
||||
icuid.append("_");
|
||||
icuid.append(country);
|
||||
}
|
||||
if (variant.length() != 0) {
|
||||
if (country.length() == 0) {
|
||||
icuid.append("_");
|
||||
}
|
||||
icuid.append("_");
|
||||
icuid.append(variant);
|
||||
}
|
||||
ULocale forULocale = new ULocale(icuid.toString());
|
||||
// String icuname = ULocale.getDisplayVariant(forULocale.getVariant(), inULocale);
|
||||
String icuname = forULocale.getDisplayVariant(inULocale);
|
||||
if (icuname.equals(forULocale.getVariant()) || icuname.length() == 0) {
|
||||
String locVar = forLocale.getVariant();
|
||||
if (locVar.length() == 0) {
|
||||
continue;
|
||||
}
|
||||
// Note: JDK resolves a display name for each variant subtag
|
||||
String[] locVarSubtags = locVar.split("_");
|
||||
|
||||
String name = forLocale.getDisplayVariant(inLocale);
|
||||
if (TestUtil.isICUExtendedLocale(inLocale)) {
|
||||
// The name should be taken from ICU
|
||||
if (!name.equals(icuname)) {
|
||||
errln("FAIL: Variant name by ICU is " + icuname + ", but got " + name
|
||||
+ " for locale " + forLocale + " in locale " + inLocale);
|
||||
for (String locSingleVar : locVarSubtags) {
|
||||
if (locSingleVar.equals(TestUtil.ICU_VARIANT)) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (!name.equals(icuname)) {
|
||||
logln("INFO: Variant name by JDK is " + name + ", but " + icuname +
|
||||
" in ICU, for locale " + forLocale + " in locale " + inLocale);
|
||||
Locale forLocaleSingleVar = new Locale(forLocale.getLanguage(), forLocale.getCountry(), locSingleVar);
|
||||
ULocale forULocaleSingleVar = new ULocale("und_ZZ_" + locSingleVar);
|
||||
String icuname = forULocaleSingleVar.getDisplayVariant(inULocale);
|
||||
if (icuname.equals(locSingleVar) || icuname.length() == 0) {
|
||||
continue;
|
||||
}
|
||||
// Try explicit ICU locale (xx_yy_ICU)
|
||||
name = forLocale.getDisplayVariant(inLocaleICU);
|
||||
if (!name.equals(icuname)) {
|
||||
errln("FAIL: Variant name by ICU is " + icuname + ", but got " + name
|
||||
+ " for locale " + forLocale + " in locale " + inLocaleICU);
|
||||
|
||||
String name = forLocaleSingleVar.getDisplayVariant(inLocale);
|
||||
if (name.equalsIgnoreCase(locSingleVar)) {
|
||||
// ICU does not have any localized display name.
|
||||
// Note: ICU turns variant to upper case string, while Java does not.
|
||||
continue;
|
||||
}
|
||||
if (TestUtil.isICUExtendedLocale(inLocale)) {
|
||||
// The name should be taken from ICU
|
||||
if (!name.equals(icuname)) {
|
||||
errln("FAIL: Variant name by ICU is " + icuname + ", but got " + name
|
||||
+ " for locale " + forLocaleSingleVar + " in locale " + inLocale);
|
||||
}
|
||||
} else {
|
||||
if (!name.equals(icuname)) {
|
||||
logln("INFO: Variant name by JDK is " + name + ", but " + icuname +
|
||||
" in ICU, for locale " + forLocaleSingleVar + " in locale " + inLocale);
|
||||
}
|
||||
// Try explicit ICU locale (xx_yy_ICU)
|
||||
name = forLocaleSingleVar.getDisplayVariant(inLocaleICU);
|
||||
if (!name.equals(icuname)) {
|
||||
errln("FAIL: Variant name by ICU is " + icuname + ", but got " + name
|
||||
+ " for locale " + forLocaleSingleVar + " in locale " + inLocaleICU);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*******************************************************************************
|
||||
* Copyright (C) 2008, International Business Machines Corporation and *
|
||||
* Copyright (C) 2008-2012, International Business Machines Corporation and *
|
||||
* others. All Rights Reserved. *
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
@ -13,6 +13,7 @@ import java.text.ParseException;
|
|||
import java.util.Locale;
|
||||
|
||||
import com.ibm.icu.dev.test.TestFmwk;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
|
||||
public class NumberFormatTest extends TestFmwk {
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
@ -288,4 +289,28 @@ public class NumberFormatTest extends TestFmwk {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void TestKeywords() {
|
||||
// ICU provider variant is appended
|
||||
ULocale uloc0 = new ULocale("en_US_" + TestUtil.ICU_VARIANT + "@numbers=Arab;currency=EUR");
|
||||
Locale loc = uloc0.toLocale();
|
||||
// On Java 7+, locale extension is preserved
|
||||
ULocale uloc = ULocale.forLocale(loc);
|
||||
String nsType = uloc.getKeywordValue("numbers");
|
||||
if (nsType == null) {
|
||||
// Java 6 - skip this test
|
||||
return;
|
||||
}
|
||||
|
||||
NumberFormat jdkNfmt = NumberFormat.getCurrencyInstance(loc);
|
||||
com.ibm.icu.text.NumberFormat icuNfmt = com.ibm.icu.text.NumberFormat.getCurrencyInstance(uloc);
|
||||
|
||||
final double num = 12345.67d;
|
||||
String jdkOut = jdkNfmt.format(num);
|
||||
String icuOut = icuNfmt.format(num);
|
||||
|
||||
if (!jdkOut.equals(icuOut)) {
|
||||
errln("FAIL: JDK number format with Locale " + loc + " is " + jdkOut + ", expected: " + icuOut);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ import com.ibm.icu.util.ULocale.Builder;
|
|||
|
||||
public class TestUtil {
|
||||
|
||||
private static final String ICU_VARIANT = "ICU4J";
|
||||
static final String ICU_VARIANT = "ICU4J";
|
||||
private static final String ICU_VARIANT_SUFFIX = "_ICU4J";
|
||||
|
||||
public static Locale toICUExtendedLocale(Locale locale) {
|
||||
|
|
|
@ -10,7 +10,8 @@ import java.util.Locale;
|
|||
import java.util.TimeZone;
|
||||
|
||||
import com.ibm.icu.dev.test.TestFmwk;
|
||||
import com.ibm.icu.lang.UCharacter;
|
||||
import com.ibm.icu.text.TimeZoneNames;
|
||||
import com.ibm.icu.text.TimeZoneNames.NameType;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
|
||||
public class TimeZoneNameTest extends TestFmwk {
|
||||
|
@ -29,16 +30,13 @@ public class TimeZoneNameTest extends TestFmwk {
|
|||
}
|
||||
|
||||
for (String tzid : tzids) {
|
||||
com.ibm.icu.util.TimeZone tzIcu = com.ibm.icu.util.TimeZone.getTimeZone(tzid);
|
||||
|
||||
// Java does not pick up time zone names for ID/Locale from an SPI
|
||||
// when long standard display name is not available.
|
||||
|
||||
String icuStdLong = getIcuDisplayName(tzIcu, false, TimeZone.LONG, loc);
|
||||
String icuStdLong = getIcuDisplayName(tzid, false, TimeZone.LONG, loc);
|
||||
if (icuStdLong != null) {
|
||||
TimeZone tz = TimeZone.getTimeZone(tzid);
|
||||
checkDisplayNamePair(TimeZone.SHORT, tz, tzIcu, loc, warningOnly);
|
||||
checkDisplayNamePair(TimeZone.LONG, tz, tzIcu, loc, warningOnly);
|
||||
checkDisplayNamePair(TimeZone.SHORT, tzid, loc, warningOnly);
|
||||
checkDisplayNamePair(TimeZone.LONG, tzid, loc, warningOnly);
|
||||
} else {
|
||||
logln("Localized long standard name is not available for "
|
||||
+ tzid + " in locale " + loc + " in ICU");
|
||||
|
@ -47,7 +45,7 @@ public class TimeZoneNameTest extends TestFmwk {
|
|||
}
|
||||
}
|
||||
|
||||
private void checkDisplayNamePair(int style, TimeZone tz, com.ibm.icu.util.TimeZone icuTz, Locale loc, boolean warnOnly) {
|
||||
private void checkDisplayNamePair(int style, String tzid, Locale loc, boolean warnOnly) {
|
||||
/* Note: There are two problems here.
|
||||
*
|
||||
* It looks Java 6 requires a TimeZoneNameProvider to return both standard name and daylight name
|
||||
|
@ -60,36 +58,40 @@ public class TimeZoneNameTest extends TestFmwk {
|
|||
* saving time even daylight name is requested.
|
||||
*/
|
||||
|
||||
String icuStdName = getIcuDisplayName(icuTz, false, style, loc);
|
||||
String icuDstName = getIcuDisplayName(icuTz, true, style, loc);
|
||||
String icuStdName = getIcuDisplayName(tzid, false, style, loc);
|
||||
String icuDstName = getIcuDisplayName(tzid, true, style, loc);
|
||||
if (icuStdName != null && icuDstName != null && !icuStdName.equals(icuDstName)) {
|
||||
checkDisplayName(false, style, tz, loc, icuStdName, warnOnly);
|
||||
checkDisplayName(true, style, tz, loc, icuDstName, warnOnly);
|
||||
checkDisplayName(false, style, tzid, loc, icuStdName, warnOnly);
|
||||
checkDisplayName(true, style, tzid, loc, icuDstName, warnOnly);
|
||||
}
|
||||
}
|
||||
|
||||
private String getIcuDisplayName(com.ibm.icu.util.TimeZone icuTz, boolean daylight, int style, Locale loc) {
|
||||
ULocale uloc = ULocale.forLocale(loc);
|
||||
boolean shortStyle = (style == TimeZone.SHORT);
|
||||
String icuname = icuTz.getDisplayName(daylight,
|
||||
(shortStyle ? com.ibm.icu.util.TimeZone.SHORT : com.ibm.icu.util.TimeZone.LONG),
|
||||
uloc);
|
||||
int numDigits = 0;
|
||||
for (int i = 0; i < icuname.length(); i++) {
|
||||
if (UCharacter.isDigit(icuname.charAt(i))) {
|
||||
numDigits++;
|
||||
private String getIcuDisplayName(String tzid, boolean daylight, int style, Locale loc) {
|
||||
String icuName = null;
|
||||
boolean[] isSystemID = new boolean[1];
|
||||
String canonicalID = com.ibm.icu.util.TimeZone.getCanonicalID(tzid, isSystemID);
|
||||
if (isSystemID[0]) {
|
||||
long date = System.currentTimeMillis();
|
||||
TimeZoneNames tznames = TimeZoneNames.getInstance(ULocale.forLocale(loc));
|
||||
switch (style) {
|
||||
case TimeZone.LONG:
|
||||
icuName = daylight ?
|
||||
tznames.getDisplayName(canonicalID, NameType.LONG_DAYLIGHT, date) :
|
||||
tznames.getDisplayName(canonicalID, NameType.LONG_STANDARD, date);
|
||||
break;
|
||||
case TimeZone.SHORT:
|
||||
icuName = daylight ?
|
||||
tznames.getDisplayName(canonicalID, NameType.SHORT_DAYLIGHT, date) :
|
||||
tznames.getDisplayName(canonicalID, NameType.SHORT_STANDARD, date);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (numDigits >= 3) {
|
||||
// ICU does not have the localized name
|
||||
return null;
|
||||
}
|
||||
return icuname;
|
||||
return icuName;
|
||||
}
|
||||
|
||||
private void checkDisplayName(boolean daylight, int style, TimeZone tz, Locale loc, String icuname, boolean warnOnly) {
|
||||
private void checkDisplayName(boolean daylight, int style, String tzid, Locale loc, String icuname, boolean warnOnly) {
|
||||
String styleStr = (style == TimeZone.SHORT) ? "SHORT" : "LONG";
|
||||
|
||||
TimeZone tz = TimeZone.getTimeZone(tzid);
|
||||
String name = tz.getDisplayName(daylight, style, loc);
|
||||
|
||||
if (TestUtil.isICUExtendedLocale(loc)) {
|
||||
|
|
Loading…
Add table
Reference in a new issue