summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2013-09-12 15:34:33 +0200
committerEike Rathke <erack@redhat.com>2013-09-12 15:35:09 +0200
commitbc3759f2dba31b958219f02b8bbb043d8bdb729f (patch)
tree69bf11211d64a2bf76444b2216fb3e45af0e9d08
parentb6807fd38373c98adc276697c24dcfcdf9471ac0 (diff)
include legacy tags in fallback strings
Change-Id: Ice3f4f061b1ae84d2d486e908399550770d5170a
-rw-r--r--i18nlangtag/qa/cppunit/test_languagetag.cxx36
-rw-r--r--i18nlangtag/source/languagetag/languagetag.cxx50
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;
}