• 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 "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 {
I18nSystemAddon()32 I18nSystemAddon::I18nSystemAddon() {}
33 
~I18nSystemAddon()34 I18nSystemAddon::~I18nSystemAddon() {}
35 
Destructor(napi_env env,void * nativeObject,void * finalize_hint)36 void I18nSystemAddon::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
37 {
38     if (!nativeObject) {
39         return;
40     }
41     delete reinterpret_cast<I18nSystemAddon *>(nativeObject);
42     nativeObject = nullptr;
43 }
44 
InitI18nSystem(napi_env env,napi_value exports)45 napi_value I18nSystemAddon::InitI18nSystem(napi_env env, napi_value exports)
46 {
47     napi_property_descriptor properties[] = {
48         DECLARE_NAPI_STATIC_FUNCTION("getDisplayCountry", GetDisplayCountryWithError),
49         DECLARE_NAPI_STATIC_FUNCTION("getDisplayLanguage", GetDisplayLanguageWithError),
50         DECLARE_NAPI_STATIC_FUNCTION("getSystemLanguages", GetSystemLanguages),
51         DECLARE_NAPI_STATIC_FUNCTION("getSystemCountries", GetSystemCountriesWithError),
52         DECLARE_NAPI_STATIC_FUNCTION("isSuggested", IsSuggestedWithError),
53         DECLARE_NAPI_STATIC_FUNCTION("getSystemLanguage", GetSystemLanguage),
54         DECLARE_NAPI_STATIC_FUNCTION("setSystemLanguage", SetSystemLanguageWithError),
55         DECLARE_NAPI_STATIC_FUNCTION("getSystemRegion", GetSystemRegion),
56         DECLARE_NAPI_STATIC_FUNCTION("setSystemRegion", SetSystemRegionWithError),
57         DECLARE_NAPI_STATIC_FUNCTION("getSystemLocale", GetSystemLocale),
58         DECLARE_NAPI_STATIC_FUNCTION("setSystemLocale", SetSystemLocaleWithError),
59         DECLARE_NAPI_STATIC_FUNCTION("is24HourClock", Is24HourClock),
60         DECLARE_NAPI_STATIC_FUNCTION("set24HourClock", Set24HourClockWithError),
61         DECLARE_NAPI_STATIC_FUNCTION("addPreferredLanguage", AddPreferredLanguageWithError),
62         DECLARE_NAPI_STATIC_FUNCTION("removePreferredLanguage", RemovePreferredLanguageWithError),
63         DECLARE_NAPI_STATIC_FUNCTION("getPreferredLanguageList", GetPreferredLanguageList),
64         DECLARE_NAPI_STATIC_FUNCTION("setAppPreferredLanguage", SetAppPreferredLanguage),
65         DECLARE_NAPI_STATIC_FUNCTION("getFirstPreferredLanguage", GetFirstPreferredLanguage),
66         DECLARE_NAPI_STATIC_FUNCTION("getAppPreferredLanguage", GetAppPreferredLanguage),
67         DECLARE_NAPI_STATIC_FUNCTION("setUsingLocalDigit", SetUsingLocalDigitAddonWithError),
68         DECLARE_NAPI_STATIC_FUNCTION("getUsingLocalDigit", GetUsingLocalDigitAddon),
69         DECLARE_NAPI_STATIC_FUNCTION("getSimplifiedLanguage", GetSimplifiedLanguage),
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_I18N("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_I18N("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_I18N("GetSystemLanguages: 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_I18N("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_I18N("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_I18N("GetSystemLanguage: 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_I18N("GetSystemRegion: 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_I18N("GetSystemLocale: 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_I18N("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_I18N("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_I18N("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_I18N("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_I18N("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_I18N("SetAppPreferredLanguage Parameter type is not string");
311         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "string", 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_I18N("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) || localeTag.compare("default") == 0)) {
323         HILOG_ERROR_I18N("SetAppPreferredLanguage does not support this locale");
324         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "language", "a valid language", 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_I18N("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_I18N("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 VariableConvertor::CreateString(env, "");
385     } else if (argc < FUNC_ARGS_COUNT) {
386         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "country or locale", "", throwError);
387         return VariableConvertor::CreateString(env, "");
388     }
389     size_t len = 0;
390     VariableConvertor::VerifyType(env, "country", "string", argv[0]);
391     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
392     std::vector<char> localeBuf(len + 1);
393     if (!GetCountryNapiValueWithError(env, argv[0], len, localeBuf.data(), "0")) {
394         return VariableConvertor::CreateString(env, "");
395     }
396     VariableConvertor::VerifyType(env, "locale", "string", argv[1]);
397     napi_get_value_string_utf8(env, argv[1], nullptr, 0, &len);
398     std::vector<char> displayLocaleBuf(len + 1);
399     if (!GetCountryNapiValueWithError(env, argv[1], len, displayLocaleBuf.data(), "1")) {
400         return VariableConvertor::CreateString(env, "");
401     }
402     LocaleInfo localeInfo(localeBuf.data());
403     if (!LocaleConfig::IsValidRegion(localeBuf.data()) && localeInfo.GetRegion() == "") {
404         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "country", "a valid region", throwError);
405         return VariableConvertor::CreateString(env, "");
406     } else if (!LocaleConfig::IsValidTag(displayLocaleBuf.data())) {
407         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "locale", "a valid locale", throwError);
408         return VariableConvertor::CreateString(env, "");
409     }
410     bool sentenceCase = true;
411     if (argc > FUNC_ARGS_COUNT) {
412         napi_get_value_bool(env, argv[FUNC_ARGS_COUNT], &sentenceCase);
413     }
414     std::string value = LocaleConfig::GetDisplayRegion(localeBuf.data(), displayLocaleBuf.data(), sentenceCase);
415     if (value.length() == 0) {
416         HILOG_ERROR_I18N("GetDisplayCountryImpl: result is empty.");
417         return VariableConvertor::CreateString(env, "");
418     }
419     napi_value result = nullptr;
420     status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
421     if (status != napi_ok) {
422         HILOG_ERROR_I18N("GetDisplayCountryImpl: Failed to create string item");
423         return VariableConvertor::CreateString(env, "");
424     }
425     return result;
426 }
427 
GetCountryNapiValueWithError(napi_env env,napi_value napiValue,size_t len,char * valueBuf,std::string index)428 bool I18nSystemAddon::GetCountryNapiValueWithError(napi_env env, napi_value napiValue, size_t len, char* valueBuf,
429     std::string index)
430 {
431     napi_status status = napi_get_value_string_utf8(env, napiValue, valueBuf, len + 1, &len);
432     if (status != napi_ok) {
433         HILOG_ERROR_I18N("GetDisplayCountryImpl: Failed to get string item argv[%{public}s]", index.c_str());
434         return false;
435     }
436     return true;
437 }
438 
GetDisplayLanguageImpl(napi_env env,napi_callback_info info,bool throwError)439 napi_value I18nSystemAddon::GetDisplayLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
440 {
441     // Need to get three parameters to get the display Language.
442     size_t argc = 3;
443     napi_value argv[3] = { nullptr };
444     napi_value thisVar = nullptr;
445     void *data = nullptr;
446     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
447     if (status != napi_ok) {
448         return nullptr;
449     } else if (argc < FUNC_ARGS_COUNT) {
450         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language or locale", "", throwError);
451         return nullptr;
452     }
453     VariableConvertor::VerifyType(env, "language", "string", argv[0]);
454     size_t len = 0;
455     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
456     std::vector<char> localeBuf(len + 1);
457     if (!GetNapiStringValueWithError(env, argv[0], len, localeBuf.data(), "0")) {
458         return nullptr;
459     }
460     VariableConvertor::VerifyType(env, "locale", "string", argv[1]);
461     napi_get_value_string_utf8(env, argv[1], nullptr, 0, &len);
462     std::vector<char> displayLocaleBuf(len + 1);
463     if (!GetNapiStringValueWithError(env, argv[1], len, displayLocaleBuf.data(), "1")) {
464         return nullptr;
465     }
466     if (!LocaleConfig::IsValidTag(displayLocaleBuf.data())) {
467         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "locale", "a valid locale", throwError);
468         return nullptr;
469     }
470     bool sentenceCase = true;
471     if (argc > FUNC_ARGS_COUNT) {
472         napi_get_value_bool(env, argv[FUNC_ARGS_COUNT], &sentenceCase);
473     }
474     std::string value = LocaleConfig::GetDisplayLanguage(localeBuf.data(), displayLocaleBuf.data(), sentenceCase);
475     if (value.length() == 0) {
476         HILOG_ERROR_I18N("GetDisplayLanguageImpl: result is empty.");
477         return nullptr;
478     }
479     napi_value result = nullptr;
480     status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
481     if (status != napi_ok) {
482         HILOG_ERROR_I18N("GetDisplayLanguageImpl: Failed to create string item");
483         return nullptr;
484     }
485     return result;
486 }
487 
GetNapiStringValueWithError(napi_env env,napi_value napiValue,size_t len,char * valueBuf,std::string index)488 bool I18nSystemAddon::GetNapiStringValueWithError(napi_env env, napi_value napiValue, size_t len, char* valueBuf,
489     std::string index)
490 {
491     napi_status status = napi_get_value_string_utf8(env, napiValue, valueBuf, len + 1, &len);
492     if (status != napi_ok) {
493         HILOG_ERROR_I18N("GetDisplayLanguageImpl: Failed to get string item argv[%{public}s]", index.c_str());
494         return false;
495     }
496     return true;
497 }
498 
GetSystemCountriesImpl(napi_env env,napi_callback_info info,bool throwError)499 napi_value I18nSystemAddon::GetSystemCountriesImpl(napi_env env, napi_callback_info info, bool throwError)
500 {
501     size_t argc = 1;
502     napi_value argv[1] = { nullptr };
503     napi_value thisVar = nullptr;
504     void *data = nullptr;
505     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
506     if (status != napi_ok) {
507         return nullptr;
508     } else if (argc < 1) {
509         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "", throwError);
510         return nullptr;
511     }
512     VariableConvertor::VerifyType(env, "language", "string", argv[0]);
513     size_t len = 0;
514     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
515     std::vector<char> localeBuf(len + 1);
516     status = napi_get_value_string_utf8(env, argv[0], localeBuf.data(), len + 1, &len);
517     if (status != napi_ok) {
518         HILOG_ERROR_I18N("GetSystemCountriesImpl: Failed to get string item.");
519         return nullptr;
520     }
521     std::vector<std::string> systemCountries;
522     LocaleConfig::GetSystemCountries(systemCountries);
523     napi_value result = nullptr;
524     status = napi_create_array_with_length(env, systemCountries.size(), &result);
525     if (status != napi_ok) {
526         HILOG_ERROR_I18N("GetSystemCountriesImpl: Failed to create array");
527         return nullptr;
528     }
529     for (size_t i = 0; i < systemCountries.size(); i++) {
530         napi_value value = nullptr;
531         status = napi_create_string_utf8(env, systemCountries[i].c_str(), NAPI_AUTO_LENGTH, &value);
532         if (status != napi_ok) {
533             HILOG_ERROR_I18N("GetSystemCountries: Failed to create string item");
534             return nullptr;
535         }
536         status = napi_set_element(env, result, i, value);
537         if (status != napi_ok) {
538             HILOG_ERROR_I18N("GetSystemCountries: Failed to set array item");
539             return nullptr;
540         }
541     }
542     return result;
543 }
544 
GetApiCheckResult()545 bool I18nSystemAddon::GetApiCheckResult()
546 {
547     ApiCompareResult result = ApiVersion::CheckApiTargetVersion("isSuggested");
548     return result == ApiCompareResult::GREATER_THAN;
549 }
550 
IsSuggestedImpl(napi_env env,napi_callback_info info,bool throwError)551 napi_value I18nSystemAddon::IsSuggestedImpl(napi_env env, napi_callback_info info, bool throwError)
552 {
553     // Need to get two parameters to check is suggested or not.
554     size_t argc = 2;
555     napi_value argv[2] = { nullptr };
556     napi_value thisVar = nullptr;
557     void *data = nullptr;
558     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
559     if (status != napi_ok) {
560         return nullptr;
561     } else if (argc < 1) {
562         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "", throwError);
563         return nullptr;
564     }
565     VariableConvertor::VerifyType(env, "language", "string", argv[0]);
566     int32_t code = 0;
567     std::string language = VariableConvertor::GetString(env, argv[0], code);
568     if (code != 0) {
569         HILOG_ERROR_I18N("IsSuggestedImpl: Failed to get string argv[0].");
570         return nullptr;
571     }
572     bool isSuggested = false;
573     if (VariableConvertor::CheckNapiIsNull(env, argv[1])) {
574         std::string region = VariableConvertor::GetString(env, argv[1], code);
575         if (code != 0) {
576             HILOG_ERROR_I18N("IsSuggestedImpl: Failed to get string argv[1].");
577             return nullptr;
578         }
579         isSuggested = LocaleConfig::IsSuggestedV15(language, region);
580     } else {
581         isSuggested = LocaleConfig::IsSuggestedV15(language);
582     }
583     napi_value result = nullptr;
584     status = napi_get_boolean(env, isSuggested, &result);
585     if (status != napi_ok) {
586         HILOG_ERROR_I18N("Create case first boolean value failed");
587         return nullptr;
588     }
589     return result;
590 }
591 
IsSuggestedByApiVersion(const std::string & language,bool newApi)592 bool I18nSystemAddon::IsSuggestedByApiVersion(const std::string &language, bool newApi)
593 {
594     if (newApi) {
595         return LocaleConfig::IsSuggested(language);
596     }
597     return LocaleConfig::IsSuggestedV15(language);
598 }
599 
IsSuggestedByApiVersion(const std::string & language,const std::string & region,bool newApi)600 bool I18nSystemAddon::IsSuggestedByApiVersion(const std::string &language,
601     const std::string &region, bool newApi)
602 {
603     if (newApi) {
604         return LocaleConfig::IsSuggested(language, region);
605     }
606     return LocaleConfig::IsSuggestedV15(language, region);
607 }
608 
SetSystemLanguageImpl(napi_env env,napi_callback_info info,bool throwError)609 napi_value I18nSystemAddon::SetSystemLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
610 {
611     size_t argc = 1;
612     napi_value argv[1] = { 0 };
613     napi_value thisVar = nullptr;
614     void *data = nullptr;
615     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
616     if (status != napi_ok) {
617         return nullptr;
618     }
619     if (argc < 1) {
620         HILOG_ERROR_I18N("SetSystemLanguageImpl: Missing parameter");
621         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "", throwError);
622         return nullptr;
623     }
624     size_t len = 0;
625     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
626     std::vector<char> languageBuf(len + 1);
627     status = napi_get_value_string_utf8(env, argv[0], languageBuf.data(), len + 1, &len);
628     if (status != napi_ok) {
629         HILOG_ERROR_I18N("SetSystemLanguageImpl: Failed to get string item");
630         return nullptr;
631     }
632     I18nErrorCode err = I18nServiceAbilityClient::SetSystemLanguage(languageBuf.data());
633     HILOG_INFO_I18N("I18nSystemAddon::SetSystemLanguageImpl with code %{public}d", static_cast<int32_t>(err));
634     bool success = err == I18nErrorCode::SUCCESS;
635     if (throwError) {
636         if (!success) {
637             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
638         }
639         return nullptr;
640     }
641     napi_value result = nullptr;
642     status = napi_get_boolean(env, success, &result);
643     if (status != napi_ok) {
644         HILOG_ERROR_I18N("SetSystemLanguageImpl: Create set system language boolean value failed");
645         return nullptr;
646     }
647     return result;
648 }
649 
SetSystemRegionImpl(napi_env env,napi_callback_info info,bool throwError)650 napi_value I18nSystemAddon::SetSystemRegionImpl(napi_env env, napi_callback_info info, bool throwError)
651 {
652     size_t argc = 1;
653     napi_value argv[1] = { nullptr };
654     napi_value thisVar = nullptr;
655     void *data = nullptr;
656     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
657     if (status != napi_ok) {
658         return nullptr;
659     }
660     if (argc < 1) {
661         HILOG_ERROR_I18N("SetSystemRegionImpl: Missing parameter");
662         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "region", "", throwError);
663         return nullptr;
664     }
665     size_t len = 0;
666     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
667     std::vector<char> regionBuf(len + 1);
668     status = napi_get_value_string_utf8(env, argv[0], regionBuf.data(), len + 1, &len);
669     if (status != napi_ok) {
670         HILOG_ERROR_I18N("SetSystemRegionImpl: Failed to get string item");
671         return nullptr;
672     }
673     I18nErrorCode err = I18nServiceAbilityClient::SetSystemRegion(regionBuf.data());
674     HILOG_INFO_I18N("I18nSystemAddon::SetSystemRegionImpl with code %{public}d", static_cast<int32_t>(err));
675     bool success = err == I18nErrorCode::SUCCESS;
676     if (throwError) {
677         if (!success) {
678             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
679         }
680         return nullptr;
681     }
682     napi_value result = nullptr;
683     status = napi_get_boolean(env, success, &result);
684     if (status != napi_ok) {
685         HILOG_ERROR_I18N("SetSystemRegionImpl: Create set system language boolean value failed");
686         return nullptr;
687     }
688     return result;
689 }
690 
SetSystemLocaleImpl(napi_env env,napi_callback_info info,bool throwError)691 napi_value I18nSystemAddon::SetSystemLocaleImpl(napi_env env, napi_callback_info info, bool throwError)
692 {
693     size_t argc = 1;
694     napi_value argv[1] = { nullptr };
695     napi_value thisVar = nullptr;
696     void *data = nullptr;
697     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
698     if (status != napi_ok) {
699         return nullptr;
700     }
701     if (argc < 1) {
702         HILOG_ERROR_I18N("SetSystemLocaleImpl: Missing parameter");
703         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "locale", "", throwError);
704         return nullptr;
705     }
706     size_t len = 0;
707     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
708     std::vector<char> localeBuf(len + 1);
709     status = napi_get_value_string_utf8(env, argv[0], localeBuf.data(), len + 1, &len);
710     if (status != napi_ok) {
711         HILOG_ERROR_I18N("SetSystemLocaleImpl: Failed to get string item");
712         return nullptr;
713     }
714     I18nErrorCode err = I18nServiceAbilityClient::SetSystemLocale(localeBuf.data());
715     HILOG_INFO_I18N("I18nSystemAddon::SetSystemLocaleImpl with code %{public}d", static_cast<int32_t>(err));
716     bool success = err == I18nErrorCode::SUCCESS;
717     if (throwError) {
718         if (!success) {
719             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
720         }
721         return nullptr;
722     }
723     napi_value result = nullptr;
724     status = napi_get_boolean(env, success, &result);
725     if (status != napi_ok) {
726         HILOG_ERROR_I18N("SetSystemLocaleImpl: Create set system language boolean value failed");
727         return nullptr;
728     }
729     return result;
730 }
731 
Set24HourClockImpl(napi_env env,napi_callback_info info,bool throwError)732 napi_value I18nSystemAddon::Set24HourClockImpl(napi_env env, napi_callback_info info, bool throwError)
733 {
734     size_t argc = 1;
735     napi_value argv[1] = { nullptr };
736     napi_value thisVar = nullptr;
737     void *data = nullptr;
738     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
739     if (status != napi_ok) {
740         return nullptr;
741     }
742     if (argc < 1) {
743         HILOG_ERROR_I18N("Set24HourClockImpl: Missing parameter");
744         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "option", "", throwError);
745         return nullptr;
746     }
747 
748     bool option = false;
749     status = napi_get_value_bool(env, argv[0], &option);
750     if (status != napi_ok) {
751         HILOG_ERROR_I18N("Set24HourClockImpl: Failed to get boolean item");
752         return nullptr;
753     }
754     std::string optionStr = option ? "true" : "false";
755     I18nErrorCode err = I18nServiceAbilityClient::Set24HourClock(optionStr);
756     HILOG_INFO_I18N("I18nSystemAddon::Set24HourClock with code %{public}d", static_cast<int32_t>(err));
757     bool success = err == I18nErrorCode::SUCCESS;
758     if (throwError) {
759         if (!success) {
760             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
761         }
762         return nullptr;
763     }
764     napi_value result = nullptr;
765     status = napi_get_boolean(env, success, &result);
766     if (status != napi_ok) {
767         HILOG_ERROR_I18N("Create set 24HourClock boolean value failed");
768         return nullptr;
769     }
770     return result;
771 }
772 
AddPreferredLanguageImpl(napi_env env,napi_callback_info info,bool throwError)773 napi_value I18nSystemAddon::AddPreferredLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
774 {
775     size_t argc = 2;
776     napi_value argv[2] = { 0 };
777     napi_value thisVar = nullptr;
778     void *data = nullptr;
779     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
780     if (status != napi_ok) {
781         return nullptr;
782     }
783 
784     std::string language;
785     if (!ParseStringParam(env, argc > 0 ? argv[0] : nullptr, throwError, language)) {
786         return nullptr;
787     }
788 
789     int index = 1000000;
790     if (VariableConvertor::CheckNapiIsNull(env, argc > 1 ? argv[1] : nullptr)) {
791         status = napi_get_value_int32(env, argv[1], &index);
792         if (status != napi_ok) {
793             HILOG_ERROR_I18N("addPreferrdLanguage: get index failed");
794             return nullptr;
795         }
796     }
797     I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage(language.data(), index);
798     HILOG_INFO_I18N("I18nSystemAddon::AddPreferredLanguageImpl with code %{public}d", static_cast<int32_t>(err));
799     if (throwError) {
800         if (err == I18nErrorCode::NO_PERMISSION) {
801             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
802         }
803         if (err != I18nErrorCode::SUCCESS) {
804             ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "language", "a valid language", throwError);
805         }
806         return nullptr;
807     }
808     bool addResult = true;
809     if (err != I18nErrorCode::SUCCESS) {
810         addResult = false;
811     }
812     napi_value result = nullptr;
813     status = napi_get_boolean(env, addResult, &result);
814     if (status != napi_ok) {
815         HILOG_ERROR_I18N("addPreferrdLanguage: create boolean result failed");
816         return nullptr;
817     }
818     return result;
819 }
820 
RemovePreferredLanguageImpl(napi_env env,napi_callback_info info,bool throwError)821 napi_value I18nSystemAddon::RemovePreferredLanguageImpl(napi_env env, napi_callback_info info, bool throwError)
822 {
823     size_t argc = 1;
824     napi_value argv[1] = { nullptr };
825     napi_value thisVar = nullptr;
826     void *data = nullptr;
827     int len = 0;
828     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
829     if (status != napi_ok) {
830         return nullptr;
831     }
832     if (argc < 1) {
833         HILOG_ERROR_I18N("RemovePreferredLanguageImpl: Missing parameter");
834         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "index", "", throwError);
835         return nullptr;
836     }
837 
838     napi_valuetype valueType = napi_valuetype::napi_undefined;
839     napi_typeof(env, argv[0], &valueType);
840     if (valueType != napi_valuetype::napi_number) {
841         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "index", "number", throwError);
842         return nullptr;
843     }
844     int index = 1000000;
845     status = napi_get_value_int32(env, argv[0], &index);
846     if (status != napi_ok) {
847         HILOG_ERROR_I18N("removePreferrdLanguage: get index failed");
848         return nullptr;
849     }
850     len = static_cast<int>(PreferredLanguage::GetPreferredLanguageList().size());
851     if ((index < 0 || index > len - 1) && throwError) {
852         ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "index", "within the valid range", throwError);
853         return nullptr;
854     }
855     I18nErrorCode err = I18nServiceAbilityClient::RemovePreferredLanguage(index);
856     bool success = err == I18nErrorCode::SUCCESS;
857 
858     if (throwError) {
859         if (!success) {
860             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
861         }
862         return nullptr;
863     }
864     napi_value result = nullptr;
865     status = napi_get_boolean(env, success, &result);
866     if (status != napi_ok) {
867         HILOG_ERROR_I18N("removePreferrdLanguage: create boolean result failed");
868         return nullptr;
869     }
870     return result;
871 }
872 
SetUsingLocalDigitAddonImpl(napi_env env,napi_callback_info info,bool throwError)873 napi_value I18nSystemAddon::SetUsingLocalDigitAddonImpl(napi_env env, napi_callback_info info, bool throwError)
874 {
875     size_t argc = 1;
876     napi_value argv[1] = { nullptr };
877     napi_value thisVar = nullptr;
878     void *data = nullptr;
879     napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
880 
881     if (argc < 1) {
882         HILOG_ERROR_I18N("Invalid parameter nullptr");
883         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "flag", "", throwError);
884         return nullptr;
885     }
886     napi_valuetype valueType = napi_valuetype::napi_undefined;
887     napi_typeof(env, argv[0], &valueType);
888     if (valueType != napi_valuetype::napi_boolean) {
889         HILOG_ERROR_I18N("Invalid parameter type");
890         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "flag", "boolean", throwError);
891         return nullptr;
892     }
893     bool flag = false;
894     napi_status status = napi_get_value_bool(env, argv[0], &flag);
895     if (status != napi_ok) {
896         HILOG_ERROR_I18N("Get parameter flag failed");
897         return nullptr;
898     }
899     I18nErrorCode err = I18nServiceAbilityClient::SetUsingLocalDigit(flag);
900     HILOG_INFO_I18N("I18nSystemAddon::SetUsingLocalDigitAddonImpl with code %{public}d",
901         static_cast<int32_t>(err));
902     bool res = err == I18nErrorCode::SUCCESS;
903     if (throwError) {
904         if (!res) {
905             ErrorUtil::NapiThrow(env, I18N_NO_PERMISSION, "", "", throwError);
906         }
907         return nullptr;
908     }
909     napi_value value = nullptr;
910     status = napi_get_boolean(env, res, &value);
911     if (status != napi_ok) {
912         HILOG_ERROR_I18N("Invalid result");
913         return nullptr;
914     }
915     return value;
916 }
917 
ParseStringParam(napi_env env,napi_value argv,bool throwError,std::string & strParam)918 bool I18nSystemAddon::ParseStringParam(napi_env env, napi_value argv, bool throwError, std::string &strParam)
919 {
920     if (argv == nullptr) {
921         HILOG_ERROR_I18N("ParseStringParam: Missing parameter");
922         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "", throwError);
923         return false;
924     }
925     napi_valuetype valueType = napi_valuetype::napi_undefined;
926     napi_typeof(env, argv, &valueType);
927     if (valueType != napi_valuetype::napi_string) {
928         ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "string", throwError);
929         return false;
930     }
931     size_t len = 0;
932     napi_status status = napi_get_value_string_utf8(env, argv, nullptr, 0, &len);
933     if (status != napi_ok) {
934         HILOG_ERROR_I18N("get string parameter length failed");
935         return false;
936     }
937     std::vector<char> res(len + 1);
938     status = napi_get_value_string_utf8(env, argv, res.data(), len + 1, &len);
939     if (status != napi_ok) {
940         HILOG_ERROR_I18N("get string parameter failed");
941         return false;
942     }
943     strParam = res.data();
944     return true;
945 }
946 
GetSimplifiedLanguage(napi_env env,napi_callback_info info)947 napi_value I18nSystemAddon::GetSimplifiedLanguage(napi_env env, napi_callback_info info)
948 {
949     // Need to get one parameter
950     size_t argc = 1;
951     napi_value argv[1] = { nullptr };
952     napi_value thisVar = nullptr;
953     void *data = nullptr;
954     napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
955     if (status != napi_ok) {
956         HILOG_ERROR_I18N("GetSimplifiedLanguage get parameter fail");
957         return nullptr;
958     }
959 
960     std::string simplifiedLanguage = "";
961     if (VariableConvertor::CheckNapiIsNull(env, argv[0])) {
962         napi_valuetype valueType = napi_valuetype::napi_undefined;
963         napi_typeof(env, argv[0], &valueType);
964         if (valueType != napi_valuetype::napi_string) {
965             HILOG_ERROR_I18N("GetSimplifiedLanguage Parameter type is not string");
966             ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "language", "string", true);
967             return nullptr;
968         }
969         int code = 0;
970         std::string language = VariableConvertor::GetString(env, argv[0], code);
971         if (code == 1) {
972             HILOG_ERROR_I18N("GetSimplifiedLanguage can't get string from js param");
973             return nullptr;
974         }
975         code = 0;
976         simplifiedLanguage = LocaleConfig::GetSimplifiedLanguage(language, code);
977         if (code != 0) {
978             HILOG_ERROR_I18N("GetSimplifiedLanguage: language is not valid");
979             ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "language", "a valid language", true);
980             return nullptr;
981         }
982     } else {
983         simplifiedLanguage = LocaleConfig::GetSimplifiedSystemLanguage();
984     }
985 
986     napi_value result = VariableConvertor::CreateString(env, simplifiedLanguage);
987     if (!result) {
988         HILOG_ERROR_I18N("GetSimplifiedLanguage: Failed to create string item");
989     }
990     return result;
991 }
992 } // namespace I18n
993 } // namespace Global
994 } // namespace OHOS