[Libreoffice-commits] core.git: 2 commits - i18nlangtag/qa i18nlangtag/source include/i18nlangtag
Eike Rathke
erack at redhat.com
Wed May 21 05:15:44 PDT 2014
i18nlangtag/qa/cppunit/test_languagetag.cxx | 16 ++++++++++
i18nlangtag/source/languagetag/languagetag.cxx | 40 +++++++++++++++++++++++++
include/i18nlangtag/languagetag.hxx | 16 ++++++++++
3 files changed, 72 insertions(+)
New commits:
commit b8e8c9c471ba6974886dd624630144ef2edccb2c
Author: Eike Rathke <erack at redhat.com>
Date: Wed May 21 14:14:56 2014 +0200
add unit test for static isValidBcp47() method
Change-Id: Ib234fb1d14087236d337dfe351aea941945e718c
diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx
index 93506fb..b86e263 100644
--- a/i18nlangtag/qa/cppunit/test_languagetag.cxx
+++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx
@@ -586,6 +586,22 @@ void TestLanguageTag::testAllTags()
CPPUNIT_ASSERT( uab.isIsoLocale() == false );
CPPUNIT_ASSERT( uab.isIsoODF() == false );
}
+
+ // test static isValidBcp47() method
+ {
+ OUString aCanonicalized;
+ CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "en-US", &aCanonicalized) && aCanonicalized == "en-US" );
+ CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "x-foobar", &aCanonicalized) && aCanonicalized == "x-foobar" );
+ CPPUNIT_ASSERT( !LanguageTag::isValidBcp47( "unreg-and-bad", &aCanonicalized) );
+#if USE_LIBLANGTAG
+ CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "de-Latn-DE", &aCanonicalized) && aCanonicalized == "de-DE" );
+ /* TODO: at least some (those we know) grandfathered tags should be
+ * recognized by the replacement code. */
+ CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "en-GB-oed", &aCanonicalized) && aCanonicalized == "en-GB-oed" );
+#else
+ CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "de-Latn-DE", &aCanonicalized) && aCanonicalized == "de-Latn-DE" );
+#endif
+ }
}
static bool checkMapping( const OUString& rStr1, const OUString& rStr2 )
commit a6e6cc49bfbf594aa59804ee0d9751d5ff19caba
Author: Eike Rathke <erack at redhat.com>
Date: Wed May 21 14:13:23 2014 +0200
add static LanguageTag::isValidBcp47()
Change-Id: I2c646b3e2f13a6fccc845ce8eb82fccee154f3c6
diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx
index 33816b3..8a96bde 100644
--- a/i18nlangtag/source/languagetag/languagetag.cxx
+++ b/i18nlangtag/source/languagetag/languagetag.cxx
@@ -2685,4 +2685,44 @@ com::sun::star::lang::Locale LanguageTag::convertToLocaleWithFallback( const OUS
return LanguageTag( rBcp47).makeFallback().getLocale( true);
}
+
+// static
+bool LanguageTag::isValidBcp47( const OUString& rString, OUString* o_pCanonicalized )
+{
+ struct guard
+ {
+ lt_tag_t* mpLangtag;
+ guard()
+ {
+ theDataRef::get().incRef();
+ mpLangtag = lt_tag_new();
+ }
+ ~guard()
+ {
+ lt_tag_unref( mpLangtag);
+ theDataRef::get().decRef();
+ }
+ } aVar;
+
+ myLtError aError;
+
+ if (lt_tag_parse( aVar.mpLangtag, OUStringToOString( rString, RTL_TEXTENCODING_UTF8).getStr(), &aError.p))
+ {
+ char* pTag = lt_tag_canonicalize( aVar.mpLangtag, &aError.p);
+ SAL_WARN_IF( !pTag, "i18nlangtag", "LanguageTag:isValidBcp47: could not canonicalize '" << rString << "'");
+ if (pTag)
+ {
+ if (o_pCanonicalized)
+ *o_pCanonicalized = OUString::createFromAscii( pTag);
+ free( pTag);
+ return true;
+ }
+ }
+ else
+ {
+ SAL_INFO( "i18nlangtag", "LanguageTag:isValidBcp47: could not parse '" << rString << "'");
+ }
+ return false;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/i18nlangtag/languagetag.hxx b/include/i18nlangtag/languagetag.hxx
index dcb95c6..0e12235 100644
--- a/include/i18nlangtag/languagetag.hxx
+++ b/include/i18nlangtag/languagetag.hxx
@@ -228,6 +228,8 @@ public:
/** If this is a valid BCP 47 language tag.
Always resolves an empty tag to the system locale.
+
+ @seealso static bool isValidBcp47(const OUString&)
*/
bool isValidBcp47() const;
@@ -479,6 +481,20 @@ public:
*/
static com::sun::star::lang::Locale convertToLocaleWithFallback( const OUString& rBcp47 );
+ /** If rString represents a valid BCP 47 language tag.
+
+ Never resolves an empty tag to the system locale, in fact an empty
+ string is invalid here. Does not create an instance to be registered
+ with a conversion to Locale or LanguageType.
+
+ @param o_pCanonicalized
+ If given and rString is a valid BCP 47 language tag, the
+ canonicalized form is assigned, which may differ from the
+ original string even if that was a valid tag. If rString is not
+ a valid tag, nothing is assigned.
+ */
+ static bool isValidBcp47( const OUString& rString, OUString* o_pCanonicalized = NULL );
+
/** If nLang is a generated on-the-fly LangID */
static bool isOnTheFlyID( LanguageType nLang );
More information about the Libreoffice-commits
mailing list