editeng/source/misc/forbiddencharacterstable.cxx |    4 ++--
 include/svl/ondemand.hxx                         |   18 +++++++++---------
 include/unotools/intlwrapper.hxx                 |    4 ++--
 include/unotools/localedatawrapper.hxx           |    9 ++++++++-
 include/vcl/i18nhelp.hxx                         |    4 ++--
 include/xmloff/xmlnumfe.hxx                      |    2 +-
 sc/source/core/tool/numformat.cxx                |    5 ++---
 sc/source/filter/xml/xmlimprt.cxx                |    6 +++---
 svl/qa/unit/svl.cxx                              |    4 ++--
 svl/source/numbers/zforlist.cxx                  |    8 ++------
 sw/source/core/bastyp/breakit.cxx                |    4 ++--
 sw/source/filter/ww8/ww8atr.cxx                  |    5 ++---
 toolkit/source/controls/unocontrolmodel.cxx      |    8 ++++----
 unotools/source/i18n/intlwrapper.cxx             |    2 +-
 unotools/source/i18n/localedatawrapper.cxx       |   22 ++++++++++++++++++++++
 vcl/source/app/i18nhelp.cxx                      |    6 +++---
 vcl/source/app/settings.cxx                      |   20 +++++++-------------
 xmloff/source/style/xmlnumfe.cxx                 |   13 +++++--------
 xmloff/source/style/xmlnumfi.cxx                 |    6 ++----
 19 files changed, 81 insertions(+), 69 deletions(-)

New commits:
commit f5c81f928b3c30d0955e563d591b76276d27c038
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Sat Mar 22 13:43:12 2025 +0200
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Sun Mar 23 10:31:35 2025 +0100

    tdf#141415 reduce time spent loading language data
    
    cache LocaleDataWrapper because otherwise we spend quite a bit of
    time doing function-pointer-symbol lookups.
    
    Change-Id: Ic1bd07dabac95a2e1bdad70cffbc2b4cabdc62ed
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183221
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    (cherry picked from commit 8c0d8f50717503d8fe45aed95055b2c9e2227c0d)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183225
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>

diff --git a/editeng/source/misc/forbiddencharacterstable.cxx 
b/editeng/source/misc/forbiddencharacterstable.cxx
index 7276da584bd9..e1cbc87eb66b 100644
--- a/editeng/source/misc/forbiddencharacterstable.cxx
+++ b/editeng/source/misc/forbiddencharacterstable.cxx
@@ -44,8 +44,8 @@ 
SvxForbiddenCharactersTable::GetForbiddenCharacters(LanguageType nLanguage, bool
         pForbiddenCharacters = &(it->second);
     else if (bGetDefault && m_xContext.is())
     {
-        LocaleDataWrapper aWrapper(m_xContext, LanguageTag(nLanguage));
-        maMap[nLanguage] = aWrapper.getForbiddenCharacters();
+        const LocaleDataWrapper* pWrapper = 
LocaleDataWrapper::get(LanguageTag(nLanguage));
+        maMap[nLanguage] = pWrapper->getForbiddenCharacters();
         pForbiddenCharacters = &maMap[nLanguage];
     }
     return pForbiddenCharacters;
diff --git a/include/svl/ondemand.hxx b/include/svl/ondemand.hxx
index 691fd6fc8099..200958b2d99c 100644
--- a/include/svl/ondemand.hxx
+++ b/include/svl/ondemand.hxx
@@ -55,8 +55,8 @@ class OnDemandLocaleDataWrapper
     SvtSysLocale aSysLocale;
     LanguageType eCurrentLanguage;
     LanguageType eLastAnyLanguage;
-    std::optional<LocaleDataWrapper> moEnglish;
-    std::optional<LocaleDataWrapper> moAny;
+    const LocaleDataWrapper* mpEnglish{ nullptr };
+    const LocaleDataWrapper* mpAny{ nullptr };
     int nCurrent; // 0 == system, 1 == english, 2 == any
     bool bInitialized;
 
@@ -86,20 +86,20 @@ public:
             nCurrent = 0;
         else if (eLang == LANGUAGE_ENGLISH_US)
         {
-            if (!moEnglish)
-                moEnglish.emplace(m_xContext, rLanguageTag);
+            if (!mpEnglish)
+                mpEnglish = LocaleDataWrapper::get(rLanguageTag);
             nCurrent = 1;
         }
         else
         {
-            if (!moAny)
+            if (!mpAny)
             {
-                moAny.emplace(m_xContext, rLanguageTag);
+                mpAny = LocaleDataWrapper::get(rLanguageTag);
                 eLastAnyLanguage = eLang;
             }
             else if (eLastAnyLanguage != eLang)
             {
-                moAny.emplace(m_xContext, rLanguageTag);
+                mpAny = LocaleDataWrapper::get(rLanguageTag);
                 eLastAnyLanguage = eLang;
             }
             nCurrent = 2;
@@ -116,9 +116,9 @@ public:
             case 0:
                 return &aSysLocale.GetLocaleData();
             case 1:
-                return &*moEnglish;
+                return mpEnglish;
             case 2:
-                return &*moAny;
+                return mpAny;
             default:
                 assert(false);
                 return nullptr;
diff --git a/include/unotools/intlwrapper.hxx b/include/unotools/intlwrapper.hxx
index 0c473cc4293f..6df48a9e8f12 100644
--- a/include/unotools/intlwrapper.hxx
+++ b/include/unotools/intlwrapper.hxx
@@ -54,7 +54,7 @@ private:
     LanguageTag         maLanguageTag;
     css::uno::Reference< css::uno::XComponentContext > m_xContext;
 
-    std::unique_ptr<LocaleDataWrapper>  pLocaleData;
+    const LocaleDataWrapper*  pLocaleData { nullptr };
     std::optional<CollatorWrapper>    moCollator;
     std::optional<CollatorWrapper>    moCaseCollator;
 
@@ -69,7 +69,7 @@ public:
                                     {
                                         if ( !pLocaleData )
                                             ImplNewLocaleData();
-                                        return pLocaleData.get();
+                                        return pLocaleData;
                                     }
     /// case insensitive collator, simple IGNORE_CASE
     const CollatorWrapper*      getCollator() const
diff --git a/include/unotools/localedatawrapper.hxx 
b/include/unotools/localedatawrapper.hxx
index d22e5fc7a482..5ce9cce232c2 100644
--- a/include/unotools/localedatawrapper.hxx
+++ b/include/unotools/localedatawrapper.hxx
@@ -119,11 +119,18 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper
 
     SAL_DLLPRIVATE void loadDigitGrouping();
 
-public:
     LocaleDataWrapper(
         const css::uno::Reference< css::uno::XComponentContext > & rxContext,
         LanguageTag aLanguageTag
         );
+
+public:
+
+    /**
+     * retrieve a cached LocaleDataWrapper
+     */
+    static const LocaleDataWrapper* get(const LanguageTag& aLanguageTag);
+
     /**
         @param rOverrideDateAcceptancePatterns Override locale's date 
acceptance patterns.
             An empty sequence resets the patterns to the locale's pattern 
sequence.
diff --git a/include/vcl/i18nhelp.hxx b/include/vcl/i18nhelp.hxx
index 9f6e43bb6a54..8179f7c3bc00 100644
--- a/include/vcl/i18nhelp.hxx
+++ b/include/vcl/i18nhelp.hxx
@@ -45,7 +45,7 @@ class VCL_DLLPUBLIC I18nHelper
     LanguageTag                     maLanguageTag;
     css::uno::Reference< css::uno::XComponentContext > m_xContext;
 
-    std::unique_ptr<LocaleDataWrapper>              mpLocaleDataWrapper;
+    const LocaleDataWrapper*              mpLocaleDataWrapper { nullptr };
     std::unique_ptr<utl::TransliterationWrapper>    mpTransliterationWrapper;
 
     bool                            mbTransliterateIgnoreCase;
@@ -53,7 +53,7 @@ class VCL_DLLPUBLIC I18nHelper
     SAL_DLLPRIVATE void             ImplDestroyWrappers();
 
     SAL_DLLPRIVATE utl::TransliterationWrapper&    
ImplGetTransliterationWrapper() const;
-    SAL_DLLPRIVATE LocaleDataWrapper&              ImplGetLocaleDataWrapper() 
const;
+    SAL_DLLPRIVATE const LocaleDataWrapper&        ImplGetLocaleDataWrapper() 
const;
 
 public:
 
diff --git a/include/xmloff/xmlnumfe.hxx b/include/xmloff/xmlnumfe.hxx
index e367fef2b89e..c719aaca6839 100644
--- a/include/xmloff/xmlnumfe.hxx
+++ b/include/xmloff/xmlnumfe.hxx
@@ -55,7 +55,7 @@ private:
     OUStringBuffer              m_sBlankWidthString;
     bool                        m_bHasText;
     std::unique_ptr<SvXMLNumUsedList_Impl>      m_pUsedList;
-    std::unique_ptr<LocaleDataWrapper>          m_pLocaleData;
+    const LocaleDataWrapper*    m_pLocaleData { nullptr };
 
     SAL_DLLPRIVATE void AddCalendarAttr_Impl( const OUString& rCalendar );
     SAL_DLLPRIVATE void AddStyleAttr_Impl( bool bLong );
diff --git a/sc/source/core/tool/numformat.cxx 
b/sc/source/core/tool/numformat.cxx
index c69da6de4e3b..45f473c7e945 100644
--- a/sc/source/core/tool/numformat.cxx
+++ b/sc/source/core/tool/numformat.cxx
@@ -36,10 +36,9 @@ namespace
             return ScGlobal::getLocaleData().getNumDecimalSep();
         // LocaleDataWrapper can be expensive to construct, so cache the 
result for
         // repeated calls
-        static std::optional<LocaleDataWrapper> localeCache;
+        static const LocaleDataWrapper* localeCache { nullptr };
         if (!localeCache || localeCache->getLanguageTag().getLanguageType() != 
nFormatLang)
-            localeCache.emplace(
-                comphelper::getProcessComponentContext(), 
LanguageTag(nFormatLang));
+            localeCache = LocaleDataWrapper::get(LanguageTag(nFormatLang));
         return localeCache->getNumDecimalSep();
     }
 }
diff --git a/sc/source/filter/xml/xmlimprt.cxx 
b/sc/source/filter/xml/xmlimprt.cxx
index d992fd2c5f84..8ab3f241d630 100644
--- a/sc/source/filter/xml/xmlimprt.cxx
+++ b/sc/source/filter/xml/xmlimprt.cxx
@@ -809,11 +809,11 @@ sal_Int32 ScXMLImport::SetCurrencySymbol(const sal_Int32 
nKey, std::u16string_vi
                     {
                         {
                             ScXMLImport::MutexGuard aGuard(*this);
-                            LocaleDataWrapper aLocaleData( 
comphelper::getProcessComponentContext(), LanguageTag( aLocale) );
+                            const LocaleDataWrapper* pLocaleData = 
LocaleDataWrapper::get( LanguageTag( aLocale) );
                             sFormatString = "#" +
-                                    aLocaleData.getNumThousandSep() +
+                                    pLocaleData->getNumThousandSep() +
                                     "##0" +
-                                    aLocaleData.getNumDecimalSep() +
+                                    pLocaleData->getNumDecimalSep() +
                                     "00 [$" +
                                     rCurrency +
                                     "]";
diff --git a/svl/qa/unit/svl.cxx b/svl/qa/unit/svl.cxx
index 80ec80e0d87e..e2969c996d75 100644
--- a/svl/qa/unit/svl.cxx
+++ b/svl/qa/unit/svl.cxx
@@ -2009,8 +2009,8 @@ CPPUNIT_TEST_FIXTURE(Test, testLanguageNone)
     sal_uInt32 nKey = aFormatter.GetEntryKey(code, LANGUAGE_GERMAN);
     CPPUNIT_ASSERT(nKey != NUMBERFORMAT_ENTRY_NOT_FOUND);
     SvNumberformat const*const pFormat = aFormatter.GetEntry(nKey);
-    LocaleDataWrapper ldw(m_xContext, LanguageTag(pFormat->GetLanguage()));
-    CPPUNIT_ASSERT_EQUAL(u"dd.mm.yyyy"_ustr, 
pFormat->GetMappedFormatstring(keywords, ldw));
+    const LocaleDataWrapper* ldw = 
LocaleDataWrapper::get(LanguageTag(pFormat->GetLanguage()));
+    CPPUNIT_ASSERT_EQUAL(u"dd.mm.yyyy"_ustr, 
pFormat->GetMappedFormatstring(keywords, *ldw));
 }
 
 CPPUNIT_TEST_FIXTURE(Test, testTdf160306)
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index 5907193a63b3..36e5ef9a6903 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -4649,8 +4649,7 @@ void SvNumberFormatter::ImpInitCurrencyTable()
     bInitializing = true;
 
     LanguageType eSysLang = SvtSysLocale().GetLanguageTag().getLanguageType();
-    std::optional<LocaleDataWrapper> pLocaleData(std::in_place,
-        ::comphelper::getProcessComponentContext(),
+    const LocaleDataWrapper* pLocaleData = LocaleDataWrapper::get(
         SvtSysLocale().GetLanguageTag() );
     // get user configured currency
     OUString aConfiguredCurrencyAbbrev;
@@ -4676,9 +4675,7 @@ void SvNumberFormatter::ImpInitCurrencyTable()
     {
         LanguageType eLang = LanguageTag::convertToLanguageType( rLocale, 
false);
         theInstalledLocales.insert( eLang);
-        pLocaleData.emplace(
-            ::comphelper::getProcessComponentContext(),
-            LanguageTag(rLocale) );
+        pLocaleData = LocaleDataWrapper::get( LanguageTag(rLocale) );
         Sequence< Currency2 > aCurrSeq = pLocaleData->getAllCurrencies();
         sal_Int32 nCurrencyCount = aCurrSeq.getLength();
         Currency2 const * const pCurrencies = aCurrSeq.getConstArray();
@@ -4790,7 +4787,6 @@ void SvNumberFormatter::ImpInitCurrencyTable()
         LocaleDataWrapper::outputCheckMessage(
                 "SvNumberFormatter::ImpInitCurrencyTable: system currency not 
in I18N locale data.");
     }
-    pLocaleData.reset();
     SvtSysLocaleOptions::SetCurrencyChangeLink( LINK( nullptr, 
SvNumberFormatter, CurrencyChangeLink ) );
     bInitializing = false;
     g_CurrencyTableInitialized = true;
diff --git a/sw/source/core/bastyp/breakit.cxx 
b/sw/source/core/bastyp/breakit.cxx
index 33f55a1d548d..e911e5d7cdf9 100644
--- a/sw/source/core/bastyp/breakit.cxx
+++ b/sw/source/core/bastyp/breakit.cxx
@@ -75,10 +75,10 @@ void SwBreakIt::GetLocale_( const LanguageTag& rLanguageTag 
)
 
 void SwBreakIt::GetForbidden_( const LanguageType aLang )
 {
-    LocaleDataWrapper aWrap(m_xContext, GetLanguageTag(aLang));
+    const LocaleDataWrapper* pWrap = 
LocaleDataWrapper::get(GetLanguageTag(aLang));
 
     m_aForbiddenLang = aLang;
-    m_oForbidden.emplace(aWrap.getForbiddenCharacters());
+    m_oForbidden.emplace(pWrap->getForbiddenCharacters());
 }
 
 sal_uInt16 SwBreakIt::GetRealScriptOfText( const OUString& rText, sal_Int32 
nPos ) const
diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx
index 895c4636ffe7..9e883b0461ac 100644
--- a/sw/source/filter/ww8/ww8atr.cxx
+++ b/sw/source/filter/ww8/ww8atr.cxx
@@ -2744,11 +2744,10 @@ bool MSWordExportBase::GetNumberFormat(const SwField& 
rField, OUString& rStr)
         {
             nLng = pNumFormat->GetLanguage();
         }
-        LocaleDataWrapper aLocDat(pNFormatr->GetComponentContext(),
-                                  LanguageTag(nLng));
+        const LocaleDataWrapper* pLocDat = 
LocaleDataWrapper::get(LanguageTag(nLng));
 
         OUString sFormat(pNumFormat->GetMappedFormatstring(GetNfKeywordTable(),
-            aLocDat));
+            *pLocDat));
 
         if (!sFormat.isEmpty())
         {
diff --git a/toolkit/source/controls/unocontrolmodel.cxx 
b/toolkit/source/controls/unocontrolmodel.cxx
index 49f7a0a363df..b1ab348e7b33 100644
--- a/toolkit/source/controls/unocontrolmodel.cxx
+++ b/toolkit/source/controls/unocontrolmodel.cxx
@@ -330,14 +330,14 @@ css::uno::Any UnoControlModel::ImplGetDefaultValue( 
sal_uInt16 nPropId ) const
                 }
 
                 // the remaining is the locale
-                LocaleDataWrapper aLocaleInfo( m_xContext, 
LanguageTag(sDefaultCurrency) );
+                const LocaleDataWrapper* pLocaleInfo = LocaleDataWrapper::get( 
LanguageTag(sDefaultCurrency) );
                 if ( sBankSymbol.isEmpty() )
-                    sBankSymbol = aLocaleInfo.getCurrBankSymbol();
+                    sBankSymbol = pLocaleInfo->getCurrBankSymbol();
 
                 // look for the currency entry (for this language) which has 
the given bank symbol
-                const Sequence< Currency2 > aAllCurrencies = 
aLocaleInfo.getAllCurrencies();
+                const Sequence< Currency2 > aAllCurrencies = 
pLocaleInfo->getAllCurrencies();
 
-                OUString sCurrencySymbol = aLocaleInfo.getCurrSymbol();
+                OUString sCurrencySymbol = pLocaleInfo->getCurrSymbol();
                 if ( sBankSymbol.isEmpty() )
                 {
                     DBG_ASSERT( aAllCurrencies.hasElements(), 
"UnoControlModel::ImplGetDefaultValue: no currencies at all!" );
diff --git a/unotools/source/i18n/intlwrapper.cxx 
b/unotools/source/i18n/intlwrapper.cxx
index 19157dab4a67..cbe72e8bc430 100644
--- a/unotools/source/i18n/intlwrapper.cxx
+++ b/unotools/source/i18n/intlwrapper.cxx
@@ -37,7 +37,7 @@ IntlWrapper::~IntlWrapper()
 
 void IntlWrapper::ImplNewLocaleData() const
 {
-    const_cast<IntlWrapper*>(this)->pLocaleData.reset( new LocaleDataWrapper( 
m_xContext, maLanguageTag ) );
+    const_cast<IntlWrapper*>(this)->pLocaleData = LocaleDataWrapper::get( 
maLanguageTag );
 }
 
 void IntlWrapper::ImplNewCollator( bool bCaseSensitive ) const
diff --git a/unotools/source/i18n/localedatawrapper.cxx 
b/unotools/source/i18n/localedatawrapper.cxx
index a49f11f15ed1..51714d9d6062 100644
--- a/unotools/source/i18n/localedatawrapper.cxx
+++ b/unotools/source/i18n/localedatawrapper.cxx
@@ -43,6 +43,8 @@
 #include <tools/time.hxx>
 #include <tools/duration.hxx>
 #include <o3tl/string_view.hxx>
+#include <map>
+#include <mutex>
 #include <utility>
 
 const sal_uInt16 nCurrFormatDefault = 0;
@@ -59,6 +61,26 @@ namespace
 
 sal_uInt8 LocaleDataWrapper::nLocaleDataChecking = 0;
 
+/**
+ * Loading LocaleDataWrapper can become expensive because of all the 
function-symbol lookups required, so
+ * we cache these.
+ */
+// static
+const LocaleDataWrapper* LocaleDataWrapper::get(const LanguageTag& 
aLanguageTag)
+{
+    static std::map<LanguageTag, std::unique_ptr<LocaleDataWrapper>> gCache;
+    static std::mutex gMutex;
+
+    std::unique_lock l(gMutex);
+    auto it = gCache.find(aLanguageTag);
+    if (it != gCache.end())
+        return it->second.get();
+    auto pNew = new 
LocaleDataWrapper(comphelper::getProcessComponentContext(), aLanguageTag);
+    gCache.insert({aLanguageTag, std::unique_ptr<LocaleDataWrapper>(pNew)});
+    return pNew;
+};
+
+
 LocaleDataWrapper::LocaleDataWrapper(
             const Reference< uno::XComponentContext > & rxContext,
             LanguageTag aLanguageTag
diff --git a/vcl/source/app/i18nhelp.cxx b/vcl/source/app/i18nhelp.cxx
index d497cdba4fba..0f1ab0bff29b 100644
--- a/vcl/source/app/i18nhelp.cxx
+++ b/vcl/source/app/i18nhelp.cxx
@@ -47,7 +47,7 @@ vcl::I18nHelper::~I18nHelper()
 
 void vcl::I18nHelper::ImplDestroyWrappers()
 {
-    mpLocaleDataWrapper.reset();
+    mpLocaleDataWrapper = nullptr;
     mpTransliterationWrapper.reset();
 }
 
@@ -65,11 +65,11 @@ utl::TransliterationWrapper& 
vcl::I18nHelper::ImplGetTransliterationWrapper() co
     return *mpTransliterationWrapper;
 }
 
-LocaleDataWrapper& vcl::I18nHelper::ImplGetLocaleDataWrapper() const
+const LocaleDataWrapper& vcl::I18nHelper::ImplGetLocaleDataWrapper() const
 {
     if ( !mpLocaleDataWrapper )
     {
-        const_cast<vcl::I18nHelper*>(this)->mpLocaleDataWrapper.reset(new 
LocaleDataWrapper( m_xContext, maLanguageTag ));
+        const_cast<vcl::I18nHelper*>(this)->mpLocaleDataWrapper = 
LocaleDataWrapper::get( maLanguageTag );
     }
     return *mpLocaleDataWrapper;
 }
diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx
index d1d48c0f3efc..aaa577b2de89 100644
--- a/vcl/source/app/settings.cxx
+++ b/vcl/source/app/settings.cxx
@@ -282,9 +282,9 @@ struct ImplAllSettingsData
     SvtSysLocale                            maSysLocale;
     LanguageTag                             maLocale;
     LanguageTag                             maUILocale;
-    mutable std::unique_ptr<LocaleDataWrapper>      mpLocaleDataWrapper;
-    mutable std::unique_ptr<LocaleDataWrapper>      mpUILocaleDataWrapper;
-    mutable std::unique_ptr<LocaleDataWrapper>      mpNeutralLocaleDataWrapper;
+    mutable const LocaleDataWrapper*        mpLocaleDataWrapper { nullptr };
+    mutable const LocaleDataWrapper*        mpUILocaleDataWrapper { nullptr };
+    mutable const LocaleDataWrapper*        mpNeutralLocaleDataWrapper { 
nullptr };
     mutable std::unique_ptr<vcl::I18nHelper>        mpI18nHelper;
     mutable std::unique_ptr<vcl::I18nHelper>        mpUII18nHelper;
 
@@ -2549,9 +2549,6 @@ ImplAllSettingsData::ImplAllSettingsData( const 
ImplAllSettingsData& rData ) :
 
 ImplAllSettingsData::~ImplAllSettingsData()
 {
-    mpLocaleDataWrapper.reset();
-    mpUILocaleDataWrapper.reset();
-    mpNeutralLocaleDataWrapper.reset();
     mpI18nHelper.reset();
     mpUII18nHelper.reset();
 }
@@ -2654,7 +2651,7 @@ void AllSettings::SetLanguageTag( const LanguageTag& 
rLanguageTag )
 
     if ( myData->mpLocaleDataWrapper )
     {
-        myData->mpLocaleDataWrapper.reset();
+        myData->mpLocaleDataWrapper = nullptr;
     }
     if ( myData->mpI18nHelper )
     {
@@ -2757,24 +2754,21 @@ const LanguageTag& AllSettings::GetUILanguageTag() const
 const LocaleDataWrapper& AllSettings::GetLocaleDataWrapper() const
 {
     if ( !mxData->mpLocaleDataWrapper )
-        mxData->mpLocaleDataWrapper.reset( new LocaleDataWrapper(
-            comphelper::getProcessComponentContext(), GetLanguageTag() ) );
+        mxData->mpLocaleDataWrapper = LocaleDataWrapper::get( GetLanguageTag() 
);
     return *mxData->mpLocaleDataWrapper;
 }
 
 const LocaleDataWrapper& AllSettings::GetUILocaleDataWrapper() const
 {
     if ( !mxData->mpUILocaleDataWrapper )
-        mxData->mpUILocaleDataWrapper.reset( new LocaleDataWrapper(
-            comphelper::getProcessComponentContext(), GetUILanguageTag() ) );
+        mxData->mpUILocaleDataWrapper = LocaleDataWrapper::get( 
GetUILanguageTag() );
     return *mxData->mpUILocaleDataWrapper;
 }
 
 const LocaleDataWrapper& AllSettings::GetNeutralLocaleDataWrapper() const
 {
     if ( !mxData->mpNeutralLocaleDataWrapper )
-        mxData->mpNeutralLocaleDataWrapper.reset( new LocaleDataWrapper(
-            comphelper::getProcessComponentContext(), 
LanguageTag(u"en-US"_ustr) ) );
+        mxData->mpNeutralLocaleDataWrapper = LocaleDataWrapper::get( 
LanguageTag(u"en-US"_ustr) );
     return *mxData->mpNeutralLocaleDataWrapper;
 }
 
diff --git a/xmloff/source/style/xmlnumfe.cxx b/xmloff/source/style/xmlnumfe.cxx
index f09d1e94942b..ade9e56238a7 100644
--- a/xmloff/source/style/xmlnumfe.cxx
+++ b/xmloff/source/style/xmlnumfe.cxx
@@ -224,14 +224,13 @@ SvXMLNumFmtExport::SvXMLNumFmtExport(
 
     if ( m_pFormatter )
     {
-        m_pLocaleData.reset( new LocaleDataWrapper( 
m_pFormatter->GetComponentContext(),
-            m_pFormatter->GetLanguageTag() ) );
+        m_pLocaleData = LocaleDataWrapper::get( m_pFormatter->GetLanguageTag() 
);
     }
     else
     {
         LanguageTag aLanguageTag( MsLangId::getConfiguredSystemLanguage() );
 
-        m_pLocaleData.reset( new LocaleDataWrapper( 
m_rExport.getComponentContext(), std::move(aLanguageTag) ) );
+        m_pLocaleData = LocaleDataWrapper::get( std::move(aLanguageTag) );
     }
 
     m_pUsedList.reset(new SvXMLNumUsedList_Impl);
@@ -254,14 +253,13 @@ SvXMLNumFmtExport::SvXMLNumFmtExport(
 
     if ( m_pFormatter )
     {
-        m_pLocaleData.reset( new LocaleDataWrapper( 
m_pFormatter->GetComponentContext(),
-            m_pFormatter->GetLanguageTag() ) );
+        m_pLocaleData = LocaleDataWrapper::get( m_pFormatter->GetLanguageTag() 
);
     }
     else
     {
         LanguageTag aLanguageTag( MsLangId::getConfiguredSystemLanguage() );
 
-        m_pLocaleData.reset( new LocaleDataWrapper( 
m_rExport.getComponentContext(), std::move(aLanguageTag) ) );
+        m_pLocaleData = LocaleDataWrapper::get( std::move(aLanguageTag) );
     }
 
     m_pUsedList.reset(new SvXMLNumUsedList_Impl);
@@ -1780,8 +1778,7 @@ void SvXMLNumFmtExport::ExportPart_Impl( const 
SvNumberformat& rFormat, sal_uInt
                         if ( nElemType == NF_KEY_NNNN )
                         {
                             //  write additional text element for separator
-                            m_pLocaleData.reset( new LocaleDataWrapper( 
m_pFormatter->GetComponentContext(),
-                                LanguageTag( nLang ) ) );
+                            m_pLocaleData = LocaleDataWrapper::get( 
LanguageTag( nLang ) );
                             AddToTextElement_Impl( 
m_pLocaleData->getLongDateDayOfWeekSep() );
                         }
                     }
diff --git a/xmloff/source/style/xmlnumfi.cxx b/xmloff/source/style/xmlnumfi.cxx
index 110300ac1828..386e48381017 100644
--- a/xmloff/source/style/xmlnumfi.cxx
+++ b/xmloff/source/style/xmlnumfi.cxx
@@ -65,7 +65,7 @@ struct SvXMLNumFmtEntry
 class SvXMLNumImpData
 {
     SvNumberFormatter*  pFormatter;
-    std::unique_ptr<LocaleDataWrapper>  pLocaleData;
+    const LocaleDataWrapper*  pLocaleData { nullptr };
     std::vector<SvXMLNumFmtEntry> m_NameEntries;
 
     uno::Reference< uno::XComponentContext > m_xContext;
@@ -370,9 +370,7 @@ void SvXMLNumImpData::RemoveVolatileFormats()
 const LocaleDataWrapper& SvXMLNumImpData::GetLocaleData( LanguageType nLang )
 {
     if ( !pLocaleData || pLocaleData->getLanguageTag() != LanguageTag(nLang) )
-        pLocaleData = std::make_unique<LocaleDataWrapper>(
-               pFormatter ? pFormatter->GetComponentContext() : m_xContext,
-            LanguageTag( nLang ) );
+        pLocaleData = LocaleDataWrapper::get( LanguageTag( nLang ) );
     return *pLocaleData;
 }
 

Reply via email to