main
|
Last change
on this file since 03fa548 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
|
| 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';
|
|---|
| 5 |
|
|---|
| 6 | const router = express.Router();
|
|---|
| 7 |
|
|---|
| 8 | router.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 |
|
|---|
| 22 | export default router;
|
|---|
Note:
See
TracBrowser
for help on using the repository browser.