include/svl/zformat.hxx        |   24 ++++----
 svl/source/numbers/zformat.cxx |  119 ++++++++++++++++++++++-------------------
 2 files changed, 78 insertions(+), 65 deletions(-)

New commits:
commit 3ddada1c3ec4155632b7a0eeaf0707961c4703e0
Author:     Caolán McNamara <[email protected]>
AuthorDate: Tue Feb 17 09:46:35 2026 +0000
Commit:     Caolán McNamara <[email protected]>
CommitDate: Sat Feb 21 17:22:43 2026 +0100

    bubble explicit SvNFLanguageData through calendar switching, etc
    
    Change-Id: Ia43293806e43803301086d00ce3fee4a000ebf94
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199836
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/include/svl/zformat.hxx b/include/svl/zformat.hxx
index 0e9bcfc8190c..5aaa99d37033 100644
--- a/include/svl/zformat.hxx
+++ b/include/svl/zformat.hxx
@@ -474,13 +474,13 @@ public:
     /** Switches to the first non-"gregorian" calendar, but only if the current
         calendar is "gregorian"; original calendar name and date/time returned,
         but only if calendar switched and rOrgCalendar was empty. */
-    void SwitchToOtherCalendar( OUString& rOrgCalendar, double& fOrgDateTime, 
CalendarWrapper& rCal ) const;
+    static void SwitchToOtherCalendar( const SvNFLanguageData& rCurrentLang, 
OUString& rOrgCalendar, double& fOrgDateTime, CalendarWrapper& rCal );
 
     /** Switches to the "gregorian" calendar, but only if the current calendar
         is non-"gregorian" and rOrgCalendar is not empty. Thus a preceding
         ImpSwitchToOtherCalendar() call should have been placed prior to
         calling this method. */
-    void SwitchToGregorianCalendar( std::u16string_view rOrgCalendar, double 
fOrgDateTime, CalendarWrapper& rCal ) const;
+    static void SwitchToGregorianCalendar( const SvNFLanguageData& 
rCurrentLang, std::u16string_view rOrgCalendar, double fOrgDateTime, 
CalendarWrapper& rCal );
 
 #ifdef THE_FUTURE
     /** Switches to the first specified calendar, if any, in subformat nNumFor
@@ -491,11 +491,11 @@ public:
             <TRUE/> if a calendar was specified and switched to,
             <FALSE/> else.
      */
-    bool SwitchToSpecifiedCalendar( OUString& rOrgCalendar, double& 
fOrgDateTime,
+    bool SwitchToSpecifiedCalendar( const SvNFLanguageData& rCurrentLang, 
OUString& rOrgCalendar, double& fOrgDateTime,
             sal_uInt16 nNumFor ) const
         {
             if ( nNumFor < 4 )
-                return ImpSwitchToSpecifiedCalendar( rOrgCalendar,
+                return ImpSwitchToSpecifiedCalendar( rCurrentLang, 
rOrgCalendar,
                         fOrgDateTime, NumFor[nNumFor] );
             return false;
         }
@@ -527,7 +527,8 @@ private:
     SVL_DLLPRIVATE sal_uInt16 ImpGetNumForStringElementCount( sal_uInt16 
nNumFor ) const;
 
 #ifdef THE_FUTURE
-    SVL_DLLPRIVATE bool ImpSwitchToSpecifiedCalendar( OUString& rOrgCalendar,
+    SVL_DLLPRIVATE bool ImpSwitchToSpecifiedCalendar( const SvNFLanguageData& 
rCurrentLang,
+                                                      OUString& rOrgCalendar,
                                                       double& fOrgDateTime,
                                                       const ImpSvNumFor& 
rNumFor ) const;
 #endif
@@ -729,9 +730,10 @@ private:
     // know a "before" era (like zh_TW ROC or ja_JP Gengou). If switched and
     // rOrgCalendar was "gregorian" the string is emptied. If rOrgCalendar was
     // empty the previous calendar name and date/time are returned.
-    SVL_DLLPRIVATE bool ImpFallBackToGregorianCalendar(OUString& rOrgCalendar,
+    SVL_DLLPRIVATE static bool ImpFallBackToGregorianCalendar(const 
SvNFLanguageData& rCurrentLang,
+                                                       OUString& rOrgCalendar,
                                                        double& fOrgDateTime,
-                                                       CalendarWrapper& rCal) 
const;
+                                                       CalendarWrapper& rCal);
 
     // Append a "G" short era string of the given calendar. In the case of a
     // Gengou calendar this is a one character abbreviation, for other
@@ -780,11 +782,13 @@ private:
             const NativeNumberWrapper& rNatNum) const;
 
     // transliterate according to NativeNumber
-    SVL_DLLPRIVATE OUString impTransliterateImpl(const OUString& rStr, const 
SvNumberNatNum& rNum, sal_uInt16 nDateKey, const NativeNumberWrapper& rNatNum) 
const;
+    SVL_DLLPRIVATE static OUString impTransliterateImpl(const OUString& rStr, 
const SvNumberNatNum& rNum, sal_uInt16 nDateKey,
+                                                    const NativeNumberWrapper& 
rNatNum, const SvNFLanguageData& rCurrentLang);
 
-    OUString impTransliterate(const OUString& rStr, const SvNumberNatNum& 
rNum, sal_uInt16 nDateKey, const NativeNumberWrapper& rNatNum) const
+    OUString static impTransliterate(const OUString& rStr, const 
SvNumberNatNum& rNum, sal_uInt16 nDateKey,
+                              const NativeNumberWrapper& rNatNum, const 
SvNFLanguageData& rCurrentLang)
     {
-        return rNum.IsComplete() ? impTransliterateImpl(rStr, rNum, nDateKey, 
rNatNum) : rStr;
+        return rNum.IsComplete() ? impTransliterateImpl(rStr, rNum, nDateKey, 
rNatNum, rCurrentLang) : rStr;
     }
 
 };
diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index 6ae372d51978..84da3b98c50e 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -3142,7 +3142,7 @@ bool SvNumberformat::ImpGetTimeOutput(double fNumber,
     const ImpSvNumberformatInfo& rInfo = NumFor[nIx].Info();
     bool bInputLine;
     sal_Int32 nCntPost;
-    if ( rScan.GetStandardPrec() == SvNumberFormatter::INPUTSTRING_PRECISION &&
+    if ( rCurrentLang.GetStandardPrec() == 
SvNumberFormatter::INPUTSTRING_PRECISION &&
          0 < rInfo.nCntPost && rInfo.nCntPost < kTimeSignificantRound )
     {
         bInputLine = true;
@@ -3272,7 +3272,7 @@ bool SvNumberformat::ImpGetTimeOutput(double fNumber,
             CalendarWrapper& rCal = *rCurrentLang.GetCalendar();
             if ( !bCalendarSet )
             {
-                double fDiff = DateTime::Sub( DateTime(rScan.GetNullDate()), 
rCal.getEpochStart());
+                double fDiff = DateTime::Sub( 
DateTime(rCurrentLang.GetNullDate()), rCal.getEpochStart());
                 fDiff += fNumberOrig;
                 rCal.setLocalDateTime( fDiff );
                 bCalendarSet = true;
@@ -3481,16 +3481,18 @@ bool ImpIsOtherCalendar( const ImpSvNumFor& rNumFor, 
const CalendarWrapper& rCal
 
 }
 
-void SvNumberformat::SwitchToOtherCalendar( OUString& rOrgCalendar,
+//static
+void SvNumberformat::SwitchToOtherCalendar( const SvNFLanguageData& 
rCurrentLang,
+                                            OUString& rOrgCalendar,
                                             double& fOrgDateTime,
-                                            CalendarWrapper& rCal ) const
+                                            CalendarWrapper& rCal )
 {
     if ( rCal.getUniqueID() != GREGORIAN )
         return;
 
     using namespace ::com::sun::star::i18n;
     const css::uno::Sequence< OUString > xCals = rCal.getAllCalendars(
-            rLoc().getLanguageTag().getLocale() );
+            rCurrentLang.GetLocaleData()->getLanguageTag().getLocale() );
     sal_Int32 nCnt = xCals.getLength();
     if ( nCnt <= 1 )
         return;
@@ -3505,24 +3507,28 @@ void SvNumberformat::SwitchToOtherCalendar( OUString& 
rOrgCalendar,
         rOrgCalendar = rCal.getUniqueID();
         fOrgDateTime = rCal.getDateTime();
     }
-    rCal.loadCalendar( *pCal, rLoc().getLanguageTag().getLocale() );
+    rCal.loadCalendar( *pCal, 
rCurrentLang.GetLocaleData()->getLanguageTag().getLocale() );
     rCal.setDateTime( fOrgDateTime );
 }
 
-void SvNumberformat::SwitchToGregorianCalendar( std::u16string_view 
rOrgCalendar,
+//static
+void SvNumberformat::SwitchToGregorianCalendar( const SvNFLanguageData& 
rCurrentLang,
+                                                std::u16string_view 
rOrgCalendar,
                                                 double fOrgDateTime,
-                                                CalendarWrapper& rCal ) const
+                                                CalendarWrapper& rCal )
 {
     if ( rOrgCalendar.size() && rCal.getUniqueID() != GREGORIAN )
     {
-        rCal.loadCalendar( GREGORIAN, rLoc().getLanguageTag().getLocale() );
+        rCal.loadCalendar( GREGORIAN, 
rCurrentLang.GetLocaleData()->getLanguageTag().getLocale() );
         rCal.setDateTime( fOrgDateTime );
     }
 }
 
-bool SvNumberformat::ImpFallBackToGregorianCalendar( OUString& rOrgCalendar,
+//static
+bool SvNumberformat::ImpFallBackToGregorianCalendar( const SvNFLanguageData& 
rCurrentLang,
+                                                     OUString& rOrgCalendar,
                                                      double& fOrgDateTime,
-                                                     CalendarWrapper& rCal ) 
const
+                                                     CalendarWrapper& rCal )
 {
     using namespace ::com::sun::star::i18n;
     if ( rCal.getUniqueID() != GREGORIAN )
@@ -3539,7 +3545,7 @@ bool SvNumberformat::ImpFallBackToGregorianCalendar( 
OUString& rOrgCalendar,
             {
                 rOrgCalendar.clear();
             }
-            rCal.loadCalendar( GREGORIAN, rLoc().getLanguageTag().getLocale() 
);
+            rCal.loadCalendar( GREGORIAN, 
rCurrentLang.GetLocaleData()->getLanguageTag().getLocale() );
             rCal.setDateTime( fOrgDateTime );
             return true;
         }
@@ -3554,7 +3560,8 @@ bool SvNumberformat::ImpFallBackToGregorianCalendar( 
OUString& rOrgCalendar,
  * SwitchToSpecifiedCalendar(), see comment in
  * ImpSvNumberInputScan::GetDateRef() */
 
-bool SvNumberformat::ImpSwitchToSpecifiedCalendar( OUString& rOrgCalendar,
+bool SvNumberformat::ImpSwitchToSpecifiedCalendar( const SvNFLanguageData& 
rCurrentLang,
+                                                   OUString& rOrgCalendar,
                                                    double& fOrgDateTime,
                                                    const ImpSvNumFor& rNumFor 
) const
 {
@@ -3570,7 +3577,7 @@ bool SvNumberformat::ImpSwitchToSpecifiedCalendar( 
OUString& rOrgCalendar,
                 rOrgCalendar = rCal.getUniqueID();
                 fOrgDateTime = rCal.getDateTime();
             }
-            rCal.loadCalendar( rInfo.sStrArray[i], rLoc().getLocale() );
+            rCal.loadCalendar( rInfo.sStrArray[i], 
rCurrentLang.GetLocaleData()->getLocale() );
             rCal.setDateTime( fOrgDateTime );
             return true;
         }
@@ -3759,7 +3766,7 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
     bool bRes = false;
 
     CalendarWrapper& rCal = *rCurrentLang.GetCalendar();
-    if (!lcl_getValidDate( DateTime( rScan.GetNullDate() ), 
rCal.getEpochStart(), fNumber))
+    if (!lcl_getValidDate( DateTime( rCurrentLang.GetNullDate() ), 
rCal.getEpochStart(), fNumber))
     {
         sBuff = ImpSvNumberformatScan::sErrStr;
         return false;
@@ -3772,9 +3779,9 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
     bool bOtherCalendar = ImpIsOtherCalendar( NumFor[nIx], 
*rCurrentLang.GetCalendar() );
     if ( bOtherCalendar )
     {
-        SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+        SwitchToOtherCalendar( rCurrentLang, aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
     }
-    if ( ImpFallBackToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() ) )
+    if ( ImpFallBackToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() ) )
     {
         bOtherCalendar = false;
     }
@@ -3811,9 +3818,9 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
                 aOrgCalendar = rCal.getUniqueID();
                 fOrgDateTime = rCal.getDateTime();
             }
-            rCal.loadCalendar( rInfo.sStrArray[i], 
rLoc().getLanguageTag().getLocale() );
+            rCal.loadCalendar( rInfo.sStrArray[i], 
rCurrentLang.GetLocaleData()->getLanguageTag().getLocale() );
             rCal.setDateTime( fOrgDateTime );
-            ImpFallBackToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+            ImpFallBackToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             break;
         case NF_SYMBOLTYPE_STAR:
             if( bStarFlag )
@@ -3838,7 +3845,7 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
             // for example, Catalan "de març", but "d'abril" etc.
             if ( bUseSpellout )
             {
-                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum);
+                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum, rCurrentLang);
             }
             sBuff.append(aStr);
             break;
@@ -3859,7 +3866,7 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
                                                            nNatNum);
             if ( bUseSpellout )
             {
-                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum);
+                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum, rCurrentLang);
             }
             sBuff.append(aStr);
             break;
@@ -3874,7 +3881,7 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
             // NatNum12: support variants of preposition, suffixation or 
article
             if ( bUseSpellout )
             {
-                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum);
+                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum, rCurrentLang);
             }
             sBuff.append(aStr);
             break;
@@ -3884,41 +3891,41 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
         case NF_KEY_DDD:                // DDD
             if ( bOtherCalendar )
             {
-                SwitchToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             aStr = rCal.getDisplayString( CalendarDisplayCode::SHORT_DAY_NAME, 
nNatNum );
             // NatNum12: support at least capitalize, upper, lower, title
             if ( bUseSpellout )
             {
-                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum);
+                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum, rCurrentLang);
             }
             sBuff.append(aStr);
             if ( bOtherCalendar )
             {
-                SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToOtherCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             break;
         case NF_KEY_DDDD:               // DDDD
             if ( bOtherCalendar )
             {
-                SwitchToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             aStr = rCal.getDisplayString( CalendarDisplayCode::LONG_DAY_NAME, 
nNatNum );
             // NatNum12: support variants of preposition, suffixation or 
article
             if ( bUseSpellout )
             {
-                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum);
+                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum, rCurrentLang);
             }
             sBuff.append(aStr);
             if ( bOtherCalendar )
             {
-                SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToOtherCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             break;
         case NF_KEY_YY:                 // YY
             if ( bOtherCalendar )
             {
-                SwitchToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             // Prepend a minus sign if Gregorian BCE and era is not displayed.
             if (lcl_isSignedYear( rCal, NumFor[nIx] ))
@@ -3928,13 +3935,13 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
             sBuff.append(rCal.getDisplayString( 
CalendarDisplayCode::SHORT_YEAR, nNatNum ));
             if ( bOtherCalendar )
             {
-                SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToOtherCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             break;
         case NF_KEY_YYYY:               // YYYY
             if ( bOtherCalendar )
             {
-                SwitchToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             // Prepend a minus sign if Gregorian BCE and era is not displayed.
             if (lcl_isSignedYear( rCal, NumFor[nIx] ))
@@ -3957,12 +3964,12 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
             // NatNum12: support variants of preposition, suffixation or 
article
             if ( bUseSpellout )
             {
-                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum);
+                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum, rCurrentLang);
             }
             sBuff.append(aStr);
             if ( bOtherCalendar )
             {
-                SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToOtherCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             break;
         case NF_KEY_EC:                 // E
@@ -3978,7 +3985,7 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
             // NatNum12: support at least capitalize, upper, lower, title
             if ( bUseSpellout )
             {
-                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum);
+                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum, rCurrentLang);
             }
             sBuff.append(aStr);
             break;
@@ -3988,13 +3995,13 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
             // NatNum12: support variants of preposition, suffixation or 
article
             if ( bUseSpellout )
             {
-                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum);
+                aStr = impTransliterate(aStr, NumFor[nIx].GetNatNum(), 
rInfo.nTypeArray[i], rNatNum, rCurrentLang);
             }
             sBuff.append(aStr);
             break;
         case NF_KEY_NNNN:               // NNNN
             sBuff.append(rCal.getDisplayString( 
CalendarDisplayCode::LONG_DAY_NAME, nNatNum ));
-            sBuff.append(rLoc().getLongDateDayOfWeekSep());
+            
sBuff.append(rCurrentLang.GetLocaleData()->getLongDateDayOfWeekSep());
             break;
         case NF_KEY_WW :                // WW
             sBuff.append(ImpIntToString(rNatNum, nIx,
@@ -4016,7 +4023,7 @@ bool SvNumberformat::ImpGetDateOutput(double fNumber,
     }
     if ( aOrgCalendar.getLength() )
     {
-        rCal.loadCalendar( aOrgCalendar, rLoc().getLanguageTag().getLocale() 
);  // restore calendar
+        rCal.loadCalendar( aOrgCalendar, 
rCurrentLang.GetLocaleData()->getLanguageTag().getLocale() );  // restore 
calendar
     }
     return bRes;
 }
@@ -4032,7 +4039,7 @@ bool SvNumberformat::ImpGetDateTimeOutput(double fNumber,
     bool bRes = false;
 
     CalendarWrapper& rCal = *rCurrentLang.GetCalendar();
-    if (!lcl_getValidDate( DateTime( rScan.GetNullDate() ), 
rCal.getEpochStart(), fNumber))
+    if (!lcl_getValidDate( DateTime( rCurrentLang.GetNullDate() ), 
rCal.getEpochStart(), fNumber))
     {
         sBuff = ImpSvNumberformatScan::sErrStr;
         return false;
@@ -4041,7 +4048,7 @@ bool SvNumberformat::ImpGetDateTimeOutput(double fNumber,
     const ImpSvNumberformatInfo& rInfo = NumFor[nIx].Info();
     bool bInputLine;
     sal_Int32 nCntPost, nFirstRounding;
-    if ( rScan.GetStandardPrec() == SvNumberFormatter::INPUTSTRING_PRECISION &&
+    if ( rCurrentLang.GetStandardPrec() == 
SvNumberFormatter::INPUTSTRING_PRECISION &&
          0 < rInfo.nCntPost && rInfo.nCntPost < kTimeSignificantRound )
     {
         bInputLine = true;
@@ -4070,9 +4077,9 @@ bool SvNumberformat::ImpGetDateTimeOutput(double fNumber,
     bool bOtherCalendar = ImpIsOtherCalendar( NumFor[nIx], 
*rCurrentLang.GetCalendar() );
     if ( bOtherCalendar )
     {
-        SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+        SwitchToOtherCalendar( rCurrentLang, aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
     }
-    if ( ImpFallBackToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() ) )
+    if ( ImpFallBackToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() ) )
     {
         bOtherCalendar = false;
     }
@@ -4158,9 +4165,9 @@ bool SvNumberformat::ImpGetDateTimeOutput(double fNumber,
                 aOrgCalendar = rCal.getUniqueID();
                 fOrgDateTime = rCal.getDateTime();
             }
-            rCal.loadCalendar( rInfo.sStrArray[i], 
rLoc().getLanguageTag().getLocale() );
+            rCal.loadCalendar( rInfo.sStrArray[i], 
rCurrentLang.GetLocaleData()->getLanguageTag().getLocale() );
             rCal.setDateTime( fOrgDateTime );
-            ImpFallBackToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+            ImpFallBackToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             break;
         case NF_SYMBOLTYPE_STAR:
             if( bStarFlag )
@@ -4268,29 +4275,29 @@ bool SvNumberformat::ImpGetDateTimeOutput(double 
fNumber,
         case NF_KEY_DDD:                // DDD
             if ( bOtherCalendar )
             {
-                SwitchToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             sBuff.append(rCal.getDisplayString( 
CalendarDisplayCode::SHORT_DAY_NAME, nNatNum ));
             if ( bOtherCalendar )
             {
-                SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToOtherCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             break;
         case NF_KEY_DDDD:               // DDDD
             if ( bOtherCalendar )
             {
-                SwitchToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             sBuff.append(rCal.getDisplayString( 
CalendarDisplayCode::LONG_DAY_NAME, nNatNum ));
             if ( bOtherCalendar )
             {
-                SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToOtherCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             break;
         case NF_KEY_YY:                 // YY
             if ( bOtherCalendar )
             {
-                SwitchToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             // Prepend a minus sign if Gregorian BCE and era is not displayed.
             if (lcl_isSignedYear( rCal, NumFor[nIx] ))
@@ -4300,13 +4307,13 @@ bool SvNumberformat::ImpGetDateTimeOutput(double 
fNumber,
             sBuff.append(rCal.getDisplayString( 
CalendarDisplayCode::SHORT_YEAR, nNatNum ));
             if ( bOtherCalendar )
             {
-                SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToOtherCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             break;
         case NF_KEY_YYYY:               // YYYY
             if ( bOtherCalendar )
             {
-                SwitchToGregorianCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToGregorianCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             // Prepend a minus sign if Gregorian BCE and era is not displayed.
             if (lcl_isSignedYear( rCal, NumFor[nIx] ))
@@ -4332,7 +4339,7 @@ bool SvNumberformat::ImpGetDateTimeOutput(double fNumber,
             }
             if ( bOtherCalendar )
             {
-                SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime, 
*rCurrentLang.GetCalendar() );
+                SwitchToOtherCalendar( rCurrentLang, aOrgCalendar, 
fOrgDateTime, *rCurrentLang.GetCalendar() );
             }
             break;
         case NF_KEY_EC:                 // E
@@ -4352,7 +4359,7 @@ bool SvNumberformat::ImpGetDateTimeOutput(double fNumber,
             break;
         case NF_KEY_NNNN:               // NNNN
             sBuff.append(rCal.getDisplayString( 
CalendarDisplayCode::LONG_DAY_NAME, nNatNum ));
-            sBuff.append(rLoc().getLongDateDayOfWeekSep());
+            
sBuff.append(rCurrentLang.GetLocaleData()->getLongDateDayOfWeekSep());
             break;
         case NF_KEY_WW :                // WW
             sBuff.append(ImpIntToString(rNatNum, nIx, rCal.getValue( 
CalendarFieldIndex::WEEK_OF_YEAR )));
@@ -4373,7 +4380,7 @@ bool SvNumberformat::ImpGetDateTimeOutput(double fNumber,
     }
     if ( aOrgCalendar.getLength() )
     {
-        rCal.loadCalendar( aOrgCalendar, rLoc().getLanguageTag().getLocale() 
);  // restore calendar
+        rCal.loadCalendar( aOrgCalendar, 
rCurrentLang.GetLocaleData()->getLanguageTag().getLocale() );  // restore 
calendar
     }
     return bRes;
 }
@@ -5739,16 +5746,18 @@ OUString SvNumberformat::ImpGetNatNumString(const 
SvNumberNatNum& rNum,
     return ::impTransliterate(aStr, rNum, rNatNum);
 }
 
+//static
 OUString SvNumberformat::impTransliterateImpl(const OUString& rStr,
                                               const SvNumberNatNum& rNum,
                                               const sal_uInt16 nDateKey,
-                                              const NativeNumberWrapper& 
rNatNum) const
+                                              const NativeNumberWrapper& 
rNatNum,
+                                              const SvNFLanguageData& 
rCurrentLang)
 {
     // no KEYWORD=argument list in NatNum12
     if (rNum.GetParams().indexOf('=') == -1)
         return ::impTransliterateImpl( rStr, rNum, rNatNum);
 
-    const NfKeywordTable & rKeywords = rScan.GetKeywords();
+    const NfKeywordTable & rKeywords = rCurrentLang.GetKeywords();
 
     // Format: KEYWORD=numbertext_prefix, ..., for example:
     // [NatNum12 YYYY=title ordinal,MMMM=article, D=ordinal-number]

Reply via email to