Index: src/views/pages/paid-gate.ejs
===================================================================
--- src/views/pages/paid-gate.ejs	(revision 072a24208b5f98d3ac8b491384e7a63293f98239)
+++ src/views/pages/paid-gate.ejs	(revision 6b5d7da762e4f4cedbefb24fb218a1006897f071)
@@ -13,17 +13,15 @@
   <section class="pg-card">
     <div class="pg-lock">💶</div>
-    <h2 class="pg-h2">Voor supporters</h2>
+    <h2 class="pg-h2"><%= t('pgate.h') %></h2>
     <p class="pg-sub">
-      Deze post is voor supporters van deze site
-      <% if (typeof pgCents !== 'undefined' && pgCents) { %>(vanaf &euro;<%= (pgCents/100).toFixed(2) %> per maand op Patreon)<% } %>.
-      Word supporter en ontgrendel 'm daarna met een passkey. Geen account op deze site, geen cookie.
+      <% if (typeof pgCents !== 'undefined' && pgCents) { %><%= t('pgate.sub_cents', { eur: (pgCents/100).toFixed(2) }) %><% } else { %><%= t('pgate.sub') %><% } %>
     </p>
 
     <div class="pg-actions">
       <% if (_hasPatron) { %>
-        <a class="pg-btn" href="<%= pgPatronUrl %>" target="_blank" rel="noopener">Word supporter op Patreon</a>
-        <button type="button" id="pg-unlock" class="pg-btn pg-btn-ghost">Al supporter? Ontgrendelen</button>
+        <a class="pg-btn" href="<%= pgPatronUrl %>" target="_blank" rel="noopener"><%= t('pgate.join') %></a>
+        <button type="button" id="pg-unlock" class="pg-btn pg-btn-ghost"><%= t('pgate.unlock_have') %></button>
       <% } else { %>
-        <button type="button" id="pg-unlock" class="pg-btn">Ontgrendelen met Patreon</button>
+        <button type="button" id="pg-unlock" class="pg-btn"><%= t('pgate.unlock') %></button>
       <% } %>
     </div>
@@ -38,4 +36,5 @@
   var slug = "<%= pgSlug %>";
   var hasPatron = <%= _hasPatron ? 'true' : 'false' %>;
+  var I = { join: "<%= t('pgate.join_short') %>", confirm: "<%= t('pgate.confirm') %>", failed: "<%= t('pgate.failed') %>", error: "<%= t('pgate.error') %>" };
   var btn = document.getElementById('pg-unlock');
   var status = document.getElementById('pg-status');
@@ -48,5 +47,5 @@
   if (!window.SimpleWebAuthnBrowser || !window.PublicKeyCredential) {
     if (hasPatron) { btn.style.display = 'none'; }
-    else { btn.textContent = 'Word supporter'; btn.addEventListener('click', toLink); }
+    else { btn.textContent = I.join; btn.addEventListener('click', toLink); }
     return;
   }
@@ -54,5 +53,5 @@
   btn.addEventListener('click', function () {
     btn.disabled = true;
-    say('Bevestig met je passkey…');
+    say(I.confirm);
     fetch(base + '/paid/challenge?post=' + encodeURIComponent(slug))
       .then(function (r) { if (!r.ok) throw { link: true }; return r.json(); })
@@ -75,5 +74,5 @@
           toLink();   // no valid passkey yet (or lapsed tier): link via Patreon
         } else {
-          btn.disabled = false; say('Ontgrendelen mislukt. Probeer opnieuw.', true);
+          btn.disabled = false; say(I.failed, true);
         }
       })
@@ -81,5 +80,5 @@
         if (e && e.link) { toLink(); return; }
         if (e && e.name === 'NotAllowedError') { toLink(); return; }   // cancelled / no passkey -> link
-        btn.disabled = false; say('Er ging iets mis. Probeer opnieuw.', true);
+        btn.disabled = false; say(I.error, true);
       });
   });
