U_CAPI int32_t U_EXPORT2 uloc_getDisplayKeyword(const char* keyword, const char* displayLocale, UChar* dest, int32_t destCapacity, UErrorCode* status){ /* argument checking */ if(status==NULL || U_FAILURE(*status)) { return 0; } if(destCapacity<0 || (destCapacity>0 && dest==NULL)) { *status=U_ILLEGAL_ARGUMENT_ERROR; return 0; } /* pass itemKey=NULL to look for a top-level item */ return _getStringOrCopyKey(U_ICUDATA_LANG, displayLocale, _kKeys, NULL, keyword, keyword, dest, destCapacity, status); }
static int32_t _getDisplayNameForComponent(const char * locale, const char * displayLocale, UChar * dest, int32_t destCapacity, UDisplayNameGetter * getter, const char * tag, UErrorCode * pErrorCode) { char localeBuffer[ULOC_FULLNAME_CAPACITY * 4]; int32_t length; UErrorCode localStatus; const char * root = NULL; /* argument checking */ if (pErrorCode == NULL || U_FAILURE(*pErrorCode)) { return 0; } if (destCapacity < 0 || (destCapacity > 0 && dest == NULL)) { *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return 0; } localStatus = U_ZERO_ERROR; length = (*getter)(locale, localeBuffer, sizeof(localeBuffer), &localStatus); if (U_FAILURE(localStatus) || localStatus == U_STRING_NOT_TERMINATED_WARNING) { *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return 0; } if (length == 0) { return u_terminateUChars(dest, destCapacity, 0, pErrorCode); } root = tag == _kCountries ? U_ICUDATA_REGION : U_ICUDATA_LANG; return _getStringOrCopyKey(root, displayLocale, tag, NULL, localeBuffer, localeBuffer, dest, destCapacity, pErrorCode); }
U_CAPI int32_t U_EXPORT2 uloc_getDisplayKeywordValue( const char* locale, const char* keyword, const char* displayLocale, UChar* dest, int32_t destCapacity, UErrorCode* status){ char keywordValue[ULOC_FULLNAME_CAPACITY*4]; int32_t capacity = ULOC_FULLNAME_CAPACITY*4; int32_t keywordValueLen =0; /* argument checking */ if(status==NULL || U_FAILURE(*status)) { return 0; } if(destCapacity<0 || (destCapacity>0 && dest==NULL)) { *status=U_ILLEGAL_ARGUMENT_ERROR; return 0; } /* get the keyword value */ keywordValue[0]=0; keywordValueLen = uloc_getKeywordValue(locale, keyword, keywordValue, capacity, status); /* * if the keyword is equal to currency .. then to get the display name * we need to do the fallback ourselves */ if(uprv_stricmp(keyword, _kCurrency)==0){ int32_t dispNameLen = 0; const UChar *dispName = NULL; UResourceBundle *bundle = ures_open(U_ICUDATA_CURR, displayLocale, status); UResourceBundle *currencies = ures_getByKey(bundle, _kCurrencies, NULL, status); UResourceBundle *currency = ures_getByKeyWithFallback(currencies, keywordValue, NULL, status); dispName = ures_getStringByIndex(currency, UCURRENCY_DISPLAY_NAME_INDEX, &dispNameLen, status); /*close the bundles */ ures_close(currency); ures_close(currencies); ures_close(bundle); if(U_FAILURE(*status)){ if(*status == U_MISSING_RESOURCE_ERROR){ /* we just want to write the value over if nothing is available */ *status = U_USING_DEFAULT_WARNING; }else{ return 0; } } /* now copy the dispName over if not NULL */ if(dispName != NULL){ if(dispNameLen <= destCapacity){ uprv_memcpy(dest, dispName, dispNameLen * U_SIZEOF_UCHAR); return u_terminateUChars(dest, destCapacity, dispNameLen, status); }else{ *status = U_BUFFER_OVERFLOW_ERROR; return dispNameLen; } }else{ /* we have not found the display name for the value .. just copy over */ if(keywordValueLen <= destCapacity){ u_charsToUChars(keywordValue, dest, keywordValueLen); return u_terminateUChars(dest, destCapacity, keywordValueLen, status); }else{ *status = U_BUFFER_OVERFLOW_ERROR; return keywordValueLen; } } }else{ return _getStringOrCopyKey(U_ICUDATA_LANG, displayLocale, _kTypes, keyword, keywordValue, keywordValue, dest, destCapacity, status); } }