1/*
2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1.  Redistributions of source code must retain the above copyright
8 *     notice, this list of conditions and the following disclaimer.
9 * 2.  Redistributions in binary form must reproduce the above copyright
10 *     notice, this list of conditions and the following disclaimer in the
11 *     documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
23 * DAMAGE.
24 */
25
26#ifndef PlatformLocale_h
27#define PlatformLocale_h
28
29#include "DateComponents.h"
30#include "Language.h"
31#include <wtf/PassOwnPtr.h>
32#include <wtf/text/WTFString.h>
33
34namespace WebCore {
35
36class Locale {
37    WTF_MAKE_NONCOPYABLE(Locale);
38
39public:
40    static PassOwnPtr<Locale> create(const AtomicString& localeIdentifier);
41    static PassOwnPtr<Locale> createDefault();
42
43    // Converts the specified number string to another number string localized
44    // for this Locale locale. The input string must conform to HTML
45    // floating-point numbers, and is not empty.
46    String convertToLocalizedNumber(const String&);
47
48    // Converts the specified localized number string to a number string in the
49    // HTML floating-point number format. The input string is provided by a end
50    // user, and might not be a number string. It's ok that the function returns
51    // a string which is not conforms to the HTML floating-point number format,
52    // callers of this function are responsible to check the format of the
53    // resultant string.
54    String convertFromLocalizedNumber(const String&);
55
56#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
57    // Returns date format in Unicode TR35 LDML[1] containing day of month,
58    // month, and year, e.g. "dd/mm/yyyy"
59    // [1] LDML http://unicode.org/reports/tr35/#Date_Format_Patterns
60    virtual String dateFormat() = 0;
61
62    // Returns a year-month format in Unicode TR35 LDML.
63    virtual String monthFormat() = 0;
64
65    // Returns a year-month format using short month lanel in Unicode TR35 LDML.
66    virtual String shortMonthFormat() = 0;
67
68    // Returns time format in Unicode TR35 LDML[1] containing hour, minute, and
69    // second with optional period(AM/PM), e.g. "h:mm:ss a"
70    // [1] LDML http://unicode.org/reports/tr35/#Date_Format_Patterns
71    virtual String timeFormat() = 0;
72
73    // Returns time format in Unicode TR35 LDML containing hour, and minute
74    // with optional period(AM/PM), e.g. "h:mm a"
75    // Note: Some platforms return same value as timeFormat().
76    virtual String shortTimeFormat() = 0;
77
78    // Returns a date-time format in Unicode TR35 LDML. It should have a seconds
79    // field.
80    virtual String dateTimeFormatWithSeconds() = 0;
81
82    // Returns a date-time format in Unicode TR35 LDML. It should have no seconds
83    // field.
84    virtual String dateTimeFormatWithoutSeconds() = 0;
85
86    // Returns a vector of string of which size is 12. The first item is a
87    // localized string of Jan and the last item is a localized string of
88    // Dec. These strings should be short.
89    virtual const Vector<String>& shortMonthLabels() = 0;
90
91    // Returns a vector of string of which size is 12. The first item is a
92    // stand-alone localized string of January and the last item is a
93    // stand-alone localized string of December. These strings should not be
94    // abbreviations.
95    virtual const Vector<String>& standAloneMonthLabels() = 0;
96
97    // Stand-alone month version of shortMonthLabels.
98    virtual const Vector<String>& shortStandAloneMonthLabels() = 0;
99
100    // Returns localized period field(AM/PM) strings.
101    virtual const Vector<String>& timeAMPMLabels() = 0;
102
103    // Returns a vector of string of which size is 12. The first item is a
104    // localized string of January, and the last item is a localized string of
105    // December. These strings should not be abbreviations.
106    virtual const Vector<String>& monthLabels() = 0;
107#endif
108
109#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
110    enum FormatType { FormatTypeUnspecified, FormatTypeShort, FormatTypeMedium };
111
112    // Serializes the specified date into a formatted date string to
113    // display to the user. If an implementation doesn't support
114    // localized dates the function should return an empty string.
115    // FormatType can be used to specify if you want the short format.
116    String formatDateTime(const DateComponents&, FormatType = FormatTypeUnspecified);
117#endif
118
119    virtual ~Locale();
120
121protected:
122    enum {
123        // 0-9 for digits.
124        DecimalSeparatorIndex = 10,
125        GroupSeparatorIndex = 11,
126        DecimalSymbolsSize
127    };
128
129    Locale() : m_hasLocaleData(false) { }
130    virtual void initializeLocaleData() = 0;
131    void setLocaleData(const Vector<String, DecimalSymbolsSize>&, const String& positivePrefix, const String& positiveSuffix, const String& negativePrefix, const String& negativeSuffix);
132
133private:
134    bool detectSignAndGetDigitRange(const String& input, bool& isNegative, unsigned& startIndex, unsigned& endIndex);
135    unsigned matchedDecimalSymbolIndex(const String& input, unsigned& position);
136
137    String m_decimalSymbols[DecimalSymbolsSize];
138    String m_positivePrefix;
139    String m_positiveSuffix;
140    String m_negativePrefix;
141    String m_negativeSuffix;
142    bool m_hasLocaleData;
143};
144
145inline PassOwnPtr<Locale> Locale::createDefault()
146{
147    return Locale::create(defaultLanguage());
148}
149
150}
151#endif
152