main
|
Last change
on this file since 5e61b17 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
|
| Rev | Line | |
|---|
| [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.)
|
|---|
| 3 | import express from 'express';
|
|---|
| 4 | import { SUPPORTED } from '../services/i18n.js';
|
|---|
| [5e61b17] | 5 | import db from '../config/database.js';
|
|---|
| [03fa548] | 6 |
|
|---|
| 7 | const router = express.Router();
|
|---|
| 8 |
|
|---|
| 9 | router.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 |
|
|---|
| 31 | export default router;
|
|---|
Note:
See
TracBrowser
for help on using the repository browser.