@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.
@@ -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
- //# sourceMappingURL=time-zone-to-country-code.js.map
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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"}
@@ -1,6 +1,7 @@
1
1
  export * from './dom';
2
2
  export * from './environment';
3
3
  export * from './error-boundary';
4
+ export * from './i18n';
4
5
  export * from './logs';
5
6
  export * from './objects';
6
7
  export * from './react';
@@ -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"}
@@ -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 time_zone_to_country_code_1 = require("../time-zone-to-country-code");
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
- return user.extra_data?.language
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
- : userCountry;
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;AACtC,4EAAoE;AAGpE,uCAAuC;AAEvC;;;;GAIG;AACI,MAAM,iBAAiB,GAC5B,CAAC,KAAmB,EAAE,EAAE,CAAC,CAAC,QAAgB,EAAE,YAAkB,EAAE,EAAE;IAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrE,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,cAAc,GAAG,IAAA,qBAAW,EAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YAChD,IAAI,cAAc,KAAK,SAAS;gBAAE,OAAO,cAAc,CAAA;YACvD,MAAM,aAAa,GAAG,IAAA,qBAAW,EAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAC7C,IAAI,aAAa,KAAK,SAAS;gBAAE,OAAO,aAAa,CAAA;YACrD,OAAO,YAAY,CAAA;QACrB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAZU,QAAA,iBAAiB,qBAY3B;AAEI,MAAM,UAAU,GAAG,GAGxB,EAAE;IACF,MAAM,MAAM,GAAG,IAAI,sBAAQ,EAAE,CAAA;IAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;IAC7B,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;IAC7C,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI;QAAE,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAA;IACnE,OAAO;QACL,EAAE,EAAE,IAAA,SAAM,GAAE;QACZ,IAAI;KACL,CAAA;AACH,CAAC,CAAA;AAZY,QAAA,UAAU,cAYtB;AACM,MAAM,WAAW,GAAG,CACzB,OAAY,EAC4B,EAAE;IAC1C,IAAI,CAAC,OAAO;QAAE,OAAO,GAAG,EAAE,CAAA;IAC1B,MAAM,SAAS,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,SAAS,CAAA;IACjD,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS;QACvE,OAAO,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,sBAAK,EAAC,OAAO,CAAC,IAAI,EAAE,IAAA,kBAAU,GAAE,CAAC,CAAC,CAAC,CAAC,IAAA,kBAAU,GAAE,CAAA;IAC9E,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AARY,QAAA,WAAW,eAQvB;AAED,SAAgB,0BAA0B,CAAC,IAAyB;IAClE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC/B,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IAE1C,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,SAAS,CAAC,IAAyB;IAC1C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,OAAO,IAAI,CAAC,UAAU,EAAE,QAAQ;QAC9B,CAAC,CAAE,IAAI,CAAC,UAAU,EAAE,QAAmB;QACvC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAA;AACxB,CAAC;AAED,SAAS,UAAU,CAAC,IAAyB;IAC3C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAA;IACjE,MAAM,WAAW,GAAG,iDAAqB,CAAC,QAAQ,CAAC,CAAA;IAEnD,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO;QAC7B,CAAC,CAAE,IAAI,CAAC,UAAU,EAAE,OAAkB;QACtC,CAAC,CAAC,WAAW,CAAA;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,IAAyB;IAChD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC;AAEM,MAAM,yBAAyB,GAAG,CAAC,EACxC,kBAAkB,EAClB,WAAW,GACZ,EAAE,EAAE,CAAC,CAAC,kBAAkB,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,mBAAmB,CAAC,CAAA;AAHhE,QAAA,yBAAyB,6BAGuC;AAE7E,yFAAyF;AAClF,MAAM,qBAAqB,GAAG,YAAY,CAAC,EAAE;IAClD,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,YAAY;QAAE,OAAO,mBAAmB,CAAA;IAC3E,IAAI,OAAO,YAAY,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QACpD,OAAO,YAAY,CAAC,YAAY,EAAE,CAAA;IACpC,CAAC;IACD,OAAO,YAAY,CAAC,YAAY,CAAA;AAClC,CAAC,CAAA;AANY,QAAA,qBAAqB,yBAMjC"}
1
+ {"version":3,"file":"webchat.js","sourceRoot":"","sources":["../../../src/util/webchat.ts"],"names":[],"mappings":";;;AAoDA,gEAMC;;AA1DD,wEAAgC;AAChC,wEAAmC;AACnC,+BAAmC;AAEnC,4CAAsC;AAGtC,iCAAgE;AAChE,uCAAuC;AAEvC;;;;GAIG;AACI,MAAM,iBAAiB,GAC5B,CAAC,KAAmB,EAAE,EAAE,CAAC,CAAC,QAAgB,EAAE,YAAkB,EAAE,EAAE;IAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrE,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,cAAc,GAAG,IAAA,qBAAW,EAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YAChD,IAAI,cAAc,KAAK,SAAS;gBAAE,OAAO,cAAc,CAAA;YACvD,MAAM,aAAa,GAAG,IAAA,qBAAW,EAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAC7C,IAAI,aAAa,KAAK,SAAS;gBAAE,OAAO,aAAa,CAAA;YACrD,OAAO,YAAY,CAAA;QACrB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAZU,QAAA,iBAAiB,qBAY3B;AAEI,MAAM,UAAU,GAAG,GAGxB,EAAE;IACF,MAAM,MAAM,GAAG,IAAI,sBAAQ,EAAE,CAAA;IAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;IAC7B,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;IAC7C,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI;QAAE,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAA;IACnE,OAAO;QACL,EAAE,EAAE,IAAA,SAAM,GAAE;QACZ,IAAI;KACL,CAAA;AACH,CAAC,CAAA;AAZY,QAAA,UAAU,cAYtB;AACM,MAAM,WAAW,GAAG,CACzB,OAAY,EAC4B,EAAE;IAC1C,IAAI,CAAC,OAAO;QAAE,OAAO,GAAG,EAAE,CAAA;IAC1B,MAAM,SAAS,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,SAAS,CAAA;IACjD,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS;QACvE,OAAO,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,sBAAK,EAAC,OAAO,CAAC,IAAI,EAAE,IAAA,kBAAU,GAAE,CAAC,CAAC,CAAC,CAAC,IAAA,kBAAU,GAAE,CAAA;IAC9E,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AARY,QAAA,WAAW,eAQvB;AAED,SAAgB,0BAA0B,CAAC,IAAyB;IAClE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC/B,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IAE1C,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,SAAS,CAAC,IAAyB;IAC1C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,IAAA,sBAAe,EAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ;QACtC,CAAC,CAAE,IAAI,CAAC,UAAU,EAAE,QAAmB;QACvC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAA;IAEtB,OAAO,IAAA,sBAAe,EAAC,MAAM,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,UAAU,CAAC,IAAyB;IAC3C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO;QAC7B,CAAC,CAAE,IAAI,CAAC,UAAU,EAAE,OAAkB;QACtC,CAAC,CAAC,IAAA,6BAAsB,GAAE,CAAA;AAC9B,CAAC;AAED,SAAS,eAAe,CAAC,IAAyB;IAChD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC;AAEM,MAAM,yBAAyB,GAAG,CAAC,EACxC,kBAAkB,EAClB,WAAW,GACZ,EAAE,EAAE,CAAC,CAAC,kBAAkB,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,mBAAmB,CAAC,CAAA;AAHhE,QAAA,yBAAyB,6BAGuC;AAE7E,yFAAyF;AAClF,MAAM,qBAAqB,GAAG,YAAY,CAAC,EAAE;IAClD,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,YAAY;QAAE,OAAO,mBAAmB,CAAA;IAC3E,IAAI,OAAO,YAAY,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QACpD,OAAO,YAAY,CAAC,YAAY,EAAE,CAAA;IACpC,CAAC;IACD,OAAO,YAAY,CAAC,YAAY,CAAA;AAClC,CAAC,CAAA;AANY,QAAA,qBAAqB,yBAMjC"}
@@ -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
- //# sourceMappingURL=time-zone-to-country-code.js.map
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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"}
@@ -1,6 +1,7 @@
1
1
  export * from './dom';
2
2
  export * from './environment';
3
3
  export * from './error-boundary';
4
+ export * from './i18n';
4
5
  export * from './logs';
5
6
  export * from './objects';
6
7
  export * from './react';
@@ -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"}
@@ -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 time_zone_to_country_code_1 = require("../time-zone-to-country-code");
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
- return user.extra_data?.language
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
- : userCountry;
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":"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"}
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.0-alpha.3",
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-alpha.3",
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
@@ -1,6 +1,7 @@
1
1
  export * from './dom'
2
2
  export * from './environment'
3
3
  export * from './error-boundary'
4
+ export * from './i18n'
4
5
  export * from './logs'
5
6
  export * from './objects'
6
7
  export * from './react'
@@ -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
- return user.extra_data?.language
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
- : userCountry
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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"}