source: Klonkt/src/routes/lang.js@ fe86013

main
Last change on this file since fe86013 was 03fa548, checked in by roboburr <roboburr@…>, 3 months ago

feat(i18n): interface language NL/EN/DE with visitor switcher (phase 1: chrome)

  • i18n.js (t helper + nl/en/de dictionary + resolveLang: session → browser → nl).
  • render.js passes t/lang/langs to all views; /lang/:code sets the language in the session.
  • Language switcher (select) in the footer; chrome translated: topnav (Archive/Login/Account/Admin/Logout/…), pill (Agenda/Solo/Circle/Timeline/Grid), post nav (Newer/Older), footer.
  • Content (posts/site name/bio) stays in the author's language. Admin + deeper page strings follow in a next phase.

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

  • Property mode set to 100644
File size: 829 bytes
Line 
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';
5
6const router = express.Router();
7
8router.get('/lang/:code', (req, res) => {
9 const code = SUPPORTED.includes(req.params.code) ? req.params.code : 'nl';
10 if (req.session) req.session.lang = code;
11 // Veilige terug-URL: alleen een intern pad (geen open redirect).
12 let back = (typeof req.query.r === 'string') ? req.query.r : '';
13 if (!back.startsWith('/') || back.startsWith('//')) {
14 try {
15 const u = new URL(req.get('referer') || '');
16 back = u.pathname + (u.search || '');
17 } catch { back = '/'; }
18 }
19 res.redirect(back || '/');
20});
21
22export default router;
Note: See TracBrowser for help on using the repository browser.