@magmamath/frontend-config 1.3.4-rc.4 → 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,7 +112,7 @@ 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
|
})
|
|
@@ -122,9 +122,8 @@ var TranslationManager = class {
|
|
|
122
122
|
const [path, query] = url.replace(/\/\?/, "?").split("?");
|
|
123
123
|
const segments = path.split("/");
|
|
124
124
|
const locale = segments.pop() ?? "";
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
return `${segments.join("/")}/${normalizedLocale}?${query}`;
|
|
125
|
+
const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale;
|
|
126
|
+
return `${segments.join("/")}/${canonicalLocale}?${query}`;
|
|
128
127
|
};
|
|
129
128
|
initTolgeeDevTools = async (tolgeeCfg) => {
|
|
130
129
|
const { DevBackend } = await import('@tolgee/i18next');
|
|
@@ -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":"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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"]}
|
|
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 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,7 +106,7 @@ 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
|
})
|
|
@@ -116,9 +116,8 @@ var TranslationManager = class {
|
|
|
116
116
|
const [path, query] = url.replace(/\/\?/, "?").split("?");
|
|
117
117
|
const segments = path.split("/");
|
|
118
118
|
const locale = segments.pop() ?? "";
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
return `${segments.join("/")}/${normalizedLocale}?${query}`;
|
|
119
|
+
const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale;
|
|
120
|
+
return `${segments.join("/")}/${canonicalLocale}?${query}`;
|
|
122
121
|
};
|
|
123
122
|
initTolgeeDevTools = async (tolgeeCfg) => {
|
|
124
123
|
const { DevBackend } = await import('@tolgee/i18next');
|
|
@@ -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 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"]}
|
|
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"]}
|