diff options
author | Eike Rathke <erack@redhat.com> | 2013-07-09 19:58:48 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2013-07-09 20:02:20 +0200 |
commit | 467cef426a84604263923d654213e14b4d29bbef (patch) | |
tree | 435d2905530eadf14687c5e40aa6dcd1474be83a /i18nlangtag | |
parent | 87bad231d6f81c611ba145aea483a568623ca42e (diff) |
let getLanguageType() resolve unknown due to present default script
Change-Id: I54170c7f2183ec2615aca875031148c85c939108
Diffstat (limited to 'i18nlangtag')
-rw-r--r-- | i18nlangtag/source/languagetag/languagetag.cxx | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx index 673960f478ab..7d475806b3c9 100644 --- a/i18nlangtag/source/languagetag/languagetag.cxx +++ b/i18nlangtag/source/languagetag/languagetag.cxx @@ -433,6 +433,8 @@ bool LanguageTag::canonicalize() dumper aDumper( &mpImplLangtag); #endif + bool bChanged = false; + // Side effect: have maBcp47 in any case, resolved system. // Some methods calling canonicalize() (or not calling it due to // meIsLiblangtagNeeded==DECISION_NO) rely on this! Hence do not set @@ -517,7 +519,7 @@ bool LanguageTag::canonicalize() if (meIsLiblangtagNeeded == DECISION_NO) { meIsValid = DECISION_YES; // really, known must be valid ... - return true; // that's it + return bChanged; // that's it } meIsLiblangtagNeeded = DECISION_YES; SAL_INFO( "i18nlangtag", "LanguageTag::canonicalize: using liblangtag for " << maBcp47); @@ -542,17 +544,20 @@ bool LanguageTag::canonicalize() // removes default script and such. if (maBcp47 != aOld) { + bChanged = true; + meIsIsoLocale = DECISION_DONTKNOW; + meIsIsoODF = DECISION_DONTKNOW; if (!lt_tag_parse( MPLANGTAG, pTag, &aError.p)) { SAL_WARN( "i18nlangtag", "LanguageTag::canonicalize: could not reparse " << maBcp47); free( pTag); meIsValid = DECISION_NO; - return false; + return bChanged; } } free( pTag); meIsValid = DECISION_YES; - return true; + return bChanged; } } else @@ -560,7 +565,25 @@ bool LanguageTag::canonicalize() SAL_INFO( "i18nlangtag", "LanguageTag::canonicalize: could not parse " << maBcp47); } meIsValid = DECISION_NO; - return false; + return bChanged; +} + + +bool LanguageTag::synCanonicalize() +{ + bool bChanged = false; + if (meIsLiblangtagNeeded != DECISION_NO && !mpImplLangtag) + { + bChanged = canonicalize(); + if (bChanged) + { + if (mbInitializedLocale) + convertBcp47ToLocale(); + if (mbInitializedLangID) + convertBcp47ToLang(); + } + } + return bChanged; } @@ -733,8 +756,7 @@ const OUString & LanguageTag::getBcp47( bool bResolveSystem ) const OUString LanguageTag::getLanguageFromLangtag() { OUString aLanguage; - if (meIsLiblangtagNeeded != DECISION_NO && !mpImplLangtag) - canonicalize(); + synCanonicalize(); if (maBcp47.isEmpty()) return aLanguage; if (mpImplLangtag) @@ -760,8 +782,7 @@ OUString LanguageTag::getLanguageFromLangtag() OUString LanguageTag::getScriptFromLangtag() { OUString aScript; - if (meIsLiblangtagNeeded != DECISION_NO && !mpImplLangtag) - canonicalize(); + synCanonicalize(); if (maBcp47.isEmpty()) return aScript; if (mpImplLangtag) @@ -787,8 +808,7 @@ OUString LanguageTag::getScriptFromLangtag() OUString LanguageTag::getRegionFromLangtag() { OUString aRegion; - if (meIsLiblangtagNeeded != DECISION_NO && !mpImplLangtag) - canonicalize(); + synCanonicalize(); if (maBcp47.isEmpty()) return aRegion; if (mpImplLangtag) @@ -842,7 +862,16 @@ LanguageType LanguageTag::getLanguageType( bool bResolveSystem ) const if (mbInitializedBcp47) const_cast<LanguageTag*>(this)->convertBcp47ToLang(); else + { const_cast<LanguageTag*>(this)->convertLocaleToLang(); + + /* Resolve a locale only unknown due to some redundant information, + * like 'de-Latn-DE' with script tag. Never call canonicalize() + * from within convert...() methods due to possible recursion, so + * do it here. */ + if ((!mbSystemLocale && mnLangID == LANGUAGE_SYSTEM) || mnLangID == LANGUAGE_DONTKNOW) + const_cast<LanguageTag*>(this)->synCanonicalize(); + } } return mnLangID; } @@ -1030,8 +1059,7 @@ bool LanguageTag::isIsoLocale() const { if (meIsIsoLocale == DECISION_DONTKNOW) { - if (meIsLiblangtagNeeded != DECISION_NO && !mpImplLangtag) - const_cast<LanguageTag*>(this)->canonicalize(); + const_cast<LanguageTag*>(this)->synCanonicalize(); // It must be at most ll-CC or lll-CC // Do not use getCountry() here, use getRegion() instead. meIsIsoLocale = ((maBcp47.isEmpty() || @@ -1046,8 +1074,7 @@ bool LanguageTag::isIsoODF() const { if (meIsIsoODF == DECISION_DONTKNOW) { - if (meIsLiblangtagNeeded != DECISION_NO && !mpImplLangtag) - const_cast<LanguageTag*>(this)->canonicalize(); + const_cast<LanguageTag*>(this)->synCanonicalize(); if (!isIsoScript( getScript())) return ((meIsIsoODF = DECISION_NO) == DECISION_YES); // The usual case is lll-CC so simply check that first. @@ -1067,8 +1094,7 @@ bool LanguageTag::isValidBcp47() const { if (meIsValid == DECISION_DONTKNOW) { - if (meIsLiblangtagNeeded != DECISION_NO && !mpImplLangtag) - const_cast<LanguageTag*>(this)->canonicalize(); + const_cast<LanguageTag*>(this)->synCanonicalize(); SAL_WARN_IF( meIsValid == DECISION_DONTKNOW, "i18nlangtag", "LanguageTag::isValidBcp47: canonicalize() didn't set meIsValid"); } |