1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef _UNOTOOLS_LOCALEDATAWRAPPER_HXX 25*b1cdbd2cSJim Jagielski #define _UNOTOOLS_LOCALEDATAWRAPPER_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <tools/string.hxx> 28*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/XLocaleData2.hpp> 29*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/LocaleItem.hpp> 30*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/reservedWords.hpp> 31*b1cdbd2cSJim Jagielski #include <unotools/readwritemutexguard.hxx> 32*b1cdbd2cSJim Jagielski #include "unotools/unotoolsdllapi.h" 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski #ifndef BOOST_SHARED_PTR_HPP_INCLUDED 35*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp> 36*b1cdbd2cSJim Jagielski #endif 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski namespace com { namespace sun { namespace star { 40*b1cdbd2cSJim Jagielski namespace lang { 41*b1cdbd2cSJim Jagielski class XMultiServiceFactory; 42*b1cdbd2cSJim Jagielski } 43*b1cdbd2cSJim Jagielski }}} 44*b1cdbd2cSJim Jagielski class Date; 45*b1cdbd2cSJim Jagielski class Time; 46*b1cdbd2cSJim Jagielski class CalendarWrapper; 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski enum DateFormat { 50*b1cdbd2cSJim Jagielski MDY, 51*b1cdbd2cSJim Jagielski DMY, 52*b1cdbd2cSJim Jagielski YMD 53*b1cdbd2cSJim Jagielski }; 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski 56*b1cdbd2cSJim Jagielski enum MeasurementSystem { 57*b1cdbd2cSJim Jagielski MEASURE_METRIC, 58*b1cdbd2cSJim Jagielski MEASURE_US 59*b1cdbd2cSJim Jagielski }; 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski class UNOTOOLS_DLLPUBLIC LocaleDataWrapper 63*b1cdbd2cSJim Jagielski { 64*b1cdbd2cSJim Jagielski static sal_uInt8 nLocaleDataChecking; // 0:=dontknow, 1:=yes, 2:=no 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr; 67*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XLocaleData2 > xLD; 68*b1cdbd2cSJim Jagielski ::com::sun::star::lang::Locale aLocale; 69*b1cdbd2cSJim Jagielski ::boost::shared_ptr< ::com::sun::star::i18n::Calendar > xDefaultCalendar; 70*b1cdbd2cSJim Jagielski ::com::sun::star::i18n::LocaleDataItem aLocaleDataItem; 71*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< ::rtl::OUString > aReservedWordSeq; 72*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< sal_Int32 > aGrouping; 73*b1cdbd2cSJim Jagielski // cached items 74*b1cdbd2cSJim Jagielski String aLocaleItem[::com::sun::star::i18n::LocaleItem::COUNT]; 75*b1cdbd2cSJim Jagielski String aReservedWord[::com::sun::star::i18n::reservedWords::COUNT]; 76*b1cdbd2cSJim Jagielski String aCurrSymbol; 77*b1cdbd2cSJim Jagielski String aCurrBankSymbol; 78*b1cdbd2cSJim Jagielski int nDateFormat; 79*b1cdbd2cSJim Jagielski int nLongDateFormat; 80*b1cdbd2cSJim Jagielski sal_uInt16 nCurrPositiveFormat; 81*b1cdbd2cSJim Jagielski sal_uInt16 nCurrNegativeFormat; 82*b1cdbd2cSJim Jagielski sal_uInt16 nCurrDigits; 83*b1cdbd2cSJim Jagielski sal_Bool bLocaleDataItemValid; 84*b1cdbd2cSJim Jagielski sal_Bool bReservedWordValid; 85*b1cdbd2cSJim Jagielski mutable ::utl::ReadWriteMutex aMutex; 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski // dummies, to be implemented or provided by XML locale data 88*b1cdbd2cSJim Jagielski sal_Unicode cCurrZeroChar; 89*b1cdbd2cSJim Jagielski 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski // not implemented, prevent usage 92*b1cdbd2cSJim Jagielski LocaleDataWrapper( const LocaleDataWrapper& ); 93*b1cdbd2cSJim Jagielski LocaleDataWrapper& operator=( const LocaleDataWrapper& ); 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski // whenever Locale changes 96*b1cdbd2cSJim Jagielski void invalidateData(); 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski void getOneLocaleItemImpl( sal_Int16 nItem ); 99*b1cdbd2cSJim Jagielski const String& getOneLocaleItem( sal_Int16 nItem ) const; 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski void getOneReservedWordImpl( sal_Int16 nWord ); 102*b1cdbd2cSJim Jagielski const String& getOneReservedWord( sal_Int16 nWord ) const; 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski void getCurrSymbolsImpl(); 105*b1cdbd2cSJim Jagielski void getCurrFormatsImpl(); 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski void scanCurrFormatImpl( const String& rCode, 108*b1cdbd2cSJim Jagielski xub_StrLen nStart, xub_StrLen& nSign, 109*b1cdbd2cSJim Jagielski xub_StrLen& nPar, xub_StrLen& nNum, 110*b1cdbd2cSJim Jagielski xub_StrLen& nBlank, xub_StrLen& nSym ); 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski void getDateFormatsImpl(); 113*b1cdbd2cSJim Jagielski DateFormat scanDateFormatImpl( const String& rCode ); 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski void getDefaultCalendarImpl(); 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski sal_Unicode* ImplAddFormatNum( sal_Unicode* pBuf, 118*b1cdbd2cSJim Jagielski sal_Int64 nNumber, sal_uInt16 nDecimals, 119*b1cdbd2cSJim Jagielski sal_Bool bUseThousandSep, sal_Bool bTrailingZeros ) const; 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski void getDigitGroupingImpl(); 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski public: 124*b1cdbd2cSJim Jagielski LocaleDataWrapper( 125*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & xSF, 126*b1cdbd2cSJim Jagielski const ::com::sun::star::lang::Locale& rLocale 127*b1cdbd2cSJim Jagielski ); 128*b1cdbd2cSJim Jagielski ~LocaleDataWrapper(); 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski /** Get the service factory, meant to be able to create a CalendarWrapper 131*b1cdbd2cSJim Jagielski from a LocaleDataWrapper. Note that the service factory may be 132*b1cdbd2cSJim Jagielski non-existent if this LocaleDataWrapper was created without one and 133*b1cdbd2cSJim Jagielski lives "on the grassland". The CalendarWrapper ctor can handle that 134*b1cdbd2cSJim Jagielski though. */ 135*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< getServiceFactory() const136*b1cdbd2cSJim Jagielski ::com::sun::star::lang::XMultiServiceFactory > & getServiceFactory() 137*b1cdbd2cSJim Jagielski const { return xSMgr; } 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielski /// set a new Locale to request 140*b1cdbd2cSJim Jagielski void setLocale( const ::com::sun::star::lang::Locale& rLocale ); 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski /// get current requested Locale 143*b1cdbd2cSJim Jagielski const ::com::sun::star::lang::Locale& getLocale() const; 144*b1cdbd2cSJim Jagielski 145*b1cdbd2cSJim Jagielski /// get current loaded Locale, which might differ from the requested Locale 146*b1cdbd2cSJim Jagielski ::com::sun::star::lang::Locale getLoadedLocale() const; 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski 149*b1cdbd2cSJim Jagielski // Wrapper implementations of service LocaleData 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielski ::com::sun::star::i18n::LanguageCountryInfo getLanguageCountryInfo() const; 152*b1cdbd2cSJim Jagielski ::com::sun::star::i18n::LocaleDataItem getLocaleItem() const; 153*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::Calendar > getAllCalendars() const; 154*b1cdbd2cSJim Jagielski /// NOTE: this wraps XLocaleData2::getAllCurrencies2() in fact. 155*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::Currency2 > getAllCurrencies() const; 156*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::FormatElement > getAllFormats() const; 157*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::Implementation > getCollatorImplementations() const; 158*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< ::rtl::OUString > getTransliterations() const; 159*b1cdbd2cSJim Jagielski ::com::sun::star::i18n::ForbiddenCharacters getForbiddenCharacters() const; 160*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< ::rtl::OUString > getReservedWord() const; 161*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< ::com::sun::star::lang::Locale > getAllInstalledLocaleNames() const; 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski /// same as the wrapper implementation but static 164*b1cdbd2cSJim Jagielski static ::com::sun::star::uno::Sequence< ::com::sun::star::lang::Locale > getInstalledLocaleNames(); 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski /** Get LanguageTypes for all installed locales which are unambiguous 167*b1cdbd2cSJim Jagielski convertible back and forth between locale ISO strings and MS-LCID 168*b1cdbd2cSJim Jagielski LanguageType. Upon the first time the function is called when 169*b1cdbd2cSJim Jagielski locale data checking is enabled, messages are shown for locales not 170*b1cdbd2cSJim Jagielski matching, excluding already known problems. 171*b1cdbd2cSJim Jagielski (e.g. used in number formatter dialog init) 172*b1cdbd2cSJim Jagielski */ 173*b1cdbd2cSJim Jagielski static ::com::sun::star::uno::Sequence< sal_uInt16 > getInstalledLanguageTypes(); 174*b1cdbd2cSJim Jagielski 175*b1cdbd2cSJim Jagielski /// maps the LocaleData string to the International enum 176*b1cdbd2cSJim Jagielski MeasurementSystem mapMeasurementStringToEnum( const String& rMS ) const; 177*b1cdbd2cSJim Jagielski 178*b1cdbd2cSJim Jagielski /// Convenience method to obtain the default calendar. 179*b1cdbd2cSJim Jagielski const ::boost::shared_ptr< ::com::sun::star::i18n::Calendar > getDefaultCalendar() const; 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski /// Convenience method to obtain the day names of the default calendar. 182*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::CalendarItem > getDefaultCalendarDays() const; 183*b1cdbd2cSJim Jagielski 184*b1cdbd2cSJim Jagielski /// Convenience method to obtain the month names of the default calendar. 185*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::CalendarItem > getDefaultCalendarMonths() const; 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski /** Obtain digit grouping. The usually known grouping by thousands (#,###) 188*b1cdbd2cSJim Jagielski is actually only one of possible groupings. Another one, for example, 189*b1cdbd2cSJim Jagielski used in India is group by 3 and then by 2 indefinitely (#,##,###). The 190*b1cdbd2cSJim Jagielski integer sequence returned here specifies grouping from right to left 191*b1cdbd2cSJim Jagielski (!), with a 0 entry designating the end of rules and the previous value 192*b1cdbd2cSJim Jagielski to be repeated indefinitely. Hence the sequence {3,0} specifies the 193*b1cdbd2cSJim Jagielski usual grouping by thousands, whereas the sequence {3,2,0} specifies 194*b1cdbd2cSJim Jagielski Indian grouping. The sal_Int32* getConstArray() can be passed directly 195*b1cdbd2cSJim Jagielski to the ::rtl::math::doubleToString() methods as argument for the 196*b1cdbd2cSJim Jagielski pGroups parameter. */ 197*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Sequence< sal_Int32 > getDigitGrouping() const; 198*b1cdbd2cSJim Jagielski 199*b1cdbd2cSJim Jagielski // Functionality of class International methods, LocaleItem 200*b1cdbd2cSJim Jagielski getDateSep() const201*b1cdbd2cSJim Jagielski inline const String& getDateSep() const 202*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DATE_SEPARATOR ); } getNumThousandSep() const203*b1cdbd2cSJim Jagielski inline const String& getNumThousandSep() const 204*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::THOUSAND_SEPARATOR ); } getNumDecimalSep() const205*b1cdbd2cSJim Jagielski inline const String& getNumDecimalSep() const 206*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DECIMAL_SEPARATOR ); } getTimeSep() const207*b1cdbd2cSJim Jagielski inline const String& getTimeSep() const 208*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_SEPARATOR ); } getTime100SecSep() const209*b1cdbd2cSJim Jagielski inline const String& getTime100SecSep() const 210*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_100SEC_SEPARATOR ); } getListSep() const211*b1cdbd2cSJim Jagielski inline const String& getListSep() const 212*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LIST_SEPARATOR ); } getQuotationMarkStart() const213*b1cdbd2cSJim Jagielski inline const String& getQuotationMarkStart() const 214*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::SINGLE_QUOTATION_START ); } getQuotationMarkEnd() const215*b1cdbd2cSJim Jagielski inline const String& getQuotationMarkEnd() const 216*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::SINGLE_QUOTATION_END ); } getDoubleQuotationMarkStart() const217*b1cdbd2cSJim Jagielski inline const String& getDoubleQuotationMarkStart() const 218*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DOUBLE_QUOTATION_START ); } getDoubleQuotationMarkEnd() const219*b1cdbd2cSJim Jagielski inline const String& getDoubleQuotationMarkEnd() const 220*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DOUBLE_QUOTATION_END ); } getMeasurementSystem() const221*b1cdbd2cSJim Jagielski inline const String& getMeasurementSystem() const 222*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::MEASUREMENT_SYSTEM ); } getMeasurementSystemEnum() const223*b1cdbd2cSJim Jagielski inline MeasurementSystem getMeasurementSystemEnum() const 224*b1cdbd2cSJim Jagielski { return mapMeasurementStringToEnum( getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::MEASUREMENT_SYSTEM ) ); } getTimeAM() const225*b1cdbd2cSJim Jagielski inline const String& getTimeAM() const 226*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_AM ); } getTimePM() const227*b1cdbd2cSJim Jagielski inline const String& getTimePM() const 228*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_PM ); } getLongDateDayOfWeekSep() const229*b1cdbd2cSJim Jagielski inline const String& getLongDateDayOfWeekSep() const 230*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_DAY_OF_WEEK_SEPARATOR ); } getLongDateDaySep() const231*b1cdbd2cSJim Jagielski inline const String& getLongDateDaySep() const 232*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_DAY_SEPARATOR ); } getLongDateMonthSep() const233*b1cdbd2cSJim Jagielski inline const String& getLongDateMonthSep() const 234*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_MONTH_SEPARATOR ); } getLongDateYearSep() const235*b1cdbd2cSJim Jagielski inline const String& getLongDateYearSep() const 236*b1cdbd2cSJim Jagielski { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_YEAR_SEPARATOR ); } 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski // currency 239*b1cdbd2cSJim Jagielski const String& getCurrSymbol() const; 240*b1cdbd2cSJim Jagielski const String& getCurrBankSymbol() const; 241*b1cdbd2cSJim Jagielski sal_uInt16 getCurrPositiveFormat() const; 242*b1cdbd2cSJim Jagielski sal_uInt16 getCurrNegativeFormat() const; 243*b1cdbd2cSJim Jagielski sal_uInt16 getCurrDigits() const; 244*b1cdbd2cSJim Jagielski 245*b1cdbd2cSJim Jagielski // simple date and time formatting 246*b1cdbd2cSJim Jagielski DateFormat getDateFormat() const; 247*b1cdbd2cSJim Jagielski DateFormat getLongDateFormat() const; 248*b1cdbd2cSJim Jagielski /// only numerical values of Gregorian calendar 249*b1cdbd2cSJim Jagielski String getDate( const Date& rDate ) const; 250*b1cdbd2cSJim Jagielski String getTime( const Time& rTime, sal_Bool bSec = sal_True, 251*b1cdbd2cSJim Jagielski sal_Bool b100Sec = sal_False ) const; 252*b1cdbd2cSJim Jagielski String getDuration( const Time& rTime, 253*b1cdbd2cSJim Jagielski sal_Bool bSec = sal_True, sal_Bool b100Sec = sal_False ) const; 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski /** The CalendarWrapper already <b>MUST</b> 256*b1cdbd2cSJim Jagielski have loaded a calendar. 257*b1cdbd2cSJim Jagielski @param nDisplayDayOfWeek 258*b1cdbd2cSJim Jagielski 0 := abbreviated name 259*b1cdbd2cSJim Jagielski 1 := full name 260*b1cdbd2cSJim Jagielski @param bDayOfMonthWithLeadingZero 261*b1cdbd2cSJim Jagielski <FALSE/> := without leading zero 262*b1cdbd2cSJim Jagielski <TRUE/> := with leading zero if <10 263*b1cdbd2cSJim Jagielski @param nDisplayMonth 264*b1cdbd2cSJim Jagielski 0 := abbreviated name 265*b1cdbd2cSJim Jagielski 1 := full name 266*b1cdbd2cSJim Jagielski @param bTwoDigitYear 267*b1cdbd2cSJim Jagielski <FALSE/> := full year 268*b1cdbd2cSJim Jagielski <TRUE/> := year % 100 269*b1cdbd2cSJim Jagielski */ 270*b1cdbd2cSJim Jagielski String getLongDate( const Date& rDate, 271*b1cdbd2cSJim Jagielski CalendarWrapper& rCal, 272*b1cdbd2cSJim Jagielski sal_Int16 nDisplayDayOfWeek = 1, 273*b1cdbd2cSJim Jagielski sal_Bool bDayOfMonthWithLeadingZero = sal_False, 274*b1cdbd2cSJim Jagielski sal_Int16 nDisplayMonth = 1, 275*b1cdbd2cSJim Jagielski sal_Bool bTwoDigitYear = sal_False 276*b1cdbd2cSJim Jagielski ) const; 277*b1cdbd2cSJim Jagielski 278*b1cdbd2cSJim Jagielski /** Simple number formatting 279*b1cdbd2cSJim Jagielski @param nNumber 280*b1cdbd2cSJim Jagielski value * 10**nDecimals 281*b1cdbd2cSJim Jagielski @param bTrailingZeros 282*b1cdbd2cSJim Jagielski </sal_True> := always display trailing zeros in 283*b1cdbd2cSJim Jagielski decimal places, even if integer value. 284*b1cdbd2cSJim Jagielski </sal_False> := trailing zeros are only displayed 285*b1cdbd2cSJim Jagielski if the value is not an integer value. 286*b1cdbd2cSJim Jagielski */ 287*b1cdbd2cSJim Jagielski String getNum( sal_Int64 nNumber, sal_uInt16 nDecimals, 288*b1cdbd2cSJim Jagielski sal_Bool bUseThousandSep = sal_True, 289*b1cdbd2cSJim Jagielski sal_Bool bTrailingZeros = sal_True ) const; 290*b1cdbd2cSJim Jagielski 291*b1cdbd2cSJim Jagielski /// "Secure" currency formatted string. 292*b1cdbd2cSJim Jagielski String getCurr( sal_Int64 nNumber, sal_uInt16 nDecimals, 293*b1cdbd2cSJim Jagielski const String& rCurrencySymbol, 294*b1cdbd2cSJim Jagielski sal_Bool bUseThousandSep = sal_True ) const; 295*b1cdbd2cSJim Jagielski /** Default currency formatted string, use with 296*b1cdbd2cSJim Jagielski care as default currency may change in any 297*b1cdbd2cSJim Jagielski locale, for example, DEM -> EUR */ getCurr(sal_Int64 nNumber,sal_uInt16 nDecimals,sal_Bool bUseThousandSep=sal_True) const298*b1cdbd2cSJim Jagielski String getCurr( sal_Int64 nNumber, sal_uInt16 nDecimals, 299*b1cdbd2cSJim Jagielski sal_Bool bUseThousandSep = sal_True ) const 300*b1cdbd2cSJim Jagielski { return getCurr( nNumber, nDecimals, 301*b1cdbd2cSJim Jagielski getCurrSymbol(), bUseThousandSep ); } 302*b1cdbd2cSJim Jagielski 303*b1cdbd2cSJim Jagielski // dummy returns, to be implemented getCurrZeroChar() const304*b1cdbd2cSJim Jagielski inline sal_Unicode getCurrZeroChar() const 305*b1cdbd2cSJim Jagielski { return cCurrZeroChar; } isNumLeadingZero() const306*b1cdbd2cSJim Jagielski inline sal_Bool isNumLeadingZero() const 307*b1cdbd2cSJim Jagielski { return sal_True; } 308*b1cdbd2cSJim Jagielski /// standard decimal places getNumDigits() const309*b1cdbd2cSJim Jagielski inline sal_uInt16 getNumDigits() const 310*b1cdbd2cSJim Jagielski { return 2; } isNumTrailingZeros() const311*b1cdbd2cSJim Jagielski inline sal_Bool isNumTrailingZeros() const 312*b1cdbd2cSJim Jagielski { return sal_True; } 313*b1cdbd2cSJim Jagielski 314*b1cdbd2cSJim Jagielski 315*b1cdbd2cSJim Jagielski // reserved words 316*b1cdbd2cSJim Jagielski getTrueWord() const317*b1cdbd2cSJim Jagielski inline const String& getTrueWord() const 318*b1cdbd2cSJim Jagielski { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::TRUE_WORD ); } getFalseWord() const319*b1cdbd2cSJim Jagielski inline const String& getFalseWord() const 320*b1cdbd2cSJim Jagielski { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::FALSE_WORD ); } 321*b1cdbd2cSJim Jagielski /// return a quarter string matching nQuarter (0..3) => "1st quarter" .. "4th quarter" getQuarterWord(sal_Int16 nQuarter) const322*b1cdbd2cSJim Jagielski inline const String& getQuarterWord( sal_Int16 nQuarter ) const 323*b1cdbd2cSJim Jagielski { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::QUARTER1_WORD + nQuarter ); } getAboveWord() const324*b1cdbd2cSJim Jagielski inline const String& getAboveWord() const 325*b1cdbd2cSJim Jagielski { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::ABOVE_WORD ); } getBelowWord() const326*b1cdbd2cSJim Jagielski inline const String& getBelowWord() const 327*b1cdbd2cSJim Jagielski { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::BELOW_WORD ); } 328*b1cdbd2cSJim Jagielski /// return a quarter abbreviation string matching nQuarter (0..3) => "Q1" .. "Q2" getQuarterAbbreviation(sal_Int16 nQuarter) const329*b1cdbd2cSJim Jagielski inline const String& getQuarterAbbreviation( sal_Int16 nQuarter ) const 330*b1cdbd2cSJim Jagielski { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::QUARTER1_ABBREVIATION + nQuarter ); } 331*b1cdbd2cSJim Jagielski 332*b1cdbd2cSJim Jagielski /** Return whether locale data checks are enabled. 333*b1cdbd2cSJim Jagielski Checks are enabled if the environment variable 334*b1cdbd2cSJim Jagielski OOO_ENABLE_LOCALE_DATA_CHECKS is set to 'Y' or 'Yes' (or any other 335*b1cdbd2cSJim Jagielski string starting with 'Y') or '1'. 336*b1cdbd2cSJim Jagielski Also used in conjunction with the number formatter. */ areChecksEnabled()337*b1cdbd2cSJim Jagielski static inline bool areChecksEnabled() 338*b1cdbd2cSJim Jagielski { 339*b1cdbd2cSJim Jagielski if (nLocaleDataChecking == 0) 340*b1cdbd2cSJim Jagielski evaluateLocaleDataChecking(); 341*b1cdbd2cSJim Jagielski return nLocaleDataChecking == 1; 342*b1cdbd2cSJim Jagielski } 343*b1cdbd2cSJim Jagielski 344*b1cdbd2cSJim Jagielski /** Append locale info to string, used with locale data checking. 345*b1cdbd2cSJim Jagielski A string similar to "de_DE requested\n en_US loaded" is appended. */ 346*b1cdbd2cSJim Jagielski String& appendLocaleInfo( String& rDebugMsg ) const; 347*b1cdbd2cSJim Jagielski 348*b1cdbd2cSJim Jagielski /** Ouput a message during locale data checking. The (UTF-8) string is 349*b1cdbd2cSJim Jagielski written to stderr and in a non-product build or if DBG_UTIL is enabled 350*b1cdbd2cSJim Jagielski also raised as an assertion message box. */ 351*b1cdbd2cSJim Jagielski static void outputCheckMessage( const String& rMsg ); 352*b1cdbd2cSJim Jagielski static void outputCheckMessage( const char* pStr); 353*b1cdbd2cSJim Jagielski 354*b1cdbd2cSJim Jagielski private: 355*b1cdbd2cSJim Jagielski static void evaluateLocaleDataChecking(); 356*b1cdbd2cSJim Jagielski }; 357*b1cdbd2cSJim Jagielski 358*b1cdbd2cSJim Jagielski 359*b1cdbd2cSJim Jagielski #endif // _UNOTOOLS_LOCALEDATAWRAPPER_HXX 360