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/src/main | |
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/src/main')
-rw-r--r-- | luni/src/main/native/libcore_icu_ICU.cpp | 51 |
1 files changed, 24 insertions, 27 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; |