source: Klonkt/src/routes/lang.js@ 015ce46

main
Last change on this file since 015ce46 was 5e61b17, checked in by roboburr <roboburr@…>, 3 months ago

feat(i18n): admin-configurable language — personal + default for visitors

  • users.lang column: personal interface language per account (follows across devices/sessions). Switcher (/lang/:code) and Account select both write it.
  • app_setting default_lang: admin picks the default language for visitors in Admin → Settings (overrides env/browser; empty = automatic).
  • resolveLang priority: session choice → users.lang → default_lang (DB) → env KLONKT_DEFAULT_LANG → browser → nl.
  • Account: language select; admin-settings: default language select. NL/EN/DE keys.

Co-Authored-By: Claude <noreply@…>

  • Property mode set to 100644
File size: 1.3 KB
RevLine 
[03fa548]1// Taalkeuze van de bezoeker: /lang/:code zet de interface-taal in de sessie en
2// stuurt terug naar waar je vandaan kwam. (Content blijft in de taal van de auteur.)
3import express from 'express';
4import { SUPPORTED } from '../services/i18n.js';
[5e61b17]5import db from '../config/database.js';
[03fa548]6
7const router = express.Router();
8
9router.get('/lang/:code', (req, res) => {
10 const code = SUPPORTED.includes(req.params.code) ? req.params.code : 'nl';
11 if (req.session) req.session.lang = code;
[5e61b17]12 // Ingelogd? Bewaar de keuze ook op het account zodat 'ie meereist over
13 // apparaten/sessies (niet alleen deze sessie-cookie).
14 if (req.session && req.session.user && req.session.user.id) {
15 try {
16 db.prepare('UPDATE users SET lang = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(code, req.session.user.id);
17 req.session.user.lang = code;
18 } catch { /* lang-kolom ontbreekt op een oude DB → sessie-only, geen breuk */ }
19 }
[03fa548]20 // Veilige terug-URL: alleen een intern pad (geen open redirect).
21 let back = (typeof req.query.r === 'string') ? req.query.r : '';
22 if (!back.startsWith('/') || back.startsWith('//')) {
23 try {
24 const u = new URL(req.get('referer') || '');
25 back = u.pathname + (u.search || '');
26 } catch { back = '/'; }
27 }
28 res.redirect(back || '/');
29});
30
31export default router;
Note: See TracBrowser for help on using the repository browser.