Index: src/middleware/render.js
===================================================================
--- src/middleware/render.js	(revision 03fa5481c4f9961f422ed9a06824e8944fb868bf)
+++ src/middleware/render.js	(revision 5e61b173e0211ca213200be10da0a4230dcc31cf)
@@ -54,6 +54,6 @@
   // avatar-wijziging of rolwissel) zichzelf herstelt zonder opnieuw inloggen.
   if (_u && _u.id) {
-    const _fresh = db.prepare('SELECT avatar_url, role FROM users WHERE id = ?').get(_u.id);
-    if (_fresh) _u = { ..._u, avatar_url: _fresh.avatar_url, role: _fresh.role };
+    const _fresh = db.prepare('SELECT avatar_url, role, lang FROM users WHERE id = ?').get(_u.id);
+    if (_fresh) _u = { ..._u, avatar_url: _fresh.avatar_url, role: _fresh.role, lang: _fresh.lang };
   }
   const userOwnsSite = !!(_u && _u.role !== 'god' &&
@@ -78,6 +78,10 @@
   const canSeeBeheer = !!(_u && (_role === 'god' || _role === 'admin' || _role === 'kijker' || userOwnsSite));
 
-  // Interface-taal (bezoeker-instelbaar): sessie-keuze → browser-taal → nl.
-  const _lang = resolveLang(req);
+  // Interface-taal: sessie-keuze (deze sessie) → eigen voorkeur van de ingelogde
+  // gebruiker (users.lang) → admin-ingestelde standaard (Beheer) → env → browser → nl.
+  const _lang = resolveLang(req, {
+    userLang: _u && _u.lang,
+    defaultLang: getSetting('default_lang'),
+  });
 
   // Common locals
