include/unotools/localedatawrapper.hxx | 29 ++++++++----- unotools/source/i18n/localedatawrapper.cxx | 61 ++++++++++++++++++++++++++++- xmloff/source/style/xmlnumfi.cxx | 5 -- 3 files changed, 78 insertions(+), 17 deletions(-)
New commits: commit f882555332fffbd3ea82c3a25a05ebebe3884415 Author: Eike Rathke <er...@redhat.com> Date: Tue Sep 13 12:46:21 2016 +0200 switch to using LocaleDataWrapper::doesSecondaryCalendarUseEC() Change-Id: I6621e82249feeed3d88ee463447d08c4f812259c diff --git a/xmloff/source/style/xmlnumfi.cxx b/xmloff/source/style/xmlnumfi.cxx index e2b0f8d..ec363c3 100644 --- a/xmloff/source/style/xmlnumfi.cxx +++ b/xmloff/source/style/xmlnumfi.cxx @@ -1205,10 +1205,7 @@ void SvXMLNumFmtElementContext::EndElement() //! I18N doesn't provide SYSTEM or extended date information yet // Y after G (era) is replaced by E, also if we're switching to the // other second known calendar for a locale. - /* TODO: here only for zh-TW, handle for other locales as well. */ - if ( rParent.HasEra() || - (sCalendar.equalsIgnoreAsciiCase("ROC") && - rParent.GetLocaleData().getLoadedLanguageTag().getBcp47() == "zh-TW")) + if ( rParent.HasEra() || rParent.GetLocaleData().doesSecondaryCalendarUseEC( sCalendar)) { rParent.AddNfKeyword( sal::static_int_cast< sal_uInt16 >( commit c22f9f0e00f26015f8019193c0db2fbb895b2cdc Author: Eike Rathke <er...@redhat.com> Date: Tue Sep 13 12:43:05 2016 +0200 introduce LocaleDataWrapper::doesSecondaryCalendarUseEC() Preparing to replace the number format import hack of 95c91f098e8974c41c8d403a351fe53db6822165 and generalizing for known locales. Change-Id: I0413987e302eaa84ef6a7dde2ecb365144313e81 diff --git a/include/unotools/localedatawrapper.hxx b/include/unotools/localedatawrapper.hxx index 642cd82..0ea75ef 100644 --- a/include/unotools/localedatawrapper.hxx +++ b/include/unotools/localedatawrapper.hxx @@ -58,6 +58,7 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper css::uno::Reference< css::i18n::XLocaleData4 > xLD; LanguageTag maLanguageTag; std::shared_ptr< css::i18n::Calendar2 > xDefaultCalendar; + std::shared_ptr< css::i18n::Calendar2 > xSecondaryCalendar; css::i18n::LocaleDataItem aLocaleDataItem; css::uno::Sequence< OUString > aReservedWordSeq; css::uno::Sequence< OUString > aDateAcceptancePatterns; @@ -74,6 +75,7 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper sal_uInt16 nCurrDigits; bool bLocaleDataItemValid; bool bReservedWordValid; + bool bSecondaryCalendarValid; mutable ::utl::ReadWriteMutex aMutex; struct Locale_Compare { @@ -105,6 +107,7 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper DateFormat scanDateFormatImpl( const OUString& rCode ); void getDefaultCalendarImpl(); + void getSecondaryCalendarImpl(); sal_Unicode* ImplAddFormatNum( sal_Unicode* pBuf, sal_Int64 nNumber, sal_uInt16 nDecimals, @@ -183,6 +186,10 @@ public: /// Convenience method to obtain the month names of the default calendar. const css::uno::Sequence< css::i18n::CalendarItem2 > getDefaultCalendarMonths() const; + /** If the secondary calendar, if any, is of the name passed AND number + formats using it usually use the E or EE keyword (EC|EEC). */ + bool doesSecondaryCalendarUseEC( const OUString& rName ) const; + /** Obtain digit grouping. The usually known grouping by thousands (#,###) is actually only one of possible groupings. Another one, for example, used in India is group by 3 and then by 2 indefinitely (#,##,###). The diff --git a/unotools/source/i18n/localedatawrapper.cxx b/unotools/source/i18n/localedatawrapper.cxx index 1a31ba5..1c996c5 100644 --- a/unotools/source/i18n/localedatawrapper.cxx +++ b/unotools/source/i18n/localedatawrapper.cxx @@ -89,7 +89,8 @@ LocaleDataWrapper::LocaleDataWrapper( xLD( LocaleData::create(rxContext) ), maLanguageTag( rLanguageTag ), bLocaleDataItemValid( false ), - bReservedWordValid( false ) + bReservedWordValid( false ), + bSecondaryCalendarValid( false ) { invalidateData(); } @@ -102,7 +103,8 @@ LocaleDataWrapper::LocaleDataWrapper( xLD( LocaleData::create(m_xContext) ), maLanguageTag( rLanguageTag ), bLocaleDataItemValid( false ), - bReservedWordValid( false ) + bReservedWordValid( false ), + bSecondaryCalendarValid( false ) { invalidateData(); } @@ -149,6 +151,8 @@ void LocaleDataWrapper::invalidateData() bReservedWordValid = false; } xDefaultCalendar.reset(); + xSecondaryCalendar.reset(); + bSecondaryCalendarValid = false; if (aGrouping.getLength()) aGrouping[0] = 0; if (aDateAcceptancePatterns.getLength()) @@ -475,6 +479,59 @@ MeasurementSystem LocaleDataWrapper::mapMeasurementStringToEnum( const OUString& return MEASURE_US; } +void LocaleDataWrapper::getSecondaryCalendarImpl() +{ + if (!xSecondaryCalendar && !bSecondaryCalendarValid) + { + Sequence< Calendar2 > xCals = getAllCalendars(); + sal_Int32 nCount = xCals.getLength(); + if (nCount > 1) + { + sal_Int32 nNonDef = -1; + const Calendar2* pArr = xCals.getArray(); + for (sal_Int32 i=0; i<nCount; ++i) + { + if (!pArr[i].Default) + { + nNonDef = i; + break; + } + } + if (nNonDef >= 0) + xSecondaryCalendar.reset( new Calendar2( xCals[nNonDef])); + } + bSecondaryCalendarValid = true; + } +} + +bool LocaleDataWrapper::doesSecondaryCalendarUseEC( const OUString& rName ) const +{ + if (rName.isEmpty()) + return false; + + ::utl::ReadWriteGuard aGuard( aMutex ); + + if (!bSecondaryCalendarValid) + { // no cached content + aGuard.changeReadToWrite(); + const_cast<LocaleDataWrapper*>(this)->getSecondaryCalendarImpl(); + } + if (!xSecondaryCalendar) + return false; + if (!xSecondaryCalendar->Name.equalsIgnoreAsciiCase( rName)) + return false; + + LanguageTag aLoaded( getLoadedLanguageTag()); + OUString aBcp47( aLoaded.getBcp47()); + // So far determine only by locale, we know for a few. + /* TODO: check date format codes? or add to locale data? */ + return + aBcp47 == "ja-JP" || + aBcp47 == "lo-LA" || + aBcp47 == "zh-TW" + ; +} + void LocaleDataWrapper::getDefaultCalendarImpl() { if (!xDefaultCalendar) commit 1e0b7b7e4b95e896e32d49a2fed7a5760e509f36 Author: Eike Rathke <er...@redhat.com> Date: Sun Sep 11 18:06:43 2016 +0200 cosmetics Change-Id: I32c1df5a8e7164c59ebfe0d1e1d11dd6f3b8edf8 diff --git a/include/unotools/localedatawrapper.hxx b/include/unotools/localedatawrapper.hxx index ac0352f..642cd82 100644 --- a/include/unotools/localedatawrapper.hxx +++ b/include/unotools/localedatawrapper.hxx @@ -63,17 +63,17 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper css::uno::Sequence< OUString > aDateAcceptancePatterns; css::uno::Sequence< sal_Int32 > aGrouping; // cached items - OUString aLocaleItem[css::i18n::LocaleItem::COUNT]; - OUString aReservedWord[css::i18n::reservedWords::COUNT]; - OUString aCurrSymbol; - OUString aCurrBankSymbol; - int nDateFormat; - int nLongDateFormat; - sal_uInt16 nCurrPositiveFormat; - sal_uInt16 nCurrNegativeFormat; - sal_uInt16 nCurrDigits; - bool bLocaleDataItemValid; - bool bReservedWordValid; + OUString aLocaleItem[css::i18n::LocaleItem::COUNT]; + OUString aReservedWord[css::i18n::reservedWords::COUNT]; + OUString aCurrSymbol; + OUString aCurrBankSymbol; + int nDateFormat; + int nLongDateFormat; + sal_uInt16 nCurrPositiveFormat; + sal_uInt16 nCurrNegativeFormat; + sal_uInt16 nCurrDigits; + bool bLocaleDataItemValid; + bool bReservedWordValid; mutable ::utl::ReadWriteMutex aMutex; struct Locale_Compare { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits