Index: src/views/partials/footer.ejs
===================================================================
--- src/views/partials/footer.ejs	(revision 1c6d61c61d3c00833d7281c35f27f08ec8ccf6b8)
+++ src/views/partials/footer.ejs	(revision 91c0a39617f78bdd1459643d27bf74b26ccfb0e4)
@@ -2,8 +2,8 @@
   <% if (typeof footerNewsletter !== 'undefined' && footerNewsletter && (typeof premiumUnlocked === 'undefined' || premiumUnlocked) && typeof site !== 'undefined' && site) { %>
     <div class="container footer-nl">
-      <span class="footer-nl-label">📬 Blijf op de hoogte</span>
+      <span class="footer-nl-label">📬 <%= t('footer.subscribe_cta') %></span>
       <form method="post" action="<%= (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '' %>/nieuwsbrief" class="footer-nl-form">
-        <input type="email" name="email" required placeholder="jouw@email.nl" autocomplete="email" aria-label="E-mailadres">
-        <button type="submit">Inschrijven</button>
+        <input type="email" name="email" required placeholder="<%= t('common.email_placeholder') %>" autocomplete="email" aria-label="E-mailadres">
+        <button type="submit"><%= t('footer.subscribe') %></button>
       </form>
     </div>
@@ -17,7 +17,13 @@
     <button type="button" class="install-app-btn install-app-btn--footer" data-pcms-install-app>
       <svg viewBox="0 0 24 24" width="16" height="16" aria-hidden="true"><path d="M5 20h14v-2H5v2zm7-18L5.33 9h3.84v6h5.66V9h3.84L12 2z" fill="currentColor"/></svg>
-      <span>Installeer app</span>
+      <span><%= t('footer.install') %></span>
     </button>
     <div class="footer-meta">
+      <% if (typeof langs !== 'undefined' && langs && langs.length > 1) { %>
+        <select class="footer-lang" 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>
+      <% } %>
       <a class="footer-version" href="<%= (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '' %>/changelog" title="Bekijk wat er per release veranderd is">Klonkt Beta<%= (typeof appVersion !== 'undefined' && appVersion) ? ' v' + appVersion : '' %></a>
       <%# Mobile-only theme toggle. On desktop the topnav has its own toggle
@@ -101,4 +107,11 @@
   display: inline-flex; align-items: center; gap: 0.75rem;
 }
+.footer-lang {
+  background: transparent; color: var(--ink); opacity: 1;
+  border: 1px solid var(--rule); border-radius: 999px;
+  padding: 0.3rem 0.5rem; font-size: 0.78rem; cursor: pointer;
+  font-family: inherit;
+}
+.footer-lang:hover { border-color: var(--accent); }
 .footer-version { color: inherit; text-decoration: none; }
 .footer-version:hover { color: var(--accent); text-decoration: underline; }
Index: src/views/partials/post-nav.ejs
===================================================================
--- src/views/partials/post-nav.ejs	(revision 1c6d61c61d3c00833d7281c35f27f08ec8ccf6b8)
+++ src/views/partials/post-nav.ejs	(revision 91c0a39617f78bdd1459643d27bf74b26ccfb0e4)
@@ -8,5 +8,5 @@
          hx-get="/<%= newerPost.slug %>?partial=1" hx-target="#pcms-main"
          hx-push-url="/<%= newerPost.slug %>" hx-indicator="#pcms-loading"<% } %>>
-        <span class="post-nav-label"><% if (newerPost.pinned) { %><span class="post-nav-pin" title="Vastgepind">📌</span> <% } %>← Newer</span>
+        <span class="post-nav-label"><% if (newerPost.pinned) { %><span class="post-nav-pin" title="Vastgepind">📌</span> <% } %>← <%= t('postnav.newer') %></span>
         <span class="post-nav-title"><%= newerPost.title %></span>
       </a>
@@ -14,5 +14,5 @@
       <div class="post-nav-prev is-empty" aria-hidden="true">
         <span class="post-nav-label">← Newer</span>
-        <span class="post-nav-title">Nieuwste post</span>
+        <span class="post-nav-title"><%= t('postnav.newest') %></span>
       </div>
     <% } %>
@@ -21,5 +21,5 @@
          hx-get="/<%= olderPost.slug %>?partial=1" hx-target="#pcms-main"
          hx-push-url="/<%= olderPost.slug %>" hx-indicator="#pcms-loading"<% } %>>
-        <span class="post-nav-label">Older →<% if (olderPost.pinned) { %> <span class="post-nav-pin" title="Vastgepind">📌</span><% } %></span>
+        <span class="post-nav-label"><%= t('postnav.older') %> →<% if (olderPost.pinned) { %> <span class="post-nav-pin" title="Vastgepind">📌</span><% } %></span>
         <span class="post-nav-title"><%= olderPost.title %></span>
       </a>
@@ -27,5 +27,5 @@
       <div class="post-nav-next is-empty" aria-hidden="true">
         <span class="post-nav-label">Older →</span>
-        <span class="post-nav-title">Oudste post</span>
+        <span class="post-nav-title"><%= t('postnav.oldest') %></span>
       </div>
     <% } %>
Index: src/views/partials/topnav.ejs
===================================================================
--- src/views/partials/topnav.ejs	(revision 1c6d61c61d3c00833d7281c35f27f08ec8ccf6b8)
+++ src/views/partials/topnav.ejs	(revision 91c0a39617f78bdd1459643d27bf74b26ccfb0e4)
@@ -26,5 +26,5 @@
     <div class="masthead-brand">
       <% if (_isAdmin) { %>
-        <a href="<%= _siteUrlBase %>/" class="nav-link nav-link-admin">← Terug naar site</a>
+        <a href="<%= _siteUrlBase %>/" class="nav-link nav-link-admin"><%= t('nav.back_to_site') %></a>
       <% } else if (typeof tenancy !== 'undefined' && tenancy === 'hub') { %>
         <%# Hub: de brand gaat naar de hub-home via HTMX. De chrome wordt in hub-modus
@@ -64,5 +64,5 @@
            hx-indicator="#pcms-loading">
           <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 8v13H3V8"/><rect x="1" y="3" width="22" height="5" rx="1"/><line x1="10" y1="12" x2="14" y2="12"/></svg>
-          <span class="nav-label">Archief</span>
+          <span class="nav-label"><%= t('nav.archive') %></span>
         </a>
       <% } %>
@@ -118,5 +118,5 @@
                  hx-push-url="/account" hx-indicator="#pcms-loading">
                 <svg class="udi-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
-                <span>Account</span>
+                <span><%= t('nav.account') %></span>
               </a>
               <a href="/favorieten" role="menuitem" class="udi"
@@ -124,5 +124,5 @@
                  hx-push-url="/favorieten" hx-indicator="#pcms-loading">
                 <svg class="udi-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>
-                <span>Favorieten</span>
+                <span><%= t('nav.favorites') %></span>
               </a>
               <% if (typeof canSeeBeheer !== 'undefined' && canSeeBeheer) { %>
@@ -131,5 +131,5 @@
                    hx-push-url="/admin" hx-indicator="#pcms-loading">
                   <svg class="udi-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3h7v7H3z"/><path d="M14 3h7v7h-7z"/><path d="M14 14h7v7h-7z"/><path d="M3 14h7v7H3z"/></svg>
-                  <span>Beheer</span>
+                  <span><%= t('nav.admin') %></span>
                 </a>
               <% } %>
@@ -139,5 +139,5 @@
                    hx-push-url="<%= _siteUrlBase %>/posts/new" hx-indicator="#pcms-loading">
                   <svg class="udi-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 20h9"/><path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z"/></svg>
-                  <span>Nieuwe post</span>
+                  <span><%= t('nav.new_post') %></span>
                 </a>
               <% } %>
@@ -147,5 +147,5 @@
               <a href="/auth/logout" role="menuitem" class="udi udi-danger">
                 <svg class="udi-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><polyline points="16 17 21 12 16 7"/><line x1="21" y1="12" x2="9" y2="12"/></svg>
-                <span>Uitloggen</span>
+                <span><%= t('nav.logout') %></span>
               </a>
             </div>
@@ -156,5 +156,5 @@
            hx-get="/auth/login?partial=1" hx-target="#pcms-main" hx-swap="innerHTML"
            hx-push-url="/auth/login" hx-indicator="#pcms-loading">
-          <span class="nav-label">Inloggen</span>
+          <span class="nav-label"><%= t('nav.login') %></span>
         </a>
       <% } %>
Index: src/views/partials/view-switcher.ejs
===================================================================
--- src/views/partials/view-switcher.ejs	(revision 1c6d61c61d3c00833d7281c35f27f08ec8ccf6b8)
+++ src/views/partials/view-switcher.ejs	(revision 91c0a39617f78bdd1459643d27bf74b26ccfb0e4)
@@ -19,5 +19,5 @@
       <a class="vs-agenda<%= _onShows ? ' is-active' : '' %>" href="<%= _sbA %>/shows" aria-label="Agenda — evenementen">
         <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="4" width="18" height="18" rx="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg>
-        <span>Agenda</span>
+        <span><%= t('switch.agenda') %></span>
       </a>
     </div>
@@ -29,7 +29,7 @@
     <div class="feed-scope" role="tablist" aria-label="Solo of cirkel">
       <a class="feed-scope-btn<%= (!_neutral && !_onCirkel) ? ' is-active' : '' %>" href="<%= _sb %>/"
-         role="tab" aria-selected="<%= (!_neutral && !_onCirkel) ? 'true' : 'false' %>">Solo</a>
+         role="tab" aria-selected="<%= (!_neutral && !_onCirkel) ? 'true' : 'false' %>"><%= t('switch.solo') %></a>
       <a class="feed-scope-btn<%= (!_neutral && _onCirkel) ? ' is-active' : '' %>" href="<%= _sb %>/cirkel"
-         role="tab" aria-selected="<%= (!_neutral && _onCirkel) ? 'true' : 'false' %>">Cirkel</a>
+         role="tab" aria-selected="<%= (!_neutral && _onCirkel) ? 'true' : 'false' %>"><%= t('switch.circle') %></a>
     </div>
     <% } %>
@@ -38,10 +38,10 @@
               aria-selected="<%= (!_neutral && !(typeof site !== 'undefined' && site && site.feed_view_default === 'grid')) ? 'true' : 'false' %>">
         <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="8" y1="6" x2="21" y2="6"/><line x1="8" y1="12" x2="21" y2="12"/><line x1="8" y1="18" x2="21" y2="18"/><line x1="3" y1="6" x2="3.01" y2="6"/><line x1="3" y1="12" x2="3.01" y2="12"/><line x1="3" y1="18" x2="3.01" y2="18"/></svg>
-        <span>Tijdlijn</span>
+        <span><%= t('switch.timeline') %></span>
       </button>
       <button type="button" class="view-switch-btn" data-view="grid" role="tab"
               aria-selected="<%= (!_neutral && (typeof site !== 'undefined' && site && site.feed_view_default === 'grid')) ? 'true' : 'false' %>">
         <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/></svg>
-        <span>Grid</span>
+        <span><%= t('switch.grid') %></span>
       </button>
     </div>
