@magmamath/frontend-config 1.3.4-rc.6 → 1.3.4

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.
@@ -39,14 +39,11 @@ declare class TranslationManager {
39
39
  private initPromise;
40
40
  constructor({ isDev, i18nOptions, storage, fallbackResources }: TranslationManagerOptions);
41
41
  private unwrapModuleDefaults;
42
- private readonly normalizeResourceKey;
43
- private readonly toCanonicalLocale;
44
42
  readonly onInit: (callback: OnTranslationInitCallback) => void;
45
43
  readonly init: (locale: Locale, envConfig: TolgeeConfig) => Promise<void>;
46
44
  readonly setLanguage: (locale: Locale) => Promise<void>;
47
45
  private readonly initI18n;
48
46
  private readonly createBaseTolgeeInstance;
49
- private readonly normalizeApiUrl;
50
47
  private readonly initTolgeeDevTools;
51
48
  }
52
49
 
@@ -39,14 +39,11 @@ declare class TranslationManager {
39
39
  private initPromise;
40
40
  constructor({ isDev, i18nOptions, storage, fallbackResources }: TranslationManagerOptions);
41
41
  private unwrapModuleDefaults;
42
- private readonly normalizeResourceKey;
43
- private readonly toCanonicalLocale;
44
42
  readonly onInit: (callback: OnTranslationInitCallback) => void;
45
43
  readonly init: (locale: Locale, envConfig: TolgeeConfig) => Promise<void>;
46
44
  readonly setLanguage: (locale: Locale) => Promise<void>;
47
45
  private readonly initI18n;
48
46
  private readonly createBaseTolgeeInstance;
49
- private readonly normalizeApiUrl;
50
47
  private readonly initTolgeeDevTools;
51
48
  }
52
49
 
@@ -8,25 +8,9 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
8
 
9
9
  var i18n__default = /*#__PURE__*/_interopDefault(i18n);
10
10
 
11
- // src/translation/TranslationManager.ts
12
-
13
- // src/shared/constants/common.constants.ts
14
- var Locale = /* @__PURE__ */ ((Locale2) => {
15
- Locale2["US"] = "en-SE";
16
- Locale2["SE"] = "sv-SE";
17
- Locale2["GB"] = "en-GB";
18
- Locale2["CA"] = "en-CA";
19
- Locale2["SCT"] = "en-SCT";
20
- Locale2["DE"] = "de-DE";
21
- return Locale2;
22
- })(Locale || {});
23
-
24
11
  // src/translation/TranslationManager.ts
25
12
  var CDN_ID = "39317fd3c6ff2ad02619ba673baae8b6";
26
13
  var TOLGEE_DEV_TIMEOUT_MS = 3e3;
27
- var CANONICAL_LOCALE_BY_NORMALIZED = Object.fromEntries(
28
- Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])
29
- );
30
14
  var DEFAULT_I18N_OPTIONS = {
31
15
  fallbackLng: void 0,
32
16
  load: "currentOnly",
@@ -54,23 +38,9 @@ var TranslationManager = class {
54
38
  unwrapModuleDefaults(resources) {
55
39
  if (!resources) return void 0;
56
40
  return Object.fromEntries(
57
- Object.entries(resources).map(([key, load]) => [
58
- this.normalizeResourceKey(key),
59
- () => load().then((m) => m.default)
60
- ])
41
+ Object.entries(resources).map(([key, load]) => [key, () => load().then((m) => m.default)])
61
42
  );
62
43
  }
63
- normalizeResourceKey = (key) => {
64
- const [locale, ...rest] = key.split(":");
65
- return [this.toCanonicalLocale(locale), ...rest].join(":");
66
- };
67
- toCanonicalLocale = (locale) => {
68
- try {
69
- return Intl.getCanonicalLocales(locale)[0];
70
- } catch {
71
- return locale;
72
- }
73
- };
74
44
  onInit = (callback) => {
75
45
  this.onInitCallbacks.push(callback);
76
46
  };
@@ -89,20 +59,18 @@ var TranslationManager = class {
89
59
  if (this.storage) {
90
60
  this.storage.adapter.setItem(this.storage.key, locale);
91
61
  }
92
- const canonicalLocale = this.toCanonicalLocale(locale);
93
- if (i18n__default.default.language !== canonicalLocale) {
94
- await i18n__default.default.changeLanguage(canonicalLocale);
62
+ if (i18n__default.default.language !== locale) {
63
+ await i18n__default.default.changeLanguage(locale);
95
64
  }
96
65
  };
97
66
  initI18n = async (locale) => {
98
67
  if (!this.tolgeeCfg) return;
99
- const canonicalLocale = this.toCanonicalLocale(locale);
100
68
  const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl;
101
69
  const tolgee = canUseTolgeeDevTools ? await this.initTolgeeDevTools(this.tolgeeCfg) : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources });
102
70
  await i18next.withTolgee(i18n__default.default, tolgee).use(reactI18next.initReactI18next).init({
103
71
  ...DEFAULT_I18N_OPTIONS,
104
72
  ...this.i18nOptions,
105
- lng: canonicalLocale
73
+ lng: locale
106
74
  });
107
75
  this.onInitCallbacks.forEach((callback) => callback(locale));
108
76
  };
@@ -110,21 +78,10 @@ var TranslationManager = class {
110
78
  return i18next.Tolgee().use(i18next.I18nextPlugin()).use(
111
79
  i18next.BackendFetch({
112
80
  prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,
113
- fallbackOnFail: true,
114
- getPath: ({ namespace, language, prefix }) => {
115
- const cdnLocale = CANONICAL_LOCALE_BY_NORMALIZED[language] ?? language;
116
- return `${prefix}/${namespace}/${cdnLocale}.json`;
117
- }
81
+ fallbackOnFail: true
118
82
  })
119
83
  );
120
84
  };
121
- normalizeApiUrl = (url) => {
122
- const [path, query] = url.replace(/\/\?/, "?").split("?");
123
- const segments = path.split("/");
124
- const locale = segments.pop() ?? "";
125
- const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale;
126
- return `${segments.join("/")}/${canonicalLocale}${query ? `?${query}` : ""}`;
127
- };
128
85
  initTolgeeDevTools = async (tolgeeCfg) => {
129
86
  const { DevBackend } = await import('@tolgee/i18next');
130
87
  const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend());
@@ -133,7 +90,7 @@ var TranslationManager = class {
133
90
  apiKey: tolgeeCfg.apiKey,
134
91
  staticData: this.fallbackResources,
135
92
  fetch: async (input, init) => {
136
- const url = typeof input === "string" ? this.normalizeApiUrl(input) : input;
93
+ const url = typeof input === "string" ? input.replace(/\/\?/, "?") : input;
137
94
  const controller = new AbortController();
138
95
  const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS);
139
96
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shared/constants/common.constants.ts","../../src/translation/TranslationManager.ts","../../src/translation/translation.constants.ts"],"names":["Locale","i18n","withTolgee","initReactI18next","Tolgee","I18nextPlugin","BackendFetch","TranslationNamespace"],"mappings":";;;;;;;;;;;;;AAuBO,IAAK,MAAA,qBAAAA,OAAL,KAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,KAAM,CAAA,GAAA,QAAA;AACN,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AANK,EAAAA,OAAAA,OAAAA;AAAA,CAAA,EAAA,MAAA,IAAA,EAAA,CAAA;;;ACVZ,IAAM,MAAS,GAAA,kCAAA;AACf,IAAM,qBAAwB,GAAA,GAAA;AAG9B,IAAM,iCAAyD,MAAO,CAAA,WAAA;AAAA,EACpE,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA,CAAE,GAAI,CAAA,CAAC,MAAW,KAAA,CAAC,MAAO,CAAA,WAAA,EAAe,EAAA,MAAM,CAAC;AACtE,CAAA;AAEA,IAAM,oBAAoC,GAAA;AAAA,EACxC,WAAa,EAAA,MAAA;AAAA,EACb,IAAM,EAAA,aAAA;AAAA,EACN,KAAO,EAAA;AAAA,IACL,WAAa,EAAA;AAAA,GACf;AAAA,EACA,aAAe,EAAA;AAAA,IACb,WAAa,EAAA;AAAA;AAEjB,CAAA;AAEO,IAAM,qBAAN,MAAyB;AAAA,EACb,KAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAA+C,EAAC;AAAA,EAChD,iBAAA;AAAA,EACA,OAAA;AAAA,EAET,SAAiC,GAAA,IAAA;AAAA,EACjC,WAAoC,GAAA,IAAA;AAAA,EAE5C,YAAY,EAAE,KAAA,EAAO,WAAa,EAAA,OAAA,EAAS,mBAAgD,EAAA;AACzF,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA;AACb,IAAA,IAAA,CAAK,WAAc,GAAA,WAAA;AACnB,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAK,IAAA,CAAA,iBAAA,GAAoB,IAAK,CAAA,oBAAA,CAAqB,iBAAiB,CAAA;AAAA;AACtE,EAEQ,qBAAqB,SAA+B,EAAA;AAC1D,IAAI,IAAA,CAAC,WAAkB,OAAA,MAAA;AACvB,IAAA,OAAO,MAAO,CAAA,WAAA;AAAA,MACZ,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,GAAK,EAAA,IAAI,CAAM,KAAA;AAAA,QAC7C,IAAA,CAAK,qBAAqB,GAAG,CAAA;AAAA,QAC7B,MAAM,IAAK,EAAA,CAAE,KAAK,CAAC,CAAA,KAAM,EAAE,OAAO;AAAA,OACnC;AAAA,KACH;AAAA;AACF,EAEiB,oBAAA,GAAuB,CAAC,GAAgB,KAAA;AACvD,IAAA,MAAM,CAAC,MAAQ,EAAA,GAAG,IAAI,CAAI,GAAA,GAAA,CAAI,MAAM,GAAG,CAAA;AACvC,IAAO,OAAA,CAAC,KAAK,iBAAkB,CAAA,MAAM,GAAG,GAAG,IAAI,CAAE,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,GAC3D;AAAA,EAEiB,iBAAA,GAAoB,CAAC,MAAmB,KAAA;AACvD,IAAI,IAAA;AACF,MAAA,OAAO,IAAK,CAAA,mBAAA,CAAoB,MAAM,CAAA,CAAE,CAAC,CAAA;AAAA,KACnC,CAAA,MAAA;AACN,MAAO,OAAA,MAAA;AAAA;AACT,GACF;AAAA,EAEgB,MAAA,GAAS,CAAC,QAAwC,KAAA;AAChE,IAAK,IAAA,CAAA,eAAA,CAAgB,KAAK,QAAQ,CAAA;AAAA,GACpC;AAAA,EAEgB,IAAA,GAAO,OAAO,MAAA,EAAgB,SAA4B,KAAA;AACxE,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAEjB,IAAI,IAAA,CAAC,KAAK,WAAa,EAAA;AACrB,MAAA,IAAA,CAAK,cAAc,IAAK,CAAA,QAAA,CAAS,MAAM,CAAE,CAAA,KAAA,CAAM,CAAC,KAAU,KAAA;AACxD,QAAA,IAAA,CAAK,WAAc,GAAA,IAAA;AACnB,QAAM,MAAA,KAAA;AAAA,OACP,CAAA;AAAA;AAEH,IAAA,MAAM,IAAK,CAAA,WAAA;AAAA,GACb;AAAA,EAEgB,WAAA,GAAc,OAAO,MAAmB,KAAA;AACtD,IAAI,IAAA,CAACC,sBAAK,aAAe,EAAA;AAEzB,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAGvD,IAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,iBAAA,CAAkB,MAAM,CAAA;AACrD,IAAI,IAAAA,qBAAA,CAAK,aAAa,eAAiB,EAAA;AACrC,MAAM,MAAAA,qBAAA,CAAK,eAAe,eAAe,CAAA;AAAA;AAC3C,GACF;AAAA,EAEiB,QAAA,GAAW,OAAO,MAAmB,KAAA;AACpD,IAAI,IAAA,CAAC,KAAK,SAAW,EAAA;AAErB,IAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,iBAAA,CAAkB,MAAM,CAAA;AACrD,IAAA,MAAM,uBAAuB,IAAK,CAAA,KAAA,IAAS,KAAK,SAAU,CAAA,MAAA,IAAU,KAAK,SAAU,CAAA,MAAA;AAEnF,IAAA,MAAM,SAAS,oBACX,GAAA,MAAM,KAAK,kBAAmB,CAAA,IAAA,CAAK,SAAS,CAC5C,GAAA,IAAA,CAAK,wBAAyB,CAAA,IAAA,CAAK,SAAS,CAAE,CAAA,IAAA,CAAK,EAAE,UAAY,EAAA,IAAA,CAAK,mBAAmB,CAAA;AAE7F,IAAA,MAAMC,mBAAWD,qBAAM,EAAA,MAAM,EAC1B,GAAI,CAAAE,6BAAgB,EACpB,IAAK,CAAA;AAAA,MACJ,GAAG,oBAAA;AAAA,MACH,GAAG,IAAK,CAAA,WAAA;AAAA,MACR,GAAK,EAAA;AAAA,KACN,CAAA;AAEH,IAAA,IAAA,CAAK,gBAAgB,OAAQ,CAAA,CAAC,QAAa,KAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,GAC7D;AAAA,EAEiB,wBAAA,GAA2B,CAAC,SAA4B,KAAA;AACvE,IAAA,OAAOC,cAAO,EAAA,CACX,GAAI,CAAAC,qBAAA,EAAe,CACnB,CAAA,GAAA;AAAA,MACCC,oBAAa,CAAA;AAAA,QACX,MAAQ,EAAA,CAAA,EAAG,SAAU,CAAA,OAAO,IAAI,MAAM,CAAA,CAAA;AAAA,QACtC,cAAgB,EAAA,IAAA;AAAA,QAChB,SAAS,CAAC,EAAE,SAAW,EAAA,QAAA,EAAU,QAAa,KAAA;AAC5C,UAAM,MAAA,SAAA,GAAY,8BAA+B,CAAA,QAAQ,CAAK,IAAA,QAAA;AAC9D,UAAA,OAAO,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,SAAS,IAAI,SAAS,CAAA,KAAA,CAAA;AAAA;AAC5C,OACD;AAAA,KACH;AAAA,GACJ;AAAA,EAEiB,eAAA,GAAkB,CAAC,GAAgB,KAAA;AAClD,IAAM,MAAA,CAAC,IAAM,EAAA,KAAK,CAAI,GAAA,GAAA,CAAI,QAAQ,MAAQ,EAAA,GAAG,CAAE,CAAA,KAAA,CAAM,GAAG,CAAA;AACxD,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,GAAA,EAAS,IAAA,EAAA;AACjC,IAAM,MAAA,eAAA,GAAkB,8BAA+B,CAAA,MAAM,CAAK,IAAA,MAAA;AAElE,IAAA,OAAO,CAAG,EAAA,QAAA,CAAS,IAAK,CAAA,GAAG,CAAC,CAAA,CAAA,EAAI,eAAe,CAAA,EAAG,KAAQ,GAAA,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,GAC5E;AAAA,EAEiB,kBAAA,GAAqB,OAAO,SAAqD,KAAA;AAChG,IAAA,MAAM,EAAE,UAAA,EAAe,GAAA,MAAM,OAAO,iBAAiB,CAAA;AAErD,IAAA,MAAM,WAAW,IAAK,CAAA,wBAAA,CAAyB,SAAS,CAAE,CAAA,GAAA,CAAI,YAAY,CAAA;AAE1E,IAAA,OAAO,SAAS,IAAK,CAAA;AAAA,MACnB,QAAQ,SAAU,CAAA,MAAA;AAAA,MAClB,QAAQ,SAAU,CAAA,MAAA;AAAA,MAClB,YAAY,IAAK,CAAA,iBAAA;AAAA,MACjB,KAAA,EAAO,OAAO,KAAA,EAAO,IAAS,KAAA;AAC5B,QAAA,MAAM,MAAM,OAAO,KAAA,KAAU,WAAW,IAAK,CAAA,eAAA,CAAgB,KAAK,CAAI,GAAA,KAAA;AACtE,QAAM,MAAA,UAAA,GAAa,IAAI,eAAgB,EAAA;AACvC,QAAA,MAAM,YAAY,UAAW,CAAA,MAAM,UAAW,CAAA,KAAA,IAAS,qBAAqB,CAAA;AAC5E,QAAI,IAAA;AACF,UAAO,OAAA,MAAM,MAAM,GAAK,EAAA,EAAE,GAAG,IAAM,EAAA,MAAA,EAAQ,UAAW,CAAA,MAAA,EAAQ,CAAA;AAAA,SAC9D,SAAA;AACA,UAAA,YAAA,CAAa,SAAS,CAAA;AAAA;AACxB;AACF,KACD,CAAA;AAAA,GACH;AACF;;;ACvKY,IAAA,oBAAA,qBAAAC,qBAAL,KAAA;AACL,EAAAA,sBAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,sBAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,sBAAA,eAAgB,CAAA,GAAA,eAAA;AAChB,EAAAA,sBAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,sBAAA,QAAS,CAAA,GAAA,QAAA;AACT,EAAAA,sBAAA,oBAAqB,CAAA,GAAA,oBAAA;AACrB,EAAAA,sBAAA,YAAa,CAAA,GAAA,WAAA;AACb,EAAAA,sBAAA,mBAAoB,CAAA,GAAA,mBAAA;AACpB,EAAAA,sBAAA,QAAS,CAAA,GAAA,QAAA;AATC,EAAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA","file":"index.js","sourcesContent":["export enum Platform {\n STUDENTS_WEB = 'STUDENTS',\n TEACHERS_WEB = 'TEACHERS',\n DISTRICT_DASHBOARD = 'DISTRICT',\n AUTH_WEB = 'AUTH_WEB',\n WEB_ADMIN = 'WEB_ADMIN',\n MOBILE = 'MOBILE',\n PARENT_WEB = 'PARENT_WEB',\n}\n\nexport enum Environment {\n MARS = 'MARS',\n VENUS = 'VENUS',\n PROD = 'PROD',\n}\n\nexport enum PlatformBuildTarget {\n PLUTO = 'pluto',\n MARS = 'mars',\n VENUS = 'pre-release',\n PROD = 'production',\n}\n\nexport enum Locale {\n US = 'en-SE',\n SE = 'sv-SE',\n GB = 'en-GB',\n CA = 'en-CA',\n SCT = 'en-SCT',\n DE = 'de-DE',\n}\n\nexport enum Source {\n MATTEAPPEN = 0,\n SKOLON = 1,\n SKOLFEDERATION = 2,\n GOOGLE = 3,\n MICROSOFT = 4,\n CLEVER = 5,\n APPLE = 6,\n MATHSYNC = 7,\n CLASSLINK = 8,\n EDUCLOUD = 9,\n EGIL = 10,\n WONDE = 12,\n SCHOOLOGY = 13,\n SEEMIS = 14,\n IMPORT = 15,\n CANVAS = 16,\n}\n\nexport enum LoginSource {\n MAGMA = 0,\n CLEVER = 1,\n CLASS_LINK = 2,\n SKOLON = 3,\n SKOLFEDERATION = 4,\n GOOGLE = 5,\n MICROSOFT = 6,\n APPLE = 7,\n SCHOOLOGY = 8,\n MY_LOGIN = 9,\n}\n\nexport enum SSO {\n APPLE = 'APPLE',\n GOOGLE = 'GOOGLE',\n MICROSOFT = 'MICROSOFT',\n CLEVER = 'CLEVER',\n SCHOOLOGY = 'SCHOOLOGY',\n CLASS_LINK = 'CLASS_LINK',\n SKOLFEDERATION = 'SKOLFEDERATION',\n SKOLON = 'SKOLON',\n WONDE = 'WONDE',\n CANVAS = 'CANVAS',\n QR_CODE = 'QR_CODE',\n}\n\nexport enum ApiRegion {\n MAIN = 'MAIN',\n CANADA = 'CANADA',\n}\n\nexport enum QRCodeSize {\n DEFAULT = 'default',\n MEDIUM = 'medium',\n LARGE = 'large',\n}\n","import i18n, { InitOptions } from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport type { TolgeeInstance, TolgeeStaticData } from '@tolgee/i18next'\nimport { BackendFetch, I18nextPlugin, Tolgee, withTolgee } from '@tolgee/i18next'\nimport { Locale } from '../shared/constants/common.constants'\nimport {\n FallbackResources,\n OnTranslationInitCallback,\n StorageConfig,\n TolgeeConfig,\n TranslationManagerOptions,\n} from './translation.types'\n\nconst CDN_ID = '39317fd3c6ff2ad02619ba673baae8b6'\nconst TOLGEE_DEV_TIMEOUT_MS = 3000\n\n// Invalid BCP 47 tags (e.g. en-SCT) get lowercased by hermes engine.\nconst CANONICAL_LOCALE_BY_NORMALIZED: Record<string, Locale> = Object.fromEntries(\n Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])\n)\n\nconst DEFAULT_I18N_OPTIONS: InitOptions = {\n fallbackLng: undefined,\n load: 'currentOnly',\n react: {\n useSuspense: false,\n },\n interpolation: {\n escapeValue: false,\n },\n}\n\nexport class TranslationManager {\n private readonly isDev: boolean\n private readonly i18nOptions: InitOptions\n private readonly onInitCallbacks: OnTranslationInitCallback[] = []\n private readonly fallbackResources?: TolgeeStaticData\n private readonly storage?: StorageConfig\n\n private tolgeeCfg: TolgeeConfig | null = null\n private initPromise: Promise<void> | null = null\n\n constructor({ isDev, i18nOptions, storage, fallbackResources }: TranslationManagerOptions) {\n this.isDev = isDev\n this.i18nOptions = i18nOptions\n this.storage = storage\n this.fallbackResources = this.unwrapModuleDefaults(fallbackResources)\n }\n\n private unwrapModuleDefaults(resources?: FallbackResources) {\n if (!resources) return undefined\n return Object.fromEntries(\n Object.entries(resources).map(([key, load]) => [\n this.normalizeResourceKey(key),\n () => load().then((m) => m.default),\n ])\n )\n }\n\n private readonly normalizeResourceKey = (key: string) => {\n const [locale, ...rest] = key.split(':')\n return [this.toCanonicalLocale(locale), ...rest].join(':')\n }\n\n private readonly toCanonicalLocale = (locale: string) => {\n try {\n return Intl.getCanonicalLocales(locale)[0]\n } catch {\n return locale\n }\n }\n\n public readonly onInit = (callback: OnTranslationInitCallback) => {\n this.onInitCallbacks.push(callback)\n }\n\n public readonly init = async (locale: Locale, envConfig: TolgeeConfig) => {\n this.tolgeeCfg = envConfig\n\n if (!this.initPromise) {\n this.initPromise = this.initI18n(locale).catch((error) => {\n this.initPromise = null\n throw error\n })\n }\n await this.initPromise\n }\n\n public readonly setLanguage = async (locale: Locale) => {\n if (!i18n.isInitialized) return\n\n if (this.storage) {\n this.storage.adapter.setItem(this.storage.key, locale)\n }\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n if (i18n.language !== canonicalLocale) {\n await i18n.changeLanguage(canonicalLocale)\n }\n }\n\n private readonly initI18n = async (locale: Locale) => {\n if (!this.tolgeeCfg) return\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl\n\n const tolgee = canUseTolgeeDevTools\n ? await this.initTolgeeDevTools(this.tolgeeCfg)\n : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources })\n\n await withTolgee(i18n, tolgee)\n .use(initReactI18next)\n .init({\n ...DEFAULT_I18N_OPTIONS,\n ...this.i18nOptions,\n lng: canonicalLocale,\n })\n\n this.onInitCallbacks.forEach((callback) => callback(locale))\n }\n\n private readonly createBaseTolgeeInstance = (tolgeeCfg: TolgeeConfig) => {\n return Tolgee()\n .use(I18nextPlugin())\n .use(\n BackendFetch({\n prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,\n fallbackOnFail: true,\n getPath: ({ namespace, language, prefix }) => {\n const cdnLocale = CANONICAL_LOCALE_BY_NORMALIZED[language] ?? language\n return `${prefix}/${namespace}/${cdnLocale}.json`\n },\n })\n )\n }\n\n private readonly normalizeApiUrl = (url: string) => {\n const [path, query] = url.replace(/\\/\\?/, '?').split('?')\n const segments = path.split('/')\n const locale = segments.pop() ?? ''\n const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale\n\n return `${segments.join('/')}/${canonicalLocale}${query ? `?${query}` : ''}`\n }\n\n private readonly initTolgeeDevTools = async (tolgeeCfg: TolgeeConfig): Promise<TolgeeInstance> => {\n const { DevBackend } = await import('@tolgee/i18next')\n\n const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend())\n\n return instance.init({\n apiUrl: tolgeeCfg.apiUrl,\n apiKey: tolgeeCfg.apiKey,\n staticData: this.fallbackResources,\n fetch: async (input, init) => {\n const url = typeof input === 'string' ? this.normalizeApiUrl(input) : input\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS)\n try {\n return await fetch(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeoutId)\n }\n },\n })\n }\n}\n","export enum TranslationNamespace {\n STUDENTS_WEB = 'students-web',\n TEACHERS_WEB = 'teachers-web',\n DISTRICT_DASH = 'district-dash',\n AUTH_WEB = 'auth-web',\n MOBILE = 'mobile',\n MAGMAMATH_FEATURES = 'magmamath-features',\n DRAW_BOARD = 'drawboard',\n STUDENTS_FEATURES = 'students-features',\n SHARED = 'shared',\n}\n"]}
1
+ {"version":3,"sources":["../../src/translation/TranslationManager.ts","../../src/translation/translation.constants.ts"],"names":["i18n","withTolgee","initReactI18next","Tolgee","I18nextPlugin","BackendFetch","TranslationNamespace"],"mappings":";;;;;;;;;;;AAaA,IAAM,MAAS,GAAA,kCAAA;AACf,IAAM,qBAAwB,GAAA,GAAA;AAE9B,IAAM,oBAAoC,GAAA;AAAA,EACxC,WAAa,EAAA,MAAA;AAAA,EACb,IAAM,EAAA,aAAA;AAAA,EACN,KAAO,EAAA;AAAA,IACL,WAAa,EAAA;AAAA,GACf;AAAA,EACA,aAAe,EAAA;AAAA,IACb,WAAa,EAAA;AAAA;AAEjB,CAAA;AAEO,IAAM,qBAAN,MAAyB;AAAA,EACb,KAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAA+C,EAAC;AAAA,EAChD,iBAAA;AAAA,EACA,OAAA;AAAA,EAET,SAAiC,GAAA,IAAA;AAAA,EACjC,WAAoC,GAAA,IAAA;AAAA,EAE5C,YAAY,EAAE,KAAA,EAAO,WAAa,EAAA,OAAA,EAAS,mBAAgD,EAAA;AACzF,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA;AACb,IAAA,IAAA,CAAK,WAAc,GAAA,WAAA;AACnB,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAK,IAAA,CAAA,iBAAA,GAAoB,IAAK,CAAA,oBAAA,CAAqB,iBAAiB,CAAA;AAAA;AACtE,EAEQ,qBAAqB,SAA+B,EAAA;AAC1D,IAAI,IAAA,CAAC,WAAkB,OAAA,MAAA;AACvB,IAAA,OAAO,MAAO,CAAA,WAAA;AAAA,MACZ,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,KAAK,IAAI,CAAA,KAAM,CAAC,GAAK,EAAA,MAAM,MAAO,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,CAAC,CAAC;AAAA,KAC3F;AAAA;AACF,EAEgB,MAAA,GAAS,CAAC,QAAwC,KAAA;AAChE,IAAK,IAAA,CAAA,eAAA,CAAgB,KAAK,QAAQ,CAAA;AAAA,GACpC;AAAA,EAEgB,IAAA,GAAO,OAAO,MAAA,EAAgB,SAA4B,KAAA;AACxE,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAEjB,IAAI,IAAA,CAAC,KAAK,WAAa,EAAA;AACrB,MAAA,IAAA,CAAK,cAAc,IAAK,CAAA,QAAA,CAAS,MAAM,CAAE,CAAA,KAAA,CAAM,CAAC,KAAU,KAAA;AACxD,QAAA,IAAA,CAAK,WAAc,GAAA,IAAA;AACnB,QAAM,MAAA,KAAA;AAAA,OACP,CAAA;AAAA;AAEH,IAAA,MAAM,IAAK,CAAA,WAAA;AAAA,GACb;AAAA,EAEgB,WAAA,GAAc,OAAO,MAAmB,KAAA;AACtD,IAAI,IAAA,CAACA,sBAAK,aAAe,EAAA;AAEzB,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAGvD,IAAI,IAAAA,qBAAA,CAAK,aAAa,MAAQ,EAAA;AAC5B,MAAM,MAAAA,qBAAA,CAAK,eAAe,MAAM,CAAA;AAAA;AAClC,GACF;AAAA,EAEiB,QAAA,GAAW,OAAO,MAAmB,KAAA;AACpD,IAAI,IAAA,CAAC,KAAK,SAAW,EAAA;AAErB,IAAA,MAAM,uBAAuB,IAAK,CAAA,KAAA,IAAS,KAAK,SAAU,CAAA,MAAA,IAAU,KAAK,SAAU,CAAA,MAAA;AAEnF,IAAA,MAAM,SAAS,oBACX,GAAA,MAAM,KAAK,kBAAmB,CAAA,IAAA,CAAK,SAAS,CAC5C,GAAA,IAAA,CAAK,wBAAyB,CAAA,IAAA,CAAK,SAAS,CAAE,CAAA,IAAA,CAAK,EAAE,UAAY,EAAA,IAAA,CAAK,mBAAmB,CAAA;AAE7F,IAAA,MAAMC,mBAAWD,qBAAM,EAAA,MAAM,EAC1B,GAAI,CAAAE,6BAAgB,EACpB,IAAK,CAAA;AAAA,MACJ,GAAG,oBAAA;AAAA,MACH,GAAG,IAAK,CAAA,WAAA;AAAA,MACR,GAAK,EAAA;AAAA,KACN,CAAA;AAEH,IAAA,IAAA,CAAK,gBAAgB,OAAQ,CAAA,CAAC,QAAa,KAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,GAC7D;AAAA,EAEiB,wBAAA,GAA2B,CAAC,SAA4B,KAAA;AACvE,IAAA,OAAOC,cAAO,EAAA,CACX,GAAI,CAAAC,qBAAA,EAAe,CACnB,CAAA,GAAA;AAAA,MACCC,oBAAa,CAAA;AAAA,QACX,MAAQ,EAAA,CAAA,EAAG,SAAU,CAAA,OAAO,IAAI,MAAM,CAAA,CAAA;AAAA,QACtC,cAAgB,EAAA;AAAA,OACjB;AAAA,KACH;AAAA,GACJ;AAAA,EAEiB,kBAAA,GAAqB,OAAO,SAAqD,KAAA;AAChG,IAAA,MAAM,EAAE,UAAA,EAAe,GAAA,MAAM,OAAO,iBAAiB,CAAA;AAErD,IAAA,MAAM,WAAW,IAAK,CAAA,wBAAA,CAAyB,SAAS,CAAE,CAAA,GAAA,CAAI,YAAY,CAAA;AAE1E,IAAA,OAAO,SAAS,IAAK,CAAA;AAAA,MACnB,QAAQ,SAAU,CAAA,MAAA;AAAA,MAClB,QAAQ,SAAU,CAAA,MAAA;AAAA,MAClB,YAAY,IAAK,CAAA,iBAAA;AAAA,MACjB,KAAA,EAAO,OAAO,KAAA,EAAO,IAAS,KAAA;AAE5B,QAAM,MAAA,GAAA,GAAM,OAAO,KAAU,KAAA,QAAA,GAAW,MAAM,OAAQ,CAAA,MAAA,EAAQ,GAAG,CAAI,GAAA,KAAA;AACrE,QAAM,MAAA,UAAA,GAAa,IAAI,eAAgB,EAAA;AACvC,QAAA,MAAM,YAAY,UAAW,CAAA,MAAM,UAAW,CAAA,KAAA,IAAS,qBAAqB,CAAA;AAC5E,QAAI,IAAA;AACF,UAAO,OAAA,MAAM,MAAM,GAAK,EAAA,EAAE,GAAG,IAAM,EAAA,MAAA,EAAQ,UAAW,CAAA,MAAA,EAAQ,CAAA;AAAA,SAC9D,SAAA;AACA,UAAA,YAAA,CAAa,SAAS,CAAA;AAAA;AACxB;AACF,KACD,CAAA;AAAA,GACH;AACF;;;ACpIY,IAAA,oBAAA,qBAAAC,qBAAL,KAAA;AACL,EAAAA,sBAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,sBAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,sBAAA,eAAgB,CAAA,GAAA,eAAA;AAChB,EAAAA,sBAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,sBAAA,QAAS,CAAA,GAAA,QAAA;AACT,EAAAA,sBAAA,oBAAqB,CAAA,GAAA,oBAAA;AACrB,EAAAA,sBAAA,YAAa,CAAA,GAAA,WAAA;AACb,EAAAA,sBAAA,mBAAoB,CAAA,GAAA,mBAAA;AACpB,EAAAA,sBAAA,QAAS,CAAA,GAAA,QAAA;AATC,EAAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA","file":"index.js","sourcesContent":["import i18n, { InitOptions } from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport type { TolgeeInstance, TolgeeStaticData } from '@tolgee/i18next'\nimport { BackendFetch, I18nextPlugin, Tolgee, withTolgee } from '@tolgee/i18next'\nimport { Locale } from '../shared/constants/common.constants'\nimport {\n FallbackResources,\n OnTranslationInitCallback,\n StorageConfig,\n TolgeeConfig,\n TranslationManagerOptions,\n} from './translation.types'\n\nconst CDN_ID = '39317fd3c6ff2ad02619ba673baae8b6'\nconst TOLGEE_DEV_TIMEOUT_MS = 3000\n\nconst DEFAULT_I18N_OPTIONS: InitOptions = {\n fallbackLng: undefined,\n load: 'currentOnly',\n react: {\n useSuspense: false,\n },\n interpolation: {\n escapeValue: false,\n },\n}\n\nexport class TranslationManager {\n private readonly isDev: boolean\n private readonly i18nOptions: InitOptions\n private readonly onInitCallbacks: OnTranslationInitCallback[] = []\n private readonly fallbackResources?: TolgeeStaticData\n private readonly storage?: StorageConfig\n\n private tolgeeCfg: TolgeeConfig | null = null\n private initPromise: Promise<void> | null = null\n\n constructor({ isDev, i18nOptions, storage, fallbackResources }: TranslationManagerOptions) {\n this.isDev = isDev\n this.i18nOptions = i18nOptions\n this.storage = storage\n this.fallbackResources = this.unwrapModuleDefaults(fallbackResources)\n }\n\n private unwrapModuleDefaults(resources?: FallbackResources) {\n if (!resources) return undefined\n return Object.fromEntries(\n Object.entries(resources).map(([key, load]) => [key, () => load().then((m) => m.default)])\n )\n }\n\n public readonly onInit = (callback: OnTranslationInitCallback) => {\n this.onInitCallbacks.push(callback)\n }\n\n public readonly init = async (locale: Locale, envConfig: TolgeeConfig) => {\n this.tolgeeCfg = envConfig\n\n if (!this.initPromise) {\n this.initPromise = this.initI18n(locale).catch((error) => {\n this.initPromise = null\n throw error\n })\n }\n await this.initPromise\n }\n\n public readonly setLanguage = async (locale: Locale) => {\n if (!i18n.isInitialized) return\n\n if (this.storage) {\n this.storage.adapter.setItem(this.storage.key, locale)\n }\n\n if (i18n.language !== locale) {\n await i18n.changeLanguage(locale)\n }\n }\n\n private readonly initI18n = async (locale: Locale) => {\n if (!this.tolgeeCfg) return\n\n const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl\n\n const tolgee = canUseTolgeeDevTools\n ? await this.initTolgeeDevTools(this.tolgeeCfg)\n : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources })\n\n await withTolgee(i18n, tolgee)\n .use(initReactI18next)\n .init({\n ...DEFAULT_I18N_OPTIONS,\n ...this.i18nOptions,\n lng: locale,\n })\n\n this.onInitCallbacks.forEach((callback) => callback(locale))\n }\n\n private readonly createBaseTolgeeInstance = (tolgeeCfg: TolgeeConfig) => {\n return Tolgee()\n .use(I18nextPlugin())\n .use(\n BackendFetch({\n prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,\n fallbackOnFail: true,\n })\n )\n }\n\n private readonly initTolgeeDevTools = async (tolgeeCfg: TolgeeConfig): Promise<TolgeeInstance> => {\n const { DevBackend } = await import('@tolgee/i18next')\n\n const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend())\n\n return instance.init({\n apiUrl: tolgeeCfg.apiUrl,\n apiKey: tolgeeCfg.apiKey,\n staticData: this.fallbackResources,\n fetch: async (input, init) => {\n // fix for react-native\n const url = typeof input === 'string' ? input.replace(/\\/\\?/, '?') : input\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS)\n try {\n return await fetch(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeoutId)\n }\n },\n })\n }\n}\n","export enum TranslationNamespace {\n STUDENTS_WEB = 'students-web',\n TEACHERS_WEB = 'teachers-web',\n DISTRICT_DASH = 'district-dash',\n AUTH_WEB = 'auth-web',\n MOBILE = 'mobile',\n MAGMAMATH_FEATURES = 'magmamath-features',\n DRAW_BOARD = 'drawboard',\n STUDENTS_FEATURES = 'students-features',\n SHARED = 'shared',\n}\n"]}
@@ -2,25 +2,9 @@ import i18n from 'i18next';
2
2
  import { initReactI18next } from 'react-i18next';
3
3
  import { withTolgee, Tolgee, I18nextPlugin, BackendFetch } from '@tolgee/i18next';
4
4
 
5
- // src/translation/TranslationManager.ts
6
-
7
- // src/shared/constants/common.constants.ts
8
- var Locale = /* @__PURE__ */ ((Locale2) => {
9
- Locale2["US"] = "en-SE";
10
- Locale2["SE"] = "sv-SE";
11
- Locale2["GB"] = "en-GB";
12
- Locale2["CA"] = "en-CA";
13
- Locale2["SCT"] = "en-SCT";
14
- Locale2["DE"] = "de-DE";
15
- return Locale2;
16
- })(Locale || {});
17
-
18
5
  // src/translation/TranslationManager.ts
19
6
  var CDN_ID = "39317fd3c6ff2ad02619ba673baae8b6";
20
7
  var TOLGEE_DEV_TIMEOUT_MS = 3e3;
21
- var CANONICAL_LOCALE_BY_NORMALIZED = Object.fromEntries(
22
- Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])
23
- );
24
8
  var DEFAULT_I18N_OPTIONS = {
25
9
  fallbackLng: void 0,
26
10
  load: "currentOnly",
@@ -48,23 +32,9 @@ var TranslationManager = class {
48
32
  unwrapModuleDefaults(resources) {
49
33
  if (!resources) return void 0;
50
34
  return Object.fromEntries(
51
- Object.entries(resources).map(([key, load]) => [
52
- this.normalizeResourceKey(key),
53
- () => load().then((m) => m.default)
54
- ])
35
+ Object.entries(resources).map(([key, load]) => [key, () => load().then((m) => m.default)])
55
36
  );
56
37
  }
57
- normalizeResourceKey = (key) => {
58
- const [locale, ...rest] = key.split(":");
59
- return [this.toCanonicalLocale(locale), ...rest].join(":");
60
- };
61
- toCanonicalLocale = (locale) => {
62
- try {
63
- return Intl.getCanonicalLocales(locale)[0];
64
- } catch {
65
- return locale;
66
- }
67
- };
68
38
  onInit = (callback) => {
69
39
  this.onInitCallbacks.push(callback);
70
40
  };
@@ -83,20 +53,18 @@ var TranslationManager = class {
83
53
  if (this.storage) {
84
54
  this.storage.adapter.setItem(this.storage.key, locale);
85
55
  }
86
- const canonicalLocale = this.toCanonicalLocale(locale);
87
- if (i18n.language !== canonicalLocale) {
88
- await i18n.changeLanguage(canonicalLocale);
56
+ if (i18n.language !== locale) {
57
+ await i18n.changeLanguage(locale);
89
58
  }
90
59
  };
91
60
  initI18n = async (locale) => {
92
61
  if (!this.tolgeeCfg) return;
93
- const canonicalLocale = this.toCanonicalLocale(locale);
94
62
  const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl;
95
63
  const tolgee = canUseTolgeeDevTools ? await this.initTolgeeDevTools(this.tolgeeCfg) : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources });
96
64
  await withTolgee(i18n, tolgee).use(initReactI18next).init({
97
65
  ...DEFAULT_I18N_OPTIONS,
98
66
  ...this.i18nOptions,
99
- lng: canonicalLocale
67
+ lng: locale
100
68
  });
101
69
  this.onInitCallbacks.forEach((callback) => callback(locale));
102
70
  };
@@ -104,21 +72,10 @@ var TranslationManager = class {
104
72
  return Tolgee().use(I18nextPlugin()).use(
105
73
  BackendFetch({
106
74
  prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,
107
- fallbackOnFail: true,
108
- getPath: ({ namespace, language, prefix }) => {
109
- const cdnLocale = CANONICAL_LOCALE_BY_NORMALIZED[language] ?? language;
110
- return `${prefix}/${namespace}/${cdnLocale}.json`;
111
- }
75
+ fallbackOnFail: true
112
76
  })
113
77
  );
114
78
  };
115
- normalizeApiUrl = (url) => {
116
- const [path, query] = url.replace(/\/\?/, "?").split("?");
117
- const segments = path.split("/");
118
- const locale = segments.pop() ?? "";
119
- const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale;
120
- return `${segments.join("/")}/${canonicalLocale}${query ? `?${query}` : ""}`;
121
- };
122
79
  initTolgeeDevTools = async (tolgeeCfg) => {
123
80
  const { DevBackend } = await import('@tolgee/i18next');
124
81
  const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend());
@@ -127,7 +84,7 @@ var TranslationManager = class {
127
84
  apiKey: tolgeeCfg.apiKey,
128
85
  staticData: this.fallbackResources,
129
86
  fetch: async (input, init) => {
130
- const url = typeof input === "string" ? this.normalizeApiUrl(input) : input;
87
+ const url = typeof input === "string" ? input.replace(/\/\?/, "?") : input;
131
88
  const controller = new AbortController();
132
89
  const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS);
133
90
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shared/constants/common.constants.ts","../../src/translation/TranslationManager.ts","../../src/translation/translation.constants.ts"],"names":["Locale","TranslationNamespace"],"mappings":"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","file":"index.mjs","sourcesContent":["export enum Platform {\n STUDENTS_WEB = 'STUDENTS',\n TEACHERS_WEB = 'TEACHERS',\n DISTRICT_DASHBOARD = 'DISTRICT',\n AUTH_WEB = 'AUTH_WEB',\n WEB_ADMIN = 'WEB_ADMIN',\n MOBILE = 'MOBILE',\n PARENT_WEB = 'PARENT_WEB',\n}\n\nexport enum Environment {\n MARS = 'MARS',\n VENUS = 'VENUS',\n PROD = 'PROD',\n}\n\nexport enum PlatformBuildTarget {\n PLUTO = 'pluto',\n MARS = 'mars',\n VENUS = 'pre-release',\n PROD = 'production',\n}\n\nexport enum Locale {\n US = 'en-SE',\n SE = 'sv-SE',\n GB = 'en-GB',\n CA = 'en-CA',\n SCT = 'en-SCT',\n DE = 'de-DE',\n}\n\nexport enum Source {\n MATTEAPPEN = 0,\n SKOLON = 1,\n SKOLFEDERATION = 2,\n GOOGLE = 3,\n MICROSOFT = 4,\n CLEVER = 5,\n APPLE = 6,\n MATHSYNC = 7,\n CLASSLINK = 8,\n EDUCLOUD = 9,\n EGIL = 10,\n WONDE = 12,\n SCHOOLOGY = 13,\n SEEMIS = 14,\n IMPORT = 15,\n CANVAS = 16,\n}\n\nexport enum LoginSource {\n MAGMA = 0,\n CLEVER = 1,\n CLASS_LINK = 2,\n SKOLON = 3,\n SKOLFEDERATION = 4,\n GOOGLE = 5,\n MICROSOFT = 6,\n APPLE = 7,\n SCHOOLOGY = 8,\n MY_LOGIN = 9,\n}\n\nexport enum SSO {\n APPLE = 'APPLE',\n GOOGLE = 'GOOGLE',\n MICROSOFT = 'MICROSOFT',\n CLEVER = 'CLEVER',\n SCHOOLOGY = 'SCHOOLOGY',\n CLASS_LINK = 'CLASS_LINK',\n SKOLFEDERATION = 'SKOLFEDERATION',\n SKOLON = 'SKOLON',\n WONDE = 'WONDE',\n CANVAS = 'CANVAS',\n QR_CODE = 'QR_CODE',\n}\n\nexport enum ApiRegion {\n MAIN = 'MAIN',\n CANADA = 'CANADA',\n}\n\nexport enum QRCodeSize {\n DEFAULT = 'default',\n MEDIUM = 'medium',\n LARGE = 'large',\n}\n","import i18n, { InitOptions } from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport type { TolgeeInstance, TolgeeStaticData } from '@tolgee/i18next'\nimport { BackendFetch, I18nextPlugin, Tolgee, withTolgee } from '@tolgee/i18next'\nimport { Locale } from '../shared/constants/common.constants'\nimport {\n FallbackResources,\n OnTranslationInitCallback,\n StorageConfig,\n TolgeeConfig,\n TranslationManagerOptions,\n} from './translation.types'\n\nconst CDN_ID = '39317fd3c6ff2ad02619ba673baae8b6'\nconst TOLGEE_DEV_TIMEOUT_MS = 3000\n\n// Invalid BCP 47 tags (e.g. en-SCT) get lowercased by hermes engine.\nconst CANONICAL_LOCALE_BY_NORMALIZED: Record<string, Locale> = Object.fromEntries(\n Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])\n)\n\nconst DEFAULT_I18N_OPTIONS: InitOptions = {\n fallbackLng: undefined,\n load: 'currentOnly',\n react: {\n useSuspense: false,\n },\n interpolation: {\n escapeValue: false,\n },\n}\n\nexport class TranslationManager {\n private readonly isDev: boolean\n private readonly i18nOptions: InitOptions\n private readonly onInitCallbacks: OnTranslationInitCallback[] = []\n private readonly fallbackResources?: TolgeeStaticData\n private readonly storage?: StorageConfig\n\n private tolgeeCfg: TolgeeConfig | null = null\n private initPromise: Promise<void> | null = null\n\n constructor({ isDev, i18nOptions, storage, fallbackResources }: TranslationManagerOptions) {\n this.isDev = isDev\n this.i18nOptions = i18nOptions\n this.storage = storage\n this.fallbackResources = this.unwrapModuleDefaults(fallbackResources)\n }\n\n private unwrapModuleDefaults(resources?: FallbackResources) {\n if (!resources) return undefined\n return Object.fromEntries(\n Object.entries(resources).map(([key, load]) => [\n this.normalizeResourceKey(key),\n () => load().then((m) => m.default),\n ])\n )\n }\n\n private readonly normalizeResourceKey = (key: string) => {\n const [locale, ...rest] = key.split(':')\n return [this.toCanonicalLocale(locale), ...rest].join(':')\n }\n\n private readonly toCanonicalLocale = (locale: string) => {\n try {\n return Intl.getCanonicalLocales(locale)[0]\n } catch {\n return locale\n }\n }\n\n public readonly onInit = (callback: OnTranslationInitCallback) => {\n this.onInitCallbacks.push(callback)\n }\n\n public readonly init = async (locale: Locale, envConfig: TolgeeConfig) => {\n this.tolgeeCfg = envConfig\n\n if (!this.initPromise) {\n this.initPromise = this.initI18n(locale).catch((error) => {\n this.initPromise = null\n throw error\n })\n }\n await this.initPromise\n }\n\n public readonly setLanguage = async (locale: Locale) => {\n if (!i18n.isInitialized) return\n\n if (this.storage) {\n this.storage.adapter.setItem(this.storage.key, locale)\n }\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n if (i18n.language !== canonicalLocale) {\n await i18n.changeLanguage(canonicalLocale)\n }\n }\n\n private readonly initI18n = async (locale: Locale) => {\n if (!this.tolgeeCfg) return\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl\n\n const tolgee = canUseTolgeeDevTools\n ? await this.initTolgeeDevTools(this.tolgeeCfg)\n : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources })\n\n await withTolgee(i18n, tolgee)\n .use(initReactI18next)\n .init({\n ...DEFAULT_I18N_OPTIONS,\n ...this.i18nOptions,\n lng: canonicalLocale,\n })\n\n this.onInitCallbacks.forEach((callback) => callback(locale))\n }\n\n private readonly createBaseTolgeeInstance = (tolgeeCfg: TolgeeConfig) => {\n return Tolgee()\n .use(I18nextPlugin())\n .use(\n BackendFetch({\n prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,\n fallbackOnFail: true,\n getPath: ({ namespace, language, prefix }) => {\n const cdnLocale = CANONICAL_LOCALE_BY_NORMALIZED[language] ?? language\n return `${prefix}/${namespace}/${cdnLocale}.json`\n },\n })\n )\n }\n\n private readonly normalizeApiUrl = (url: string) => {\n const [path, query] = url.replace(/\\/\\?/, '?').split('?')\n const segments = path.split('/')\n const locale = segments.pop() ?? ''\n const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale\n\n return `${segments.join('/')}/${canonicalLocale}${query ? `?${query}` : ''}`\n }\n\n private readonly initTolgeeDevTools = async (tolgeeCfg: TolgeeConfig): Promise<TolgeeInstance> => {\n const { DevBackend } = await import('@tolgee/i18next')\n\n const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend())\n\n return instance.init({\n apiUrl: tolgeeCfg.apiUrl,\n apiKey: tolgeeCfg.apiKey,\n staticData: this.fallbackResources,\n fetch: async (input, init) => {\n const url = typeof input === 'string' ? this.normalizeApiUrl(input) : input\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS)\n try {\n return await fetch(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeoutId)\n }\n },\n })\n }\n}\n","export enum TranslationNamespace {\n STUDENTS_WEB = 'students-web',\n TEACHERS_WEB = 'teachers-web',\n DISTRICT_DASH = 'district-dash',\n AUTH_WEB = 'auth-web',\n MOBILE = 'mobile',\n MAGMAMATH_FEATURES = 'magmamath-features',\n DRAW_BOARD = 'drawboard',\n STUDENTS_FEATURES = 'students-features',\n SHARED = 'shared',\n}\n"]}
1
+ {"version":3,"sources":["../../src/translation/TranslationManager.ts","../../src/translation/translation.constants.ts"],"names":["TranslationNamespace"],"mappings":"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","file":"index.mjs","sourcesContent":["import i18n, { InitOptions } from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport type { TolgeeInstance, TolgeeStaticData } from '@tolgee/i18next'\nimport { BackendFetch, I18nextPlugin, Tolgee, withTolgee } from '@tolgee/i18next'\nimport { Locale } from '../shared/constants/common.constants'\nimport {\n FallbackResources,\n OnTranslationInitCallback,\n StorageConfig,\n TolgeeConfig,\n TranslationManagerOptions,\n} from './translation.types'\n\nconst CDN_ID = '39317fd3c6ff2ad02619ba673baae8b6'\nconst TOLGEE_DEV_TIMEOUT_MS = 3000\n\nconst DEFAULT_I18N_OPTIONS: InitOptions = {\n fallbackLng: undefined,\n load: 'currentOnly',\n react: {\n useSuspense: false,\n },\n interpolation: {\n escapeValue: false,\n },\n}\n\nexport class TranslationManager {\n private readonly isDev: boolean\n private readonly i18nOptions: InitOptions\n private readonly onInitCallbacks: OnTranslationInitCallback[] = []\n private readonly fallbackResources?: TolgeeStaticData\n private readonly storage?: StorageConfig\n\n private tolgeeCfg: TolgeeConfig | null = null\n private initPromise: Promise<void> | null = null\n\n constructor({ isDev, i18nOptions, storage, fallbackResources }: TranslationManagerOptions) {\n this.isDev = isDev\n this.i18nOptions = i18nOptions\n this.storage = storage\n this.fallbackResources = this.unwrapModuleDefaults(fallbackResources)\n }\n\n private unwrapModuleDefaults(resources?: FallbackResources) {\n if (!resources) return undefined\n return Object.fromEntries(\n Object.entries(resources).map(([key, load]) => [key, () => load().then((m) => m.default)])\n )\n }\n\n public readonly onInit = (callback: OnTranslationInitCallback) => {\n this.onInitCallbacks.push(callback)\n }\n\n public readonly init = async (locale: Locale, envConfig: TolgeeConfig) => {\n this.tolgeeCfg = envConfig\n\n if (!this.initPromise) {\n this.initPromise = this.initI18n(locale).catch((error) => {\n this.initPromise = null\n throw error\n })\n }\n await this.initPromise\n }\n\n public readonly setLanguage = async (locale: Locale) => {\n if (!i18n.isInitialized) return\n\n if (this.storage) {\n this.storage.adapter.setItem(this.storage.key, locale)\n }\n\n if (i18n.language !== locale) {\n await i18n.changeLanguage(locale)\n }\n }\n\n private readonly initI18n = async (locale: Locale) => {\n if (!this.tolgeeCfg) return\n\n const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl\n\n const tolgee = canUseTolgeeDevTools\n ? await this.initTolgeeDevTools(this.tolgeeCfg)\n : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources })\n\n await withTolgee(i18n, tolgee)\n .use(initReactI18next)\n .init({\n ...DEFAULT_I18N_OPTIONS,\n ...this.i18nOptions,\n lng: locale,\n })\n\n this.onInitCallbacks.forEach((callback) => callback(locale))\n }\n\n private readonly createBaseTolgeeInstance = (tolgeeCfg: TolgeeConfig) => {\n return Tolgee()\n .use(I18nextPlugin())\n .use(\n BackendFetch({\n prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,\n fallbackOnFail: true,\n })\n )\n }\n\n private readonly initTolgeeDevTools = async (tolgeeCfg: TolgeeConfig): Promise<TolgeeInstance> => {\n const { DevBackend } = await import('@tolgee/i18next')\n\n const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend())\n\n return instance.init({\n apiUrl: tolgeeCfg.apiUrl,\n apiKey: tolgeeCfg.apiKey,\n staticData: this.fallbackResources,\n fetch: async (input, init) => {\n // fix for react-native\n const url = typeof input === 'string' ? input.replace(/\\/\\?/, '?') : input\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS)\n try {\n return await fetch(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeoutId)\n }\n },\n })\n }\n}\n","export enum TranslationNamespace {\n STUDENTS_WEB = 'students-web',\n TEACHERS_WEB = 'teachers-web',\n DISTRICT_DASH = 'district-dash',\n AUTH_WEB = 'auth-web',\n MOBILE = 'mobile',\n MAGMAMATH_FEATURES = 'magmamath-features',\n DRAW_BOARD = 'drawboard',\n STUDENTS_FEATURES = 'students-features',\n SHARED = 'shared',\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magmamath/frontend-config",
3
- "version": "1.3.4-rc.6",
3
+ "version": "1.3.4",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",