Changeset 834bcc3 in Klonkt for src/routes/admin-settings.js


Ignore:
Timestamp:
06/23/2026 06:14:27 PM (3 months ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
d774679
Parents:
bb42dfb
Message:

i18n: translate Dutch code comments to English across src/

Comments in routes/services/views/config/middleware/assets translated to
English for the public repo. A few dev-facing throw/console message strings
were Englished too. No user-facing UI strings or i18n dictionary values changed
(src/services/i18n.js untouched). Logic unchanged.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/admin-settings.js

    rbb42dfb r834bcc3  
    11/**
    2  * Admin: globale instellingen.
    3  *  - tenancy-modus (Solo/Hub)
    4  *  - hub-branding (naam/tagline/intro/hero van de generieke hub-hoofdpagina)
     2 * Admin: global settings.
     3 *  - tenancy mode (Solo/Hub)
     4 *  - hub branding (name/tagline/intro/hero of the generic hub home page)
    55 *
    6  * GET  /admin/settings   -> toon huidige instellingen
    7  * POST /admin/settings   -> sla op (god-only). Accepteert nu ook een geuploade
    8  *                           hero-afbeelding (multipart); een upload wint van het
    9  *                           URL-tekstveld. Zonder upload blijft het URL-veld leidend.
     6 * GET  /admin/settings   -> show current settings
     7 * POST /admin/settings   -> save (god-only). Also accepts an uploaded
     8 *                           hero image (multipart); an upload wins over the
     9 *                           URL text field. Without an upload the URL field is leading.
    1010 *
    11  * De hub-pagina is generiek (van geen enkele user); deze branding leeft in
    12  * globale settings, niet in een site.
     11 * The hub page is generic (belonging to no user); this branding lives in
     12 * global settings, not in a site.
    1313 */
    1414
     
    3030const router = express.Router();
    3131
    32 // Hero dark-overlay: percentage 0-100 (0 = geen overlay, 100 = volledig zwart).
    33 // Default 45 = de oude hardgecodeerde waarde, zodat bestaande hubs niet wijzigen.
     32// Hero dark overlay: percentage 0-100 (0 = no overlay, 100 = fully black).
     33// Default 45 = the old hard-coded value, so existing hubs don't change appearance.
    3434function clampOverlay(raw) {
    3535  const v = parseInt(raw, 10);
     
    3838
    3939const __dirname = path.dirname(fileURLToPath(import.meta.url));
    40 // Hero-uploads landen in storage/media/hero → bereikbaar als /media/hero/<file>
    41 // (de /media static handler serveert storage/media). Zelfde model als avatars.
     40// Hero uploads land in storage/media/hero → accessible as /media/hero/<file>
     41// (the /media static handler serves storage/media). Same model as avatars.
    4242const HERO_DIR = path.resolve(
    4343  process.env.HERO_PATH || path.join(__dirname, '..', '..', 'storage', 'media', 'hero')
     
    4545fs.mkdirSync(HERO_DIR, { recursive: true });
    4646
    47 // Alleen raster-formaten voor de upload. SVG mag bewust NIET via upload (raw
    48 // SVG kan script bevatten → opgeslagen-XSS bij direct openen); een SVG-hero kan
    49 // nog steeds via het URL-veld (zoals de meegeleverde demo-placeholder).
     47// Only raster formats for upload. SVG is intentionally NOT allowed via upload
     48// (raw SVG can contain scripts → stored-XSS when opened directly); an SVG hero
     49// can still be set via the URL field (like the bundled demo placeholder).
    5050const ALLOWED_HERO_EXT = new Set(['.jpg', '.jpeg', '.png', '.webp', '.gif']);
    5151const MAX_HERO_BYTES = 5 * 1024 * 1024;
     
    9595
    9696router.post('/', requireGod, (req, res) => {
    97   // multer.single verwerkt multipart (hub-branding form). Bij een gewone
    98   // urlencoded POST (tenancy-form) doet multer niets en blijft req.body intact.
     97  // multer.single processes multipart (hub branding form). For a plain
     98  // urlencoded POST (tenancy form) multer does nothing and req.body stays intact.
    9999  heroUpload.single('hub_hero_file')(req, res, (err) => {
    100100    if (err) {
     
    103103
    104104    if (typeof req.body.tenancy !== 'undefined') {
    105       // Hub-modus is een premium-feature: alleen naar hub schakelen als premium
    106       // ontgrendeld is (premium-laag uit = vrij; aan = Patreon vereist). Al-hub
    107       // blijven mag altijd, zodat een instance nooit vastloopt.
     105      // Hub mode is a premium feature: only switch to hub if premium is
     106      // unlocked (premium layer off = free; on = Patreon required). Staying on
     107      // hub is always allowed, so an instance can never get stuck.
    108108      if (req.body.tenancy === 'hub' && !premiumUnlocked() && getTenancy() !== 'hub') {
    109109        return res.redirect('/admin/settings?error=' + encodeURIComponent('Hub-modus is een premium-functie — koppel Patreon in Beheer → Instellingen.'));
     
    112112    }
    113113    if (typeof req.body.default_lang !== 'undefined') {
    114       // Standaardtaal voor bezoekers (leeg = volg env/browser). Valideert tegen NL/EN/DE.
     114      // Default language for visitors (empty = follow env/browser). Validated against NL/EN/DE.
    115115      const dl = (req.body.default_lang || '').toString().toLowerCase();
    116116      setSetting('default_lang', SUPPORTED.includes(dl) ? dl : '');
    117117    }
    118118    if (typeof req.body.timezone !== 'undefined') {
    119       // Site-tijdzone (IANA, bv. Europe/Amsterdam). Leeg = server-default (UTC).
    120       // Valideer met Intl zodat een onzin-waarde nooit de datum-rendering breekt.
     119      // Site timezone (IANA, e.g. Europe/Amsterdam). Empty = server default (UTC).
     120      // Validate with Intl so a nonsense value never breaks date rendering.
    121121      const tz = (req.body.timezone || '').toString().trim();
    122122      let valid = '';
     
    134134    }
    135135
    136     // Hero: een geüploade afbeelding wint; anders het URL-tekstveld.
     136    // Hero: an uploaded image wins; otherwise the URL text field.
    137137    if (req.file) {
    138138      const newUrl = `/media/hero/${toWebp(req.file)}`;
    139       // Ruim een vorige geüploade hero op (alleen als die uit onze hero-map kwam).
     139      // Clean up a previously uploaded hero (only if it came from our hero dir).
    140140      const old = getSetting('hub_hero_image') || '';
    141141      if (old.startsWith('/media/hero/')) {
     
    155155});
    156156
    157 // Google-login op een eigen Beheer-pagina (los van de algemene instellingen).
     157// Google login on its own admin page (separate from the general settings).
    158158router.get('/google', requireGod, (req, res) => {
    159159  renderPage(req, res, 'pages/admin-google', {
     
    171171});
    172172
    173 // Google-login (luisteraars) configureren — Client ID + Secret in app_settings.
    174 // De redirect-URI leiden we af van PUBLIC_BASE_URL (zie config/google.js).
     173// Configure Google login (listeners) — Client ID + Secret in app_settings.
     174// The redirect URI is derived from PUBLIC_BASE_URL (see config/google.js).
    175175router.post('/google', requireGod, (req, res) => {
    176176  if (req.body.clear === '1') {
     
    180180  }
    181181  setSetting('google_client_id', (req.body.google_client_id || '').toString().trim());
    182   // Secret alleen overschrijven als er een nieuwe waarde is ingevoerd (leeg = laat staan).
     182  // Only overwrite the secret if a new value was entered (empty = leave as-is).
    183183  const secret = (req.body.google_client_secret || '').toString().trim();
    184184  if (secret) setSetting('google_client_secret', secret);
     
    197197  setSetting('smtp_user', (b.smtp_user || '').toString().trim());
    198198  setSetting('smtp_from', (b.smtp_from || '').toString().trim());
    199   // Wachtwoord alleen overschrijven als er een nieuwe waarde is ingevoerd.
     199  // Only overwrite the password if a new value was entered.
    200200  const pass = (b.smtp_pass || '').toString();
    201201  if (pass) setSetting('smtp_pass', pass);
     
    203203});
    204204
    205 // Nieuwsbrief-aanmelding in de footer aan/uit.
     205// Newsletter sign-up in the footer on/off.
    206206router.post('/footer', requireGod, (req, res) => {
    207207  setSetting('footer_newsletter', req.body.footer_newsletter ? '1' : '0');
     
    209209});
    210210
    211 // Testmail sturen naar een opgegeven adres (of de ingelogde gebruiker).
     211// Send a test email to a specified address (or the logged-in user).
    212212router.post('/smtp/test', requireGod, async (req, res) => {
    213213  const to = ((req.body && req.body.to) || (req.session.user && req.session.user.email) || '').toString().trim();
Note: See TracChangeset for help on using the changeset viewer.