Index: src/routes/admin-paid.js
===================================================================
--- src/routes/admin-paid.js	(revision 053bf51d2047068ccfdc7ac5a76e3c8275bba1b5)
+++ src/routes/admin-paid.js	(revision 9a00f283dea4b5647c585540cdef7d52ced93298)
@@ -36,5 +36,5 @@
   if (!gate(req, res)) return;
   renderPage(req, res, 'pages/admin-paid', {
-    pageTitle: 'Betaalde posts',
+    pageTitleKey: 'apaid.t',
     bodyClass: 'on-admin',
     status: PaidPatreon.ownerStatus(res.locals.site.id),
Index: src/routes/admin-push.js
===================================================================
--- src/routes/admin-push.js	(revision 053bf51d2047068ccfdc7ac5a76e3c8275bba1b5)
+++ src/routes/admin-push.js	(revision 9a00f283dea4b5647c585540cdef7d52ced93298)
@@ -12,5 +12,5 @@
 router.get('/', requireSiteManager, async (req, res) => {
   renderPage(req, res, 'pages/admin-push', {
-    pageTitle: 'Notificaties',
+    pageTitleKey: 'push.t',
     bodyClass: 'on-admin',
     vapidKey: await Push.publicKey(),          // null → feature unavailable
Index: src/routes/admin.js
===================================================================
--- src/routes/admin.js	(revision 053bf51d2047068ccfdc7ac5a76e3c8275bba1b5)
+++ src/routes/admin.js	(revision 9a00f283dea4b5647c585540cdef7d52ced93298)
@@ -9,5 +9,5 @@
 import { renderPage } from '../middleware/render.js';
 import { requireAuth } from '../middleware/auth.js';
-import { getTenancy } from '../services/SettingsService.js';
+import { getTenancy, apEnabled } from '../services/SettingsService.js';
 import { getPrimarySite } from '../middleware/site.js';
 
@@ -96,4 +96,5 @@
     bodyClass: 'on-admin',
     tenancy,
+    circlesOn: apEnabled(),   // solo vs cirkels tagline (federatie aan/uit)
     primarySite,
     stats,
Index: src/routes/paid.js
===================================================================
--- src/routes/paid.js	(revision 053bf51d2047068ccfdc7ac5a76e3c8275bba1b5)
+++ src/routes/paid.js	(revision 9a00f283dea4b5647c585540cdef7d52ced93298)
@@ -54,5 +54,5 @@
   if (!payload || payload.purpose !== 'patron' || payload.siteId !== r.site.id) {
     return renderPage(req, res, 'pages/paid-result', {
-      pageTitle: 'Ontgrendelen', bodyClass: 'on-special', ok: false, reason: 'expired',
+      pageTitleKey: 'pres.t', bodyClass: 'on-special', ok: false, reason: 'expired',
     });
   }
@@ -60,5 +60,5 @@
   const code = String(req.query.code || '');
   if (req.query.error || !code) {
-    return renderPage(req, res, 'pages/paid-result', { pageTitle: 'Ontgrendelen', bodyClass: 'on-special', ok: false, reason: 'declined', postSlug: payload.post, patronUrl });
+    return renderPage(req, res, 'pages/paid-result', { pageTitleKey: 'pres.t', bodyClass: 'on-special', ok: false, reason: 'declined', postSlug: payload.post, patronUrl });
   }
   const membership = await PaidPatreon.verifyPatron(r.site.id, code, baseUrl(req) + '/paid/callback').catch(() => null);
@@ -67,5 +67,5 @@
   if (!active || cents < payload.cents) {
     return renderPage(req, res, 'pages/paid-result', {
-      pageTitle: 'Ontgrendelen', bodyClass: 'on-special', ok: false,
+      pageTitleKey: 'pres.t', bodyClass: 'on-special', ok: false,
       reason: active ? 'tier' : 'notpatron', neededCents: payload.cents, haveCents: cents, postSlug: payload.post, patronUrl,
     });
@@ -76,5 +76,5 @@
   const blob = signBlob({ purpose: 'reg', siteId: r.site.id, cents, challenge: options.challenge }, 900);
   renderPage(req, res, 'pages/paid-passkey', {
-    pageTitle: 'Maak je passkey', bodyClass: 'on-special',
+    pageTitleKey: 'ppk.t', bodyClass: 'on-special',
     optionsJson: JSON.stringify(options), regBlob: blob, postSlug: payload.post,
   });
Index: src/routes/push.js
===================================================================
--- src/routes/push.js	(revision 053bf51d2047068ccfdc7ac5a76e3c8275bba1b5)
+++ src/routes/push.js	(revision 9a00f283dea4b5647c585540cdef7d52ced93298)
@@ -9,4 +9,5 @@
 import { requireAuth } from '../middleware/auth.js';
 import Push from '../services/PushService.js';
+import { t as i18nT, resolveLang } from '../services/i18n.js';
 
 const router = express.Router();
@@ -55,7 +56,8 @@
 // A test ping to all of the caller's own devices (bypasses alert prefs).
 router.post('/test', requireAuth, async (req, res) => {
+  const L = resolveLang(req);
   const sent = await Push.notifyUser(req.session.user.id, {
-    type: 'test', title: 'Klonkt-testnotificatie',
-    body: 'Werkt. Zo komen meldingen binnen op dit apparaat.', url: '/admin/push',
+    type: 'test', title: i18nT(L, 'push.n_test_t'),
+    body: i18nT(L, 'push.n_test_b'), url: '/admin/push',
   });
   res.json({ ok: true, sent });
