summaryrefslogtreecommitdiff
path: root/i18nlangtag/source/languagetag
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2013-10-25 17:52:22 +0200
committerEike Rathke <erack@redhat.com>2013-10-25 17:58:11 +0200
commitfed7a57fcdabbc0c0f570d9b6360522ae22f5e0a (patch)
tree53f919211e40d1e685cb2f4419ee8d564982d282 /i18nlangtag/source/languagetag
parent986fa38eb23a397546061c3ce0df9077ba334a07 (diff)
more flexible language tag override mechanism
* allow overriding higher level lll-Ssss-CC with lower level lll-CC for known MS-LangID mappings that use tags with suppress-script * internal override "canonicalization", e.g. ca-XV => ca-ES-valencia Change-Id: I067d7515fb9144a896697617ad1b079e294f1ced
Diffstat (limited to 'i18nlangtag/source/languagetag')
-rw-r--r--i18nlangtag/source/languagetag/languagetag.cxx25
1 files changed, 21 insertions, 4 deletions
diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx
index 689a9854f3b4..b0a8f4d58517 100644
--- a/i18nlangtag/source/languagetag/languagetag.cxx
+++ b/i18nlangtag/source/languagetag/languagetag.cxx
@@ -924,7 +924,8 @@ LanguageTag::ImplPtr LanguageTag::registerImpl() const
{
if (pImpl->mnLangID != LANGUAGE_DONTKNOW)
{
- // May have involved canonicalize(), so compare with pImpl->maBcp47!
+ // May have involved canonicalize(), so compare with
+ // pImpl->maBcp47 instead of maBcp47!
aBcp47 = LanguageTagImpl::convertToBcp47(
MsLangId::Conversion::convertLanguageToLocale( pImpl->mnLangID, true));
bInsert = (aBcp47 == pImpl->maBcp47);
@@ -1156,6 +1157,19 @@ bool LanguageTagImpl::canonicalize()
meIsLiblangtagNeeded = DECISION_NO; // known fallback
}
}
+ // We may have an internal override "canonicalization".
+ lang::Locale aNew( MsLangId::Conversion::getOverride( maLocale));
+ if (!aNew.Language.isEmpty() &&
+ (aNew.Language != maLocale.Language ||
+ aNew.Country != maLocale.Country ||
+ aNew.Variant != maLocale.Variant))
+ {
+ maBcp47 = LanguageTagImpl::convertToBcp47( aNew);
+ bChanged = true;
+ meIsIsoLocale = DECISION_DONTKNOW;
+ meIsIsoODF = DECISION_DONTKNOW;
+ meIsLiblangtagNeeded = DECISION_NO; // known locale
+ }
}
if (bTemporaryLocale)
{
@@ -1173,6 +1187,7 @@ bool LanguageTagImpl::canonicalize()
meIsValid = DECISION_YES; // really, known must be valid ...
return bChanged; // that's it
}
+
meIsLiblangtagNeeded = DECISION_YES;
SAL_INFO( "i18nlangtag", "LanguageTagImpl::canonicalize: using liblangtag for '" << maBcp47 << "'");
@@ -1190,12 +1205,12 @@ bool LanguageTagImpl::canonicalize()
SAL_WARN_IF( !pTag, "i18nlangtag", "LanguageTagImpl::canonicalize: could not canonicalize '" << maBcp47 << "'");
if (pTag)
{
- OUString aOld( maBcp47);
- maBcp47 = OUString::createFromAscii( pTag);
+ OUString aNew( OUString::createFromAscii( pTag));
// Make the lt_tag_t follow the new string if different, which
// removes default script and such.
- if (maBcp47 != aOld)
+ if (maBcp47 != aNew)
{
+ maBcp47 = aNew;
bChanged = true;
meIsIsoLocale = DECISION_DONTKNOW;
meIsIsoODF = DECISION_DONTKNOW;
@@ -2182,6 +2197,8 @@ LanguageTag & LanguageTag::makeFallback()
aTmp = aLanguage + "-" + aCountry + "-" + aVariants;
if (aTmp != maBcp47)
aVec.push_back( aTmp);
+ if (maBcp47 == "ca-ES-valencia")
+ aVec.push_back( "ca-XV");
// Language with variant but without country before language
// without variant but with country.
// But only if variant is not from a grandfathered tag that