[Libreoffice-commits] core.git: i18nlangtag/qa i18nlangtag/source include/i18nlangtag svtools/source

Eike Rathke erack at redhat.com
Tue Mar 14 14:13:33 UTC 2017


 i18nlangtag/qa/cppunit/test_languagetag.cxx |   24 +++++++------
 i18nlangtag/source/isolang/isolang.cxx      |   50 ++++++++++++++++++++--------
 i18nlangtag/source/isolang/mslangid.cxx     |    5 ++
 include/i18nlangtag/mslangid.hxx            |    5 ++
 svtools/source/misc/langtab.src             |    2 -
 5 files changed, 62 insertions(+), 24 deletions(-)

New commits:
commit b614ceb80c6648ccae4a0f431eec139aea6a6554
Author: Eike Rathke <erack at redhat.com>
Date:   Tue Mar 14 15:02:46 2017 +0100

    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

diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx
index c211c68..bec6ed9 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 bbe0c47..a35fef0 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 7d53cd0..9552318 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;
 }
diff --git a/include/i18nlangtag/mslangid.hxx b/include/i18nlangtag/mslangid.hxx
index c3b73c8..1b0d659 100644
--- a/include/i18nlangtag/mslangid.hxx
+++ b/include/i18nlangtag/mslangid.hxx
@@ -29,6 +29,7 @@
 
 struct IsoLanguageCountryEntry;
 struct IsoLanguageScriptCountryEntry;
+struct Bcp47CountryEntry;
 
 /** Methods related to Microsoft language IDs. For details about MS-LANGIDs
     please see lang.h */
@@ -267,6 +268,10 @@ public:
         I18NLANGTAG_DLLPRIVATE static css::lang::Locale getLocale(
                 const IsoLanguageScriptCountryEntry * pEntry );
 
+        /** Used by lookupFallbackLocale(Locale) */
+        I18NLANGTAG_DLLPRIVATE static css::lang::Locale getLocale(
+                const Bcp47CountryEntry * pEntry );
+
 
         /** Convert a LanguageType to a Locale.
 
diff --git a/svtools/source/misc/langtab.src b/svtools/source/misc/langtab.src
index cce48f4..deb6282 100644
--- a/svtools/source/misc/langtab.src
+++ b/svtools/source/misc/langtab.src
@@ -84,7 +84,7 @@ StringArray STR_ARR_SVT_LANGUAGE_TABLE
         < "Dutch (Belgium)" ; LANGUAGE_DUTCH_BELGIAN ; > ;
         < "English (USA)" ; LANGUAGE_ENGLISH_US ; > ;
         < "English (UK)" ; LANGUAGE_ENGLISH_UK ; > ;
-        < "English, OED spelling (UK)" ; LANGUAGE_USER_ENGLISH_UK_OED ; > ;
+        < "English, OED spelling (UK)" ; LANGUAGE_USER_ENGLISH_UK_OXENDICT ; > ;
         < "English (Australia)" ; LANGUAGE_ENGLISH_AUS ; > ;
         < "English (Canada)" ; LANGUAGE_ENGLISH_CAN ; > ;
         < "English (New Zealand)" ; LANGUAGE_ENGLISH_NZ ; > ;


More information about the Libreoffice-commits mailing list