summaryrefslogtreecommitdiff
path: root/i18nlangtag
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2017-03-14 15:02:46 +0100
committerEike Rathke <erack@redhat.com>2017-03-14 15:12:49 +0100
commitb614ceb80c6648ccae4a0f431eec139aea6a6554 (patch)
treebb6e06a9df9501b6634255ec50dc43474cc663e6 /i18nlangtag
parent1eb69f6b9c78b19d3944c90c17ff8d498affc316 (diff)
tdf#100462 prefer en-GB-oxendict over en-GB-oed
And make en-GB-oed just an alias of en-GB-oxendict. Change-Id: I73c1208f85d06360dbd8def0b8d916cddfe59aca
Diffstat (limited to 'i18nlangtag')
-rw-r--r--i18nlangtag/qa/cppunit/test_languagetag.cxx24
-rw-r--r--i18nlangtag/source/isolang/isolang.cxx50
-rw-r--r--i18nlangtag/source/isolang/mslangid.cxx5
3 files changed, 56 insertions, 23 deletions
diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx
index c211c68422a9..bec6ed991da0 100644
--- a/i18nlangtag/qa/cppunit/test_languagetag.cxx
+++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx
@@ -387,26 +387,29 @@ void TestLanguageTag::testAllTags()
// 'en-GB-oed' is known grandfathered for English, Oxford English
// Dictionary spelling.
// Deprecated as of 2015-04-17, prefer en-GB-oxendict instead.
+ // As of 2017-03-14 we also alias to en-GB-oxendict.
{
OUString s_en_GB_oed( "en-GB-oed" );
+ OUString s_en_GB_oxendict( "en-GB-oxendict" );
LanguageTag en_GB_oed( s_en_GB_oed );
lang::Locale aLocale = en_GB_oed.getLocale();
- CPPUNIT_ASSERT_EQUAL( s_en_GB_oed, en_GB_oed.getBcp47() );
+ CPPUNIT_ASSERT_EQUAL( s_en_GB_oxendict, en_GB_oed.getBcp47() );
CPPUNIT_ASSERT_EQUAL( OUString("qlt"), aLocale.Language );
- CPPUNIT_ASSERT_EQUAL( OUString("GB"), aLocale.Country ); // only 'GB' because we handle it, liblangtag would not fill this
- CPPUNIT_ASSERT_EQUAL( s_en_GB_oed, aLocale.Variant );
- CPPUNIT_ASSERT_EQUAL( static_cast<LanguageType>(LANGUAGE_USER_ENGLISH_UK_OED), en_GB_oed.getLanguageType() );
+ CPPUNIT_ASSERT_EQUAL( OUString("GB"), aLocale.Country );
+ CPPUNIT_ASSERT_EQUAL( s_en_GB_oxendict, aLocale.Variant );
+ CPPUNIT_ASSERT_EQUAL( static_cast<LanguageType>(LANGUAGE_USER_ENGLISH_UK_OXENDICT), en_GB_oed.getLanguageType() );
CPPUNIT_ASSERT( en_GB_oed.isValidBcp47() );
CPPUNIT_ASSERT( !en_GB_oed.isIsoLocale() );
CPPUNIT_ASSERT( !en_GB_oed.isIsoODF() );
CPPUNIT_ASSERT_EQUAL( OUString("en"), en_GB_oed.getLanguageAndScript() );
- CPPUNIT_ASSERT_EQUAL( OUString("oed"), en_GB_oed.getVariants() );
+ CPPUNIT_ASSERT_EQUAL( OUString("oxendict"), en_GB_oed.getVariants() );
::std::vector< OUString > en_GB_oed_Fallbacks( en_GB_oed.getFallbackStrings( true));
- CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(4), en_GB_oed_Fallbacks.size() );
- CPPUNIT_ASSERT_EQUAL( OUString("en-GB-oed"), en_GB_oed_Fallbacks[0]);
- CPPUNIT_ASSERT_EQUAL( OUString("en-GB-oxendict"), en_GB_oed_Fallbacks[1]);
- CPPUNIT_ASSERT_EQUAL( OUString("en-GB"), en_GB_oed_Fallbacks[2]);
- CPPUNIT_ASSERT_EQUAL( OUString("en"), en_GB_oed_Fallbacks[3]);
+ CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(5), en_GB_oed_Fallbacks.size() );
+ CPPUNIT_ASSERT_EQUAL( OUString("en-GB-oxendict"), en_GB_oed_Fallbacks[0]);
+ CPPUNIT_ASSERT_EQUAL( OUString("en-GB-oed"), en_GB_oed_Fallbacks[1]);
+ CPPUNIT_ASSERT_EQUAL( OUString("en-oxendict"), en_GB_oed_Fallbacks[2]);
+ CPPUNIT_ASSERT_EQUAL( OUString("en-GB"), en_GB_oed_Fallbacks[3]);
+ CPPUNIT_ASSERT_EQUAL( OUString("en"), en_GB_oed_Fallbacks[4]);
// 'en-oed' is not a valid fallback!
}
@@ -688,6 +691,7 @@ bool checkMapping( const OUString& rStr1, const OUString& rStr2 )
if (rStr1 == "eu" ) return rStr2 == "eu-ES";
if (rStr1 == "crk-Latn-CN" ) return rStr2 == "crk-Latn-CA";
if (rStr1 == "crk-Cans-CN" ) return rStr2 == "crk-Cans-CA";
+ if (rStr1 == "en-GB-oed" ) return rStr2 == "en-GB-oxendict";
return rStr1 == rStr2;
}
diff --git a/i18nlangtag/source/isolang/isolang.cxx b/i18nlangtag/source/isolang/isolang.cxx
index bbe0c47002b9..a35fef08b7f9 100644
--- a/i18nlangtag/source/isolang/isolang.cxx
+++ b/i18nlangtag/source/isolang/isolang.cxx
@@ -96,6 +96,7 @@ struct Bcp47CountryEntry
const sal_Char* mpBcp47;
sal_Char maCountry[3];
const sal_Char* mpFallback;
+ LanguageType mnOverride;
/** Obtain a language tag string with '-' separator. */
OUString getTagString() const;
@@ -756,12 +757,12 @@ static IsoLanguageScriptCountryEntry const aImplIsoLangScriptEntries[] =
static Bcp47CountryEntry const aImplBcp47CountryEntries[] =
{
// MS-LangID full BCP47, ISO3166, ISO639-Variant or other fallback
- { LANGUAGE_CATALAN_VALENCIAN, "ca-ES-valencia", "ES", "ca-valencia" },
- { LANGUAGE_OBSOLETE_USER_CATALAN_VALENCIAN, "ca-ES-valencia", "ES", "" }, // In case MS format files using the old value escaped into the wild, map them back.
- { LANGUAGE_USER_ENGLISH_UK_OED, "en-GB-oed", "GB", "" }, // grandfathered, deprecated, prefer en-GB-oxendict
- { LANGUAGE_USER_ENGLISH_UK_OXENDICT,"en-GB-oxendict", "GB", "" },
-// { LANGUAGE_YUE_CHINESE_HONGKONG, "zh-yue-HK", "HK", "" }, // MS reserved, prefer yue-HK; do not add unless LanguageTag::simpleExtract() can handle it to not call liblangtag for rsc!
- { LANGUAGE_DONTKNOW, "", "", "" } // marks end of table
+ { LANGUAGE_CATALAN_VALENCIAN, "ca-ES-valencia", "ES", "ca-valencia", 0 },
+ { LANGUAGE_OBSOLETE_USER_CATALAN_VALENCIAN, "ca-ES-valencia", "ES", "", 0 }, // In case MS format files using the old value escaped into the wild, map them back.
+ { LANGUAGE_USER_ENGLISH_UK_OXENDICT, "en-GB-oxendict", "GB", "", 0 },
+ { LANGUAGE_USER_ENGLISH_UK_OED, "en-GB-oed", "GB", "", LANGUAGE_USER_ENGLISH_UK_OXENDICT }, // grandfathered, deprecated, prefer en-GB-oxendict
+// { LANGUAGE_YUE_CHINESE_HONGKONG, "zh-yue-HK", "HK", "", 0 }, // MS reserved, prefer yue-HK; do not add unless LanguageTag::simpleExtract() can handle it to not call liblangtag for rsc!
+ { LANGUAGE_DONTKNOW, "", "", "", 0 } // marks end of table
};
static IsoLanguageCountryEntry aLastResortFallbackEntry =
@@ -928,6 +929,7 @@ static IsoLangOtherEntry const aImplPrivateUseEntries[] =
void MsLangId::Conversion::convertLanguageToLocaleImpl( LanguageType nLang,
css::lang::Locale & rLocale, bool bIgnoreOverride )
{
+ const Bcp47CountryEntry* pBcp47EntryOverride = nullptr;
const IsoLanguageScriptCountryEntry* pScriptEntryOverride = nullptr;
const IsoLanguageCountryEntry* pEntryOverride = nullptr;
@@ -939,10 +941,19 @@ Label_Override_Lang_Locale:
{
if (pBcp47Entry->mnLang == nLang)
{
- rLocale.Language = I18NLANGTAG_QLT;
- rLocale.Country = OUString::createFromAscii( pBcp47Entry->maCountry);
- rLocale.Variant = pBcp47Entry->getTagString();
- return;
+ if (bIgnoreOverride || !pBcp47Entry->mnOverride)
+ {
+ rLocale.Language = I18NLANGTAG_QLT;
+ rLocale.Country = OUString::createFromAscii( pBcp47Entry->maCountry);
+ rLocale.Variant = pBcp47Entry->getTagString();
+ return;
+ }
+ else if (pBcp47Entry->mnOverride && pBcp47EntryOverride != pBcp47Entry)
+ {
+ pBcp47EntryOverride = pBcp47Entry;
+ nLang = getOverrideLang( pBcp47Entry->mnLang, pBcp47Entry->mnOverride);
+ goto Label_Override_Lang_Locale;
+ }
}
}
@@ -1034,6 +1045,19 @@ css::lang::Locale MsLangId::Conversion::getLocale( const IsoLanguageScriptCountr
}
// static
+css::lang::Locale MsLangId::Conversion::getLocale( const Bcp47CountryEntry * pEntry )
+{
+ if (pEntry->mnOverride)
+ {
+ lang::Locale aLocale;
+ convertLanguageToLocaleImpl( getOverrideLang( pEntry->mnLang, pEntry->mnOverride), aLocale, false);
+ return aLocale;
+ }
+ else
+ return pEntry->getLocale();
+}
+
+// static
css::lang::Locale MsLangId::Conversion::lookupFallbackLocale(
const css::lang::Locale & rLocale )
{
@@ -1052,7 +1076,7 @@ css::lang::Locale MsLangId::Conversion::lookupFallbackLocale(
{
if ( rLocale.Variant.equalsIgnoreAsciiCase( pBcp47Entry->getTagString()) ||
rLocale.Variant.equalsIgnoreAsciiCaseAscii( pBcp47Entry->mpFallback))
- return pBcp47Entry->getLocale();
+ return getLocale( pBcp47Entry); // may override
}
// Search in ISO lll-Ssss-CC
@@ -1183,7 +1207,7 @@ LanguageType MsLangId::Conversion::convertLocaleToLanguageImpl(
pBcp47Entry->mnLang != LANGUAGE_DONTKNOW; ++pBcp47Entry)
{
if (rLocale.Variant.equalsIgnoreAsciiCase( pBcp47Entry->getTagString()))
- return pBcp47Entry->mnLang;
+ return getOverrideLang( pBcp47Entry->mnLang, pBcp47Entry->mnOverride);
}
// Search in ISO lll-Ssss-CC
@@ -1230,7 +1254,7 @@ css::lang::Locale MsLangId::Conversion::getOverride( const css::lang::Locale& rL
pBcp47Entry->mnLang != LANGUAGE_DONTKNOW; ++pBcp47Entry)
{
if (rLocale.Variant.equalsIgnoreAsciiCase( pBcp47Entry->getTagString()))
- return rLocale; // no overrides
+ return getLocale( pBcp47Entry); // may override
}
// Search in ISO lll-Ssss-CC
diff --git a/i18nlangtag/source/isolang/mslangid.cxx b/i18nlangtag/source/isolang/mslangid.cxx
index 7d53cd0bc974..95523187a5f6 100644
--- a/i18nlangtag/source/isolang/mslangid.cxx
+++ b/i18nlangtag/source/isolang/mslangid.cxx
@@ -607,6 +607,11 @@ LanguageType MsLangId::getReplacementForObsoleteLanguage( LanguageType nLang, bo
case LANGUAGE_TIBETAN_BHUTAN:
nLang = LANGUAGE_DZONGKHA_BHUTAN;
break;
+
+ // en-GB-oed is deprecated, use en-GB-oxendict instead.
+ case LANGUAGE_USER_ENGLISH_UK_OED:
+ nLang = LANGUAGE_USER_ENGLISH_UK_OXENDICT;
+ break;
}
return nLang;
}