i18n: default-language picker offers only shipped locales; widen stored bare codes on read

This commit is contained in:
2026-08-23 03:43:35 +00:00
parent 0bd8c6c16a
commit b640ec486d
4 changed files with 19 additions and 142 deletions
+13 -2
View File
@@ -5,6 +5,13 @@ import { useAuth } from 'hooks/useAuth';
const QUERY_KEY = ['USER_SETTINGS'];
/**
* UI locales went from bare codes to regional BCP 47 tags (docs/localization.md D2). A stale bare
* code must resolve rather than fail, and this is a one-time widening on read, not a DB migration.
*/
const WIDEN_BARE_LOCALE: Record<string, string> = { en: 'en-GB', pt: 'pt-PT' };
const widenLocale = (code: string): string => WIDEN_BARE_LOCALE[code] ?? code;
const mergeWithDefaults = (saved: Partial<UserSettings>): UserSettings => ({
chat: { ...DEFAULT_SETTINGS.chat, ...saved.chat },
ai: {
@@ -14,7 +21,11 @@ const mergeWithDefaults = (saved: Partial<UserSettings>): UserSettings => ({
},
tasks: { ...DEFAULT_SETTINGS.tasks, ...saved.tasks },
appearance: { ...DEFAULT_SETTINGS.appearance, ...saved.appearance },
languages: { ...DEFAULT_SETTINGS.languages, ...saved.languages },
languages: {
...DEFAULT_SETTINGS.languages,
...saved.languages,
default: widenLocale(saved.languages?.default ?? DEFAULT_SETTINGS.languages.default),
},
tts: { ...DEFAULT_SETTINGS.tts, ...saved.tts },
});
@@ -121,7 +132,7 @@ export const DEFAULT_SETTINGS: UserSettings = {
},
languages: {
spoken: ['en'],
default: 'en',
default: 'en-GB',
translateTo: 'en',
},
tts: {