feat: server-side language preference — survives clear site data
Problem: language preference stored only in localStorage, lost on 'clear site data'. French users with browser lang=fr always got French UI even when profile was English. Solution: - Backend: add 'language' field to user profile (default 'fr') - Backend: PATCH /api/auth/me to update language preference - Frontend: initI18n() priority: server > localStorage > navigator > 'fr' - Frontend: initAuth() runs before initI18n() so server check works - Frontend: profile Save persists language to server via PATCH Verified: tabs show English after server profile set to 'en'
This commit is contained in:
+20
-4
@@ -91,12 +91,28 @@ export async function setLocale(locale) {
|
||||
}
|
||||
|
||||
/** Initialise the i18n system. Call once, early, before any rendering.
|
||||
* Reads saved preference from localStorage, falls back to navigator.language,
|
||||
* then to 'fr'. */
|
||||
* Priority: server profile > localStorage > navigator.language > 'fr'. */
|
||||
export async function initI18n() {
|
||||
// 1. Determine locale: saved > navigator.language > 'fr'
|
||||
// 1. Determine locale: server profile > localStorage > navigator.language > 'fr'
|
||||
let locale = null;
|
||||
try { locale = localStorage.getItem('obsigate-lang'); } catch (e) { /* */ }
|
||||
|
||||
// Try server-side language preference (survives clear site data)
|
||||
try {
|
||||
const resp = await fetch('/api/auth/me', { credentials: 'include' });
|
||||
if (resp.ok) {
|
||||
const user = await resp.json();
|
||||
if (user.language === 'en' || user.language === 'fr') {
|
||||
locale = user.language;
|
||||
}
|
||||
}
|
||||
} catch (e) { /* not logged in or network error — fall through */ }
|
||||
|
||||
// Fall back to localStorage
|
||||
if (!locale) {
|
||||
try { locale = localStorage.getItem('obsigate-lang'); } catch (e) { /* */ }
|
||||
}
|
||||
|
||||
// Fall back to navigator.language
|
||||
if (!locale) {
|
||||
const nav = (navigator.language || '').toLowerCase();
|
||||
locale = nav.startsWith('fr') ? 'fr'
|
||||
|
||||
Reference in New Issue
Block a user