Files
weirsoe-party-protocol/frontend/src/spa/lobby-i18n.ts
Asger Geel Weirsoee b55b379134
All checks were successful
CI / test-and-quality (push) Successful in 2m17s
CI / test-and-quality (pull_request) Successful in 2m23s
feat(i18n): enforce shared keyspace contract across django and spa
2026-03-01 19:24:12 +00:00

49 lines
1.6 KiB
TypeScript

import lobbyCatalog from '../../../shared/i18n/lobby.json';
const frontendErrors = lobbyCatalog.frontend.errors;
const localeConfig = lobbyCatalog.locales;
type FrontendErrorKey = keyof typeof frontendErrors;
type SupportedLocale = (typeof localeConfig.supported)[number];
function isFrontendErrorKey(value: string): value is FrontendErrorKey {
return value in frontendErrors;
}
function normalizeLocale(rawLocale?: string): SupportedLocale {
const requested = (rawLocale ?? '').trim().toLowerCase();
if (localeConfig.supported.includes(requested as SupportedLocale)) {
return requested as SupportedLocale;
}
return localeConfig.default;
}
export function lobbyMessage(key: FrontendErrorKey, locale?: string): string {
const resolvedLocale = normalizeLocale(locale);
const translations = frontendErrors[key] as Record<string, string>;
if (translations[resolvedLocale]) {
return translations[resolvedLocale];
}
if (translations[localeConfig.default]) {
return translations[localeConfig.default];
}
return key;
}
export function lobbyMessageFromApiPayload(payload: unknown, fallbackKey: FrontendErrorKey, locale?: string): string {
if (!payload || typeof payload !== 'object') {
return lobbyMessage(fallbackKey, locale);
}
const record = payload as Record<string, unknown>;
const code = typeof record.error_code === 'string' ? record.error_code : '';
const payloadLocale = typeof record.locale === 'string' ? record.locale : locale;
if (!isFrontendErrorKey(code)) {
return lobbyMessage(fallbackKey, payloadLocale);
}
return lobbyMessage(code, payloadLocale);
}