Resolves: tdf#127786 cache Glibc locale string in LanguageTagImpl

... for non-simple @modifier strings that are constructed using
liblangtag, as loading resource strings needs it over and over and
over again.

Change-Id: Ib6a74e5ddb44508aa41f101c200a508bfa4a13bd
Reviewed-on: https://gerrit.libreoffice.org/79770
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
(cherry picked from commit 24c7c12224f1c1d66f335f6fe085595352137646)
Reviewed-on: https://gerrit.libreoffice.org/79775
Reviewed-by: Xisco FaulĂ­ <xiscofauli@libreoffice.org>
(cherry picked from commit 99782b52c3cc25a32661c382ca98a32f6ec87003)
Reviewed-on: https://gerrit.libreoffice.org/79787
(cherry picked from commit e7b8101cf7643d612393079d7f1cea07d8b1c774)
Reviewed-on: https://gerrit.libreoffice.org/80105
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
Tested-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx
index c0e2749..ef34402 100644
--- a/i18nlangtag/source/languagetag/languagetag.cxx
+++ b/i18nlangtag/source/languagetag/languagetag.cxx
@@ -252,11 +252,12 @@ private:

    mutable css::lang::Locale               maLocale;
    mutable OUString                        maBcp47;
    mutable OUString                        maCachedLanguage;   ///< cache getLanguage()
    mutable OUString                        maCachedScript;     ///< cache getScript()
    mutable OUString                        maCachedCountry;    ///< cache getCountry()
    mutable OUString                        maCachedVariants;   ///< cache getVariants()
    mutable lt_tag_t*                       mpImplLangtag;      ///< liblangtag pointer
    mutable OUString                        maCachedLanguage;    ///< cache getLanguage()
    mutable OUString                        maCachedScript;      ///< cache getScript()
    mutable OUString                        maCachedCountry;     ///< cache getCountry()
    mutable OUString                        maCachedVariants;    ///< cache getVariants()
    mutable OUString                        maCachedGlibcString; ///< cache getGlibcLocaleString()
    mutable lt_tag_t*                       mpImplLangtag;       ///< liblangtag pointer
    mutable LanguageType                    mnLangID;
    mutable LanguageTag::ScriptType         meScriptType;
    mutable Decision                        meIsValid;
@@ -271,6 +272,7 @@ private:
    mutable bool                            mbCachedScript      : 1;
    mutable bool                            mbCachedCountry     : 1;
    mutable bool                            mbCachedVariants    : 1;
    mutable bool                            mbCachedGlibcString : 1;

    OUString const &    getBcp47() const;
    OUString const &    getLanguage() const;
@@ -384,7 +386,8 @@ LanguageTagImpl::LanguageTagImpl( const LanguageTag & rLanguageTag )
        mbCachedLanguage( false),
        mbCachedScript( false),
        mbCachedCountry( false),
        mbCachedVariants( false)
        mbCachedVariants( false),
        mbCachedGlibcString( false)
{
}

@@ -397,6 +400,7 @@ LanguageTagImpl::LanguageTagImpl( const LanguageTagImpl & rLanguageTagImpl )
        maCachedScript( rLanguageTagImpl.maCachedScript),
        maCachedCountry( rLanguageTagImpl.maCachedCountry),
        maCachedVariants( rLanguageTagImpl.maCachedVariants),
        maCachedGlibcString( rLanguageTagImpl.maCachedGlibcString),
        mpImplLangtag( rLanguageTagImpl.mpImplLangtag ?
                lt_tag_copy( rLanguageTagImpl.mpImplLangtag) : nullptr),
        mnLangID( rLanguageTagImpl.mnLangID),
@@ -412,7 +416,8 @@ LanguageTagImpl::LanguageTagImpl( const LanguageTagImpl & rLanguageTagImpl )
        mbCachedLanguage( rLanguageTagImpl.mbCachedLanguage),
        mbCachedScript( rLanguageTagImpl.mbCachedScript),
        mbCachedCountry( rLanguageTagImpl.mbCachedCountry),
        mbCachedVariants( rLanguageTagImpl.mbCachedVariants)
        mbCachedVariants( rLanguageTagImpl.mbCachedVariants),
        mbCachedGlibcString( rLanguageTagImpl.mbCachedGlibcString)
{
    if (mpImplLangtag)
        theDataRef::get().init();
@@ -430,6 +435,7 @@ LanguageTagImpl& LanguageTagImpl::operator=( const LanguageTagImpl & rLanguageTa
    maCachedScript      = rLanguageTagImpl.maCachedScript;
    maCachedCountry     = rLanguageTagImpl.maCachedCountry;
    maCachedVariants    = rLanguageTagImpl.maCachedVariants;
    maCachedGlibcString = rLanguageTagImpl.maCachedGlibcString;
    lt_tag_t * oldTag = mpImplLangtag;
    mpImplLangtag       = rLanguageTagImpl.mpImplLangtag ?
                            lt_tag_copy( rLanguageTagImpl.mpImplLangtag) : nullptr;
@@ -448,6 +454,7 @@ LanguageTagImpl& LanguageTagImpl::operator=( const LanguageTagImpl & rLanguageTa
    mbCachedScript      = rLanguageTagImpl.mbCachedScript;
    mbCachedCountry     = rLanguageTagImpl.mbCachedCountry;
    mbCachedVariants    = rLanguageTagImpl.mbCachedVariants;
    mbCachedGlibcString = rLanguageTagImpl.mbCachedGlibcString;
    if (mpImplLangtag && !oldTag)
        theDataRef::get().init();
    return *this;
@@ -1902,7 +1909,9 @@ OUString LanguageTag::getVariants() const

OUString LanguageTagImpl::getGlibcLocaleString() const
{
    OUString sLocale;
    if (mbCachedGlibcString)
        return maCachedGlibcString;

    if (!mpImplLangtag)
    {
        meIsLiblangtagNeeded = DECISION_YES;
@@ -1913,11 +1922,12 @@ OUString LanguageTagImpl::getGlibcLocaleString() const
        char* pLang = lt_tag_convert_to_locale(mpImplLangtag, nullptr);
        if (pLang)
        {
            sLocale = OUString::createFromAscii( pLang);
            maCachedGlibcString = OUString::createFromAscii( pLang);
            mbCachedGlibcString = true;
            free(pLang);
        }
    }
    return sLocale;
    return maCachedGlibcString;
}

OUString LanguageTag::getGlibcLocaleString( const OUString & rEncoding ) const