• 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     };
81     napi_value constructor = nullptr;
82     napi_status status = napi_define_class(env, "System", NAPI_AUTO_LENGTH, JSUtils::DefaultConstructor, nullptr,
83         sizeof(properties) / sizeof(napi_property_descriptor), properties, &constructor);
84     if (status != napi_ok) {
85         HILOG_ERROR_I18N("Define class failed when InitSystem.");
86         return nullptr;
87     }
88 
89     status = napi_set_named_property(env, exports, "System", constructor);
90     if (status != napi_ok) {
91         HILOG_ERROR_I18N("Set property failed when InitSystem.");
92         return nullptr;
93     }
94     return exports;
95 }
96 
GetDisplayCountry(napi_env env,napi_callback_info info)97 napi_value I18nSystemAddon::GetDisplayCountry(napi_env env, napi_callback_info info)
98 {
99     return I18nSystemAddon::GetDisplayCountryImpl(env, info, false);
100 }
101 
GetDisplayCountryWithError(napi_env env,napi_callback_info info)102 napi_value I18nSystemAddon::GetDisplayCountryWithError(napi_env env, napi_callback_info info)
103 {
104     return I18nSystemAddon::GetDisplayCountryImpl(env, info, true);
105 }
106 
GetDisplayLanguage(napi_env env,napi_callback_info info)107 napi_value I18nSystemAddon::GetDisplayLanguage(napi_env env, napi_callback_info info)
108 {
109     return I18nSystemAddon::GetDisplayLanguageImpl(env, info, false);
110 }
111 
GetDisplayLanguageWithError(napi_env env,napi_callback_info info)112 napi_value I18nSystemAddon::GetDisplayLanguageWithError(napi_env env, napi_callback_info info)
113 {
114     return I18nSystemAddon::GetDisplayLanguageImpl(env, info, true);
115 }
116 
GetSystemLanguages(napi_env env,napi_callback_info info)117 napi_value I18nSystemAddon::GetSystemLanguages(napi_env env, napi_callback_info info)
118 {
119     std::unordered_set<std::string> systemLanguages = LocaleConfig::GetSystemLanguages();
120     napi_value result = nullptr;
121     napi_status status = napi_create_array_with_length(env, systemLanguages.size(), &result);
122     if (status != napi_ok) {
123         HILOG_ERROR_I18N("GetSystemLanguages: Failed to create array");
124         return nullptr;
125     }
126     size_t pos = 0;
127     for (const auto& language : systemLanguages) {
128         napi_value value = nullptr;
129         status = napi_create_string_utf8(env, language.c_str(), NAPI_AUTO_LENGTH, &value);
130         if (status != napi_ok) {
131             HILOG_ERROR_I18N("GetSystemLanguages: Failed to create string item");
132             return nullptr;
133         }
134         status = napi_set_element(env, result, pos, value);
135         if (status != napi_ok) {
136             HILOG_ERROR_I18N("GetSystemLanguages: Failed to set array item");
137             return nullptr;
138         }
139         pos++;
140     }
141     return result;
142 }
143 
GetSystemCountries(napi_env env,napi_callback_info info)144 napi_value I18nSystemAddon::GetSystemCountries(napi_env env, napi_callback_info info)
145 {
146     return I18nSystemAddon::GetSystemCountriesImpl(env, info, false);
147 }
148 
GetSystemCountriesWithError(napi_env env,napi_callback_info info)149 napi_value I18nSystemAddon::GetSystemCountriesWithError(napi_env env, napi_callback_info info)
150 {
151     return I18nSystemAddon::GetSystemCountriesImpl(env, info, true);
152 }
153 
IsSuggested(napi_env env,napi_callback_info info)154 napi_value I18nSystemAddon::IsSuggested(napi_env env, napi_callback_info info)
155 {
156     return I18nSystemAddon::IsSuggestedImpl(env, info, false);
157 }
158 
IsSuggestedWithError(napi_env env,napi_callback_info info)159 napi_value I18nSystemAddon::IsSuggestedWithError(napi_env env, napi_callback_info info)
160 {
161     return I18nSystemAddon::IsSuggestedImpl(env, info, true);
162 }
163 
GetSystemLanguage(napi_env env,napi_callback_info info)164 napi_value I18nSystemAddon::GetSystemLanguage(napi_env env, napi_callback_info info)
165 {
166     std::string value = LocaleConfig::GetSystemLanguage();
167     napi_value result = nullptr;
168     napi_status status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
169     if (status != napi_ok) {
170         HILOG_ERROR_I18N("GetSystemLanguage: Failed to create string item");
171         return nullptr;
172     }
173     return result;
174 }
175 
SetSystemLanguage(napi_env env,napi_callback_info info)176 napi_value I18nSystemAddon::SetSystemLanguage(napi_env env, napi_callback_info info)
177 {
178     return I18nSystemAddon::SetSystemLanguageImpl(env, info, false);
179 }
180 
SetSystemLanguageWithError(napi_env env,napi_callback_info info)181 napi_value I18nSystemAddon::SetSystemLanguageWithError(napi_env env, napi_callback_info info)
182 {
183     return I18nSystemAddon::SetSystemLanguageImpl(env, info, true);
184 }
185 
GetSystemRegion(napi_env env,napi_callback_info info)186 napi_value I18nSystemAddon::GetSystemRegion(napi_env env, napi_callback_info info)
187 {
188     std::string value = LocaleConfig::GetSystemRegion();
189     napi_value result = nullptr;
190     napi_status status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
191     if (status != napi_ok) {
192         HILOG_ERROR_I18N("GetSystemRegion: Failed to create string item");
193         return nullptr;
194     }
195     return result;
196 }
197 
SetSystemRegion(napi_env env,napi_callback_info info)198 napi_value I18nSystemAddon::SetSystemRegion(napi_env env, napi_callback_info info)
199 {
200     return I18nSystemAddon::SetSystemRegionImpl(env, info, false);
201 }
202 
SetSystemRegionWithError(napi_env env,napi_callback_info info)203 napi_value I18nSystemAddon::SetSystemRegionWithError(napi_env env, napi_callback_info info)
204 {
205     return I18nSystemAddon::SetSystemRegionImpl(env, info, true);
206 }
207 
GetSystemLocale(napi_env env,napi_callback_info info)208 napi_value I18nSystemAddon::GetSystemLocale(napi_env env, napi_callback_info info)
209 {
210     std::string value = LocaleConfig::GetSystemLocale();
211     napi_value result = nullptr;
212     napi_status status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
213     if (status != napi_ok) {
214         HILOG_ERROR_I18N("GetSystemLocale: Failed to create string item");
215         return nullptr;
216     }
217     return result;
218 }
219 
SetSystemLocale(napi_env env,napi_callback_info info)220 napi_value I18nSystemAddon::SetSystemLocale(napi_env env, napi_callback_info info)
221 {
222     return I18nSystemAddon::SetSystemLocaleImpl(env, info, false);
223 }
224 
SetSystemLocaleWithError(napi_env env,napi_callback_info info)225 napi_value I18nSystemAddon::SetSystemLocaleWithError(napi_env env, napi_callback_info info)
226 {
227     return I18nSystemAddon::SetSystemLocaleImpl(env, info, true);
228 }
229 
Is24HourClock(napi_env env,napi_callback_info info)230 napi_value I18nSystemAddon::Is24HourClock(napi_env env, napi_callback_info info)
231 {
232     bool is24HourClock = LocaleConfig::Is24HourClock();
233     napi_value result = nullptr;
234     napi_status status = napi_get_boolean(env, is24HourClock, &result);
235     if (status != napi_ok) {
236         HILOG_ERROR_I18N("Failed to create boolean item");
237         return nullptr;
238     }
239     return result;
240 }
241 
Set24HourClock(napi_env env,napi_callback_info info)242 napi_value I18nSystemAddon::Set24HourClock(napi_env env, napi_callback_info info)
243 {
244     return I18nSystemAddon::Set24HourClockImpl(env, info, false);
245 }
246 
Set24HourClockWithError(napi_env env,napi_callback_info info)247 napi_value I18nSystemAddon::Set24HourClockWithError(napi_env env, napi_callback_info info)
248 {
249     return I18nSystemAddon::Set24HourClockImpl(env, info, true);
250 }
251 
AddPreferredLanguage(napi_env env,napi_callback_info info)252 napi_value I18nSystemAddon::AddPreferredLanguage(napi_env env, napi_callback_info info)
253 {
254     return I18nSystemAddon::AddPreferredLanguageImpl(env, info, false);
255 }
256 
AddPreferredLanguageWithError(napi_env env,napi_callback_info info)257 napi_value I18nSystemAddon::AddPreferredLanguageWithError(napi_env env, napi_callback_info info)
258 {
259     return I18nSystemAddon::AddPreferredLanguageImpl(env, info, true);
260 }
261 
RemovePreferredLanguage(napi_env env,napi_callback_info info)262 napi_value I18nSystemAddon::RemovePreferredLanguage(napi_env env, napi_callback_info info)
263 {
264     return I18nSystemAddon::RemovePreferredLanguageImpl(env, info, false);
265 }
266 
RemovePreferredLanguageWithError(napi_env env,napi_callback_info info)267 napi_value I18nSystemAddon::RemovePreferredLanguageWithError(napi_env env, napi_callback_info info)
268 {
269     return I18nSystemAddon::RemovePreferredLanguageImpl(env, info, true);
270 }
271 
GetPreferredLanguageList(napi_env env,napi_callback_info info)272 napi_value I18nSystemAddon::GetPreferredLanguageList(napi_env env, napi_callback_info info)
273 {
274     std::vector<std::string> languageList = PreferredLanguage::GetPreferredLanguageList();
275     napi_value result = nullptr;
276     napi_status status = napi_ok;
277     status = napi_create_array_with_length(env, languageList.size(), &result);
278     if (status != napi_ok) {
279         HILOG_ERROR_I18N("getPreferrdLanguageList: create array failed");
280         return nullptr;
281     }
282     for (size_t i = 0; i < languageList.size(); i++) {
283         napi_value value = nullptr;
284         status = napi_create_string_utf8(env, languageList[i].c_str(), NAPI_AUTO_LENGTH, &value);
285         if (status != napi_ok) {
286             HILOG_ERROR_I18N("getPreferrdLanguageList: create string failed");
287             return nullptr;
288         }
289         status = napi_set_element(env, result, i, value);
290         if (status != napi_ok) {
291             HILOG_ERROR_I18N("GetPreferredLanguageList: set array item failed");
292             return nullptr;
293         }
294     }
295     return result;
296 }
297 
GetFirstPreferredLanguage(napi_env env,napi_callback_info info)298 napi_value I18nSystemAddon::GetFirstPreferredLanguage(napi_env env, napi_callback_info info)
299 {
300     std::string language = PreferredLanguage::GetFirstPreferredLanguage();
301     napi_value result = nullptr;
302     napi_status status = napi_ok;
303     status = napi_create_string_utf8(env, language.c_str(), NAPI_AUTO_LENGTH, &result);
304     if (status != napi_ok) {
305         HILOG_ERROR_I18N("getFirstPreferrdLanguage: create string result failed");
306         return nullptr;
307     }
308     return result;
309 }
310 
SetAppPreferredLanguage(napi_env env,napi_callback_info info)311 napi_value I18nSystemAddon::SetAppPreferredLanguage(napi_env env, napi_callback_info info)
312 {
313     size_t argc = 1;
314     napi_value argv[1] = { 0 };
315     napi_value thisVar = nullptr;
316     void *data = nullptr;
317     napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
318     napi_valuetype valueType = napi_valuetype::napi_undefined;
319     napi_typeof(env, argv[0], &valueType);
320     if (valueType != napi_valuetype::napi_string) {
321         HILOG_ERROR_I18N("SetAppPreferredLanguage Parameter type is not string");
322         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "string", true);
323         return nullptr;
324     }
325     int code = 0;
326     std::string localeTag = VariableConvertor::GetString(env, argv[0], code);
327     if (code) {
328         HILOG_ERROR_I18N("SetAppPreferredLanguage can't get string from js param");
329         return nullptr;
330     }
331     UErrorCode icuStatus = U_ZERO_ERROR;
332     icu::Locale locale = icu::Locale::forLanguageTag(localeTag.data(), icuStatus);
333     if (U_FAILURE(icuStatus) || !(IsValidLocaleTag(locale) || localeTag.compare("default") == 0)) {
334         HILOG_ERROR_I18N("SetAppPreferredLanguage does not support this locale");
335         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "language", "a valid language", true);
336         return nullptr;
337     }
338 #ifdef SUPPORT_APP_PREFERRED_LANGUAGE
339     I18nErrorCode errCode = I18nErrorCode::SUCCESS;
340     PreferredLanguage::SetAppPreferredLanguage(localeTag, errCode);
341     if (errCode != I18nErrorCode::SUCCESS) {
342         HILOG_ERROR_I18N("SetAppPreferredLanguage: set app language to i18n app preferences failed.");
343     }
344 #endif
345     return nullptr;
346 }
347 
GetAppPreferredLanguage(napi_env env,napi_callback_info info)348 napi_value I18nSystemAddon::GetAppPreferredLanguage(napi_env env, napi_callback_info info)
349 {
350 #ifdef SUPPORT_APP_PREFERRED_LANGUAGE
351     std::string language = PreferredLanguage::GetAppPreferredLanguage();
352 #else
353     std::string language = PreferredLanguage::GetFirstPreferredLanguage();
354 #endif
355     napi_value result = nullptr;
356     napi_status status = napi_ok;
357     status = napi_create_string_utf8(env, language.c_str(), NAPI_AUTO_LENGTH, &result);
358     if (status != napi_ok) {
359         HILOG_ERROR_I18N("getAppPreferrdLanguage: create string result failed");
360         return nullptr;
361     }
362     return result;
363 }
364 
SetUsingLocalDigitAddon(napi_env env,napi_callback_info info)365 napi_value I18nSystemAddon::SetUsingLocalDigitAddon(napi_env env, napi_callback_info info)
366 {
367     return I18nSystemAddon::SetUsingLocalDigitAddonImpl(env, info, false);
368 }
369 
SetUsingLocalDigitAddonWithError(napi_env env,napi_callback_info info)370 napi_value I18nSystemAddon::SetUsingLocalDigitAddonWithError(napi_env env, napi_callback_info info)
371 {
372     return I18nSystemAddon::SetUsingLocalDigitAddonImpl(env, info, true);
373 }
374 
GetUsingLocalDigitAddon(napi_env env,napi_callback_info info)375 napi_value I18nSystemAddon::GetUsingLocalDigitAddon(napi_env env, napi_callback_info info)
376 {
377     bool res = LocaleConfig::GetUsingLocalDigit();
378     napi_value value = nullptr;
379     napi_status status = napi_get_boolean(env, res, &value);
380     if (status != napi_ok) {
381         return nullptr;
382     }
383     return value;
384 }
385 
GetDisplayCountryImpl(napi_env env,napi_callback_info info,bool throwError)386 napi_value I18nSystemAddon::GetDisplayCountryImpl(napi_env env, napi_callback_info info, bool throwError)
387 {
388     // Need to get three parameters to get the display country.
389     size_t argc = 3;
390     napi_value argv[3] = { nullptr };
391     napi_value thisVar = nullptr;
392     void *data = nullptr;
393     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
394     if (status != napi_ok) {
395         return VariableConvertor::CreateString(env, "");
396     } else if (argc < FUNC_ARGS_COUNT) {
397         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "country or locale", throwError);
398         return VariableConvertor::CreateString(env, "");
399     }
400     size_t len = 0;
401     VariableConvertor::VerifyType(env, "country", napi_valuetype::napi_string, argv[0]);
402     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
403     std::vector<char> localeBuf(len + 1);
404     if (!GetCountryNapiValueWithError(env, argv[0], len, localeBuf.data(), "0")) {
405         return VariableConvertor::CreateString(env, "");
406     }
407     VariableConvertor::VerifyType(env, "locale", napi_valuetype::napi_string, argv[1]);
408     napi_get_value_string_utf8(env, argv[1], nullptr, 0, &len);
409     std::vector<char> displayLocaleBuf(len + 1);
410     if (!GetCountryNapiValueWithError(env, argv[1], len, displayLocaleBuf.data(), "1")) {
411         return VariableConvertor::CreateString(env, "");
412     }
413     LocaleInfo localeInfo(localeBuf.data());
414     if (!LocaleConfig::IsValidRegion(localeBuf.data()) && localeInfo.GetRegion().empty()) {
415         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "country", "a valid region", throwError);
416         return VariableConvertor::CreateString(env, "");
417     } else if (!LocaleConfig::IsValidTag(displayLocaleBuf.data())) {
418         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "locale", "a valid locale", throwError);
419         return VariableConvertor::CreateString(env, "");
420     }
421     bool sentenceCase = true;
422     if (argc > FUNC_ARGS_COUNT) {
423         napi_get_value_bool(env, argv[FUNC_ARGS_COUNT], &sentenceCase);
424     }
425     std::string value = LocaleConfig::GetDisplayRegion(localeBuf.data(), displayLocaleBuf.data(), sentenceCase);
426     if (value.length() == 0) {
427         HILOG_ERROR_I18N("GetDisplayCountryImpl: result is empty.");
428         return VariableConvertor::CreateString(env, "");
429     }
430     napi_value result = nullptr;
431     status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
432     if (status != napi_ok) {
433         HILOG_ERROR_I18N("GetDisplayCountryImpl: Failed to create string item");
434         return VariableConvertor::CreateString(env, "");
435     }
436     return result;
437 }
438 
GetCountryNapiValueWithError(napi_env env,napi_value napiValue,size_t len,char * valueBuf,std::string index)439 bool I18nSystemAddon::GetCountryNapiValueWithError(napi_env env, napi_value napiValue, size_t len, char* valueBuf,
440     std::string index)
441 {
442     napi_status status = napi_get_value_string_utf8(env, napiValue, valueBuf, len + 1, &len);
443     if (status != napi_ok) {
444         HILOG_ERROR_I18N("GetDisplayCountryImpl: Failed to get string item argv[%{public}s]", index.c_str());
445         return false;
446     }
447     return true;
448 }
449 
GetDisplayLanguageImpl(napi_env env,napi_callback_info info,bool throwError)450 napi_value I18nSystemAddon::GetDisplayLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
451 {
452     // Need to get three parameters to get the display Language.
453     size_t argc = 3;
454     napi_value argv[3] = { nullptr };
455     napi_value thisVar = nullptr;
456     void *data = nullptr;
457     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
458     if (status != napi_ok) {
459         return nullptr;
460     } else if (argc < FUNC_ARGS_COUNT) {
461         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "language or locale", throwError);
462         return nullptr;
463     }
464     VariableConvertor::VerifyType(env, "language", napi_valuetype::napi_string, argv[0]);
465     size_t len = 0;
466     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
467     std::vector<char> localeBuf(len + 1);
468     if (!GetNapiStringValueWithError(env, argv[0], len, localeBuf.data(), "0")) {
469         return nullptr;
470     }
471     VariableConvertor::VerifyType(env, "locale", napi_valuetype::napi_string, argv[1]);
472     napi_get_value_string_utf8(env, argv[1], nullptr, 0, &len);
473     std::vector<char> displayLocaleBuf(len + 1);
474     if (!GetNapiStringValueWithError(env, argv[1], len, displayLocaleBuf.data(), "1")) {
475         return nullptr;
476     }
477     if (!LocaleConfig::IsValidTag(displayLocaleBuf.data())) {
478         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "locale", "a valid locale", throwError);
479         return nullptr;
480     }
481     bool sentenceCase = true;
482     if (argc > FUNC_ARGS_COUNT) {
483         napi_get_value_bool(env, argv[FUNC_ARGS_COUNT], &sentenceCase);
484     }
485     std::string value = LocaleConfig::GetDisplayLanguage(localeBuf.data(), displayLocaleBuf.data(), sentenceCase);
486     if (value.length() == 0) {
487         HILOG_ERROR_I18N("GetDisplayLanguageImpl: result is empty.");
488         return nullptr;
489     }
490     napi_value result = nullptr;
491     status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
492     if (status != napi_ok) {
493         HILOG_ERROR_I18N("GetDisplayLanguageImpl: Failed to create string item");
494         return nullptr;
495     }
496     return result;
497 }
498 
GetNapiStringValueWithError(napi_env env,napi_value napiValue,size_t len,char * valueBuf,std::string index)499 bool I18nSystemAddon::GetNapiStringValueWithError(napi_env env, napi_value napiValue, size_t len, char* valueBuf,
500     std::string index)
501 {
502     napi_status status = napi_get_value_string_utf8(env, napiValue, valueBuf, len + 1, &len);
503     if (status != napi_ok) {
504         HILOG_ERROR_I18N("GetDisplayLanguageImpl: Failed to get string item argv[%{public}s]", index.c_str());
505         return false;
506     }
507     return true;
508 }
509 
GetSystemCountriesImpl(napi_env env,napi_callback_info info,bool throwError)510 napi_value I18nSystemAddon::GetSystemCountriesImpl(napi_env env, napi_callback_info info, bool throwError)
511 {
512     size_t argc = 1;
513     napi_value argv[1] = { nullptr };
514     napi_value thisVar = nullptr;
515     void *data = nullptr;
516     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
517     if (status != napi_ok) {
518         return nullptr;
519     } else if (argc < 1) {
520         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "language", throwError);
521         return nullptr;
522     }
523     VariableConvertor::VerifyType(env, "language", napi_valuetype::napi_string, argv[0]);
524     int32_t code = 0;
525     std::string language = VariableConvertor::GetString(env, argv[0], code);
526     if (code != 0) {
527         HILOG_ERROR_I18N("GetSystemCountriesImpl: Get argv[0] failed.");
528         return nullptr;
529     }
530     std::unordered_set<std::string> systemCountries = LocaleConfig::GetSystemCountries(language);
531     napi_value result = nullptr;
532     status = napi_create_array_with_length(env, systemCountries.size(), &result);
533     if (status != napi_ok) {
534         HILOG_ERROR_I18N("GetSystemCountriesImpl: Failed to create array");
535         return nullptr;
536     }
537     size_t pos = 0;
538     for (const auto& country : systemCountries) {
539         napi_value value = nullptr;
540         status = napi_create_string_utf8(env, country.c_str(), NAPI_AUTO_LENGTH, &value);
541         if (status != napi_ok) {
542             HILOG_ERROR_I18N("GetSystemCountries: Failed to create string item");
543             return nullptr;
544         }
545         status = napi_set_element(env, result, pos, value);
546         if (status != napi_ok) {
547             HILOG_ERROR_I18N("GetSystemCountries: Failed to set array item");
548             return nullptr;
549         }
550         pos++;
551     }
552     return result;
553 }
554 
GetApiCheckResult()555 bool I18nSystemAddon::GetApiCheckResult()
556 {
557     ApiCompareResult result = ApiVersion::CheckApiTargetVersion("isSuggested");
558     return result == ApiCompareResult::GREATER_THAN;
559 }
560 
IsSuggestedImpl(napi_env env,napi_callback_info info,bool throwError)561 napi_value I18nSystemAddon::IsSuggestedImpl(napi_env env, napi_callback_info info, bool throwError)
562 {
563     // Need to get two parameters to check is suggested or not.
564     size_t argc = 2;
565     napi_value argv[2] = { nullptr };
566     napi_value thisVar = nullptr;
567     void *data = nullptr;
568     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
569     if (status != napi_ok) {
570         return nullptr;
571     } else if (argc < 1) {
572         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "language", throwError);
573         return nullptr;
574     }
575     VariableConvertor::VerifyType(env, "language", napi_valuetype::napi_string, argv[0]);
576     int32_t code = 0;
577     std::string language = VariableConvertor::GetString(env, argv[0], code);
578     if (code != 0) {
579         HILOG_ERROR_I18N("IsSuggestedImpl: Failed to get string argv[0].");
580         return nullptr;
581     }
582     bool isSuggested = false;
583     if (VariableConvertor::CheckNapiIsNull(env, argv[1])) {
584         std::string region = VariableConvertor::GetString(env, argv[1], code);
585         if (code != 0) {
586             HILOG_ERROR_I18N("IsSuggestedImpl: Failed to get string argv[1].");
587             return nullptr;
588         }
589         isSuggested = LocaleConfig::IsSuggestedV15(language, region);
590     } else {
591         isSuggested = LocaleConfig::IsSuggestedV15(language);
592     }
593     napi_value result = nullptr;
594     status = napi_get_boolean(env, isSuggested, &result);
595     if (status != napi_ok) {
596         HILOG_ERROR_I18N("Create case first boolean value failed");
597         return nullptr;
598     }
599     return result;
600 }
601 
IsSuggestedByApiVersion(const std::string & language,bool newApi)602 bool I18nSystemAddon::IsSuggestedByApiVersion(const std::string &language, bool newApi)
603 {
604     if (newApi) {
605         return LocaleConfig::IsSuggested(language);
606     }
607     return LocaleConfig::IsSuggestedV15(language);
608 }
609 
IsSuggestedByApiVersion(const std::string & language,const std::string & region,bool newApi)610 bool I18nSystemAddon::IsSuggestedByApiVersion(const std::string &language,
611     const std::string &region, bool newApi)
612 {
613     if (newApi) {
614         return LocaleConfig::IsSuggested(language, region);
615     }
616     return LocaleConfig::IsSuggestedV15(language, region);
617 }
618 
SetSystemLanguageImpl(napi_env env,napi_callback_info info,bool throwError)619 napi_value I18nSystemAddon::SetSystemLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
620 {
621     size_t argc = 1;
622     napi_value argv[1] = { 0 };
623     napi_value thisVar = nullptr;
624     void *data = nullptr;
625     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
626     if (status != napi_ok) {
627         return nullptr;
628     }
629     if (argc < 1) {
630         HILOG_ERROR_I18N("SetSystemLanguageImpl: Missing parameter");
631         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "language", throwError);
632         return nullptr;
633     }
634     size_t len = 0;
635     status = napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
636     if (status != napi_ok) {
637         HILOG_ERROR_I18N("SetSystemLanguageImpl: Failed to get string len argv[0].");
638         return nullptr;
639     }
640     std::vector<char> languageBuf(len + 1);
641     status = napi_get_value_string_utf8(env, argv[0], languageBuf.data(), len + 1, &len);
642     if (status != napi_ok) {
643         HILOG_ERROR_I18N("SetSystemLanguageImpl: Failed to get string item");
644         return nullptr;
645     }
646     I18nErrorCode err = I18nServiceAbilityClient::SetSystemLanguage(languageBuf.data());
647     HILOG_INFO_I18N("I18nSystemAddon::SetSystemLanguageImpl with code %{public}d", static_cast<int32_t>(err));
648     bool success = err == I18nErrorCode::SUCCESS;
649     if (throwError) {
650         if (!success) {
651             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
652         }
653         return nullptr;
654     }
655     napi_value result = nullptr;
656     status = napi_get_boolean(env, success, &result);
657     if (status != napi_ok) {
658         HILOG_ERROR_I18N("SetSystemLanguageImpl: Create set system language boolean value failed");
659         return nullptr;
660     }
661     return result;
662 }
663 
SetSystemRegionImpl(napi_env env,napi_callback_info info,bool throwError)664 napi_value I18nSystemAddon::SetSystemRegionImpl(napi_env env, napi_callback_info info, bool throwError)
665 {
666     size_t argc = 1;
667     napi_value argv[1] = { nullptr };
668     napi_value thisVar = nullptr;
669     void *data = nullptr;
670     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
671     if (status != napi_ok) {
672         return nullptr;
673     }
674     if (argc < 1) {
675         HILOG_ERROR_I18N("SetSystemRegionImpl: Missing parameter");
676         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "region", throwError);
677         return nullptr;
678     }
679     size_t len = 0;
680     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
681     std::vector<char> regionBuf(len + 1);
682     status = napi_get_value_string_utf8(env, argv[0], regionBuf.data(), len + 1, &len);
683     if (status != napi_ok) {
684         HILOG_ERROR_I18N("SetSystemRegionImpl: Failed to get string item");
685         return nullptr;
686     }
687     I18nErrorCode err = I18nServiceAbilityClient::SetSystemRegion(regionBuf.data());
688     HILOG_INFO_I18N("I18nSystemAddon::SetSystemRegionImpl with code %{public}d", static_cast<int32_t>(err));
689     bool success = err == I18nErrorCode::SUCCESS;
690     if (throwError) {
691         if (!success) {
692             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
693         }
694         return nullptr;
695     }
696     napi_value result = nullptr;
697     status = napi_get_boolean(env, success, &result);
698     if (status != napi_ok) {
699         HILOG_ERROR_I18N("SetSystemRegionImpl: Create set system language boolean value failed");
700         return nullptr;
701     }
702     return result;
703 }
704 
SetSystemLocaleImpl(napi_env env,napi_callback_info info,bool throwError)705 napi_value I18nSystemAddon::SetSystemLocaleImpl(napi_env env, napi_callback_info info, bool throwError)
706 {
707     size_t argc = 1;
708     napi_value argv[1] = { nullptr };
709     napi_value thisVar = nullptr;
710     void *data = nullptr;
711     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
712     if (status != napi_ok) {
713         return nullptr;
714     }
715     if (argc < 1) {
716         HILOG_ERROR_I18N("SetSystemLocaleImpl: Missing parameter");
717         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "locale", throwError);
718         return nullptr;
719     }
720     size_t len = 0;
721     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
722     std::vector<char> localeBuf(len + 1);
723     status = napi_get_value_string_utf8(env, argv[0], localeBuf.data(), len + 1, &len);
724     if (status != napi_ok) {
725         HILOG_ERROR_I18N("SetSystemLocaleImpl: Failed to get string item");
726         return nullptr;
727     }
728     I18nErrorCode err = I18nServiceAbilityClient::SetSystemLocale(localeBuf.data());
729     HILOG_INFO_I18N("I18nSystemAddon::SetSystemLocaleImpl with code %{public}d", static_cast<int32_t>(err));
730     bool success = err == I18nErrorCode::SUCCESS;
731     if (throwError) {
732         if (!success) {
733             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
734         }
735         return nullptr;
736     }
737     napi_value result = nullptr;
738     status = napi_get_boolean(env, success, &result);
739     if (status != napi_ok) {
740         HILOG_ERROR_I18N("SetSystemLocaleImpl: Create set system language boolean value failed");
741         return nullptr;
742     }
743     return result;
744 }
745 
Set24HourClockImpl(napi_env env,napi_callback_info info,bool throwError)746 napi_value I18nSystemAddon::Set24HourClockImpl(napi_env env, napi_callback_info info, bool throwError)
747 {
748     size_t argc = 1;
749     napi_value argv[1] = { nullptr };
750     napi_value thisVar = nullptr;
751     void *data = nullptr;
752     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
753     if (status != napi_ok) {
754         return nullptr;
755     }
756     if (argc < 1) {
757         HILOG_ERROR_I18N("Set24HourClockImpl: Missing parameter");
758         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "option", throwError);
759         return nullptr;
760     }
761 
762     bool option = false;
763     status = napi_get_value_bool(env, argv[0], &option);
764     if (status != napi_ok) {
765         HILOG_ERROR_I18N("Set24HourClockImpl: Failed to get boolean item");
766         return nullptr;
767     }
768     std::string optionStr = option ? "true" : "false";
769     I18nErrorCode err = I18nServiceAbilityClient::Set24HourClock(optionStr);
770     HILOG_INFO_I18N("I18nSystemAddon::Set24HourClock with code %{public}d", static_cast<int32_t>(err));
771     bool success = err == I18nErrorCode::SUCCESS;
772     if (throwError) {
773         if (!success) {
774             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
775         }
776         return nullptr;
777     }
778     napi_value result = nullptr;
779     status = napi_get_boolean(env, success, &result);
780     if (status != napi_ok) {
781         HILOG_ERROR_I18N("Create set 24HourClock boolean value failed");
782         return nullptr;
783     }
784     return result;
785 }
786 
AddPreferredLanguageImpl(napi_env env,napi_callback_info info,bool throwError)787 napi_value I18nSystemAddon::AddPreferredLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
788 {
789     size_t argc = 2;
790     napi_value argv[2] = { 0 };
791     napi_value thisVar = nullptr;
792     void *data = nullptr;
793     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
794     if (status != napi_ok) {
795         return nullptr;
796     }
797 
798     std::string language;
799     if (!ParseStringParam(env, argc > 0 ? argv[0] : nullptr, throwError, language)) {
800         return nullptr;
801     }
802 
803     int index = 1000000;
804     if (VariableConvertor::CheckNapiIsNull(env, argc > 1 ? argv[1] : nullptr)) {
805         status = napi_get_value_int32(env, argv[1], &index);
806         if (status != napi_ok) {
807             HILOG_ERROR_I18N("addPreferrdLanguage: get index failed");
808             return nullptr;
809         }
810     }
811     I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage(language.data(), index);
812     HILOG_INFO_I18N("I18nSystemAddon::AddPreferredLanguageImpl with code %{public}d", static_cast<int32_t>(err));
813     if (throwError) {
814         if (err == I18nErrorCode::NO_PERMISSION || err == I18nErrorCode::NOT_SYSTEM_APP) {
815             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
816         }
817         if (err != I18nErrorCode::SUCCESS) {
818             ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "language", "a valid language", throwError);
819         }
820         return nullptr;
821     }
822     bool addResult = true;
823     if (err != I18nErrorCode::SUCCESS) {
824         addResult = false;
825     }
826     napi_value result = nullptr;
827     status = napi_get_boolean(env, addResult, &result);
828     if (status != napi_ok) {
829         HILOG_ERROR_I18N("addPreferrdLanguage: create boolean result failed");
830         return nullptr;
831     }
832     return result;
833 }
834 
RemovePreferredLanguageImpl(napi_env env,napi_callback_info info,bool throwError)835 napi_value I18nSystemAddon::RemovePreferredLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
836 {
837     size_t argc = 1;
838     napi_value argv[1] = { nullptr };
839     napi_value thisVar = nullptr;
840     void *data = nullptr;
841     int len = 0;
842     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
843     if (status != napi_ok) {
844         return nullptr;
845     }
846     if (argc < 1) {
847         HILOG_ERROR_I18N("RemovePreferredLanguageImpl: Missing parameter");
848         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "index", throwError);
849         return nullptr;
850     }
851 
852     napi_valuetype valueType = napi_valuetype::napi_undefined;
853     napi_typeof(env, argv[0], &valueType);
854     if (valueType != napi_valuetype::napi_number) {
855         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "index", "number", throwError);
856         return nullptr;
857     }
858     int index = 1000000;
859     status = napi_get_value_int32(env, argv[0], &index);
860     if (status != napi_ok) {
861         HILOG_ERROR_I18N("removePreferrdLanguage: get index failed");
862         return nullptr;
863     }
864     len = static_cast<int>(PreferredLanguage::GetPreferredLanguageList().size());
865     if ((index < 0 || index > len - 1) && throwError) {
866         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "index", "within the valid range", throwError);
867         return nullptr;
868     }
869     I18nErrorCode err = I18nServiceAbilityClient::RemovePreferredLanguage(index);
870     bool success = err == I18nErrorCode::SUCCESS;
871 
872     if (throwError) {
873         if (!success) {
874             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
875         }
876         return nullptr;
877     }
878     napi_value result = nullptr;
879     status = napi_get_boolean(env, success, &result);
880     if (status != napi_ok) {
881         HILOG_ERROR_I18N("removePreferrdLanguage: create boolean result failed");
882         return nullptr;
883     }
884     return result;
885 }
886 
SetUsingLocalDigitAddonImpl(napi_env env,napi_callback_info info,bool throwError)887 napi_value I18nSystemAddon::SetUsingLocalDigitAddonImpl(napi_env env, napi_callback_info info, bool throwError)
888 {
889     size_t argc = 1;
890     napi_value argv[1] = { nullptr };
891     napi_value thisVar = nullptr;
892     void *data = nullptr;
893     napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
894 
895     if (argc < 1) {
896         HILOG_ERROR_I18N("Invalid parameter nullptr");
897         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "flag", throwError);
898         return nullptr;
899     }
900     napi_valuetype valueType = napi_valuetype::napi_undefined;
901     napi_typeof(env, argv[0], &valueType);
902     if (valueType != napi_valuetype::napi_boolean) {
903         HILOG_ERROR_I18N("Invalid parameter type");
904         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "flag", "boolean", throwError);
905         return nullptr;
906     }
907     bool flag = false;
908     napi_status status = napi_get_value_bool(env, argv[0], &flag);
909     if (status != napi_ok) {
910         HILOG_ERROR_I18N("Get parameter flag failed");
911         return nullptr;
912     }
913     I18nErrorCode err = I18nServiceAbilityClient::SetUsingLocalDigit(flag);
914     HILOG_INFO_I18N("I18nSystemAddon::SetUsingLocalDigitAddonImpl with code %{public}d",
915         static_cast<int32_t>(err));
916     bool res = err == I18nErrorCode::SUCCESS;
917     if (throwError) {
918         if (!res) {
919             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
920         }
921         return nullptr;
922     }
923     napi_value value = nullptr;
924     status = napi_get_boolean(env, res, &value);
925     if (status != napi_ok) {
926         HILOG_ERROR_I18N("Invalid result");
927         return nullptr;
928     }
929     return value;
930 }
931 
ParseStringParam(napi_env env,napi_value argv,bool throwError,std::string & strParam)932 bool I18nSystemAddon::ParseStringParam(napi_env env, napi_value argv, bool throwError, std::string &strParam)
933 {
934     if (argv == nullptr) {
935         HILOG_ERROR_I18N("ParseStringParam: Missing parameter");
936         ErrorUtil::NapiNotFoundError(env, I18N_NOT_FOUND, "language", throwError);
937         return false;
938     }
939     napi_valuetype valueType = napi_valuetype::napi_undefined;
940     napi_typeof(env, argv, &valueType);
941     if (valueType != napi_valuetype::napi_string) {
942         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "string", throwError);
943         return false;
944     }
945     size_t len = 0;
946     napi_status status = napi_get_value_string_utf8(env, argv, nullptr, 0, &len);
947     if (status != napi_ok) {
948         HILOG_ERROR_I18N("get string parameter length failed");
949         return false;
950     }
951     std::vector<char> res(len + 1);
952     status = napi_get_value_string_utf8(env, argv, res.data(), len + 1, &len);
953     if (status != napi_ok) {
954         HILOG_ERROR_I18N("get string parameter failed");
955         return false;
956     }
957     strParam = res.data();
958     return true;
959 }
960 
SetTemperatureType(napi_env env,napi_callback_info info)961 napi_value I18nSystemAddon::SetTemperatureType(napi_env env, napi_callback_info info)
962 {
963     TemperatureType type = TemperatureType::CELSIUS;
964     if (!ParseTemperatureType(env, info, type)) {
965         HILOG_ERROR_I18N("I18nSystemAddon::SetTemperatureType: parse temperature type failed.");
966         return nullptr;
967     }
968     I18nErrorCode err = I18nServiceAbilityClient::SetTemperatureType(type);
969     if (err == I18nErrorCode::SUCCESS) {
970         return nullptr;
971     }
972     switch (err) {
973         case I18nErrorCode::NOT_SYSTEM_APP:
974             ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
975             break;
976         case I18nErrorCode::NO_PERMISSION:
977             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", true);
978             break;
979         case I18nErrorCode::INVALID_TEMPERATURE_TYPE:
980             ErrorUtil::NapiThrow(env, I18N_NOT_VALID, NAME_OF_TEMPERATURE, TYPE_OF_TEMPERATURE, true);
981             break;
982         default:
983             HILOG_ERROR_I18N("I18nSystemAddon::SetTemperatureType: set temperature type failed.");
984     }
985     return nullptr;
986 }
987 
GetTemperatureType(napi_env env,napi_callback_info info)988 napi_value I18nSystemAddon::GetTemperatureType(napi_env env, napi_callback_info info)
989 {
990     TemperatureType type = LocaleConfig::GetTemperatureType();
991     int32_t value = static_cast<int32_t>(type);
992     return VariableConvertor::CreateNumber(env, value);
993 }
994 
GetTemperatureName(napi_env env,napi_callback_info info)995 napi_value I18nSystemAddon::GetTemperatureName(napi_env env, napi_callback_info info)
996 {
997     TemperatureType type = TemperatureType::CELSIUS;
998     if (!ParseTemperatureType(env, info, type)) {
999         HILOG_ERROR_I18N("I18nSystemAddon::GetTemperatureName: parse temperature type failed.");
1000         return VariableConvertor::CreateString(env, "");
1001     }
1002     std::string temperatureName = LocaleConfig::GetTemperatureName(type);
1003     if (temperatureName.empty()) {
1004         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, NAME_OF_TEMPERATURE, TYPE_OF_TEMPERATURE, true);
1005         return VariableConvertor::CreateString(env, "");
1006     }
1007     return VariableConvertor::CreateString(env, temperatureName);
1008 }
1009 
ParseTemperatureType(napi_env env,napi_callback_info info,TemperatureType & type)1010 bool I18nSystemAddon::ParseTemperatureType(napi_env env, napi_callback_info info, TemperatureType& type)
1011 {
1012     size_t argc = 1;
1013     napi_value argv[1] = { nullptr };
1014     napi_value thisVar = nullptr;
1015     void *data = nullptr;
1016     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1017     if (status != napi_ok) {
1018         HILOG_ERROR_I18N("I18nSystemAddon::ParseTemperatureType: get cb info failed.");
1019         return false;
1020     }
1021     if (argc < 1) {
1022         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, NAME_OF_TEMPERATURE, "", true);
1023         return false;
1024     }
1025     napi_valuetype valueType = napi_valuetype::napi_undefined;
1026     status = napi_typeof(env, argv[0], &valueType);
1027     if (status != napi_ok) {
1028         HILOG_ERROR_I18N("I18nSystemAddon::ParseTemperatureType: get value type failed.");
1029         return false;
1030     }
1031     if (valueType != napi_valuetype::napi_number) {
1032         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, NAME_OF_TEMPERATURE, TYPE_OF_TEMPERATURE, true);
1033         return false;
1034     }
1035     int32_t temperatureType = 0;
1036     status = napi_get_value_int32(env, argv[0], &temperatureType);
1037     if (status != napi_ok) {
1038         HILOG_ERROR_I18N("I18nSystemAddon::ParseTemperatureType: get temperature type failed.");
1039         return false;
1040     }
1041     type = static_cast<TemperatureType>(temperatureType);
1042     return true;
1043 }
1044 
SetFirstDayOfWeek(napi_env env,napi_callback_info info)1045 napi_value I18nSystemAddon::SetFirstDayOfWeek(napi_env env, napi_callback_info info)
1046 {
1047     size_t argc = 1;
1048     napi_value argv[1] = { nullptr };
1049     napi_value thisVar = nullptr;
1050     void *data = nullptr;
1051     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1052     if (status != napi_ok) {
1053         HILOG_ERROR_I18N("I18nSystemAddon::SetFirstDayOfWeek: get cb info failed.");
1054         return nullptr;
1055     }
1056     if (argc < 1) {
1057         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, NAME_OF_WEEKDAY, "", true);
1058         return nullptr;
1059     }
1060     napi_valuetype valueType = napi_valuetype::napi_undefined;
1061     status = napi_typeof(env, argv[0], &valueType);
1062     if (status != napi_ok) {
1063         HILOG_ERROR_I18N("I18nSystemAddon::SetFirstDayOfWeek: get value type failed.");
1064         return nullptr;
1065     }
1066     if (valueType != napi_valuetype::napi_number) {
1067         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, NAME_OF_WEEKDAY, TYPE_OF_WEEKDAY, true);
1068         return nullptr;
1069     }
1070     int32_t weekDay = 0;
1071     status = napi_get_value_int32(env, argv[0], &weekDay);
1072     if (status != napi_ok) {
1073         HILOG_ERROR_I18N("I18nSystemAddon::SetFirstDayOfWeek: get week day failed.");
1074         return nullptr;
1075     }
1076     WeekDay type = static_cast<WeekDay>(weekDay);
1077     I18nErrorCode err = I18nServiceAbilityClient::SetFirstDayOfWeek(type);
1078     if (err == I18nErrorCode::SUCCESS) {
1079         return nullptr;
1080     }
1081     switch (err) {
1082         case I18nErrorCode::NOT_SYSTEM_APP:
1083             ErrorUtil::NapiThrow(env, I18N_NOT_SYSTEM_APP, "", "", true);
1084             break;
1085         case I18nErrorCode::NO_PERMISSION:
1086             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", true);
1087             break;
1088         case I18nErrorCode::INVALID_WEEK_DAY:
1089             ErrorUtil::NapiThrow(env, I18N_NOT_VALID, NAME_OF_WEEKDAY, TYPE_OF_WEEKDAY, true);
1090             break;
1091         default:
1092             HILOG_ERROR_I18N("I18nSystemAddon::SetFirstDayOfWeek: set first day of week failed.");
1093     }
1094     return nullptr;
1095 }
1096 
GetFirstDayOfWeek(napi_env env,napi_callback_info info)1097 napi_value I18nSystemAddon::GetFirstDayOfWeek(napi_env env, napi_callback_info info)
1098 {
1099     WeekDay type = LocaleConfig::GetFirstDayOfWeek();
1100     int32_t value = static_cast<int32_t>(type);
1101     return VariableConvertor::CreateNumber(env, value);
1102 }
1103 
GetSimplifiedLanguage(napi_env env,napi_callback_info info)1104 napi_value I18nSystemAddon::GetSimplifiedLanguage(napi_env env, napi_callback_info info)
1105 {
1106     // Need to get one parameter
1107     size_t argc = 1;
1108     napi_value argv[1] = { nullptr };
1109     napi_value thisVar = nullptr;
1110     void *data = nullptr;
1111     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1112     if (status != napi_ok) {
1113         HILOG_ERROR_I18N("GetSimplifiedLanguage get parameter fail");
1114         return nullptr;
1115     }
1116 
1117     std::string simplifiedLanguage = "";
1118     if (VariableConvertor::CheckNapiIsNull(env, argv[0])) {
1119         napi_valuetype valueType = napi_valuetype::napi_undefined;
1120         napi_typeof(env, argv[0], &valueType);
1121         if (valueType != napi_valuetype::napi_string) {
1122             HILOG_ERROR_I18N("GetSimplifiedLanguage Parameter type is not string");
1123             ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "string", true);
1124             return nullptr;
1125         }
1126         int code = 0;
1127         std::string language = VariableConvertor::GetString(env, argv[0], code);
1128         if (code == 1) {
1129             HILOG_ERROR_I18N("GetSimplifiedLanguage can't get string from js param");
1130             return nullptr;
1131         }
1132         code = 0;
1133         simplifiedLanguage = LocaleConfig::GetSimplifiedLanguage(language, code);
1134         if (code != 0) {
1135             HILOG_ERROR_I18N("GetSimplifiedLanguage: language is not valid");
1136             ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "language", "a valid language", true);
1137             return nullptr;
1138         }
1139     } else {
1140         simplifiedLanguage = LocaleConfig::GetSimplifiedSystemLanguage();
1141     }
1142 
1143     napi_value result = VariableConvertor::CreateString(env, simplifiedLanguage);
1144     if (!result) {
1145         HILOG_ERROR_I18N("GetSimplifiedLanguage: Failed to create string item");
1146     }
1147     return result;
1148 }
1149 } // namespace I18n
1150 } // namespace Global
1151 } // namespace OHOS