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

Eike Rathke erack at redhat.com
Thu Sep 12 06:35:31 PDT 2013


 i18nlangtag/qa/cppunit/test_languagetag.cxx    |   36 ++++++++++++++++--
 i18nlangtag/source/languagetag/languagetag.cxx |   50 ++++++++++++++++++++-----
 2 files changed, 74 insertions(+), 12 deletions(-)

New commits:
commit bc3759f2dba31b958219f02b8bbb043d8bdb729f
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Sep 12 15:34:33 2013 +0200

    include legacy tags in fallback strings
    
    Change-Id: Ice3f4f061b1ae84d2d486e908399550770d5170a

diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx
index 72297cc..5f5f4b5 100644
--- a/i18nlangtag/qa/cppunit/test_languagetag.cxx
+++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx
@@ -141,6 +141,36 @@ void TestLanguageTag::testAllTags()
     }
 
     {
+        OUString s_sr_Latn_CS( "sr-Latn-CS" );
+        LanguageTag sr_Latn_CS( s_sr_Latn_CS, true );
+        lang::Locale aLocale = sr_Latn_CS.getLocale();
+        CPPUNIT_ASSERT( sr_Latn_CS.getBcp47() == s_sr_Latn_CS );
+        CPPUNIT_ASSERT( aLocale.Language == "qlt" );
+        CPPUNIT_ASSERT( aLocale.Country == "CS" );
+        CPPUNIT_ASSERT( aLocale.Variant == s_sr_Latn_CS );
+        CPPUNIT_ASSERT( sr_Latn_CS.getLanguageType() == LANGUAGE_SERBIAN_LATIN );
+        CPPUNIT_ASSERT( sr_Latn_CS.isValidBcp47() == true );
+        CPPUNIT_ASSERT( sr_Latn_CS.isIsoLocale() == false );
+        CPPUNIT_ASSERT( sr_Latn_CS.isIsoODF() == true );
+        CPPUNIT_ASSERT( sr_Latn_CS.getLanguage() == "sr" );
+        CPPUNIT_ASSERT( sr_Latn_CS.getCountry() == "CS" );
+        CPPUNIT_ASSERT( sr_Latn_CS.getScript() == "Latn" );
+        CPPUNIT_ASSERT( sr_Latn_CS.getLanguageAndScript() == "sr-Latn" );
+        ::std::vector< OUString > sr_Latn_CS_Fallbacks( sr_Latn_CS.getFallbackStrings( true));
+        CPPUNIT_ASSERT( sr_Latn_CS_Fallbacks.size() == 9);
+        CPPUNIT_ASSERT( sr_Latn_CS_Fallbacks[0] == "sr-Latn-CS");
+        CPPUNIT_ASSERT( sr_Latn_CS_Fallbacks[1] == "sr-Latn-YU");
+        CPPUNIT_ASSERT( sr_Latn_CS_Fallbacks[2] == "sh-CS");
+        CPPUNIT_ASSERT( sr_Latn_CS_Fallbacks[3] == "sh-YU");
+        CPPUNIT_ASSERT( sr_Latn_CS_Fallbacks[4] == "sr-Latn");
+        CPPUNIT_ASSERT( sr_Latn_CS_Fallbacks[5] == "sh");
+        CPPUNIT_ASSERT( sr_Latn_CS_Fallbacks[6] == "sr-CS");
+        CPPUNIT_ASSERT( sr_Latn_CS_Fallbacks[7] == "sr-YU");
+        CPPUNIT_ASSERT( sr_Latn_CS_Fallbacks[8] == "sr");
+        CPPUNIT_ASSERT( sr_Latn_CS.makeFallback().getBcp47() == "sr-Latn-CS");
+    }
+
+    {
         OUString s_sh_RS( "sh-RS" );
         LanguageTag sh_RS( s_sh_RS, true );
         lang::Locale aLocale = sh_RS.getLocale();
@@ -161,9 +191,9 @@ void TestLanguageTag::testAllTags()
         CPPUNIT_ASSERT( sh_RS_Fallbacks[0] == "sh-RS");
         CPPUNIT_ASSERT( sh_RS_Fallbacks[1] == "sr-Latn-RS");
         CPPUNIT_ASSERT( sh_RS_Fallbacks[2] == "sr-Latn");
-        CPPUNIT_ASSERT( sh_RS_Fallbacks[3] == "sr-RS");
-        CPPUNIT_ASSERT( sh_RS_Fallbacks[4] == "sr");
-        CPPUNIT_ASSERT( sh_RS_Fallbacks[5] == "sh");
+        CPPUNIT_ASSERT( sh_RS_Fallbacks[3] == "sh");
+        CPPUNIT_ASSERT( sh_RS_Fallbacks[4] == "sr-RS");
+        CPPUNIT_ASSERT( sh_RS_Fallbacks[5] == "sr");
         CPPUNIT_ASSERT( sh_RS.makeFallback().getBcp47() == "sr-Latn-RS");
         CPPUNIT_ASSERT( sh_RS.getBcp47() == "sr-Latn-RS");
         CPPUNIT_ASSERT( sh_RS.getLanguageType() == LANGUAGE_USER_SERBIAN_LATIN_SERBIA );
diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx
index 46579e2..504d90a 100644
--- a/i18nlangtag/source/languagetag/languagetag.cxx
+++ b/i18nlangtag/source/languagetag/languagetag.cxx
@@ -1241,9 +1241,14 @@ LanguageTag & LanguageTag::makeFallback()
             }
             else if (aLanguage == "sh")
             {
-                ::std::vector< OUString > aRep( LanguageTag( "sr-Latn-" + aCountry).getFallbackStrings( true));
-                aVec.insert( aVec.end(), aRep.begin(), aRep.end());
-                aVec.push_back( aLanguage);     // 'sh' after all 'sr...'?
+                // Manual list instead of calling
+                // LanguageTag( "sr-Latn-" + aCountry).getFallbackStrings( true)
+                // that would also include "sh-*" again.
+                aVec.push_back( "sr-Latn-" + aCountry);
+                aVec.push_back( "sr-Latn");
+                aVec.push_back( "sh");  // legacy with script, before default script with country
+                aVec.push_back( "sr-" + aCountry);
+                aVec.push_back( "sr");
             }
             else if (aLanguage == "ca" && aCountry == "XV")
             {
@@ -1260,8 +1265,8 @@ LanguageTag & LanguageTag::makeFallback()
                 aVec.push_back( aLanguage);
             if (aLanguage == "sh")
             {
-                ::std::vector< OUString > aRep( LanguageTag( "sr-Latn").getFallbackStrings( true));
-                aVec.insert( aVec.end(), aRep.begin(), aRep.end());
+                aVec.push_back( "sr-Latn");
+                aVec.push_back( "sr");
             }
         }
         return aVec;
@@ -1270,11 +1275,12 @@ LanguageTag & LanguageTag::makeFallback()
     getBcp47();     // have maBcp47 now
     if (bIncludeFullBcp47)
         aVec.push_back( maBcp47);
+    OUString aScript;
     OUString aVariants( getVariants());
     OUString aTmp;
     if (hasScript())
     {
-        OUString aScript( getScript());
+        aScript = getScript();
         bool bHaveLanguageScriptVariant = false;
         if (!aCountry.isEmpty())
         {
@@ -1293,6 +1299,18 @@ LanguageTag & LanguageTag::makeFallback()
             aTmp = aLanguage + "-" + aScript + "-" + aCountry;
             if (aTmp != maBcp47)
                 aVec.push_back( aTmp);
+            if (aLanguage == "sr" && aScript == "Latn")
+            {
+                // sr-Latn-CS => sr-Latn-YU, sh-CS, sh-YU
+                if (aCountry == "CS")
+                {
+                    aVec.push_back( "sr-Latn-YU");
+                    aVec.push_back( "sh-CS");
+                    aVec.push_back( "sh-YU");
+                }
+                else
+                    aVec.push_back( "sh-" + aCountry);
+            }
         }
         if (!aVariants.isEmpty() && !bHaveLanguageScriptVariant)
         {
@@ -1303,6 +1321,10 @@ LanguageTag & LanguageTag::makeFallback()
         aTmp = aLanguage + "-" + aScript;
         if (aTmp != maBcp47)
             aVec.push_back( aTmp);
+        // 'sh' actually denoted a script, so have it here instead of appended
+        // at the end as language-only.
+        if (aLanguage == "sr" && aScript == "Latn")
+            aVec.push_back( "sh");
     }
     bool bHaveLanguageVariant = false;
     if (!aCountry.isEmpty())
@@ -1329,9 +1351,19 @@ LanguageTag & LanguageTag::makeFallback()
         if (aTmp != maBcp47)
             aVec.push_back( aTmp);
     }
-    aTmp = aLanguage;
-    if (aTmp != maBcp47)
-        aVec.push_back( aTmp);
+
+    // Insert legacy fallbacks with country before language-only, but only
+    // default script, script was handled already above.
+    if (!aCountry.isEmpty())
+    {
+        if (aLanguage == "sr" && aCountry == "CS")
+            aVec.push_back( "sr-YU");
+    }
+
+    // Original language-only.
+    if (aLanguage != maBcp47)
+        aVec.push_back( aLanguage);
+
     return aVec;
 }
 


More information about the Libreoffice-commits mailing list