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 <caolan.mcnamara@collabora.com>
This commit is contained in:
Caolán McNamara
2026-02-21 17:22:43 +01:00
parent 6c2a89a6e2
commit 3ddada1c3e
2 changed files with 78 additions and 65 deletions
+14 -10
View File
@@ -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;
}
};
+64 -55
View File
@@ -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]