Index: src/routes/account.js
===================================================================
--- src/routes/account.js	(revision 03fa5481c4f9961f422ed9a06824e8944fb868bf)
+++ 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.
Index: src/routes/admin-settings.js
===================================================================
--- src/routes/admin-settings.js	(revision 03fa5481c4f9961f422ed9a06824e8944fb868bf)
+++ src/routes/admin-settings.js	(revision 5e61b173e0211ca213200be10da0a4230dcc31cf)
@@ -22,4 +22,5 @@
 import { requireGod } from '../middleware/auth.js';
 import { getTenancy, setTenancy, getSetting, setSetting } from '../services/SettingsService.js';
+import { SUPPORTED } from '../services/i18n.js';
 import { mailerStatus, sendMail } from '../config/mailer.js';
 import { entitlementStatus, premiumUnlocked } from '../services/PatreonService.js';
@@ -78,4 +79,5 @@
     hubHeroImage: getSetting('hub_hero_image') || '',
     hubHeroOverlay: clampOverlay(getSetting('hub_hero_overlay')),
+    defaultLang: getSetting('default_lang') || '',
     premium: entitlementStatus(),
     google: {
@@ -108,4 +110,9 @@
       }
       setTenancy(req.body.tenancy); // valideert naar solo | hub | circle
+    }
+    if (typeof req.body.default_lang !== 'undefined') {
+      // Standaardtaal voor bezoekers (leeg = volg env/browser). Valideert tegen NL/EN/DE.
+      const dl = (req.body.default_lang || '').toString().toLowerCase();
+      setSetting('default_lang', SUPPORTED.includes(dl) ? dl : '');
     }
     if (typeof req.body.hub_title !== 'undefined') {
Index: src/routes/lang.js
===================================================================
--- src/routes/lang.js	(revision 03fa5481c4f9961f422ed9a06824e8944fb868bf)
+++ src/routes/lang.js	(revision 5e61b173e0211ca213200be10da0a4230dcc31cf)
@@ -3,4 +3,5 @@
 import express from 'express';
 import { SUPPORTED } from '../services/i18n.js';
+import db from '../config/database.js';
 
 const router = express.Router();
@@ -9,4 +10,12 @@
   const code = SUPPORTED.includes(req.params.code) ? req.params.code : 'nl';
   if (req.session) req.session.lang = code;
+  // Ingelogd? Bewaar de keuze ook op het account zodat 'ie meereist over
+  // apparaten/sessies (niet alleen deze sessie-cookie).
+  if (req.session && req.session.user && req.session.user.id) {
+    try {
+      db.prepare('UPDATE users SET lang = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(code, req.session.user.id);
+      req.session.user.lang = code;
+    } catch { /* lang-kolom ontbreekt op een oude DB → sessie-only, geen breuk */ }
+  }
   // Veilige terug-URL: alleen een intern pad (geen open redirect).
   let back = (typeof req.query.r === 'string') ? req.query.r : '';
