Index: src/assets/js/mod/read.js
===================================================================
--- src/assets/js/mod/read.js	(revision b67edbdfb84f7d125475d92c470edf68a7886ccf)
+++ src/assets/js/mod/read.js	(revision 7421147352180120b7c1601b2ce47d67418c3446)
@@ -18,4 +18,10 @@
 const MARGE = '1px 0px 100% 0px';
 
+// De teksten die dit script plaatst. Ze staan in data-i18n op de stroom, want
+// een zin die hier staat, staat in één taal -- en dat is nooit de taal van de
+// lezer. Zelfde afspraak als de topnav (mod/chrome.js).
+let woorden = {};
+function woord(sleutel) { return woorden[sleutel] || ''; }
+
 const stroom = () => document.getElementById('read-stream');
 const geladen = new Set();      // slugs die al in de stroom staan
@@ -26,5 +32,5 @@
 
 function chrome(verbergen) {
-  document.body.classList.toggle('read-chrome-weg', !!verbergen);
+  document.body.classList.toggle('read-chrome-hidden', !!verbergen);
 }
 
@@ -72,5 +78,5 @@
   if (geladen.has(slug)) return;
   bezigOnder = true;
-  const wacht = melding(s, 'read-laden', '…');
+  const wacht = melding(s, 'read-loading', '…');
   try {
     const art = await haal(slug, laatste.dataset.base || '');
@@ -80,5 +86,5 @@
     kijk();
   } catch (e) {
-    wacht.textContent = 'Kon het volgende bericht niet laden.';
+    wacht.textContent = woord('load_error');
     console.warn('[read] onderaan:', e && e.message);
   } finally { bezigOnder = false; }
@@ -120,6 +126,6 @@
 
 function klaar(s) {
-  if (s.querySelector('.read-eind')) return;
-  melding(s, 'read-eind', 'Je bent bij het begin van het archief.');
+  if (s.querySelector('.read-end')) return;
+  melding(s, 'read-end', woord('end'));
 }
 
@@ -152,4 +158,5 @@
   const s = stroom();
   if (!s) return;
+  try { woorden = JSON.parse(s.getAttribute('data-i18n') || '{}'); } catch (e) { woorden = {}; }
   s.querySelectorAll('.read-post').forEach((p) => geladen.add(p.dataset.slug));
   laatsteY = window.scrollY || 0;
