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)
                {