Index: src/routes/changelog.js
===================================================================
--- src/routes/changelog.js	(revision 0960c1d20ad342283da29370be69f7c966bfd51a)
+++ src/routes/changelog.js	(revision eb5f978375e885d17090a8dedb24802dda9a52b4)
@@ -2,5 +2,6 @@
  * Public changelog / release page.
  *
- * GET /changelog  -> renders CHANGELOG.md (the source of truth for releases).
+ * GET /changelog  -> renders the changelog in the visitor's language:
+ *   CHANGELOG.<lang>.md if a translation exists, else CHANGELOG.md (English base).
  */
 
@@ -11,18 +12,25 @@
 import { renderPage } from '../middleware/render.js';
 import { MarkdownService } from '../services/MarkdownService.js';
+import { resolveLang, t } from '../services/i18n.js';
+import { getSetting } from '../services/SettingsService.js';
 
 const router = express.Router();
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
-const CHANGELOG_PATH = path.join(__dirname, '..', '..', 'CHANGELOG.md');
+const ROOT = path.join(__dirname, '..', '..');
 
 router.get('/changelog', (req, res) => {
-  let html;
-  try {
-    html = MarkdownService.render(fs.readFileSync(CHANGELOG_PATH, 'utf8'));
-  } catch {
-    html = '<p>Geen wijzigingenoverzicht beschikbaar.</p>';
+  const lang = resolveLang(req, {
+    userLang: req.session && req.session.user && req.session.user.lang,
+    defaultLang: getSetting('default_lang'),
+  });
+  // Visitor's language if a translation exists, else the English base.
+  const files = [path.join(ROOT, `CHANGELOG.${lang}.md`), path.join(ROOT, 'CHANGELOG.md')];
+  let html = '';
+  for (const f of files) {
+    try { html = MarkdownService.render(fs.readFileSync(f, 'utf8')); break; } catch { /* try next */ }
   }
+  if (!html) html = `<p>${t(lang, 'changelog.empty')}</p>`;
   renderPage(req, res, 'pages/changelog', {
-    pageTitle: 'Wijzigingen',
+    pageTitle: t(lang, 'changelog.title'),
     bodyClass: 'on-changelog',
     changelogHtml: html,
Index: src/services/i18n.js
===================================================================
--- src/services/i18n.js	(revision 0960c1d20ad342283da29370be69f7c966bfd51a)
+++ src/services/i18n.js	(revision eb5f978375e885d17090a8dedb24802dda9a52b4)
@@ -101,4 +101,5 @@
     'setup.submit': 'Mijn site aanmaken',
     'setup.username_note': 'Dit wordt je adres op de fediverse en kun je later niet meer wijzigen:',
+    'changelog.title': 'Wijzigingen', 'changelog.empty': 'Geen wijzigingenoverzicht beschikbaar.',
     'auth.f_username': 'Gebruikersnaam (3-32 tekens, letters/cijfers/_-)',
     'auth.f_email': 'E-mail',
@@ -1117,4 +1118,5 @@
     'setup.submit': 'Create my site',
     'setup.username_note': 'This becomes your address on the fediverse and can’t be changed later:',
+    'changelog.title': 'Changelog', 'changelog.empty': 'No changelog available.',
     'auth.f_username': 'Username (3-32 chars, letters/digits/_-)',
     'auth.f_email': 'Email',
@@ -2129,4 +2131,5 @@
     'setup.submit': 'Meine Seite erstellen',
     'setup.username_note': 'Das wird deine Adresse im Fediverse und kann später nicht geändert werden:',
+    'changelog.title': 'Änderungen', 'changelog.empty': 'Kein Änderungsprotokoll verfügbar.',
     'auth.f_username': 'Benutzername (3-32 Zeichen, Buchstaben/Ziffern/_-)',
     'auth.f_email': 'E-Mail',
