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