Skip to content

Commit

Permalink
ICU-12760 support UDISPCTX_TYPE_SUBSTITUTE_HANDLING
Browse files Browse the repository at this point in the history
add tests

remove printf

fix localeDisplayName and add tests

fix fallback

remove get
  • Loading branch information
FrankYFTang committed May 14, 2019
1 parent 14649a4 commit 53dd621
Show file tree
Hide file tree
Showing 3 changed files with 238 additions and 20 deletions.
95 changes: 75 additions & 20 deletions icu4c/source/common/locdspnm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,7 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames {
UnicodeString formatCloseParen;
UnicodeString formatReplaceCloseParen;
UDisplayContext nameLength;
UDisplayContext substitute;

// Constants for capitalization context usage types.
enum CapContextUsage {
Expand Down Expand Up @@ -337,7 +338,7 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames {
UnicodeString& result) const;
private:
UnicodeString& localeIdName(const char* localeId,
UnicodeString& result) const;
UnicodeString& result, bool substitute) const;
UnicodeString& appendWithSep(UnicodeString& buffer, const UnicodeString& src) const;
UnicodeString& adjustForUsageAndContext(CapContextUsage usage, UnicodeString& result) const;
UnicodeString& scriptDisplayName(const char* script, UnicodeString& result, UBool skipAdjust) const;
Expand All @@ -359,6 +360,7 @@ LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale,
, capitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
, capitalizationBrkIter(NULL)
, nameLength(UDISPCTX_LENGTH_FULL)
, substitute(UDISPCTX_SUBSTITUTE)
{
initialize();
}
Expand All @@ -371,6 +373,7 @@ LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale,
, capitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
, capitalizationBrkIter(NULL)
, nameLength(UDISPCTX_LENGTH_FULL)
, substitute(UDISPCTX_SUBSTITUTE)
{
while (length-- > 0) {
UDisplayContext value = *contexts++;
Expand All @@ -385,6 +388,9 @@ LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale,
case UDISPCTX_TYPE_DISPLAY_LENGTH:
nameLength = value;
break;
case UDISPCTX_TYPE_SUBSTITUTE_HANDLING:
substitute = value;
break;
default:
break;
}
Expand Down Expand Up @@ -535,6 +541,8 @@ LocaleDisplayNamesImpl::getContext(UDisplayContextType type) const {
return capitalizationContext;
case UDISPCTX_TYPE_DISPLAY_LENGTH:
return nameLength;
case UDISPCTX_TYPE_SUBSTITUTE_HANDLING:
return substitute;
default:
break;
}
Expand Down Expand Up @@ -583,7 +591,7 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc,
do { // loop construct is so we can break early out of search
if (hasScript && hasCountry) {
ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, "_", country, (char *)0);
localeIdName(buffer, resultName);
localeIdName(buffer, resultName, false);
if (!resultName.isBogus()) {
hasScript = FALSE;
hasCountry = FALSE;
Expand All @@ -592,15 +600,15 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc,
}
if (hasScript) {
ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, (char *)0);
localeIdName(buffer, resultName);
localeIdName(buffer, resultName, false);
if (!resultName.isBogus()) {
hasScript = FALSE;
break;
}
}
if (hasCountry) {
ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", country, (char*)0);
localeIdName(buffer, resultName);
localeIdName(buffer, resultName, false);
if (!resultName.isBogus()) {
hasCountry = FALSE;
break;
Expand All @@ -609,21 +617,40 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc,
} while (FALSE);
}
if (resultName.isBogus() || resultName.isEmpty()) {
localeIdName(lang, resultName);
localeIdName(lang, resultName, substitute == UDISPCTX_SUBSTITUTE);
if (resultName.isBogus()) {
result.setToBogus();
return result;
}
}

UnicodeString resultRemainder;
UnicodeString temp;
UErrorCode status = U_ZERO_ERROR;

if (hasScript) {
resultRemainder.append(scriptDisplayName(script, temp, TRUE));
UnicodeString script_str = scriptDisplayName(script, temp, TRUE);
if (script_str.isBogus()) {
result.setToBogus();
return result;
}
resultRemainder.append(script_str);
}
if (hasCountry) {
appendWithSep(resultRemainder, regionDisplayName(country, temp, TRUE));
UnicodeString region_str = regionDisplayName(country, temp, TRUE);
if (region_str.isBogus()) {
result.setToBogus();
return result;
}
appendWithSep(resultRemainder, region_str);
}
if (hasVariant) {
appendWithSep(resultRemainder, variantDisplayName(variant, temp, TRUE));
UnicodeString variant_str = variantDisplayName(variant, temp, TRUE);
if (variant_str.isBogus()) {
result.setToBogus();
return result;
}
appendWithSep(resultRemainder, variant_str);
}
resultRemainder.findAndReplace(formatOpenParen, formatReplaceOpenParen);
resultRemainder.findAndReplace(formatCloseParen, formatReplaceCloseParen);
Expand Down Expand Up @@ -689,14 +716,18 @@ LocaleDisplayNamesImpl::localeDisplayName(const char* localeId,
// private
UnicodeString&
LocaleDisplayNamesImpl::localeIdName(const char* localeId,
UnicodeString& result) const {
UnicodeString& result, bool substitute) const {
if (nameLength == UDISPCTX_LENGTH_SHORT) {
langData.getNoFallback("Languages%short", localeId, result);
if (!result.isBogus()) {
return result;
}
}
return langData.getNoFallback("Languages", localeId, result);
if (substitute) {
return langData.get("Languages", localeId, result);
} else {
return langData.getNoFallback("Languages", localeId, result);
}
}

UnicodeString&
Expand All @@ -706,12 +737,16 @@ LocaleDisplayNamesImpl::languageDisplayName(const char* lang,
return result = UnicodeString(lang, -1, US_INV);
}
if (nameLength == UDISPCTX_LENGTH_SHORT) {
langData.get("Languages%short", lang, result);
langData.getNoFallback("Languages%short", lang, result);
if (!result.isBogus()) {
return adjustForUsageAndContext(kCapContextUsageLanguage, result);
}
}
langData.get("Languages", lang, result);
if (substitute == UDISPCTX_SUBSTITUTE) {
langData.get("Languages", lang, result);
} else {
langData.getNoFallback("Languages", lang, result);
}
return adjustForUsageAndContext(kCapContextUsageLanguage, result);
}

Expand All @@ -720,12 +755,16 @@ LocaleDisplayNamesImpl::scriptDisplayName(const char* script,
UnicodeString& result,
UBool skipAdjust) const {
if (nameLength == UDISPCTX_LENGTH_SHORT) {
langData.get("Scripts%short", script, result);
langData.getNoFallback("Scripts%short", script, result);
if (!result.isBogus()) {
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageScript, result);
}
}
langData.get("Scripts", script, result);
if (substitute == UDISPCTX_SUBSTITUTE) {
langData.get("Scripts", script, result);
} else {
langData.getNoFallback("Scripts", script, result);
}
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageScript, result);
}

Expand All @@ -746,12 +785,16 @@ LocaleDisplayNamesImpl::regionDisplayName(const char* region,
UnicodeString& result,
UBool skipAdjust) const {
if (nameLength == UDISPCTX_LENGTH_SHORT) {
regionData.get("Countries%short", region, result);
regionData.getNoFallback("Countries%short", region, result);
if (!result.isBogus()) {
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageTerritory, result);
}
}
regionData.get("Countries", region, result);
if (substitute == UDISPCTX_SUBSTITUTE) {
regionData.get("Countries", region, result);
} else {
regionData.getNoFallback("Countries", region, result);
}
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageTerritory, result);
}

Expand All @@ -767,7 +810,11 @@ LocaleDisplayNamesImpl::variantDisplayName(const char* variant,
UnicodeString& result,
UBool skipAdjust) const {
// don't have a resource for short variant names
langData.get("Variants", variant, result);
if (substitute == UDISPCTX_SUBSTITUTE) {
langData.get("Variants", variant, result);
} else {
langData.getNoFallback("Variants", variant, result);
}
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageVariant, result);
}

Expand All @@ -782,7 +829,11 @@ LocaleDisplayNamesImpl::keyDisplayName(const char* key,
UnicodeString& result,
UBool skipAdjust) const {
// don't have a resource for short key names
langData.get("Keys", key, result);
if (substitute == UDISPCTX_SUBSTITUTE) {
langData.get("Keys", key, result);
} else {
langData.getNoFallback("Keys", key, result);
}
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageKey, result);
}

Expand Down Expand Up @@ -815,12 +866,16 @@ LocaleDisplayNamesImpl::keyValueDisplayName(const char* key,
}

if (nameLength == UDISPCTX_LENGTH_SHORT) {
langData.get("Types%short", key, value, result);
langData.getNoFallback("Types%short", key, value, result);
if (!result.isBogus()) {
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageKeyValue, result);
}
}
langData.get("Types", key, value, result);
if (substitute == UDISPCTX_SUBSTITUTE) {
langData.get("Types", key, value, result);
} else {
langData.getNoFallback("Types", key, value, result);
}
return skipAdjust? result: adjustForUsageAndContext(kCapContextUsageKeyValue, result);
}

Expand Down
Loading

0 comments on commit 53dd621

Please sign in to comment.