diff --git a/ui/i18n/locale_service.ts b/ui/i18n/locale_service.ts index 7be1464c21..77b7545638 100644 --- a/ui/i18n/locale_service.ts +++ b/ui/i18n/locale_service.ts @@ -13,7 +13,7 @@ export const getLang = (): string => { if (storedLang && storedLang in supportedLanguages) { return storedLang; } - return setLang('en'); + return setLang(detectUserLanguage()); }; export const setLang = (lang: string): string => { @@ -27,6 +27,38 @@ export const setLang = (lang: string): string => { return lang; }; +const languageMap = new Map([ + ['en-US', 'en'], + ['en-GB', 'en'], + ['en-AU', 'en'], + ['en', 'en'], + ['fr-FR', 'fr'], + ['fr-CA', 'fr'], + ['fr', 'fr'], + ['zh-CN', 'cn'], + ['zh-Hans', 'cn'], + ['zh', 'cn'], +]); + +function detectUserLanguage(defaultLang: string = 'en'): string { + const browserLangs = typeof navigator !== 'undefined' && navigator.language ? [navigator.language] : []; + for (const lang of browserLangs) { + const normalized = lang.toLowerCase(); + if (normalized in supportedLanguages) { + return normalized; + } + const shortLang = normalized.split('-')[0]; + if (shortLang in supportedLanguages) { + return shortLang; + } + const mapped = languageMap.get(normalized) || languageMap.get(shortLang); + if (mapped && mapped in supportedLanguages) { + return mapped; + } + } + return defaultLang in supportedLanguages ? defaultLang : 'en'; +} + // Add TypeScript interface for i18next on window declare global { interface Window {