i18nlangtag/qa/cppunit/test_languagetag.cxx | 24 +++++++++++++++++++++ i18nlangtag/source/languagetag/languagetag.cxx | 28 ++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 3 deletions(-)
New commits: commit 74e9456c6d7c43739c3e57640e52b3f851c4f558 Author: Eike Rathke <er...@redhat.com> Date: Thu Apr 21 19:02:48 2016 +0200 unit test 'C' locale shall map to 'en-US' Change-Id: Id4772b087add703537b588c961283466436f10c1 diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx index 766de5a..a5d40f9 100644 --- a/i18nlangtag/qa/cppunit/test_languagetag.cxx +++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx @@ -562,6 +562,30 @@ void TestLanguageTag::testAllTags() CPPUNIT_ASSERT( joker.getLanguageType() == LANGUAGE_USER_PRIV_JOKER ); } + // 'C' locale shall map to 'en-US' + { + LanguageTag aTag( "C" ); + CPPUNIT_ASSERT( aTag.getLanguage() == "en" ); + CPPUNIT_ASSERT( aTag.getCountry() == "US" ); + lang::Locale aLocale = aTag.getLocale(); + CPPUNIT_ASSERT( aTag.getBcp47() == "en-US" ); + CPPUNIT_ASSERT( aLocale.Language == "en" ); + CPPUNIT_ASSERT( aLocale.Country == "US" ); + CPPUNIT_ASSERT( aLocale.Variant.isEmpty() ); + CPPUNIT_ASSERT( aTag.getLanguageType() == LANGUAGE_ENGLISH_US ); + } + { + LanguageTag aTag( lang::Locale("C","","") ); + CPPUNIT_ASSERT( aTag.getLanguage() == "en" ); + CPPUNIT_ASSERT( aTag.getCountry() == "US" ); + lang::Locale aLocale = aTag.getLocale(); + CPPUNIT_ASSERT( aTag.getBcp47() == "en-US" ); + CPPUNIT_ASSERT( aLocale.Language == "en" ); + CPPUNIT_ASSERT( aLocale.Country == "US" ); + CPPUNIT_ASSERT( aLocale.Variant.isEmpty() ); + CPPUNIT_ASSERT( aTag.getLanguageType() == LANGUAGE_ENGLISH_US ); + } + // test reset() methods { LanguageTag aTag( LANGUAGE_DONTKNOW ); commit 600c2ca58bf7c2a38d4a41a80bdc1ad8373a9ff0 Author: Eike Rathke <er...@redhat.com> Date: Thu Apr 21 18:52:10 2016 +0200 handle 'C' locale in simpleExtract() ... so liblangtag isn't called and we explicitly have it known from there on as well. Also, don't set mbInitializedLocale=true in the LanguageTag ctor with Locale anymore as we don't know there if a semantically correct Locale was passed (which technically the 'C' locale is not). Instead, set it centrally in LanguageTag::registerImpl() where conversion to maBcp47 string takes place. Change-Id: I71551bd4b59d896c0674286edee816e05081ecd4 diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx index fe0e2cf..7a5a56c 100644 --- a/i18nlangtag/source/languagetag/languagetag.cxx +++ b/i18nlangtag/source/languagetag/languagetag.cxx @@ -328,7 +328,7 @@ private: /** Obtain Language, Script, Country and Variants via simpleExtract() and assign them to the cached variables if successful. - @return return of simpleExtract() + @return simpleExtract() successfully extracted and cached. */ bool cacheSimpleLSCV(); @@ -337,6 +337,7 @@ private: EXTRACTED_NONE, EXTRACTED_LSC, EXTRACTED_LV, + EXTRACTED_C_LOCALE, EXTRACTED_X, EXTRACTED_X_JOKER }; @@ -349,6 +350,7 @@ private: @return EXTRACTED_LSC if simple tag was detected (i.e. one that would fulfill the isIsoODF() condition), EXTRACTED_LV if a tag with variant was detected, + EXTRACTED_C_LOCALE if a 'C' locale was detected, EXTRACTED_X if x-... privateuse tag was detected, EXTRACTED_X_JOKER if "*" joker was detected, EXTRACTED_NONE else. @@ -486,7 +488,7 @@ LanguageTag::LanguageTag( const css::lang::Locale & rLocale ) mnLangID( LANGUAGE_DONTKNOW), mbSystemLocale( rLocale.Language.isEmpty()), mbInitializedBcp47( false), - mbInitializedLocale( !mbSystemLocale), + mbInitializedLocale( false), // we do not know which mess we got passed in mbInitializedLangID( false), mbIsFallback( false) { @@ -799,8 +801,15 @@ LanguageTag::ImplPtr LanguageTag::registerImpl() const } // Force Bcp47 if not LangID. - if (!mbInitializedLangID && !mbInitializedBcp47 && mbInitializedLocale) + if (!mbInitializedLangID && !mbInitializedBcp47) { + // The one central point to set mbInitializedLocale=true if a + // LanguageTag was initialized with a Locale. We will now convert and + // possibly later resolve it. + if (!mbInitializedLocale && (mbSystemLocale || !maLocale.Language.isEmpty())) + mbInitializedLocale = true; + SAL_WARN_IF( !mbInitializedLocale, "i18nlangtag", "LanguageTag::registerImpl: still not mbInitializedLocale"); + maBcp47 = LanguageTagImpl::convertToBcp47( maLocale); mbInitializedBcp47 = !maBcp47.isEmpty(); } @@ -1113,6 +1122,11 @@ bool LanguageTagImpl::canonicalize() maLocale.Language = aLanguage; maLocale.Country = aCountry; } + else if (eExt == EXTRACTED_C_LOCALE) + { + maLocale.Language = aLanguage; + maLocale.Country = aCountry; + } else { maLocale.Language = I18NLANGTAG_QLT; @@ -2350,6 +2364,14 @@ LanguageTagImpl::Extraction LanguageTagImpl::simpleExtract( const OUString& rBcp // x-... privateuse tags MUST be known to us by definition. eRet = EXTRACTED_X; } + else if (nLen == 1 && rBcp47[0] == 'C') // the 'C' locale + { + eRet = EXTRACTED_C_LOCALE; + rLanguage = "C"; + rScript.clear(); + rCountry.clear(); + rVariants.clear(); + } else if (nLen == 2 || nLen == 3) // ll or lll { if (nHyph1 < 0) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits