1 /*
2 * Copyright (c) 2023 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 "error_util.h"
17 #include "hilog/log.h"
18 #include "i18n_service_ability_client.h"
19 #include "i18n_service_ability_load_manager.h"
20 #include "i18n_system_addon.h"
21 #include "js_utils.h"
22 #include "locale_config.h"
23 #include "preferred_language.h"
24 #include "utils.h"
25 #include "variable_convertor.h"
26
27 namespace OHOS {
28 namespace Global {
29 namespace I18n {
30 static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, 0xD001E00, "I18nSystemAddonJS" };
31 using namespace OHOS::HiviewDFX;
32
I18nSystemAddon()33 I18nSystemAddon::I18nSystemAddon() {}
34
~I18nSystemAddon()35 I18nSystemAddon::~I18nSystemAddon() {}
36
Destructor(napi_env env,void * nativeObject,void * finalize_hint)37 void I18nSystemAddon::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
38 {
39 if (!nativeObject) {
40 return;
41 }
42 delete reinterpret_cast<I18nSystemAddon *>(nativeObject);
43 nativeObject = nullptr;
44 }
45
InitI18nSystem(napi_env env,napi_value exports)46 napi_value I18nSystemAddon::InitI18nSystem(napi_env env, napi_value exports)
47 {
48 napi_property_descriptor properties[] = {
49 DECLARE_NAPI_STATIC_FUNCTION("getDisplayCountry", GetDisplayCountryWithError),
50 DECLARE_NAPI_STATIC_FUNCTION("getDisplayLanguage", GetDisplayLanguageWithError),
51 DECLARE_NAPI_STATIC_FUNCTION("getSystemLanguages", GetSystemLanguages),
52 DECLARE_NAPI_STATIC_FUNCTION("getSystemCountries", GetSystemCountriesWithError),
53 DECLARE_NAPI_STATIC_FUNCTION("isSuggested", IsSuggestedWithError),
54 DECLARE_NAPI_STATIC_FUNCTION("getSystemLanguage", GetSystemLanguage),
55 DECLARE_NAPI_STATIC_FUNCTION("setSystemLanguage", SetSystemLanguageWithError),
56 DECLARE_NAPI_STATIC_FUNCTION("getSystemRegion", GetSystemRegion),
57 DECLARE_NAPI_STATIC_FUNCTION("setSystemRegion", SetSystemRegionWithError),
58 DECLARE_NAPI_STATIC_FUNCTION("getSystemLocale", GetSystemLocale),
59 DECLARE_NAPI_STATIC_FUNCTION("setSystemLocale", SetSystemLocaleWithError),
60 DECLARE_NAPI_STATIC_FUNCTION("is24HourClock", Is24HourClock),
61 DECLARE_NAPI_STATIC_FUNCTION("set24HourClock", Set24HourClockWithError),
62 DECLARE_NAPI_STATIC_FUNCTION("addPreferredLanguage", AddPreferredLanguageWithError),
63 DECLARE_NAPI_STATIC_FUNCTION("removePreferredLanguage", RemovePreferredLanguageWithError),
64 DECLARE_NAPI_STATIC_FUNCTION("getPreferredLanguageList", GetPreferredLanguageList),
65 DECLARE_NAPI_STATIC_FUNCTION("setAppPreferredLanguage", SetAppPreferredLanguage),
66 DECLARE_NAPI_STATIC_FUNCTION("getFirstPreferredLanguage", GetFirstPreferredLanguage),
67 DECLARE_NAPI_STATIC_FUNCTION("getAppPreferredLanguage", GetAppPreferredLanguage),
68 DECLARE_NAPI_STATIC_FUNCTION("setUsingLocalDigit", SetUsingLocalDigitAddonWithError),
69 DECLARE_NAPI_STATIC_FUNCTION("getUsingLocalDigit", GetUsingLocalDigitAddon)
70 };
71 napi_value constructor = nullptr;
72 napi_status status = napi_define_class(env, "System", NAPI_AUTO_LENGTH, JSUtils::DefaultConstructor, nullptr,
73 sizeof(properties) / sizeof(napi_property_descriptor), properties, &constructor);
74 if (status != napi_ok) {
75 HiLog::Error(LABEL, "Define class failed when InitSystem.");
76 return nullptr;
77 }
78
79 status = napi_set_named_property(env, exports, "System", constructor);
80 if (status != napi_ok) {
81 HiLog::Error(LABEL, "Set property failed when InitSystem.");
82 return nullptr;
83 }
84 return exports;
85 }
86
GetDisplayCountry(napi_env env,napi_callback_info info)87 napi_value I18nSystemAddon::GetDisplayCountry(napi_env env, napi_callback_info info)
88 {
89 return I18nSystemAddon::GetDisplayCountryImpl(env, info, false);
90 }
91
GetDisplayCountryWithError(napi_env env,napi_callback_info info)92 napi_value I18nSystemAddon::GetDisplayCountryWithError(napi_env env, napi_callback_info info)
93 {
94 return I18nSystemAddon::GetDisplayCountryImpl(env, info, true);
95 }
96
GetDisplayLanguage(napi_env env,napi_callback_info info)97 napi_value I18nSystemAddon::GetDisplayLanguage(napi_env env, napi_callback_info info)
98 {
99 return I18nSystemAddon::GetDisplayLanguageImpl(env, info, false);
100 }
101
GetDisplayLanguageWithError(napi_env env,napi_callback_info info)102 napi_value I18nSystemAddon::GetDisplayLanguageWithError(napi_env env, napi_callback_info info)
103 {
104 return I18nSystemAddon::GetDisplayLanguageImpl(env, info, true);
105 }
106
GetSystemLanguages(napi_env env,napi_callback_info info)107 napi_value I18nSystemAddon::GetSystemLanguages(napi_env env, napi_callback_info info)
108 {
109 std::vector<std::string> systemLanguages;
110 LocaleConfig::GetSystemLanguages(systemLanguages);
111 napi_value result = nullptr;
112 napi_status status = napi_create_array_with_length(env, systemLanguages.size(), &result);
113 if (status != napi_ok) {
114 HiLog::Error(LABEL, "Failed to create array");
115 return nullptr;
116 }
117 for (size_t i = 0; i < systemLanguages.size(); i++) {
118 napi_value value = nullptr;
119 status = napi_create_string_utf8(env, systemLanguages[i].c_str(), NAPI_AUTO_LENGTH, &value);
120 if (status != napi_ok) {
121 HiLog::Error(LABEL, "GetSystemLanguages: Failed to create string item");
122 return nullptr;
123 }
124 status = napi_set_element(env, result, i, value);
125 if (status != napi_ok) {
126 HiLog::Error(LABEL, "GetSystemLanguages: Failed to set array item");
127 return nullptr;
128 }
129 }
130 return result;
131 }
132
GetSystemCountries(napi_env env,napi_callback_info info)133 napi_value I18nSystemAddon::GetSystemCountries(napi_env env, napi_callback_info info)
134 {
135 return I18nSystemAddon::GetSystemCountriesImpl(env, info, false);
136 }
137
GetSystemCountriesWithError(napi_env env,napi_callback_info info)138 napi_value I18nSystemAddon::GetSystemCountriesWithError(napi_env env, napi_callback_info info)
139 {
140 return I18nSystemAddon::GetSystemCountriesImpl(env, info, true);
141 }
142
IsSuggested(napi_env env,napi_callback_info info)143 napi_value I18nSystemAddon::IsSuggested(napi_env env, napi_callback_info info)
144 {
145 return I18nSystemAddon::IsSuggestedImpl(env, info, false);
146 }
147
IsSuggestedWithError(napi_env env,napi_callback_info info)148 napi_value I18nSystemAddon::IsSuggestedWithError(napi_env env, napi_callback_info info)
149 {
150 return I18nSystemAddon::IsSuggestedImpl(env, info, true);
151 }
152
GetSystemLanguage(napi_env env,napi_callback_info info)153 napi_value I18nSystemAddon::GetSystemLanguage(napi_env env, napi_callback_info info)
154 {
155 std::string value = LocaleConfig::GetSystemLanguage();
156 napi_value result = nullptr;
157 napi_status status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
158 if (status != napi_ok) {
159 HiLog::Error(LABEL, "Failed to create string item");
160 return nullptr;
161 }
162 return result;
163 }
164
SetSystemLanguage(napi_env env,napi_callback_info info)165 napi_value I18nSystemAddon::SetSystemLanguage(napi_env env, napi_callback_info info)
166 {
167 return I18nSystemAddon::SetSystemLanguageImpl(env, info, false);
168 }
169
SetSystemLanguageWithError(napi_env env,napi_callback_info info)170 napi_value I18nSystemAddon::SetSystemLanguageWithError(napi_env env, napi_callback_info info)
171 {
172 return I18nSystemAddon::SetSystemLanguageImpl(env, info, true);
173 }
174
GetSystemRegion(napi_env env,napi_callback_info info)175 napi_value I18nSystemAddon::GetSystemRegion(napi_env env, napi_callback_info info)
176 {
177 std::string value = LocaleConfig::GetSystemRegion();
178 napi_value result = nullptr;
179 napi_status status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
180 if (status != napi_ok) {
181 HiLog::Error(LABEL, "Failed to create string item");
182 return nullptr;
183 }
184 return result;
185 }
186
SetSystemRegion(napi_env env,napi_callback_info info)187 napi_value I18nSystemAddon::SetSystemRegion(napi_env env, napi_callback_info info)
188 {
189 return I18nSystemAddon::SetSystemRegionImpl(env, info, false);
190 }
191
SetSystemRegionWithError(napi_env env,napi_callback_info info)192 napi_value I18nSystemAddon::SetSystemRegionWithError(napi_env env, napi_callback_info info)
193 {
194 return I18nSystemAddon::SetSystemRegionImpl(env, info, true);
195 }
196
GetSystemLocale(napi_env env,napi_callback_info info)197 napi_value I18nSystemAddon::GetSystemLocale(napi_env env, napi_callback_info info)
198 {
199 std::string value = LocaleConfig::GetSystemLocale();
200 napi_value result = nullptr;
201 napi_status status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
202 if (status != napi_ok) {
203 HiLog::Error(LABEL, "Failed to create string item");
204 return nullptr;
205 }
206 return result;
207 }
208
SetSystemLocale(napi_env env,napi_callback_info info)209 napi_value I18nSystemAddon::SetSystemLocale(napi_env env, napi_callback_info info)
210 {
211 return I18nSystemAddon::SetSystemLocaleImpl(env, info, false);
212 }
213
SetSystemLocaleWithError(napi_env env,napi_callback_info info)214 napi_value I18nSystemAddon::SetSystemLocaleWithError(napi_env env, napi_callback_info info)
215 {
216 return I18nSystemAddon::SetSystemLocaleImpl(env, info, true);
217 }
218
Is24HourClock(napi_env env,napi_callback_info info)219 napi_value I18nSystemAddon::Is24HourClock(napi_env env, napi_callback_info info)
220 {
221 bool is24HourClock = LocaleConfig::Is24HourClock();
222 napi_value result = nullptr;
223 napi_status status = napi_get_boolean(env, is24HourClock, &result);
224 if (status != napi_ok) {
225 HiLog::Error(LABEL, "Failed to create boolean item");
226 return nullptr;
227 }
228 return result;
229 }
230
Set24HourClock(napi_env env,napi_callback_info info)231 napi_value I18nSystemAddon::Set24HourClock(napi_env env, napi_callback_info info)
232 {
233 return I18nSystemAddon::Set24HourClockImpl(env, info, false);
234 }
235
Set24HourClockWithError(napi_env env,napi_callback_info info)236 napi_value I18nSystemAddon::Set24HourClockWithError(napi_env env, napi_callback_info info)
237 {
238 return I18nSystemAddon::Set24HourClockImpl(env, info, true);
239 }
240
AddPreferredLanguage(napi_env env,napi_callback_info info)241 napi_value I18nSystemAddon::AddPreferredLanguage(napi_env env, napi_callback_info info)
242 {
243 return I18nSystemAddon::AddPreferredLanguageImpl(env, info, false);
244 }
245
AddPreferredLanguageWithError(napi_env env,napi_callback_info info)246 napi_value I18nSystemAddon::AddPreferredLanguageWithError(napi_env env, napi_callback_info info)
247 {
248 return I18nSystemAddon::AddPreferredLanguageImpl(env, info, true);
249 }
250
RemovePreferredLanguage(napi_env env,napi_callback_info info)251 napi_value I18nSystemAddon::RemovePreferredLanguage(napi_env env, napi_callback_info info)
252 {
253 return I18nSystemAddon::RemovePreferredLanguageImpl(env, info, false);
254 }
255
RemovePreferredLanguageWithError(napi_env env,napi_callback_info info)256 napi_value I18nSystemAddon::RemovePreferredLanguageWithError(napi_env env, napi_callback_info info)
257 {
258 return I18nSystemAddon::RemovePreferredLanguageImpl(env, info, true);
259 }
260
GetPreferredLanguageList(napi_env env,napi_callback_info info)261 napi_value I18nSystemAddon::GetPreferredLanguageList(napi_env env, napi_callback_info info)
262 {
263 std::vector<std::string> languageList = PreferredLanguage::GetPreferredLanguageList();
264 napi_value result = nullptr;
265 napi_status status = napi_ok;
266 status = napi_create_array_with_length(env, languageList.size(), &result);
267 if (status != napi_ok) {
268 HiLog::Error(LABEL, "getPreferrdLanguageList: create array failed");
269 return nullptr;
270 }
271 for (size_t i = 0; i < languageList.size(); i++) {
272 napi_value value = nullptr;
273 status = napi_create_string_utf8(env, languageList[i].c_str(), NAPI_AUTO_LENGTH, &value);
274 if (status != napi_ok) {
275 HiLog::Error(LABEL, "getPreferrdLanguageList: create string failed");
276 return nullptr;
277 }
278 status = napi_set_element(env, result, i, value);
279 if (status != napi_ok) {
280 HiLog::Error(LABEL, "GetPreferredLanguageList: set array item failed");
281 return nullptr;
282 }
283 }
284 return result;
285 }
286
GetFirstPreferredLanguage(napi_env env,napi_callback_info info)287 napi_value I18nSystemAddon::GetFirstPreferredLanguage(napi_env env, napi_callback_info info)
288 {
289 std::string language = PreferredLanguage::GetFirstPreferredLanguage();
290 napi_value result = nullptr;
291 napi_status status = napi_ok;
292 status = napi_create_string_utf8(env, language.c_str(), NAPI_AUTO_LENGTH, &result);
293 if (status != napi_ok) {
294 HiLog::Error(LABEL, "getFirstPreferrdLanguage: create string result failed");
295 return nullptr;
296 }
297 return result;
298 }
299
SetAppPreferredLanguage(napi_env env,napi_callback_info info)300 napi_value I18nSystemAddon::SetAppPreferredLanguage(napi_env env, napi_callback_info info)
301 {
302 size_t argc = 1;
303 napi_value argv[1] = { 0 };
304 napi_value thisVar = nullptr;
305 void *data = nullptr;
306 napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
307 napi_valuetype valueType = napi_valuetype::napi_undefined;
308 napi_typeof(env, argv[0], &valueType);
309 if (valueType != napi_valuetype::napi_string) {
310 HiLog::Error(LABEL, "SetAppPreferredLanguage Parameter type is not string");
311 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, true);
312 return nullptr;
313 }
314 int code = 0;
315 std::string localeTag = VariableConvertor::GetString(env, argv[0], code);
316 if (code) {
317 HiLog::Error(LABEL, "SetAppPreferredLanguage can't get string from js param");
318 return nullptr;
319 }
320 UErrorCode icuStatus = U_ZERO_ERROR;
321 icu::Locale locale = icu::Locale::forLanguageTag(localeTag.data(), icuStatus);
322 if (U_FAILURE(icuStatus) || !IsValidLocaleTag(locale)) {
323 HiLog::Error(LABEL, "GetTimePeriodName does not support this locale");
324 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, true);
325 return nullptr;
326 }
327 #ifdef SUPPORT_APP_PREFERRED_LANGUAGE
328 I18nErrorCode errCode = I18nErrorCode::SUCCESS;
329 PreferredLanguage::SetAppPreferredLanguage(localeTag, errCode);
330 if (errCode != I18nErrorCode::SUCCESS) {
331 HiLog::Error(LABEL, "SetAppPreferredLanguage: set app language to i18n app preferences failed.");
332 }
333 #endif
334 return nullptr;
335 }
336
GetAppPreferredLanguage(napi_env env,napi_callback_info info)337 napi_value I18nSystemAddon::GetAppPreferredLanguage(napi_env env, napi_callback_info info)
338 {
339 #ifdef SUPPORT_APP_PREFERRED_LANGUAGE
340 std::string language = PreferredLanguage::GetAppPreferredLanguage();
341 #else
342 std::string language = PreferredLanguage::GetFirstPreferredLanguage();
343 #endif
344 napi_value result = nullptr;
345 napi_status status = napi_ok;
346 status = napi_create_string_utf8(env, language.c_str(), NAPI_AUTO_LENGTH, &result);
347 if (status != napi_ok) {
348 HiLog::Error(LABEL, "getAppPreferrdLanguage: create string result failed");
349 return nullptr;
350 }
351 return result;
352 }
353
SetUsingLocalDigitAddon(napi_env env,napi_callback_info info)354 napi_value I18nSystemAddon::SetUsingLocalDigitAddon(napi_env env, napi_callback_info info)
355 {
356 return I18nSystemAddon::SetUsingLocalDigitAddonImpl(env, info, false);
357 }
358
SetUsingLocalDigitAddonWithError(napi_env env,napi_callback_info info)359 napi_value I18nSystemAddon::SetUsingLocalDigitAddonWithError(napi_env env, napi_callback_info info)
360 {
361 return I18nSystemAddon::SetUsingLocalDigitAddonImpl(env, info, true);
362 }
363
GetUsingLocalDigitAddon(napi_env env,napi_callback_info info)364 napi_value I18nSystemAddon::GetUsingLocalDigitAddon(napi_env env, napi_callback_info info)
365 {
366 bool res = LocaleConfig::GetUsingLocalDigit();
367 napi_value value = nullptr;
368 napi_status status = napi_get_boolean(env, res, &value);
369 if (status != napi_ok) {
370 return nullptr;
371 }
372 return value;
373 }
374
GetDisplayCountryImpl(napi_env env,napi_callback_info info,bool throwError)375 napi_value I18nSystemAddon::GetDisplayCountryImpl(napi_env env, napi_callback_info info, bool throwError)
376 {
377 // Need to get three parameters to get the display country.
378 size_t argc = 3;
379 napi_value argv[3] = { nullptr };
380 napi_value thisVar = nullptr;
381 void *data = nullptr;
382 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
383 if (status != napi_ok) {
384 return nullptr;
385 }
386 if (argc < FUNC_ARGS_COUNT) {
387 HiLog::Error(LABEL, "Missing parameter");
388 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, throwError);
389 return nullptr;
390 }
391 size_t len = 0;
392 napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
393 std::vector<char> localeBuf(len + 1);
394 status = napi_get_value_string_utf8(env, argv[0], localeBuf.data(), len + 1, &len);
395 if (status != napi_ok) {
396 HiLog::Error(LABEL, "Failed to get string item");
397 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
398 return nullptr;
399 }
400 napi_get_value_string_utf8(env, argv[1], nullptr, 0, &len);
401 std::vector<char> displayLocaleBuf(len + 1);
402 status = napi_get_value_string_utf8(env, argv[1], displayLocaleBuf.data(), len + 1, &len);
403 if (status != napi_ok) {
404 HiLog::Error(LABEL, "Failed to get string item");
405 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
406 return nullptr;
407 }
408 bool sentenceCase = true;
409 size_t sentenceCaseIndex = 2;
410 if (argc > sentenceCaseIndex) {
411 napi_get_value_bool(env, argv[sentenceCaseIndex], &sentenceCase);
412 }
413 std::string value = LocaleConfig::GetDisplayRegion(localeBuf.data(), displayLocaleBuf.data(), sentenceCase);
414 if (value.length() == 0) {
415 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
416 }
417 napi_value result = nullptr;
418 status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
419 if (status != napi_ok) {
420 HiLog::Error(LABEL, "Failed to create string item");
421 return nullptr;
422 }
423 return result;
424 }
425
GetDisplayLanguageImpl(napi_env env,napi_callback_info info,bool throwError)426 napi_value I18nSystemAddon::GetDisplayLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
427 {
428 // Need to get three parameters to get the display Language.
429 size_t argc = 3;
430 napi_value argv[3] = { nullptr };
431 napi_value thisVar = nullptr;
432 void *data = nullptr;
433 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
434 if (status != napi_ok) {
435 return nullptr;
436 }
437 if (argc < FUNC_ARGS_COUNT) {
438 HiLog::Error(LABEL, "Missing parameter");
439 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, throwError);
440 return nullptr;
441 }
442 size_t len = 0;
443 napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
444 std::vector<char> localeBuf(len + 1);
445 status = napi_get_value_string_utf8(env, argv[0], localeBuf.data(), len + 1, &len);
446 if (status != napi_ok) {
447 HiLog::Error(LABEL, "Failed to get string item");
448 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
449 return nullptr;
450 }
451 napi_get_value_string_utf8(env, argv[1], nullptr, 0, &len);
452 std::vector<char> displayLocaleBuf(len + 1);
453 status = napi_get_value_string_utf8(env, argv[1], displayLocaleBuf.data(), len + 1, &len);
454 if (status != napi_ok) {
455 HiLog::Error(LABEL, "Failed to get string item");
456 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
457 return nullptr;
458 }
459 bool sentenceCase = true;
460 size_t sentenceCaseIndex = 2;
461 if (argc > sentenceCaseIndex) {
462 napi_get_value_bool(env, argv[sentenceCaseIndex], &sentenceCase);
463 }
464
465 std::string value = LocaleConfig::GetDisplayLanguage(localeBuf.data(), displayLocaleBuf.data(), sentenceCase);
466 if (value.length() == 0) {
467 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
468 return nullptr;
469 }
470 napi_value result = nullptr;
471 status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
472 if (status != napi_ok) {
473 HiLog::Error(LABEL, "Failed to create string item");
474 return nullptr;
475 }
476 return result;
477 }
478
GetSystemCountriesImpl(napi_env env,napi_callback_info info,bool throwError)479 napi_value I18nSystemAddon::GetSystemCountriesImpl(napi_env env, napi_callback_info info, bool throwError)
480 {
481 size_t argc = 1;
482 napi_value argv[1] = { nullptr };
483 napi_value thisVar = nullptr;
484 void *data = nullptr;
485 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
486 if (status != napi_ok) {
487 return nullptr;
488 }
489 if (argc < 1) {
490 HiLog::Error(LABEL, "Missing parameter");
491 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, throwError);
492 return nullptr;
493 }
494 size_t len = 0;
495 napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
496 std::vector<char> localeBuf(len + 1);
497 status = napi_get_value_string_utf8(env, argv[0], localeBuf.data(), len + 1, &len);
498 if (status != napi_ok) {
499 HiLog::Error(LABEL, "Failed to get string item");
500 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
501 return nullptr;
502 }
503 std::vector<std::string> systemCountries;
504 LocaleConfig::GetSystemCountries(systemCountries);
505 napi_value result = nullptr;
506 status = napi_create_array_with_length(env, systemCountries.size(), &result);
507 if (status != napi_ok) {
508 HiLog::Error(LABEL, "Failed to create array");
509 return nullptr;
510 }
511 for (size_t i = 0; i < systemCountries.size(); i++) {
512 napi_value value = nullptr;
513 status = napi_create_string_utf8(env, systemCountries[i].c_str(), NAPI_AUTO_LENGTH, &value);
514 if (status != napi_ok) {
515 HiLog::Error(LABEL, "GetSystemCountries: Failed to create string item");
516 return nullptr;
517 }
518 status = napi_set_element(env, result, i, value);
519 if (status != napi_ok) {
520 HiLog::Error(LABEL, "GetSystemCountries: Failed to set array item");
521 return nullptr;
522 }
523 }
524 return result;
525 }
526
IsSuggestedImpl(napi_env env,napi_callback_info info,bool throwError)527 napi_value I18nSystemAddon::IsSuggestedImpl(napi_env env, napi_callback_info info, bool throwError)
528 {
529 // Need to get two parameters to check is suggested or not.
530 size_t argc = 2;
531 napi_value argv[2] = { nullptr };
532 napi_value thisVar = nullptr;
533 void *data = nullptr;
534 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
535 if (status != napi_ok) {
536 return nullptr;
537 }
538 if (argc < 1) {
539 HiLog::Error(LABEL, "Missing parameter");
540 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, throwError);
541 return nullptr;
542 }
543 size_t len = 0;
544 napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
545 std::vector<char> languageBuf(len + 1);
546 status = napi_get_value_string_utf8(env, argv[0], languageBuf.data(), len + 1, &len);
547 if (status != napi_ok) {
548 HiLog::Error(LABEL, "Failed to get string item");
549 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
550 return nullptr;
551 }
552 bool isSuggested = false;
553 if (VariableConvertor::CheckNapiValueType(env, argv[1])) {
554 napi_get_value_string_utf8(env, argv[1], nullptr, 0, &len);
555 std::vector<char> regionBuf(len + 1);
556 status = napi_get_value_string_utf8(env, argv[1], regionBuf.data(), len + 1, &len);
557 if (status != napi_ok) {
558 HiLog::Error(LABEL, "Failed to get string item");
559 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
560 return nullptr;
561 }
562 isSuggested = LocaleConfig::IsSuggested(languageBuf.data(), regionBuf.data());
563 } else {
564 isSuggested = LocaleConfig::IsSuggested(languageBuf.data());
565 }
566 napi_value result = nullptr;
567 status = napi_get_boolean(env, isSuggested, &result);
568 if (status != napi_ok) {
569 HiLog::Error(LABEL, "Create case first boolean value failed");
570 return nullptr;
571 }
572 return result;
573 }
574
SetSystemLanguageImpl(napi_env env,napi_callback_info info,bool throwError)575 napi_value I18nSystemAddon::SetSystemLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
576 {
577 size_t argc = 1;
578 napi_value argv[1] = { 0 };
579 napi_value thisVar = nullptr;
580 void *data = nullptr;
581 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
582 if (status != napi_ok) {
583 return nullptr;
584 }
585 if (argc < 1) {
586 HiLog::Error(LABEL, "Missing parameter");
587 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, throwError);
588 return nullptr;
589 }
590 size_t len = 0;
591 napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
592 std::vector<char> languageBuf(len + 1);
593 status = napi_get_value_string_utf8(env, argv[0], languageBuf.data(), len + 1, &len);
594 if (status != napi_ok) {
595 HiLog::Error(LABEL, "Failed to get string item");
596 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
597 return nullptr;
598 }
599 I18nErrorCode err = I18nServiceAbilityClient::SetSystemLanguage(languageBuf.data());
600 HiLog::Info(LABEL, "I18nSystemAddon::SetSystemLanguageImpl with code %{public}d", static_cast<int32_t>(err));
601 bool success = err == I18nErrorCode::SUCCESS;
602 if (throwError) {
603 if (!success) {
604 ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, throwError);
605 }
606 return nullptr;
607 }
608 napi_value result = nullptr;
609 status = napi_get_boolean(env, success, &result);
610 if (status != napi_ok) {
611 HiLog::Error(LABEL, "Create set system language boolean value failed");
612 return nullptr;
613 }
614 return result;
615 }
616
SetSystemRegionImpl(napi_env env,napi_callback_info info,bool throwError)617 napi_value I18nSystemAddon::SetSystemRegionImpl(napi_env env, napi_callback_info info, bool throwError)
618 {
619 size_t argc = 1;
620 napi_value argv[1] = { nullptr };
621 napi_value thisVar = nullptr;
622 void *data = nullptr;
623 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
624 if (status != napi_ok) {
625 return nullptr;
626 }
627 if (argc < 1) {
628 HiLog::Error(LABEL, "Missing parameter");
629 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, throwError);
630 return nullptr;
631 }
632 size_t len = 0;
633 napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
634 std::vector<char> regionBuf(len + 1);
635 status = napi_get_value_string_utf8(env, argv[0], regionBuf.data(), len + 1, &len);
636 if (status != napi_ok) {
637 HiLog::Error(LABEL, "Failed to get string item");
638 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
639 return nullptr;
640 }
641 I18nErrorCode err = I18nServiceAbilityClient::SetSystemRegion(regionBuf.data());
642 HiLog::Info(LABEL, "I18nSystemAddon::SetSystemRegionImpl with code %{public}d", static_cast<int32_t>(err));
643 bool success = err == I18nErrorCode::SUCCESS;
644 if (throwError) {
645 if (!success) {
646 ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, throwError);
647 }
648 return nullptr;
649 }
650 napi_value result = nullptr;
651 status = napi_get_boolean(env, success, &result);
652 if (status != napi_ok) {
653 HiLog::Error(LABEL, "Create set system language boolean value failed");
654 return nullptr;
655 }
656 return result;
657 }
658
SetSystemLocaleImpl(napi_env env,napi_callback_info info,bool throwError)659 napi_value I18nSystemAddon::SetSystemLocaleImpl(napi_env env, napi_callback_info info, bool throwError)
660 {
661 size_t argc = 1;
662 napi_value argv[1] = { nullptr };
663 napi_value thisVar = nullptr;
664 void *data = nullptr;
665 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
666 if (status != napi_ok) {
667 return nullptr;
668 }
669 if (argc < 1) {
670 HiLog::Error(LABEL, "Missing parameter");
671 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, throwError);
672 return nullptr;
673 }
674 size_t len = 0;
675 napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
676 std::vector<char> localeBuf(len + 1);
677 status = napi_get_value_string_utf8(env, argv[0], localeBuf.data(), len + 1, &len);
678 if (status != napi_ok) {
679 HiLog::Error(LABEL, "Failed to get string item");
680 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
681 return nullptr;
682 }
683 I18nErrorCode err = I18nServiceAbilityClient::SetSystemLocale(localeBuf.data());
684 HiLog::Info(LABEL, "I18nSystemAddon::SetSystemLocaleImpl with code %{public}d", static_cast<int32_t>(err));
685 bool success = err == I18nErrorCode::SUCCESS;
686 if (throwError) {
687 if (!success) {
688 ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, throwError);
689 }
690 return nullptr;
691 }
692 napi_value result = nullptr;
693 status = napi_get_boolean(env, success, &result);
694 if (status != napi_ok) {
695 HiLog::Error(LABEL, "Create set system language boolean value failed");
696 return nullptr;
697 }
698 return result;
699 }
700
Set24HourClockImpl(napi_env env,napi_callback_info info,bool throwError)701 napi_value I18nSystemAddon::Set24HourClockImpl(napi_env env, napi_callback_info info, bool throwError)
702 {
703 size_t argc = 1;
704 napi_value argv[1] = { nullptr };
705 napi_value thisVar = nullptr;
706 void *data = nullptr;
707 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
708 if (status != napi_ok) {
709 return nullptr;
710 }
711 if (argc < 1) {
712 HiLog::Error(LABEL, "Missing parameter");
713 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, throwError);
714 return nullptr;
715 }
716
717 bool option = false;
718 status = napi_get_value_bool(env, argv[0], &option);
719 if (status != napi_ok) {
720 HiLog::Error(LABEL, "Failed to get boolean item");
721 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
722 return nullptr;
723 }
724 std::string optionStr = option ? "true" : "false";
725 I18nErrorCode err = I18nServiceAbilityClient::Set24HourClock(optionStr);
726 HiLog::Info(LABEL, "I18nSystemAddon::Set24HourClock with code %{public}d", static_cast<int32_t>(err));
727 bool success = err == I18nErrorCode::SUCCESS;
728 if (throwError) {
729 if (!success) {
730 ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, throwError);
731 }
732 return nullptr;
733 }
734 napi_value result = nullptr;
735 status = napi_get_boolean(env, success, &result);
736 if (status != napi_ok) {
737 HiLog::Error(LABEL, "Create set 24HourClock boolean value failed");
738 return nullptr;
739 }
740 return result;
741 }
742
AddPreferredLanguageImpl(napi_env env,napi_callback_info info,bool throwError)743 napi_value I18nSystemAddon::AddPreferredLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
744 {
745 size_t argc = 2;
746 napi_value argv[2] = { 0 };
747 napi_value thisVar = nullptr;
748 void *data = nullptr;
749 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
750 if (status != napi_ok) {
751 return nullptr;
752 }
753
754 std::string language;
755 if (!ParseStringParam(env, argc > 0 ? argv[0] : nullptr, throwError, language)) {
756 return nullptr;
757 }
758
759 int index = 1000000;
760 if (VariableConvertor::CheckNapiValueType(env, argc > 1 ? argv[1] : nullptr)) {
761 status = napi_get_value_int32(env, argv[1], &index);
762 }
763 if (status != napi_ok) {
764 HiLog::Error(LABEL, "addPreferrdLanguage: get index failed");
765 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
766 return nullptr;
767 }
768 I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage(language.data(), index);
769 HiLog::Info(LABEL, "I18nSystemAddon::AddPreferredLanguageImpl with code %{public}d", static_cast<int32_t>(err));
770 if (throwError) {
771 if (err == I18nErrorCode::NO_PERMISSION) {
772 ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, throwError);
773 }
774 if (err != I18nErrorCode::SUCCESS) {
775 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
776 }
777 return nullptr;
778 }
779 bool addResult = true;
780 if (err != I18nErrorCode::SUCCESS) {
781 addResult = false;
782 }
783 napi_value result = nullptr;
784 status = napi_get_boolean(env, addResult, &result);
785 if (status != napi_ok) {
786 HiLog::Error(LABEL, "addPreferrdLanguage: create boolean result failed");
787 return nullptr;
788 }
789 return result;
790 }
791
RemovePreferredLanguageImpl(napi_env env,napi_callback_info info,bool throwError)792 napi_value I18nSystemAddon::RemovePreferredLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
793 {
794 size_t argc = 1;
795 napi_value argv[1] = { nullptr };
796 napi_value thisVar = nullptr;
797 void *data = nullptr;
798 int len = 0;
799 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
800 if (status != napi_ok) {
801 return nullptr;
802 }
803 if (argc < 1) {
804 HiLog::Error(LABEL, "Missing parameter");
805 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, throwError);
806 return nullptr;
807 }
808
809 napi_valuetype valueType = napi_valuetype::napi_undefined;
810 napi_typeof(env, argv[0], &valueType);
811 if (valueType != napi_valuetype::napi_number) {
812 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
813 return nullptr;
814 }
815 int index = 1000000;
816 status = napi_get_value_int32(env, argv[0], &index);
817 if (status != napi_ok) {
818 HiLog::Error(LABEL, "removePreferrdLanguage: get index failed");
819 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
820 return nullptr;
821 }
822 len = static_cast<int>(PreferredLanguage::GetPreferredLanguageList().size());
823 if ((index < 0 || index > len - 1) && throwError) {
824 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
825 return nullptr;
826 }
827 I18nErrorCode err = I18nServiceAbilityClient::RemovePreferredLanguage(index);
828 bool success = err == I18nErrorCode::SUCCESS;
829
830 if (throwError) {
831 if (!success) {
832 ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, throwError);
833 }
834 return nullptr;
835 }
836 napi_value result = nullptr;
837 status = napi_get_boolean(env, success, &result);
838 if (status != napi_ok) {
839 HiLog::Error(LABEL, "removePreferrdLanguage: create boolean result failed");
840 return nullptr;
841 }
842 return result;
843 }
844
SetUsingLocalDigitAddonImpl(napi_env env,napi_callback_info info,bool throwError)845 napi_value I18nSystemAddon::SetUsingLocalDigitAddonImpl(napi_env env, napi_callback_info info, bool throwError)
846 {
847 size_t argc = 1;
848 napi_value argv[1] = { nullptr };
849 napi_value thisVar = nullptr;
850 void *data = nullptr;
851 napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
852
853 if (argc < 1) {
854 HiLog::Error(LABEL, "Invalid parameter nullptr");
855 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, throwError);
856 return nullptr;
857 }
858 napi_valuetype valueType = napi_valuetype::napi_undefined;
859 napi_typeof(env, argv[0], &valueType);
860 if (valueType != napi_valuetype::napi_boolean) {
861 HiLog::Error(LABEL, "Invalid parameter type");
862 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
863 return nullptr;
864 }
865 bool flag = false;
866 napi_status status = napi_get_value_bool(env, argv[0], &flag);
867 if (status != napi_ok) {
868 HiLog::Error(LABEL, "Get parameter flag failed");
869 return nullptr;
870 }
871 I18nErrorCode err = I18nServiceAbilityClient::SetUsingLocalDigit(flag);
872 HiLog::Info(LABEL, "I18nSystemAddon::SetUsingLocalDigitAddonImpl with code %{public}d",
873 static_cast<int32_t>(err));
874 bool res = err == I18nErrorCode::SUCCESS;
875 if (throwError) {
876 if (!res) {
877 ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, throwError);
878 }
879 return nullptr;
880 }
881 napi_value value = nullptr;
882 status = napi_get_boolean(env, res, &value);
883 if (status != napi_ok) {
884 HiLog::Error(LABEL, "Invalid result");
885 return nullptr;
886 }
887 return value;
888 }
889
ParseStringParam(napi_env env,napi_value argv,bool throwError,std::string & strParam)890 bool I18nSystemAddon::ParseStringParam(napi_env env, napi_value argv, bool throwError, std::string &strParam)
891 {
892 if (argv == nullptr) {
893 HiLog::Error(LABEL, "Missing parameter");
894 ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, throwError);
895 return false;
896 }
897 napi_valuetype valueType = napi_valuetype::napi_undefined;
898 napi_typeof(env, argv, &valueType);
899 if (valueType != napi_valuetype::napi_string) {
900 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
901 return false;
902 }
903 size_t len = 0;
904 napi_status status = napi_get_value_string_utf8(env, argv, nullptr, 0, &len);
905 if (status != napi_ok) {
906 HiLog::Error(LABEL, "get string parameter length failed");
907 ErrorUtil::NapiThrow(env, I18N_NOT_VALID, throwError);
908 return false;
909 }
910 std::vector<char> res(len + 1);
911 status = napi_get_value_string_utf8(env, argv, res.data(), len + 1, &len);
912 if (status != napi_ok) {
913 HiLog::Error(LABEL, "get string parameter failed");
914 return false;
915 }
916 strParam = res.data();
917 return true;
918 }
919 } // namespace I18n
920 } // namespace Global
921 } // namespace OHOS