diff options
author | Elliott Hughes <enh@google.com> | 2014-05-08 00:38:56 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-05-08 00:38:56 +0000 |
commit | 5b8b1ea0a23702a376c996bac57cddaaf1d9b39b (patch) | |
tree | 0f9245ce70d8af3b55490d4f899afc79b5031e47 /luni | |
parent | 5a9c2b9e273e976c8a8e81357fe290077b766fec (diff) | |
parent | 3879b91e1baee17ecd51c653200ebdafc011020c (diff) | |
download | libcore-5b8b1ea0a23702a376c996bac57cddaaf1d9b39b.zip libcore-5b8b1ea0a23702a376c996bac57cddaaf1d9b39b.tar.gz libcore-5b8b1ea0a23702a376c996bac57cddaaf1d9b39b.tar.bz2 |
Merge "Ensure consistent (backwards-compatible) capitalization for yesterday/today/tomorrow."
Diffstat (limited to 'luni')
-rw-r--r-- | luni/src/main/native/libcore_icu_ICU.cpp | 51 | ||||
-rw-r--r-- | luni/src/test/java/libcore/icu/LocaleDataTest.java | 208 |
2 files changed, 133 insertions, 126 deletions
diff --git a/luni/src/main/native/libcore_icu_ICU.cpp b/luni/src/main/native/libcore_icu_ICU.cpp index 9dc1cae..f1e0b9d 100644 --- a/luni/src/main/native/libcore_icu_ICU.cpp +++ b/luni/src/main/native/libcore_icu_ICU.cpp @@ -27,6 +27,7 @@ #include "UniquePtr.h" #include "cutils/log.h" #include "toStringArray.h" +#include "unicode/brkiter.h" #include "unicode/calendar.h" #include "unicode/datefmt.h" #include "unicode/dcfmtsym.h" @@ -414,17 +415,6 @@ static void setStringField(JNIEnv* env, jobject obj, const char* fieldName, URes } } -static void setStringField(JNIEnv* env, jobject obj, const char* fieldName, UResourceBundle* bundle, const char* key) { - UErrorCode status = U_ZERO_ERROR; - int charCount; - const UChar* chars = ures_getStringByKey(bundle, key, &charCount, &status); - if (U_SUCCESS(status)) { - setStringField(env, obj, fieldName, env->NewString(chars, charCount)); - } else { - ALOGE("Error setting String field %s from ICU resource (key %s): %s", fieldName, key, u_errorName(status)); - } -} - static void setCharField(JNIEnv* env, jobject obj, const char* fieldName, const UnicodeString& value) { if (value.length() == 0) { return; @@ -535,32 +525,38 @@ static bool getDateTimePatterns(JNIEnv* env, jobject localeData, const char* loc return true; } -static bool getYesterdayTodayAndTomorrow(JNIEnv* env, jobject localeData, const char* locale_name) { +static bool getYesterdayTodayAndTomorrow(JNIEnv* env, jobject localeData, Locale& locale, const char* locale_name) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle root(ures_open(NULL, locale_name, &status)); - if (U_FAILURE(status)) { - return false; - } ScopedResourceBundle fields(ures_getByKey(root.get(), "fields", NULL, &status)); + ScopedResourceBundle day(ures_getByKey(fields.get(), "day", NULL, &status)); + ScopedResourceBundle relative(ures_getByKey(day.get(), "relative", NULL, &status)); if (U_FAILURE(status)) { return false; } - ScopedResourceBundle day(ures_getByKey(fields.get(), "day", NULL, &status)); + + UnicodeString yesterday(ures_getUnicodeStringByKey(relative.get(), "-1", &status)); + UnicodeString today(ures_getUnicodeStringByKey(relative.get(), "0", &status)); + UnicodeString tomorrow(ures_getUnicodeStringByKey(relative.get(), "1", &status)); if (U_FAILURE(status)) { + ALOGE("Error getting yesterday/today/tomorrow: %s", u_errorName(status)); return false; } - ScopedResourceBundle relative(ures_getByKey(day.get(), "relative", NULL, &status)); + + // We title-case the strings so they have consistent capitalization (http://b/14493853). + UniquePtr<BreakIterator> brk(BreakIterator::createSentenceInstance(locale, status)); if (U_FAILURE(status)) { + ALOGE("Error getting yesterday/today/tomorrow break iterator: %s", u_errorName(status)); return false; } - // bn_BD only has a "-2" entry. - if (relative.hasKey("-1") && relative.hasKey("0") && relative.hasKey("1")) { - setStringField(env, localeData, "yesterday", relative.get(), "-1"); - setStringField(env, localeData, "today", relative.get(), "0"); - setStringField(env, localeData, "tomorrow", relative.get(), "1"); - return true; - } - return false; + yesterday.toTitle(brk.get(), locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); + today.toTitle(brk.get(), locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); + tomorrow.toTitle(brk.get(), locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); + + setStringField(env, localeData, "yesterday", yesterday); + setStringField(env, localeData, "today", today); + setStringField(env, localeData, "tomorrow", tomorrow); + return true; } static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLocaleName, jobject localeData) { @@ -572,6 +568,8 @@ static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLocale return JNI_FALSE; // ICU has a fixed-length limit. } + Locale locale = getLocale(env, javaLocaleName); + // Get the DateTimePatterns. UErrorCode status = U_ZERO_ERROR; bool foundDateTimePatterns = false; @@ -589,7 +587,7 @@ static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLocale // Get the "Yesterday", "Today", and "Tomorrow" strings. bool foundYesterdayTodayAndTomorrow = false; for (LocaleNameIterator it(localeName.c_str(), status); it.HasNext(); it.Up()) { - if (getYesterdayTodayAndTomorrow(env, localeData, it.Get())) { + if (getYesterdayTodayAndTomorrow(env, localeData, locale, it.Get())) { foundYesterdayTodayAndTomorrow = true; break; } @@ -600,7 +598,6 @@ static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLocale } status = U_ZERO_ERROR; - Locale locale = getLocale(env, javaLocaleName); UniquePtr<Calendar> cal(Calendar::createInstance(locale, status)); if (U_FAILURE(status)) { return JNI_FALSE; diff --git a/luni/src/test/java/libcore/icu/LocaleDataTest.java b/luni/src/test/java/libcore/icu/LocaleDataTest.java index 559744c..b692f34 100644 --- a/luni/src/test/java/libcore/icu/LocaleDataTest.java +++ b/luni/src/test/java/libcore/icu/LocaleDataTest.java @@ -19,104 +19,114 @@ package libcore.icu; import java.util.Locale; public class LocaleDataTest extends junit.framework.TestCase { - public void testAll() throws Exception { - // Test that we can get the locale data for all known locales. - for (Locale l : Locale.getAvailableLocales()) { - LocaleData d = LocaleData.get(l); - // System.err.format("%10s %10s %10s\n", l, d.timeFormat12, d.timeFormat24); - } - } - - public void test_en_US() throws Exception { - LocaleData l = LocaleData.get(Locale.US); - assertEquals("AM", l.amPm[0]); - assertEquals("BC", l.eras[0]); - - assertEquals("January", l.longMonthNames[0]); - assertEquals("Jan", l.shortMonthNames[0]); - assertEquals("J", l.tinyMonthNames[0]); - - assertEquals("January", l.longStandAloneMonthNames[0]); - assertEquals("Jan", l.shortStandAloneMonthNames[0]); - assertEquals("J", l.tinyStandAloneMonthNames[0]); - - assertEquals("Sunday", l.longWeekdayNames[1]); - assertEquals("Sun", l.shortWeekdayNames[1]); - assertEquals("S", l.tinyWeekdayNames[1]); - - assertEquals("Sunday", l.longStandAloneWeekdayNames[1]); - assertEquals("Sun", l.shortStandAloneWeekdayNames[1]); - assertEquals("S", l.tinyStandAloneWeekdayNames[1]); - - assertEquals("yesterday", l.yesterday); - assertEquals("today", l.today); - assertEquals("tomorrow", l.tomorrow); - } - - public void test_de_DE() throws Exception { - LocaleData l = LocaleData.get(new Locale("de", "DE")); - - assertEquals("Gestern", l.yesterday); - assertEquals("Heute", l.today); - assertEquals("Morgen", l.tomorrow); - } - - public void test_cs_CZ() throws Exception { - LocaleData l = LocaleData.get(new Locale("cs", "CZ")); - - assertEquals("ledna", l.longMonthNames[0]); - assertEquals("led", l.shortMonthNames[0]); - assertEquals("1", l.tinyMonthNames[0]); - - assertEquals("leden", l.longStandAloneMonthNames[0]); - assertEquals("led", l.shortStandAloneMonthNames[0]); - assertEquals("l", l.tinyStandAloneMonthNames[0]); - } - - public void test_ru_RU() throws Exception { - LocaleData l = LocaleData.get(new Locale("ru", "RU")); - - assertEquals("воскресенье", l.longWeekdayNames[1]); - assertEquals("вс", l.shortWeekdayNames[1]); - assertEquals("вс", l.tinyWeekdayNames[1]); - - // Russian stand-alone weekday names get an initial capital. - assertEquals("Воскресенье", l.longStandAloneWeekdayNames[1]); - assertEquals("Вс", l.shortStandAloneWeekdayNames[1]); - assertEquals("В", l.tinyStandAloneWeekdayNames[1]); - } - - // http://code.google.com/p/android/issues/detail?id=38844 - public void testDecimalFormatSymbols_es() throws Exception { - LocaleData es = LocaleData.get(new Locale("es")); - assertEquals(',', es.decimalSeparator); - assertEquals('.', es.groupingSeparator); - - LocaleData es_419 = LocaleData.get(new Locale("es", "419")); - assertEquals('.', es_419.decimalSeparator); - assertEquals(',', es_419.groupingSeparator); - - LocaleData es_US = LocaleData.get(new Locale("es", "US")); - assertEquals('.', es_US.decimalSeparator); - assertEquals(',', es_US.groupingSeparator); - - LocaleData es_MX = LocaleData.get(new Locale("es", "MX")); - assertEquals('.', es_MX.decimalSeparator); - assertEquals(',', es_MX.groupingSeparator); - - LocaleData es_AR = LocaleData.get(new Locale("es", "AR")); - assertEquals(',', es_AR.decimalSeparator); - assertEquals('.', es_AR.groupingSeparator); - } - - // http://b/7924970 - public void testTimeFormat12And24() throws Exception { - LocaleData en_US = LocaleData.get(Locale.US); - assertEquals("h:mm a", en_US.timeFormat12); - assertEquals("HH:mm", en_US.timeFormat24); - - LocaleData ja_JP = LocaleData.get(Locale.JAPAN); - assertEquals("aK:mm", ja_JP.timeFormat12); - assertEquals("H:mm", ja_JP.timeFormat24); + public void testAll() throws Exception { + // Test that we can get the locale data for all known locales. + for (Locale l : Locale.getAvailableLocales()) { + LocaleData d = LocaleData.get(l); + // System.err.format("%20s %s %s %s\n", l, d.yesterday, d.today, d.tomorrow); + // System.err.format("%20s %10s %10s\n", l, d.timeFormat12, d.timeFormat24); } + } + + public void test_en_US() throws Exception { + LocaleData l = LocaleData.get(Locale.US); + assertEquals("AM", l.amPm[0]); + assertEquals("BC", l.eras[0]); + + assertEquals("January", l.longMonthNames[0]); + assertEquals("Jan", l.shortMonthNames[0]); + assertEquals("J", l.tinyMonthNames[0]); + + assertEquals("January", l.longStandAloneMonthNames[0]); + assertEquals("Jan", l.shortStandAloneMonthNames[0]); + assertEquals("J", l.tinyStandAloneMonthNames[0]); + + assertEquals("Sunday", l.longWeekdayNames[1]); + assertEquals("Sun", l.shortWeekdayNames[1]); + assertEquals("S", l.tinyWeekdayNames[1]); + + assertEquals("Sunday", l.longStandAloneWeekdayNames[1]); + assertEquals("Sun", l.shortStandAloneWeekdayNames[1]); + assertEquals("S", l.tinyStandAloneWeekdayNames[1]); + + assertEquals("Yesterday", l.yesterday); + assertEquals("Today", l.today); + assertEquals("Tomorrow", l.tomorrow); + } + + public void test_de_DE() throws Exception { + LocaleData l = LocaleData.get(new Locale("de", "DE")); + + assertEquals("Gestern", l.yesterday); + assertEquals("Heute", l.today); + assertEquals("Morgen", l.tomorrow); + } + + public void test_cs_CZ() throws Exception { + LocaleData l = LocaleData.get(new Locale("cs", "CZ")); + + assertEquals("ledna", l.longMonthNames[0]); + assertEquals("led", l.shortMonthNames[0]); + assertEquals("1", l.tinyMonthNames[0]); + + assertEquals("leden", l.longStandAloneMonthNames[0]); + assertEquals("led", l.shortStandAloneMonthNames[0]); + assertEquals("l", l.tinyStandAloneMonthNames[0]); + } + + public void test_ko_KR() throws Exception { + LocaleData l = LocaleData.get(new Locale("ko", "KR")); + + // Ensure the fix for http://b/14493853 doesn't mangle Hangul. + assertEquals("어제", l.yesterday); + assertEquals("오늘", l.today); + assertEquals("내일", l.tomorrow); + } + + public void test_ru_RU() throws Exception { + LocaleData l = LocaleData.get(new Locale("ru", "RU")); + + assertEquals("воскресенье", l.longWeekdayNames[1]); + assertEquals("вс", l.shortWeekdayNames[1]); + assertEquals("вс", l.tinyWeekdayNames[1]); + + // Russian stand-alone weekday names get an initial capital. + assertEquals("Воскресенье", l.longStandAloneWeekdayNames[1]); + assertEquals("Вс", l.shortStandAloneWeekdayNames[1]); + assertEquals("В", l.tinyStandAloneWeekdayNames[1]); + } + + // http://code.google.com/p/android/issues/detail?id=38844 + public void testDecimalFormatSymbols_es() throws Exception { + LocaleData es = LocaleData.get(new Locale("es")); + assertEquals(',', es.decimalSeparator); + assertEquals('.', es.groupingSeparator); + + LocaleData es_419 = LocaleData.get(new Locale("es", "419")); + assertEquals('.', es_419.decimalSeparator); + assertEquals(',', es_419.groupingSeparator); + + LocaleData es_US = LocaleData.get(new Locale("es", "US")); + assertEquals('.', es_US.decimalSeparator); + assertEquals(',', es_US.groupingSeparator); + + LocaleData es_MX = LocaleData.get(new Locale("es", "MX")); + assertEquals('.', es_MX.decimalSeparator); + assertEquals(',', es_MX.groupingSeparator); + + LocaleData es_AR = LocaleData.get(new Locale("es", "AR")); + assertEquals(',', es_AR.decimalSeparator); + assertEquals('.', es_AR.groupingSeparator); + } + + // http://b/7924970 + public void testTimeFormat12And24() throws Exception { + LocaleData en_US = LocaleData.get(Locale.US); + assertEquals("h:mm a", en_US.timeFormat12); + assertEquals("HH:mm", en_US.timeFormat24); + + LocaleData ja_JP = LocaleData.get(Locale.JAPAN); + assertEquals("aK:mm", ja_JP.timeFormat12); + assertEquals("H:mm", ja_JP.timeFormat24); + } } |