• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 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 #include "api_version.h"
17 #include "error_util.h"
18 #include "i18n_hilog.h"
19 #include "i18n_service_ability_client.h"
20 #include "i18n_service_ability_load_manager.h"
21 #include "i18n_system_addon.h"
22 #include "js_utils.h"
23 #include "locale_config.h"
24 #include "locale_info.h"
25 #include "preferred_language.h"
26 #include "utils.h"
27 #include "variable_convertor.h"
28 
29 namespace OHOS {
30 namespace Global {
31 namespace I18n {
32 const std::string I18nSystemAddon::NAME_OF_TEMPERATURE = "type";
33 const std::string I18nSystemAddon::TYPE_OF_TEMPERATURE = "TemperatureType";
34 const std::string I18nSystemAddon::NAME_OF_WEEKDAY = "type";
35 const std::string I18nSystemAddon::TYPE_OF_WEEKDAY = "WeekDay";
36 
I18nSystemAddon()37 I18nSystemAddon::I18nSystemAddon() {}
38 
~I18nSystemAddon()39 I18nSystemAddon::~I18nSystemAddon() {}
40 
Destructor(napi_env env,void * nativeObject,void * finalize_hint)41 void I18nSystemAddon::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
42 {
43     if (!nativeObject) {
44         return;
45     }
46     delete reinterpret_cast<I18nSystemAddon *>(nativeObject);
47     nativeObject = nullptr;
48 }
49 
InitI18nSystem(napi_env env,napi_value exports)50 napi_value I18nSystemAddon::InitI18nSystem(napi_env env, napi_value exports)
51 {
52     napi_property_descriptor properties[] = {
53         DECLARE_NAPI_STATIC_FUNCTION("getDisplayCountry", GetDisplayCountryWithError),
54         DECLARE_NAPI_STATIC_FUNCTION("getDisplayLanguage", GetDisplayLanguageWithError),
55         DECLARE_NAPI_STATIC_FUNCTION("getSystemLanguages", GetSystemLanguages),
56         DECLARE_NAPI_STATIC_FUNCTION("getSystemCountries", GetSystemCountriesWithError),
57         DECLARE_NAPI_STATIC_FUNCTION("isSuggested", IsSuggestedWithError),
58         DECLARE_NAPI_STATIC_FUNCTION("getSystemLanguage", GetSystemLanguage),
59         DECLARE_NAPI_STATIC_FUNCTION("setSystemLanguage", SetSystemLanguageWithError),
60         DECLARE_NAPI_STATIC_FUNCTION("getSystemRegion", GetSystemRegion),
61         DECLARE_NAPI_STATIC_FUNCTION("setSystemRegion", SetSystemRegionWithError),
62         DECLARE_NAPI_STATIC_FUNCTION("getSystemLocale", GetSystemLocale),
63         DECLARE_NAPI_STATIC_FUNCTION("setSystemLocale", SetSystemLocaleWithError),
64         DECLARE_NAPI_STATIC_FUNCTION("is24HourClock", Is24HourClock),
65         DECLARE_NAPI_STATIC_FUNCTION("set24HourClock", Set24HourClockWithError),
66         DECLARE_NAPI_STATIC_FUNCTION("addPreferredLanguage", AddPreferredLanguageWithError),
67         DECLARE_NAPI_STATIC_FUNCTION("removePreferredLanguage", RemovePreferredLanguageWithError),
68         DECLARE_NAPI_STATIC_FUNCTION("getPreferredLanguageList", GetPreferredLanguageList),
69         DECLARE_NAPI_STATIC_FUNCTION("setAppPreferredLanguage", SetAppPreferredLanguage),
70         DECLARE_NAPI_STATIC_FUNCTION("getFirstPreferredLanguage", GetFirstPreferredLanguage),
71         DECLARE_NAPI_STATIC_FUNCTION("getAppPreferredLanguage", GetAppPreferredLanguage),
72         DECLARE_NAPI_STATIC_FUNCTION("setUsingLocalDigit", SetUsingLocalDigitAddonWithError),
73         DECLARE_NAPI_STATIC_FUNCTION("getUsingLocalDigit", GetUsingLocalDigitAddon),
74         DECLARE_NAPI_STATIC_FUNCTION("setTemperatureType", SetTemperatureType),
75         DECLARE_NAPI_STATIC_FUNCTION("getTemperatureType", GetTemperatureType),
76         DECLARE_NAPI_STATIC_FUNCTION("getTemperatureName", GetTemperatureName),
77         DECLARE_NAPI_STATIC_FUNCTION("setFirstDayOfWeek", SetFirstDayOfWeek),
78         DECLARE_NAPI_STATIC_FUNCTION("getFirstDayOfWeek", GetFirstDayOfWeek),
79         DECLARE_NAPI_STATIC_FUNCTION("getSimplifiedLanguage", GetSimplifiedLanguage),
80         DECLARE_NAPI_STATIC_FUNCTION("getSystemLocaleInstance", GetSystemLocaleInstance),
81         DECLARE_NAPI_STATIC_FUNCTION("getSystemCollations", GetSystemCollations),
82         DECLARE_NAPI_STATIC_FUNCTION("getUsingCollation", GetUsingCollation),
83         DECLARE_NAPI_STATIC_FUNCTION("setSystemCollation", SetSystemCollation),
84         DECLARE_NAPI_STATIC_FUNCTION("getSystemNumberingSystems", GetSystemNumberingSystems),
85         DECLARE_NAPI_STATIC_FUNCTION("getUsingNumberingSystem", GetUsingNumberingSystem),
86         DECLARE_NAPI_STATIC_FUNCTION("setSystemNumberingSystem", SetSystemNumberingSystem),
87         DECLARE_NAPI_STATIC_FUNCTION("getSystemNumberPatterns", GetSystemNumberPatterns),
88         DECLARE_NAPI_STATIC_FUNCTION("getUsingNumberPattern", GetUsingNumberPattern),
89         DECLARE_NAPI_STATIC_FUNCTION("setSystemNumberPattern", SetSystemNumberPattern),
90         DECLARE_NAPI_STATIC_FUNCTION("getSystemMeasurements", GetSystemMeasurements),
91         DECLARE_NAPI_STATIC_FUNCTION("getUsingMeasurement", GetUsingMeasurement),
92         DECLARE_NAPI_STATIC_FUNCTION("setSystemMeasurement", SetSystemMeasurement),
93         DECLARE_NAPI_STATIC_FUNCTION("getSystemNumericalDatePatterns", GetSystemNumericalDatePatterns),
94         DECLARE_NAPI_STATIC_FUNCTION("getUsingNumericalDatePattern", GetUsingNumericalDatePattern),
95         DECLARE_NAPI_STATIC_FUNCTION("setSystemNumericalDatePattern", SetSystemNumericalDatePattern),
96     };
97     napi_value constructor = nullptr;
98     napi_status status = napi_define_class(env, "System", NAPI_AUTO_LENGTH, JSUtils::DefaultConstructor, nullptr,
99         sizeof(properties) / sizeof(napi_property_descriptor), properties, &constructor);
100     if (status != napi_ok) {
101         HILOG_ERROR_I18N("Define class failed when InitSystem.");
102         return nullptr;
103     }
104 
105     status = napi_set_named_property(env, exports, "System", constructor);
106     if (status != napi_ok) {
107         HILOG_ERROR_I18N("Set property failed when InitSystem.");
108         return nullptr;
109     }
110     return exports;
111 }
112 
GetDisplayCountry(napi_env env,napi_callback_info info)113 napi_value I18nSystemAddon::GetDisplayCountry(napi_env env, napi_callback_info info)
114 {
115     return I18nSystemAddon::GetDisplayCountryImpl(env, info, false);
116 }
117 
GetDisplayCountryWithError(napi_env env,napi_callback_info info)118 napi_value I18nSystemAddon::GetDisplayCountryWithError(napi_env env, napi_callback_info info)
119 {
120     return I18nSystemAddon::GetDisplayCountryImpl(env, info, true);
121 }
122 
GetDisplayLanguage(napi_env env,napi_callback_info info)123 napi_value I18nSystemAddon::GetDisplayLanguage(napi_env env, napi_callback_info info)
124 {
125     return I18nSystemAddon::GetDisplayLanguageImpl(env, info, false);
126 }
127 
GetDisplayLanguageWithError(napi_env env,napi_callback_info info)128 napi_value I18nSystemAddon::GetDisplayLanguageWithError(napi_env env, napi_callback_info info)
129 {
130     return I18nSystemAddon::GetDisplayLanguageImpl(env, info, true);
131 }
132 
GetSystemLanguages(napi_env env,napi_callback_info info)133 napi_value I18nSystemAddon::GetSystemLanguages(napi_env env, napi_callback_info info)
134 {
135     std::unordered_set<std::string> systemLanguages = LocaleConfig::GetSystemLanguages();
136     napi_value result = nullptr;
137     napi_status status = napi_create_array_with_length(env, systemLanguages.size(), &result);
138     if (status != napi_ok) {
139         HILOG_ERROR_I18N("GetSystemLanguages: Failed to create array");
140         return nullptr;
141     }
142     size_t pos = 0;
143     for (const auto& language : systemLanguages) {
144         napi_value value = nullptr;
145         status = napi_create_string_utf8(env, language.c_str(), NAPI_AUTO_LENGTH, &value);
146         if (status != napi_ok) {
147             HILOG_ERROR_I18N("GetSystemLanguages: Failed to create string item");
148             return nullptr;
149         }
150         status = napi_set_element(env, result, pos, value);
151         if (status != napi_ok) {
152             HILOG_ERROR_I18N("GetSystemLanguages: Failed to set array item");
153             return nullptr;
154         }
155         pos++;
156     }
157     return result;
158 }
159 
GetSystemCountries(napi_env env,napi_callback_info info)160 napi_value I18nSystemAddon::GetSystemCountries(napi_env env, napi_callback_info info)
161 {
162     return I18nSystemAddon::GetSystemCountriesImpl(env, info, false);
163 }
164 
GetSystemCountriesWithError(napi_env env,napi_callback_info info)165 napi_value I18nSystemAddon::GetSystemCountriesWithError(napi_env env, napi_callback_info info)
166 {
167     return I18nSystemAddon::GetSystemCountriesImpl(env, info, true);
168 }
169 
IsSuggested(napi_env env,napi_callback_info info)170 napi_value I18nSystemAddon::IsSuggested(napi_env env, napi_callback_info info)
171 {
172     return I18nSystemAddon::IsSuggestedImpl(env, info, false);
173 }
174 
IsSuggestedWithError(napi_env env,napi_callback_info info)175 napi_value I18nSystemAddon::IsSuggestedWithError(napi_env env, napi_callback_info info)
176 {
177     return I18nSystemAddon::IsSuggestedImpl(env, info, true);
178 }
179 
GetSystemLanguage(napi_env env,napi_callback_info info)180 napi_value I18nSystemAddon::GetSystemLanguage(napi_env env, napi_callback_info info)
181 {
182     std::string value = LocaleConfig::GetSystemLanguage();
183     napi_value result = nullptr;
184     napi_status status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
185     if (status != napi_ok) {
186         HILOG_ERROR_I18N("GetSystemLanguage: Failed to create string item");
187         return nullptr;
188     }
189     return result;
190 }
191 
SetSystemLanguage(napi_env env,napi_callback_info info)192 napi_value I18nSystemAddon::SetSystemLanguage(napi_env env, napi_callback_info info)
193 {
194     return I18nSystemAddon::SetSystemLanguageImpl(env, info, false);
195 }
196 
SetSystemLanguageWithError(napi_env env,napi_callback_info info)197 napi_value I18nSystemAddon::SetSystemLanguageWithError(napi_env env, napi_callback_info info)
198 {
199     return I18nSystemAddon::SetSystemLanguageImpl(env, info, true);
200 }
201 
GetSystemRegion(napi_env env,napi_callback_info info)202 napi_value I18nSystemAddon::GetSystemRegion(napi_env env, napi_callback_info info)
203 {
204     std::string value = LocaleConfig::GetSystemRegion();
205     napi_value result = nullptr;
206     napi_status status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
207     if (status != napi_ok) {
208         HILOG_ERROR_I18N("GetSystemRegion: Failed to create string item");
209         return nullptr;
210     }
211     return result;
212 }
213 
SetSystemRegion(napi_env env,napi_callback_info info)214 napi_value I18nSystemAddon::SetSystemRegion(napi_env env, napi_callback_info info)
215 {
216     return I18nSystemAddon::SetSystemRegionImpl(env, info, false);
217 }
218 
SetSystemRegionWithError(napi_env env,napi_callback_info info)219 napi_value I18nSystemAddon::SetSystemRegionWithError(napi_env env, napi_callback_info info)
220 {
221     return I18nSystemAddon::SetSystemRegionImpl(env, info, true);
222 }
223 
GetSystemLocale(napi_env env,napi_callback_info info)224 napi_value I18nSystemAddon::GetSystemLocale(napi_env env, napi_callback_info info)
225 {
226     std::string value = LocaleConfig::GetSystemLocale();
227     napi_value result = nullptr;
228     napi_status status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
229     if (status != napi_ok) {
230         HILOG_ERROR_I18N("GetSystemLocale: Failed to create string item");
231         return nullptr;
232     }
233     return result;
234 }
235 
SetSystemLocale(napi_env env,napi_callback_info info)236 napi_value I18nSystemAddon::SetSystemLocale(napi_env env, napi_callback_info info)
237 {
238     return I18nSystemAddon::SetSystemLocaleImpl(env, info, false);
239 }
240 
SetSystemLocaleWithError(napi_env env,napi_callback_info info)241 napi_value I18nSystemAddon::SetSystemLocaleWithError(napi_env env, napi_callback_info info)
242 {
243     return I18nSystemAddon::SetSystemLocaleImpl(env, info, true);
244 }
245 
Is24HourClock(napi_env env,napi_callback_info info)246 napi_value I18nSystemAddon::Is24HourClock(napi_env env, napi_callback_info info)
247 {
248     bool is24HourClock = LocaleConfig::Is24HourClock();
249     napi_value result = nullptr;
250     napi_status status = napi_get_boolean(env, is24HourClock, &result);
251     if (status != napi_ok) {
252         HILOG_ERROR_I18N("Failed to create boolean item");
253         return nullptr;
254     }
255     return result;
256 }
257 
Set24HourClock(napi_env env,napi_callback_info info)258 napi_value I18nSystemAddon::Set24HourClock(napi_env env, napi_callback_info info)
259 {
260     return I18nSystemAddon::Set24HourClockImpl(env, info, false);
261 }
262 
Set24HourClockWithError(napi_env env,napi_callback_info info)263 napi_value I18nSystemAddon::Set24HourClockWithError(napi_env env, napi_callback_info info)
264 {
265     return I18nSystemAddon::Set24HourClockImpl(env, info, true);
266 }
267 
AddPreferredLanguage(napi_env env,napi_callback_info info)268 napi_value I18nSystemAddon::AddPreferredLanguage(napi_env env, napi_callback_info info)
269 {
270     return I18nSystemAddon::AddPreferredLanguageImpl(env, info, false);
271 }
272 
AddPreferredLanguageWithError(napi_env env,napi_callback_info info)273 napi_value I18nSystemAddon::AddPreferredLanguageWithError(napi_env env, napi_callback_info info)
274 {
275     return I18nSystemAddon::AddPreferredLanguageImpl(env, info, true);
276 }
277 
RemovePreferredLanguage(napi_env env,napi_callback_info info)278 napi_value I18nSystemAddon::RemovePreferredLanguage(napi_env env, napi_callback_info info)
279 {
280     return I18nSystemAddon::RemovePreferredLanguageImpl(env, info, false);
281 }
282 
RemovePreferredLanguageWithError(napi_env env,napi_callback_info info)283 napi_value I18nSystemAddon::RemovePreferredLanguageWithError(napi_env env, napi_callback_info info)
284 {
285     return I18nSystemAddon::RemovePreferredLanguageImpl(env, info, true);
286 }
287 
GetPreferredLanguageList(napi_env env,napi_callback_info info)288 napi_value I18nSystemAddon::GetPreferredLanguageList(napi_env env, napi_callback_info info)
289 {
290     std::vector<std::string> languageList = PreferredLanguage::GetPreferredLanguageList();
291     napi_value result = nullptr;
292     napi_status status = napi_create_array_with_length(env, languageList.size(), &result);
293     if (status != napi_ok) {
294         HILOG_ERROR_I18N("getPreferrdLanguageList: create array failed");
295         return nullptr;
296     }
297     for (size_t i = 0; i < languageList.size(); i++) {
298         napi_value value = nullptr;
299         status = napi_create_string_utf8(env, languageList[i].c_str(), NAPI_AUTO_LENGTH, &value);
300         if (status != napi_ok) {
301             HILOG_ERROR_I18N("getPreferrdLanguageList: create string failed");
302             return nullptr;
303         }
304         status = napi_set_element(env, result, i, value);
305         if (status != napi_ok) {
306             HILOG_ERROR_I18N("GetPreferredLanguageList: set array item failed");
307             return nullptr;
308         }
309     }
310     return result;
311 }
312 
GetFirstPreferredLanguage(napi_env env,napi_callback_info info)313 napi_value I18nSystemAddon::GetFirstPreferredLanguage(napi_env env, napi_callback_info info)
314 {
315     std::string language = PreferredLanguage::GetFirstPreferredLanguage();
316     napi_value result = nullptr;
317     napi_status status = napi_create_string_utf8(env, language.c_str(), NAPI_AUTO_LENGTH, &result);
318     if (status != napi_ok) {
319         HILOG_ERROR_I18N("getFirstPreferrdLanguage: create string result failed");
320         return nullptr;
321     }
322     return result;
323 }
324 
SetAppPreferredLanguage(napi_env env,napi_callback_info info)325 napi_value I18nSystemAddon::SetAppPreferredLanguage(napi_env env, napi_callback_info info)
326 {
327     size_t argc = 1;
328     napi_value argv[1] = { 0 };
329     napi_value thisVar = nullptr;
330     void *data = nullptr;
331     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
332     if (status != napi_ok) {
333         return nullptr;
334     }
335     napi_valuetype valueType = napi_valuetype::napi_undefined;
336     status = napi_typeof(env, argv[0], &valueType);
337     if (status != napi_ok) {
338         return nullptr;
339     }
340     if (valueType != napi_valuetype::napi_string) {
341         HILOG_ERROR_I18N("SetAppPreferredLanguage Parameter type is not string");
342         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "string", true);
343         return nullptr;
344     }
345     int code = 0;
346     std::string localeTag = VariableConvertor::GetString(env, argv[0], code);
347     if (code) {
348         HILOG_ERROR_I18N("SetAppPreferredLanguage can't get string from js param");
349         return nullptr;
350     }
351     UErrorCode icuStatus = U_ZERO_ERROR;
352     icu::Locale locale = icu::Locale::forLanguageTag(localeTag.data(), icuStatus);
353     if (U_FAILURE(icuStatus) || !(IsValidLocaleTag(locale) || localeTag.compare("default") == 0)) {
354         HILOG_ERROR_I18N("SetAppPreferredLanguage does not support this locale");
355         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "language", "a valid language", true);
356         return nullptr;
357     }
358 #ifdef SUPPORT_APP_PREFERRED_LANGUAGE
359     I18nErrorCode errCode = I18nErrorCode::SUCCESS;
360     PreferredLanguage::SetAppPreferredLanguage(localeTag, errCode);
361     if (errCode != I18nErrorCode::SUCCESS) {
362         HILOG_ERROR_I18N("SetAppPreferredLanguage: set app language to i18n app preferences failed.");
363     }
364 #endif
365     return nullptr;
366 }
367 
GetAppPreferredLanguage(napi_env env,napi_callback_info info)368 napi_value I18nSystemAddon::GetAppPreferredLanguage(napi_env env, napi_callback_info info)
369 {
370 #ifdef SUPPORT_APP_PREFERRED_LANGUAGE
371     std::string language = PreferredLanguage::GetAppPreferredLanguage();
372 #else
373     std::string language = PreferredLanguage::GetFirstPreferredLanguage();
374 #endif
375     napi_value result = nullptr;
376     napi_status status = napi_create_string_utf8(env, language.c_str(), NAPI_AUTO_LENGTH, &result);
377     if (status != napi_ok) {
378         HILOG_ERROR_I18N("getAppPreferrdLanguage: create string result failed");
379         return nullptr;
380     }
381     return result;
382 }
383 
SetUsingLocalDigitAddon(napi_env env,napi_callback_info info)384 napi_value I18nSystemAddon::SetUsingLocalDigitAddon(napi_env env, napi_callback_info info)
385 {
386     return I18nSystemAddon::SetUsingLocalDigitAddonImpl(env, info, false);
387 }
388 
SetUsingLocalDigitAddonWithError(napi_env env,napi_callback_info info)389 napi_value I18nSystemAddon::SetUsingLocalDigitAddonWithError(napi_env env, napi_callback_info info)
390 {
391     return I18nSystemAddon::SetUsingLocalDigitAddonImpl(env, info, true);
392 }
393 
GetUsingLocalDigitAddon(napi_env env,napi_callback_info info)394 napi_value I18nSystemAddon::GetUsingLocalDigitAddon(napi_env env, napi_callback_info info)
395 {
396     bool res = LocaleConfig::GetUsingLocalDigit();
397     napi_value value = nullptr;
398     napi_status status = napi_get_boolean(env, res, &value);
399     if (status != napi_ok) {
400         return nullptr;
401     }
402     return value;
403 }
404 
GetDisplayCountryImpl(napi_env env,napi_callback_info info,bool throwError)405 napi_value I18nSystemAddon::GetDisplayCountryImpl(napi_env env, napi_callback_info info, bool throwError)
406 {
407     // Need to get three parameters to get the display country.
408     size_t argc = 3;
409     napi_value argv[3] = { nullptr };
410     napi_value thisVar = nullptr;
411     void *data = nullptr;
412     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
413     if (status != napi_ok) {
414         return VariableConvertor::CreateString(env, "");
415     } else if (argc < FUNC_ARGS_COUNT) {
416         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "country or locale", throwError);
417         return VariableConvertor::CreateString(env, "");
418     }
419     VariableConvertor::VerifyType(env, "country", napi_valuetype::napi_string, argv[0]);
420     int32_t code = 0;
421     std::string localeBuf = VariableConvertor::GetString(env, argv[0], code);
422     if (code) {
423         return VariableConvertor::CreateString(env, "");
424     }
425     VariableConvertor::VerifyType(env, "locale", napi_valuetype::napi_string, argv[1]);
426     std::string displayLocaleBuf = VariableConvertor::GetString(env, argv[1], code);
427     if (code) {
428         return VariableConvertor::CreateString(env, "");
429     }
430     LocaleInfo localeInfo(localeBuf.data());
431     if (!LocaleConfig::IsValidRegion(localeBuf.data()) && localeInfo.GetRegion().empty()) {
432         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "country", "a valid region", throwError);
433         return VariableConvertor::CreateString(env, "");
434     } else if (!LocaleConfig::IsValidTag(displayLocaleBuf.data())) {
435         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "locale", "a valid locale", throwError);
436         return VariableConvertor::CreateString(env, "");
437     }
438     bool sentenceCase = true;
439     if (argc > FUNC_ARGS_COUNT) {
440         status = napi_get_value_bool(env, argv[FUNC_ARGS_COUNT], &sentenceCase);
441         if (status != napi_ok) {
442             HILOG_ERROR_I18N("GetDisplayCountryImpl: Get sentenceCase failed.");
443         }
444     }
445     std::string value = LocaleConfig::GetDisplayRegion(localeBuf.data(), displayLocaleBuf.data(), sentenceCase);
446     if (value.length() == 0) {
447         HILOG_ERROR_I18N("GetDisplayCountryImpl: result is empty.");
448         return VariableConvertor::CreateString(env, "");
449     }
450     return VariableConvertor::CreateString(env, value);
451 }
452 
GetDisplayLanguageImpl(napi_env env,napi_callback_info info,bool throwError)453 napi_value I18nSystemAddon::GetDisplayLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
454 {
455     // Need to get three parameters to get the display Language.
456     size_t argc = 3;
457     napi_value argv[3] = { nullptr };
458     napi_value thisVar = nullptr;
459     void *data = nullptr;
460     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
461     if (status != napi_ok) {
462         return nullptr;
463     } else if (argc < FUNC_ARGS_COUNT) {
464         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "language or locale", throwError);
465         return nullptr;
466     }
467     VariableConvertor::VerifyType(env, "language", napi_valuetype::napi_string, argv[0]);
468     int32_t code = 0;
469     std::string localeBuf = VariableConvertor::GetString(env, argv[0], code);
470     if (code) {
471         return VariableConvertor::CreateString(env, "");
472     }
473     VariableConvertor::VerifyType(env, "locale", napi_valuetype::napi_string, argv[1]);
474     std::string displayLocaleBuf = VariableConvertor::GetString(env, argv[1], code);
475     if (code) {
476         return VariableConvertor::CreateString(env, "");
477     }
478     if (!LocaleConfig::IsValidTag(displayLocaleBuf.data())) {
479         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "locale", "a valid locale", throwError);
480         return nullptr;
481     }
482     bool sentenceCase = true;
483     if (argc > FUNC_ARGS_COUNT) {
484         status = napi_get_value_bool(env, argv[FUNC_ARGS_COUNT], &sentenceCase);
485         if (status != napi_ok) {
486             HILOG_ERROR_I18N("GetDisplayLanguageImpl: Get sentenceCase failed.");
487         }
488     }
489     std::string value = LocaleConfig::GetDisplayLanguage(localeBuf.data(), displayLocaleBuf.data(), sentenceCase);
490     if (value.length() == 0) {
491         HILOG_ERROR_I18N("GetDisplayLanguageImpl: result is empty.");
492         return nullptr;
493     }
494     napi_value result = nullptr;
495     status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
496     if (status != napi_ok) {
497         HILOG_ERROR_I18N("GetDisplayLanguageImpl: Failed to create string item");
498         return nullptr;
499     }
500     return result;
501 }
502 
GetSystemCountriesImpl(napi_env env,napi_callback_info info,bool throwError)503 napi_value I18nSystemAddon::GetSystemCountriesImpl(napi_env env, napi_callback_info info, bool throwError)
504 {
505     size_t argc = 1;
506     napi_value argv[1] = { nullptr };
507     napi_value thisVar = nullptr;
508     void *data = nullptr;
509     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
510     if (status != napi_ok) {
511         return nullptr;
512     } else if (argc < 1) {
513         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "language", throwError);
514         return nullptr;
515     }
516     VariableConvertor::VerifyType(env, "language", napi_valuetype::napi_string, argv[0]);
517     int32_t code = 0;
518     std::string language = VariableConvertor::GetString(env, argv[0], code);
519     if (code != 0) {
520         HILOG_ERROR_I18N("GetSystemCountriesImpl: Get argv[0] failed.");
521         return nullptr;
522     }
523     std::unordered_set<std::string> systemCountries = LocaleConfig::GetSystemCountries(language);
524     napi_value result = nullptr;
525     status = napi_create_array_with_length(env, systemCountries.size(), &result);
526     if (status != napi_ok) {
527         HILOG_ERROR_I18N("GetSystemCountriesImpl: Failed to create array");
528         return nullptr;
529     }
530     size_t pos = 0;
531     for (const auto& country : systemCountries) {
532         napi_value value = nullptr;
533         status = napi_create_string_utf8(env, country.c_str(), NAPI_AUTO_LENGTH, &value);
534         if (status != napi_ok) {
535             HILOG_ERROR_I18N("GetSystemCountries: Failed to create string item");
536             return nullptr;
537         }
538         status = napi_set_element(env, result, pos, value);
539         if (status != napi_ok) {
540             HILOG_ERROR_I18N("GetSystemCountries: Failed to set array item");
541             return nullptr;
542         }
543         pos++;
544     }
545     return result;
546 }
547 
GetApiCheckResult()548 bool I18nSystemAddon::GetApiCheckResult()
549 {
550     ApiCompareResult result = ApiVersion::CheckApiTargetVersion("isSuggested");
551     return result == ApiCompareResult::GREATER_THAN;
552 }
553 
IsSuggestedImpl(napi_env env,napi_callback_info info,bool throwError)554 napi_value I18nSystemAddon::IsSuggestedImpl(napi_env env, napi_callback_info info, bool throwError)
555 {
556     // Need to get two parameters to check is suggested or not.
557     size_t argc = 2;
558     napi_value argv[2] = { nullptr };
559     napi_value thisVar = nullptr;
560     void *data = nullptr;
561     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
562     if (status != napi_ok) {
563         return nullptr;
564     } else if (argc < 1) {
565         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "language", throwError);
566         return nullptr;
567     }
568     VariableConvertor::VerifyType(env, "language", napi_valuetype::napi_string, argv[0]);
569     int32_t code = 0;
570     std::string language = VariableConvertor::GetString(env, argv[0], code);
571     if (code != 0) {
572         HILOG_ERROR_I18N("IsSuggestedImpl: Failed to get string argv[0].");
573         return nullptr;
574     }
575     bool isSuggested = false;
576     if (VariableConvertor::CheckNapiIsNull(env, argv[1])) {
577         std::string region = VariableConvertor::GetString(env, argv[1], code);
578         if (code != 0) {
579             HILOG_ERROR_I18N("IsSuggestedImpl: Failed to get string argv[1].");
580             return nullptr;
581         }
582         isSuggested = LocaleConfig::IsSuggestedV15(language, region);
583     } else {
584         isSuggested = LocaleConfig::IsSuggestedV15(language);
585     }
586     napi_value result = nullptr;
587     status = napi_get_boolean(env, isSuggested, &result);
588     if (status != napi_ok) {
589         HILOG_ERROR_I18N("Create case first boolean value failed");
590         return nullptr;
591     }
592     return result;
593 }
594 
IsSuggestedByApiVersion(const std::string & language,bool newApi)595 bool I18nSystemAddon::IsSuggestedByApiVersion(const std::string &language, bool newApi)
596 {
597     if (newApi) {
598         return LocaleConfig::IsSuggested(language);
599     }
600     return LocaleConfig::IsSuggestedV15(language);
601 }
602 
IsSuggestedByApiVersion(const std::string & language,const std::string & region,bool newApi)603 bool I18nSystemAddon::IsSuggestedByApiVersion(const std::string &language,
604     const std::string &region, bool newApi)
605 {
606     if (newApi) {
607         return LocaleConfig::IsSuggested(language, region);
608     }
609     return LocaleConfig::IsSuggestedV15(language, region);
610 }
611 
SetSystemLanguageImpl(napi_env env,napi_callback_info info,bool throwError)612 napi_value I18nSystemAddon::SetSystemLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
613 {
614     size_t argc = 1;
615     napi_value argv[1] = { 0 };
616     napi_value thisVar = nullptr;
617     void *data = nullptr;
618     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
619     if (status != napi_ok) {
620         return nullptr;
621     }
622     if (argc < 1) {
623         HILOG_ERROR_I18N("SetSystemLanguageImpl: Missing parameter");
624         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "language", throwError);
625         return nullptr;
626     }
627     size_t len = 0;
628     status = napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
629     if (status != napi_ok) {
630         HILOG_ERROR_I18N("SetSystemLanguageImpl: Failed to get string len argv[0].");
631         return nullptr;
632     }
633     std::vector<char> languageBuf(len + 1);
634     status = napi_get_value_string_utf8(env, argv[0], languageBuf.data(), len + 1, &len);
635     if (status != napi_ok) {
636         HILOG_ERROR_I18N("SetSystemLanguageImpl: Failed to get string item");
637         return nullptr;
638     }
639     I18nErrorCode err = I18nServiceAbilityClient::SetSystemLanguage(languageBuf.data());
640     HILOG_INFO_I18N("I18nSystemAddon::SetSystemLanguageImpl with code %{public}d", static_cast<int32_t>(err));
641     bool success = err == I18nErrorCode::SUCCESS;
642     if (throwError) {
643         if (!success) {
644             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
645         }
646         return nullptr;
647     }
648     napi_value result = nullptr;
649     status = napi_get_boolean(env, success, &result);
650     if (status != napi_ok) {
651         HILOG_ERROR_I18N("SetSystemLanguageImpl: Create set system language boolean value failed");
652         return nullptr;
653     }
654     return result;
655 }
656 
SetSystemRegionImpl(napi_env env,napi_callback_info info,bool throwError)657 napi_value I18nSystemAddon::SetSystemRegionImpl(napi_env env, napi_callback_info info, bool throwError)
658 {
659     size_t argc = 1;
660     napi_value argv[1] = { nullptr };
661     napi_value thisVar = nullptr;
662     void *data = nullptr;
663     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
664     if (status != napi_ok) {
665         return nullptr;
666     }
667     if (argc < 1) {
668         HILOG_ERROR_I18N("SetSystemRegionImpl: Missing parameter");
669         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "region", throwError);
670         return nullptr;
671     }
672     int32_t code = 0;
673     std::string regionBuf = VariableConvertor::GetString(env, argv[0], code);
674     if (code != 0) {
675         HILOG_ERROR_I18N("SetSystemRegionImpl: Get argv[0] failed.");
676         return nullptr;
677     }
678     I18nErrorCode err = I18nServiceAbilityClient::SetSystemRegion(regionBuf.data());
679     HILOG_INFO_I18N("I18nSystemAddon::SetSystemRegionImpl with code %{public}d", static_cast<int32_t>(err));
680     bool success = err == I18nErrorCode::SUCCESS;
681     if (throwError) {
682         if (!success) {
683             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
684         }
685         return nullptr;
686     }
687     napi_value result = nullptr;
688     status = napi_get_boolean(env, success, &result);
689     if (status != napi_ok) {
690         HILOG_ERROR_I18N("SetSystemRegionImpl: Create set system language boolean value failed");
691         return nullptr;
692     }
693     return result;
694 }
695 
SetSystemLocaleImpl(napi_env env,napi_callback_info info,bool throwError)696 napi_value I18nSystemAddon::SetSystemLocaleImpl(napi_env env, napi_callback_info info, bool throwError)
697 {
698     size_t argc = 1;
699     napi_value argv[1] = { nullptr };
700     napi_value thisVar = nullptr;
701     void *data = nullptr;
702     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
703     if (status != napi_ok) {
704         return nullptr;
705     }
706     if (argc < 1) {
707         HILOG_ERROR_I18N("SetSystemLocaleImpl: Missing parameter");
708         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "locale", throwError);
709         return nullptr;
710     }
711     int32_t code = 0;
712     std::string localeBuf = VariableConvertor::GetString(env, argv[0], code);
713     if (code != 0) {
714         HILOG_ERROR_I18N("SetSystemLocaleImpl: Get argv[0] failed.");
715         return nullptr;
716     }
717     I18nErrorCode err = I18nServiceAbilityClient::SetSystemLocale(localeBuf.data());
718     HILOG_INFO_I18N("I18nSystemAddon::SetSystemLocaleImpl with code %{public}d", static_cast<int32_t>(err));
719     bool success = err == I18nErrorCode::SUCCESS;
720     if (throwError) {
721         if (!success) {
722             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
723         }
724         return nullptr;
725     }
726     napi_value result = nullptr;
727     status = napi_get_boolean(env, success, &result);
728     if (status != napi_ok) {
729         HILOG_ERROR_I18N("SetSystemLocaleImpl: Create set system language boolean value failed");
730         return nullptr;
731     }
732     return result;
733 }
734 
Set24HourClockImpl(napi_env env,napi_callback_info info,bool throwError)735 napi_value I18nSystemAddon::Set24HourClockImpl(napi_env env, napi_callback_info info, bool throwError)
736 {
737     size_t argc = 1;
738     napi_value argv[1] = { nullptr };
739     napi_value thisVar = nullptr;
740     void *data = nullptr;
741     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
742     if (status != napi_ok) {
743         return nullptr;
744     }
745     if (argc < 1) {
746         HILOG_ERROR_I18N("Set24HourClockImpl: Missing parameter");
747         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "option", throwError);
748         return nullptr;
749     }
750 
751     bool option = false;
752     status = napi_get_value_bool(env, argv[0], &option);
753     if (status != napi_ok) {
754         HILOG_ERROR_I18N("Set24HourClockImpl: Failed to get boolean item");
755         return nullptr;
756     }
757     std::string optionStr = option ? "true" : "false";
758     I18nErrorCode err = I18nServiceAbilityClient::Set24HourClock(optionStr);
759     HILOG_INFO_I18N("I18nSystemAddon::Set24HourClock with code %{public}d", static_cast<int32_t>(err));
760     bool success = err == I18nErrorCode::SUCCESS;
761     if (throwError) {
762         if (!success) {
763             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
764         }
765         return nullptr;
766     }
767     napi_value result = nullptr;
768     status = napi_get_boolean(env, success, &result);
769     if (status != napi_ok) {
770         HILOG_ERROR_I18N("Create set 24HourClock boolean value failed");
771         return nullptr;
772     }
773     return result;
774 }
775 
AddPreferredLanguageImpl(napi_env env,napi_callback_info info,bool throwError)776 napi_value I18nSystemAddon::AddPreferredLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
777 {
778     size_t argc = 2;
779     napi_value argv[2] = { 0 };
780     napi_value thisVar = nullptr;
781     void *data = nullptr;
782     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
783     if (status != napi_ok) {
784         return nullptr;
785     }
786 
787     std::string language;
788     if (!ParseStringParam(env, argc > 0 ? argv[0] : nullptr, throwError, language)) {
789         return nullptr;
790     }
791 
792     int index = 1000000;
793     if (VariableConvertor::CheckNapiIsNull(env, argc > 1 ? argv[1] : nullptr)) {
794         status = napi_get_value_int32(env, argv[1], &index);
795         if (status != napi_ok) {
796             HILOG_ERROR_I18N("addPreferrdLanguage: get index failed");
797             return nullptr;
798         }
799     }
800     I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage(language.data(), index);
801     HILOG_INFO_I18N("I18nSystemAddon::AddPreferredLanguageImpl with code %{public}d", static_cast<int32_t>(err));
802     if (throwError) {
803         if (err == I18nErrorCode::NO_PERMISSION || err == I18nErrorCode::NOT_SYSTEM_APP) {
804             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
805         }
806         if (err != I18nErrorCode::SUCCESS) {
807             ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "language", "a valid language", throwError);
808         }
809         return nullptr;
810     }
811     bool addResult = true;
812     if (err != I18nErrorCode::SUCCESS) {
813         addResult = false;
814     }
815     napi_value result = nullptr;
816     status = napi_get_boolean(env, addResult, &result);
817     if (status != napi_ok) {
818         HILOG_ERROR_I18N("addPreferrdLanguage: create boolean result failed");
819         return nullptr;
820     }
821     return result;
822 }
823 
RemovePreferredLanguageImpl(napi_env env,napi_callback_info info,bool throwError)824 napi_value I18nSystemAddon::RemovePreferredLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
825 {
826     size_t argc = 1;
827     napi_value argv[1] = { nullptr };
828     napi_value thisVar = nullptr;
829     void *data = nullptr;
830     int len = 0;
831     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
832     if (status != napi_ok) {
833         return nullptr;
834     }
835     if (argc < 1) {
836         HILOG_ERROR_I18N("RemovePreferredLanguageImpl: Missing parameter");
837         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "index", throwError);
838         return nullptr;
839     }
840 
841     napi_valuetype valueType = napi_valuetype::napi_undefined;
842     status = napi_typeof(env, argv[0], &valueType);
843     if (status != napi_ok) {
844         return nullptr;
845     } else if (valueType != napi_valuetype::napi_number) {
846         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "index", "number", throwError);
847         return nullptr;
848     }
849     int index = 1000000;
850     status = napi_get_value_int32(env, argv[0], &index);
851     if (status != napi_ok) {
852         HILOG_ERROR_I18N("removePreferrdLanguage: get index failed");
853         return nullptr;
854     }
855     len = static_cast<int>(PreferredLanguage::GetPreferredLanguageList().size());
856     if ((index < 0 || index > len - 1) && throwError) {
857         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "index", "within the valid range", throwError);
858         return nullptr;
859     }
860     I18nErrorCode err = I18nServiceAbilityClient::RemovePreferredLanguage(index);
861     bool success = err == I18nErrorCode::SUCCESS;
862 
863     if (throwError) {
864         if (!success) {
865             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
866         }
867         return nullptr;
868     }
869     napi_value result = nullptr;
870     status = napi_get_boolean(env, success, &result);
871     if (status != napi_ok) {
872         HILOG_ERROR_I18N("removePreferrdLanguage: create boolean result failed");
873         return nullptr;
874     }
875     return result;
876 }
877 
SetUsingLocalDigitAddonImpl(napi_env env,napi_callback_info info,bool throwError)878 napi_value I18nSystemAddon::SetUsingLocalDigitAddonImpl(napi_env env, napi_callback_info info, bool throwError)
879 {
880     size_t argc = 1;
881     napi_value argv[1] = { nullptr };
882     napi_value thisVar = nullptr;
883     void *data = nullptr;
884     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
885     if (status != napi_ok) {
886         return nullptr;
887     }
888     if (argc < 1) {
889         HILOG_ERROR_I18N("Invalid parameter nullptr");
890         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "flag", throwError);
891         return nullptr;
892     }
893     napi_valuetype valueType = napi_valuetype::napi_undefined;
894     status = napi_typeof(env, argv[0], &valueType);
895     if (status != napi_ok) {
896         return nullptr;
897     }
898     if (valueType != napi_valuetype::napi_boolean) {
899         HILOG_ERROR_I18N("Invalid parameter type");
900         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "flag", "boolean", throwError);
901         return nullptr;
902     }
903     bool flag = false;
904     status = napi_get_value_bool(env, argv[0], &flag);
905     if (status != napi_ok) {
906         HILOG_ERROR_I18N("Get parameter flag failed");
907         return nullptr;
908     }
909     I18nErrorCode err = I18nServiceAbilityClient::SetUsingLocalDigit(flag);
910     HILOG_INFO_I18N("I18nSystemAddon::SetUsingLocalDigitAddonImpl with code %{public}d",
911         static_cast<int32_t>(err));
912     bool res = err == I18nErrorCode::SUCCESS;
913     if (throwError) {
914         if (!res) {
915             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
916         }
917         return nullptr;
918     }
919     napi_value value = nullptr;
920     status = napi_get_boolean(env, res, &value);
921     if (status != napi_ok) {
922         HILOG_ERROR_I18N("Invalid result");
923         return nullptr;
924     }
925     return value;
926 }
927 
ParseStringParam(napi_env env,napi_value argv,bool throwError,std::string & strParam)928 bool I18nSystemAddon::ParseStringParam(napi_env env, napi_value argv, bool throwError, std::string &strParam)
929 {
930     if (argv == nullptr) {
931         HILOG_ERROR_I18N("ParseStringParam: Missing parameter");
932         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "language", throwError);
933         return false;
934     }
935     napi_valuetype valueType = napi_valuetype::napi_undefined;
936     napi_status status = napi_typeof(env, argv, &valueType);
937     if (status != napi_ok) {
938         return false;
939     }
940     if (valueType != napi_valuetype::napi_string) {
941         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "string", throwError);
942         return false;
943     }
944     size_t len = 0;
945     status = napi_get_value_string_utf8(env, argv, nullptr, 0, &len);
946     if (status != napi_ok) {
947         HILOG_ERROR_I18N("get string parameter length failed");
948         return false;
949     }
950     std::vector<char> res(len + 1);
951     status = napi_get_value_string_utf8(env, argv, res.data(), len + 1, &len);
952     if (status != napi_ok) {
953         HILOG_ERROR_I18N("get string parameter failed");
954         return false;
955     }
956     strParam = res.data();
957     return true;
958 }
959 
SetTemperatureType(napi_env env,napi_callback_info info)960 napi_value I18nSystemAddon::SetTemperatureType(napi_env env, napi_callback_info info)
961 {
962     TemperatureType type = TemperatureType::CELSIUS;
963     if (!ParseTemperatureType(env, info, type)) {
964         HILOG_ERROR_I18N("I18nSystemAddon::SetTemperatureType: parse temperature type failed.");
965         return nullptr;
966     }
967     I18nErrorCode err = I18nServiceAbilityClient::SetTemperatureType(type);
968     if (err == I18nErrorCode::SUCCESS) {
969         return nullptr;
970     }
971     switch (err) {
972         case I18nErrorCode::NOT_SYSTEM_APP:
973             ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
974             break;
975         case I18nErrorCode::NO_PERMISSION:
976             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", true);
977             break;
978         case I18nErrorCode::INVALID_TEMPERATURE_TYPE:
979             ErrorUtil::NapiThrow(env, I18N_NOT_VALID, NAME_OF_TEMPERATURE, TYPE_OF_TEMPERATURE, true);
980             break;
981         default:
982             HILOG_ERROR_I18N("I18nSystemAddon::SetTemperatureType: set temperature type failed.");
983     }
984     return nullptr;
985 }
986 
GetTemperatureType(napi_env env,napi_callback_info info)987 napi_value I18nSystemAddon::GetTemperatureType(napi_env env, napi_callback_info info)
988 {
989     TemperatureType type = LocaleConfig::GetTemperatureType();
990     int32_t value = static_cast<int32_t>(type);
991     return VariableConvertor::CreateNumber(env, value);
992 }
993 
GetTemperatureName(napi_env env,napi_callback_info info)994 napi_value I18nSystemAddon::GetTemperatureName(napi_env env, napi_callback_info info)
995 {
996     TemperatureType type = TemperatureType::CELSIUS;
997     if (!ParseTemperatureType(env, info, type)) {
998         HILOG_ERROR_I18N("I18nSystemAddon::GetTemperatureName: parse temperature type failed.");
999         return VariableConvertor::CreateString(env, "");
1000     }
1001     std::string temperatureName = LocaleConfig::GetTemperatureName(type);
1002     if (temperatureName.empty()) {
1003         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, NAME_OF_TEMPERATURE, TYPE_OF_TEMPERATURE, true);
1004         return VariableConvertor::CreateString(env, "");
1005     }
1006     return VariableConvertor::CreateString(env, temperatureName);
1007 }
1008 
ParseTemperatureType(napi_env env,napi_callback_info info,TemperatureType & type)1009 bool I18nSystemAddon::ParseTemperatureType(napi_env env, napi_callback_info info, TemperatureType& type)
1010 {
1011     size_t argc = 1;
1012     napi_value argv[1] = { nullptr };
1013     napi_value thisVar = nullptr;
1014     void *data = nullptr;
1015     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1016     if (status != napi_ok) {
1017         HILOG_ERROR_I18N("I18nSystemAddon::ParseTemperatureType: get cb info failed.");
1018         return false;
1019     }
1020     if (argc < 1) {
1021         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, NAME_OF_TEMPERATURE, "", true);
1022         return false;
1023     }
1024     napi_valuetype valueType = napi_valuetype::napi_undefined;
1025     status = napi_typeof(env, argv[0], &valueType);
1026     if (status != napi_ok) {
1027         HILOG_ERROR_I18N("I18nSystemAddon::ParseTemperatureType: get value type failed.");
1028         return false;
1029     }
1030     if (valueType != napi_valuetype::napi_number) {
1031         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, NAME_OF_TEMPERATURE, TYPE_OF_TEMPERATURE, true);
1032         return false;
1033     }
1034     int32_t temperatureType = 0;
1035     status = napi_get_value_int32(env, argv[0], &temperatureType);
1036     if (status != napi_ok) {
1037         HILOG_ERROR_I18N("I18nSystemAddon::ParseTemperatureType: get temperature type failed.");
1038         return false;
1039     }
1040     type = static_cast<TemperatureType>(temperatureType);
1041     return true;
1042 }
1043 
SetFirstDayOfWeek(napi_env env,napi_callback_info info)1044 napi_value I18nSystemAddon::SetFirstDayOfWeek(napi_env env, napi_callback_info info)
1045 {
1046     size_t argc = 1;
1047     napi_value argv[1] = { nullptr };
1048     napi_value thisVar = nullptr;
1049     void *data = nullptr;
1050     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1051     if (status != napi_ok) {
1052         HILOG_ERROR_I18N("I18nSystemAddon::SetFirstDayOfWeek: get cb info failed.");
1053         return nullptr;
1054     }
1055     if (argc < 1) {
1056         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, NAME_OF_WEEKDAY, "", true);
1057         return nullptr;
1058     }
1059     napi_valuetype valueType = napi_valuetype::napi_undefined;
1060     status = napi_typeof(env, argv[0], &valueType);
1061     if (status != napi_ok) {
1062         HILOG_ERROR_I18N("I18nSystemAddon::SetFirstDayOfWeek: get value type failed.");
1063         return nullptr;
1064     }
1065     if (valueType != napi_valuetype::napi_number) {
1066         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, NAME_OF_WEEKDAY, TYPE_OF_WEEKDAY, true);
1067         return nullptr;
1068     }
1069     int32_t weekDay = 0;
1070     status = napi_get_value_int32(env, argv[0], &weekDay);
1071     if (status != napi_ok) {
1072         HILOG_ERROR_I18N("I18nSystemAddon::SetFirstDayOfWeek: get week day failed.");
1073         return nullptr;
1074     }
1075     WeekDay type = static_cast<WeekDay>(weekDay);
1076     I18nErrorCode err = I18nServiceAbilityClient::SetFirstDayOfWeek(type);
1077     if (err == I18nErrorCode::SUCCESS) {
1078         return nullptr;
1079     }
1080     switch (err) {
1081         case I18nErrorCode::NOT_SYSTEM_APP:
1082             ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1083             break;
1084         case I18nErrorCode::NO_PERMISSION:
1085             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", true);
1086             break;
1087         case I18nErrorCode::INVALID_WEEK_DAY:
1088             ErrorUtil::NapiThrow(env, I18N_NOT_VALID, NAME_OF_WEEKDAY, TYPE_OF_WEEKDAY, true);
1089             break;
1090         default:
1091             HILOG_ERROR_I18N("I18nSystemAddon::SetFirstDayOfWeek: set first day of week failed.");
1092     }
1093     return nullptr;
1094 }
1095 
GetFirstDayOfWeek(napi_env env,napi_callback_info info)1096 napi_value I18nSystemAddon::GetFirstDayOfWeek(napi_env env, napi_callback_info info)
1097 {
1098     WeekDay type = LocaleConfig::GetFirstDayOfWeek();
1099     int32_t value = static_cast<int32_t>(type);
1100     return VariableConvertor::CreateNumber(env, value);
1101 }
1102 
GetSimplifiedLanguage(napi_env env,napi_callback_info info)1103 napi_value I18nSystemAddon::GetSimplifiedLanguage(napi_env env, napi_callback_info info)
1104 {
1105     // Need to get one parameter
1106     size_t argc = 1;
1107     napi_value argv[1] = { nullptr };
1108     napi_value thisVar = nullptr;
1109     void *data = nullptr;
1110     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1111     if (status != napi_ok) {
1112         HILOG_ERROR_I18N("GetSimplifiedLanguage get parameter fail");
1113         return nullptr;
1114     }
1115 
1116     std::string simplifiedLanguage = "";
1117     if (VariableConvertor::CheckNapiIsNull(env, argv[0])) {
1118         napi_valuetype valueType = napi_valuetype::napi_undefined;
1119         status = napi_typeof(env, argv[0], &valueType);
1120         if (status != napi_ok) {
1121             return nullptr;
1122         }
1123         if (valueType != napi_valuetype::napi_string) {
1124             HILOG_ERROR_I18N("GetSimplifiedLanguage Parameter type is not string");
1125             ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "string", true);
1126             return nullptr;
1127         }
1128         int code = 0;
1129         std::string language = VariableConvertor::GetString(env, argv[0], code);
1130         if (code == 1) {
1131             HILOG_ERROR_I18N("GetSimplifiedLanguage can't get string from js param");
1132             return nullptr;
1133         }
1134         code = 0;
1135         simplifiedLanguage = LocaleConfig::GetSimplifiedLanguage(language, code);
1136         if (code != 0) {
1137             HILOG_ERROR_I18N("GetSimplifiedLanguage: language is not valid");
1138             ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "language", "a valid language", true);
1139             return nullptr;
1140         }
1141     } else {
1142         simplifiedLanguage = LocaleConfig::GetSimplifiedSystemLanguage();
1143     }
1144 
1145     napi_value result = VariableConvertor::CreateString(env, simplifiedLanguage);
1146     if (!result) {
1147         HILOG_ERROR_I18N("GetSimplifiedLanguage: Failed to create string item");
1148     }
1149     return result;
1150 }
1151 
GetSystemLocaleInstance(napi_env env,napi_callback_info info)1152 napi_value I18nSystemAddon::GetSystemLocaleInstance(napi_env env, napi_callback_info info)
1153 {
1154     std::string locale = LocaleConfig::GetSystemLocaleInstanceTag();
1155     return VariableConvertor::CreateBuiltinsLocaleObject(env, locale);
1156 }
1157 
GetSystemCollations(napi_env env,napi_callback_info info)1158 napi_value I18nSystemAddon::GetSystemCollations(napi_env env, napi_callback_info info)
1159 {
1160     std::unordered_map<std::string, std::string> systemCollations;
1161     I18nErrorCode err = I18nServiceAbilityClient::GetSystemCollations(systemCollations);
1162     if (err == I18nErrorCode::NOT_SYSTEM_APP) {
1163         ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1164         return nullptr;
1165     }
1166     return VariableConvertor::CreateMap(env, systemCollations);
1167 }
1168 
GetUsingCollation(napi_env env,napi_callback_info info)1169 napi_value I18nSystemAddon::GetUsingCollation(napi_env env, napi_callback_info info)
1170 {
1171     std::string usingCollation;
1172     I18nErrorCode err = I18nServiceAbilityClient::GetUsingCollation(usingCollation);
1173     if (err == I18nErrorCode::NOT_SYSTEM_APP) {
1174         ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1175         return nullptr;
1176     }
1177     return VariableConvertor::CreateString(env, usingCollation);
1178 }
1179 
SetSystemCollation(napi_env env,napi_callback_info info)1180 napi_value I18nSystemAddon::SetSystemCollation(napi_env env, napi_callback_info info)
1181 {
1182     size_t argc = 1;
1183     napi_value argv[1] = { nullptr };
1184     napi_status status = napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1185     if (status != napi_ok) {
1186         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemCollation: Get cb info failed.");
1187         return nullptr;
1188     } else if (argc < 1) {
1189         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "identifier", "", true);
1190         return nullptr;
1191     }
1192 
1193     napi_valuetype valueType = napi_valuetype::napi_undefined;
1194     status = napi_typeof(env, argv[0], &valueType);
1195     if (status != napi_ok) {
1196         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemCollation: Failed to get type of argv[0].");
1197         return nullptr;
1198     } else if (valueType != napi_valuetype::napi_string) {
1199         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "identifier", "string", true);
1200         return nullptr;
1201     }
1202 
1203     int32_t code = 0;
1204     std::string identifier = VariableConvertor::GetString(env, argv[0], code);
1205     if (code != 0) {
1206         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemCollation: Get string from argv[0] failed.");
1207         return nullptr;
1208     }
1209 
1210     I18nErrorCode err = I18nServiceAbilityClient::SetSystemCollation(identifier);
1211     if (err == I18nErrorCode::SUCCESS) {
1212         return nullptr;
1213     }
1214     switch (err) {
1215         case I18nErrorCode::NOT_SYSTEM_APP:
1216             ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1217             break;
1218         case I18nErrorCode::NO_PERMISSION:
1219             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", true);
1220             break;
1221         case I18nErrorCode::INVALID_PARAM:
1222             ErrorUtil::NapiThrow(env, I18N_NOT_VALID_NEW, "identifier", "in a collation supported by the system",
1223                 true);
1224             break;
1225         default:
1226             HILOG_ERROR_I18N("I18nSystemAddon::SetSystemCollation: Set system collation failed.");
1227     }
1228     return nullptr;
1229 }
1230 
GetSystemNumberingSystems(napi_env env,napi_callback_info info)1231 napi_value I18nSystemAddon::GetSystemNumberingSystems(napi_env env, napi_callback_info info)
1232 {
1233     std::unordered_map<std::string, std::string> systemNumberingSystems;
1234     I18nErrorCode err = I18nServiceAbilityClient::GetSystemNumberingSystems(systemNumberingSystems);
1235     if (err == I18nErrorCode::NOT_SYSTEM_APP) {
1236         ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1237         return nullptr;
1238     }
1239     return VariableConvertor::CreateMap(env, systemNumberingSystems);
1240 }
1241 
GetUsingNumberingSystem(napi_env env,napi_callback_info info)1242 napi_value I18nSystemAddon::GetUsingNumberingSystem(napi_env env, napi_callback_info info)
1243 {
1244     std::string usingNumberingSystem;
1245     I18nErrorCode err = I18nServiceAbilityClient::GetUsingNumberingSystem(usingNumberingSystem);
1246     if (err == I18nErrorCode::NOT_SYSTEM_APP) {
1247         ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1248         return nullptr;
1249     }
1250     return VariableConvertor::CreateString(env, usingNumberingSystem);
1251 }
1252 
SetSystemNumberingSystem(napi_env env,napi_callback_info info)1253 napi_value I18nSystemAddon::SetSystemNumberingSystem(napi_env env, napi_callback_info info)
1254 {
1255     size_t argc = 1;
1256     napi_value argv[1] = { nullptr };
1257     napi_status status = napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1258     if (status != napi_ok) {
1259         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemNumberingSystem: Get cb info failed.");
1260         return nullptr;
1261     } else if (argc < 1) {
1262         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "identifier", "", true);
1263         return nullptr;
1264     }
1265 
1266     napi_valuetype valueType = napi_valuetype::napi_undefined;
1267     status = napi_typeof(env, argv[0], &valueType);
1268     if (status != napi_ok) {
1269         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemNumberingSystem: Failed to get type of argv[0].");
1270         return nullptr;
1271     } else if (valueType != napi_valuetype::napi_string) {
1272         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "identifier", "string", true);
1273         return nullptr;
1274     }
1275 
1276     int32_t code = 0;
1277     std::string identifier = VariableConvertor::GetString(env, argv[0], code);
1278     if (code != 0) {
1279         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemNumberingSystem: Get string from argv[0] failed.");
1280         return nullptr;
1281     }
1282 
1283     I18nErrorCode err = I18nServiceAbilityClient::SetSystemNumberingSystem(identifier);
1284     if (err == I18nErrorCode::SUCCESS) {
1285         return nullptr;
1286     }
1287     switch (err) {
1288         case I18nErrorCode::NOT_SYSTEM_APP:
1289             ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1290             break;
1291         case I18nErrorCode::NO_PERMISSION:
1292             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", true);
1293             break;
1294         case I18nErrorCode::INVALID_PARAM:
1295             ErrorUtil::NapiThrow(env, I18N_NOT_VALID_NEW, "identifier", "in a numbering system supported "
1296                 "by the system", true);
1297             break;
1298         default:
1299             HILOG_ERROR_I18N("I18nSystemAddon::SetSystemNumberingSystem: Set system numbering system failed.");
1300     }
1301     return nullptr;
1302 }
1303 
GetSystemNumberPatterns(napi_env env,napi_callback_info info)1304 napi_value I18nSystemAddon::GetSystemNumberPatterns(napi_env env, napi_callback_info info)
1305 {
1306     std::unordered_map<std::string, std::string> systemNumberPatterns;
1307     I18nErrorCode err = I18nServiceAbilityClient::GetSystemNumberPatterns(systemNumberPatterns);
1308     if (err == I18nErrorCode::NOT_SYSTEM_APP) {
1309         ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1310         return nullptr;
1311     }
1312     return VariableConvertor::CreateMap(env, systemNumberPatterns);
1313 }
1314 
GetUsingNumberPattern(napi_env env,napi_callback_info info)1315 napi_value I18nSystemAddon::GetUsingNumberPattern(napi_env env, napi_callback_info info)
1316 {
1317     std::string usingNumberPattern;
1318     I18nErrorCode err = I18nServiceAbilityClient::GetUsingNumberPattern(usingNumberPattern);
1319     if (err == I18nErrorCode::NOT_SYSTEM_APP) {
1320         ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1321         return nullptr;
1322     }
1323     return VariableConvertor::CreateString(env, usingNumberPattern);
1324 }
1325 
SetSystemNumberPattern(napi_env env,napi_callback_info info)1326 napi_value I18nSystemAddon::SetSystemNumberPattern(napi_env env, napi_callback_info info)
1327 {
1328     size_t argc = 1;
1329     napi_value argv[1] = { nullptr };
1330     napi_status status = napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1331     if (status != napi_ok) {
1332         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemNumberPattern: Get cb info failed.");
1333         return nullptr;
1334     } else if (argc < 1) {
1335         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "pattern", "", true);
1336         return nullptr;
1337     }
1338 
1339     napi_valuetype valueType = napi_valuetype::napi_undefined;
1340     status = napi_typeof(env, argv[0], &valueType);
1341     if (status != napi_ok) {
1342         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemNumberPattern: Failed to get type of argv[0].");
1343         return nullptr;
1344     } else if (valueType != napi_valuetype::napi_string) {
1345         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "pattern", "string", true);
1346         return nullptr;
1347     }
1348 
1349     int32_t code = 0;
1350     std::string pattern = VariableConvertor::GetString(env, argv[0], code);
1351     if (code != 0) {
1352         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemNumberPattern: Get string from argv[0] failed.");
1353         return nullptr;
1354     }
1355 
1356     I18nErrorCode err = I18nServiceAbilityClient::SetSystemNumberPattern(pattern);
1357     if (err == I18nErrorCode::SUCCESS) {
1358         return nullptr;
1359     }
1360     switch (err) {
1361         case I18nErrorCode::NOT_SYSTEM_APP:
1362             ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1363             break;
1364         case I18nErrorCode::NO_PERMISSION:
1365             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", true);
1366             break;
1367         case I18nErrorCode::INVALID_PARAM:
1368             ErrorUtil::NapiThrow(env, I18N_NOT_VALID_NEW, "pattern", "in a number pattern supported by the system",
1369                 true);
1370             break;
1371         default:
1372             HILOG_ERROR_I18N("I18nSystemAddon::SetSystemNumberPattern: Set system number pattern failed.");
1373     }
1374     return nullptr;
1375 }
1376 
GetSystemMeasurements(napi_env env,napi_callback_info info)1377 napi_value I18nSystemAddon::GetSystemMeasurements(napi_env env, napi_callback_info info)
1378 {
1379     std::unordered_map<std::string, std::string> systemMeasurements;
1380     I18nErrorCode err = I18nServiceAbilityClient::GetSystemMeasurements(systemMeasurements);
1381     if (err == I18nErrorCode::NOT_SYSTEM_APP) {
1382         ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1383         return nullptr;
1384     }
1385     return VariableConvertor::CreateMap(env, systemMeasurements);
1386 }
1387 
GetUsingMeasurement(napi_env env,napi_callback_info info)1388 napi_value I18nSystemAddon::GetUsingMeasurement(napi_env env, napi_callback_info info)
1389 {
1390     std::string usingMeasurement;
1391     I18nErrorCode err = I18nServiceAbilityClient::GetUsingMeasurement(usingMeasurement);
1392     if (err == I18nErrorCode::NOT_SYSTEM_APP) {
1393         ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1394         return nullptr;
1395     }
1396     return VariableConvertor::CreateString(env, usingMeasurement);
1397 }
1398 
SetSystemMeasurement(napi_env env,napi_callback_info info)1399 napi_value I18nSystemAddon::SetSystemMeasurement(napi_env env, napi_callback_info info)
1400 {
1401     size_t argc = 1;
1402     napi_value argv[1] = { nullptr };
1403     napi_status status = napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1404     if (status != napi_ok) {
1405         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemMeasurement: Get cb info failed.");
1406         return nullptr;
1407     } else if (argc < 1) {
1408         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "identifier", "", true);
1409         return nullptr;
1410     }
1411 
1412     napi_valuetype valueType = napi_valuetype::napi_undefined;
1413     status = napi_typeof(env, argv[0], &valueType);
1414     if (status != napi_ok) {
1415         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemMeasurement: Failed to get type of argv[0].");
1416         return nullptr;
1417     } else if (valueType != napi_valuetype::napi_string) {
1418         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "identifier", "string", true);
1419         return nullptr;
1420     }
1421 
1422     int32_t code = 0;
1423     std::string identifier = VariableConvertor::GetString(env, argv[0], code);
1424     if (code != 0) {
1425         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemMeasurement: Get string from argv[0] failed.");
1426         return nullptr;
1427     }
1428 
1429     I18nErrorCode err = I18nServiceAbilityClient::SetSystemMeasurement(identifier);
1430     if (err == I18nErrorCode::SUCCESS) {
1431         return nullptr;
1432     }
1433     switch (err) {
1434         case I18nErrorCode::NOT_SYSTEM_APP:
1435             ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1436             break;
1437         case I18nErrorCode::NO_PERMISSION:
1438             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", true);
1439             break;
1440         case I18nErrorCode::INVALID_PARAM:
1441             ErrorUtil::NapiThrow(env, I18N_NOT_VALID_NEW, "identifier", "in a measurement supported by the system",
1442                 true);
1443             break;
1444         default:
1445             HILOG_ERROR_I18N("I18nSystemAddon::SetSystemMeasurement: Set system measurement failed.");
1446     }
1447     return nullptr;
1448 }
1449 
GetSystemNumericalDatePatterns(napi_env env,napi_callback_info info)1450 napi_value I18nSystemAddon::GetSystemNumericalDatePatterns(napi_env env, napi_callback_info info)
1451 {
1452     std::unordered_map<std::string, std::string> numericalDatePatterns;
1453     I18nErrorCode err = I18nServiceAbilityClient::GetSystemNumericalDatePatterns(numericalDatePatterns);
1454     if (err == I18nErrorCode::NOT_SYSTEM_APP) {
1455         ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1456         return nullptr;
1457     }
1458     return VariableConvertor::CreateMap(env, numericalDatePatterns);
1459 }
1460 
GetUsingNumericalDatePattern(napi_env env,napi_callback_info info)1461 napi_value I18nSystemAddon::GetUsingNumericalDatePattern(napi_env env, napi_callback_info info)
1462 {
1463     std::string identifier;
1464     I18nErrorCode err = I18nServiceAbilityClient::GetUsingNumericalDatePattern(identifier);
1465     if (err == I18nErrorCode::NOT_SYSTEM_APP) {
1466         ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1467         return nullptr;
1468     }
1469     return VariableConvertor::CreateString(env, identifier);
1470 }
1471 
SetSystemNumericalDatePattern(napi_env env,napi_callback_info info)1472 napi_value I18nSystemAddon::SetSystemNumericalDatePattern(napi_env env, napi_callback_info info)
1473 {
1474     size_t argc = 1;
1475     napi_value argv[1] = { nullptr };
1476     napi_status status = napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1477     if (status != napi_ok) {
1478         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemNumericalDatePattern: Get cb info failed.");
1479         return nullptr;
1480     } else if (argc < 1) {
1481         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "identifier", "", true);
1482         return nullptr;
1483     }
1484 
1485     napi_valuetype valueType = napi_valuetype::napi_undefined;
1486     status = napi_typeof(env, argv[0], &valueType);
1487     if (status != napi_ok) {
1488         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemNumericalDatePattern: Failed to get type of argv[0].");
1489         return nullptr;
1490     } else if (valueType != napi_valuetype::napi_string) {
1491         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "identifier", "string", true);
1492         return nullptr;
1493     }
1494 
1495     int32_t code = 0;
1496     std::string identifier = VariableConvertor::GetString(env, argv[0], code);
1497     if (code != 0) {
1498         HILOG_ERROR_I18N("I18nSystemAddon::SetSystemNumericalDatePattern: Get string from argv[0] failed.");
1499         return nullptr;
1500     }
1501 
1502     I18nErrorCode err = I18nServiceAbilityClient::SetSystemNumericalDatePattern(identifier);
1503     if (err == I18nErrorCode::SUCCESS) {
1504         return nullptr;
1505     }
1506     switch (err) {
1507         case I18nErrorCode::NOT_SYSTEM_APP:
1508             ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1509             break;
1510         case I18nErrorCode::NO_PERMISSION:
1511             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", true);
1512             break;
1513         case I18nErrorCode::INVALID_PARAM:
1514             ErrorUtil::NapiThrow(env, I18N_NOT_VALID_NEW, "identifier", "in a numerical date pattern supported by "
1515                 "the system", true);
1516             break;
1517         default:
1518             HILOG_ERROR_I18N(
1519                 "I18nSystemAddon::SetSystemNumericalDatePattern: Set system numerical date pattern failed.");
1520     }
1521     return nullptr;
1522 }
1523 } // namespace I18n
1524 } // namespace Global
1525 } // namespace OHOS