@botonic/react 0.44.0-alpha.3 → 0.44.1-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/util/i18n.d.ts +26 -0
- package/lib/{esm/time-zone-to-country-code.js → cjs/util/i18n.js} +58 -1
- package/lib/cjs/util/i18n.js.map +1 -0
- package/lib/cjs/util/index.d.ts +1 -0
- package/lib/cjs/util/index.js +1 -0
- package/lib/cjs/util/index.js.map +1 -1
- package/lib/cjs/util/webchat.js +5 -6
- package/lib/cjs/util/webchat.js.map +1 -1
- package/lib/esm/util/i18n.d.ts +26 -0
- package/lib/{cjs/time-zone-to-country-code.js → esm/util/i18n.js} +58 -1
- package/lib/esm/util/i18n.js.map +1 -0
- package/lib/esm/util/index.d.ts +1 -0
- package/lib/esm/util/index.js +1 -0
- package/lib/esm/util/index.js.map +1 -1
- package/lib/esm/util/webchat.js +5 -6
- package/lib/esm/util/webchat.js.map +1 -1
- package/package.json +2 -2
- package/src/{time-zone-to-country-code.ts → util/i18n.ts} +61 -0
- package/src/util/index.ts +1 -0
- package/src/util/webchat.ts +6 -6
- package/lib/cjs/time-zone-to-country-code.d.ts +0 -1
- package/lib/cjs/time-zone-to-country-code.js.map +0 -1
- package/lib/esm/time-zone-to-country-code.d.ts +0 -1
- package/lib/esm/time-zone-to-country-code.js.map +0 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalizes a locale string to a valid format.
|
|
3
|
+
* Keeps letter-based region codes (e.g., 'en-GB', 'es-ES') but strips
|
|
4
|
+
* numeric UN M.49 region codes (e.g., 'es-419' -> 'es').
|
|
5
|
+
* Handles both dash and underscore separators.
|
|
6
|
+
* @example
|
|
7
|
+
* normalizeLocale('en-GB') // 'en-GB' (letter region preserved)
|
|
8
|
+
* normalizeLocale('es-419') // 'es' (numeric region stripped)
|
|
9
|
+
* normalizeLocale('zh-Hans-CN') // 'zh-CN' (script stripped, letter region preserved)
|
|
10
|
+
* normalizeLocale('en_US') // 'en-US' (underscore normalized)
|
|
11
|
+
*/
|
|
12
|
+
export declare function normalizeLocale(locale?: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Gets the country code from a time zone string.
|
|
15
|
+
* @param timeZone - IANA time zone string (e.g., 'Europe/Madrid')
|
|
16
|
+
* @returns ISO 3166-1 alpha-2 country code (e.g., 'ES') or undefined if not found
|
|
17
|
+
* @example
|
|
18
|
+
* getCountryFromTimeZone('Europe/Madrid') // 'ES'
|
|
19
|
+
* getCountryFromTimeZone('America/New_York') // 'US'
|
|
20
|
+
*/
|
|
21
|
+
export declare function getCountryFromTimeZone(timeZone?: string): string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Mapping of IANA time zones to ISO 3166-1 alpha-2 country codes.
|
|
24
|
+
* Used to infer a user's country from their browser's time zone.
|
|
25
|
+
*/
|
|
26
|
+
export declare const timeZoneToCountryCode: Record<string, string>;
|
|
@@ -1,7 +1,63 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.timeZoneToCountryCode = void 0;
|
|
4
|
+
exports.normalizeLocale = normalizeLocale;
|
|
5
|
+
exports.getCountryFromTimeZone = getCountryFromTimeZone;
|
|
6
|
+
/* eslint-disable filenames/match-regex */
|
|
7
|
+
/**
|
|
8
|
+
* Normalizes a locale string to a valid format.
|
|
9
|
+
* Keeps letter-based region codes (e.g., 'en-GB', 'es-ES') but strips
|
|
10
|
+
* numeric UN M.49 region codes (e.g., 'es-419' -> 'es').
|
|
11
|
+
* Handles both dash and underscore separators.
|
|
12
|
+
* @example
|
|
13
|
+
* normalizeLocale('en-GB') // 'en-GB' (letter region preserved)
|
|
14
|
+
* normalizeLocale('es-419') // 'es' (numeric region stripped)
|
|
15
|
+
* normalizeLocale('zh-Hans-CN') // 'zh-CN' (script stripped, letter region preserved)
|
|
16
|
+
* normalizeLocale('en_US') // 'en-US' (underscore normalized)
|
|
17
|
+
*/
|
|
18
|
+
function normalizeLocale(locale = navigator.language) {
|
|
19
|
+
// Normalize underscore separators to dashes (some systems use underscores)
|
|
20
|
+
const normalizedLocale = locale.replace(/_/g, '-');
|
|
21
|
+
try {
|
|
22
|
+
const parsed = new Intl.Locale(normalizedLocale);
|
|
23
|
+
const language = parsed.language;
|
|
24
|
+
const region = parsed.region;
|
|
25
|
+
// If no region, return just the language
|
|
26
|
+
if (!region) {
|
|
27
|
+
return language;
|
|
28
|
+
}
|
|
29
|
+
// If region is numeric (UN M.49 code like '419'), return just the language
|
|
30
|
+
if (/^\d+$/.test(region)) {
|
|
31
|
+
return language;
|
|
32
|
+
}
|
|
33
|
+
// Otherwise, return language-REGION (letter-based region codes)
|
|
34
|
+
return `${language}-${region}`;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Fallback: check if the part after dash is numeric
|
|
38
|
+
const parts = normalizedLocale.split('-');
|
|
39
|
+
if (parts.length > 1 && /^\d+$/.test(parts[1])) {
|
|
40
|
+
return parts[0];
|
|
41
|
+
}
|
|
42
|
+
return normalizedLocale;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Gets the country code from a time zone string.
|
|
47
|
+
* @param timeZone - IANA time zone string (e.g., 'Europe/Madrid')
|
|
48
|
+
* @returns ISO 3166-1 alpha-2 country code (e.g., 'ES') or undefined if not found
|
|
49
|
+
* @example
|
|
50
|
+
* getCountryFromTimeZone('Europe/Madrid') // 'ES'
|
|
51
|
+
* getCountryFromTimeZone('America/New_York') // 'US'
|
|
52
|
+
*/
|
|
53
|
+
function getCountryFromTimeZone(timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone) {
|
|
54
|
+
return exports.timeZoneToCountryCode[timeZone];
|
|
55
|
+
}
|
|
4
56
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
57
|
+
/**
|
|
58
|
+
* Mapping of IANA time zones to ISO 3166-1 alpha-2 country codes.
|
|
59
|
+
* Used to infer a user's country from their browser's time zone.
|
|
60
|
+
*/
|
|
5
61
|
exports.timeZoneToCountryCode = {
|
|
6
62
|
'Africa/Abidjan': 'CI',
|
|
7
63
|
'Africa/Accra': 'GH',
|
|
@@ -105,4 +161,5 @@ exports.timeZoneToCountryCode = {
|
|
|
105
161
|
'Europe/Warsaw': 'PL',
|
|
106
162
|
'Pacific/Auckland': 'NZ',
|
|
107
163
|
};
|
|
108
|
-
|
|
164
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
165
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../../src/util/i18n.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/util/index.d.ts
CHANGED
package/lib/cjs/util/index.js
CHANGED
|
@@ -4,6 +4,7 @@ const tslib_1 = require("tslib");
|
|
|
4
4
|
tslib_1.__exportStar(require("./dom"), exports);
|
|
5
5
|
tslib_1.__exportStar(require("./environment"), exports);
|
|
6
6
|
tslib_1.__exportStar(require("./error-boundary"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./i18n"), exports);
|
|
7
8
|
tslib_1.__exportStar(require("./logs"), exports);
|
|
8
9
|
tslib_1.__exportStar(require("./objects"), exports);
|
|
9
10
|
tslib_1.__exportStar(require("./react"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":";;;AAAA,gDAAqB;AACrB,wDAA6B;AAC7B,2DAAgC;AAChC,iDAAsB;AACtB,oDAAyB;AACzB,kDAAuB;AACvB,mDAAwB;AACxB,oDAAyB;AACzB,oDAAyB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":";;;AAAA,gDAAqB;AACrB,wDAA6B;AAC7B,2DAAgC;AAChC,iDAAsB;AACtB,iDAAsB;AACtB,oDAAyB;AACzB,kDAAuB;AACvB,mDAAwB;AACxB,oDAAyB;AACzB,oDAAyB"}
|
package/lib/cjs/util/webchat.js
CHANGED
|
@@ -7,7 +7,7 @@ const lodash_merge_1 = tslib_1.__importDefault(require("lodash.merge"));
|
|
|
7
7
|
const ua_parser_js_1 = tslib_1.__importDefault(require("ua-parser-js"));
|
|
8
8
|
const uuid_1 = require("uuid");
|
|
9
9
|
const constants_1 = require("../constants");
|
|
10
|
-
const
|
|
10
|
+
const i18n_1 = require("./i18n");
|
|
11
11
|
const objects_1 = require("./objects");
|
|
12
12
|
/**
|
|
13
13
|
* Returns the value of a property defined in bot's theme based on WEBCHAT.CUSTOM_PROPERTIES dictionary.
|
|
@@ -58,21 +58,20 @@ function updateUserLocaleAndCountry(user) {
|
|
|
58
58
|
}
|
|
59
59
|
function getLocale(user) {
|
|
60
60
|
if (user.locale) {
|
|
61
|
-
return user.locale;
|
|
61
|
+
return (0, i18n_1.normalizeLocale)(user.locale);
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
const locale = user.extra_data?.language
|
|
64
64
|
? user.extra_data?.language
|
|
65
65
|
: navigator.language;
|
|
66
|
+
return (0, i18n_1.normalizeLocale)(locale);
|
|
66
67
|
}
|
|
67
68
|
function getCountry(user) {
|
|
68
69
|
if (user.country) {
|
|
69
70
|
return user.country;
|
|
70
71
|
}
|
|
71
|
-
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
72
|
-
const userCountry = time_zone_to_country_code_1.timeZoneToCountryCode[timeZone];
|
|
73
72
|
return user.extra_data?.country
|
|
74
73
|
? user.extra_data?.country
|
|
75
|
-
:
|
|
74
|
+
: (0, i18n_1.getCountryFromTimeZone)();
|
|
76
75
|
}
|
|
77
76
|
function getSystemLocale(user) {
|
|
78
77
|
if (user.system_locale) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webchat.js","sourceRoot":"","sources":["../../../src/util/webchat.ts"],"names":[],"mappings":";;;AAoDA,gEAMC;;AA1DD,wEAAgC;AAChC,wEAAmC;AACnC,+BAAmC;AAEnC,4CAAsC;
|
|
1
|
+
{"version":3,"file":"webchat.js","sourceRoot":"","sources":["../../../src/util/webchat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalizes a locale string to a valid format.
|
|
3
|
+
* Keeps letter-based region codes (e.g., 'en-GB', 'es-ES') but strips
|
|
4
|
+
* numeric UN M.49 region codes (e.g., 'es-419' -> 'es').
|
|
5
|
+
* Handles both dash and underscore separators.
|
|
6
|
+
* @example
|
|
7
|
+
* normalizeLocale('en-GB') // 'en-GB' (letter region preserved)
|
|
8
|
+
* normalizeLocale('es-419') // 'es' (numeric region stripped)
|
|
9
|
+
* normalizeLocale('zh-Hans-CN') // 'zh-CN' (script stripped, letter region preserved)
|
|
10
|
+
* normalizeLocale('en_US') // 'en-US' (underscore normalized)
|
|
11
|
+
*/
|
|
12
|
+
export declare function normalizeLocale(locale?: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Gets the country code from a time zone string.
|
|
15
|
+
* @param timeZone - IANA time zone string (e.g., 'Europe/Madrid')
|
|
16
|
+
* @returns ISO 3166-1 alpha-2 country code (e.g., 'ES') or undefined if not found
|
|
17
|
+
* @example
|
|
18
|
+
* getCountryFromTimeZone('Europe/Madrid') // 'ES'
|
|
19
|
+
* getCountryFromTimeZone('America/New_York') // 'US'
|
|
20
|
+
*/
|
|
21
|
+
export declare function getCountryFromTimeZone(timeZone?: string): string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Mapping of IANA time zones to ISO 3166-1 alpha-2 country codes.
|
|
24
|
+
* Used to infer a user's country from their browser's time zone.
|
|
25
|
+
*/
|
|
26
|
+
export declare const timeZoneToCountryCode: Record<string, string>;
|
|
@@ -1,7 +1,63 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.timeZoneToCountryCode = void 0;
|
|
4
|
+
exports.normalizeLocale = normalizeLocale;
|
|
5
|
+
exports.getCountryFromTimeZone = getCountryFromTimeZone;
|
|
6
|
+
/* eslint-disable filenames/match-regex */
|
|
7
|
+
/**
|
|
8
|
+
* Normalizes a locale string to a valid format.
|
|
9
|
+
* Keeps letter-based region codes (e.g., 'en-GB', 'es-ES') but strips
|
|
10
|
+
* numeric UN M.49 region codes (e.g., 'es-419' -> 'es').
|
|
11
|
+
* Handles both dash and underscore separators.
|
|
12
|
+
* @example
|
|
13
|
+
* normalizeLocale('en-GB') // 'en-GB' (letter region preserved)
|
|
14
|
+
* normalizeLocale('es-419') // 'es' (numeric region stripped)
|
|
15
|
+
* normalizeLocale('zh-Hans-CN') // 'zh-CN' (script stripped, letter region preserved)
|
|
16
|
+
* normalizeLocale('en_US') // 'en-US' (underscore normalized)
|
|
17
|
+
*/
|
|
18
|
+
function normalizeLocale(locale = navigator.language) {
|
|
19
|
+
// Normalize underscore separators to dashes (some systems use underscores)
|
|
20
|
+
const normalizedLocale = locale.replace(/_/g, '-');
|
|
21
|
+
try {
|
|
22
|
+
const parsed = new Intl.Locale(normalizedLocale);
|
|
23
|
+
const language = parsed.language;
|
|
24
|
+
const region = parsed.region;
|
|
25
|
+
// If no region, return just the language
|
|
26
|
+
if (!region) {
|
|
27
|
+
return language;
|
|
28
|
+
}
|
|
29
|
+
// If region is numeric (UN M.49 code like '419'), return just the language
|
|
30
|
+
if (/^\d+$/.test(region)) {
|
|
31
|
+
return language;
|
|
32
|
+
}
|
|
33
|
+
// Otherwise, return language-REGION (letter-based region codes)
|
|
34
|
+
return `${language}-${region}`;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Fallback: check if the part after dash is numeric
|
|
38
|
+
const parts = normalizedLocale.split('-');
|
|
39
|
+
if (parts.length > 1 && /^\d+$/.test(parts[1])) {
|
|
40
|
+
return parts[0];
|
|
41
|
+
}
|
|
42
|
+
return normalizedLocale;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Gets the country code from a time zone string.
|
|
47
|
+
* @param timeZone - IANA time zone string (e.g., 'Europe/Madrid')
|
|
48
|
+
* @returns ISO 3166-1 alpha-2 country code (e.g., 'ES') or undefined if not found
|
|
49
|
+
* @example
|
|
50
|
+
* getCountryFromTimeZone('Europe/Madrid') // 'ES'
|
|
51
|
+
* getCountryFromTimeZone('America/New_York') // 'US'
|
|
52
|
+
*/
|
|
53
|
+
function getCountryFromTimeZone(timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone) {
|
|
54
|
+
return exports.timeZoneToCountryCode[timeZone];
|
|
55
|
+
}
|
|
4
56
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
57
|
+
/**
|
|
58
|
+
* Mapping of IANA time zones to ISO 3166-1 alpha-2 country codes.
|
|
59
|
+
* Used to infer a user's country from their browser's time zone.
|
|
60
|
+
*/
|
|
5
61
|
exports.timeZoneToCountryCode = {
|
|
6
62
|
'Africa/Abidjan': 'CI',
|
|
7
63
|
'Africa/Accra': 'GH',
|
|
@@ -105,4 +161,5 @@ exports.timeZoneToCountryCode = {
|
|
|
105
161
|
'Europe/Warsaw': 'PL',
|
|
106
162
|
'Pacific/Auckland': 'NZ',
|
|
107
163
|
};
|
|
108
|
-
|
|
164
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
165
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../../src/util/i18n.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/util/index.d.ts
CHANGED
package/lib/esm/util/index.js
CHANGED
|
@@ -4,6 +4,7 @@ const tslib_1 = require("tslib");
|
|
|
4
4
|
tslib_1.__exportStar(require("./dom"), exports);
|
|
5
5
|
tslib_1.__exportStar(require("./environment"), exports);
|
|
6
6
|
tslib_1.__exportStar(require("./error-boundary"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./i18n"), exports);
|
|
7
8
|
tslib_1.__exportStar(require("./logs"), exports);
|
|
8
9
|
tslib_1.__exportStar(require("./objects"), exports);
|
|
9
10
|
tslib_1.__exportStar(require("./react"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":";;;AAAA,gDAAqB;AACrB,wDAA6B;AAC7B,2DAAgC;AAChC,iDAAsB;AACtB,oDAAyB;AACzB,kDAAuB;AACvB,mDAAwB;AACxB,oDAAyB;AACzB,oDAAyB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":";;;AAAA,gDAAqB;AACrB,wDAA6B;AAC7B,2DAAgC;AAChC,iDAAsB;AACtB,iDAAsB;AACtB,oDAAyB;AACzB,kDAAuB;AACvB,mDAAwB;AACxB,oDAAyB;AACzB,oDAAyB"}
|
package/lib/esm/util/webchat.js
CHANGED
|
@@ -7,7 +7,7 @@ const lodash_merge_1 = tslib_1.__importDefault(require("lodash.merge"));
|
|
|
7
7
|
const ua_parser_js_1 = tslib_1.__importDefault(require("ua-parser-js"));
|
|
8
8
|
const uuid_1 = require("uuid");
|
|
9
9
|
const constants_1 = require("../constants");
|
|
10
|
-
const
|
|
10
|
+
const i18n_1 = require("./i18n");
|
|
11
11
|
const objects_1 = require("./objects");
|
|
12
12
|
/**
|
|
13
13
|
* Returns the value of a property defined in bot's theme based on WEBCHAT.CUSTOM_PROPERTIES dictionary.
|
|
@@ -58,21 +58,20 @@ function updateUserLocaleAndCountry(user) {
|
|
|
58
58
|
}
|
|
59
59
|
function getLocale(user) {
|
|
60
60
|
if (user.locale) {
|
|
61
|
-
return user.locale;
|
|
61
|
+
return (0, i18n_1.normalizeLocale)(user.locale);
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
const locale = user.extra_data?.language
|
|
64
64
|
? user.extra_data?.language
|
|
65
65
|
: navigator.language;
|
|
66
|
+
return (0, i18n_1.normalizeLocale)(locale);
|
|
66
67
|
}
|
|
67
68
|
function getCountry(user) {
|
|
68
69
|
if (user.country) {
|
|
69
70
|
return user.country;
|
|
70
71
|
}
|
|
71
|
-
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
72
|
-
const userCountry = time_zone_to_country_code_1.timeZoneToCountryCode[timeZone];
|
|
73
72
|
return user.extra_data?.country
|
|
74
73
|
? user.extra_data?.country
|
|
75
|
-
:
|
|
74
|
+
: (0, i18n_1.getCountryFromTimeZone)();
|
|
76
75
|
}
|
|
77
76
|
function getSystemLocale(user) {
|
|
78
77
|
if (user.system_locale) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webchat.js","sourceRoot":"","sources":["../../../src/util/webchat.ts"],"names":[],"mappings":";;;AAoDA,gEAMC;;AA1DD,wEAAgC;AAChC,wEAAmC;AACnC,+BAAmC;AAEnC,4CAAsC;
|
|
1
|
+
{"version":3,"file":"webchat.js","sourceRoot":"","sources":["../../../src/util/webchat.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@botonic/react",
|
|
3
|
-
"version": "0.44.
|
|
3
|
+
"version": "0.44.1-alpha.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Build Chatbots using React",
|
|
6
6
|
"main": "./lib/cjs",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"lint_core": "../../node_modules/.bin/eslint_d --cache --quiet '.*.js' '*.js' 'src/**/*.js*' --fix"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@botonic/core": "^0.44.0
|
|
23
|
+
"@botonic/core": "^0.44.0",
|
|
24
24
|
"axios": "^1.13.2",
|
|
25
25
|
"emoji-picker-react": "^4.12.0",
|
|
26
26
|
"lodash.merge": "^4.6.2",
|
|
@@ -1,4 +1,64 @@
|
|
|
1
|
+
/* eslint-disable filenames/match-regex */
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes a locale string to a valid format.
|
|
4
|
+
* Keeps letter-based region codes (e.g., 'en-GB', 'es-ES') but strips
|
|
5
|
+
* numeric UN M.49 region codes (e.g., 'es-419' -> 'es').
|
|
6
|
+
* Handles both dash and underscore separators.
|
|
7
|
+
* @example
|
|
8
|
+
* normalizeLocale('en-GB') // 'en-GB' (letter region preserved)
|
|
9
|
+
* normalizeLocale('es-419') // 'es' (numeric region stripped)
|
|
10
|
+
* normalizeLocale('zh-Hans-CN') // 'zh-CN' (script stripped, letter region preserved)
|
|
11
|
+
* normalizeLocale('en_US') // 'en-US' (underscore normalized)
|
|
12
|
+
*/
|
|
13
|
+
export function normalizeLocale(locale = navigator.language) {
|
|
14
|
+
// Normalize underscore separators to dashes (some systems use underscores)
|
|
15
|
+
const normalizedLocale = locale.replace(/_/g, '-')
|
|
16
|
+
try {
|
|
17
|
+
const parsed = new Intl.Locale(normalizedLocale)
|
|
18
|
+
const language = parsed.language
|
|
19
|
+
const region = parsed.region
|
|
20
|
+
|
|
21
|
+
// If no region, return just the language
|
|
22
|
+
if (!region) {
|
|
23
|
+
return language
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// If region is numeric (UN M.49 code like '419'), return just the language
|
|
27
|
+
if (/^\d+$/.test(region)) {
|
|
28
|
+
return language
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Otherwise, return language-REGION (letter-based region codes)
|
|
32
|
+
return `${language}-${region}`
|
|
33
|
+
} catch {
|
|
34
|
+
// Fallback: check if the part after dash is numeric
|
|
35
|
+
const parts = normalizedLocale.split('-')
|
|
36
|
+
if (parts.length > 1 && /^\d+$/.test(parts[1])) {
|
|
37
|
+
return parts[0]
|
|
38
|
+
}
|
|
39
|
+
return normalizedLocale
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Gets the country code from a time zone string.
|
|
45
|
+
* @param timeZone - IANA time zone string (e.g., 'Europe/Madrid')
|
|
46
|
+
* @returns ISO 3166-1 alpha-2 country code (e.g., 'ES') or undefined if not found
|
|
47
|
+
* @example
|
|
48
|
+
* getCountryFromTimeZone('Europe/Madrid') // 'ES'
|
|
49
|
+
* getCountryFromTimeZone('America/New_York') // 'US'
|
|
50
|
+
*/
|
|
51
|
+
export function getCountryFromTimeZone(
|
|
52
|
+
timeZone: string = Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
53
|
+
): string | undefined {
|
|
54
|
+
return timeZoneToCountryCode[timeZone]
|
|
55
|
+
}
|
|
56
|
+
|
|
1
57
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
58
|
+
/**
|
|
59
|
+
* Mapping of IANA time zones to ISO 3166-1 alpha-2 country codes.
|
|
60
|
+
* Used to infer a user's country from their browser's time zone.
|
|
61
|
+
*/
|
|
2
62
|
export const timeZoneToCountryCode: Record<string, string> = {
|
|
3
63
|
'Africa/Abidjan': 'CI',
|
|
4
64
|
'Africa/Accra': 'GH',
|
|
@@ -102,3 +162,4 @@ export const timeZoneToCountryCode: Record<string, string> = {
|
|
|
102
162
|
'Europe/Warsaw': 'PL',
|
|
103
163
|
'Pacific/Auckland': 'NZ',
|
|
104
164
|
}
|
|
165
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
package/src/util/index.ts
CHANGED
package/src/util/webchat.ts
CHANGED
|
@@ -3,9 +3,9 @@ import UAParser from 'ua-parser-js'
|
|
|
3
3
|
import { v7 as uuidv7 } from 'uuid'
|
|
4
4
|
|
|
5
5
|
import { WEBCHAT } from '../constants'
|
|
6
|
-
import { timeZoneToCountryCode } from '../time-zone-to-country-code'
|
|
7
6
|
import { ClientUser } from '../webchat/context/types'
|
|
8
7
|
import { WebchatTheme } from '../webchat/theme/types'
|
|
8
|
+
import { getCountryFromTimeZone, normalizeLocale } from './i18n'
|
|
9
9
|
import { getProperty } from './objects'
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -60,24 +60,24 @@ export function updateUserLocaleAndCountry(user: Partial<ClientUser>) {
|
|
|
60
60
|
|
|
61
61
|
function getLocale(user: Partial<ClientUser>) {
|
|
62
62
|
if (user.locale) {
|
|
63
|
-
return user.locale
|
|
63
|
+
return normalizeLocale(user.locale)
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
const locale = user.extra_data?.language
|
|
67
67
|
? (user.extra_data?.language as string)
|
|
68
68
|
: navigator.language
|
|
69
|
+
|
|
70
|
+
return normalizeLocale(locale)
|
|
69
71
|
}
|
|
70
72
|
|
|
71
73
|
function getCountry(user: Partial<ClientUser>) {
|
|
72
74
|
if (user.country) {
|
|
73
75
|
return user.country
|
|
74
76
|
}
|
|
75
|
-
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
76
|
-
const userCountry = timeZoneToCountryCode[timeZone]
|
|
77
77
|
|
|
78
78
|
return user.extra_data?.country
|
|
79
79
|
? (user.extra_data?.country as string)
|
|
80
|
-
:
|
|
80
|
+
: getCountryFromTimeZone()
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
function getSystemLocale(user: Partial<ClientUser>) {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const timeZoneToCountryCode: Record<string, string>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"time-zone-to-country-code.js","sourceRoot":"","sources":["../../src/time-zone-to-country-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const timeZoneToCountryCode: Record<string, string>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"time-zone-to-country-code.js","sourceRoot":"","sources":["../../src/time-zone-to-country-code.ts"],"names":[],"mappings":"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"}
|