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