Root cause: cacheFirstStatic() in sw.js was caching viewer.js, i18n.js, auth.js, dashboard.js, and locale JSON files under the old CACHE_VERSION. Even after rebuild, the old SW served stale cached files without data-i18n attributes, so dashboard stayed in French. Changes: - sw.js: add js/viewer.js, js/i18n.js, js/auth.js, js/dashboard.js, js/app.js, locales/en.json, locales/fr.json to STATIC_ASSETS so they are versioned with CACHE_VERSION and properly invalidated - CACHE_VERSION already bumped to v5 in previous commit Manual fix for existing clients: Chrome → F12 → Application → Service Workers → Unregister Or: chrome://serviceworker-internals/ → Unregister Then Ctrl+Shift+R to hard-refresh