1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "intl_impl.h"
16
17 #include <vector>
18 #include <map>
19 #include "cj_lambda.h"
20
21 using namespace OHOS::FFI;
22
23 namespace OHOS::Global::I18n::Intl {
ArrayStringToVectorString(CArrString arrString)24 std::vector<std::string> ArrayStringToVectorString(CArrString arrString)
25 {
26 std::vector<std::string> res;
27 for (int i = 0; i < arrString.size; i++) {
28 std::string value = arrString.head[i];
29 res.push_back(value);
30 }
31 return res;
32 }
33
IMallocCString(const std::string & origin)34 char *IMallocCString(const std::string &origin)
35 {
36 if (origin.empty()) {
37 return nullptr;
38 }
39 auto length = origin.length() + 1;
40 char *res = static_cast<char *>(malloc(sizeof(char) * length));
41 if (res == nullptr) {
42 return nullptr;
43 }
44 return std::char_traits<char>::copy(res, origin.c_str(), length);
45 }
46
NumberFormatImpl(int32_t * errCode)47 NumberFormatImpl::NumberFormatImpl(int32_t *errCode)
48 {
49 std::vector<std::string> locale;
50 std::map<std::string, std::string> map = {};
51 numberFmt_ = std::make_unique<NumberFormat>(locale, map);
52
53 if (numberFmt_ == nullptr) {
54 *errCode = -1;
55 HILOG_ERROR_I18N("The numberFormat is nullptr");
56 return;
57 }
58 }
59
NumberFormatImpl(char * locale,CNumberOptions options,int64_t flag,int32_t * errCode)60 NumberFormatImpl::NumberFormatImpl(char *locale, CNumberOptions options, int64_t flag, int32_t *errCode)
61 {
62 std::vector<std::string> locale_list;
63 std::string locale_str = locale;
64 locale_list.push_back(locale_str);
65 std::map<std::string, std::string> map = {};
66 if (flag == 0) {
67 if (std::strlen(options.locale) != 0) {
68 map.insert(std::make_pair("locale", options.locale));
69 }
70 if (std::strlen(options.currency) != 0) {
71 map.insert(std::make_pair("currency", options.currency));
72 }
73 map.insert(std::make_pair("currencySign", options.currencySign));
74 map.insert(std::make_pair("currencyDisplay", options.currencyDisplay));
75 if (std::strlen(options.unit) != 0) {
76 map.insert(std::make_pair("unit", options.unit));
77 }
78 map.insert(std::make_pair("unitDisplay", options.unitDisplay));
79 map.insert(std::make_pair("unitUsage", options.unitUsage));
80 map.insert(std::make_pair("signDispaly", options.signDispaly));
81 map.insert(std::make_pair("compactDisplay", options.compactDisplay));
82 map.insert(std::make_pair("notation", options.notation));
83 map.insert(std::make_pair("localeMather", options.localeMather));
84 map.insert(std::make_pair("style", options.style));
85 if (std::strlen(options.numberingSystem) != 0) {
86 map.insert(std::make_pair("numberingSystem", options.numberingSystem));
87 }
88 std::string value = std::to_string(options.useGrouping) == "1" ? "true" : "false";
89 map.insert(std::make_pair("useGrouping", value));
90 map.insert(std::make_pair("minimumIntegerDigits", std::to_string(options.minimumIntegerDigits)));
91 map.insert(std::make_pair("minimumFractionDigits", std::to_string(options.minimumFractionDigits)));
92 map.insert(std::make_pair("maximumFractionDigits", std::to_string(options.maximumFractionDigits)));
93 map.insert(std::make_pair("minimumSignificantDigits", std::to_string(options.minimumSignificantDigits)));
94 map.insert(std::make_pair("maximumSignificantDigits", std::to_string(options.maximumSignificantDigits)));
95 if (options.minimumFractionDigits != -1 && options.maximumFractionDigits != -1 &&
96 options.minimumFractionDigits > options.maximumFractionDigits) {
97 HILOG_ERROR_I18N(
98 "GetNumberOptionValues: Invalid parameter value: minimumFractionDigits > maximumFractionDigits");
99 }
100 }
101 numberFmt_ = std::make_unique<NumberFormat>(locale_list, map);
102
103 if (numberFmt_ == nullptr) {
104 *errCode = -1;
105 HILOG_ERROR_I18N("The numberFormat is nullptr");
106 return;
107 }
108 }
109
NumberFormatImpl(CArrString locale,CNumberOptions options,int64_t flag,int32_t * errCode)110 NumberFormatImpl::NumberFormatImpl(CArrString locale, CNumberOptions options, int64_t flag, int32_t *errCode)
111 {
112 std::vector<std::string> locale_list = ArrayStringToVectorString(locale);
113 std::map<std::string, std::string> map = {};
114 if (flag == 0) {
115 if (std::strlen(options.locale) != 0) {
116 map.insert(std::make_pair("locale", options.locale));
117 }
118 if (std::strlen(options.currency) != 0) {
119 map.insert(std::make_pair("currency", options.currency));
120 }
121 map.insert(std::make_pair("currencySign", options.currencySign));
122 map.insert(std::make_pair("currencyDisplay", options.currencyDisplay));
123 if (std::strlen(options.unit) != 0) {
124 map.insert(std::make_pair("unit", options.unit));
125 }
126 map.insert(std::make_pair("unitDisplay", options.unitDisplay));
127 map.insert(std::make_pair("unitUsage", options.unitUsage));
128 map.insert(std::make_pair("signDispaly", options.signDispaly));
129 map.insert(std::make_pair("compactDisplay", options.compactDisplay));
130 map.insert(std::make_pair("notation", options.notation));
131 map.insert(std::make_pair("localeMather", options.localeMather));
132 map.insert(std::make_pair("style", options.style));
133 if (std::strlen(options.numberingSystem) != 0) {
134 map.insert(std::make_pair("numberingSystem", options.numberingSystem));
135 }
136 std::string value = std::to_string(options.useGrouping) == "1" ? "true" : "false";
137 map.insert(std::make_pair("useGrouping", value));
138 map.insert(std::make_pair("minimumIntegerDigits", std::to_string(options.minimumIntegerDigits)));
139 map.insert(std::make_pair("minimumFractionDigits", std::to_string(options.minimumFractionDigits)));
140 map.insert(std::make_pair("maximumFractionDigits", std::to_string(options.maximumFractionDigits)));
141 map.insert(std::make_pair("minimumSignificantDigits", std::to_string(options.minimumSignificantDigits)));
142 map.insert(std::make_pair("maximumSignificantDigits", std::to_string(options.maximumSignificantDigits)));
143
144 if (options.minimumFractionDigits != -1 && options.maximumFractionDigits != -1 &&
145 options.minimumFractionDigits > options.maximumFractionDigits) {
146 HILOG_ERROR_I18N(
147 "GetNumberOptionValues: Invalid parameter value: minimumFractionDigits > maximumFractionDigits");
148 }
149 }
150 numberFmt_ = std::make_unique<NumberFormat>(locale_list, map);
151
152 if (numberFmt_ == nullptr) {
153 *errCode = -1;
154 HILOG_ERROR_I18N("The numberFormat is nullptr");
155 return;
156 }
157 }
158
Format(double number)159 char *NumberFormatImpl::Format(double number)
160 {
161 std::string value = numberFmt_->Format(number);
162 return IMallocCString(value);
163 }
164
ResolveOptions()165 CNumberOptions NumberFormatImpl::ResolveOptions()
166 {
167 std::map<std::string, std::string> options = {};
168 numberFmt_->GetResolvedOptions(options);
169 struct CNumberOptions numberOptions;
170 numberOptions.locale = IMallocCString(options["locale"]);
171 numberOptions.currency = IMallocCString(options["currency"]);
172 numberOptions.currencySign = IMallocCString(options["currencySign"]);
173 numberOptions.unit = IMallocCString(options["unit"]);
174 numberOptions.unitDisplay = IMallocCString(options["unitDisplay"]);
175 numberOptions.unitUsage = IMallocCString(options["unitUsage"]);
176 numberOptions.signDispaly = IMallocCString(options["signDispaly"]);
177 numberOptions.compactDisplay = IMallocCString(options["compactDisplay"]);
178 numberOptions.notation = IMallocCString(options["notation"]);
179 numberOptions.localeMather = IMallocCString(options["localeMather"]);
180 numberOptions.style = IMallocCString(options["style"]);
181 numberOptions.numberingSystem = IMallocCString(options["numberingSystem"]);
182 numberOptions.useGrouping = (options["useGrouping"] == "true");
183 numberOptions.minimumIntegerDigits = atoi(options["minimumIntegerDigits"].c_str());
184 numberOptions.minimumFractionDigits = atoi(options["minimumFractionDigits"].c_str());
185 numberOptions.maximumFractionDigits = atoi(options["maximumFractionDigits"].c_str());
186 numberOptions.minimumSignificantDigits = atoi(options["minimumSignificantDigits"].c_str());
187 numberOptions.maximumSignificantDigits = atoi(options["maximumSignificantDigits"].c_str());
188
189 return numberOptions;
190 }
191
RelativeTimeFormatImpl(int32_t * errCode)192 RelativeTimeFormatImpl::RelativeTimeFormatImpl(int32_t *errCode)
193 {
194 std::vector<std::string> locale;
195 std::map<std::string, std::string> options = {};
196 relativeTimeFmt_ = std::make_unique<RelativeTimeFormat>(locale, options);
197
198 if (relativeTimeFmt_ == nullptr) {
199 *errCode = -1;
200 HILOG_ERROR_I18N("The RelativeTimeFormat is nullptr");
201 return;
202 }
203 }
204
RelativeTimeFormatImpl(char * locale,CRelativeTimeFormatInputOptions options,int64_t flag,int32_t * errCode)205 RelativeTimeFormatImpl::RelativeTimeFormatImpl(
206 char *locale, CRelativeTimeFormatInputOptions options, int64_t flag, int32_t *errCode)
207 {
208 std::vector<std::string> locale_list;
209 std::string locale_str = locale;
210 locale_list.push_back(locale_str);
211 std::map<std::string, std::string> map = {};
212 if (flag == 0) {
213 map.insert(std::make_pair("localeMatcher", options.localeMatcher));
214 map.insert(std::make_pair("numeric", options.numeric));
215 map.insert(std::make_pair("style", options.style));
216 }
217 relativeTimeFmt_ = std::make_unique<RelativeTimeFormat>(locale_list, map);
218 if (relativeTimeFmt_ == nullptr) {
219 *errCode = -1;
220 HILOG_ERROR_I18N("The RelativeTimeFormat is nullptr");
221 return;
222 }
223 }
224
RelativeTimeFormatImpl(CArrString locale,CRelativeTimeFormatInputOptions options,int64_t flag,int32_t * errCode)225 RelativeTimeFormatImpl::RelativeTimeFormatImpl(
226 CArrString locale, CRelativeTimeFormatInputOptions options, int64_t flag, int32_t *errCode)
227 {
228 std::vector<std::string> locale_list = ArrayStringToVectorString(locale);
229
230 std::map<std::string, std::string> map = {};
231 if (flag == 0) {
232 map.insert(std::make_pair("localeMatcher", options.localeMatcher));
233 map.insert(std::make_pair("numeric", options.numeric));
234 map.insert(std::make_pair("style", options.style));
235 }
236 relativeTimeFmt_ = std::make_unique<RelativeTimeFormat>(locale_list, map);
237
238 if (relativeTimeFmt_ == nullptr) {
239 *errCode = -1;
240 HILOG_ERROR_I18N("The RelativeTimeFormat is nullptr");
241 return;
242 }
243 }
244
Format(double number,char * unit)245 char *RelativeTimeFormatImpl::Format(double number, char *unit)
246 {
247 std::string unitStr = unit;
248 std::string value = relativeTimeFmt_->Format(number, unitStr);
249 char *res = IMallocCString(value);
250 return res;
251 }
252
FreeCArrArrString(CArrString * arr,size_t index)253 void FreeCArrArrString(CArrString *arr, size_t index)
254 {
255 for (size_t i = 0; i < index; i++) {
256 for (int64_t j = 0; j < arr[i].size; j++) {
257 free(arr[i].head[j]);
258 }
259 free(arr[i].head);
260 }
261 }
262
FormatToParts(double number,char * unit)263 CArrArrString RelativeTimeFormatImpl::FormatToParts(double number, char *unit)
264 {
265 std::string unitStr = unit;
266 std::vector<std::vector<std::string>> timeVectorStr;
267
268 CArrArrString ret = {.head = nullptr, .size = 0};
269 relativeTimeFmt_->FormatToParts(number, unitStr, timeVectorStr);
270 CArrString *res = static_cast<CArrString *>(malloc(sizeof(CArrString) * timeVectorStr.size()));
271 if (res == nullptr) {
272 HILOG_ERROR_I18N("The CArrString is nullptr");
273 return ret;
274 }
275
276 for (size_t i = 0; i < timeVectorStr.size(); i++) {
277 std::vector<std::string> timeVector = timeVectorStr[i];
278 CArrString retime = {.head = nullptr, .size = 0};
279 char **time = static_cast<char **>(malloc(sizeof(char *) * timeVector.size()));
280 if (time == nullptr) {
281 HILOG_ERROR_I18N("The char** is nullptr");
282 FreeCArrArrString(res, i);
283 free(res);
284 return ret;
285 }
286 for (size_t j = 0; j < timeVector.size(); j++) {
287 std::string value = timeVector[j];
288 time[j] = IMallocCString(value);
289 }
290 retime.head = time;
291 retime.size = static_cast<int64_t>(timeVector.size());
292 res[i] = retime;
293 }
294 ret.head = res;
295 ret.size = static_cast<int64_t>(timeVectorStr.size());
296 return ret;
297 }
298
ResolveOptions()299 CRelativeTimeFormatResolveOptions RelativeTimeFormatImpl::ResolveOptions()
300 {
301 std::map<std::string, std::string> options = {};
302 relativeTimeFmt_->GetResolvedOptions(options);
303 struct CRelativeTimeFormatResolveOptions relativeTimeFormatResolveOptions;
304 relativeTimeFormatResolveOptions.localeMatcher = IMallocCString(options["localeMatcher"]);
305 relativeTimeFormatResolveOptions.numeric = IMallocCString(options["numeric"]);
306 relativeTimeFormatResolveOptions.style = IMallocCString(options["style"]);
307 relativeTimeFormatResolveOptions.numberingSystem = IMallocCString(options["numberingSystem"]);
308 return relativeTimeFormatResolveOptions;
309 }
310
PluralRulesImpl(int32_t * errCode)311 PluralRulesImpl::PluralRulesImpl(int32_t *errCode)
312 {
313 std::vector<std::string> locale;
314 std::map<std::string, std::string> options = {};
315 pluralRules_ = std::make_unique<PluralRules>(locale, options);
316
317 if (pluralRules_ == nullptr) {
318 *errCode = -1;
319 HILOG_ERROR_I18N("The PluralRules is nullptr");
320 return;
321 }
322 }
323
PluralRulesImpl(char * locale,CPluralRulesOptions options,int64_t flag,int32_t * errCode)324 PluralRulesImpl::PluralRulesImpl(char *locale, CPluralRulesOptions options, int64_t flag, int32_t *errCode)
325 {
326 std::vector<std::string> locale_list;
327 std::string locale_str = locale;
328 locale_list.push_back(locale_str);
329 std::map<std::string, std::string> map = {};
330 if (flag == 0) {
331 map.insert(std::make_pair("localeMatcher", options.localeMatcher));
332 map.insert(std::make_pair("type", options.type));
333 map.insert(std::make_pair("minimumIntegerDigits", std::to_string(options.minimumIntegerDigits)));
334 map.insert(std::make_pair("minimumFractionDigits", std::to_string(options.minimumFractionDigits)));
335 map.insert(std::make_pair("maximumFractionDigits", std::to_string(options.maximumFractionDigits)));
336 map.insert(std::make_pair("minimumSignificantDigits", std::to_string(options.minimumSignificantDigits)));
337 map.insert(std::make_pair("maximumSignificantDigits", std::to_string(options.maximumSignificantDigits)));
338 }
339 pluralRules_ = std::make_unique<PluralRules>(locale_list, map);
340
341 if (pluralRules_ == nullptr) {
342 *errCode = -1;
343 HILOG_ERROR_I18N("The PluralRules is nullptr");
344 return;
345 }
346 }
347
PluralRulesImpl(CArrString locale,CPluralRulesOptions options,int64_t flag,int32_t * errCode)348 PluralRulesImpl::PluralRulesImpl(CArrString locale, CPluralRulesOptions options, int64_t flag, int32_t *errCode)
349 {
350 std::vector<std::string> locale_list = ArrayStringToVectorString(locale);
351
352 std::map<std::string, std::string> map = {};
353 if (flag == 0) {
354 map.insert(std::make_pair("localeMatcher", options.localeMatcher));
355 map.insert(std::make_pair("type", options.type));
356 map.insert(std::make_pair("minimumIntegerDigits", std::to_string(options.minimumIntegerDigits)));
357 map.insert(std::make_pair("minimumFractionDigits", std::to_string(options.minimumFractionDigits)));
358 map.insert(std::make_pair("maximumFractionDigits", std::to_string(options.maximumFractionDigits)));
359 map.insert(std::make_pair("minimumSignificantDigits", std::to_string(options.minimumSignificantDigits)));
360 map.insert(std::make_pair("maximumSignificantDigits", std::to_string(options.maximumSignificantDigits)));
361 }
362 pluralRules_ = std::make_unique<PluralRules>(locale_list, map);
363
364 if (pluralRules_ == nullptr) {
365 *errCode = -1;
366 HILOG_ERROR_I18N("The PluralRules is nullptr");
367 return;
368 }
369 }
370
Select(double n)371 char *PluralRulesImpl::Select(double n)
372 {
373 std::string value = pluralRules_->Select(n);
374 char *res = IMallocCString(value);
375 return res;
376 }
377
CollatorImpl(int32_t * errCode)378 CollatorImpl::CollatorImpl(int32_t *errCode)
379 {
380 std::vector<std::string> locale;
381 std::map<std::string, std::string> options = {};
382 collator_ = std::make_unique<Collator>(locale, options);
383
384 if (collator_ == nullptr) {
385 *errCode = -1;
386 HILOG_ERROR_I18N("The Collator is nullptr");
387 return;
388 }
389 }
390
CollatorImpl(char * locale,CCollatorOptions options,int64_t flag,int32_t * errCode)391 CollatorImpl::CollatorImpl(char *locale, CCollatorOptions options, int64_t flag, int32_t *errCode)
392 {
393 std::vector<std::string> locale_list;
394 std::string locale_str = locale;
395 locale_list.push_back(locale_str);
396 std::map<std::string, std::string> map = {};
397 if (flag == 0) {
398 map.insert(std::make_pair("localeMatcher", options.localeMatcher));
399 map.insert(std::make_pair("usage", options.usage));
400 map.insert(std::make_pair("sensitivity", options.sensitivity));
401 std::string ignore = std::to_string(options.ignorePunctuation) == "1" ? "true" : "false";
402 map.insert(std::make_pair("ignorePunctuation", ignore));
403 map.insert(std::make_pair("collation", options.collation));
404 std::string num = std::to_string(options.numeric) == "1" ? "true" : "false";
405 map.insert(std::make_pair("numeric", num));
406 map.insert(std::make_pair("caseFirst", options.caseFirst));
407 }
408 collator_ = std::make_unique<Collator>(locale_list, map);
409
410 if (collator_ == nullptr) {
411 *errCode = -1;
412 HILOG_ERROR_I18N("The Collator is nullptr");
413 return;
414 }
415 }
416
CollatorImpl(CArrString locale,CCollatorOptions options,int64_t flag,int32_t * errCode)417 CollatorImpl::CollatorImpl(CArrString locale, CCollatorOptions options, int64_t flag, int32_t *errCode)
418 {
419 std::vector<std::string> locale_list = ArrayStringToVectorString(locale);
420
421 std::map<std::string, std::string> map = {};
422 if (flag == 0) {
423 map.insert(std::make_pair("localeMatcher", options.localeMatcher));
424 map.insert(std::make_pair("usage", options.usage));
425 map.insert(std::make_pair("sensitivity", options.sensitivity));
426 std::string ignore = std::to_string(options.ignorePunctuation) == "1" ? "true" : "false";
427 map.insert(std::make_pair("ignorePunctuation", ignore));
428 map.insert(std::make_pair("collation", options.collation));
429 std::string num = std::to_string(options.numeric) == "1" ? "true" : "false";
430 map.insert(std::make_pair("numeric", num));
431 map.insert(std::make_pair("caseFirst", options.caseFirst));
432 }
433 collator_ = std::make_unique<Collator>(locale_list, map);
434
435 if (collator_ == nullptr) {
436 *errCode = -1;
437 HILOG_ERROR_I18N("The Collator is nullptr");
438 return;
439 }
440 }
441
ResolveOptions()442 CCollatorOptions CollatorImpl::ResolveOptions()
443 {
444 std::map<std::string, std::string> options = {};
445 collator_->ResolvedOptions(options);
446 struct CCollatorOptions collatorResolveOptions;
447 collatorResolveOptions.localeMatcher = IMallocCString(options["localeMatcher"]);
448 collatorResolveOptions.usage = IMallocCString(options["usage"]);
449 collatorResolveOptions.sensitivity = IMallocCString(options["sensitivity"]);
450 collatorResolveOptions.ignorePunctuation = (options["ignorePunctuation"] == "true");
451 collatorResolveOptions.collation = IMallocCString(options["collation"]);
452 collatorResolveOptions.numeric = (options["numeric"] == "true");
453 collatorResolveOptions.caseFirst = IMallocCString(options["caseFirst"]);
454
455 return collatorResolveOptions;
456 }
457
Compare(char * str1,char * str2)458 int32_t CollatorImpl::Compare(char *str1, char *str2)
459 {
460 std::string str1_str = str1;
461 std::string str2_str = str2;
462 int32_t result = collator_->Compare(str1_str, str2_str);
463 return result;
464 }
465
DateTimeFormatImpl(int32_t * errCode)466 DateTimeFormatImpl::DateTimeFormatImpl(int32_t *errCode)
467 {
468 std::vector<std::string> locale;
469 std::map<std::string, std::string> options = {};
470 dateFmt_ = std::make_unique<DateTimeFormat>(locale, options);
471
472 if (dateFmt_ == nullptr) {
473 *errCode = -1;
474 HILOG_ERROR_I18N("The DateTimeFormat is nullptr");
475 return;
476 }
477 }
478
DateTimeFormatImpl(char * locale,CDateTimeOptions options,int64_t flag,int32_t * errCode)479 DateTimeFormatImpl::DateTimeFormatImpl(char *locale, CDateTimeOptions options, int64_t flag, int32_t *errCode)
480 {
481 std::vector<std::string> locale_list;
482 std::string locale_str = locale;
483 locale_list.push_back(locale_str);
484 std::map<std::string, std::string> map = {};
485 if (flag == 0) {
486 if (std::strlen(options.locale) != 0) {
487 map.insert(std::make_pair("locale", options.locale));
488 }
489 if (std::strlen(options.dateStyle) != 0) {
490 map.insert(std::make_pair("dateStyle", options.dateStyle));
491 }
492 if (std::strlen(options.timeStyle) != 0) {
493 map.insert(std::make_pair("timeStyle", options.timeStyle));
494 }
495 if (std::strlen(options.hourCycle) != 0) {
496 map.insert(std::make_pair("hourCycle", options.hourCycle));
497 }
498 if (std::strlen(options.timeZone) != 0) {
499 map.insert(std::make_pair("timeZone", options.timeZone));
500 }
501 if (std::strlen(options.numberingSystem) != 0) {
502 map.insert(std::make_pair("numberingSystem", options.numberingSystem));
503 }
504 std::string h12 = std::to_string(options.hour12) == "1" ? "true" : "false";
505 map.insert(std::make_pair("hour12", h12));
506 if (std::strlen(options.weekday) != 0) {
507 map.insert(std::make_pair("weekday", options.weekday));
508 }
509 std::map<std::string, std::string> map1 = MapInsert(options);
510 map.insert(map1.begin(), map1.end());
511 }
512 dateFmt_ = std::make_unique<DateTimeFormat>(locale_list, map);
513
514 if (dateFmt_ == nullptr) {
515 *errCode = -1;
516 HILOG_ERROR_I18N("The DateTimeFormat is nullptr");
517 return;
518 }
519 }
520
MapInsert(CDateTimeOptions options)521 std::map<std::string, std::string> DateTimeFormatImpl::MapInsert(CDateTimeOptions options)
522 {
523 std::map<std::string, std::string> map = {};
524 if (std::strlen(options.era) != 0) {
525 map.insert(std::make_pair("era", options.era));
526 }
527 if (std::strlen(options.year) != 0) {
528 map.insert(std::make_pair("year", options.year));
529 }
530 if (std::strlen(options.month) != 0) {
531 map.insert(std::make_pair("month", options.month));
532 }
533 if (std::strlen(options.day) != 0) {
534 map.insert(std::make_pair("day", options.day));
535 }
536 if (std::strlen(options.hour) != 0) {
537 map.insert(std::make_pair("hour", options.hour));
538 }
539 if (std::strlen(options.minute) != 0) {
540 map.insert(std::make_pair("minute", options.minute));
541 }
542 if (std::strlen(options.second) != 0) {
543 map.insert(std::make_pair("second", options.second));
544 }
545 if (std::strlen(options.timeZoneName) != 0) {
546 map.insert(std::make_pair("timeZoneName", options.timeZoneName));
547 }
548 if (std::strlen(options.dayPeriod) != 0) {
549 map.insert(std::make_pair("dayPeriod", options.dayPeriod));
550 }
551 if (std::strlen(options.localeMatcher) != 0) {
552 map.insert(std::make_pair("localeMatcher", options.localeMatcher));
553 }
554 if (std::strlen(options.formatMatcher) != 0) {
555 map.insert(std::make_pair("formatMatcher", options.formatMatcher));
556 }
557 return map;
558 }
559
DateTimeFormatImpl(CArrString locale,CDateTimeOptions options,int64_t flag,int32_t * errCode)560 DateTimeFormatImpl::DateTimeFormatImpl(CArrString locale, CDateTimeOptions options, int64_t flag, int32_t *errCode)
561 {
562 std::vector<std::string> locale_list = ArrayStringToVectorString(locale);
563
564 std::map<std::string, std::string> map = {};
565 if (flag == 0) {
566 if (std::strlen(options.locale) != 0) {
567 map.insert(std::make_pair("locale", options.locale));
568 }
569 if (std::strlen(options.dateStyle) != 0) {
570 map.insert(std::make_pair("dateStyle", options.dateStyle));
571 }
572 if (std::strlen(options.timeStyle) != 0) {
573 map.insert(std::make_pair("timeStyle", options.timeStyle));
574 }
575 if (std::strlen(options.hourCycle) != 0) {
576 map.insert(std::make_pair("hourCycle", options.hourCycle));
577 }
578 if (std::strlen(options.timeZone) != 0) {
579 map.insert(std::make_pair("timeZone", options.timeZone));
580 }
581 if (std::strlen(options.numberingSystem) != 0) {
582 map.insert(std::make_pair("numberingSystem", options.numberingSystem));
583 }
584 std::string h12 = std::to_string(options.hour12) == "1" ? "true" : "false";
585 map.insert(std::make_pair("hour12", h12));
586 if (std::strlen(options.weekday) != 0) {
587 map.insert(std::make_pair("weekday", options.weekday));
588 }
589 std::map<std::string, std::string> map1 = MapInsert(options);
590 map.insert(map1.begin(), map1.end());
591 }
592 dateFmt_ = std::make_unique<DateTimeFormat>(locale_list, map);
593
594 if (dateFmt_ == nullptr) {
595 *errCode = -1;
596 HILOG_ERROR_I18N("The DateTimeFormat is nullptr");
597 return;
598 }
599 }
600
ResolveOptions()601 CDateTimeOptions DateTimeFormatImpl::ResolveOptions()
602 {
603 std::map<std::string, std::string> options = {};
604 dateFmt_->GetResolvedOptions(options);
605 struct CDateTimeOptions dateTimeOptions;
606 dateTimeOptions.locale = IMallocCString(options["locale"]);
607 dateTimeOptions.dateStyle = IMallocCString(options["dateStyle"]);
608 dateTimeOptions.timeStyle = IMallocCString(options["timeStyle"]);
609 dateTimeOptions.hourCycle = IMallocCString(options["hourCycle"]);
610 dateTimeOptions.timeZone = IMallocCString(options["timeZone"]);
611 dateTimeOptions.numberingSystem = IMallocCString(options["numberingSystem"]);
612 bool h = (options["hour"] == "true");
613 dateTimeOptions.hour12 = h;
614 dateTimeOptions.weekday = IMallocCString(options["weekday"]);
615 dateTimeOptions.era = IMallocCString(options["era"]);
616 dateTimeOptions.year = IMallocCString(options["year"]);
617 dateTimeOptions.month = IMallocCString(options["month"]);
618 dateTimeOptions.day = IMallocCString(options["day"]);
619 dateTimeOptions.hour = IMallocCString(options["hour"]);
620 dateTimeOptions.minute = IMallocCString(options["minute"]);
621 dateTimeOptions.second = IMallocCString(options["second"]);
622 dateTimeOptions.timeZoneName = IMallocCString(options["timeZoneName"]);
623 dateTimeOptions.localeMatcher = IMallocCString(options["localeMatcher"]);
624 dateTimeOptions.formatMatcher = IMallocCString(options["formatMatcher"]);
625 return dateTimeOptions;
626 }
627
Format(int64_t date)628 char *DateTimeFormatImpl::Format(int64_t date)
629 {
630 std::string date_str = dateFmt_->Format(date);
631 char *res = IMallocCString(date_str);
632 return res;
633 }
634
FormatRange(int64_t startDate,int64_t endDate)635 char *DateTimeFormatImpl::FormatRange(int64_t startDate, int64_t endDate)
636 {
637 std::string date_str = dateFmt_->FormatRange(startDate, endDate);
638 char *res = IMallocCString(date_str);
639 return res;
640 }
641
LocaleImpl(int32_t * errCode)642 LocaleImpl::LocaleImpl(int32_t *errCode)
643 {
644 std::string locale_str = "";
645 std::map<std::string, std::string> options = {};
646 locale_ = std::make_unique<LocaleInfo>(locale_str, options);
647 if (locale_ == nullptr) {
648 *errCode = -1;
649 HILOG_ERROR_I18N("The Locale is nullptr");
650 return;
651 }
652 }
653
LocaleImpl(char * locale,CLocaleOptions options,int64_t flag,int32_t * errCode)654 LocaleImpl::LocaleImpl(char *locale, CLocaleOptions options, int64_t flag, int32_t *errCode)
655 {
656 std::string locale_str = locale;
657
658 std::map<std::string, std::string> map = {};
659 if (flag == 0) {
660 if (std::strlen(options.calendar) != 0) {
661 map.insert(std::make_pair("calendar", options.calendar));
662 }
663 if (std::strlen(options.collation) != 0) {
664 map.insert(std::make_pair("collation", options.collation));
665 }
666 if (std::strlen(options.hourCycle) != 0) {
667 map.insert(std::make_pair("hourCycle", options.hourCycle));
668 }
669 if (std::strlen(options.numberingSystem) != 0) {
670 map.insert(std::make_pair("numberingSystem", options.numberingSystem));
671 }
672 std::string num = std::to_string(options.numeric) == "1" ? "true" : "false";
673 map.insert(std::make_pair("numeric", num));
674 if (std::strlen(options.caseFirst) != 0) {
675 map.insert(std::make_pair("caseFirst", options.caseFirst));
676 }
677 }
678 locale_ = std::make_unique<LocaleInfo>(locale_str, map);
679 if (locale_ == nullptr) {
680 *errCode = -1;
681 HILOG_ERROR_I18N("The Locale is nullptr");
682 return;
683 }
684 }
685
ToString()686 char *LocaleImpl::ToString()
687 {
688 if (locale_ == nullptr) {
689 return nullptr;
690 }
691 std::string value = locale_->ToString();
692 char *res = IMallocCString(value);
693 return res;
694 }
695
Maximize()696 char *LocaleImpl::Maximize()
697 {
698 std::string value = locale_->Maximize();
699 char *res = IMallocCString(value);
700 return res;
701 }
Minimize()702 char *LocaleImpl::Minimize()
703 {
704 std::string value = locale_->Minimize();
705 char *res = IMallocCString(value);
706 return res;
707 }
708
GetLanguage()709 char *LocaleImpl::GetLanguage()
710 {
711 std::string value = locale_->GetLanguage();
712 char *res = IMallocCString(value);
713 return res;
714 }
GetRegion()715 char *LocaleImpl::GetRegion()
716 {
717 std::string value = locale_->GetRegion();
718 char *res = IMallocCString(value);
719 return res;
720 }
GetScript()721 char *LocaleImpl::GetScript()
722 {
723 std::string value = locale_->GetScript();
724 char *res = IMallocCString(value);
725 return res;
726 }
GetBaseName()727 char *LocaleImpl::GetBaseName()
728 {
729 std::string value = locale_->GetBaseName();
730 char *res = IMallocCString(value);
731 return res;
732 }
GetCaseFirst()733 char *LocaleImpl::GetCaseFirst()
734 {
735 std::string value = locale_->GetCaseFirst();
736 char *res = IMallocCString(value);
737 return res;
738 }
GetCalendar()739 char *LocaleImpl::GetCalendar()
740 {
741 std::string value = locale_->GetCalendar();
742 char *res = IMallocCString(value);
743 return res;
744 }
GetCollation()745 char *LocaleImpl::GetCollation()
746 {
747 std::string value = locale_->GetCollation();
748 char *res = IMallocCString(value);
749 return res;
750 }
GetHourCycle()751 char *LocaleImpl::GetHourCycle()
752 {
753 std::string value = locale_->GetHourCycle();
754 char *res = IMallocCString(value);
755 return res;
756 }
GetNumberingSystem()757 char *LocaleImpl::GetNumberingSystem()
758 {
759 std::string value = locale_->GetNumberingSystem();
760 char *res = IMallocCString(value);
761 return res;
762 }
GetNumeric()763 char *LocaleImpl::GetNumeric()
764 {
765 std::string value = locale_->GetNumeric();
766 char *res = IMallocCString(value);
767 return res;
768 }
769
770 } // namespace OHOS::Global::I18n::Intl