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 ®ion, 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