• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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