i18nlangtag/qa/cppunit/test_languagetag.cxx | 56 ++++++++++++----- i18nlangtag/source/languagetag/languagetag.cxx | 81 ++++++++++++++++++++++++- include/i18nlangtag/languagetag.hxx | 11 +++ 3 files changed, 131 insertions(+), 17 deletions(-)
New commits: commit b5f91618d710803a26fa23d154d7252384f74e6f Author: Eike Rathke <er...@redhat.com> Date: Wed Aug 28 17:57:27 2013 +0200 added unit test for ca-valencia Change-Id: I2a36296e1210e349a7b53d999a2438aa45f3e2c2 diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx index 2e82fcc..49c6c5f 100644 --- a/i18nlangtag/qa/cppunit/test_languagetag.cxx +++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx @@ -174,6 +174,28 @@ void TestLanguageTag::testAllTags() } { + OUString s_ca_valencia( "ca-valencia" ); + LanguageTag ca_valencia( s_ca_valencia, true ); + lang::Locale aLocale = ca_valencia.getLocale(); + CPPUNIT_ASSERT( ca_valencia.getBcp47() == s_ca_valencia ); + CPPUNIT_ASSERT( aLocale.Language == "qlt" ); + CPPUNIT_ASSERT( aLocale.Country == "" ); + CPPUNIT_ASSERT( aLocale.Variant == s_ca_valencia ); + CPPUNIT_ASSERT( ca_valencia.getLanguageType() == LANGUAGE_SYSTEM ); + CPPUNIT_ASSERT( ca_valencia.isValidBcp47() == true ); + CPPUNIT_ASSERT( ca_valencia.isIsoLocale() == false ); + CPPUNIT_ASSERT( ca_valencia.isIsoODF() == false ); + CPPUNIT_ASSERT( ca_valencia.getLanguage() == "ca" ); + CPPUNIT_ASSERT( ca_valencia.getCountry() == "" ); + CPPUNIT_ASSERT( ca_valencia.getScript() == "" ); + CPPUNIT_ASSERT( ca_valencia.getLanguageAndScript() == "ca" ); + ::std::vector< OUString > ca_ES_valencia_Fallbacks( ca_valencia.getFallbackStrings()); + CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks.size() == 2); + CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[0] == "ca-valencia"); + CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[1] == "ca"); + } + + { OUString s_de_DE( "de-DE" ); LanguageTag de_DE( s_de_DE, true ); lang::Locale aLocale = de_DE.getLocale(); commit c179594dafa156efdcef6051eff23e9f1b717d1b Author: Eike Rathke <er...@redhat.com> Date: Wed Aug 28 17:55:39 2013 +0200 need to check for variants in isIsoODF() Change-Id: I88be91690f11bc11d70bd54310d0130723245286 diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx index e4341d8..6c0581a 100644 --- a/i18nlangtag/source/languagetag/languagetag.cxx +++ b/i18nlangtag/source/languagetag/languagetag.cxx @@ -1123,10 +1123,11 @@ bool LanguageTag::isIsoODF() const if (isIsoLocale()) return ((meIsIsoODF = DECISION_YES) == DECISION_YES); // If this is not ISO locale for which script must not exist it can - // still be ISO locale plus ISO script lll-Ssss-CC + // still be ISO locale plus ISO script lll-Ssss-CC, but not ll-vvvv ... + // ll-vvvvvvvv meIsIsoODF = ((maBcp47.getLength() <= 11 && - isIsoLanguage( getLanguage()) && isIsoCountry( getRegion()) && isIsoScript( getScript())) ? - DECISION_YES : DECISION_NO); + isIsoLanguage( getLanguage()) && isIsoCountry( getRegion()) && isIsoScript( getScript()) && + getVariants().isEmpty()) ? DECISION_YES : DECISION_NO); } return meIsIsoODF == DECISION_YES; } commit 4a6ac8965b95b4775b438398a3e17d1b226bcea7 Author: Eike Rathke <er...@redhat.com> Date: Wed Aug 28 17:41:14 2013 +0200 added unit test for fallback strings Change-Id: Ife3694e9432141e638d8f6050f4e5335c254cdbf diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx index 41c1cc9..2e82fcc 100644 --- a/i18nlangtag/qa/cppunit/test_languagetag.cxx +++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx @@ -165,6 +165,12 @@ void TestLanguageTag::testAllTags() CPPUNIT_ASSERT( ca_ES_valencia.getCountry() == "ES" ); CPPUNIT_ASSERT( ca_ES_valencia.getScript() == "" ); CPPUNIT_ASSERT( ca_ES_valencia.getLanguageAndScript() == "ca" ); + ::std::vector< OUString > ca_ES_valencia_Fallbacks( ca_ES_valencia.getFallbackStrings()); + CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks.size() == 4); + CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[0] == "ca-ES-valencia"); + CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[1] == "ca-valencia"); + CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[2] == "ca-ES"); + CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[3] == "ca"); } { commit a95a980e1e338b238f70f010057b017e08b47d79 Author: Eike Rathke <er...@redhat.com> Date: Wed Aug 28 17:25:33 2013 +0200 reorder fall back strings for language with variant Change-Id: I0e67eec9efa32c1d3d3f8d3ad3845368822bb0ee diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx index baec229..e4341d8 100644 --- a/i18nlangtag/source/languagetag/languagetag.cxx +++ b/i18nlangtag/source/languagetag/languagetag.cxx @@ -1184,6 +1184,7 @@ LanguageTag & LanguageTag::makeFallback() if (hasScript()) { OUString aScript( getScript()); + bool bHaveLanguageScriptVariant = false; if (!aCountry.isEmpty()) { if (!aVariants.isEmpty()) @@ -1191,12 +1192,18 @@ LanguageTag & LanguageTag::makeFallback() aTmp = aLanguage + "-" + aScript + "-" + aCountry + "-" + aVariants; if (aTmp != aVec[0]) aVec.push_back( aTmp); + // Language with variant but without country before language + // without variant but with country. + aTmp = aLanguage + "-" + aScript + "-" + aVariants; + if (aTmp != aVec[0]) + aVec.push_back( aTmp); + bHaveLanguageScriptVariant = true; } aTmp = aLanguage + "-" + aScript + "-" + aCountry; if (aTmp != aVec[0]) aVec.push_back( aTmp); } - if (!aVariants.isEmpty()) + if (!aVariants.isEmpty() && !bHaveLanguageScriptVariant) { aTmp = aLanguage + "-" + aScript + "-" + aVariants; if (aTmp != aVec[0]) @@ -1206,6 +1213,7 @@ LanguageTag & LanguageTag::makeFallback() if (aTmp != aVec[0]) aVec.push_back( aTmp); } + bool bHaveLanguageVariant = false; if (!aCountry.isEmpty()) { if (!aVariants.isEmpty()) @@ -1213,12 +1221,18 @@ LanguageTag & LanguageTag::makeFallback() aTmp = aLanguage + "-" + aCountry + "-" + aVariants; if (aTmp != aVec[0]) aVec.push_back( aTmp); + // Language with variant but without country before language + // without variant but with country. + aTmp = aLanguage + "-" + aVariants; + if (aTmp != aVec[0]) + aVec.push_back( aTmp); + bHaveLanguageVariant = true; } aTmp = aLanguage + "-" + aCountry; if (aTmp != aVec[0]) aVec.push_back( aTmp); } - if (!aVariants.isEmpty()) + if (!aVariants.isEmpty() && !bHaveLanguageVariant) { aTmp = aLanguage + "-" + aVariants; if (aTmp != aVec[0]) commit 450e9e3e5efca351d593792580d6b81a2e5fde9c Author: Eike Rathke <er...@redhat.com> Date: Wed Aug 28 17:11:51 2013 +0200 grml.. lt_list_value is an lt_variant_t* Change-Id: I74b4085394955906e075d77bc761dbdc92d06182 diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx index 57a87ec..baec229 100644 --- a/i18nlangtag/source/languagetag/languagetag.cxx +++ b/i18nlangtag/source/languagetag/languagetag.cxx @@ -853,13 +853,17 @@ OUString LanguageTag::getVariantsFromLangtag() const lt_list_t* pVariantsT = lt_tag_get_variants( MPLANGTAG); for (const lt_list_t* pE = pVariantsT; pE; pE = lt_list_next( pE)) { - const lt_pointer_t pV = lt_list_value( pE); - if (pV) + const lt_variant_t* pVariantT = static_cast<const lt_variant_t*>(lt_list_value( pE)); + if (pVariantT) { - if (aVariants.isEmpty()) - aVariants = OUString::createFromAscii( static_cast<const char*>(pV)); - else - aVariants += "-" + OUString::createFromAscii( static_cast<const char*>(pV)); + const char* p = lt_variant_get_tag( pVariantT); + if (p) + { + if (aVariants.isEmpty()) + aVariants = OUString::createFromAscii( p); + else + aVariants += "-" + OUString::createFromAscii( p); + } } } } commit 6ba5abe2fe52f7fe2ccc775ee562a230dd871373 Author: Eike Rathke <er...@redhat.com> Date: Wed Aug 28 16:27:09 2013 +0200 match names with tag Change-Id: I817b2cf9a015709d90b3f1c22290bce0cbc31eab diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx index 08292b1..41c1cc9 100644 --- a/i18nlangtag/qa/cppunit/test_languagetag.cxx +++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx @@ -145,26 +145,26 @@ void TestLanguageTag::testAllTags() } { - OUString s_ca_valencia_ES( "ca-ES-valencia" ); - LanguageTag ca_valencia_ES( s_ca_valencia_ES, true ); - lang::Locale aLocale = ca_valencia_ES.getLocale(); - CPPUNIT_ASSERT( ca_valencia_ES.getBcp47() == s_ca_valencia_ES ); + OUString s_ca_ES_valencia( "ca-ES-valencia" ); + LanguageTag ca_ES_valencia( s_ca_ES_valencia, true ); + lang::Locale aLocale = ca_ES_valencia.getLocale(); + CPPUNIT_ASSERT( ca_ES_valencia.getBcp47() == s_ca_ES_valencia ); CPPUNIT_ASSERT( aLocale.Language == "qlt" ); CPPUNIT_ASSERT( aLocale.Country == "ES" ); - CPPUNIT_ASSERT( aLocale.Variant == s_ca_valencia_ES ); + CPPUNIT_ASSERT( aLocale.Variant == s_ca_ES_valencia ); /* TODO: conversion doesn't know this yet, once it does activate test. */ #if 0 - CPPUNIT_ASSERT( ca_valencia_ES.getLanguageType() == LANGUAGE_USER_CATALAN_VALENCIAN ); + CPPUNIT_ASSERT( ca_ES_valencia.getLanguageType() == LANGUAGE_USER_CATALAN_VALENCIAN ); #else - CPPUNIT_ASSERT( ca_valencia_ES.getLanguageType() == LANGUAGE_SYSTEM ); + CPPUNIT_ASSERT( ca_ES_valencia.getLanguageType() == LANGUAGE_SYSTEM ); #endif - CPPUNIT_ASSERT( ca_valencia_ES.isValidBcp47() == true ); - CPPUNIT_ASSERT( ca_valencia_ES.isIsoLocale() == false ); - CPPUNIT_ASSERT( ca_valencia_ES.isIsoODF() == false ); - CPPUNIT_ASSERT( ca_valencia_ES.getLanguage() == "ca" ); - CPPUNIT_ASSERT( ca_valencia_ES.getCountry() == "ES" ); - CPPUNIT_ASSERT( ca_valencia_ES.getScript() == "" ); - CPPUNIT_ASSERT( ca_valencia_ES.getLanguageAndScript() == "ca" ); + CPPUNIT_ASSERT( ca_ES_valencia.isValidBcp47() == true ); + CPPUNIT_ASSERT( ca_ES_valencia.isIsoLocale() == false ); + CPPUNIT_ASSERT( ca_ES_valencia.isIsoODF() == false ); + CPPUNIT_ASSERT( ca_ES_valencia.getLanguage() == "ca" ); + CPPUNIT_ASSERT( ca_ES_valencia.getCountry() == "ES" ); + CPPUNIT_ASSERT( ca_ES_valencia.getScript() == "" ); + CPPUNIT_ASSERT( ca_ES_valencia.getLanguageAndScript() == "ca" ); } { commit adb56fbc7326b99f556683ea1bc73b70ca9ebefd Author: Eike Rathke <er...@redhat.com> Date: Wed Aug 28 16:21:37 2013 +0200 include variants in fallback strings Change-Id: I73024a91740dbfde6df78c5388ae4861a6e44294 diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx index 8ea944b..57a87ec 100644 --- a/i18nlangtag/source/languagetag/languagetag.cxx +++ b/i18nlangtag/source/languagetag/languagetag.cxx @@ -1175,26 +1175,51 @@ LanguageTag & LanguageTag::makeFallback() return aVec; } aVec.push_back( getBcp47()); + OUString aVariants( getVariants()); OUString aTmp; if (hasScript()) { OUString aScript( getScript()); if (!aCountry.isEmpty()) { + if (!aVariants.isEmpty()) + { + aTmp = aLanguage + "-" + aScript + "-" + aCountry + "-" + aVariants; + if (aTmp != aVec[0]) + aVec.push_back( aTmp); + } aTmp = aLanguage + "-" + aScript + "-" + aCountry; if (aTmp != aVec[0]) aVec.push_back( aTmp); } + if (!aVariants.isEmpty()) + { + aTmp = aLanguage + "-" + aScript + "-" + aVariants; + if (aTmp != aVec[0]) + aVec.push_back( aTmp); + } aTmp = aLanguage + "-" + aScript; if (aTmp != aVec[0]) aVec.push_back( aTmp); } if (!aCountry.isEmpty()) { + if (!aVariants.isEmpty()) + { + aTmp = aLanguage + "-" + aCountry + "-" + aVariants; + if (aTmp != aVec[0]) + aVec.push_back( aTmp); + } aTmp = aLanguage + "-" + aCountry; if (aTmp != aVec[0]) aVec.push_back( aTmp); } + if (!aVariants.isEmpty()) + { + aTmp = aLanguage + "-" + aVariants; + if (aTmp != aVec[0]) + aVec.push_back( aTmp); + } aTmp = aLanguage; if (aTmp != aVec[0]) aVec.push_back( aTmp); commit 4875278bfb0e4463e35063afc20282fc837731df Author: Eike Rathke <er...@redhat.com> Date: Wed Aug 28 16:10:18 2013 +0200 added getVariants() Change-Id: Ib5a880698dd6faea9a5b592221f2b302889bfc24 diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx index c2716e4..8ea944b 100644 --- a/i18nlangtag/source/languagetag/languagetag.cxx +++ b/i18nlangtag/source/languagetag/languagetag.cxx @@ -842,6 +842,31 @@ OUString LanguageTag::getRegionFromLangtag() } +OUString LanguageTag::getVariantsFromLangtag() +{ + OUString aVariants; + synCanonicalize(); + if (maBcp47.isEmpty()) + return aVariants; + if (mpImplLangtag) + { + const lt_list_t* pVariantsT = lt_tag_get_variants( MPLANGTAG); + for (const lt_list_t* pE = pVariantsT; pE; pE = lt_list_next( pE)) + { + const lt_pointer_t pV = lt_list_value( pE); + if (pV) + { + if (aVariants.isEmpty()) + aVariants = OUString::createFromAscii( static_cast<const char*>(pV)); + else + aVariants += "-" + OUString::createFromAscii( static_cast<const char*>(pV)); + } + } + } + return aVariants; +} + + const com::sun::star::lang::Locale & LanguageTag::getLocale( bool bResolveSystem ) const { if (!bResolveSystem && mbSystemLocale) @@ -1016,6 +1041,12 @@ OUString LanguageTag::getRegion() const } +OUString LanguageTag::getVariants() const +{ + return const_cast<LanguageTag*>(this)->getVariantsFromLangtag(); +} + + OUString LanguageTag::getGlibcLocaleString( const OUString & rEncoding ) const { OUString aRet; diff --git a/include/i18nlangtag/languagetag.hxx b/include/i18nlangtag/languagetag.hxx index 1a1d69d..3843493 100644 --- a/include/i18nlangtag/languagetag.hxx +++ b/include/i18nlangtag/languagetag.hxx @@ -184,6 +184,16 @@ public: */ OUString getRegion() const; + /** Get BCP 47 variant subtags, of the IANA Language Subtag Registry. + + If there are multiple variant subtags they are separated by '-'. + + This is NOT related to Locale.Variant! + + Always resolves an empty tag to the system locale. + */ + OUString getVariants() const; + /** Get a GLIBC locale string. Always resolves an empty tag to the system locale. @@ -483,6 +493,7 @@ private: OUString getLanguageFromLangtag(); OUString getScriptFromLangtag(); OUString getRegionFromLangtag(); + OUString getVariantsFromLangtag(); void resetVars(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits