@magmamath/frontend-config 1.3.4-rc.3 → 1.3.4-rc.5
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.
|
@@ -24,7 +24,7 @@ var Locale = /* @__PURE__ */ ((Locale2) => {
|
|
|
24
24
|
// src/translation/TranslationManager.ts
|
|
25
25
|
var CDN_ID = "39317fd3c6ff2ad02619ba673baae8b6";
|
|
26
26
|
var TOLGEE_DEV_TIMEOUT_MS = 3e3;
|
|
27
|
-
var
|
|
27
|
+
var CANONICAL_LOCALE_BY_NORMALIZED = Object.fromEntries(
|
|
28
28
|
Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])
|
|
29
29
|
);
|
|
30
30
|
var DEFAULT_I18N_OPTIONS = {
|
|
@@ -89,20 +89,20 @@ var TranslationManager = class {
|
|
|
89
89
|
if (this.storage) {
|
|
90
90
|
this.storage.adapter.setItem(this.storage.key, locale);
|
|
91
91
|
}
|
|
92
|
-
const
|
|
93
|
-
if (i18n__default.default.language !==
|
|
94
|
-
await i18n__default.default.changeLanguage(
|
|
92
|
+
const canonicalLocale = this.toCanonicalLocale(locale);
|
|
93
|
+
if (i18n__default.default.language !== canonicalLocale) {
|
|
94
|
+
await i18n__default.default.changeLanguage(canonicalLocale);
|
|
95
95
|
}
|
|
96
96
|
};
|
|
97
97
|
initI18n = async (locale) => {
|
|
98
98
|
if (!this.tolgeeCfg) return;
|
|
99
|
-
const
|
|
99
|
+
const canonicalLocale = this.toCanonicalLocale(locale);
|
|
100
100
|
const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl;
|
|
101
101
|
const tolgee = canUseTolgeeDevTools ? await this.initTolgeeDevTools(this.tolgeeCfg) : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources });
|
|
102
102
|
await i18next.withTolgee(i18n__default.default, tolgee).use(reactI18next.initReactI18next).init({
|
|
103
103
|
...DEFAULT_I18N_OPTIONS,
|
|
104
104
|
...this.i18nOptions,
|
|
105
|
-
lng:
|
|
105
|
+
lng: canonicalLocale
|
|
106
106
|
});
|
|
107
107
|
this.onInitCallbacks.forEach((callback) => callback(locale));
|
|
108
108
|
};
|
|
@@ -112,12 +112,19 @@ var TranslationManager = class {
|
|
|
112
112
|
prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,
|
|
113
113
|
fallbackOnFail: true,
|
|
114
114
|
getPath: ({ namespace, language, prefix }) => {
|
|
115
|
-
const cdnLocale =
|
|
115
|
+
const cdnLocale = CANONICAL_LOCALE_BY_NORMALIZED[language] ?? language;
|
|
116
116
|
return `${prefix}/${namespace}/${cdnLocale}.json`;
|
|
117
117
|
}
|
|
118
118
|
})
|
|
119
119
|
);
|
|
120
120
|
};
|
|
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}`;
|
|
127
|
+
};
|
|
121
128
|
initTolgeeDevTools = async (tolgeeCfg) => {
|
|
122
129
|
const { DevBackend } = await import('@tolgee/i18next');
|
|
123
130
|
const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend());
|
|
@@ -126,7 +133,7 @@ var TranslationManager = class {
|
|
|
126
133
|
apiKey: tolgeeCfg.apiKey,
|
|
127
134
|
staticData: this.fallbackResources,
|
|
128
135
|
fetch: async (input, init) => {
|
|
129
|
-
const url = typeof input === "string" ?
|
|
136
|
+
const url = typeof input === "string" ? this.normalizeApiUrl(input) : input;
|
|
130
137
|
const controller = new AbortController();
|
|
131
138
|
const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS);
|
|
132
139
|
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,uBAA+C,MAAO,CAAA,WAAA;AAAA,EAC1D,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,gBAAA,GAAmB,IAAK,CAAA,iBAAA,CAAkB,MAAM,CAAA;AACtD,IAAI,IAAAA,qBAAA,CAAK,aAAa,gBAAkB,EAAA;AACtC,MAAM,MAAAA,qBAAA,CAAK,eAAe,gBAAgB,CAAA;AAAA;AAC5C,GACF;AAAA,EAEiB,QAAA,GAAW,OAAO,MAAmB,KAAA;AACpD,IAAI,IAAA,CAAC,KAAK,SAAW,EAAA;AAErB,IAAM,MAAA,gBAAA,GAAmB,IAAK,CAAA,iBAAA,CAAkB,MAAM,CAAA;AACtD,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,oBAAqB,CAAA,QAAQ,CAAK,IAAA,QAAA;AACpD,UAAA,OAAO,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,SAAS,IAAI,SAAS,CAAA,KAAA,CAAA;AAAA;AAC5C,OACD;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;;;AC/JY,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 CDN_LOCALE_OVERRIDES: 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 normalizedLocale = this.toCanonicalLocale(locale)\n if (i18n.language !== normalizedLocale) {\n await i18n.changeLanguage(normalizedLocale)\n }\n }\n\n private readonly initI18n = async (locale: Locale) => {\n if (!this.tolgeeCfg) return\n\n const normalizedLocale = 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: normalizedLocale,\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 = CDN_LOCALE_OVERRIDES[language] ?? language\n return `${prefix}/${namespace}/${cdnLocale}.json`\n },\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"]}
|
|
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,IAAO,OAAA,CAAA,EAAG,SAAS,IAAK,CAAA,GAAG,CAAC,CAAI,CAAA,EAAA,eAAe,IAAI,KAAK,CAAA,CAAA;AAAA,GAC1D;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}`\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"]}
|
|
@@ -18,7 +18,7 @@ var Locale = /* @__PURE__ */ ((Locale2) => {
|
|
|
18
18
|
// src/translation/TranslationManager.ts
|
|
19
19
|
var CDN_ID = "39317fd3c6ff2ad02619ba673baae8b6";
|
|
20
20
|
var TOLGEE_DEV_TIMEOUT_MS = 3e3;
|
|
21
|
-
var
|
|
21
|
+
var CANONICAL_LOCALE_BY_NORMALIZED = Object.fromEntries(
|
|
22
22
|
Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])
|
|
23
23
|
);
|
|
24
24
|
var DEFAULT_I18N_OPTIONS = {
|
|
@@ -83,20 +83,20 @@ var TranslationManager = class {
|
|
|
83
83
|
if (this.storage) {
|
|
84
84
|
this.storage.adapter.setItem(this.storage.key, locale);
|
|
85
85
|
}
|
|
86
|
-
const
|
|
87
|
-
if (i18n.language !==
|
|
88
|
-
await i18n.changeLanguage(
|
|
86
|
+
const canonicalLocale = this.toCanonicalLocale(locale);
|
|
87
|
+
if (i18n.language !== canonicalLocale) {
|
|
88
|
+
await i18n.changeLanguage(canonicalLocale);
|
|
89
89
|
}
|
|
90
90
|
};
|
|
91
91
|
initI18n = async (locale) => {
|
|
92
92
|
if (!this.tolgeeCfg) return;
|
|
93
|
-
const
|
|
93
|
+
const canonicalLocale = this.toCanonicalLocale(locale);
|
|
94
94
|
const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl;
|
|
95
95
|
const tolgee = canUseTolgeeDevTools ? await this.initTolgeeDevTools(this.tolgeeCfg) : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources });
|
|
96
96
|
await withTolgee(i18n, tolgee).use(initReactI18next).init({
|
|
97
97
|
...DEFAULT_I18N_OPTIONS,
|
|
98
98
|
...this.i18nOptions,
|
|
99
|
-
lng:
|
|
99
|
+
lng: canonicalLocale
|
|
100
100
|
});
|
|
101
101
|
this.onInitCallbacks.forEach((callback) => callback(locale));
|
|
102
102
|
};
|
|
@@ -106,12 +106,19 @@ var TranslationManager = class {
|
|
|
106
106
|
prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,
|
|
107
107
|
fallbackOnFail: true,
|
|
108
108
|
getPath: ({ namespace, language, prefix }) => {
|
|
109
|
-
const cdnLocale =
|
|
109
|
+
const cdnLocale = CANONICAL_LOCALE_BY_NORMALIZED[language] ?? language;
|
|
110
110
|
return `${prefix}/${namespace}/${cdnLocale}.json`;
|
|
111
111
|
}
|
|
112
112
|
})
|
|
113
113
|
);
|
|
114
114
|
};
|
|
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}`;
|
|
121
|
+
};
|
|
115
122
|
initTolgeeDevTools = async (tolgeeCfg) => {
|
|
116
123
|
const { DevBackend } = await import('@tolgee/i18next');
|
|
117
124
|
const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend());
|
|
@@ -120,7 +127,7 @@ var TranslationManager = class {
|
|
|
120
127
|
apiKey: tolgeeCfg.apiKey,
|
|
121
128
|
staticData: this.fallbackResources,
|
|
122
129
|
fetch: async (input, init) => {
|
|
123
|
-
const url = typeof input === "string" ?
|
|
130
|
+
const url = typeof input === "string" ? this.normalizeApiUrl(input) : input;
|
|
124
131
|
const controller = new AbortController();
|
|
125
132
|
const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS);
|
|
126
133
|
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 CDN_LOCALE_OVERRIDES: 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 normalizedLocale = this.toCanonicalLocale(locale)\n if (i18n.language !== normalizedLocale) {\n await i18n.changeLanguage(normalizedLocale)\n }\n }\n\n private readonly initI18n = async (locale: Locale) => {\n if (!this.tolgeeCfg) return\n\n const normalizedLocale = 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: normalizedLocale,\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 = CDN_LOCALE_OVERRIDES[language] ?? language\n return `${prefix}/${namespace}/${cdnLocale}.json`\n },\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"]}
|
|
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}`\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"]}
|