From b614ceb80c6648ccae4a0f431eec139aea6a6554 Mon Sep 17 00:00:00 2001 From: Eike Rathke Date: Tue, 14 Mar 2017 15:02:46 +0100 Subject: 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 --- i18nlangtag/qa/cppunit/test_languagetag.cxx | 24 ++++++++------ i18nlangtag/source/isolang/isolang.cxx | 50 +++++++++++++++++++++-------- i18nlangtag/source/isolang/mslangid.cxx | 5 +++ 3 files changed, 56 insertions(+), 23 deletions(-) (limited to 'i18nlangtag') 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(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(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(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(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; + } } } @@ -1033,6 +1044,19 @@ css::lang::Locale MsLangId::Conversion::getLocale( const IsoLanguageScriptCountr return pEntry->getLocale(); } +// 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; } -- cgit