1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef LOCINFO_H
17#define LOCINFO_H
18
19/**
20* @addtogroup I18N
21* @{
22*
23* @brief Provides functions related to internationalization (i18n), with which you can format date, time and numbers.
24*
25* @since 2.2
26* @version 1.0
27*/
28
29/**
30* @file locale_info.h
31*
32* @brief Declares functions for obtaining locale information, including language, script, and country/region.
33*
34* Example code: \n
35* Creating a <b>LocaleInfo</b> instance: \n
36*      {@code LocaleInfo locale("zh", "Hans", "CN");}
37* Obtaining the language: \n
38*      {@code const char *language = locale.GetLanguage();}
39* Output: \n
40*     zh
41*
42* @since 2.2
43* @version 1.0
44*/
45
46#include <cstdint>
47#include "types.h"
48
49namespace OHOS {
50namespace I18N {
51class LocaleInfo {
52public:
53    /**
54    * @brief A constructor used to create a <b>LocaleInfo</b> instance with specified language,
55    *   script, and country/region.
56    *
57    * @param lang Indicates the pointer to the specified language.
58    * @param script Indicates the pointer to the specified script.
59    * @param region Indicates the pointer to the specified country/region.
60    * @since 2.2
61    * @version 1.0
62    */
63    LocaleInfo(const char *lang, const char *script, const char *region);
64
65    /**
66    * @brief A constructor used to create a <b>LocaleInfo</b> instance with specified language and country/region.
67    *
68    * @param lang Indicates the pointer to the specified language.
69    * @param region Indicates the pointer to the specified country/region.
70    * @since 2.2
71    * @version 1.0
72    */
73    LocaleInfo(const char *lang, const char *region);
74
75    /**
76    * @brief A constructor used to create a <b>LocaleInfo</b> instance by copying a specified one.
77    *
78    * @param locale Indicates the specified <b>LocaleInfo</b> instance.
79    * @since 2.2
80    * @version 1.0
81    */
82    LocaleInfo(const LocaleInfo& locale);
83
84    /**
85    * @brief Default constructor used to create a <b>LocaleInfo</b> instance.
86    *
87    * @since 2.2
88    * @version 1.0
89    */
90    LocaleInfo();
91
92    /**
93    * @brief A destructor used to delete the <b>LocaleInfo</b> instance.
94    *
95    * @since 2.2
96    * @version 1.0
97    */
98    virtual ~LocaleInfo();
99
100    /**
101    * @brief Checks whether this <b>LocaleInfo</b> object equals a specified one.
102    *
103    * @param other Indicates the <b>LocaleInfo</b> object to compare.
104    * @return Returns <b>true</b> if the two objects are equal; returns <b>false</b> otherwise.
105    * @since 2.2
106    * @version 1.0
107    */
108    virtual bool operator ==(const LocaleInfo &other) const;
109
110    /**
111    * @brief Creates a new <b>LocaleInfo</b> object based on a specified one.
112    *
113    * @param other Indicates the specified <b>LocaleInfo</b> object.
114    * @return Returns the new <b>LocaleInfo</b> object.
115    * @since 2.2
116    * @version 1.0
117    */
118    virtual LocaleInfo &operator =(const LocaleInfo &other);
119
120    /**
121    * @brief Obtains the ID of this <b>LocaleInfo</b> object, which consists of the language,
122    *   script, and country/region.
123    *
124    * @return Returns the ID.
125    * @since 2.2
126    * @version 1.0
127    */
128    const char *GetId() const;
129
130    /**
131    * @brief Obtains the language specified in this <b>LocaleInfo</b> object.
132    *
133    * @return Returns the language.
134    * @since 2.2
135    * @version 1.0
136    */
137    const char *GetLanguage() const;
138
139    /**
140    * @brief Obtains the script specified in this <b>LocaleInfo</b> object.
141    *
142    * @return Returns the script.
143    * @since 2.2
144    * @version 1.0
145    */
146    const char *GetScript() const;
147
148    /**
149    * @brief Obtains the country/region specified in this <b>LocaleInfo</b> object.
150    *
151    * @return Returns the country/region.
152    * @since 2.2
153    * @version 1.0
154    */
155    const char *GetRegion() const;
156
157    /**
158    * @brief Obtains the mask of this <b>LocaleInfo</b> object.
159    *
160    * @return Returns the mask.
161    * @since 2.2
162    * @version 1.0
163    */
164    uint32_t GetMask() const;
165
166    /**
167    * @brief Checks whether this <b>LocaleInfo</b> object represents the default locale (en-US).
168    *
169    * @return Returns <b>true</b> if the <b>LocaleInfo</b> object represents the default locale;
170    *   returns <b>false</b> otherwise.
171    * @since 2.2
172    * @version 1.0
173    */
174    bool IsDefaultLocale() const;
175
176    /**
177    * @brief Parse a language tag, and returns an associated <b>LocaleInfo</b> instance.
178    *
179    * @param languageTag Indicates the language tag, which is to be parsed.
180    * @param status Indicates the status of the creating process.
181    * @return Returns the associated LocaleInfo instances.
182    */
183    static LocaleInfo ForLanguageTag(const char *languageTag, I18nStatus &status);
184
185    /**
186    * @brief Get extension subtag associated with the key.
187    *
188    * @param key Get the extension subtag using the key.
189    * @return Returns the subtag
190    */
191    const char *GetExtension(const char *key);
192private:
193    bool ChangeLanguageCode(char *lang, const int32_t dstSize, const char *src, const int32_t srcSize) const;
194    void FreeResource();
195    static void ProcessExtension(LocaleInfo &locale, const char *key, const char *value);
196    static void ConfirmTagType(const char *start, size_t length, uint8_t &type, const char* &key, const char* &value);
197    static void ParseLanguageTag(LocaleInfo &locale, const char *languageTag, I18nStatus &status);
198    static bool ParseNormalSubTag(LocaleInfo &locale, const char *start, size_t tagLength, uint16_t &options,
199        uint8_t &type);
200    static bool IsLanguage(const char *start, uint8_t length);
201    static bool IsScript(const char *start, uint8_t length);
202    static bool IsRegion(const char *start, uint8_t length);
203    void InitIdstr();
204    char *language = nullptr;
205    char *script = nullptr;
206    char *region = nullptr;
207    char *id = nullptr;
208    char *numberDigits = nullptr;
209    bool isSucc = true;
210    bool IsSuccess();
211    void SetFail();
212    void Init(const char *lang, const char *script, const char *region, int &status);
213    const int CHAR_OFF = 48;
214    static constexpr uint16_t OPT_LANG = 0x0001;
215    static constexpr uint16_t OPT_SCRIPT = 0x0002;
216    static constexpr uint16_t OPT_REGION = 0x0004;
217    static constexpr uint16_t OPT_EXTENSION = 0x0008;
218    static constexpr uint8_t TAG_COMMON = 0;
219    static constexpr uint8_t TAG_U = 1;
220    static constexpr uint8_t TAG_KEY = 2;
221    static constexpr uint8_t TAG_VALUE = 3;
222    static constexpr int LANGUAGE_MIN_LENGTH = 2;
223    static constexpr int LANGUAGE_MAX_LENGTH = 3;
224    static constexpr int REGION_LENGTH = 2;
225    static constexpr int SCRIPT_LENGTH = 4;
226};
227
228enum ESupportScript {
229    NOKOWN = 0x0,
230    LATN = 0x1,
231    HANS = 0x2,
232    HANT = 0x3,
233    QAAG = 0x4,
234    CYRL = 0x5,
235    DEVA = 0x6,
236    GURU = 0x7
237};
238
239enum EMask {
240    REGION_FIRST_LETTER = 7,
241    SCRIPT_BEGIN = 14,
242    LANG_SECOND_BEGIN = 18,
243    LANG_FIRST_BEGIN = 25
244};
245} // namespace I18N
246} // namespace OHOS
247/** @} */
248#endif
249