Index: src/services/i18n.js
===================================================================
--- src/services/i18n.js	(revision 03fa5481c4f9961f422ed9a06824e8944fb868bf)
+++ src/services/i18n.js	(revision 91c0a39617f78bdd1459643d27bf74b26ccfb0e4)
@@ -38,4 +38,35 @@
     'footer.install': 'Installeer app',
     'common.email_placeholder': 'jouw@email.nl',
+    'common.back_to_admin': '← Beheer',
+    // Agenda (publiek)
+    'agenda.title': 'Agenda',
+    'agenda.empty': 'Geen aangekondigde evenementen op dit moment.',
+    'agenda.tickets': 'Tickets',
+    'agenda.notify_h': 'Mis geen evenement',
+    'agenda.notify_sub': 'Laat je e-mail achter en je krijgt een seintje bij een nieuw evenement. Uitschrijven kan altijd.',
+    'agenda.notify_btn': 'Houd me op de hoogte',
+    'agenda.msg_done': '✓ Je staat op de lijst — je hoort het zodra er een evenement wordt aangekondigd.',
+    'agenda.msg_check': '✉ Check je mail om je aanmelding te bevestigen.',
+    // Downloads (publiek)
+    'downloads.title': 'Downloads',
+    'downloads.sub': 'Gratis te downloaden — laat je e-mailadres achter en je krijgt het bestand.',
+    'downloads.empty': 'Er staan momenteel geen downloads klaar.',
+    'downloads.btn': '⬇ Download',
+    // Beheer-dashboard
+    'admin.title': 'Beheer',
+    'admin.tagline_solo': 'Solo-modus — jouw site.',
+    'admin.tagline_hub': 'Hub-modus — bedrijfssite met gebruikers, elk hun eigen Klonkt Hub.',
+    'admin.b_sites': '🌐 Sites', 'admin.b_users': '👥 Gebruikers', 'admin.b_audio': '🎵 Audio',
+    'admin.b_playlists': '📃 Playlists', 'admin.b_comments': '💬 Reacties', 'admin.b_seo': '🔎 SEO',
+    'admin.b_settings': '⚙️ Instellingen', 'admin.b_newpost': '✍️ Nieuwe post', 'admin.b_look': '🎨 Uiterlijk',
+    'admin.b_makesite': '🎨 Maak je site aan', 'admin.b_circle': '🔗 Cirkel', 'admin.b_stats': '📊 Statistieken',
+    'admin.b_newsletter': '✉️ Nieuwsbrief', 'admin.b_perskit': '📰 Perskit', 'admin.b_downloads': '⬇ Downloads',
+    'admin.b_linkbio': '🔗 Link-in-bio', 'admin.b_agenda': '📅 Agenda', 'admin.b_google': '🔑 Google',
+    'admin.b_updates': '🔄 Updates', 'admin.b_help': '📖 Handleiding',
+    'admin.st_users': 'Gebruikers', 'admin.st_sites': 'Sites', 'admin.st_posts': 'Posts', 'admin.st_published': 'Gepubliceerd',
+    'admin.sec_posts': 'Posts', 'admin.sec_sites': 'Sites', 'admin.sec_users': 'Users',
+    'admin.draft': 'Concept', 'admin.edit': 'Bewerken', 'admin.view': 'Bekijk',
+    'admin.th_slug': 'Slug', 'admin.th_title': 'Titel', 'admin.th_owner': 'Eigenaar', 'admin.th_created': 'Aangemaakt',
+    'admin.th_username': 'Gebruikersnaam', 'admin.th_email': 'E-mail', 'admin.th_role': 'Rol', 'admin.th_joined': 'Lid sinds',
   },
   en: {
@@ -67,4 +98,32 @@
     'footer.install': 'Install app',
     'common.email_placeholder': 'you@email.com',
+    'common.back_to_admin': '← Admin',
+    'agenda.title': 'Agenda',
+    'agenda.empty': 'No announced events at the moment.',
+    'agenda.tickets': 'Tickets',
+    'agenda.notify_h': 'Never miss an event',
+    'agenda.notify_sub': 'Leave your email and we’ll let you know about new events. Unsubscribe any time.',
+    'agenda.notify_btn': 'Keep me posted',
+    'agenda.msg_done': '✓ You’re on the list — we’ll let you know when an event is announced.',
+    'agenda.msg_check': '✉ Check your email to confirm your sign-up.',
+    'downloads.title': 'Downloads',
+    'downloads.sub': 'Free to download — leave your email and you’ll get the file.',
+    'downloads.empty': 'No downloads available right now.',
+    'downloads.btn': '⬇ Download',
+    'admin.title': 'Admin',
+    'admin.tagline_solo': 'Solo mode — your site.',
+    'admin.tagline_hub': 'Hub mode — a company site with users, each their own Klonkt Hub.',
+    'admin.b_sites': '🌐 Sites', 'admin.b_users': '👥 Users', 'admin.b_audio': '🎵 Audio',
+    'admin.b_playlists': '📃 Playlists', 'admin.b_comments': '💬 Comments', 'admin.b_seo': '🔎 SEO',
+    'admin.b_settings': '⚙️ Settings', 'admin.b_newpost': '✍️ New post', 'admin.b_look': '🎨 Appearance',
+    'admin.b_makesite': '🎨 Create your site', 'admin.b_circle': '🔗 Circle', 'admin.b_stats': '📊 Statistics',
+    'admin.b_newsletter': '✉️ Newsletter', 'admin.b_perskit': '📰 Press kit', 'admin.b_downloads': '⬇ Downloads',
+    'admin.b_linkbio': '🔗 Link-in-bio', 'admin.b_agenda': '📅 Agenda', 'admin.b_google': '🔑 Google',
+    'admin.b_updates': '🔄 Updates', 'admin.b_help': '📖 Manual',
+    'admin.st_users': 'Users', 'admin.st_sites': 'Sites', 'admin.st_posts': 'Posts', 'admin.st_published': 'Published',
+    'admin.sec_posts': 'Posts', 'admin.sec_sites': 'Sites', 'admin.sec_users': 'Users',
+    'admin.draft': 'Draft', 'admin.edit': 'Edit', 'admin.view': 'View',
+    'admin.th_slug': 'Slug', 'admin.th_title': 'Title', 'admin.th_owner': 'Owner', 'admin.th_created': 'Created',
+    'admin.th_username': 'Username', 'admin.th_email': 'Email', 'admin.th_role': 'Role', 'admin.th_joined': 'Joined',
   },
   de: {
@@ -96,4 +155,32 @@
     'footer.install': 'App installieren',
     'common.email_placeholder': 'du@email.de',
+    'common.back_to_admin': '← Verwaltung',
+    'agenda.title': 'Termine',
+    'agenda.empty': 'Zurzeit keine angekündigten Termine.',
+    'agenda.tickets': 'Tickets',
+    'agenda.notify_h': 'Keinen Termin verpassen',
+    'agenda.notify_sub': 'Hinterlasse deine E-Mail und wir melden uns bei neuen Terminen. Abmelden jederzeit möglich.',
+    'agenda.notify_btn': 'Halt mich auf dem Laufenden',
+    'agenda.msg_done': '✓ Du stehst auf der Liste — wir melden uns, sobald ein Termin angekündigt wird.',
+    'agenda.msg_check': '✉ Prüfe deine E-Mail, um die Anmeldung zu bestätigen.',
+    'downloads.title': 'Downloads',
+    'downloads.sub': 'Kostenlos herunterladen — hinterlasse deine E-Mail und du bekommst die Datei.',
+    'downloads.empty': 'Momentan keine Downloads verfügbar.',
+    'downloads.btn': '⬇ Herunterladen',
+    'admin.title': 'Verwaltung',
+    'admin.tagline_solo': 'Solo-Modus — deine Seite.',
+    'admin.tagline_hub': 'Hub-Modus — eine Firmenseite mit Nutzern, je ein eigener Klonkt Hub.',
+    'admin.b_sites': '🌐 Seiten', 'admin.b_users': '👥 Nutzer', 'admin.b_audio': '🎵 Audio',
+    'admin.b_playlists': '📃 Playlists', 'admin.b_comments': '💬 Kommentare', 'admin.b_seo': '🔎 SEO',
+    'admin.b_settings': '⚙️ Einstellungen', 'admin.b_newpost': '✍️ Neuer Beitrag', 'admin.b_look': '🎨 Aussehen',
+    'admin.b_makesite': '🎨 Seite erstellen', 'admin.b_circle': '🔗 Kreis', 'admin.b_stats': '📊 Statistik',
+    'admin.b_newsletter': '✉️ Newsletter', 'admin.b_perskit': '📰 Pressekit', 'admin.b_downloads': '⬇ Downloads',
+    'admin.b_linkbio': '🔗 Link-in-Bio', 'admin.b_agenda': '📅 Termine', 'admin.b_google': '🔑 Google',
+    'admin.b_updates': '🔄 Updates', 'admin.b_help': '📖 Anleitung',
+    'admin.st_users': 'Nutzer', 'admin.st_sites': 'Seiten', 'admin.st_posts': 'Beiträge', 'admin.st_published': 'Veröffentlicht',
+    'admin.sec_posts': 'Beiträge', 'admin.sec_sites': 'Seiten', 'admin.sec_users': 'Nutzer',
+    'admin.draft': 'Entwurf', 'admin.edit': 'Bearbeiten', 'admin.view': 'Ansehen',
+    'admin.th_slug': 'Slug', 'admin.th_title': 'Titel', 'admin.th_owner': 'Eigentümer', 'admin.th_created': 'Erstellt',
+    'admin.th_username': 'Benutzername', 'admin.th_email': 'E-Mail', 'admin.th_role': 'Rolle', 'admin.th_joined': 'Mitglied seit',
   },
 };
Index: src/views/pages/admin.ejs
===================================================================
--- src/views/pages/admin.ejs	(revision 03fa5481c4f9961f422ed9a06824e8944fb868bf)
+++ src/views/pages/admin.ejs	(revision 91c0a39617f78bdd1459643d27bf74b26ccfb0e4)
@@ -1,69 +1,75 @@
 <div class="container admin-page">
-  <h1>Beheer</h1>
+  <% if (typeof langs !== 'undefined' && langs && langs.length > 1) { %>
+    <select class="footer-lang" style="float:right;margin-left:1rem" aria-label="<%= t('nav.language') %>"
+            onchange="location.href='/lang/'+this.value+'?r='+encodeURIComponent(location.pathname+location.search)">
+      <% langs.forEach(function(l){ %><option value="<%= l.code %>"<%= l.active ? ' selected' : '' %>><%= l.name %></option><% }); %>
+    </select>
+  <% } %>
+  <h1><%= t('admin.title') %></h1>
   <% if (tenancy === 'hub') { %>
-    <p class="admin-tagline">Hub-modus — bedrijfssite met gebruikers, elk hun eigen Klonkt Hub.</p>
+    <p class="admin-tagline"><%= t('admin.tagline_hub') %></p>
   <% } else { %>
-    <p class="admin-tagline">Solo-modus — jouw site.</p>
+    <p class="admin-tagline"><%= t('admin.tagline_solo') %></p>
   <% } %>
 
   <nav class="admin-quick-links" aria-label="Beheer-snelkoppelingen">
     <% if (tenancy === 'hub') { %>
-      <a href="/admin/sites" class="btn">🌐 Sites</a>
-      <a href="/admin/users" class="btn">👥 Gebruikers</a>
-      <a href="/admin/audio" class="btn">🎵 Audio</a>
-      <a href="/admin/playlists" class="btn">📃 Playlists</a>
-      <a href="/admin/comments" class="btn">💬 Reacties</a>
-      <% if (primarySite) { %><a href="/admin/seo" class="btn">🔎 SEO</a><% } %>
-      <a href="/admin/settings" class="btn">⚙️ Instellingen</a>
+      <a href="/admin/sites" class="btn"><%= t('admin.b_sites') %></a>
+      <a href="/admin/users" class="btn"><%= t('admin.b_users') %></a>
+      <a href="/admin/audio" class="btn"><%= t('admin.b_audio') %></a>
+      <a href="/admin/playlists" class="btn"><%= t('admin.b_playlists') %></a>
+      <a href="/admin/comments" class="btn"><%= t('admin.b_comments') %></a>
+      <% if (primarySite) { %><a href="/admin/seo" class="btn"><%= t('admin.b_seo') %></a><% } %>
+      <a href="/admin/settings" class="btn"><%= t('admin.b_settings') %></a>
     <% } else { %>
-      <a href="/posts/new" class="btn">✍️ Nieuwe post</a>
-      <a href="/admin/audio" class="btn">🎵 Audio</a>
-      <a href="/admin/comments" class="btn">💬 Reacties</a>
+      <a href="/posts/new" class="btn"><%= t('admin.b_newpost') %></a>
+      <a href="/admin/audio" class="btn"><%= t('admin.b_audio') %></a>
+      <a href="/admin/comments" class="btn"><%= t('admin.b_comments') %></a>
       <% if (primarySite) { %>
-        <a href="/admin/sites/<%= primarySite.slug %>/edit" class="btn">🎨 Uiterlijk</a>
+        <a href="/admin/sites/<%= primarySite.slug %>/edit" class="btn"><%= t('admin.b_look') %></a>
       <% } else { %>
-        <a href="/admin/sites/new" class="btn">🎨 Maak je site aan</a>
+        <a href="/admin/sites/new" class="btn"><%= t('admin.b_makesite') %></a>
       <% } %>
       <% if (tenancy === 'circle') { %>
-        <a href="/admin/circle" class="btn">🔗 Cirkel</a>
+        <a href="/admin/circle" class="btn"><%= t('admin.b_circle') %></a>
       <% } %>
-      <% if (primarySite) { %><a href="/admin/seo" class="btn">🔎 SEO</a><% } %>
-      <a href="/admin/settings" class="btn">⚙️ Instellingen</a>
+      <% if (primarySite) { %><a href="/admin/seo" class="btn"><%= t('admin.b_seo') %></a><% } %>
+      <a href="/admin/settings" class="btn"><%= t('admin.b_settings') %></a>
     <% } %>
     <% if (typeof premiumUnlocked === 'undefined' || premiumUnlocked) { %>
-      <a href="/admin/stats" class="btn">📊 Statistieken</a>
-      <a href="/admin/newsletter" class="btn">✉️ Nieuwsbrief</a>
-      <% if (tenancy !== 'hub' && primarySite) { %><a href="/pers" class="btn" target="_blank">📰 Perskit</a><% } %>
-      <% if (tenancy !== 'hub' && primarySite) { %><a href="/downloads" class="btn" target="_blank">⬇ Downloads</a><% } %>
-      <% if (tenancy !== 'hub' && primarySite) { %><a href="/links" class="btn" target="_blank">🔗 Link-in-bio</a><% } %>
-      <a href="/admin/shows" class="btn">📅 Agenda</a>
+      <a href="/admin/stats" class="btn"><%= t('admin.b_stats') %></a>
+      <a href="/admin/newsletter" class="btn"><%= t('admin.b_newsletter') %></a>
+      <% if (tenancy !== 'hub' && primarySite) { %><a href="/pers" class="btn" target="_blank"><%= t('admin.b_perskit') %></a><% } %>
+      <% if (tenancy !== 'hub' && primarySite) { %><a href="/downloads" class="btn" target="_blank"><%= t('admin.b_downloads') %></a><% } %>
+      <% if (tenancy !== 'hub' && primarySite) { %><a href="/links" class="btn" target="_blank"><%= t('admin.b_linkbio') %></a><% } %>
+      <a href="/admin/shows" class="btn"><%= t('admin.b_agenda') %></a>
     <% } %>
-    <a href="/admin/settings/google" class="btn">🔑 Google</a>
-    <a href="/admin/updates" class="btn">🔄 Updates</a>
-    <a href="/admin/handleiding" class="btn">📖 Handleiding</a>
+    <a href="/admin/settings/google" class="btn"><%= t('admin.b_google') %></a>
+    <a href="/admin/updates" class="btn"><%= t('admin.b_updates') %></a>
+    <a href="/admin/handleiding" class="btn"><%= t('admin.b_help') %></a>
   </nav>
 
   <div class="admin-stats">
     <% if (tenancy === 'hub') { %>
-      <div class="stat-card"><div class="stat-num"><%= stats.users %></div><div class="stat-label">Gebruikers</div></div>
-      <div class="stat-card"><div class="stat-num"><%= stats.sites %></div><div class="stat-label">Sites</div></div>
+      <div class="stat-card"><div class="stat-num"><%= stats.users %></div><div class="stat-label"><%= t('admin.st_users') %></div></div>
+      <div class="stat-card"><div class="stat-num"><%= stats.sites %></div><div class="stat-label"><%= t('admin.st_sites') %></div></div>
     <% } %>
-    <div class="stat-card"><div class="stat-num"><%= stats.posts %></div><div class="stat-label">Posts</div></div>
-    <div class="stat-card"><div class="stat-num"><%= stats.published %></div><div class="stat-label">Gepubliceerd</div></div>
+    <div class="stat-card"><div class="stat-num"><%= stats.posts %></div><div class="stat-label"><%= t('admin.st_posts') %></div></div>
+    <div class="stat-card"><div class="stat-num"><%= stats.published %></div><div class="stat-label"><%= t('admin.st_published') %></div></div>
   </div>
 
   <% if (typeof posts !== 'undefined' && posts && posts.length) { %>
     <% var _drafts = posts.filter(function(p){ return p.isDraft; }).length; %>
-    <h2>Posts<% if (_drafts) { %> <span class="pl-draftcount"><%= _drafts %> concept<%= _drafts === 1 ? '' : 'en' %></span><% } %></h2>
+    <h2><%= t('admin.sec_posts') %><% if (_drafts) { %> <span class="pl-draftcount"><%= _drafts %> <%= t('admin.draft').toLowerCase() %><%= _drafts === 1 ? '' : 's' %></span><% } %></h2>
     <ul class="post-admin-list">
       <% posts.forEach(function(p) { %>
         <li class="pal-row<%= p.isDraft ? ' is-draft' : '' %>">
           <a class="pal-title" href="<%= p.editUrl %>">
-            <% if (p.isDraft) { %><span class="pal-badge">Concept</span><% } %>
+            <% if (p.isDraft) { %><span class="pal-badge"><%= t('admin.draft') %></span><% } %>
             <span class="pal-name"><%= p.title || '(zonder titel)' %></span>
           </a>
           <span class="pal-actions">
-            <a class="pal-link" href="<%= p.editUrl %>">Bewerken</a>
-            <% if (!p.isDraft) { %><a class="pal-link" href="<%= p.viewUrl %>">Bekijk</a><% } %>
+            <a class="pal-link" href="<%= p.editUrl %>"><%= t('admin.edit') %></a>
+            <% if (!p.isDraft) { %><a class="pal-link" href="<%= p.viewUrl %>"><%= t('admin.view') %></a><% } %>
           </span>
         </li>
@@ -73,8 +79,8 @@
 
   <% if (sites && sites.length) { %>
-    <h2>Sites</h2>
+    <h2><%= t('admin.sec_sites') %></h2>
     <table class="admin-table">
       <thead>
-        <tr><th>Slug</th><th>Title</th><th>Owner</th><th>Created</th></tr>
+        <tr><th><%= t('admin.th_slug') %></th><th><%= t('admin.th_title') %></th><th><%= t('admin.th_owner') %></th><th><%= t('admin.th_created') %></th></tr>
       </thead>
       <tbody>
@@ -92,8 +98,8 @@
 
   <% if (users && users.length) { %>
-    <h2>Users</h2>
+    <h2><%= t('admin.sec_users') %></h2>
     <table class="admin-table">
       <thead>
-        <tr><th>Username</th><th>Email</th><th>Role</th><th>Joined</th></tr>
+        <tr><th><%= t('admin.th_username') %></th><th><%= t('admin.th_email') %></th><th><%= t('admin.th_role') %></th><th><%= t('admin.th_joined') %></th></tr>
       </thead>
       <tbody>
Index: src/views/pages/downloads.ejs
===================================================================
--- src/views/pages/downloads.ejs	(revision 03fa5481c4f9961f422ed9a06824e8944fb868bf)
+++ src/views/pages/downloads.ejs	(revision 91c0a39617f78bdd1459643d27bf74b26ccfb0e4)
@@ -1,13 +1,16 @@
 <%
   var ts = (typeof dlTracks !== 'undefined') ? dlTracks : [];
+  // NB: de loop hieronder gebruikt 't' als track-variabele, die de vertaal-t()
+  // overschaduwt. Daarom het knoplabel hier al ophalen.
+  var _dlBtn = t('downloads.btn');
 %>
 <article class="container post-page">
   <%- include('../partials/post-nav', { newerPost: (typeof newerPost !== 'undefined' ? newerPost : null), olderPost: (typeof olderPost !== 'undefined' ? olderPost : null) }) %>
   <section class="dls">
-  <h1 class="dls-h1">Downloads</h1>
-  <p class="dls-sub">Gratis te downloaden — laat je e-mailadres achter en je krijgt het bestand.</p>
+  <h1 class="dls-h1"><%= t('downloads.title') %></h1>
+  <p class="dls-sub"><%= t('downloads.sub') %></p>
 
   <% if (!ts.length) { %>
-    <p class="dls-empty">Er staan momenteel geen downloads klaar.</p>
+    <p class="dls-empty"><%= t('downloads.empty') %></p>
   <% } else { %>
     <ul class="dls-list">
@@ -19,5 +22,5 @@
             <% if (t.artist) { %><span class="dls-artist"><%= t.artist %></span><% } %>
           </span>
-          <a class="dls-btn" href="<%= siteUrlBase %>/download/<%= t.id %>">⬇ Download</a>
+          <a class="dls-btn" href="<%= siteUrlBase %>/download/<%= t.id %>"><%= _dlBtn %></a>
         </li>
       <% }); %>
Index: src/views/pages/shows.ejs
===================================================================
--- src/views/pages/shows.ejs	(revision 03fa5481c4f9961f422ed9a06824e8944fb868bf)
+++ src/views/pages/shows.ejs	(revision 91c0a39617f78bdd1459643d27bf74b26ccfb0e4)
@@ -4,12 +4,12 @@
 %>
 <section class="sh">
-  <h1 class="sh-h1">Agenda</h1>
+  <h1 class="sh-h1"><%= t('agenda.title') %></h1>
 
-  <% if (st === 'done') { %><div class="sh-msg">✓ Je staat op de lijst — je hoort het zodra er een evenement wordt aangekondigd.</div>
-  <% } else if (st === 'check') { %><div class="sh-msg">✉ Check je mail om je aanmelding te bevestigen.</div>
+  <% if (st === 'done') { %><div class="sh-msg"><%= t('agenda.msg_done') %></div>
+  <% } else if (st === 'check') { %><div class="sh-msg"><%= t('agenda.msg_check') %></div>
   <% } else if (st === 'error') { %><div class="sh-msg sh-bad"><%= (typeof notifyMsg!=='undefined')?notifyMsg:'Er ging iets mis.' %></div><% } %>
 
   <% if (!ss.length) { %>
-    <p class="sh-empty">Geen aangekondigde evenementen op dit moment.</p>
+    <p class="sh-empty"><%= t('agenda.empty') %></p>
   <% } else { %>
     <ul class="sh-list">
@@ -25,5 +25,5 @@
             <% if (s.notes) { %><span class="sh-notes"><%= s.notes %></span><% } %>
           </span>
-          <% if (s.ticket_url) { %><a class="sh-tix" href="<%= s.ticket_url %>" target="_blank" rel="noopener">Tickets</a><% } %>
+          <% if (s.ticket_url) { %><a class="sh-tix" href="<%= s.ticket_url %>" target="_blank" rel="noopener"><%= t('agenda.tickets') %></a><% } %>
         </li>
       <% }); %>
@@ -33,9 +33,9 @@
   <% if (!(typeof footerNewsletter !== 'undefined' && footerNewsletter)) { %>
   <div class="sh-notify">
-    <h2 class="sh-h2">Mis geen evenement</h2>
-    <p class="sh-sub">Laat je e-mail achter en je krijgt een seintje bij een nieuw evenement. Uitschrijven kan altijd.</p>
+    <h2 class="sh-h2"><%= t('agenda.notify_h') %></h2>
+    <p class="sh-sub"><%= t('agenda.notify_sub') %></p>
     <form method="POST" action="<%= siteUrlBase %>/shows/notify" class="sh-form">
-      <input type="email" name="email" required placeholder="jouw@email.nl" autocomplete="email">
-      <button type="submit" class="sh-btn">Houd me op de hoogte</button>
+      <input type="email" name="email" required placeholder="<%= t('common.email_placeholder') %>" autocomplete="email">
+      <button type="submit" class="sh-btn"><%= t('agenda.notify_btn') %></button>
     </form>
   </div>
