Index: src/routes/account.js
===================================================================
--- src/routes/account.js	(revision 8f6225cbfb7a439454829f7dec26b0891f4163f0)
+++ src/routes/account.js	(revision 5e61b173e0211ca213200be10da0a4230dcc31cf)
@@ -26,4 +26,5 @@
 import { googleConfigured } from '../config/google.js';
 import { toWebp } from '../services/ImageWebpService.js';
+import { SUPPORTED } from '../services/i18n.js';
 
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -60,5 +61,5 @@
 router.get('/', requireAuth, (req, res) => {
   const account = db.prepare(`
-    SELECT id, username, email, role, bio, avatar_url, created_at, password_hash, google_sub
+    SELECT id, username, email, role, bio, avatar_url, created_at, password_hash, google_sub, lang
     FROM users WHERE id = ?
   `).get(req.session.user.id);
@@ -80,4 +81,17 @@
 });
 
+// ==================== PERSOONLIJKE INTERFACE-TAAL ====================
+// Slaat de taalkeuze op het account op (reist mee over apparaten/sessies) én
+// zet 'm meteen in de sessie zodat 't direct effect heeft.
+router.post('/lang', requireAuth, (req, res) => {
+  const code = SUPPORTED.includes(req.body.lang) ? req.body.lang : null;
+  if (code) {
+    db.prepare('UPDATE users SET lang = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(code, req.session.user.id);
+    req.session.user.lang = code;
+    req.session.lang = code;
+  }
+  res.redirect('/account?success=' + encodeURIComponent('Taal opgeslagen'));
+});
+
 // De site die deze gebruiker mag bewerken vanuit z'n account: z'n eigen site
 // (owner_id), of voor een god de primaire site. Null als er niets is.
