static jobjectArray getWeekdayNames(JNIEnv* env, UResourceBundle* gregorian, bool longNames) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle gregorianElems(ures_getByKey(gregorian, "dayNames", NULL, &status)); if (U_FAILURE(status)) { return NULL; } ScopedResourceBundle dayNameElems(ures_getByKey(gregorianElems.get(), "format", NULL, &status)); if (U_FAILURE(status)) { return NULL; } ScopedResourceBundle dayNameElemsFormat(ures_getByKey(dayNameElems.get(), longNames ? "wide" : "abbreviated", NULL, &status)); if (U_FAILURE(status)) { return NULL; } ures_resetIterator(dayNameElemsFormat.get()); int dayCount = ures_getSize(dayNameElemsFormat.get()); jobjectArray weekdays = env->NewObjectArray(dayCount + 1, string_class, NULL); // first entry in the weekdays array is an empty string env->SetObjectArrayElement(weekdays, 0, env->NewStringUTF("")); for(int i = 0; i < dayCount; i++) { int dayNameLength; const jchar* day = ures_getStringByIndex(dayNameElemsFormat.get(), i, &dayNameLength, &status); if(U_FAILURE(status)) { return NULL; } jstring dayU = env->NewString(day, dayNameLength); env->SetObjectArrayElement(weekdays, i + 1, dayU); env->DeleteLocalRef(dayU); } return weekdays; }
static jobjectArray getEras(JNIEnv* env, UResourceBundle* gregorian) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle gregorianElems(ures_getByKey(gregorian, "eras", NULL, &status)); if (U_FAILURE(status)) { return NULL; } ScopedResourceBundle eraElems(ures_getByKey(gregorianElems.get(), "abbreviated", NULL, &status)); if (U_FAILURE(status)) { return NULL; } int eraCount = ures_getSize(eraElems.get()); jobjectArray eras = env->NewObjectArray(eraCount, string_class, NULL); ures_resetIterator(eraElems.get()); for (int i = 0; i < eraCount; ++i) { int eraLength; const jchar* era = ures_getStringByIndex(eraElems.get(), i, &eraLength, &status); if (U_FAILURE(status)) { return NULL; } jstring eraU = env->NewString(era, eraLength); env->SetObjectArrayElement(eras, i, eraU); env->DeleteLocalRef(eraU); } return eras; }
static jobjectArray getAmPmMarkers(JNIEnv* env, UResourceBundle* gregorian) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle gregorianElems(ures_getByKey(gregorian, "AmPmMarkers", NULL, &status)); if (U_FAILURE(status)) { return NULL; } ures_resetIterator(gregorianElems.get()); int lengthAm, lengthPm; const jchar* am = ures_getStringByIndex(gregorianElems.get(), 0, &lengthAm, &status); const jchar* pm = ures_getStringByIndex(gregorianElems.get(), 1, &lengthPm, &status); if (U_FAILURE(status)) { return NULL; } jobjectArray amPmMarkers = env->NewObjectArray(2, string_class, NULL); jstring amU = env->NewString(am, lengthAm); env->SetObjectArrayElement(amPmMarkers, 0, amU); env->DeleteLocalRef(amU); jstring pmU = env->NewString(pm, lengthPm); env->SetObjectArrayElement(amPmMarkers, 1, pmU); env->DeleteLocalRef(pmU); return amPmMarkers; }
static bool getDayIntVector(JNIEnv* env, UResourceBundle* gregorian, int* values) { // get the First day of week and the minimal days in first week numbers UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle gregorianElems(ures_getByKey(gregorian, "DateTimeElements", NULL, &status)); if (U_FAILURE(status)) { return false; } int intVectSize; const int* result = ures_getIntVector(gregorianElems.get(), &intVectSize, &status); if (U_FAILURE(status) || intVectSize != 2) { return false; } values[0] = result[0]; values[1] = result[1]; return true; }
static jobjectArray getMonthNames(JNIEnv* env, UResourceBundle* gregorian, bool longNames) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle gregorianElems(ures_getByKey(gregorian, "monthNames", NULL, &status)); if (U_FAILURE(status)) { return NULL; } ScopedResourceBundle monthNameElems(ures_getByKey(gregorianElems.get(), "format", NULL, &status)); if (U_FAILURE(status)) { return NULL; } ScopedResourceBundle monthNameElemsFormat(ures_getByKey(monthNameElems.get(), longNames ? "wide" : "abbreviated", NULL, &status)); if (U_FAILURE(status)) { return NULL; } ures_resetIterator(monthNameElemsFormat.get()); int monthCount = ures_getSize(monthNameElemsFormat.get()); // the array length is +1 because the harmony locales had an empty string at the end of their month name array jobjectArray months = env->NewObjectArray(monthCount + 1, string_class, NULL); for (int i = 0; i < monthCount; ++i) { int monthNameLength; const jchar* month = ures_getStringByIndex(monthNameElemsFormat.get(), i, &monthNameLength, &status); if (U_FAILURE(status)) { return NULL; } jstring monthU = env->NewString(month, monthNameLength); env->SetObjectArrayElement(months, i, monthU); env->DeleteLocalRef(monthU); } jstring monthU = env->NewStringUTF(""); env->SetObjectArrayElement(months, monthCount, monthU); env->DeleteLocalRef(monthU); return months; }
static jobjectArray getAmPmMarkers(JNIEnv* env, UResourceBundle* gregorian) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle gregorianElems(ures_getByKey(gregorian, "AmPmMarkers", NULL, &status)); if (U_FAILURE(status)) { return NULL; } int lengthAm, lengthPm; const jchar* am = ures_getStringByIndex(gregorianElems.get(), 0, &lengthAm, &status); const jchar* pm = ures_getStringByIndex(gregorianElems.get(), 1, &lengthPm, &status); if (U_FAILURE(status)) { return NULL; } jobjectArray amPmMarkers = env->NewObjectArray(2, JniConstants::stringClass, NULL); ScopedLocalRef<jstring> amU(env, env->NewString(am, lengthAm)); env->SetObjectArrayElement(amPmMarkers, 0, amU.get()); ScopedLocalRef<jstring> pmU(env, env->NewString(pm, lengthPm)); env->SetObjectArrayElement(amPmMarkers, 1, pmU.get()); return amPmMarkers; }
static jboolean initLocaleDataImpl(JNIEnv* env, jclass clazz, jstring locale, jobject localeData) { const char* loc = env->GetStringUTFChars(locale, NULL); UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle root(ures_openU(NULL, loc, &status)); env->ReleaseStringUTFChars(locale, loc); if (U_FAILURE(status)) { LOGE("Error getting ICU resource bundle: %s", u_errorName(status)); status = U_ZERO_ERROR; return JNI_FALSE; } ScopedResourceBundle calendar(ures_getByKey(root.get(), "calendar", NULL, &status)); if (U_FAILURE(status)) { LOGE("Error getting ICU calendar resource bundle: %s", u_errorName(status)); return JNI_FALSE; } ScopedResourceBundle gregorian(ures_getByKey(calendar.get(), "gregorian", NULL, &status)); if (U_FAILURE(status)) { LOGE("Error getting ICU gregorian resource bundle: %s", u_errorName(status)); return JNI_FALSE; } int firstDayVals[2]; if (getDayIntVector(env, gregorian.get(), firstDayVals)) { setIntegerField(env, localeData, "firstDayOfWeek", firstDayVals[0]); setIntegerField(env, localeData, "minimalDaysInFirstWeek", firstDayVals[1]); } setStringArrayField(env, localeData, "amPm", getAmPmMarkers(env, gregorian.get())); setStringArrayField(env, localeData, "eras", getEras(env, gregorian.get())); setStringArrayField(env, localeData, "longMonthNames", getLongMonthNames(env, gregorian.get())); setStringArrayField(env, localeData, "shortMonthNames", getShortMonthNames(env, gregorian.get())); setStringArrayField(env, localeData, "longWeekdayNames", getLongWeekdayNames(env, gregorian.get())); setStringArrayField(env, localeData, "shortWeekdayNames", getShortWeekdayNames(env, gregorian.get())); ScopedResourceBundle gregorianElems(ures_getByKey(gregorian.get(), "DateTimePatterns", NULL, &status)); if (U_SUCCESS(status)) { setStringField(env, localeData, "fullTimeFormat", gregorianElems.get(), 0); setStringField(env, localeData, "longTimeFormat", gregorianElems.get(), 1); setStringField(env, localeData, "mediumTimeFormat", gregorianElems.get(), 2); setStringField(env, localeData, "shortTimeFormat", gregorianElems.get(), 3); setStringField(env, localeData, "fullDateFormat", gregorianElems.get(), 4); setStringField(env, localeData, "longDateFormat", gregorianElems.get(), 5); setStringField(env, localeData, "mediumDateFormat", gregorianElems.get(), 6); setStringField(env, localeData, "shortDateFormat", gregorianElems.get(), 7); } status = U_ZERO_ERROR; ScopedResourceBundle numberElements(ures_getByKey(root.get(), "NumberElements", NULL, &status)); if (U_SUCCESS(status) && ures_getSize(numberElements.get()) >= 11) { setStringField(env, localeData, "decimalPatternChars", getDecimalPatternChars(env, numberElements.get())); setStringField(env, localeData, "infinity", numberElements.get(), 9); setStringField(env, localeData, "NaN", numberElements.get(), 10); } status = U_ZERO_ERROR; jstring internationalCurrencySymbol = getIntCurrencyCode(env, locale); jstring currencySymbol = NULL; if (internationalCurrencySymbol != NULL) { currencySymbol = getCurrencySymbolNative(env, clazz, locale, internationalCurrencySymbol); } else { internationalCurrencySymbol = env->NewStringUTF("XXX"); } if (currencySymbol == NULL) { // This is the UTF-8 encoding of U+00A4 (CURRENCY SIGN). currencySymbol = env->NewStringUTF("\xc2\xa4"); } setStringField(env, localeData, "currencySymbol", currencySymbol); setStringField(env, localeData, "internationalCurrencySymbol", internationalCurrencySymbol); ScopedResourceBundle numberPatterns(ures_getByKey(root.get(), "NumberPatterns", NULL, &status)); if (U_SUCCESS(status) && ures_getSize(numberPatterns.get()) >= 3) { setStringField(env, localeData, "numberPattern", numberPatterns.get(), 0); setStringField(env, localeData, "currencyPattern", numberPatterns.get(), 1); setStringField(env, localeData, "percentPattern", numberPatterns.get(), 2); } return JNI_TRUE; }