/*
*******************************************************************************
-* Copyright (C) 2010, International Business Machines Corporation and *
-* others. All Rights Reserved. *
+* Copyright (C) 2010-2014, International Business Machines Corporation and
+* others. All Rights Reserved.
*******************************************************************************
*/
#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 <stdarg.h>
// 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);
const UChar *s = uloc_getTableStringWithFallback(path, locale.getName(),
tableKey, subTableKey, itemKey,
&len, &status);
- if (U_SUCCESS(status)) {
+ if (U_SUCCESS(status) && len > 0) {
return result.setTo(s, len);
}
return result.setTo(UnicodeString(itemKey, -1, US_INV));
////////////////////////////////////////////////////////////////////////////////////////////////////
-UOBJECT_DEFINE_NO_RTTI_IMPLEMENTATION(LocaleDisplayNames)
+LocaleDisplayNames::~LocaleDisplayNames() {}
////////////////////////////////////////////////////////////////////////////////////////////////////
virtual const Locale& getLocale() const;
virtual UDialectHandling getDialectHandling() const;
+
virtual UnicodeString& localeDisplayName(const Locale& locale,
UnicodeString& result) const;
virtual UnicodeString& localeDisplayName(const char* localeId,
////////////////////////////////////////////////////////////////////////////////////////////////////
class LocaleDisplayNamesImpl : public LocaleDisplayNames {
- Locale locale;
- UDialectHandling dialectHandling;
- ICUDataTable langData;
- ICUDataTable regionData;
- UnicodeString sep;
- MessageFormat *format;
+ 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)
+ : 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 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 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&
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)) {
const char* key;
while ((key = e->next((int32_t *)0, status)) != NULL) {
locale.getKeywordValue(key, value, ULOC_KEYWORD_AND_VALUES_CAPACITY, status);
- appendWithSep(resultRemainder, keyDisplayName(key, temp))
- .append("=")
- .append(keyValueDisplayName(key, value, temp2));
+ 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)) {
+ UnicodeString temp3;
+ Formattable data[] = {
+ temp,
+ temp2
+ };
+ FieldPosition fpos;
+ status = U_ZERO_ERROR;
+ keyTypeFormat->format(data, 2, temp3, fpos, status);
+ appendWithSep(resultRemainder, temp3);
+ } else {
+ appendWithSep(resultRemainder, temp)
+ .append((UChar)0x3d /* = */)
+ .append(temp2);
+ }
}
delete e;
}
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);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
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
U_NAMESPACE_USE
-U_DRAFT ULocaleDisplayNames * U_EXPORT2
+U_CAPI ULocaleDisplayNames * U_EXPORT2
uldn_open(const char * locale,
UDialectHandling dialectHandling,
UErrorCode *pErrorCode) {
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();
return NULL;
}
-U_DRAFT UDialectHandling U_EXPORT2
+U_CAPI UDialectHandling U_EXPORT2
uldn_getDialectHandling(const ULocaleDisplayNames *ldn) {
if (ldn) {
return ((const LocaleDisplayNames *)ldn)->getDialectHandling();
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,
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,
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,
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,
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,
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,
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,
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,