From bce557cc2dc767628bed6aac87301a1be7c5431b Mon Sep 17 00:00:00 2001 From: rxliuli Date: Tue, 4 Nov 2025 05:03:50 +0800 Subject: init commit --- src/stores/i18n.ts | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/stores/i18n.ts (limited to 'src/stores/i18n.ts') diff --git a/src/stores/i18n.ts b/src/stores/i18n.ts new file mode 100644 index 0000000..740d0b4 --- /dev/null +++ b/src/stores/i18n.ts @@ -0,0 +1,73 @@ +import { readable } from 'svelte/store'; +import I18N from '@amp/web-apps-localization'; +import { getContext } from 'svelte'; +import type { Readable } from 'svelte/store'; +import type { Locale, ILocaleJSON } from '@amp/web-apps-localization'; +import type { Logger, LoggerFactory } from '@amp/web-apps-logger'; +import { isEnabled } from '@amp/web-apps-featurekit'; + +export type { Locale } from '@amp/web-apps-localization'; + +import { __FF_SHOW_LOC_KEYS } from '~/utils/features/consts'; + +const CONTEXT_NAME = 'i18n'; + +export async function setup( + context: Map, + loggerFactory: LoggerFactory, + locale: Locale, +): Promise { + const log = loggerFactory.loggerFor('i18n'); + + let alwaysShowScreamers = false; + if (isEnabled(__FF_SHOW_LOC_KEYS)) { + alwaysShowScreamers = true; + } + + const translations = await getTranslations(log, locale); + const i18n = new I18N(log, locale, translations, alwaysShowScreamers); + const store = readable(i18n); + + context.set(CONTEXT_NAME, store); + + return i18n; +} + +/** + * Gets the current i18n store from the Svelte context. + * + * @return i18n The i18n store + */ +export function getI18n(): Readable { + const i18n = getContext(CONTEXT_NAME) as Readable | undefined; + + if (!i18n) { + throw new Error('getI18n called before setup'); + } + + return i18n; +} + +async function getTranslations( + log: Logger, + locale: Locale, +): Promise { + try { + // TODO: Shoebox logic here + const translations = await importLocale(locale); + return translations.default; + } catch (err) { + log.error('failed to load:', err); + throw new Error('i18n failed to load'); + } +} + +interface IDynamicImportJSON { + default: ILocaleJSON; +} + +//TODO: rdar://73157638 (Determine if we can use ES modules based on browser matrix) +// Possibly switch this to fetch instead of dynamic imports? +function importLocale(locale: Locale): Promise { + return import(`../../tmp/locales/${locale}/translations.json`); +} -- cgit v1.2.3