Related: tdf#150370 Convert isValidBcp47() bool to enum LanguageTag::PrivateUse
... to prepare for more finegrained private-use control.
Change-Id: I118c3f5ee6e437435c07ed2cf699c4597e9cdf88
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139112
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
diff --git a/editeng/source/misc/acorrcfg.cxx b/editeng/source/misc/acorrcfg.cxx
index a97e507..5806179 100644
--- a/editeng/source/misc/acorrcfg.cxx
+++ b/editeng/source/misc/acorrcfg.cxx
@@ -83,7 +83,8 @@ static void scanAutoCorrectDirForLanguageTags( const OUString& rURL )
// private-use tag (which should not fallback, but
// avoid).
if (aLanguageTag.getCountry().isEmpty()
&& LanguageTag::isValidBcp47( aCanonicalized, nullptr, true))
&& LanguageTag::isValidBcp47( aCanonicalized, nullptr,
LanguageTag::PrivateUse::DISALLOW))
{
LanguageTag aFallback( aLanguageTag);
aFallback.makeFallback();
diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx
index 5b73b3c..4a21101 100644
--- a/i18nlangtag/qa/cppunit/test_languagetag.cxx
+++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx
@@ -668,11 +668,11 @@ void TestLanguageTag::testAllTags()
CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "qaa", &aCanonicalized) );
CPPUNIT_ASSERT_EQUAL( OUString("qaa"), aCanonicalized );
CPPUNIT_ASSERT( !LanguageTag::isValidBcp47( "unreg-and-bad", &aCanonicalized) );
CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "en-US", &aCanonicalized, true) );
CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "en-US", &aCanonicalized, LanguageTag::PrivateUse::DISALLOW) );
CPPUNIT_ASSERT_EQUAL( OUString("en-US"), aCanonicalized );
CPPUNIT_ASSERT( !LanguageTag::isValidBcp47( "x-foobar", &aCanonicalized, true) );
CPPUNIT_ASSERT( !LanguageTag::isValidBcp47( "x-foobar", &aCanonicalized, LanguageTag::PrivateUse::DISALLOW) );
CPPUNIT_ASSERT_EQUAL( OUString("x-foobar"), aCanonicalized );
CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "qaa", &aCanonicalized, true) );
CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "qaa", &aCanonicalized, LanguageTag::PrivateUse::DISALLOW) );
CPPUNIT_ASSERT_EQUAL( OUString("qaa"), aCanonicalized );
CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "de-Latn-DE", &aCanonicalized) );
CPPUNIT_ASSERT_EQUAL( OUString("de-DE"), aCanonicalized );
diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx
index 6d20c73..0b1ab1a 100644
--- a/i18nlangtag/source/languagetag/languagetag.cxx
+++ b/i18nlangtag/source/languagetag/languagetag.cxx
@@ -2838,7 +2838,8 @@ LanguageType LanguageTag::convertToLanguageTypeWithFallback( const css::lang::Lo
// static
bool LanguageTag::isValidBcp47( const OUString& rString, OUString* o_pCanonicalized, bool bDisallowPrivate )
bool LanguageTag::isValidBcp47( const OUString& rString, OUString* o_pCanonicalized,
LanguageTag::PrivateUse ePrivateUse )
{
bool bValid = false;
@@ -2865,7 +2866,7 @@ bool LanguageTag::isValidBcp47( const OUString& rString, OUString* o_pCanonicali
if (pTag)
{
bValid = true;
if (bDisallowPrivate)
if (ePrivateUse != PrivateUse::ALLOW)
{
const lt_string_t* pPrivate = lt_tag_get_privateuse( aVar.mpLangtag);
if (pPrivate && lt_string_length( pPrivate) > 0)
diff --git a/include/i18nlangtag/languagetag.hxx b/include/i18nlangtag/languagetag.hxx
index 3b5fb3d..5b9a43c 100644
--- a/include/i18nlangtag/languagetag.hxx
+++ b/include/i18nlangtag/languagetag.hxx
@@ -515,6 +515,13 @@ public:
*/
static LanguageType convertToLanguageTypeWithFallback( const css::lang::Locale& rLocale );
/** Enums to be used with isValidBcp47(). */
enum PrivateUse
{
ALLOW = 0,
DISALLOW
};
/** If rString represents a valid BCP 47 language tag.
Never resolves an empty tag to the system locale, in fact an empty
@@ -527,13 +534,13 @@ public:
original string even if that was a valid tag. If rString is not
a valid tag, nothing is assigned.
@param bDisallowPrivate
If TRUE, valid tags according to BCP 47 but reserved for
private use, like 'x-...', are not allowed and FALSE is
returned in this case.
@param ePrivateUse
If PrivateUse::DISALLOW, valid tags according to BCP 47 but
reserved for private use, like 'x-...', are not allowed and
FALSE is returned in this case.
*/
static bool isValidBcp47( const OUString& rString, OUString* o_pCanonicalized,
bool bDisallowPrivate = false );
PrivateUse ePrivateUse = PrivateUse::ALLOW );
/** If nLang is a generated on-the-fly LangID */
static bool isOnTheFlyID( LanguageType nLang );
diff --git a/svx/source/dialog/langbox.cxx b/svx/source/dialog/langbox.cxx
index 43d123b..ead5f11 100644
--- a/svx/source/dialog/langbox.cxx
+++ b/svx/source/dialog/langbox.cxx
@@ -430,7 +430,7 @@ IMPL_LINK(SvxLanguageBox, ChangeHdl, weld::ComboBox&, rControl, void)
else
{
OUString aCanonicalized;
bool bValid = LanguageTag::isValidBcp47( aStr, &aCanonicalized, true);
bool bValid = LanguageTag::isValidBcp47( aStr, &aCanonicalized, LanguageTag::PrivateUse::DISALLOW);
m_eEditedAndValid = (bValid ? EditedAndValid::Valid : EditedAndValid::Invalid);
if (bValid && aCanonicalized != aStr)
{