diff options
author | Eike Rathke <erack@redhat.com> | 2013-09-12 15:34:33 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2013-09-12 15:35:09 +0200 |
commit | bc3759f2dba31b958219f02b8bbb043d8bdb729f (patch) | |
tree | 69bf11211d64a2bf76444b2216fb3e45af0e9d08 | |
parent | b6807fd38373c98adc276697c24dcfcdf9471ac0 (diff) |
include legacy tags in fallback strings
Change-Id: Ice3f4f061b1ae84d2d486e908399550770d5170a
-rw-r--r-- | i18nlangtag/qa/cppunit/test_languagetag.cxx | 36 | ||||
-rw-r--r-- | i18nlangtag/source/languagetag/languagetag.cxx | 50 |
2 files changed, 74 insertions, 12 deletions
diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx index 72297cc50c8e..5f5f4b5ace66 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 46579e27daa1..504d90a2c4ad 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; } |