Changeset 5e61b17 in Klonkt for src/services/i18n.js


Ignore:
Timestamp:
06/21/2026 03:16:51 PM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
11b3ba5
Parents:
4885eab
Message:

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@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/i18n.js

    r4885eab r5e61b17  
    964964    'prcv.placeholder': 'Bericht…',
    965965    'prcv.send': 'Stuur',
     966    'acct.lang_label': 'Taal',
     967    'acct.lang_hint': '— jouw persoonlijke interface-taal; reist mee over apparaten en sessies.',
     968    'aset.default_lang': 'Standaardtaal voor bezoekers',
     969    'aset.default_lang_hint': 'Wat nieuwe bezoekers zien voordat ze zelf een taal kiezen. Een ingelogde gebruiker met een eigen voorkeur ziet díe.',
     970    'aset.default_lang_auto': 'Automatisch (browser-taal)',
    966971  },
    967972  en: {
     
    19101915    'prcv.placeholder': 'Message…',
    19111916    'prcv.send': 'Send',
     1917    'acct.lang_label': 'Language',
     1918    'acct.lang_hint': '— your personal interface language; travels with you across devices and sessions.',
     1919    'aset.default_lang': 'Default language for visitors',
     1920    'aset.default_lang_hint': 'What new visitors see before they pick a language themselves. A logged-in user with their own preference sees that instead.',
     1921    'aset.default_lang_auto': 'Automatic (browser language)',
    19121922  },
    19131923  de: {
     
    28562866    'prcv.placeholder': 'Nachricht…',
    28572867    'prcv.send': 'Senden',
     2868    'acct.lang_label': 'Sprache',
     2869    'acct.lang_hint': '— deine persönliche Interface-Sprache; reist mit dir über Geräte und Sitzungen.',
     2870    'aset.default_lang': 'Standardsprache für Besucher',
     2871    'aset.default_lang_hint': 'Was neue Besucher sehen, bevor sie selbst eine Sprache wählen. Ein angemeldeter Benutzer mit eigener Voreinstellung sieht diese.',
     2872    'aset.default_lang_auto': 'Automatisch (Browsersprache)',
    28582873  },
    28592874};
     
    28692884// Bepaal de taal voor dit request: expliciete sessie-keuze → instance-standaard
    28702885// (env KLONKT_DEFAULT_LANG, bv. 'de' voor een Duitse site) → browser-taal → nl.
    2871 export function resolveLang(req) {
     2886export function resolveLang(req, opts = {}) {
    28722887  const s = req && req.session && req.session.lang;
    2873   if (s && SUPPORTED.includes(s)) return s;            // bezoeker koos zelf
     2888  if (s && SUPPORTED.includes(s)) return s;             // bezoeker koos zelf (deze sessie)
     2889  const u = (opts.userLang || '').toLowerCase();
     2890  if (SUPPORTED.includes(u)) return u;                  // ingelogde gebruiker: eigen voorkeur
     2891  const d = (opts.defaultLang || '').toLowerCase();
     2892  if (SUPPORTED.includes(d)) return d;                  // admin-ingestelde standaard (Beheer/DB)
    28742893  const envDefault = (process.env.KLONKT_DEFAULT_LANG || '').toLowerCase();
    2875   if (SUPPORTED.includes(envDefault)) return envDefault; // per-instance standaard
     2894  if (SUPPORTED.includes(envDefault)) return envDefault; // per-instance standaard (env)
    28762895  const al = ((req && req.headers && req.headers['accept-language']) || '').toLowerCase();
    28772896  const first = al.split(',')[0].trim().slice(0, 2);
Note: See TracChangeset for help on using the changeset viewer.