diff --git a/frontend/src/spa/lobby-i18n.ts b/frontend/src/spa/lobby-i18n.ts index f68e411..b3e31de 100644 --- a/frontend/src/spa/lobby-i18n.ts +++ b/frontend/src/spa/lobby-i18n.ts @@ -2,6 +2,7 @@ import lobbyCatalog from '../../../shared/i18n/lobby.json'; const frontendErrors = lobbyCatalog.frontend.errors; const localeConfig = lobbyCatalog.locales; +const backendToFrontendErrorKeys = lobbyCatalog.contract.backend_to_frontend_error_keys as Record; type FrontendErrorKey = keyof typeof frontendErrors; type SupportedLocale = (typeof localeConfig.supported)[number]; @@ -40,9 +41,15 @@ export function lobbyMessageFromApiPayload(payload: unknown, fallbackKey: Fronte const record = payload as Record; 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); + const mappedKey = code ? backendToFrontendErrorKeys[code] : undefined; + + if (mappedKey && isFrontendErrorKey(mappedKey)) { + return lobbyMessage(mappedKey, payloadLocale); } - return lobbyMessage(code, payloadLocale); + if (isFrontendErrorKey(code)) { + return lobbyMessage(code, payloadLocale); + } + + return lobbyMessage(fallbackKey, payloadLocale); } diff --git a/frontend/tests/lobby-i18n.contract.test.ts b/frontend/tests/lobby-i18n.contract.test.ts index c75c6e8..0a20522 100644 --- a/frontend/tests/lobby-i18n.contract.test.ts +++ b/frontend/tests/lobby-i18n.contract.test.ts @@ -48,11 +48,11 @@ describe('lobbyMessage locale handling', () => { ).toBe('Sessionskoden er ugyldig, eller sessionen findes ikke længere.'); }); - it('uses shared backend→frontend key-map when backend key differs from frontend copy key', () => { + it('uses shared backend→frontend key-map at runtime even when fallback key differs', () => { expect( lobbyMessageFromApiPayload( { error_code: 'session_not_joinable', locale: 'da' }, - 'join_failed', + 'start_round_failed', ), ).toBe('Kunne ikke joine. Tjek kode eller kaldenavn og prøv igen.'); });