LibreOffice Module unotools (master) 1
localedatawrapper.hxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#ifndef INCLUDED_UNOTOOLS_LOCALEDATAWRAPPER_HXX
21#define INCLUDED_UNOTOOLS_LOCALEDATAWRAPPER_HXX
22
23#include <com/sun/star/uno/Reference.hxx>
24#include <com/sun/star/uno/Sequence.hxx>
25#include <com/sun/star/i18n/LocaleItem.hpp>
26#include <com/sun/star/i18n/LocaleDataItem2.hpp>
27#include <com/sun/star/i18n/LanguageCountryInfo.hpp>
28#include <com/sun/star/i18n/ForbiddenCharacters.hpp>
29#include <com/sun/star/i18n/reservedWords.hpp>
30#include <rtl/ustring.hxx>
31#include <rtl/math.h>
34#include <memory>
35#include <string_view>
36
37namespace com::sun::star::uno { class XComponentContext; }
38namespace com::sun::star::i18n { class XLocaleData5; }
39namespace com::sun::star::i18n { struct Calendar2; }
40namespace com::sun::star::i18n { struct Currency2; }
41namespace com::sun::star::i18n { struct FormatElement; }
42namespace com::sun::star::i18n { struct CalendarItem2; }
43
44class Date;
45namespace tools
46{
47class Time;
48class Duration;
49}
50class CalendarWrapper;
51
52enum class DateOrder {
53 Invalid = -1,
54 MDY = 0,
55 DMY,
56 YMD,
57};
58
59enum class LongDateOrder {
60 Invalid = -1,
61 MDY = 0,
62 DMY,
63 YMD,
64 YDM
65};
66
68 Metric,
69 US
70};
71
77{
78 static sal_uInt8 nLocaleDataChecking; // 0:=dontknow, 1:=yes, 2:=no
79
80 css::uno::Reference< css::uno::XComponentContext > m_xContext;
81 css::uno::Reference< css::i18n::XLocaleData5 > xLD;
83 std::shared_ptr< css::i18n::Calendar2 > xDefaultCalendar;
84 std::shared_ptr< css::i18n::Calendar2 > xSecondaryCalendar;
85 css::i18n::LocaleDataItem2 aLocaleDataItem;
86 css::uno::Sequence< OUString > aDateAcceptancePatterns;
87 css::uno::Sequence< sal_Int32 > aGrouping;
88 // cached items
89 OUString aLocaleItem[css::i18n::LocaleItem::COUNT2];
90 std::vector<OUString> aReservedWords;
91 OUString aCurrSymbol;
97 sal_uInt16 nCurrDigits;
98
99 void loadData();
100 void loadDateAcceptancePatterns(const std::vector<OUString> & rOverrideDateAcceptancePatterns);
101
102 const OUString& getOneLocaleItem( sal_Int16 nItem ) const;
103
104 const OUString& getOneReservedWord( sal_Int16 nWord ) const;
105
106 void loadCurrencyFormats();
107
108 void scanCurrFormatImpl( std::u16string_view rCode,
109 sal_Int32 nStart, sal_Int32& nSign,
110 sal_Int32& nPar, sal_Int32& nNum,
111 sal_Int32& nBlank, sal_Int32& nSym ) const;
112
113 void loadDateOrders();
114 LongDateOrder scanDateOrderImpl( std::u16string_view rCode ) const;
115
116 void ImplAddFormatNum( rtl::OUStringBuffer& rBuf,
117 sal_Int64 nNumber, sal_uInt16 nDecimals,
118 bool bUseThousandSep, bool bTrailingZeros ) const;
119
120 void loadDigitGrouping();
121
122public:
124 const css::uno::Reference< css::uno::XComponentContext > & rxContext,
125 LanguageTag aLanguageTag
126 );
132 LanguageTag aLanguageTag,
133 const std::vector<OUString> & rOverrideDateAcceptancePatterns = {}
134 );
136
142 const css::uno::Reference<
143 css::uno::XComponentContext > & getComponentContext()
144 const { return m_xContext; }
145
147 const LanguageTag& getLanguageTag() const;
148
150 LanguageTag getLoadedLanguageTag() const;
151
152 // Wrapper implementations of service LocaleData
153
154 css::i18n::LanguageCountryInfo getLanguageCountryInfo() const;
156 const css::i18n::LocaleDataItem2& getLocaleItem() const;
158 css::uno::Sequence< css::i18n::Calendar2 > getAllCalendars() const;
160 css::uno::Sequence< css::i18n::Currency2 > getAllCurrencies() const;
161 css::uno::Sequence< css::i18n::FormatElement > getAllFormats() const;
162 css::i18n::ForbiddenCharacters getForbiddenCharacters() const;
163 const css::uno::Sequence< css::lang::Locale > & getAllInstalledLocaleNames() const;
164 const css::uno::Sequence< OUString > & getDateAcceptancePatterns() const;
165
166
168 static const css::uno::Sequence< css::lang::Locale > & getInstalledLocaleNames();
169
177 static const std::vector< LanguageType > & getInstalledLanguageTypes();
178
180 MeasurementSystem mapMeasurementStringToEnum( std::u16string_view rMS ) const;
181
183 const std::shared_ptr< css::i18n::Calendar2 >& getDefaultCalendar() const;
184
186 css::uno::Sequence< css::i18n::CalendarItem2 > const & getDefaultCalendarDays() const;
187
189 css::uno::Sequence< css::i18n::CalendarItem2 > const & getDefaultCalendarMonths() const;
190
193 bool doesSecondaryCalendarUseEC( std::u16string_view rName ) const;
194
205 const css::uno::Sequence< sal_Int32 >& getDigitGrouping() const;
206
207 // Functionality of class International methods, LocaleItem
208
209 const OUString& getDateSep() const
210 { return getOneLocaleItem( css::i18n::LocaleItem::DATE_SEPARATOR ); }
211 const OUString& getNumThousandSep() const
212 { return getOneLocaleItem( css::i18n::LocaleItem::THOUSAND_SEPARATOR ); }
213 const OUString& getNumDecimalSep() const
214 { return getOneLocaleItem( css::i18n::LocaleItem::DECIMAL_SEPARATOR ); }
215 const OUString& getNumDecimalSepAlt() const
216 { return getOneLocaleItem( css::i18n::LocaleItem::DECIMAL_SEPARATOR_ALTERNATIVE ); }
217 const OUString& getTimeSep() const
218 { return getOneLocaleItem( css::i18n::LocaleItem::TIME_SEPARATOR ); }
219 const OUString& getTime100SecSep() const
220 { return getOneLocaleItem( css::i18n::LocaleItem::TIME_100SEC_SEPARATOR ); }
221 const OUString& getListSep() const
222 { return getOneLocaleItem( css::i18n::LocaleItem::LIST_SEPARATOR ); }
223 const OUString& getQuotationMarkStart() const
224 { return getOneLocaleItem( css::i18n::LocaleItem::SINGLE_QUOTATION_START ); }
225 const OUString& getQuotationMarkEnd() const
226 { return getOneLocaleItem( css::i18n::LocaleItem::SINGLE_QUOTATION_END ); }
227 const OUString& getDoubleQuotationMarkStart() const
228 { return getOneLocaleItem( css::i18n::LocaleItem::DOUBLE_QUOTATION_START ); }
229 const OUString& getDoubleQuotationMarkEnd() const
230 { return getOneLocaleItem( css::i18n::LocaleItem::DOUBLE_QUOTATION_END ); }
232 { return mapMeasurementStringToEnum( getOneLocaleItem( css::i18n::LocaleItem::MEASUREMENT_SYSTEM ) ); }
233 const OUString& getTimeAM() const
234 { return getOneLocaleItem( css::i18n::LocaleItem::TIME_AM ); }
235 const OUString& getTimePM() const
236 { return getOneLocaleItem( css::i18n::LocaleItem::TIME_PM ); }
237 const OUString& getLongDateDayOfWeekSep() const
238 { return getOneLocaleItem( css::i18n::LocaleItem::LONG_DATE_DAY_OF_WEEK_SEPARATOR ); }
239 const OUString& getLongDateDaySep() const
240 { return getOneLocaleItem( css::i18n::LocaleItem::LONG_DATE_DAY_SEPARATOR ); }
241 const OUString& getLongDateMonthSep() const
242 { return getOneLocaleItem( css::i18n::LocaleItem::LONG_DATE_MONTH_SEPARATOR ); }
243 const OUString& getLongDateYearSep() const
244 { return getOneLocaleItem( css::i18n::LocaleItem::LONG_DATE_YEAR_SEPARATOR ); }
245
271 double stringToDouble( std::u16string_view aString, bool bUseGroupSep,
272 rtl_math_ConversionStatus* pStatus, sal_Int32* pParseEnd ) const;
273
301 double stringToDouble( const sal_Unicode* pBegin, const sal_Unicode* pEnd, bool bUseGroupSep,
302 rtl_math_ConversionStatus* pStatus, const sal_Unicode** ppParseEnd ) const;
303
304 // currency
305 const OUString& getCurrSymbol() const;
306 const OUString& getCurrBankSymbol() const;
307 sal_uInt16 getCurrPositiveFormat() const;
308 sal_uInt16 getCurrNegativeFormat() const;
309 sal_uInt16 getCurrDigits() const;
310
311 // simple date and time formatting
312 DateOrder getDateOrder() const;
313 LongDateOrder getLongDateOrder() const;
315 OUString getDate( const Date& rDate ) const;
316 OUString getTime( const tools::Time& rTime, bool bSec = true,
317 bool b100Sec = false ) const;
318 OUString getDuration( const tools::Duration& rDuration,
319 bool bSec = true, bool b100Sec = false ) const;
320
330 OUString getNum( sal_Int64 nNumber, sal_uInt16 nDecimals,
331 bool bUseThousandSep = true,
332 bool bTrailingZeros = true ) const;
333
335 OUString getCurr( sal_Int64 nNumber, sal_uInt16 nDecimals,
336 std::u16string_view rCurrencySymbol,
337 bool bUseThousandSep = true ) const;
338
339 // dummy returns, to be implemented
341 { return '0'; }
342 static bool isNumLeadingZero()
343 { return true; }
345 static sal_uInt16 getNumDigits()
346 { return 2; }
347 static bool isNumTrailingZeros()
348 { return true; }
349
350 // reserved words
351
352 const OUString& getTrueWord() const
353 { return getOneReservedWord( css::i18n::reservedWords::TRUE_WORD ); }
354 const OUString& getFalseWord() const
355 { return getOneReservedWord( css::i18n::reservedWords::FALSE_WORD ); }
356 const OUString& getAboveWord() const
357 { return getOneReservedWord( css::i18n::reservedWords::ABOVE_WORD ); }
358 const OUString& getBelowWord() const
359 { return getOneReservedWord( css::i18n::reservedWords::BELOW_WORD ); }
361 const OUString& getQuarterAbbreviation( sal_Int16 nQuarter ) const
362 { return getOneReservedWord( css::i18n::reservedWords::QUARTER1_ABBREVIATION + nQuarter ); }
363
369 static bool areChecksEnabled()
370 {
371 if (nLocaleDataChecking == 0)
372 evaluateLocaleDataChecking();
373 return nLocaleDataChecking == 1;
374 }
375
378 OUString appendLocaleInfo(std::u16string_view rDebugMsg) const;
379
383 static void outputCheckMessage( std::u16string_view rMsg );
384 static void outputCheckMessage( const char* pStr);
385
388
389private:
390
391 const css::lang::Locale & getMyLocale() const;
392
393 static void evaluateLocaleDataChecking();
394};
395
396#endif // INCLUDED_UNOTOOLS_LOCALEDATAWRAPPER_HXX
397
398/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Reference< XComponentContext > m_xContext
This class can be accessed without locking because we load all of the data in the constructor.
const OUString & getLongDateMonthSep() const
const OUString & getDateSep() const
const OUString & getTime100SecSep() const
sal_Unicode getCurrZeroChar() const
const OUString & getTimeSep() const
const OUString & getDoubleQuotationMarkStart() const
const css::uno::Reference< css::uno::XComponentContext > & getComponentContext() const
Get the service factory, meant to be able to create a CalendarWrapper from a LocaleDataWrapper.
const OUString & getBelowWord() const
static sal_uInt8 nLocaleDataChecking
const OUString & getTimeAM() const
const OUString & getNumThousandSep() const
const OUString & getFalseWord() const
std::vector< OUString > aReservedWords
LocaleDataWrapper(const css::uno::Reference< css::uno::XComponentContext > &rxContext, LanguageTag aLanguageTag)
static bool isNumTrailingZeros()
const OUString & getListSep() const
const OUString & getLongDateYearSep() const
const OUString & getNumDecimalSepAlt() const
const OUString & getQuarterAbbreviation(sal_Int16 nQuarter) const
return a quarter abbreviation string matching nQuarter (0..3) => "Q1" .. "Q2"
MeasurementSystem getMeasurementSystemEnum() const
const OUString & getLongDateDaySep() const
css::uno::Sequence< sal_Int32 > aGrouping
LongDateOrder nLongDateOrder
const OUString & getQuotationMarkStart() const
sal_uInt16 nCurrPositiveFormat
const OUString & getAboveWord() const
const OUString & getTimePM() const
LocaleDataWrapper(const LocaleDataWrapper &)=delete
LocaleDataWrapper & operator=(const LocaleDataWrapper &)=delete
const OUString & getDoubleQuotationMarkEnd() const
const OUString & getTrueWord() const
const OUString & getNumDecimalSep() const
static bool areChecksEnabled()
Return whether locale data checks are enabled.
css::i18n::LocaleDataItem2 aLocaleDataItem
static sal_uInt16 getNumDigits()
standard decimal places
static bool isNumLeadingZero()
const OUString & getQuotationMarkEnd() const
css::uno::Reference< css::uno::XComponentContext > m_xContext
sal_uInt16 nCurrNegativeFormat
css::uno::Sequence< OUString > aDateAcceptancePatterns
std::shared_ptr< css::i18n::Calendar2 > xSecondaryCalendar
std::shared_ptr< css::i18n::Calendar2 > xDefaultCalendar
css::uno::Reference< css::i18n::XLocaleData5 > xLD
const OUString & getLongDateDayOfWeekSep() const
MeasurementSystem
LongDateOrder
const LanguageTag & getLanguageTag()
unsigned char sal_uInt8
sal_uInt16 sal_Unicode
#define UNOTOOLS_DLLPUBLIC