X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/4388f060552cc537e71e957d32f35e9d75a61233..57a6839dcb3bba09e8228b822b290604668416fe:/icuSources/i18n/locdspnm.cpp diff --git a/icuSources/i18n/locdspnm.cpp b/icuSources/i18n/locdspnm.cpp index c7a54962..f9816716 100644 --- a/icuSources/i18n/locdspnm.cpp +++ b/icuSources/i18n/locdspnm.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 2010-2012, International Business Machines Corporation and +* Copyright (C) 2010-2014, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************************* */ @@ -10,13 +10,16 @@ #if !UCONFIG_NO_FORMATTING #include "unicode/locdspnm.h" - #include "unicode/msgfmt.h" +#include "unicode/ures.h" +#include "unicode/udisplaycontext.h" +#include "unicode/brkiter.h" #include "cmemory.h" #include "cstring.h" #include "ulocimp.h" #include "ureslocs.h" +#include "uresimp.h" #include @@ -56,38 +59,38 @@ U_NAMESPACE_BEGIN // Access resource data for locale components. // Wrap code in uloc.c for now. class ICUDataTable { - const char* path; - Locale locale; + const char* path; + Locale locale; public: - ICUDataTable(const char* path, const Locale& locale); - ~ICUDataTable(); + ICUDataTable(const char* path, const Locale& locale); + ~ICUDataTable(); - const Locale& getLocale(); + const Locale& getLocale(); - UnicodeString& get(const char* tableKey, const char* itemKey, - UnicodeString& result) const; - UnicodeString& get(const char* tableKey, const char* subTableKey, const char* itemKey, - UnicodeString& result) const; + UnicodeString& get(const char* tableKey, const char* itemKey, + UnicodeString& result) const; + UnicodeString& get(const char* tableKey, const char* subTableKey, const char* itemKey, + UnicodeString& result) const; - UnicodeString& getNoFallback(const char* tableKey, const char* itemKey, - UnicodeString &result) const; - UnicodeString& getNoFallback(const char* tableKey, const char* subTableKey, const char* itemKey, - UnicodeString &result) const; + UnicodeString& getNoFallback(const char* tableKey, const char* itemKey, + UnicodeString &result) const; + UnicodeString& getNoFallback(const char* tableKey, const char* subTableKey, const char* itemKey, + UnicodeString &result) const; }; inline UnicodeString & ICUDataTable::get(const char* tableKey, const char* itemKey, UnicodeString& result) const { - return get(tableKey, NULL, itemKey, result); + return get(tableKey, NULL, itemKey, result); } inline UnicodeString & ICUDataTable::getNoFallback(const char* tableKey, const char* itemKey, UnicodeString& result) const { - return getNoFallback(tableKey, NULL, itemKey, result); + return getNoFallback(tableKey, NULL, itemKey, result); } ICUDataTable::ICUDataTable(const char* path, const Locale& locale) - : path(NULL), locale(Locale::getRoot()) + : path(NULL), locale(Locale::getRoot()) { if (path) { int32_t len = uprv_strlen(path); @@ -147,8 +150,6 @@ ICUDataTable::getNoFallback(const char* tableKey, const char* subTableKey, const LocaleDisplayNames::~LocaleDisplayNames() {} -UOBJECT_DEFINE_NO_RTTI_IMPLEMENTATION(LocaleDisplayNames) - //////////////////////////////////////////////////////////////////////////////////////////////////// #if 0 // currently unused @@ -164,6 +165,7 @@ public: virtual const Locale& getLocale() const; virtual UDialectHandling getDialectHandling() const; + virtual UnicodeString& localeDisplayName(const Locale& locale, UnicodeString& result) const; virtual UnicodeString& localeDisplayName(const char* localeId, @@ -266,94 +268,272 @@ DefaultLocaleDisplayNames::keyValueDisplayName(const char* /* key */, //////////////////////////////////////////////////////////////////////////////////////////////////// class LocaleDisplayNamesImpl : public LocaleDisplayNames { - Locale locale; - UDialectHandling dialectHandling; - ICUDataTable langData; - ICUDataTable regionData; - UnicodeString sep; - MessageFormat *format; - MessageFormat *keyTypeFormat; + Locale locale; + UDialectHandling dialectHandling; + ICUDataTable langData; + ICUDataTable regionData; + MessageFormat *separatorFormat; + MessageFormat *format; + MessageFormat *keyTypeFormat; + UDisplayContext capitalizationContext; + BreakIterator* capitalizationBrkIter; + UnicodeString formatOpenParen; + UnicodeString formatReplaceOpenParen; + UnicodeString formatCloseParen; + UnicodeString formatReplaceCloseParen; + UDisplayContext nameLength; + + // Constants for capitalization context usage types. + enum CapContextUsage { + kCapContextUsageLanguage, + kCapContextUsageScript, + kCapContextUsageTerritory, + kCapContextUsageVariant, + kCapContextUsageKey, + kCapContextUsageKeyValue, + kCapContextUsageCount + }; + // Capitalization transforms. For each usage type, indicates whether to titlecase for + // the context specified in capitalizationContext (which we know at construction time) + UBool fCapitalization[kCapContextUsageCount]; public: - // constructor - LocaleDisplayNamesImpl(const Locale& locale, UDialectHandling dialectHandling); - virtual ~LocaleDisplayNamesImpl(); - - virtual const Locale& getLocale() const; - virtual UDialectHandling getDialectHandling() const; - - virtual UnicodeString& localeDisplayName(const Locale& locale, - UnicodeString& result) const; - virtual UnicodeString& localeDisplayName(const char* localeId, - UnicodeString& result) const; - virtual UnicodeString& languageDisplayName(const char* lang, - UnicodeString& result) const; - virtual UnicodeString& scriptDisplayName(const char* script, - UnicodeString& result) const; - virtual UnicodeString& scriptDisplayName(UScriptCode scriptCode, - UnicodeString& result) const; - virtual UnicodeString& regionDisplayName(const char* region, - UnicodeString& result) const; - virtual UnicodeString& variantDisplayName(const char* variant, - UnicodeString& result) const; - virtual UnicodeString& keyDisplayName(const char* key, - UnicodeString& result) const; - virtual UnicodeString& keyValueDisplayName(const char* key, - const char* value, - UnicodeString& result) const; + // constructor + LocaleDisplayNamesImpl(const Locale& locale, UDialectHandling dialectHandling); + LocaleDisplayNamesImpl(const Locale& locale, UDisplayContext *contexts, int32_t length); + virtual ~LocaleDisplayNamesImpl(); + + virtual const Locale& getLocale() const; + virtual UDialectHandling getDialectHandling() const; + virtual UDisplayContext getContext(UDisplayContextType type) const; + + virtual UnicodeString& localeDisplayName(const Locale& locale, + UnicodeString& result) const; + virtual UnicodeString& localeDisplayName(const char* localeId, + UnicodeString& result) const; + virtual UnicodeString& languageDisplayName(const char* lang, + UnicodeString& result) const; + virtual UnicodeString& scriptDisplayName(const char* script, + UnicodeString& result) const; + virtual UnicodeString& scriptDisplayName(UScriptCode scriptCode, + UnicodeString& result) const; + virtual UnicodeString& regionDisplayName(const char* region, + UnicodeString& result) const; + virtual UnicodeString& variantDisplayName(const char* variant, + UnicodeString& result) const; + virtual UnicodeString& keyDisplayName(const char* key, + UnicodeString& result) const; + virtual UnicodeString& keyValueDisplayName(const char* key, + const char* value, + UnicodeString& result) const; private: - UnicodeString& localeIdName(const char* localeId, - UnicodeString& result) const; - UnicodeString& appendWithSep(UnicodeString& buffer, const UnicodeString& src) const; + UnicodeString& localeIdName(const char* localeId, + UnicodeString& result) const; + UnicodeString& regionShortDisplayName(const char* region, + UnicodeString& result) const; + UnicodeString& appendWithSep(UnicodeString& buffer, const UnicodeString& src) const; + UnicodeString& adjustForUsageAndContext(CapContextUsage usage, UnicodeString& result) const; + void initialize(void); }; LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale, UDialectHandling dialectHandling) - : dialectHandling(dialectHandling) - , langData(U_ICUDATA_LANG, locale) - , regionData(U_ICUDATA_REGION, locale) - , format(NULL) - , keyTypeFormat(NULL) + : dialectHandling(dialectHandling) + , langData(U_ICUDATA_LANG, locale) + , regionData(U_ICUDATA_REGION, locale) + , separatorFormat(NULL) + , format(NULL) + , keyTypeFormat(NULL) + , capitalizationContext(UDISPCTX_CAPITALIZATION_NONE) + , capitalizationBrkIter(NULL) + , nameLength(UADISPCTX_LENGTH_STANDARD) { - LocaleDisplayNamesImpl *nonConstThis = (LocaleDisplayNamesImpl *)this; - nonConstThis->locale = langData.getLocale() == Locale::getRoot() - ? regionData.getLocale() - : langData.getLocale(); + initialize(); +} - langData.getNoFallback("localeDisplayPattern", "separator", sep); - if (sep.isBogus()) { - sep = UnicodeString(", ", -1, US_INV); - } +LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale, + UDisplayContext *contexts, int32_t length) + : dialectHandling(ULDN_STANDARD_NAMES) + , langData(U_ICUDATA_LANG, locale) + , regionData(U_ICUDATA_REGION, locale) + , separatorFormat(NULL) + , format(NULL) + , keyTypeFormat(NULL) + , capitalizationContext(UDISPCTX_CAPITALIZATION_NONE) + , capitalizationBrkIter(NULL) + , nameLength(UADISPCTX_LENGTH_STANDARD) +{ + while (length-- > 0) { + UDisplayContext value = *contexts++; + UDisplayContextType selector = (UDisplayContextType)((uint32_t)value >> 8); + switch (selector) { + case UDISPCTX_TYPE_DIALECT_HANDLING: + dialectHandling = (UDialectHandling)value; + break; + case UDISPCTX_TYPE_CAPITALIZATION: + capitalizationContext = value; + break; + case UADISPCTX_TYPE_LENGTH: + nameLength = value; + break; + default: + break; + } + } + initialize(); +} - UnicodeString pattern; - langData.getNoFallback("localeDisplayPattern", "pattern", pattern); - if (pattern.isBogus()) { - pattern = UnicodeString("{0} ({1})", -1, US_INV); - } - UErrorCode status = U_ZERO_ERROR; - format = new MessageFormat(pattern, status); +void +LocaleDisplayNamesImpl::initialize(void) { + LocaleDisplayNamesImpl *nonConstThis = (LocaleDisplayNamesImpl *)this; + nonConstThis->locale = langData.getLocale() == Locale::getRoot() + ? regionData.getLocale() + : langData.getLocale(); - UnicodeString ktPattern; - langData.get("localeDisplayPattern", "keyTypePattern", ktPattern); - if (ktPattern.isBogus()) { - ktPattern = UnicodeString("{0}={1}", -1, US_INV); - } - keyTypeFormat = new MessageFormat(ktPattern, status); + UnicodeString sep; + langData.getNoFallback("localeDisplayPattern", "separator", sep); + if (sep.isBogus()) { + sep = UnicodeString("{0}, {1}", -1, US_INV); + } + UErrorCode status = U_ZERO_ERROR; + separatorFormat = new MessageFormat(sep, status); + + UnicodeString pattern; + langData.getNoFallback("localeDisplayPattern", "pattern", pattern); + if (pattern.isBogus()) { + pattern = UnicodeString("{0} ({1})", -1, US_INV); + } + format = new MessageFormat(pattern, status); + if (pattern.indexOf((UChar)0xFF08) >= 0) { + formatOpenParen.setTo((UChar)0xFF08); // fullwidth ( + formatReplaceOpenParen.setTo((UChar)0xFF3B); // fullwidth [ + formatCloseParen.setTo((UChar)0xFF09); // fullwidth ) + formatReplaceCloseParen.setTo((UChar)0xFF3D); // fullwidth ] + } else { + formatOpenParen.setTo((UChar)0x0028); // ( + formatReplaceOpenParen.setTo((UChar)0x005B); // [ + formatCloseParen.setTo((UChar)0x0029); // ) + formatReplaceCloseParen.setTo((UChar)0x005D); // ] + } + + UnicodeString ktPattern; + langData.get("localeDisplayPattern", "keyTypePattern", ktPattern); + if (ktPattern.isBogus()) { + ktPattern = UnicodeString("{0}={1}", -1, US_INV); + } + keyTypeFormat = new MessageFormat(ktPattern, status); + + uprv_memset(fCapitalization, 0, sizeof(fCapitalization)); +#if !UCONFIG_NO_BREAK_ITERATION + // The following is basically copied from DateFormatSymbols::initializeData + typedef struct { + const char * usageName; + LocaleDisplayNamesImpl::CapContextUsage usageEnum; + } ContextUsageNameToEnum; + const ContextUsageNameToEnum contextUsageTypeMap[] = { + // Entries must be sorted by usageTypeName; entry with NULL name terminates list. + { "key", kCapContextUsageKey }, + { "keyValue", kCapContextUsageKeyValue }, + { "languages", kCapContextUsageLanguage }, + { "script", kCapContextUsageScript }, + { "territory", kCapContextUsageTerritory }, + { "variant", kCapContextUsageVariant }, + { NULL, (CapContextUsage)0 }, + }; + // Only get the context data if we need it! This is a const object so we know now... + // Also check whether we will need a break iterator (depends on the data) + UBool needBrkIter = FALSE; + if (capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU || capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_STANDALONE) { + int32_t len = 0; + UResourceBundle *localeBundle = ures_open(NULL, locale.getName(), &status); + if (U_SUCCESS(status)) { + UResourceBundle *contextTransforms = ures_getByKeyWithFallback(localeBundle, "contextTransforms", NULL, &status); + if (U_SUCCESS(status)) { + UResourceBundle *contextTransformUsage; + while ( (contextTransformUsage = ures_getNextResource(contextTransforms, NULL, &status)) != NULL ) { + const int32_t * intVector = ures_getIntVector(contextTransformUsage, &len, &status); + if (U_SUCCESS(status) && intVector != NULL && len >= 2) { + const char* usageKey = ures_getKey(contextTransformUsage); + if (usageKey != NULL) { + const ContextUsageNameToEnum * typeMapPtr = contextUsageTypeMap; + int32_t compResult = 0; + // linear search; list is short and we cannot be sure that bsearch is available + while ( typeMapPtr->usageName != NULL && (compResult = uprv_strcmp(usageKey, typeMapPtr->usageName)) > 0 ) { + ++typeMapPtr; + } + if (typeMapPtr->usageName != NULL && compResult == 0) { + int32_t titlecaseInt = (capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU)? intVector[0]: intVector[1]; + if (titlecaseInt != 0) { + fCapitalization[typeMapPtr->usageEnum] = TRUE;; + needBrkIter = TRUE; + } + } + } + } + status = U_ZERO_ERROR; + ures_close(contextTransformUsage); + } + ures_close(contextTransforms); + } + ures_close(localeBundle); + } + } + // Get a sentence break iterator if we will need it + if (needBrkIter || capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE) { + status = U_ZERO_ERROR; + capitalizationBrkIter = BreakIterator::createSentenceInstance(locale, status); + if (U_FAILURE(status)) { + delete capitalizationBrkIter; + capitalizationBrkIter = NULL; + } + } +#endif } LocaleDisplayNamesImpl::~LocaleDisplayNamesImpl() { - delete format; - delete keyTypeFormat; -} + delete separatorFormat; + delete format; + delete keyTypeFormat; + delete capitalizationBrkIter; + } const Locale& LocaleDisplayNamesImpl::getLocale() const { - return locale; + return locale; } UDialectHandling LocaleDisplayNamesImpl::getDialectHandling() const { - return dialectHandling; + return dialectHandling; +} + +UDisplayContext +LocaleDisplayNamesImpl::getContext(UDisplayContextType type) const { + switch (type) { + case UDISPCTX_TYPE_DIALECT_HANDLING: + return (UDisplayContext)dialectHandling; + case UDISPCTX_TYPE_CAPITALIZATION: + return capitalizationContext; + case UADISPCTX_TYPE_LENGTH: + return nameLength; + default: + break; + } + return (UDisplayContext)0; +} + +UnicodeString& +LocaleDisplayNamesImpl::adjustForUsageAndContext(CapContextUsage usage, + UnicodeString& result) const { +#if !UCONFIG_NO_BREAK_ITERATION + // check to see whether we need to titlecase result + if ( result.length() > 0 && u_islower(result.char32At(0)) && capitalizationBrkIter!= NULL && + ( capitalizationContext==UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE || fCapitalization[usage] ) ) { + // note fCapitalization[usage] won't be set unless capitalizationContext is UI_LIST_OR_MENU or STANDALONE + result.toTitle(capitalizationBrkIter, locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); + } +#endif + return result; } UnicodeString& @@ -416,11 +596,13 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& locale, resultRemainder.append(scriptDisplayName(script, temp)); } if (hasCountry) { - appendWithSep(resultRemainder, regionDisplayName(country, temp)); + appendWithSep(resultRemainder, regionShortDisplayName(country, temp)); } if (hasVariant) { appendWithSep(resultRemainder, variantDisplayName(variant, temp)); } + resultRemainder.findAndReplace(formatOpenParen, formatReplaceOpenParen); + resultRemainder.findAndReplace(formatCloseParen, formatReplaceCloseParen); e = locale.createKeywords(status); if (e && U_SUCCESS(status)) { @@ -430,7 +612,11 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& locale, while ((key = e->next((int32_t *)0, status)) != NULL) { locale.getKeywordValue(key, value, ULOC_KEYWORD_AND_VALUES_CAPACITY, status); keyDisplayName(key, temp); + temp.findAndReplace(formatOpenParen, formatReplaceOpenParen); + temp.findAndReplace(formatCloseParen, formatReplaceCloseParen); keyValueDisplayName(key, value, temp2); + temp2.findAndReplace(formatOpenParen, formatReplaceOpenParen); + temp2.findAndReplace(formatCloseParen, formatReplaceCloseParen); if (temp2 != UnicodeString(value, -1, US_INV)) { appendWithSep(resultRemainder, temp2); } else if (temp != UnicodeString(key, -1, US_INV)) { @@ -460,78 +646,130 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& locale, FieldPosition fpos; status = U_ZERO_ERROR; format->format(data, 2, result, fpos, status); - return result; + return adjustForUsageAndContext(kCapContextUsageLanguage, result); } - return result = resultName; + result = resultName; + return adjustForUsageAndContext(kCapContextUsageLanguage, result); } UnicodeString& LocaleDisplayNamesImpl::appendWithSep(UnicodeString& buffer, const UnicodeString& src) const { - if (!buffer.isEmpty()) { - buffer.append(sep); - } - buffer.append(src); - return buffer; + if (buffer.isEmpty()) { + buffer.setTo(src); + } else { + UnicodeString combined; + Formattable data[] = { + buffer, + src + }; + FieldPosition fpos; + UErrorCode status = U_ZERO_ERROR; + separatorFormat->format(data, 2, combined, fpos, status); + if (U_SUCCESS(status)) { + buffer.setTo(combined); + } + } + return buffer; } UnicodeString& LocaleDisplayNamesImpl::localeDisplayName(const char* localeId, UnicodeString& result) const { - return localeDisplayName(Locale(localeId), result); + return localeDisplayName(Locale(localeId), result); } +// private UnicodeString& LocaleDisplayNamesImpl::localeIdName(const char* localeId, UnicodeString& result) const { - return langData.getNoFallback("Languages", localeId, result); + if (nameLength == UADISPCTX_LENGTH_SHORT) { + langData.getNoFallback("LanguagesShort", localeId, result); + if (!result.isBogus()) { + return result; + } + } + return langData.getNoFallback("Languages", localeId, result); } UnicodeString& LocaleDisplayNamesImpl::languageDisplayName(const char* lang, UnicodeString& result) const { - if (uprv_strcmp("root", lang) == 0 || uprv_strchr(lang, '_') != NULL) { - return result = UnicodeString(lang, -1, US_INV); - } - return langData.get("Languages", lang, result); + if (uprv_strcmp("root", lang) == 0 || uprv_strchr(lang, '_') != NULL) { + return result = UnicodeString(lang, -1, US_INV); + } + if (nameLength == UADISPCTX_LENGTH_SHORT) { + langData.getNoFallback("LanguagesShort", lang, result); + if (!result.isBogus()) { + return adjustForUsageAndContext(kCapContextUsageLanguage, result); + } + } + langData.get("Languages", lang, result); + return adjustForUsageAndContext(kCapContextUsageLanguage, result); } UnicodeString& LocaleDisplayNamesImpl::scriptDisplayName(const char* script, UnicodeString& result) const { - return langData.get("Scripts", script, result); + langData.get("Scripts", script, result); + return adjustForUsageAndContext(kCapContextUsageScript, result); } UnicodeString& LocaleDisplayNamesImpl::scriptDisplayName(UScriptCode scriptCode, UnicodeString& result) const { - const char* name = uscript_getName(scriptCode); - return langData.get("Scripts", name, result); + const char* name = uscript_getName(scriptCode); + langData.get("Scripts", name, result); + return adjustForUsageAndContext(kCapContextUsageScript, result); } UnicodeString& LocaleDisplayNamesImpl::regionDisplayName(const char* region, UnicodeString& result) const { - return regionData.get("Countries", region, result); + if (nameLength == UADISPCTX_LENGTH_SHORT) { + regionData.getNoFallback("CountriesShort", region, result); + if (!result.isBogus()) { + return adjustForUsageAndContext(kCapContextUsageTerritory, result); + } + } + regionData.get("Countries", region, result); + return adjustForUsageAndContext(kCapContextUsageTerritory, result); +} + +// private Apple +UnicodeString& +LocaleDisplayNamesImpl::regionShortDisplayName(const char* region, + UnicodeString& result) const { + if (uprv_strcmp(region, "PS") != 0) { + regionData.getNoFallback("CountriesShort", region, result); + if (!result.isBogus()) { + return adjustForUsageAndContext(kCapContextUsageTerritory, result); + } + } + regionData.get("Countries", region, result); + return adjustForUsageAndContext(kCapContextUsageTerritory, result); } UnicodeString& LocaleDisplayNamesImpl::variantDisplayName(const char* variant, UnicodeString& result) const { - return langData.get("Variants", variant, result); + langData.get("Variants", variant, result); + return adjustForUsageAndContext(kCapContextUsageVariant, result); } UnicodeString& LocaleDisplayNamesImpl::keyDisplayName(const char* key, UnicodeString& result) const { - return langData.get("Keys", key, result); + langData.get("Keys", key, result); + return adjustForUsageAndContext(kCapContextUsageKey, result); } UnicodeString& LocaleDisplayNamesImpl::keyValueDisplayName(const char* key, const char* value, UnicodeString& result) const { - return langData.get("Types", key, value, result); + langData.get("Types", key, value, result); + return adjustForUsageAndContext(kCapContextUsageKeyValue, result); } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -539,7 +777,16 @@ LocaleDisplayNamesImpl::keyValueDisplayName(const char* key, LocaleDisplayNames* LocaleDisplayNames::createInstance(const Locale& locale, UDialectHandling dialectHandling) { - return new LocaleDisplayNamesImpl(locale, dialectHandling); + return new LocaleDisplayNamesImpl(locale, dialectHandling); +} + +LocaleDisplayNames* +LocaleDisplayNames::createInstance(const Locale& locale, + UDisplayContext *contexts, int32_t length) { + if (contexts == NULL) { + length = 0; + } + return new LocaleDisplayNamesImpl(locale, contexts, length); } U_NAMESPACE_END @@ -548,7 +795,7 @@ U_NAMESPACE_END U_NAMESPACE_USE -U_DRAFT ULocaleDisplayNames * U_EXPORT2 +U_CAPI ULocaleDisplayNames * U_EXPORT2 uldn_open(const char * locale, UDialectHandling dialectHandling, UErrorCode *pErrorCode) { @@ -561,12 +808,26 @@ uldn_open(const char * locale, return (ULocaleDisplayNames *)LocaleDisplayNames::createInstance(Locale(locale), dialectHandling); } -U_DRAFT void U_EXPORT2 +U_CAPI ULocaleDisplayNames * U_EXPORT2 +uldn_openForContext(const char * locale, + UDisplayContext *contexts, int32_t length, + UErrorCode *pErrorCode) { + if (U_FAILURE(*pErrorCode)) { + return 0; + } + if (locale == NULL) { + locale = uloc_getDefault(); + } + return (ULocaleDisplayNames *)LocaleDisplayNames::createInstance(Locale(locale), contexts, length); +} + + +U_CAPI void U_EXPORT2 uldn_close(ULocaleDisplayNames *ldn) { delete (LocaleDisplayNames *)ldn; } -U_DRAFT const char * U_EXPORT2 +U_CAPI const char * U_EXPORT2 uldn_getLocale(const ULocaleDisplayNames *ldn) { if (ldn) { return ((const LocaleDisplayNames *)ldn)->getLocale().getName(); @@ -574,7 +835,7 @@ uldn_getLocale(const ULocaleDisplayNames *ldn) { return NULL; } -U_DRAFT UDialectHandling U_EXPORT2 +U_CAPI UDialectHandling U_EXPORT2 uldn_getDialectHandling(const ULocaleDisplayNames *ldn) { if (ldn) { return ((const LocaleDisplayNames *)ldn)->getDialectHandling(); @@ -582,7 +843,17 @@ uldn_getDialectHandling(const ULocaleDisplayNames *ldn) { return ULDN_STANDARD_NAMES; } -U_DRAFT int32_t U_EXPORT2 +U_CAPI UDisplayContext U_EXPORT2 +uldn_getContext(const ULocaleDisplayNames *ldn, + UDisplayContextType type, + UErrorCode *pErrorCode) { + if (U_FAILURE(*pErrorCode)) { + return (UDisplayContext)0; + } + return ((const LocaleDisplayNames *)ldn)->getContext(type); +} + +U_CAPI int32_t U_EXPORT2 uldn_localeDisplayName(const ULocaleDisplayNames *ldn, const char *locale, UChar *result, @@ -600,7 +871,7 @@ uldn_localeDisplayName(const ULocaleDisplayNames *ldn, return temp.extract(result, maxResultSize, *pErrorCode); } -U_DRAFT int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uldn_languageDisplayName(const ULocaleDisplayNames *ldn, const char *lang, UChar *result, @@ -618,7 +889,7 @@ uldn_languageDisplayName(const ULocaleDisplayNames *ldn, return temp.extract(result, maxResultSize, *pErrorCode); } -U_DRAFT int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uldn_scriptDisplayName(const ULocaleDisplayNames *ldn, const char *script, UChar *result, @@ -636,7 +907,7 @@ uldn_scriptDisplayName(const ULocaleDisplayNames *ldn, return temp.extract(result, maxResultSize, *pErrorCode); } -U_DRAFT int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uldn_scriptCodeDisplayName(const ULocaleDisplayNames *ldn, UScriptCode scriptCode, UChar *result, @@ -645,7 +916,7 @@ uldn_scriptCodeDisplayName(const ULocaleDisplayNames *ldn, return uldn_scriptDisplayName(ldn, uscript_getName(scriptCode), result, maxResultSize, pErrorCode); } -U_DRAFT int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uldn_regionDisplayName(const ULocaleDisplayNames *ldn, const char *region, UChar *result, @@ -663,7 +934,7 @@ uldn_regionDisplayName(const ULocaleDisplayNames *ldn, return temp.extract(result, maxResultSize, *pErrorCode); } -U_DRAFT int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uldn_variantDisplayName(const ULocaleDisplayNames *ldn, const char *variant, UChar *result, @@ -681,7 +952,7 @@ uldn_variantDisplayName(const ULocaleDisplayNames *ldn, return temp.extract(result, maxResultSize, *pErrorCode); } -U_DRAFT int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uldn_keyDisplayName(const ULocaleDisplayNames *ldn, const char *key, UChar *result, @@ -699,7 +970,7 @@ uldn_keyDisplayName(const ULocaleDisplayNames *ldn, return temp.extract(result, maxResultSize, *pErrorCode); } -U_DRAFT int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uldn_keyValueDisplayName(const ULocaleDisplayNames *ldn, const char *key, const char *value,