@magmamath/frontend-config 1.3.4-rc.3 → 1.3.4-rc.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.
|
@@ -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 NORMALIZED_LOCALES_MAP = Object.fromEntries(
|
|
28
28
|
Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])
|
|
29
29
|
);
|
|
30
30
|
var DEFAULT_I18N_OPTIONS = {
|
|
@@ -112,12 +112,20 @@ 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 = NORMALIZED_LOCALES_MAP[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 normalizedLocale = NORMALIZED_LOCALES_MAP[locale] ?? locale;
|
|
126
|
+
console.log("normalized api url ", `${segments.join("/")}/${normalizedLocale}?${query}`);
|
|
127
|
+
return `${segments.join("/")}/${normalizedLocale}?${query}`;
|
|
128
|
+
};
|
|
121
129
|
initTolgeeDevTools = async (tolgeeCfg) => {
|
|
122
130
|
const { DevBackend } = await import('@tolgee/i18next');
|
|
123
131
|
const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend());
|
|
@@ -126,7 +134,7 @@ var TranslationManager = class {
|
|
|
126
134
|
apiKey: tolgeeCfg.apiKey,
|
|
127
135
|
staticData: this.fallbackResources,
|
|
128
136
|
fetch: async (input, init) => {
|
|
129
|
-
const url = typeof input === "string" ?
|
|
137
|
+
const url = typeof input === "string" ? this.normalizeApiUrl(input) : input;
|
|
130
138
|
const controller = new AbortController();
|
|
131
139
|
const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS);
|
|
132
140
|
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":"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","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 NORMALIZED_LOCALES_MAP: 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 = NORMALIZED_LOCALES_MAP[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 normalizedLocale = NORMALIZED_LOCALES_MAP[locale] ?? locale\n\n console.log('normalized api url ', `${segments.join('/')}/${normalizedLocale}?${query}`)\n return `${segments.join('/')}/${normalizedLocale}?${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 NORMALIZED_LOCALES_MAP = Object.fromEntries(
|
|
22
22
|
Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])
|
|
23
23
|
);
|
|
24
24
|
var DEFAULT_I18N_OPTIONS = {
|
|
@@ -106,12 +106,20 @@ 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 = NORMALIZED_LOCALES_MAP[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 normalizedLocale = NORMALIZED_LOCALES_MAP[locale] ?? locale;
|
|
120
|
+
console.log("normalized api url ", `${segments.join("/")}/${normalizedLocale}?${query}`);
|
|
121
|
+
return `${segments.join("/")}/${normalizedLocale}?${query}`;
|
|
122
|
+
};
|
|
115
123
|
initTolgeeDevTools = async (tolgeeCfg) => {
|
|
116
124
|
const { DevBackend } = await import('@tolgee/i18next');
|
|
117
125
|
const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend());
|
|
@@ -120,7 +128,7 @@ var TranslationManager = class {
|
|
|
120
128
|
apiKey: tolgeeCfg.apiKey,
|
|
121
129
|
staticData: this.fallbackResources,
|
|
122
130
|
fetch: async (input, init) => {
|
|
123
|
-
const url = typeof input === "string" ?
|
|
131
|
+
const url = typeof input === "string" ? this.normalizeApiUrl(input) : input;
|
|
124
132
|
const controller = new AbortController();
|
|
125
133
|
const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS);
|
|
126
134
|
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 NORMALIZED_LOCALES_MAP: 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 = NORMALIZED_LOCALES_MAP[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 normalizedLocale = NORMALIZED_LOCALES_MAP[locale] ?? locale\n\n console.log('normalized api url ', `${segments.join('/')}/${normalizedLocale}?${query}`)\n return `${segments.join('/')}/${normalizedLocale}?${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"]}
|