Changeset 5218863 in Klonkt


Ignore:
Timestamp:
08/12/2026 08:25:10 PM (3 months ago)
Author:
Robin <roboburr@…>
Children:
4bb93aa
Parents:
084b046
Message:

De Ward PWA: het gesprek over de hemel, en de zwaai-hand

Plak 4. Een tik op een gezicht opent nu echt iets.

HET GESPREK is een overlay OVER de levende hemel, geen aparte pagina:
de hemel eronder blijft dezelfde draaiende instantie, en het paneel is
doorschijnend met blur, zoals de glazen bubbels in de app. Dezelfde
bron als de C2S-lezing die Shaer gebruikt (conversationHistory):
inkomend de ap_mentions, uitgaand de eigen directe notes. Openen is
lezen: markRead neemt het maximum, dus een oud toestel kan nooit iets
weer ongelezen maken. Verversen is pollen om de acht seconden zolang
het gesprek open staat; het ritme van een gesprek is geen milliseconde,
en een socket kan later zonder iets te slopen.

DE ZWAAI-HAND hangt in dezelfde hoek als de boei en ze wisselen elkaar
af met de stand: met de kaarten verdwijnt de boei, op de hemel hangt de
hand. Slepen op een gezicht opent het paneel met de drie antwoorden, en
de tekst die je kiest IS het bericht. De treffer is sky.pick(): exact
dezelfde rekensom als een tik, dus mikken gedraagt zich overal gelijk.

Changed files:
src/routes/ward.js

  • /api/thread: beide kanten, cursor, markRead bij openen
  • /api/message: direct bericht of zwaai (shaer:wave reist mee)

src/assets/js/ward-sky.js

  • pick() als publieke mikfunctie

src/assets/js/ward.js

  • thread-overlay met poll, verstuurvak, Escape sluit
  • de hand: slepen, mikken, paneel, versturen

src/views/pages/ward.ejs

  • thread, hand en zwaai-paneel in de schil

src/assets/css/ward.css

  • doorschijnend gesprek, bubbels, hand, paneel

src/services/i18n.js

  • tien sleutels in nl, en, de

test/ward-pwa.test.js

  • het gesprek draagt beide kanten en de zwaai-vlag overleeft; versturen eist een echte ontvanger en echte tekst

remarks: 897 tests groen. Nog niet geport: de (+) voor een nieuw
gesprek, Friends/Orbit-panelen, de composer met media, de mini-speler
en de themakleur; beads volgen. Slepen met een echte vinger is aan
Robin op dev.

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/assets/css/ward.css

    r084b046 r5218863  
    100100/* De kaarten vallen weg, de hemel blijft: dezelfde beweging als in de app. */
    101101body.messages-mode .help, body.messages-mode .cards { display: none; }
     102
     103/* ── De zwaai-hand ────────────────────────────────────────────────────── */
     104/* Zelfde hoek als de boei; ze wisselen elkaar af met de stand. */
     105#hand {
     106  position: fixed; right: 18px; bottom: calc(18px + env(safe-area-inset-bottom));
     107  width: 76px; height: 76px; border: 0; border-radius: 50%;
     108  background: transparent; font-size: 52px; line-height: 1;
     109  touch-action: none; cursor: grab; z-index: 50;
     110}
     111#hand.dragging { cursor: grabbing; transform: scale(1.1); }
     112
     113/* ── Het gesprek over de hemel ────────────────────────────────────────── */
     114#thread {
     115  position: fixed; inset: 0; z-index: 40;
     116  display: flex; flex-direction: column;
     117  /* Doorschijnend: de hemel eronder blijft zichtbaar draaien, net als de
     118     glazen bubbels in de app. */
     119  background: rgba(20, 26, 36, .72); backdrop-filter: blur(14px);
     120}
     121#thread header { display: flex; align-items: center; gap: 10px; padding: 12px 16px; }
     122#thread header h2 { margin: 0; font-size: 1.05rem; }
     123#thread-close { border: 0; background: #2a3342; color: var(--ink); border-radius: 10px; padding: 8px 12px; font-size: 1rem; }
     124#thread-list { flex: 1; overflow-y: auto; padding: 8px 16px; display: flex; flex-direction: column; gap: 8px; }
     125.bubble { max-width: 78%; padding: 10px 12px; border-radius: 14px; background: var(--card); }
     126.bubble.out { align-self: flex-end; background: var(--accent); }
     127.bubble.wave { font-size: 1.4rem; }
     128.bubble .when { display: block; margin-top: 4px; font-size: .7rem; color: rgba(255,255,255,.55); }
     129.bubble .body img { max-width: 100%; border-radius: 8px; }
     130#thread-form { display: flex; gap: 8px; padding: 10px 16px calc(14px + env(safe-area-inset-bottom)); }
     131#thread-form input {
     132  flex: 1; border-radius: 999px; border: 1px solid #2a3342;
     133  background: #131a25; color: var(--ink); padding: 10px 16px; font: inherit;
     134}
     135#thread-form button { border: 0; border-radius: 999px; padding: 10px 18px; background: var(--accent); color: #fff; font: inherit; font-weight: 600; }
     136
     137/* ── Het zwaai-paneel ─────────────────────────────────────────────────── */
     138dialog#wave-dialog {
     139  border: 0; border-radius: 16px; padding: 18px; max-width: 320px; width: calc(100% - 48px);
     140  background: var(--card); color: var(--ink); text-align: center;
     141}
     142dialog#wave-dialog::backdrop { background: rgba(0,0,0,.4); }
     143dialog#wave-dialog h2 { margin: 0 0 12px; font-size: 1.05rem; }
     144.wave-answers { display: grid; gap: 8px; }
     145.wave-answers button { border: 0; border-radius: 10px; padding: 12px; background: var(--accent); color: #fff; font: inherit; font-weight: 600; }
     146#wave-cancel { margin-top: 10px; border: 0; background: none; color: var(--dim); font: inherit; }
  • src/assets/js/ward-sky.js

    r084b046 r5218863  
    172172    this.atlas = await buildAtlas(faces);
    173173    this._resize();
     174  }
     175
     176  /** Publiek mikken, voor de zwaai-hand: zelfde rekensom als een tik. */
     177  pick(px, py) {
     178    return nearestFace(px, py, this.spots, {
     179      cx: this.w / 2, cy: this.h / 2, cell: CELL, scale: this.scale,
     180      panX: this.panX, panY: this.panY,
     181    });
    174182  }
    175183
  • src/assets/js/ward.js

    r084b046 r5218863  
    231231  const sky = new SkyRenderer(canvas, (i) => {
    232232    const c = convs[i];
    233     if (c) window.location.href = `/ward/thread?with=${encodeURIComponent(c.uri)}`;
     233    if (c) openThread(c);
     234  });
     235
     236  /* ── Het gesprek: een overlay OVER de levende hemel ────────────────────
     237     Geen aparte pagina: de hemel eronder blijft dezelfde draaiende
     238     instantie, precies zoals de thread in Shaer over de hemel schuift. */
     239  const thread = document.getElementById('thread');
     240  const list = document.getElementById('thread-list');
     241  let openWith = null;
     242  let pollTimer = null;
     243
     244  async function loadThread() {
     245    if (!openWith) return;
     246    try {
     247      const r = await fetch(`/ward/api/thread?with=${encodeURIComponent(openWith.uri)}`, { headers: { Accept: 'application/json' } });
     248      if (!r.ok) return;
     249      const { items } = await r.json();
     250      list.replaceChildren();
     251      // De server geeft nieuwste eerst; een gesprek lees je oudste eerst.
     252      [...items].reverse().forEach((m) => {
     253        const b = el('div', `bubble ${m.dir}${m.wave ? ' wave' : ''}`);
     254        const body = el('div', 'body');
     255        body.innerHTML = m.bodyHtml || '';
     256        b.append(body, el('span', 'when', m.whenText || ''));
     257        list.append(b);
     258      });
     259      list.scrollTop = list.scrollHeight;
     260    } catch { /* volgende poll probeert opnieuw */ }
     261  }
     262
     263  function openThread(c) {
     264    openWith = c;
     265    document.getElementById('thread-name').textContent = c.name;
     266    thread.hidden = false;
     267    loadThread();
     268    // Pollen zolang het gesprek open staat: eenvoudig en zuinig genoeg.
     269    // Een socket kan later; het ritme van een gesprek is geen milliseconde.
     270    clearInterval(pollTimer);
     271    pollTimer = setInterval(loadThread, 8000);
     272  }
     273
     274  function closeThread() {
     275    openWith = null;
     276    thread.hidden = true;
     277    clearInterval(pollTimer);
     278  }
     279  document.getElementById('thread-close').addEventListener('click', closeThread);
     280  document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && openWith) closeThread(); });
     281
     282  document.getElementById('thread-form').addEventListener('submit', async (e) => {
     283    e.preventDefault();
     284    const input = document.getElementById('thread-text');
     285    const text = input.value.trim();
     286    if (!text || !openWith) return;
     287    input.value = '';
     288    await sendMessage(openWith.uri, text, false);
     289    loadThread();
     290  });
     291
     292  async function sendMessage(to, text, wave) {
     293    try {
     294      const r = await fetch('/ward/api/message', {
     295        method: 'POST',
     296        headers: { 'Content-Type': 'application/json' },
     297        body: JSON.stringify({ to, text, wave }),
     298      });
     299      return r.ok;
     300    } catch { return false; }
     301  }
     302
     303  /* ── De zwaai-hand (§5) ────────────────────────────────────────────────
     304     Dezelfde hoek als de boei, en ze wisselen elkaar af met de stand: met de
     305     kaarten verdwijnt de boei, op de hemel hangt de hand. Slepen op een
     306     gezicht opent het paneel; de tekst die je kiest IS het bericht. */
     307  const hand = document.getElementById('hand');
     308  const waveDlg = document.getElementById('wave-dialog');
     309  let waveTarget = null;
     310
     311  (() => {
     312    let dragging = false, dx = 0, dy = 0;
     313    hand.addEventListener('pointerdown', (e) => {
     314      dragging = true;
     315      hand.setPointerCapture(e.pointerId);
     316      const r = hand.getBoundingClientRect();
     317      dx = e.clientX - r.left; dy = e.clientY - r.top;
     318      hand.classList.add('dragging');
     319    });
     320    hand.addEventListener('pointermove', (e) => {
     321      if (!dragging) return;
     322      hand.style.left = `${e.clientX - dx}px`;
     323      hand.style.top = `${e.clientY - dy}px`;
     324      hand.style.right = 'auto'; hand.style.bottom = 'auto';
     325    });
     326    const drop = (e) => {
     327      if (!dragging) return;
     328      dragging = false;
     329      hand.classList.remove('dragging');
     330      hand.style.left = hand.style.top = 'auto';
     331      hand.style.right = ''; hand.style.bottom = '';
     332      // Zelfde rekensom als een tik op de hemel: het dichtstbijzijnde gezicht
     333      // binnen bereik wint, en ernaast is bewust niets.
     334      const r = canvas.getBoundingClientRect();
     335      const hit = sky.pick(e.clientX - r.left, e.clientY - r.top);
     336      if (hit != null && convs[hit]) {
     337        waveTarget = convs[hit];
     338        document.getElementById('wave-title').textContent =
     339          state.strings.waveTo.replace('{who}', waveTarget.name);
     340        waveDlg.showModal();
     341      }
     342    };
     343    hand.addEventListener('pointerup', drop);
     344    hand.addEventListener('pointercancel', drop);
     345  })();
     346
     347  waveDlg.addEventListener('click', async (e) => {
     348    const btn = e.target.closest('button');
     349    if (!btn) return;
     350    waveDlg.close();
     351    if (btn.id === 'wave-cancel' || !waveTarget) return;
     352    const isWave = btn.dataset.wave === '1';
     353    const text = isWave ? '👋' : btn.dataset.text;
     354    if (await sendMessage(waveTarget.uri, text, isWave)) openThread(waveTarget);
    234355  });
    235356
    … …  
    244365    canvas.style.pointerEvents = on ? 'auto' : 'none';
    245366    document.body.classList.toggle('messages-mode', on);
     367    document.getElementById('buoy').hidden = on;
     368    hand.hidden = !on;
     369    if (!on) closeThread();
    246370    btn.textContent = on ? state.strings.toCards : state.strings.toSky;
    247371    btn.setAttribute('aria-pressed', String(on));
  • src/routes/ward.js

    r084b046 r5218863  
    101101      toCards: i18nT(L, 'ward.to_cards'),
    102102      skyEmpty: i18nT(L, 'ward.sky_empty'),
     103      handHint: i18nT(L, 'ward.hand_hint'),
     104      close: i18nT(L, 'ward.close'),
     105      writeHere: i18nT(L, 'ward.write_here'),
     106      send: i18nT(L, 'ward.send'),
     107      wave: i18nT(L, 'ward.wave'),
     108      waveCall: i18nT(L, 'ward.wave_call'),
     109      waveThanks: i18nT(L, 'ward.wave_thanks'),
     110      notNow: i18nT(L, 'ward.not_now'),
     111      waveTo: i18nT(L, 'ward.wave_to'),
    103112    },
    104113  };
    … …  
    254263});
    255264
     265/**
     266 * Eén gesprek, beide kanten, nieuwste eerst, met een cursor voor "meer".
     267 *
     268 * Dezelfde bron als de C2S-lezing die Shaer gebruikt (conversationHistory):
     269 * inkomend zijn de ap_mentions, uitgaand de eigen directe notes. De body komt
     270 * af van de server, net als in de feed; de client hoeft alleen bubbels te
     271 * tekenen en te weten welke kant elk bericht op wijst.
     272 */
     273router.get('/api/thread', requireAuth, (req, res) => {
     274  const site = siteForUser(req);
     275  if (!site) return res.status(404).json({ error: 'no_site' });
     276  const other = String(req.query.with || '');
     277  if (!/^https?:\/\//i.test(other)) return res.status(400).json({ error: 'with_must_be_actor_uri' });
     278  const L = resolveLang(req);
     279  const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
     280
     281  const page = AP.conversationHistory(site.slug, other, {
     282    before: req.query.before ? String(req.query.before) : null,
     283    limit: req.query.limit,
     284  });
     285  const inRefs = page.rows.filter((r) => r.direction === 'in').map((r) => r.ref);
     286  const inMap = new Map(AP.messageRowsByUri(site.slug, inRefs).map((m) => [m.object_uri, m]));
     287
     288  const items = page.rows.map((r) => {
     289    if (r.direction === 'in') {
     290      const m = inMap.get(r.ref);
     291      if (!m) return null;
     292      return {
     293        dir: 'in', id: m.object_uri,
     294        whenText: formatDateTime(m.published || m.created_at),
     295        bodyHtml: renderNoteBody(m, L),
     296        wave: !!m.wave, help: !!m.help_request,
     297      };
     298    }
     299    const n = AP.getOutboxNote(base, r.ref);
     300    if (!n) return null;
     301    return {
     302      dir: 'out', id: n.id,
     303      whenText: formatDateTime(n.published),
     304      // Eigen notes zijn door onszelf gebouwd en gesaniteerd bij het maken.
     305      bodyHtml: n.content || '',
     306      wave: n['shaer:wave'] === true,
     307    };
     308  }).filter(Boolean);
     309
     310  // Openen is lezen. De markering is optellend (maximum), dus een oud toestel
     311  // kan nooit iets weer ongelezen maken.
     312  const nieuwsteIn = items.find((i) => i.dir === 'in');
     313  if (nieuwsteIn) { try { AP.markRead(site.slug, nieuwsteIn.id); } catch { /* lezen faalt stil */ } }
     314
     315  res.json({ items, more: page.more, oldest: page.oldest });
     316});
     317
     318/**
     319 * Een bericht in een gesprek, of een zwaai (§5, shaer:wave).
     320 *
     321 * Dezelfde draad als de boei (deliverDirectNote): een direct bericht aan één
     322 * persoon, nooit een post, nooit boostbaar. De wave-vlag reist mee zodat de
     323 * andere kant hem als zwaai toont en niet als kale tekst.
     324 */
     325router.post('/api/message', requireAuth, express.json({ limit: '8kb' }), async (req, res) => {
     326  const site = siteForUser(req);
     327  if (!site) return res.status(404).json({ error: 'no_site' });
     328  const to = String(req.body?.to || '').trim();
     329  const text = String(req.body?.text || '').trim().slice(0, 2000);
     330  if (!/^https?:\/\//i.test(to)) return res.status(400).json({ error: 'to_must_be_actor_uri' });
     331  if (!text) return res.status(400).json({ error: 'empty' });
     332
     333  const sent = await Guardianship.deliverDirectNote(site, {
     334    recipients: [to],
     335    text,
     336    language: site.language || 'nl',
     337    wave: req.body?.wave === true,
     338  }).catch(() => null);
     339  if (!sent) return res.status(502).json({ error: 'not_delivered' });
     340  res.json({ ok: true });
     341});
     342
    256343function pwaAsset(rel, type) {
    257344  return (req, res) => {
  • src/services/i18n.js

    r084b046 r5218863  
    6767    'admin.b_paid': 'Betaalde posts', 'admin.b_push': 'Notificaties', 'admin.back': 'Terug naar Beheer',
    6868    'push.t': 'Notificaties', 'push.intro': 'Krijg een melding op dit apparaat bij nieuwe volgers, reacties en berichten, ook als de site niet open staat. Versleuteld tot in je browser; wij sturen zo min mogelijk inhoud mee.', 'push.unavailable': 'Push is op deze server niet beschikbaar (sleutel kon niet worden aangemaakt of de dependency ontbreekt).', 'push.unsupported': 'Deze browser ondersteunt geen push-notificaties.', 'push.ios_hint': 'Op iPhone/iPad werkt dit alleen als de site op je beginscherm staat: deel-knop, dan "Zet op beginscherm", en open de site daarna vanaf daar.', 'push.this_device': 'Dit apparaat:', 'push.checking': 'controleren…', 'push.state_on': 'meldingen staan aan', 'push.state_off': 'meldingen staan uit', 'push.state_denied': 'geblokkeerd in de browserinstellingen', 'push.state_unknown': 'status onbekend', 'push.state_unsupported': 'niet ondersteund', 'push.enable': 'Zet aan op dit apparaat', 'push.disable': 'Zet uit', 'push.test': 'Stuur testmelding', 'push.what': 'Waarvoor wil je een melding?', 'push.a_follow': 'Nieuwe volger', 'push.a_reply': 'Reactie of vermelding', 'push.a_like': 'Waardering (ster)', 'push.a_boost': 'Boost', 'push.a_dm': 'Privébericht', 'push.saved': 'Opgeslagen.', 'push.devices': 'Gekoppelde apparaten', 'push.device': 'Apparaat', 'push.since': 'sinds', 'push.remove': 'Verwijder', 'push.enable_failed': 'aanzetten mislukt', 'push.on_short': 'Word supporter',
    69     'push.n_follow_t': 'Nieuwe volger', 'push.n_follow_b': '{who} volgt je nu', 'push.n_reply_t': 'Reactie op "{title}"', 'push.n_mention_t': 'Vermelding', 'push.n_dm_t': 'Privébericht', 'push.n_dm_b': 'Nieuw bericht van {who}', 'push.n_like_t': 'Nieuwe waardering', 'push.n_like_b': '{who} waardeerde "{title}"', 'push.n_boost_t': 'Geboost', 'push.n_boost_b': '{who} boostte "{title}"', 'msg.guard_offer': 'wil je guardian worden. Bespreek dit met je ouders of verzorgers voordat je beslist.', 'msg.guard_accept': 'Accepteer', 'msg.guard_reject': 'Weiger', 'msg.guard_accepted': 'Guardian geaccepteerd. Jullie zijn nu verbonden.', 'msg.guard_rejected': 'Aanvraag geweigerd.', 'msg.guard_failed': 'Dat lukte niet; probeer het opnieuw.', 'msg.guardians_label': 'Jouw guardians', 'msg.waved_at_you': 'zwaaide naar je', 'msg.help_request': 'vroeg om hulp', 'msg.g_available': 'beschikbaar', 'msg.g_away': 'afwezig tot {date}', 'msg.g_offline': 'offline', 'msg.wave_r1': 'Wat leuk!', 'msg.wave_r2': 'Bel me even', 'msg.wave_back': '👋 Terug', 'msg.wave_sent': 'Zwaai verstuurd.', 'msg.reply_sent': 'Antwoord verstuurd.', 'msg.reply_failed': 'Het antwoord kon niet verstuurd worden.', 'msg.reply_empty': 'Een leeg antwoord versturen kan niet.', 'guardian.feed_title': 'Van je wards', 'guardian.feed_sub': 'Meelezen met wat je wards plaatsen. Alleen kijken.', 'guardian.follow_title': 'Volgverzoeken', 'guardian.follow_sub': 'Iemand wil een van je wards volgen. Jij beslist.', 'guardian.wave': '👋 Zwaai', 'guardian.waved': '👋 verstuurd', 'ward.feed': 'Van je vrienden', 'ward.feed_empty': 'Nog niets. Volg iemand, dan verschijnt het hier.', 'ward.buoy_hint': 'Sleep de reddingsboei op een bericht om je guardians erbij te halen.', 'ward.help_words': 'Wil je er iets bij zeggen?', 'ward.help_send': 'Stuur naar mijn guardians', 'ward.help_sent': 'Je guardians zijn op de hoogte.', 'ward.cancel': 'Annuleren', 'ward.to_sky': 'Berichten', 'ward.to_cards': 'Kaarten', 'ward.sky_empty': 'Nog geen gesprekken. Schrijf iemand, of laat je schrijven.', 'ward.app_name': 'Klonkt Ward', 'ward.guardians': 'Wie over jou waakt', 'ward.no_guardians': 'Je hebt nog geen guardians.', 'ward.offers': 'Aanvragen', 'ward.waiting': 'Wacht op je guardians', 'ward.help': 'Ik heb hulp nodig', 'guardian.app_name': 'Klonkt Guardian', 'guardian.tagline': 'Wards beheren en hulpverzoeken opvangen.', 'guardian.acting_as': 'Je handelt als', 'guardian.help_title': 'Hulpverzoeken', 'guardian.help_sub': 'Als een ward de reddingsboei gebruikt, verschijnt het hier.', 'guardian.help_empty': 'Geen hulpverzoeken. Mooi zo.', 'guardian.adopt_title': 'Ward adopteren', 'guardian.adopt_sub': 'Vul de handle van het kind in (@kind@server.eu). Ze krijgen een aanvraag in hun Klonkt die ze accepteren.', 'guardian.adopt_label': 'Handle van de ward', 'guardian.adopt_btn': 'Verstuur aanvraag', 'guardian.pending_title': 'Verzonden aanvragen', 'guardian.pending_sub': 'Wacht tot de ward accepteert.', 'guardian.wards_title': 'Mijn wards', 'guardian.play_propose': 'Afspelen voorstellen', 'guardian.play_on': 'Afspelen: aan', 'guardian.play_off': 'Afspelen: uit', 'guardian.gated_title': 'Instelling voorgesteld', 'guardian.gated_line_on': '{who} wil linkvoorbeelden AANzetten voor {ward}.', 'guardian.gated_line_off': '{who} wil linkvoorbeelden UITzetten voor {ward}.', 'guardian.gated_agree': 'Eens', 'guardian.gated_disagree': 'Oneens', 'guardian.avail_available': 'Beschikbaar', 'guardian.avail_away': 'Afwezig tot {date}', 'guardian.avail_dormant': 'Offline', 'guardian.panel_guards': 'Guardians van dit kind', 'guardian.panel_guards_remote': 'Dit kind woont op een andere server; de beschikbaarheid wordt daar bijgehouden.', 'guardian.lapse_propose': 'Voorstel: loslaten bij afwezigheid', 'guardian.lapse_line': '{who} antwoordt niet meer als guardian van {ward}.', 'guardian.lapse_tally': '{n} van {need} akkoord; sluit {date}; het venster loopt altijd vol.', 'guardian.lapse_note': 'Elk teken van leven van hen annuleert dit meteen. Niets hier is straf.', 'guardian.lapse_agree': 'Eens', 'guardian.lapse_disagree': 'Oneens', 'guardian.voted': 'Je hebt gestemd', 'guardian.away_title': 'Even afwezig', 'guardian.away_sub': 'Meld je wards dat je er even niet bent. Besluiten wachten niet op je, en een enkel antwoord brengt je meteen terug.', 'guardian.away_week': 'Een week', 'guardian.away_month': 'Een maand', 'guardian.away_done': 'Je wards weten dat je afwezig bent tot {date}.', 'guardian.away_msg': 'Ik ben afwezig als je guardian tot {date}. Je andere guardians zijn er voor je.', 'guardian.release_title': '{who} loslaten?', 'guardian.release_effect': 'Je stopt als guardian. Je ziet hun berichten niet meer, je krijgt geen hulpvragen meer van ze, en je beoordeelt geen volgverzoeken meer voor ze. Terugkomen kan alleen met een nieuwe aanvraag die zij accepteren.', 'guardian.release_local': 'Hun server en de andere guardians krijgen dit door, dus daarna sta jij ook bij hen niet meer als guardian.', 'guardian.release_step_down': 'Zij houden hun andere guardians, dus zij blijven een ward.', 'guardian.release_last': 'Je bent hun laatste guardian. Dat is emancipatie, en volgens FEP-633c 3.4 is dat niet aan een guardian alleen: daar horen drie instemmende volwassenen bij, of een meerderheid met twee getuigen. Deze knop kan dat dus niet: je blijft hun guardian tot dat geregeld is.', 'guardian.release_unknown': 'We konden hun server niet bereiken, dus we weten niet of jij hun laatste guardian bent.', 'guardian.release_yes': 'Ja, loslaten', 'guardian.release_no': 'Nee, toch niet', 'guardian.settings_title': 'Instellingen', 'guardian.panel_open': 'Bekijken', 'guardian.panel_close': 'Sluiten', 'guardian.panel_help': 'Hulpvragen van dit kind', 'guardian.panel_help_empty': 'Nog geen hulpvragen.', 'guardian.panel_follow': 'Volgverzoeken', 'guardian.follow_out_line': 'wil {who} volgen', 'guardian.panel_follow_empty': 'Geen openstaande volgverzoeken.', 'guardian.panel_posts': 'Recente berichten', 'guardian.panel_posts_empty': 'Nog niets te zien.', 'guardian.panel_actions': 'Acties', 'guardian.badge_help': 'hulpvragen', 'guardian.badge_follow': 'volgverzoeken', 'guardian.badge_follow_one': 'volgverzoek', 'guardian.wards_empty': 'Nog geen wards. Adopteer er hierboven een.', 'guardian.push_title': 'Meldingen', 'guardian.push_sub': 'Ontvang een melding bij een hulpverzoek of voogdij-antwoord, ook als de app dicht is.', 'guardian.push_on': 'Zet meldingen aan', 'guardian.push_off': 'Meldingen staan aan; tik om uit te zetten', 'guardian.sent': 'Aanvraag verstuurd. Zie hieronder bij Verzonden aanvragen.', 'guardian.sent_retry': 'Aanvraag opgeslagen; we blijven proberen te bezorgen.', 'guardian.sending': 'Versturen…', 'guardian.not_found': 'Die handle konden we niet vinden.', 'guardian.failed': 'Mislukt', 'guardian.network': 'Netwerkfout.', 'guardian.pending': 'wacht op antwoord', 'guardian.active': 'actief', 'guardian.retract': 'Intrekken', 'guardian.release': 'Loslaten', 'guardian.embeds_on': 'Linkvoorbeelden: aan', 'guardian.embeds_off': 'Linkvoorbeelden: uit', 'guardian.embeds_propose': 'Linkvoorbeelden voorstellen', 'guardian.embeds_waiting': 'wacht op de andere guardians', 'guardian.prop_line': 'Voorstel {what} {value}: {status}', 'guardian.prop_embeds': 'linkvoorbeelden', 'guardian.prop_play': 'afspelen', 'guardian.prop_on': 'aan', 'guardian.prop_off': 'uit', 'guardian.prop_st_open': 'wacht op de andere guardians', 'guardian.prop_st_accepted': 'aangenomen', 'guardian.prop_st_rejected': 'afgewezen', 'guardian.prop_st_expired': 'verlopen zonder genoeg stemmen', 'guardian.panel_guards_far': 'Beschikbaarheid wordt op hun server bijgehouden.', 'guardian.release_confirm': '{who} loslaten?\n\nJe stopt dan als guardian. Je ziet hun berichten niet meer, je krijgt geen hulpverzoeken meer van ze, en je kunt volgverzoeken niet meer voor ze beoordelen.\n\nTerugkomen kan alleen met een nieuwe aanvraag die zij accepteren.', 'guardian.open': 'open', 'guardian.accept': 'Accepteer', 'guardian.reject': 'Weiger', 'guardian.complete': 'Voltooien', 'guardian.awaiting_others': 'wacht op de andere partijen', 'guardian.coguard': 'mede-voogdij-aanvraag', 'guardian.push_unavailable': 'Push niet beschikbaar', 'push.n_help_t': 'Hulpvraag', 'push.n_help_b': '{who} vraagt om je hulp', 'push.n_guard_offer_t': 'Voogdij-aanvraag', 'push.n_guard_offer_b': '{who} wil je guardian worden', 'push.n_guard_ward_t': 'Ward geaccepteerd', 'push.n_guard_left_t': 'Een guardian is gestopt', 'push.n_guard_left_b': '{who} is niet langer je guardian', 'push.n_guard_cogleft_t': 'Mede-guardian gestopt', 'push.n_guard_cogleft_b': '{who} heeft de guardianship beeindigd', 'push.n_guard_ward_b': '{who} accepteerde je als guardian', 'push.n_guard_cog_t': 'Mede-voogdij gevraagd', 'push.n_guard_cog_b': 'Er is een guardian-aanvraag voor {who}', 'push.n_guard_folin_t': 'Volgverzoek', 'push.n_guard_folin_b': '{who} wil {ward} volgen', 'push.n_guard_folout_t': 'Je ward wil iemand volgen', 'push.n_guard_folout_b': '{ward} vraagt of het {who} mag volgen', 'guardian.panel_history': 'Geschiedenis ({n})', 'guardian.log_show': 'Toon geschiedenis', 'guardian.log_hide': 'Verberg geschiedenis', 'guardian.ev_offer_rejected': 'Aanbod afgewezen', 'guardian.ev_offer_refused': 'Aanbod geweigerd', 'guardian.ev_committed': 'Guardianship vastgelegd', 'guardian.ev_guardian_left': 'Guardian gestopt', 'guardian.ev_coguardian_left': 'Mede-guardian gestopt', 'guardian.ev_gated_outcome': 'Poort besloten', 'guardian.ev_lapse_opened': 'Vrijgave voorgesteld', 'guardian.evr_not_a_teapot': 'de kandidaat is zelf een ward', 'guardian.help_archive': '{n} afgehandeld', 'guardian.help_archive_hide': 'verbergen', 'guardian.help_former_ward': 'Niet meer jouw ward. Hun andere guardians zijn er nog voor ze.', 'guardian.warn_reversible': 'Wat hier doorheen komt, komt niet meer terug. Je kunt deze instelling later weer dichtzetten — wat je kind gezien heeft niet.', 'guardian.warn_irreversible': 'Dit is niet terug te draaien. Hierna beslist zij het zelf, en jullie kunnen dat niet meer terugnemen.', 'guardian.warn_unknown': 'Wij kennen deze instelling niet, dus we weten niet wat er doorheen komt of hoe ver het reikt. Vraag het degene die het voorstelde voordat je ja zegt.', 'guardian.warn_decides': 'JOUW ANTWOORD BESLIST DIT. Met jou erbij is de drempel gehaald en gaat het meteen in.', 'guardian.warn_not_last': 'Er moet daarna nog iemand antwoorden voordat dit ingaat.', 'guardian.warn_tally_elsewhere': 'Hoeveel guardians al geantwoord hebben zien wij niet — dat telt de server van het kind. Jouw ja kan de doorslag geven.', 'guardian.warn_go': 'Ja, stel dit voor', 'guardian.warn_back': 'Nee, toch niet', 'guardian.help_pick': 'Ik kijk hiernaar', 'guardian.help_close': 'Markeer als afgehandeld', 'guardian.help_picked_by': '{who} kijkt hiernaar', 'guardian.help_handled_by': 'Afgehandeld door {who}', 'guardian.help_handled_note': 'Dit blijft staan. Leeft de vraag nog, dan stelt het kind hem opnieuw.', 'guardian.help_close_ask': 'Weet je het zeker? Dit is niet terug te draaien. Speelt het toch nog, dan vraagt het kind opnieuw om hulp.', 'guardian.help_close_yes': 'Ja, afgehandeld', 'guardian.help_just_now': 'zojuist', 'guardian.help_hours': '{n} uur geleden', 'guardian.help_days': '{n} dagen geleden', 'guardian.gate_unavailable': 'nog niet beschikbaar', 'guardian.gate_planned_note': 'Dit bestaat nog niet op deze server.', 'guardian.gates_summary': '{n} poorten - {on} aan, {wait} wachten', 'guardian.gates_show': 'Toon poorten', 'guardian.gates_hide': 'Verberg poorten', 'guardian.gate_images': 'Plaatjes', 'guardian.gate_messages': 'Berichten', 'guardian.gate_asked': 'Je kind vroeg hier zelf om.', 'guardian.gate_replies': 'Antwoorden in een gesprek', 'guardian.gate_compose': 'Zelf posten', 'guardian.gate_music': 'Muziek', 'guardian.gate_quoteCards': 'Quote-kaarten', 'guardian.gate_customEmoji': 'Eigen emoji', 'guardian.gate_publicProfile': 'Publiek zichtbaar', 'guardian.gate_accountMove': 'Verhuizen', 'guardian.gate_independence': 'Zelfstandig worden', 'guardian.gate_externalThreads': 'Reacties van onbekenden', 'guardian.gate_externalEmbeds': 'Linkvoorbeelden', 'guardian.gate_externalPlayback': 'Afspelen in de app', 'guardian.gate_follows': 'Volgverzoeken', 'guardian.gate_following': 'Zelf iemand volgen', 'guardian.gate_kind_setting': 'stand', 'guardian.gate_kind_perRequest': 'per verzoek', 'guardian.gate_kind_handover': 'draagt gezag over', 'guardian.gate_default_off': 'uit (nog niets over besloten)', 'guardian.gate_unknown': 'onbekend', 'guardian.gate_always': 'Altijd', 'guardian.gate_threshold': '{need} van {of} guardians', 'guardian.gate_threshold_unknown': 'drempel onbekend (ander domein)', 'guardian.gate_irreversible': 'niet terug te draaien', 'guardian.gate_waiting': '{n} wacht op jullie', 'guardian.gate_blocked': 'kan pas als {what} aanstaat', 'guardian.gate_propose_open': 'Voorstellen: openzetten', 'guardian.gate_propose_close': 'Voorstellen: dichtzetten', 'guardian.gate_propose': 'Voorstellen', 'push.n_gate_ask_t': 'Je antwoord is nodig', 'push.n_gate_ask_b': 'Voorstel voor {who}: {wat} {stand}', 'push.n_gate_done_t': 'Besluit genomen', 'push.n_gate_done_b': '{wat} {stand} voor {who}: {uitkomst}', 'push.n_test_t': 'Klonkt-testnotificatie', 'push.n_test_b': 'Werkt. Zo komen meldingen binnen op dit apparaat.',
     69    'push.n_follow_t': 'Nieuwe volger', 'push.n_follow_b': '{who} volgt je nu', 'push.n_reply_t': 'Reactie op "{title}"', 'push.n_mention_t': 'Vermelding', 'push.n_dm_t': 'Privébericht', 'push.n_dm_b': 'Nieuw bericht van {who}', 'push.n_like_t': 'Nieuwe waardering', 'push.n_like_b': '{who} waardeerde "{title}"', 'push.n_boost_t': 'Geboost', 'push.n_boost_b': '{who} boostte "{title}"', 'msg.guard_offer': 'wil je guardian worden. Bespreek dit met je ouders of verzorgers voordat je beslist.', 'msg.guard_accept': 'Accepteer', 'msg.guard_reject': 'Weiger', 'msg.guard_accepted': 'Guardian geaccepteerd. Jullie zijn nu verbonden.', 'msg.guard_rejected': 'Aanvraag geweigerd.', 'msg.guard_failed': 'Dat lukte niet; probeer het opnieuw.', 'msg.guardians_label': 'Jouw guardians', 'msg.waved_at_you': 'zwaaide naar je', 'msg.help_request': 'vroeg om hulp', 'msg.g_available': 'beschikbaar', 'msg.g_away': 'afwezig tot {date}', 'msg.g_offline': 'offline', 'msg.wave_r1': 'Wat leuk!', 'msg.wave_r2': 'Bel me even', 'msg.wave_back': '👋 Terug', 'msg.wave_sent': 'Zwaai verstuurd.', 'msg.reply_sent': 'Antwoord verstuurd.', 'msg.reply_failed': 'Het antwoord kon niet verstuurd worden.', 'msg.reply_empty': 'Een leeg antwoord versturen kan niet.', 'guardian.feed_title': 'Van je wards', 'guardian.feed_sub': 'Meelezen met wat je wards plaatsen. Alleen kijken.', 'guardian.follow_title': 'Volgverzoeken', 'guardian.follow_sub': 'Iemand wil een van je wards volgen. Jij beslist.', 'guardian.wave': '👋 Zwaai', 'guardian.waved': '👋 verstuurd', 'ward.feed': 'Van je vrienden', 'ward.feed_empty': 'Nog niets. Volg iemand, dan verschijnt het hier.', 'ward.buoy_hint': 'Sleep de reddingsboei op een bericht om je guardians erbij te halen.', 'ward.help_words': 'Wil je er iets bij zeggen?', 'ward.help_send': 'Stuur naar mijn guardians', 'ward.help_sent': 'Je guardians zijn op de hoogte.', 'ward.cancel': 'Annuleren', 'ward.to_sky': 'Berichten', 'ward.to_cards': 'Kaarten', 'ward.sky_empty': 'Nog geen gesprekken. Schrijf iemand, of laat je schrijven.', 'ward.hand_hint': 'Sleep de hand op een gezicht om te zwaaien.', 'ward.close': 'Terug', 'ward.write_here': 'Schrijf iets...', 'ward.send': 'Stuur', 'ward.wave': 'Zwaai', 'ward.wave_call': 'Bel me even', 'ward.wave_thanks': 'Dank je!', 'ward.not_now': 'Nu even niet', 'ward.wave_to': 'Zwaaien naar {who}?', 'ward.app_name': 'Klonkt Ward', 'ward.guardians': 'Wie over jou waakt', 'ward.no_guardians': 'Je hebt nog geen guardians.', 'ward.offers': 'Aanvragen', 'ward.waiting': 'Wacht op je guardians', 'ward.help': 'Ik heb hulp nodig', 'guardian.app_name': 'Klonkt Guardian', 'guardian.tagline': 'Wards beheren en hulpverzoeken opvangen.', 'guardian.acting_as': 'Je handelt als', 'guardian.help_title': 'Hulpverzoeken', 'guardian.help_sub': 'Als een ward de reddingsboei gebruikt, verschijnt het hier.', 'guardian.help_empty': 'Geen hulpverzoeken. Mooi zo.', 'guardian.adopt_title': 'Ward adopteren', 'guardian.adopt_sub': 'Vul de handle van het kind in (@kind@server.eu). Ze krijgen een aanvraag in hun Klonkt die ze accepteren.', 'guardian.adopt_label': 'Handle van de ward', 'guardian.adopt_btn': 'Verstuur aanvraag', 'guardian.pending_title': 'Verzonden aanvragen', 'guardian.pending_sub': 'Wacht tot de ward accepteert.', 'guardian.wards_title': 'Mijn wards', 'guardian.play_propose': 'Afspelen voorstellen', 'guardian.play_on': 'Afspelen: aan', 'guardian.play_off': 'Afspelen: uit', 'guardian.gated_title': 'Instelling voorgesteld', 'guardian.gated_line_on': '{who} wil linkvoorbeelden AANzetten voor {ward}.', 'guardian.gated_line_off': '{who} wil linkvoorbeelden UITzetten voor {ward}.', 'guardian.gated_agree': 'Eens', 'guardian.gated_disagree': 'Oneens', 'guardian.avail_available': 'Beschikbaar', 'guardian.avail_away': 'Afwezig tot {date}', 'guardian.avail_dormant': 'Offline', 'guardian.panel_guards': 'Guardians van dit kind', 'guardian.panel_guards_remote': 'Dit kind woont op een andere server; de beschikbaarheid wordt daar bijgehouden.', 'guardian.lapse_propose': 'Voorstel: loslaten bij afwezigheid', 'guardian.lapse_line': '{who} antwoordt niet meer als guardian van {ward}.', 'guardian.lapse_tally': '{n} van {need} akkoord; sluit {date}; het venster loopt altijd vol.', 'guardian.lapse_note': 'Elk teken van leven van hen annuleert dit meteen. Niets hier is straf.', 'guardian.lapse_agree': 'Eens', 'guardian.lapse_disagree': 'Oneens', 'guardian.voted': 'Je hebt gestemd', 'guardian.away_title': 'Even afwezig', 'guardian.away_sub': 'Meld je wards dat je er even niet bent. Besluiten wachten niet op je, en een enkel antwoord brengt je meteen terug.', 'guardian.away_week': 'Een week', 'guardian.away_month': 'Een maand', 'guardian.away_done': 'Je wards weten dat je afwezig bent tot {date}.', 'guardian.away_msg': 'Ik ben afwezig als je guardian tot {date}. Je andere guardians zijn er voor je.', 'guardian.release_title': '{who} loslaten?', 'guardian.release_effect': 'Je stopt als guardian. Je ziet hun berichten niet meer, je krijgt geen hulpvragen meer van ze, en je beoordeelt geen volgverzoeken meer voor ze. Terugkomen kan alleen met een nieuwe aanvraag die zij accepteren.', 'guardian.release_local': 'Hun server en de andere guardians krijgen dit door, dus daarna sta jij ook bij hen niet meer als guardian.', 'guardian.release_step_down': 'Zij houden hun andere guardians, dus zij blijven een ward.', 'guardian.release_last': 'Je bent hun laatste guardian. Dat is emancipatie, en volgens FEP-633c 3.4 is dat niet aan een guardian alleen: daar horen drie instemmende volwassenen bij, of een meerderheid met twee getuigen. Deze knop kan dat dus niet: je blijft hun guardian tot dat geregeld is.', 'guardian.release_unknown': 'We konden hun server niet bereiken, dus we weten niet of jij hun laatste guardian bent.', 'guardian.release_yes': 'Ja, loslaten', 'guardian.release_no': 'Nee, toch niet', 'guardian.settings_title': 'Instellingen', 'guardian.panel_open': 'Bekijken', 'guardian.panel_close': 'Sluiten', 'guardian.panel_help': 'Hulpvragen van dit kind', 'guardian.panel_help_empty': 'Nog geen hulpvragen.', 'guardian.panel_follow': 'Volgverzoeken', 'guardian.follow_out_line': 'wil {who} volgen', 'guardian.panel_follow_empty': 'Geen openstaande volgverzoeken.', 'guardian.panel_posts': 'Recente berichten', 'guardian.panel_posts_empty': 'Nog niets te zien.', 'guardian.panel_actions': 'Acties', 'guardian.badge_help': 'hulpvragen', 'guardian.badge_follow': 'volgverzoeken', 'guardian.badge_follow_one': 'volgverzoek', 'guardian.wards_empty': 'Nog geen wards. Adopteer er hierboven een.', 'guardian.push_title': 'Meldingen', 'guardian.push_sub': 'Ontvang een melding bij een hulpverzoek of voogdij-antwoord, ook als de app dicht is.', 'guardian.push_on': 'Zet meldingen aan', 'guardian.push_off': 'Meldingen staan aan; tik om uit te zetten', 'guardian.sent': 'Aanvraag verstuurd. Zie hieronder bij Verzonden aanvragen.', 'guardian.sent_retry': 'Aanvraag opgeslagen; we blijven proberen te bezorgen.', 'guardian.sending': 'Versturen…', 'guardian.not_found': 'Die handle konden we niet vinden.', 'guardian.failed': 'Mislukt', 'guardian.network': 'Netwerkfout.', 'guardian.pending': 'wacht op antwoord', 'guardian.active': 'actief', 'guardian.retract': 'Intrekken', 'guardian.release': 'Loslaten', 'guardian.embeds_on': 'Linkvoorbeelden: aan', 'guardian.embeds_off': 'Linkvoorbeelden: uit', 'guardian.embeds_propose': 'Linkvoorbeelden voorstellen', 'guardian.embeds_waiting': 'wacht op de andere guardians', 'guardian.prop_line': 'Voorstel {what} {value}: {status}', 'guardian.prop_embeds': 'linkvoorbeelden', 'guardian.prop_play': 'afspelen', 'guardian.prop_on': 'aan', 'guardian.prop_off': 'uit', 'guardian.prop_st_open': 'wacht op de andere guardians', 'guardian.prop_st_accepted': 'aangenomen', 'guardian.prop_st_rejected': 'afgewezen', 'guardian.prop_st_expired': 'verlopen zonder genoeg stemmen', 'guardian.panel_guards_far': 'Beschikbaarheid wordt op hun server bijgehouden.', 'guardian.release_confirm': '{who} loslaten?\n\nJe stopt dan als guardian. Je ziet hun berichten niet meer, je krijgt geen hulpverzoeken meer van ze, en je kunt volgverzoeken niet meer voor ze beoordelen.\n\nTerugkomen kan alleen met een nieuwe aanvraag die zij accepteren.', 'guardian.open': 'open', 'guardian.accept': 'Accepteer', 'guardian.reject': 'Weiger', 'guardian.complete': 'Voltooien', 'guardian.awaiting_others': 'wacht op de andere partijen', 'guardian.coguard': 'mede-voogdij-aanvraag', 'guardian.push_unavailable': 'Push niet beschikbaar', 'push.n_help_t': 'Hulpvraag', 'push.n_help_b': '{who} vraagt om je hulp', 'push.n_guard_offer_t': 'Voogdij-aanvraag', 'push.n_guard_offer_b': '{who} wil je guardian worden', 'push.n_guard_ward_t': 'Ward geaccepteerd', 'push.n_guard_left_t': 'Een guardian is gestopt', 'push.n_guard_left_b': '{who} is niet langer je guardian', 'push.n_guard_cogleft_t': 'Mede-guardian gestopt', 'push.n_guard_cogleft_b': '{who} heeft de guardianship beeindigd', 'push.n_guard_ward_b': '{who} accepteerde je als guardian', 'push.n_guard_cog_t': 'Mede-voogdij gevraagd', 'push.n_guard_cog_b': 'Er is een guardian-aanvraag voor {who}', 'push.n_guard_folin_t': 'Volgverzoek', 'push.n_guard_folin_b': '{who} wil {ward} volgen', 'push.n_guard_folout_t': 'Je ward wil iemand volgen', 'push.n_guard_folout_b': '{ward} vraagt of het {who} mag volgen', 'guardian.panel_history': 'Geschiedenis ({n})', 'guardian.log_show': 'Toon geschiedenis', 'guardian.log_hide': 'Verberg geschiedenis', 'guardian.ev_offer_rejected': 'Aanbod afgewezen', 'guardian.ev_offer_refused': 'Aanbod geweigerd', 'guardian.ev_committed': 'Guardianship vastgelegd', 'guardian.ev_guardian_left': 'Guardian gestopt', 'guardian.ev_coguardian_left': 'Mede-guardian gestopt', 'guardian.ev_gated_outcome': 'Poort besloten', 'guardian.ev_lapse_opened': 'Vrijgave voorgesteld', 'guardian.evr_not_a_teapot': 'de kandidaat is zelf een ward', 'guardian.help_archive': '{n} afgehandeld', 'guardian.help_archive_hide': 'verbergen', 'guardian.help_former_ward': 'Niet meer jouw ward. Hun andere guardians zijn er nog voor ze.', 'guardian.warn_reversible': 'Wat hier doorheen komt, komt niet meer terug. Je kunt deze instelling later weer dichtzetten — wat je kind gezien heeft niet.', 'guardian.warn_irreversible': 'Dit is niet terug te draaien. Hierna beslist zij het zelf, en jullie kunnen dat niet meer terugnemen.', 'guardian.warn_unknown': 'Wij kennen deze instelling niet, dus we weten niet wat er doorheen komt of hoe ver het reikt. Vraag het degene die het voorstelde voordat je ja zegt.', 'guardian.warn_decides': 'JOUW ANTWOORD BESLIST DIT. Met jou erbij is de drempel gehaald en gaat het meteen in.', 'guardian.warn_not_last': 'Er moet daarna nog iemand antwoorden voordat dit ingaat.', 'guardian.warn_tally_elsewhere': 'Hoeveel guardians al geantwoord hebben zien wij niet — dat telt de server van het kind. Jouw ja kan de doorslag geven.', 'guardian.warn_go': 'Ja, stel dit voor', 'guardian.warn_back': 'Nee, toch niet', 'guardian.help_pick': 'Ik kijk hiernaar', 'guardian.help_close': 'Markeer als afgehandeld', 'guardian.help_picked_by': '{who} kijkt hiernaar', 'guardian.help_handled_by': 'Afgehandeld door {who}', 'guardian.help_handled_note': 'Dit blijft staan. Leeft de vraag nog, dan stelt het kind hem opnieuw.', 'guardian.help_close_ask': 'Weet je het zeker? Dit is niet terug te draaien. Speelt het toch nog, dan vraagt het kind opnieuw om hulp.', 'guardian.help_close_yes': 'Ja, afgehandeld', 'guardian.help_just_now': 'zojuist', 'guardian.help_hours': '{n} uur geleden', 'guardian.help_days': '{n} dagen geleden', 'guardian.gate_unavailable': 'nog niet beschikbaar', 'guardian.gate_planned_note': 'Dit bestaat nog niet op deze server.', 'guardian.gates_summary': '{n} poorten - {on} aan, {wait} wachten', 'guardian.gates_show': 'Toon poorten', 'guardian.gates_hide': 'Verberg poorten', 'guardian.gate_images': 'Plaatjes', 'guardian.gate_messages': 'Berichten', 'guardian.gate_asked': 'Je kind vroeg hier zelf om.', 'guardian.gate_replies': 'Antwoorden in een gesprek', 'guardian.gate_compose': 'Zelf posten', 'guardian.gate_music': 'Muziek', 'guardian.gate_quoteCards': 'Quote-kaarten', 'guardian.gate_customEmoji': 'Eigen emoji', 'guardian.gate_publicProfile': 'Publiek zichtbaar', 'guardian.gate_accountMove': 'Verhuizen', 'guardian.gate_independence': 'Zelfstandig worden', 'guardian.gate_externalThreads': 'Reacties van onbekenden', 'guardian.gate_externalEmbeds': 'Linkvoorbeelden', 'guardian.gate_externalPlayback': 'Afspelen in de app', 'guardian.gate_follows': 'Volgverzoeken', 'guardian.gate_following': 'Zelf iemand volgen', 'guardian.gate_kind_setting': 'stand', 'guardian.gate_kind_perRequest': 'per verzoek', 'guardian.gate_kind_handover': 'draagt gezag over', 'guardian.gate_default_off': 'uit (nog niets over besloten)', 'guardian.gate_unknown': 'onbekend', 'guardian.gate_always': 'Altijd', 'guardian.gate_threshold': '{need} van {of} guardians', 'guardian.gate_threshold_unknown': 'drempel onbekend (ander domein)', 'guardian.gate_irreversible': 'niet terug te draaien', 'guardian.gate_waiting': '{n} wacht op jullie', 'guardian.gate_blocked': 'kan pas als {what} aanstaat', 'guardian.gate_propose_open': 'Voorstellen: openzetten', 'guardian.gate_propose_close': 'Voorstellen: dichtzetten', 'guardian.gate_propose': 'Voorstellen', 'push.n_gate_ask_t': 'Je antwoord is nodig', 'push.n_gate_ask_b': 'Voorstel voor {who}: {wat} {stand}', 'push.n_gate_done_t': 'Besluit genomen', 'push.n_gate_done_b': '{wat} {stand} voor {who}: {uitkomst}', 'push.n_test_t': 'Klonkt-testnotificatie', 'push.n_test_b': 'Werkt. Zo komen meldingen binnen op dit apparaat.',
    7070    'apaid.t': 'Betaalde posts', 'apaid.intro': 'Koppel je eigen Patreon-campagne. Supporters ontgrendelen betaalde posts met een passkey, zonder account en zonder cookie. Wij bewaren geen namen of e-mailadressen van supporters, alleen het versleutelde token van jouw campagne.', 'apaid.saved': 'Opgeslagen.', 'apaid.nokey': 'Let op: de encryptiesleutel kon niet worden aangemaakt of gelezen (schrijfrechten op de opslagmap?). Zonder sleutel kunnen secrets niet veilig worden opgeslagen.', 'apaid.status': 'Status:', 'apaid.connected': 'verbonden', 'apaid.campaign': 'campagne', 'apaid.configured': 'ingesteld, nog niet verbonden (vul een token in)', 'apaid.notyet': 'nog niet ingesteld', 'apaid.redirect_h': 'Zet deze redirect-URI in je Patreon-client', 'apaid.redirect_p': 'Bij je Patreon API-client, onder Redirect URIs, moet exact deze regel staan. Klopt hij niet, dan geeft Patreon een foutmelding in plaats van je supporters terug te sturen.', 'apaid.copy': 'Kopieer', 'apaid.copied': 'Gekopieerd', 'apaid.client_id': 'Patreon client id', 'apaid.client_secret': 'Patreon client secret', 'apaid.keep': 'Leeg laten = huidige waarde behouden.', 'apaid.campaign_id': 'Campagne-id', 'apaid.public_page': 'Openbare Patreon-pagina', 'apaid.public_help': 'De link waar bezoekers supporter kunnen worden. Getoond als "Word supporter" wanneer iemand nog niet doneert.', 'apaid.access': 'Creator access token', 'apaid.refresh': 'Creator refresh token', 'apaid.token_help': 'De access + refresh token krijg je op je Patreon API-clientpagina. Wij versleutelen ze en verversen automatisch.', 'apaid.min_eur': 'Standaard-steunbedrag voor een betaalde post (euro)', 'apaid.save': 'Opslaan', 'apaid.disconnect': 'Koppeling verwijderen', 'apaid.disconnect_confirm': 'Patreon-koppeling verwijderen?', 'apaid.unchanged': 'blijft ongewijzigd',
    7171    'pgate.h': 'Voor supporters', 'pgate.sub': 'Deze post is voor supporters van deze site. Word supporter en ontgrendel hem daarna met een passkey. Geen account op deze site, geen cookie.', 'pgate.sub_cents': 'Deze post is voor supporters van deze site (vanaf €{eur} per maand op Patreon). Word supporter en ontgrendel hem daarna met een passkey. Geen account op deze site, geen cookie.', 'pgate.join': 'Word supporter op Patreon', 'pgate.unlock_have': 'Al supporter? Ontgrendelen', 'pgate.unlock': 'Ontgrendelen met Patreon', 'pgate.join_short': 'Word supporter', 'pgate.confirm': 'Bevestig met je passkey…', 'pgate.failed': 'Ontgrendelen mislukt. Probeer opnieuw.', 'pgate.error': 'Er ging iets mis. Probeer opnieuw.',
    … …  
    10191019    'admin.b_paid': 'Paid posts', 'admin.b_push': 'Notifications', 'admin.back': 'Back to Admin',
    10201020    'push.t': 'Notifications', 'push.intro': 'Get a notification on this device for new followers, replies and messages, even when the site is closed. Encrypted all the way to your browser; we send as little content as possible.', 'push.unavailable': 'Push is unavailable on this server (the key could not be created or the dependency is missing).', 'push.unsupported': 'This browser does not support push notifications.', 'push.ios_hint': 'On iPhone/iPad this only works when the site is on your home screen: share button, then "Add to Home Screen", and open it from there.', 'push.this_device': 'This device:', 'push.checking': 'checking…', 'push.state_on': 'notifications are on', 'push.state_off': 'notifications are off', 'push.state_denied': 'blocked in the browser settings', 'push.state_unknown': 'status unknown', 'push.state_unsupported': 'not supported', 'push.enable': 'Turn on for this device', 'push.disable': 'Turn off', 'push.test': 'Send a test notification', 'push.what': 'What do you want to be notified about?', 'push.a_follow': 'New follower', 'push.a_reply': 'Reply or mention', 'push.a_like': 'Like (star)', 'push.a_boost': 'Boost', 'push.a_dm': 'Private message', 'push.saved': 'Saved.', 'push.devices': 'Linked devices', 'push.device': 'Device', 'push.since': 'since', 'push.remove': 'Remove', 'push.enable_failed': 'turning on failed',
    1021     'push.n_follow_t': 'New follower', 'push.n_follow_b': '{who} now follows you', 'push.n_reply_t': 'Reply to "{title}"', 'push.n_mention_t': 'Mention', 'push.n_dm_t': 'Private message', 'push.n_dm_b': 'New message from {who}', 'push.n_like_t': 'New like', 'push.n_like_b': '{who} liked "{title}"', 'push.n_boost_t': 'Boosted', 'push.n_boost_b': '{who} boosted "{title}"', 'msg.guard_offer': 'wants to become your guardian. Talk this over with your parents or carers before you decide.', 'msg.guard_accept': 'Accept', 'msg.guard_reject': 'Reject', 'msg.guard_accepted': 'Guardian accepted. You are now connected.', 'msg.guard_rejected': 'Offer rejected.', 'msg.guard_failed': 'That did not work; try again.', 'msg.guardians_label': 'Your guardians', 'msg.waved_at_you': 'waved at you', 'msg.help_request': 'asked for help', 'msg.g_available': 'available', 'msg.g_away': 'unavailable till {date}', 'msg.g_offline': 'offline', 'msg.wave_r1': 'Lovely!', 'msg.wave_r2': 'Call me', 'msg.wave_back': '👋 Back', 'msg.wave_sent': 'Wave sent.', 'msg.reply_sent': 'Reply sent.', 'msg.reply_failed': 'The reply could not be sent.', 'msg.reply_empty': 'An empty reply cannot be sent.', 'guardian.feed_title': 'Your wards', 'guardian.feed_sub': 'Read along with what your wards post. Watch only.', 'guardian.follow_title': 'Follow requests', 'guardian.follow_sub': 'Someone wants to follow one of your wards. You decide.', 'guardian.wave': '👋 Wave', 'guardian.waved': '👋 sent', 'ward.feed': 'From your friends', 'ward.feed_empty': 'Nothing yet. Follow someone and it shows up here.', 'ward.buoy_hint': 'Drag the buoy onto a post to bring your guardians in.', 'ward.help_words': 'Want to add anything?', 'ward.help_send': 'Send to my guardians', 'ward.help_sent': 'Your guardians know.', 'ward.cancel': 'Cancel', 'ward.to_sky': 'Messages', 'ward.to_cards': 'Cards', 'ward.sky_empty': 'No conversations yet. Write to someone, or get written to.', 'ward.app_name': 'Klonkt Ward', 'ward.guardians': 'Who watches over you', 'ward.no_guardians': 'You have no guardians yet.', 'ward.offers': 'Requests', 'ward.waiting': 'Waiting on your guardians', 'ward.help': 'I need help', 'guardian.app_name': 'Klonkt Guardian', 'guardian.tagline': 'Manage wards and catch calls for help.', 'guardian.acting_as': 'You act as', 'guardian.help_title': 'Help requests', 'guardian.help_sub': 'When a ward uses the help buoy, it shows up here.', 'guardian.help_empty': 'No help requests. Good.', 'guardian.adopt_title': 'Adopt a ward', 'guardian.adopt_sub': 'Enter the child handle (@kid@server.eu). They get an offer in their Klonkt to accept.', 'guardian.adopt_label': 'Ward handle', 'guardian.adopt_btn': 'Send offer', 'guardian.pending_title': 'Sent offers', 'guardian.pending_sub': 'Waiting for the ward to accept.', 'guardian.wards_title': 'My wards', 'guardian.play_propose': 'Propose in-app playback', 'guardian.play_on': 'Playback: on', 'guardian.play_off': 'Playback: off', 'guardian.gated_title': 'Setting proposed', 'guardian.gated_line_on': '{who} wants to turn link previews ON for {ward}.', 'guardian.gated_line_off': '{who} wants to turn link previews OFF for {ward}.', 'guardian.gated_agree': 'Agree', 'guardian.gated_disagree': 'Disagree', 'guardian.avail_available': 'Available', 'guardian.avail_away': 'Unavailable till {date}', 'guardian.avail_dormant': 'Offline', 'guardian.panel_guards': 'Guardians of this child', 'guardian.panel_guards_remote': 'This child lives on another server; availability is tracked there.', 'guardian.lapse_propose': 'Propose release in absentia', 'guardian.lapse_line': '{who} has stopped answering as a guardian of {ward}.', 'guardian.lapse_tally': '{n} of {need} agreed; closes {date}; the window always runs in full.', 'guardian.lapse_note': 'Any sign of life from them cancels this outright. Nothing here is punishment.', 'guardian.lapse_agree': 'Agree', 'guardian.lapse_disagree': 'Disagree', 'guardian.voted': 'You voted', 'guardian.away_title': 'Step away', 'guardian.away_sub': 'Tell your wards you are unavailable for a while. Decisions will not wait for you, and one answer brings you straight back.', 'guardian.away_week': 'A week', 'guardian.away_month': 'A month', 'guardian.away_done': 'Your wards know you are unavailable until {date}.', 'guardian.away_msg': 'I am unavailable as your guardian until {date}. Your other guardians are there for you.', 'guardian.release_title': 'Release {who}?', 'guardian.release_effect': 'You stop being their guardian. You will no longer see their posts, no longer receive their calls for help, and no longer decide on follow requests for them. Coming back means a fresh offer that they accept.', 'guardian.release_local': 'Their server and the other guardians are told, so afterwards you are no longer listed as a guardian there either.', 'guardian.release_step_down': 'They keep their other guardians, so they stay a ward.', 'guardian.release_last': 'You are their last guardian. That is emancipation, and FEP-633c 3.4 is explicit that no single guardian decides it: it takes three consenting adults, or a majority plus two witnesses. So this button cannot do it: you stay their guardian until that is arranged.', 'guardian.release_unknown': 'We could not reach their server, so we do not know whether you are their last guardian.', 'guardian.release_yes': 'Yes, release', 'guardian.release_no': 'No, keep them', 'guardian.settings_title': 'Settings', 'guardian.panel_open': 'Open', 'guardian.panel_close': 'Close', 'guardian.panel_help': 'Calls for help from this child', 'guardian.panel_help_empty': 'No calls for help yet.', 'guardian.panel_follow': 'Follow requests', 'guardian.follow_out_line': 'wants to follow {who}', 'guardian.panel_follow_empty': 'No follow requests waiting.', 'guardian.panel_posts': 'Recent posts', 'guardian.panel_posts_empty': 'Nothing here yet.', 'guardian.panel_actions': 'Actions', 'guardian.badge_help': 'calls for help', 'guardian.badge_follow': 'follow requests', 'guardian.badge_follow_one': 'follow request', 'guardian.wards_empty': 'No wards yet. Adopt one above.', 'guardian.push_title': 'Notifications', 'guardian.push_sub': 'Get notified on a call for help or a guardianship answer, even with the app closed.', 'guardian.push_on': 'Turn on notifications', 'guardian.push_off': 'Notifications are on; tap to turn off', 'guardian.sent': 'Offer sent. See it below under Sent offers.', 'guardian.sent_retry': 'Offer saved; we keep trying to deliver it.', 'guardian.sending': 'Sending…', 'guardian.not_found': 'We could not find that handle.', 'guardian.failed': 'Failed', 'guardian.network': 'Network error.', 'guardian.pending': 'awaiting answer', 'guardian.active': 'active', 'guardian.retract': 'Retract', 'guardian.release': 'Release', 'guardian.embeds_on': 'Link previews: on', 'guardian.embeds_off': 'Link previews: off', 'guardian.embeds_propose': 'Propose link previews', 'guardian.embeds_waiting': 'waiting for the other guardians', 'guardian.prop_line': 'Proposal {what} {value}: {status}', 'guardian.prop_embeds': 'link previews', 'guardian.prop_play': 'playback', 'guardian.prop_on': 'on', 'guardian.prop_off': 'off', 'guardian.prop_st_open': 'waiting for the other guardians', 'guardian.prop_st_accepted': 'accepted', 'guardian.prop_st_rejected': 'rejected', 'guardian.prop_st_expired': 'expired without enough votes', 'guardian.panel_guards_far': 'Availability is tracked on their server.', 'guardian.release_confirm': 'Release {who}?\n\nYou stop being their guardian. You will no longer see their posts, no longer receive their calls for help, and no longer decide on follow requests for them.\n\nComing back means a fresh offer that they accept.', 'guardian.open': 'open', 'guardian.accept': 'Accept', 'guardian.reject': 'Reject', 'guardian.complete': 'Complete', 'guardian.awaiting_others': 'awaiting the other parties', 'guardian.coguard': 'co-guardianship offer', 'guardian.push_unavailable': 'Push unavailable', 'push.n_help_t': 'Call for help', 'push.n_help_b': '{who} is asking for your help', 'push.n_guard_offer_t': 'Guardianship offer', 'push.n_guard_offer_b': '{who} wants you as their guardian', 'push.n_guard_ward_t': 'Ward accepted', 'push.n_guard_left_t': 'A guardian has stepped down', 'push.n_guard_left_b': '{who} is no longer your guardian', 'push.n_guard_cogleft_t': 'Co-guardian stepped down', 'push.n_guard_cogleft_b': '{who} has ended their guardianship', 'push.n_guard_ward_b': '{who} accepted you as guardian', 'push.n_guard_cog_t': 'Co-guardianship asked', 'push.n_guard_cog_b': 'A guardian offer for {who} needs you', 'push.n_guard_folin_t': 'Follow request', 'push.n_guard_folin_b': '{who} wants to follow {ward}', 'push.n_guard_folout_t': 'Your ward wants to follow someone', 'push.n_guard_folout_b': '{ward} is asking to follow {who}', 'guardian.panel_history': 'History ({n})', 'guardian.log_show': 'Show history', 'guardian.log_hide': 'Hide history', 'guardian.ev_offer_rejected': 'Offer rejected', 'guardian.ev_offer_refused': 'Offer refused', 'guardian.ev_committed': 'Guardianship committed', 'guardian.ev_guardian_left': 'Guardian left', 'guardian.ev_coguardian_left': 'Co-guardian left', 'guardian.ev_gated_outcome': 'Gate decided', 'guardian.ev_lapse_opened': 'Release proposed', 'guardian.evr_not_a_teapot': 'the candidate is a ward themselves', 'guardian.help_archive': '{n} handled', 'guardian.help_archive_hide': 'hide', 'guardian.help_former_ward': 'No longer your ward. Their other guardians are still there for them.', 'guardian.warn_reversible': 'What comes through does not go back. You can close this setting again later — what your child has seen, you cannot.', 'guardian.warn_irreversible': 'This cannot be undone. From then on they decide for themselves, and you cannot take that back.', 'guardian.warn_unknown': 'We do not know this setting, so we cannot tell what comes through or how far it reaches. Ask whoever proposed it before you agree.', 'guardian.warn_decides': 'YOUR ANSWER SETTLES THIS. With yours the threshold is met and it takes effect straight away.', 'guardian.warn_not_last': 'Someone else still has to answer before this takes effect.', 'guardian.warn_tally_elsewhere': 'We cannot see how many guardians have answered — the child\u2019s server counts that. Your yes may be the deciding one.', 'guardian.warn_go': 'Yes, propose this', 'guardian.warn_back': 'No, go back', 'guardian.help_pick': 'I am on it', 'guardian.help_close': 'Mark as handled', 'guardian.help_picked_by': '{who} is looking into this', 'guardian.help_handled_by': 'Handled by {who}', 'guardian.help_handled_note': 'This stays. If it is still going on, the child asks again.', 'guardian.help_close_ask': 'Are you sure? This cannot be undone. If it is still going on, the child will ask for help again.', 'guardian.help_close_yes': 'Yes, handled', 'guardian.help_just_now': 'just now', 'guardian.help_hours': '{n}h ago', 'guardian.help_days': '{n}d ago', 'guardian.gate_unavailable': 'not available yet', 'guardian.gate_planned_note': 'This does not exist on this server yet.', 'guardian.gates_summary': '{n} gates - {on} on, {wait} waiting', 'guardian.gates_show': 'Show gates', 'guardian.gates_hide': 'Hide gates', 'guardian.gate_images': 'Images', 'guardian.gate_messages': 'Messages', 'guardian.gate_asked': 'Your child asked for this.', 'guardian.gate_replies': 'Replying in a conversation', 'guardian.gate_compose': 'Posting', 'guardian.gate_music': 'Music', 'guardian.gate_quoteCards': 'Quote cards', 'guardian.gate_customEmoji': 'Custom emoji', 'guardian.gate_publicProfile': 'Publicly visible', 'guardian.gate_accountMove': 'Moving account', 'guardian.gate_independence': 'Becoming independent', 'guardian.gate_externalThreads': 'Replies from strangers', 'guardian.gate_externalEmbeds': 'Link previews', 'guardian.gate_externalPlayback': 'In-app playback', 'guardian.gate_follows': 'Follow requests', 'guardian.gate_following': 'Following others', 'guardian.gate_kind_setting': 'setting', 'guardian.gate_kind_perRequest': 'per request', 'guardian.gate_kind_handover': 'hands over authority', 'guardian.gate_default_off': 'off (nothing decided yet)', 'guardian.gate_unknown': 'unknown', 'guardian.gate_always': 'Always', 'guardian.gate_threshold': '{need} of {of} guardians', 'guardian.gate_threshold_unknown': 'threshold unknown (other domain)', 'guardian.gate_irreversible': 'cannot be undone', 'guardian.gate_waiting': '{n} waiting on you', 'guardian.gate_blocked': 'needs {what} on first', 'guardian.gate_propose_open': 'Propose: open', 'guardian.gate_propose_close': 'Propose: close', 'guardian.gate_propose': 'Propose', 'push.n_gate_ask_t': 'Your answer is needed', 'push.n_gate_ask_b': 'Proposal for {who}: {wat} {stand}', 'push.n_gate_done_t': 'Decision reached', 'push.n_gate_done_b': '{wat} {stand} for {who}: {uitkomst}', 'push.n_test_t': 'Klonkt test notification', 'push.n_test_b': 'It works. This is how notifications arrive on this device.',
     1021    'push.n_follow_t': 'New follower', 'push.n_follow_b': '{who} now follows you', 'push.n_reply_t': 'Reply to "{title}"', 'push.n_mention_t': 'Mention', 'push.n_dm_t': 'Private message', 'push.n_dm_b': 'New message from {who}', 'push.n_like_t': 'New like', 'push.n_like_b': '{who} liked "{title}"', 'push.n_boost_t': 'Boosted', 'push.n_boost_b': '{who} boosted "{title}"', 'msg.guard_offer': 'wants to become your guardian. Talk this over with your parents or carers before you decide.', 'msg.guard_accept': 'Accept', 'msg.guard_reject': 'Reject', 'msg.guard_accepted': 'Guardian accepted. You are now connected.', 'msg.guard_rejected': 'Offer rejected.', 'msg.guard_failed': 'That did not work; try again.', 'msg.guardians_label': 'Your guardians', 'msg.waved_at_you': 'waved at you', 'msg.help_request': 'asked for help', 'msg.g_available': 'available', 'msg.g_away': 'unavailable till {date}', 'msg.g_offline': 'offline', 'msg.wave_r1': 'Lovely!', 'msg.wave_r2': 'Call me', 'msg.wave_back': '👋 Back', 'msg.wave_sent': 'Wave sent.', 'msg.reply_sent': 'Reply sent.', 'msg.reply_failed': 'The reply could not be sent.', 'msg.reply_empty': 'An empty reply cannot be sent.', 'guardian.feed_title': 'Your wards', 'guardian.feed_sub': 'Read along with what your wards post. Watch only.', 'guardian.follow_title': 'Follow requests', 'guardian.follow_sub': 'Someone wants to follow one of your wards. You decide.', 'guardian.wave': '👋 Wave', 'guardian.waved': '👋 sent', 'ward.feed': 'From your friends', 'ward.feed_empty': 'Nothing yet. Follow someone and it shows up here.', 'ward.buoy_hint': 'Drag the buoy onto a post to bring your guardians in.', 'ward.help_words': 'Want to add anything?', 'ward.help_send': 'Send to my guardians', 'ward.help_sent': 'Your guardians know.', 'ward.cancel': 'Cancel', 'ward.to_sky': 'Messages', 'ward.to_cards': 'Cards', 'ward.sky_empty': 'No conversations yet. Write to someone, or get written to.', 'ward.hand_hint': 'Drag the hand onto a face to wave.', 'ward.close': 'Back', 'ward.write_here': 'Write something...', 'ward.send': 'Send', 'ward.wave': 'Wave', 'ward.wave_call': 'Call me', 'ward.wave_thanks': 'Thank you!', 'ward.not_now': 'Not now', 'ward.wave_to': 'Wave at {who}?', 'ward.app_name': 'Klonkt Ward', 'ward.guardians': 'Who watches over you', 'ward.no_guardians': 'You have no guardians yet.', 'ward.offers': 'Requests', 'ward.waiting': 'Waiting on your guardians', 'ward.help': 'I need help', 'guardian.app_name': 'Klonkt Guardian', 'guardian.tagline': 'Manage wards and catch calls for help.', 'guardian.acting_as': 'You act as', 'guardian.help_title': 'Help requests', 'guardian.help_sub': 'When a ward uses the help buoy, it shows up here.', 'guardian.help_empty': 'No help requests. Good.', 'guardian.adopt_title': 'Adopt a ward', 'guardian.adopt_sub': 'Enter the child handle (@kid@server.eu). They get an offer in their Klonkt to accept.', 'guardian.adopt_label': 'Ward handle', 'guardian.adopt_btn': 'Send offer', 'guardian.pending_title': 'Sent offers', 'guardian.pending_sub': 'Waiting for the ward to accept.', 'guardian.wards_title': 'My wards', 'guardian.play_propose': 'Propose in-app playback', 'guardian.play_on': 'Playback: on', 'guardian.play_off': 'Playback: off', 'guardian.gated_title': 'Setting proposed', 'guardian.gated_line_on': '{who} wants to turn link previews ON for {ward}.', 'guardian.gated_line_off': '{who} wants to turn link previews OFF for {ward}.', 'guardian.gated_agree': 'Agree', 'guardian.gated_disagree': 'Disagree', 'guardian.avail_available': 'Available', 'guardian.avail_away': 'Unavailable till {date}', 'guardian.avail_dormant': 'Offline', 'guardian.panel_guards': 'Guardians of this child', 'guardian.panel_guards_remote': 'This child lives on another server; availability is tracked there.', 'guardian.lapse_propose': 'Propose release in absentia', 'guardian.lapse_line': '{who} has stopped answering as a guardian of {ward}.', 'guardian.lapse_tally': '{n} of {need} agreed; closes {date}; the window always runs in full.', 'guardian.lapse_note': 'Any sign of life from them cancels this outright. Nothing here is punishment.', 'guardian.lapse_agree': 'Agree', 'guardian.lapse_disagree': 'Disagree', 'guardian.voted': 'You voted', 'guardian.away_title': 'Step away', 'guardian.away_sub': 'Tell your wards you are unavailable for a while. Decisions will not wait for you, and one answer brings you straight back.', 'guardian.away_week': 'A week', 'guardian.away_month': 'A month', 'guardian.away_done': 'Your wards know you are unavailable until {date}.', 'guardian.away_msg': 'I am unavailable as your guardian until {date}. Your other guardians are there for you.', 'guardian.release_title': 'Release {who}?', 'guardian.release_effect': 'You stop being their guardian. You will no longer see their posts, no longer receive their calls for help, and no longer decide on follow requests for them. Coming back means a fresh offer that they accept.', 'guardian.release_local': 'Their server and the other guardians are told, so afterwards you are no longer listed as a guardian there either.', 'guardian.release_step_down': 'They keep their other guardians, so they stay a ward.', 'guardian.release_last': 'You are their last guardian. That is emancipation, and FEP-633c 3.4 is explicit that no single guardian decides it: it takes three consenting adults, or a majority plus two witnesses. So this button cannot do it: you stay their guardian until that is arranged.', 'guardian.release_unknown': 'We could not reach their server, so we do not know whether you are their last guardian.', 'guardian.release_yes': 'Yes, release', 'guardian.release_no': 'No, keep them', 'guardian.settings_title': 'Settings', 'guardian.panel_open': 'Open', 'guardian.panel_close': 'Close', 'guardian.panel_help': 'Calls for help from this child', 'guardian.panel_help_empty': 'No calls for help yet.', 'guardian.panel_follow': 'Follow requests', 'guardian.follow_out_line': 'wants to follow {who}', 'guardian.panel_follow_empty': 'No follow requests waiting.', 'guardian.panel_posts': 'Recent posts', 'guardian.panel_posts_empty': 'Nothing here yet.', 'guardian.panel_actions': 'Actions', 'guardian.badge_help': 'calls for help', 'guardian.badge_follow': 'follow requests', 'guardian.badge_follow_one': 'follow request', 'guardian.wards_empty': 'No wards yet. Adopt one above.', 'guardian.push_title': 'Notifications', 'guardian.push_sub': 'Get notified on a call for help or a guardianship answer, even with the app closed.', 'guardian.push_on': 'Turn on notifications', 'guardian.push_off': 'Notifications are on; tap to turn off', 'guardian.sent': 'Offer sent. See it below under Sent offers.', 'guardian.sent_retry': 'Offer saved; we keep trying to deliver it.', 'guardian.sending': 'Sending…', 'guardian.not_found': 'We could not find that handle.', 'guardian.failed': 'Failed', 'guardian.network': 'Network error.', 'guardian.pending': 'awaiting answer', 'guardian.active': 'active', 'guardian.retract': 'Retract', 'guardian.release': 'Release', 'guardian.embeds_on': 'Link previews: on', 'guardian.embeds_off': 'Link previews: off', 'guardian.embeds_propose': 'Propose link previews', 'guardian.embeds_waiting': 'waiting for the other guardians', 'guardian.prop_line': 'Proposal {what} {value}: {status}', 'guardian.prop_embeds': 'link previews', 'guardian.prop_play': 'playback', 'guardian.prop_on': 'on', 'guardian.prop_off': 'off', 'guardian.prop_st_open': 'waiting for the other guardians', 'guardian.prop_st_accepted': 'accepted', 'guardian.prop_st_rejected': 'rejected', 'guardian.prop_st_expired': 'expired without enough votes', 'guardian.panel_guards_far': 'Availability is tracked on their server.', 'guardian.release_confirm': 'Release {who}?\n\nYou stop being their guardian. You will no longer see their posts, no longer receive their calls for help, and no longer decide on follow requests for them.\n\nComing back means a fresh offer that they accept.', 'guardian.open': 'open', 'guardian.accept': 'Accept', 'guardian.reject': 'Reject', 'guardian.complete': 'Complete', 'guardian.awaiting_others': 'awaiting the other parties', 'guardian.coguard': 'co-guardianship offer', 'guardian.push_unavailable': 'Push unavailable', 'push.n_help_t': 'Call for help', 'push.n_help_b': '{who} is asking for your help', 'push.n_guard_offer_t': 'Guardianship offer', 'push.n_guard_offer_b': '{who} wants you as their guardian', 'push.n_guard_ward_t': 'Ward accepted', 'push.n_guard_left_t': 'A guardian has stepped down', 'push.n_guard_left_b': '{who} is no longer your guardian', 'push.n_guard_cogleft_t': 'Co-guardian stepped down', 'push.n_guard_cogleft_b': '{who} has ended their guardianship', 'push.n_guard_ward_b': '{who} accepted you as guardian', 'push.n_guard_cog_t': 'Co-guardianship asked', 'push.n_guard_cog_b': 'A guardian offer for {who} needs you', 'push.n_guard_folin_t': 'Follow request', 'push.n_guard_folin_b': '{who} wants to follow {ward}', 'push.n_guard_folout_t': 'Your ward wants to follow someone', 'push.n_guard_folout_b': '{ward} is asking to follow {who}', 'guardian.panel_history': 'History ({n})', 'guardian.log_show': 'Show history', 'guardian.log_hide': 'Hide history', 'guardian.ev_offer_rejected': 'Offer rejected', 'guardian.ev_offer_refused': 'Offer refused', 'guardian.ev_committed': 'Guardianship committed', 'guardian.ev_guardian_left': 'Guardian left', 'guardian.ev_coguardian_left': 'Co-guardian left', 'guardian.ev_gated_outcome': 'Gate decided', 'guardian.ev_lapse_opened': 'Release proposed', 'guardian.evr_not_a_teapot': 'the candidate is a ward themselves', 'guardian.help_archive': '{n} handled', 'guardian.help_archive_hide': 'hide', 'guardian.help_former_ward': 'No longer your ward. Their other guardians are still there for them.', 'guardian.warn_reversible': 'What comes through does not go back. You can close this setting again later — what your child has seen, you cannot.', 'guardian.warn_irreversible': 'This cannot be undone. From then on they decide for themselves, and you cannot take that back.', 'guardian.warn_unknown': 'We do not know this setting, so we cannot tell what comes through or how far it reaches. Ask whoever proposed it before you agree.', 'guardian.warn_decides': 'YOUR ANSWER SETTLES THIS. With yours the threshold is met and it takes effect straight away.', 'guardian.warn_not_last': 'Someone else still has to answer before this takes effect.', 'guardian.warn_tally_elsewhere': 'We cannot see how many guardians have answered — the child\u2019s server counts that. Your yes may be the deciding one.', 'guardian.warn_go': 'Yes, propose this', 'guardian.warn_back': 'No, go back', 'guardian.help_pick': 'I am on it', 'guardian.help_close': 'Mark as handled', 'guardian.help_picked_by': '{who} is looking into this', 'guardian.help_handled_by': 'Handled by {who}', 'guardian.help_handled_note': 'This stays. If it is still going on, the child asks again.', 'guardian.help_close_ask': 'Are you sure? This cannot be undone. If it is still going on, the child will ask for help again.', 'guardian.help_close_yes': 'Yes, handled', 'guardian.help_just_now': 'just now', 'guardian.help_hours': '{n}h ago', 'guardian.help_days': '{n}d ago', 'guardian.gate_unavailable': 'not available yet', 'guardian.gate_planned_note': 'This does not exist on this server yet.', 'guardian.gates_summary': '{n} gates - {on} on, {wait} waiting', 'guardian.gates_show': 'Show gates', 'guardian.gates_hide': 'Hide gates', 'guardian.gate_images': 'Images', 'guardian.gate_messages': 'Messages', 'guardian.gate_asked': 'Your child asked for this.', 'guardian.gate_replies': 'Replying in a conversation', 'guardian.gate_compose': 'Posting', 'guardian.gate_music': 'Music', 'guardian.gate_quoteCards': 'Quote cards', 'guardian.gate_customEmoji': 'Custom emoji', 'guardian.gate_publicProfile': 'Publicly visible', 'guardian.gate_accountMove': 'Moving account', 'guardian.gate_independence': 'Becoming independent', 'guardian.gate_externalThreads': 'Replies from strangers', 'guardian.gate_externalEmbeds': 'Link previews', 'guardian.gate_externalPlayback': 'In-app playback', 'guardian.gate_follows': 'Follow requests', 'guardian.gate_following': 'Following others', 'guardian.gate_kind_setting': 'setting', 'guardian.gate_kind_perRequest': 'per request', 'guardian.gate_kind_handover': 'hands over authority', 'guardian.gate_default_off': 'off (nothing decided yet)', 'guardian.gate_unknown': 'unknown', 'guardian.gate_always': 'Always', 'guardian.gate_threshold': '{need} of {of} guardians', 'guardian.gate_threshold_unknown': 'threshold unknown (other domain)', 'guardian.gate_irreversible': 'cannot be undone', 'guardian.gate_waiting': '{n} waiting on you', 'guardian.gate_blocked': 'needs {what} on first', 'guardian.gate_propose_open': 'Propose: open', 'guardian.gate_propose_close': 'Propose: close', 'guardian.gate_propose': 'Propose', 'push.n_gate_ask_t': 'Your answer is needed', 'push.n_gate_ask_b': 'Proposal for {who}: {wat} {stand}', 'push.n_gate_done_t': 'Decision reached', 'push.n_gate_done_b': '{wat} {stand} for {who}: {uitkomst}', 'push.n_test_t': 'Klonkt test notification', 'push.n_test_b': 'It works. This is how notifications arrive on this device.',
    10221022    'apaid.t': 'Paid posts', 'apaid.intro': 'Connect your own Patreon campaign. Supporters unlock paid posts with a passkey, no account and no cookie. We store no supporter names or email addresses, only the encrypted token of your campaign.', 'apaid.saved': 'Saved.', 'apaid.nokey': 'Note: the encryption key could not be created or read (write permissions on the storage directory?). Without a key, secrets cannot be stored safely.', 'apaid.status': 'Status:', 'apaid.connected': 'connected', 'apaid.campaign': 'campaign', 'apaid.configured': 'configured, not connected yet (enter a token)', 'apaid.notyet': 'not configured yet', 'apaid.redirect_h': 'Put this redirect URI in your Patreon client', 'apaid.redirect_p': 'In your Patreon API client, under Redirect URIs, exactly this line must be present. If it does not match, Patreon shows an error instead of sending your supporters back.', 'apaid.copy': 'Copy', 'apaid.copied': 'Copied', 'apaid.client_id': 'Patreon client id', 'apaid.client_secret': 'Patreon client secret', 'apaid.keep': 'Leave empty = keep the current value.', 'apaid.campaign_id': 'Campaign id', 'apaid.public_page': 'Public Patreon page', 'apaid.public_help': 'The link where visitors can become a supporter. Shown as "Become a supporter" when someone does not pledge yet.', 'apaid.access': 'Creator access token', 'apaid.refresh': 'Creator refresh token', 'apaid.token_help': 'You get the access + refresh token on your Patreon API client page. We encrypt them and refresh automatically.', 'apaid.min_eur': 'Default support amount for a paid post (euro)', 'apaid.save': 'Save', 'apaid.disconnect': 'Remove connection', 'apaid.disconnect_confirm': 'Remove the Patreon connection?', 'apaid.unchanged': 'stays unchanged',
    10231023    'pgate.h': 'For supporters', 'pgate.sub': 'This post is for supporters of this site. Become a supporter and then unlock it with a passkey. No account on this site, no cookie.', 'pgate.sub_cents': 'This post is for supporters of this site (from €{eur} per month on Patreon). Become a supporter and then unlock it with a passkey. No account on this site, no cookie.', 'pgate.join': 'Become a supporter on Patreon', 'pgate.unlock_have': 'Already a supporter? Unlock', 'pgate.unlock': 'Unlock with Patreon', 'pgate.join_short': 'Become a supporter', 'pgate.confirm': 'Confirm with your passkey…', 'pgate.failed': 'Unlocking failed. Try again.', 'pgate.error': 'Something went wrong. Try again.',
    … …  
    19651965    'admin.b_paid': 'Bezahlte Beiträge', 'admin.b_push': 'Benachrichtigungen', 'admin.back': 'Zurück zur Verwaltung',
    19661966    'push.t': 'Benachrichtigungen', 'push.intro': 'Erhalte auf diesem Gerät eine Meldung bei neuen Followern, Antworten und Nachrichten, auch wenn die Seite geschlossen ist. Verschlüsselt bis in deinen Browser; wir senden so wenig Inhalt wie möglich mit.', 'push.unavailable': 'Push ist auf diesem Server nicht verfügbar (Schlüssel konnte nicht erstellt werden oder die Abhängigkeit fehlt).', 'push.unsupported': 'Dieser Browser unterstützt keine Push-Benachrichtigungen.', 'push.ios_hint': 'Auf iPhone/iPad funktioniert das nur, wenn die Seite auf deinem Home-Bildschirm liegt: Teilen-Knopf, dann "Zum Home-Bildschirm", und öffne sie danach von dort.', 'push.this_device': 'Dieses Gerät:', 'push.checking': 'prüfen…', 'push.state_on': 'Benachrichtigungen sind an', 'push.state_off': 'Benachrichtigungen sind aus', 'push.state_denied': 'in den Browser-Einstellungen blockiert', 'push.state_unknown': 'Status unbekannt', 'push.state_unsupported': 'nicht unterstützt', 'push.enable': 'Auf diesem Gerät einschalten', 'push.disable': 'Ausschalten', 'push.test': 'Testmeldung senden', 'push.what': 'Wofür möchtest du eine Meldung?', 'push.a_follow': 'Neuer Follower', 'push.a_reply': 'Antwort oder Erwähnung', 'push.a_like': 'Like (Stern)', 'push.a_boost': 'Boost', 'push.a_dm': 'Private Nachricht', 'push.saved': 'Gespeichert.', 'push.devices': 'Verbundene Geräte', 'push.device': 'Gerät', 'push.since': 'seit', 'push.remove': 'Entfernen', 'push.enable_failed': 'Einschalten fehlgeschlagen',
    1967     'push.n_follow_t': 'Neuer Follower', 'push.n_follow_b': '{who} folgt dir jetzt', 'push.n_reply_t': 'Antwort auf "{title}"', 'push.n_mention_t': 'Erwähnung', 'push.n_dm_t': 'Private Nachricht', 'push.n_dm_b': 'Neue Nachricht von {who}', 'push.n_like_t': 'Neues Like', 'push.n_like_b': '{who} gefällt "{title}"', 'push.n_boost_t': 'Geboostet', 'push.n_boost_b': '{who} hat "{title}" geboostet', 'msg.guard_offer': 'möchte dein Guardian werden. Besprich das mit deinen Eltern oder Betreuern, bevor du entscheidest.', 'msg.guard_accept': 'Annehmen', 'msg.guard_reject': 'Ablehnen', 'msg.guard_accepted': 'Guardian angenommen. Ihr seid jetzt verbunden.', 'msg.guard_rejected': 'Angebot abgelehnt.', 'msg.guard_failed': 'Das hat nicht geklappt; versuch es erneut.', 'msg.guardians_label': 'Deine Guardians', 'msg.waved_at_you': 'hat dir zugewinkt', 'msg.help_request': 'hat um Hilfe gebeten', 'msg.g_available': 'verfuegbar', 'msg.g_away': 'abwesend bis {date}', 'msg.g_offline': 'offline', 'msg.wave_r1': 'Wie schön!', 'msg.wave_r2': 'Ruf mich an', 'msg.wave_back': '👋 Zurück', 'msg.wave_sent': 'Winken gesendet.', 'msg.reply_sent': 'Antwort gesendet.', 'msg.reply_failed': 'Die Antwort konnte nicht gesendet werden.', 'msg.reply_empty': 'Eine leere Antwort kann nicht gesendet werden.', 'guardian.feed_title': 'Deine Wards', 'guardian.feed_sub': 'Lies mit, was deine Wards posten. Nur schauen.', 'guardian.follow_title': 'Follow-Anfragen', 'guardian.follow_sub': 'Jemand möchte einem deiner Wards folgen. Du entscheidest.', 'guardian.wave': '👋 Winken', 'guardian.waved': '👋 gesendet', 'ward.feed': 'Von deinen Freunden', 'ward.feed_empty': 'Noch nichts. Folge jemandem, dann erscheint es hier.', 'ward.buoy_hint': 'Zieh die Rettungsboje auf einen Beitrag, um deine Guardians dazuzuholen.', 'ward.help_words': 'Möchtest du etwas dazu sagen?', 'ward.help_send': 'An meine Guardians senden', 'ward.help_sent': 'Deine Guardians wissen Bescheid.', 'ward.cancel': 'Abbrechen', 'ward.to_sky': 'Nachrichten', 'ward.to_cards': 'Karten', 'ward.sky_empty': 'Noch keine Gespräche. Schreib jemandem, oder lass dir schreiben.', 'ward.app_name': 'Klonkt Ward', 'ward.guardians': 'Wer über dich wacht', 'ward.no_guardians': 'Du hast noch keine Guardians.', 'ward.offers': 'Anfragen', 'ward.waiting': 'Wartet auf deine Guardians', 'ward.help': 'Ich brauche Hilfe', 'guardian.app_name': 'Klonkt Guardian', 'guardian.tagline': 'Wards verwalten und Hilferufe auffangen.', 'guardian.acting_as': 'Du handelst als', 'guardian.help_title': 'Hilferufe', 'guardian.help_sub': 'Wenn ein Ward die Rettungsboje nutzt, erscheint es hier.', 'guardian.help_empty': 'Keine Hilferufe. Gut so.', 'guardian.adopt_title': 'Ward adoptieren', 'guardian.adopt_sub': 'Gib das Handle des Kindes ein (@kind@server.eu). Es bekommt ein Angebot in seinem Klonkt zum Annehmen.', 'guardian.adopt_label': 'Ward-Handle', 'guardian.adopt_btn': 'Angebot senden', 'guardian.pending_title': 'Gesendete Angebote', 'guardian.pending_sub': 'Warten, bis der Ward annimmt.', 'guardian.wards_title': 'Meine Wards', 'guardian.play_propose': 'Abspielen vorschlagen', 'guardian.play_on': 'Abspielen: an', 'guardian.play_off': 'Abspielen: aus', 'guardian.gated_title': 'Einstellung vorgeschlagen', 'guardian.gated_line_on': '{who} moechte Link-Vorschauen fuer {ward} EINschalten.', 'guardian.gated_line_off': '{who} moechte Link-Vorschauen fuer {ward} AUSschalten.', 'guardian.gated_agree': 'Einverstanden', 'guardian.gated_disagree': 'Nicht einverstanden', 'guardian.avail_available': 'Verfuegbar', 'guardian.avail_away': 'Abwesend bis {date}', 'guardian.avail_dormant': 'Offline', 'guardian.panel_guards': 'Guardians dieses Kindes', 'guardian.panel_guards_remote': 'Dieses Kind lebt auf einem anderen Server; die Verfuegbarkeit wird dort gefuehrt.', 'guardian.lapse_propose': 'Vorschlag: Freigabe in Abwesenheit', 'guardian.lapse_line': '{who} antwortet nicht mehr als Guardian von {ward}.', 'guardian.lapse_tally': '{n} von {need} einverstanden; schliesst {date}; das Fenster laeuft immer voll.', 'guardian.lapse_note': 'Jedes Lebenszeichen von ihnen bricht dies sofort ab. Nichts hier ist Strafe.', 'guardian.lapse_agree': 'Einverstanden', 'guardian.lapse_disagree': 'Nicht einverstanden', 'guardian.voted': 'Du hast abgestimmt', 'guardian.away_title': 'Kurz abwesend', 'guardian.away_sub': 'Sag deinen Wards, dass du eine Weile nicht da bist. Entscheidungen warten nicht auf dich, und eine einzige Antwort bringt dich sofort zurueck.', 'guardian.away_week': 'Eine Woche', 'guardian.away_month': 'Ein Monat', 'guardian.away_done': 'Deine Wards wissen, dass du bis {date} abwesend bist.', 'guardian.away_msg': 'Ich bin als dein Guardian bis {date} abwesend. Deine anderen Guardians sind fuer dich da.', 'guardian.release_title': '{who} loslassen?', 'guardian.release_effect': 'Du bist dann nicht mehr Guardian. Du siehst ihre Beitraege nicht mehr, erhaeltst keine Hilferufe mehr von ihnen und entscheidest nicht mehr ueber Folgeanfragen fuer sie. Zurueck geht nur mit einem neuen Angebot, das sie annehmen.', 'guardian.release_local': 'Ihr Server und die anderen Guardians werden benachrichtigt, danach stehst du auch dort nicht mehr als Guardian.', 'guardian.release_step_down': 'Sie behalten ihre anderen Guardians und bleiben also Ward.', 'guardian.release_last': 'Du bist ihr letzter Guardian. Das ist Emanzipation, und FEP-633c 3.4 sagt ausdruecklich, dass darueber kein einzelner Guardian entscheidet: dafuer braucht es drei zustimmende Erwachsene oder eine Mehrheit plus zwei Zeugen. Dieser Knopf kann das also nicht: du bleibst ihr Guardian, bis das geregelt ist.', 'guardian.release_unknown': 'Wir konnten ihren Server nicht erreichen und wissen daher nicht, ob du ihr letzter Guardian bist.', 'guardian.release_yes': 'Ja, loslassen', 'guardian.release_no': 'Nein, doch nicht', 'guardian.settings_title': 'Einstellungen', 'guardian.panel_open': 'Ansehen', 'guardian.panel_close': 'Schliessen', 'guardian.panel_help': 'Hilferufe dieses Kindes', 'guardian.panel_help_empty': 'Noch keine Hilferufe.', 'guardian.panel_follow': 'Folgeanfragen', 'guardian.follow_out_line': 'möchte {who} folgen', 'guardian.panel_follow_empty': 'Keine offenen Folgeanfragen.', 'guardian.panel_posts': 'Neueste Beitraege', 'guardian.panel_posts_empty': 'Noch nichts zu sehen.', 'guardian.panel_actions': 'Aktionen', 'guardian.badge_help': 'Hilferufe', 'guardian.badge_follow': 'Folgeanfragen', 'guardian.badge_follow_one': 'Folgeanfrage', 'guardian.wards_empty': 'Noch keine Wards. Adoptiere oben eins.', 'guardian.push_title': 'Meldungen', 'guardian.push_sub': 'Erhalte eine Meldung bei einem Hilferuf oder einer Vormundschafts-Antwort, auch bei geschlossener App.', 'guardian.push_on': 'Meldungen einschalten', 'guardian.push_off': 'Meldungen sind an; tippen zum Ausschalten', 'guardian.sent': 'Angebot gesendet. Siehe unten bei Gesendete Angebote.', 'guardian.sent_retry': 'Angebot gespeichert; wir versuchen weiter zuzustellen.', 'guardian.sending': 'Senden…', 'guardian.not_found': 'Dieses Handle konnten wir nicht finden.', 'guardian.failed': 'Fehlgeschlagen', 'guardian.network': 'Netzwerkfehler.', 'guardian.pending': 'wartet auf Antwort', 'guardian.active': 'aktiv', 'guardian.retract': 'Zurückziehen', 'guardian.release': 'Loslassen', 'guardian.embeds_on': 'Linkvorschauen: an', 'guardian.embeds_off': 'Linkvorschauen: aus', 'guardian.embeds_propose': 'Linkvorschauen vorschlagen', 'guardian.embeds_waiting': 'wartet auf die anderen Guardians', 'guardian.prop_line': 'Vorschlag {what} {value}: {status}', 'guardian.prop_embeds': 'Link-Vorschauen', 'guardian.prop_play': 'Abspielen', 'guardian.prop_on': 'an', 'guardian.prop_off': 'aus', 'guardian.prop_st_open': 'wartet auf die anderen Guardians', 'guardian.prop_st_accepted': 'angenommen', 'guardian.prop_st_rejected': 'abgelehnt', 'guardian.prop_st_expired': 'abgelaufen ohne genug Stimmen', 'guardian.panel_guards_far': 'Verfuegbarkeit wird auf ihrem Server gefuehrt.', 'guardian.release_confirm': '{who} loslassen?\n\nDu bist dann nicht mehr Guardian. Du siehst ihre Beitraege nicht mehr, erhaeltst keine Hilferufe mehr von ihnen und entscheidest nicht mehr ueber Follow-Anfragen fuer sie.\n\nZurueck geht nur mit einem neuen Angebot, das sie annehmen.', 'guardian.open': 'öffnen', 'guardian.accept': 'Annehmen', 'guardian.reject': 'Ablehnen', 'guardian.complete': 'Abschließen', 'guardian.awaiting_others': 'wartet auf die anderen Parteien', 'guardian.coguard': 'Mit-Vormundschaftsangebot', 'guardian.push_unavailable': 'Push nicht verfügbar', 'push.n_help_t': 'Hilferuf', 'push.n_help_b': '{who} bittet um deine Hilfe', 'push.n_guard_offer_t': 'Vormundschaftsangebot', 'push.n_guard_offer_b': '{who} möchte dich als Guardian', 'push.n_guard_ward_t': 'Ward akzeptiert', 'push.n_guard_left_t': 'Ein Guardian ist zurueckgetreten', 'push.n_guard_left_b': '{who} ist nicht mehr dein Guardian', 'push.n_guard_cogleft_t': 'Mit-Guardian zurueckgetreten', 'push.n_guard_cogleft_b': '{who} hat die Guardianship beendet', 'push.n_guard_ward_b': '{who} hat dich als Guardian akzeptiert', 'push.n_guard_cog_t': 'Mit-Vormundschaft gefragt', 'push.n_guard_cog_b': 'Ein Guardian-Angebot für {who} braucht dich', 'push.n_guard_folin_t': 'Folgeanfrage', 'push.n_guard_folin_b': '{who} möchte {ward} folgen', 'push.n_guard_folout_t': 'Dein Mündel möchte jemandem folgen', 'push.n_guard_folout_b': '{ward} fragt, ob es {who} folgen darf', 'guardian.panel_history': 'Verlauf ({n})', 'guardian.log_show': 'Verlauf zeigen', 'guardian.log_hide': 'Verlauf verbergen', 'guardian.ev_offer_rejected': 'Angebot abgelehnt', 'guardian.ev_offer_refused': 'Angebot verweigert', 'guardian.ev_committed': 'Vormundschaft bestätigt', 'guardian.ev_guardian_left': 'Guardian gegangen', 'guardian.ev_coguardian_left': 'Mit-Guardian gegangen', 'guardian.ev_gated_outcome': 'Tor entschieden', 'guardian.ev_lapse_opened': 'Freigabe vorgeschlagen', 'guardian.evr_not_a_teapot': 'der Kandidat ist selbst ein Mündel', 'guardian.help_archive': '{n} erledigt', 'guardian.help_archive_hide': 'ausblenden', 'guardian.help_former_ward': 'Nicht mehr dein Ward. Ihre anderen Guardians sind weiterhin fuer sie da.', 'guardian.warn_reversible': 'Was hier durchkommt, kommt nicht zurueck. Du kannst diese Einstellung spaeter wieder schliessen — was dein Kind gesehen hat, nicht.', 'guardian.warn_irreversible': 'Das laesst sich nicht rueckgaengig machen. Danach entscheidet sie selbst, und ihr koennt das nicht zuruecknehmen.', 'guardian.warn_unknown': 'Wir kennen diese Einstellung nicht, wissen also nicht, was durchkommt oder wie weit es reicht. Frag die Person, die es vorgeschlagen hat, bevor du zustimmst.', 'guardian.warn_decides': 'DEINE ANTWORT ENTSCHEIDET. Mit dir ist die Schwelle erreicht und es gilt sofort.', 'guardian.warn_not_last': 'Danach muss noch jemand antworten, bevor das gilt.', 'guardian.warn_tally_elsewhere': 'Wir sehen nicht, wie viele Guardians schon geantwortet haben — das zaehlt der Server des Kindes. Dein Ja kann den Ausschlag geben.', 'guardian.warn_go': 'Ja, das vorschlagen', 'guardian.warn_back': 'Nein, doch nicht', 'guardian.help_pick': 'Ich kuemmere mich', 'guardian.help_close': 'Als erledigt markieren', 'guardian.help_picked_by': '{who} kuemmert sich darum', 'guardian.help_handled_by': 'Erledigt von {who}', 'guardian.help_handled_note': 'Das bleibt stehen. Geht es noch weiter, fragt das Kind erneut.', 'guardian.help_close_ask': 'Sicher? Das laesst sich nicht rueckgaengig machen. Geht es noch weiter, bittet das Kind erneut um Hilfe.', 'guardian.help_close_yes': 'Ja, erledigt', 'guardian.help_just_now': 'gerade eben', 'guardian.help_hours': 'vor {n} Std.', 'guardian.help_days': 'vor {n} Tagen', 'guardian.gate_unavailable': 'noch nicht verfuegbar', 'guardian.gate_planned_note': 'Das gibt es auf diesem Server noch nicht.', 'guardian.gates_summary': '{n} Tore - {on} an, {wait} warten', 'guardian.gates_show': 'Tore zeigen', 'guardian.gates_hide': 'Tore ausblenden', 'guardian.gate_images': 'Bilder', 'guardian.gate_messages': 'Nachrichten', 'guardian.gate_asked': 'Dein Kind hat selbst darum gebeten.', 'guardian.gate_replies': 'Antworten in einem Gespraech', 'guardian.gate_compose': 'Selbst posten', 'guardian.gate_music': 'Musik', 'guardian.gate_quoteCards': 'Zitatkarten', 'guardian.gate_customEmoji': 'Eigene Emojis', 'guardian.gate_publicProfile': 'Oeffentlich sichtbar', 'guardian.gate_accountMove': 'Umziehen', 'guardian.gate_independence': 'Selbststaendig werden', 'guardian.gate_externalThreads': 'Antworten von Fremden', 'guardian.gate_externalEmbeds': 'Link-Vorschauen', 'guardian.gate_externalPlayback': 'Abspielen in der App', 'guardian.gate_follows': 'Folgeanfragen', 'guardian.gate_following': 'Anderen folgen', 'guardian.gate_kind_setting': 'Einstellung', 'guardian.gate_kind_perRequest': 'pro Anfrage', 'guardian.gate_kind_handover': 'gibt Zustaendigkeit ab', 'guardian.gate_default_off': 'aus (noch nichts entschieden)', 'guardian.gate_unknown': 'unbekannt', 'guardian.gate_always': 'Immer', 'guardian.gate_threshold': '{need} von {of} Guardians', 'guardian.gate_threshold_unknown': 'Schwelle unbekannt (andere Domain)', 'guardian.gate_irreversible': 'nicht rueckgaengig', 'guardian.gate_waiting': '{n} wartet auf euch', 'guardian.gate_blocked': 'geht erst, wenn {what} an ist', 'guardian.gate_propose_open': 'Vorschlagen: oeffnen', 'guardian.gate_propose_close': 'Vorschlagen: schliessen', 'guardian.gate_propose': 'Vorschlagen', 'push.n_gate_ask_t': 'Deine Antwort wird gebraucht', 'push.n_gate_ask_b': 'Vorschlag fuer {who}: {wat} {stand}', 'push.n_gate_done_t': 'Entscheidung gefallen', 'push.n_gate_done_b': '{wat} {stand} fuer {who}: {uitkomst}', 'push.n_test_t': 'Klonkt-Testmeldung', 'push.n_test_b': 'Funktioniert. So kommen Meldungen auf diesem Gerät an.',
     1967    'push.n_follow_t': 'Neuer Follower', 'push.n_follow_b': '{who} folgt dir jetzt', 'push.n_reply_t': 'Antwort auf "{title}"', 'push.n_mention_t': 'Erwähnung', 'push.n_dm_t': 'Private Nachricht', 'push.n_dm_b': 'Neue Nachricht von {who}', 'push.n_like_t': 'Neues Like', 'push.n_like_b': '{who} gefällt "{title}"', 'push.n_boost_t': 'Geboostet', 'push.n_boost_b': '{who} hat "{title}" geboostet', 'msg.guard_offer': 'möchte dein Guardian werden. Besprich das mit deinen Eltern oder Betreuern, bevor du entscheidest.', 'msg.guard_accept': 'Annehmen', 'msg.guard_reject': 'Ablehnen', 'msg.guard_accepted': 'Guardian angenommen. Ihr seid jetzt verbunden.', 'msg.guard_rejected': 'Angebot abgelehnt.', 'msg.guard_failed': 'Das hat nicht geklappt; versuch es erneut.', 'msg.guardians_label': 'Deine Guardians', 'msg.waved_at_you': 'hat dir zugewinkt', 'msg.help_request': 'hat um Hilfe gebeten', 'msg.g_available': 'verfuegbar', 'msg.g_away': 'abwesend bis {date}', 'msg.g_offline': 'offline', 'msg.wave_r1': 'Wie schön!', 'msg.wave_r2': 'Ruf mich an', 'msg.wave_back': '👋 Zurück', 'msg.wave_sent': 'Winken gesendet.', 'msg.reply_sent': 'Antwort gesendet.', 'msg.reply_failed': 'Die Antwort konnte nicht gesendet werden.', 'msg.reply_empty': 'Eine leere Antwort kann nicht gesendet werden.', 'guardian.feed_title': 'Deine Wards', 'guardian.feed_sub': 'Lies mit, was deine Wards posten. Nur schauen.', 'guardian.follow_title': 'Follow-Anfragen', 'guardian.follow_sub': 'Jemand möchte einem deiner Wards folgen. Du entscheidest.', 'guardian.wave': '👋 Winken', 'guardian.waved': '👋 gesendet', 'ward.feed': 'Von deinen Freunden', 'ward.feed_empty': 'Noch nichts. Folge jemandem, dann erscheint es hier.', 'ward.buoy_hint': 'Zieh die Rettungsboje auf einen Beitrag, um deine Guardians dazuzuholen.', 'ward.help_words': 'Möchtest du etwas dazu sagen?', 'ward.help_send': 'An meine Guardians senden', 'ward.help_sent': 'Deine Guardians wissen Bescheid.', 'ward.cancel': 'Abbrechen', 'ward.to_sky': 'Nachrichten', 'ward.to_cards': 'Karten', 'ward.sky_empty': 'Noch keine Gespräche. Schreib jemandem, oder lass dir schreiben.', 'ward.hand_hint': 'Zieh die Hand auf ein Gesicht, um zu winken.', 'ward.close': 'Zurück', 'ward.write_here': 'Schreib etwas...', 'ward.send': 'Senden', 'ward.wave': 'Winken', 'ward.wave_call': 'Ruf mich an', 'ward.wave_thanks': 'Danke!', 'ward.not_now': 'Jetzt nicht', 'ward.wave_to': 'Bei {who} winken?', 'ward.app_name': 'Klonkt Ward', 'ward.guardians': 'Wer über dich wacht', 'ward.no_guardians': 'Du hast noch keine Guardians.', 'ward.offers': 'Anfragen', 'ward.waiting': 'Wartet auf deine Guardians', 'ward.help': 'Ich brauche Hilfe', 'guardian.app_name': 'Klonkt Guardian', 'guardian.tagline': 'Wards verwalten und Hilferufe auffangen.', 'guardian.acting_as': 'Du handelst als', 'guardian.help_title': 'Hilferufe', 'guardian.help_sub': 'Wenn ein Ward die Rettungsboje nutzt, erscheint es hier.', 'guardian.help_empty': 'Keine Hilferufe. Gut so.', 'guardian.adopt_title': 'Ward adoptieren', 'guardian.adopt_sub': 'Gib das Handle des Kindes ein (@kind@server.eu). Es bekommt ein Angebot in seinem Klonkt zum Annehmen.', 'guardian.adopt_label': 'Ward-Handle', 'guardian.adopt_btn': 'Angebot senden', 'guardian.pending_title': 'Gesendete Angebote', 'guardian.pending_sub': 'Warten, bis der Ward annimmt.', 'guardian.wards_title': 'Meine Wards', 'guardian.play_propose': 'Abspielen vorschlagen', 'guardian.play_on': 'Abspielen: an', 'guardian.play_off': 'Abspielen: aus', 'guardian.gated_title': 'Einstellung vorgeschlagen', 'guardian.gated_line_on': '{who} moechte Link-Vorschauen fuer {ward} EINschalten.', 'guardian.gated_line_off': '{who} moechte Link-Vorschauen fuer {ward} AUSschalten.', 'guardian.gated_agree': 'Einverstanden', 'guardian.gated_disagree': 'Nicht einverstanden', 'guardian.avail_available': 'Verfuegbar', 'guardian.avail_away': 'Abwesend bis {date}', 'guardian.avail_dormant': 'Offline', 'guardian.panel_guards': 'Guardians dieses Kindes', 'guardian.panel_guards_remote': 'Dieses Kind lebt auf einem anderen Server; die Verfuegbarkeit wird dort gefuehrt.', 'guardian.lapse_propose': 'Vorschlag: Freigabe in Abwesenheit', 'guardian.lapse_line': '{who} antwortet nicht mehr als Guardian von {ward}.', 'guardian.lapse_tally': '{n} von {need} einverstanden; schliesst {date}; das Fenster laeuft immer voll.', 'guardian.lapse_note': 'Jedes Lebenszeichen von ihnen bricht dies sofort ab. Nichts hier ist Strafe.', 'guardian.lapse_agree': 'Einverstanden', 'guardian.lapse_disagree': 'Nicht einverstanden', 'guardian.voted': 'Du hast abgestimmt', 'guardian.away_title': 'Kurz abwesend', 'guardian.away_sub': 'Sag deinen Wards, dass du eine Weile nicht da bist. Entscheidungen warten nicht auf dich, und eine einzige Antwort bringt dich sofort zurueck.', 'guardian.away_week': 'Eine Woche', 'guardian.away_month': 'Ein Monat', 'guardian.away_done': 'Deine Wards wissen, dass du bis {date} abwesend bist.', 'guardian.away_msg': 'Ich bin als dein Guardian bis {date} abwesend. Deine anderen Guardians sind fuer dich da.', 'guardian.release_title': '{who} loslassen?', 'guardian.release_effect': 'Du bist dann nicht mehr Guardian. Du siehst ihre Beitraege nicht mehr, erhaeltst keine Hilferufe mehr von ihnen und entscheidest nicht mehr ueber Folgeanfragen fuer sie. Zurueck geht nur mit einem neuen Angebot, das sie annehmen.', 'guardian.release_local': 'Ihr Server und die anderen Guardians werden benachrichtigt, danach stehst du auch dort nicht mehr als Guardian.', 'guardian.release_step_down': 'Sie behalten ihre anderen Guardians und bleiben also Ward.', 'guardian.release_last': 'Du bist ihr letzter Guardian. Das ist Emanzipation, und FEP-633c 3.4 sagt ausdruecklich, dass darueber kein einzelner Guardian entscheidet: dafuer braucht es drei zustimmende Erwachsene oder eine Mehrheit plus zwei Zeugen. Dieser Knopf kann das also nicht: du bleibst ihr Guardian, bis das geregelt ist.', 'guardian.release_unknown': 'Wir konnten ihren Server nicht erreichen und wissen daher nicht, ob du ihr letzter Guardian bist.', 'guardian.release_yes': 'Ja, loslassen', 'guardian.release_no': 'Nein, doch nicht', 'guardian.settings_title': 'Einstellungen', 'guardian.panel_open': 'Ansehen', 'guardian.panel_close': 'Schliessen', 'guardian.panel_help': 'Hilferufe dieses Kindes', 'guardian.panel_help_empty': 'Noch keine Hilferufe.', 'guardian.panel_follow': 'Folgeanfragen', 'guardian.follow_out_line': 'möchte {who} folgen', 'guardian.panel_follow_empty': 'Keine offenen Folgeanfragen.', 'guardian.panel_posts': 'Neueste Beitraege', 'guardian.panel_posts_empty': 'Noch nichts zu sehen.', 'guardian.panel_actions': 'Aktionen', 'guardian.badge_help': 'Hilferufe', 'guardian.badge_follow': 'Folgeanfragen', 'guardian.badge_follow_one': 'Folgeanfrage', 'guardian.wards_empty': 'Noch keine Wards. Adoptiere oben eins.', 'guardian.push_title': 'Meldungen', 'guardian.push_sub': 'Erhalte eine Meldung bei einem Hilferuf oder einer Vormundschafts-Antwort, auch bei geschlossener App.', 'guardian.push_on': 'Meldungen einschalten', 'guardian.push_off': 'Meldungen sind an; tippen zum Ausschalten', 'guardian.sent': 'Angebot gesendet. Siehe unten bei Gesendete Angebote.', 'guardian.sent_retry': 'Angebot gespeichert; wir versuchen weiter zuzustellen.', 'guardian.sending': 'Senden…', 'guardian.not_found': 'Dieses Handle konnten wir nicht finden.', 'guardian.failed': 'Fehlgeschlagen', 'guardian.network': 'Netzwerkfehler.', 'guardian.pending': 'wartet auf Antwort', 'guardian.active': 'aktiv', 'guardian.retract': 'Zurückziehen', 'guardian.release': 'Loslassen', 'guardian.embeds_on': 'Linkvorschauen: an', 'guardian.embeds_off': 'Linkvorschauen: aus', 'guardian.embeds_propose': 'Linkvorschauen vorschlagen', 'guardian.embeds_waiting': 'wartet auf die anderen Guardians', 'guardian.prop_line': 'Vorschlag {what} {value}: {status}', 'guardian.prop_embeds': 'Link-Vorschauen', 'guardian.prop_play': 'Abspielen', 'guardian.prop_on': 'an', 'guardian.prop_off': 'aus', 'guardian.prop_st_open': 'wartet auf die anderen Guardians', 'guardian.prop_st_accepted': 'angenommen', 'guardian.prop_st_rejected': 'abgelehnt', 'guardian.prop_st_expired': 'abgelaufen ohne genug Stimmen', 'guardian.panel_guards_far': 'Verfuegbarkeit wird auf ihrem Server gefuehrt.', 'guardian.release_confirm': '{who} loslassen?\n\nDu bist dann nicht mehr Guardian. Du siehst ihre Beitraege nicht mehr, erhaeltst keine Hilferufe mehr von ihnen und entscheidest nicht mehr ueber Follow-Anfragen fuer sie.\n\nZurueck geht nur mit einem neuen Angebot, das sie annehmen.', 'guardian.open': 'öffnen', 'guardian.accept': 'Annehmen', 'guardian.reject': 'Ablehnen', 'guardian.complete': 'Abschließen', 'guardian.awaiting_others': 'wartet auf die anderen Parteien', 'guardian.coguard': 'Mit-Vormundschaftsangebot', 'guardian.push_unavailable': 'Push nicht verfügbar', 'push.n_help_t': 'Hilferuf', 'push.n_help_b': '{who} bittet um deine Hilfe', 'push.n_guard_offer_t': 'Vormundschaftsangebot', 'push.n_guard_offer_b': '{who} möchte dich als Guardian', 'push.n_guard_ward_t': 'Ward akzeptiert', 'push.n_guard_left_t': 'Ein Guardian ist zurueckgetreten', 'push.n_guard_left_b': '{who} ist nicht mehr dein Guardian', 'push.n_guard_cogleft_t': 'Mit-Guardian zurueckgetreten', 'push.n_guard_cogleft_b': '{who} hat die Guardianship beendet', 'push.n_guard_ward_b': '{who} hat dich als Guardian akzeptiert', 'push.n_guard_cog_t': 'Mit-Vormundschaft gefragt', 'push.n_guard_cog_b': 'Ein Guardian-Angebot für {who} braucht dich', 'push.n_guard_folin_t': 'Folgeanfrage', 'push.n_guard_folin_b': '{who} möchte {ward} folgen', 'push.n_guard_folout_t': 'Dein Mündel möchte jemandem folgen', 'push.n_guard_folout_b': '{ward} fragt, ob es {who} folgen darf', 'guardian.panel_history': 'Verlauf ({n})', 'guardian.log_show': 'Verlauf zeigen', 'guardian.log_hide': 'Verlauf verbergen', 'guardian.ev_offer_rejected': 'Angebot abgelehnt', 'guardian.ev_offer_refused': 'Angebot verweigert', 'guardian.ev_committed': 'Vormundschaft bestätigt', 'guardian.ev_guardian_left': 'Guardian gegangen', 'guardian.ev_coguardian_left': 'Mit-Guardian gegangen', 'guardian.ev_gated_outcome': 'Tor entschieden', 'guardian.ev_lapse_opened': 'Freigabe vorgeschlagen', 'guardian.evr_not_a_teapot': 'der Kandidat ist selbst ein Mündel', 'guardian.help_archive': '{n} erledigt', 'guardian.help_archive_hide': 'ausblenden', 'guardian.help_former_ward': 'Nicht mehr dein Ward. Ihre anderen Guardians sind weiterhin fuer sie da.', 'guardian.warn_reversible': 'Was hier durchkommt, kommt nicht zurueck. Du kannst diese Einstellung spaeter wieder schliessen — was dein Kind gesehen hat, nicht.', 'guardian.warn_irreversible': 'Das laesst sich nicht rueckgaengig machen. Danach entscheidet sie selbst, und ihr koennt das nicht zuruecknehmen.', 'guardian.warn_unknown': 'Wir kennen diese Einstellung nicht, wissen also nicht, was durchkommt oder wie weit es reicht. Frag die Person, die es vorgeschlagen hat, bevor du zustimmst.', 'guardian.warn_decides': 'DEINE ANTWORT ENTSCHEIDET. Mit dir ist die Schwelle erreicht und es gilt sofort.', 'guardian.warn_not_last': 'Danach muss noch jemand antworten, bevor das gilt.', 'guardian.warn_tally_elsewhere': 'Wir sehen nicht, wie viele Guardians schon geantwortet haben — das zaehlt der Server des Kindes. Dein Ja kann den Ausschlag geben.', 'guardian.warn_go': 'Ja, das vorschlagen', 'guardian.warn_back': 'Nein, doch nicht', 'guardian.help_pick': 'Ich kuemmere mich', 'guardian.help_close': 'Als erledigt markieren', 'guardian.help_picked_by': '{who} kuemmert sich darum', 'guardian.help_handled_by': 'Erledigt von {who}', 'guardian.help_handled_note': 'Das bleibt stehen. Geht es noch weiter, fragt das Kind erneut.', 'guardian.help_close_ask': 'Sicher? Das laesst sich nicht rueckgaengig machen. Geht es noch weiter, bittet das Kind erneut um Hilfe.', 'guardian.help_close_yes': 'Ja, erledigt', 'guardian.help_just_now': 'gerade eben', 'guardian.help_hours': 'vor {n} Std.', 'guardian.help_days': 'vor {n} Tagen', 'guardian.gate_unavailable': 'noch nicht verfuegbar', 'guardian.gate_planned_note': 'Das gibt es auf diesem Server noch nicht.', 'guardian.gates_summary': '{n} Tore - {on} an, {wait} warten', 'guardian.gates_show': 'Tore zeigen', 'guardian.gates_hide': 'Tore ausblenden', 'guardian.gate_images': 'Bilder', 'guardian.gate_messages': 'Nachrichten', 'guardian.gate_asked': 'Dein Kind hat selbst darum gebeten.', 'guardian.gate_replies': 'Antworten in einem Gespraech', 'guardian.gate_compose': 'Selbst posten', 'guardian.gate_music': 'Musik', 'guardian.gate_quoteCards': 'Zitatkarten', 'guardian.gate_customEmoji': 'Eigene Emojis', 'guardian.gate_publicProfile': 'Oeffentlich sichtbar', 'guardian.gate_accountMove': 'Umziehen', 'guardian.gate_independence': 'Selbststaendig werden', 'guardian.gate_externalThreads': 'Antworten von Fremden', 'guardian.gate_externalEmbeds': 'Link-Vorschauen', 'guardian.gate_externalPlayback': 'Abspielen in der App', 'guardian.gate_follows': 'Folgeanfragen', 'guardian.gate_following': 'Anderen folgen', 'guardian.gate_kind_setting': 'Einstellung', 'guardian.gate_kind_perRequest': 'pro Anfrage', 'guardian.gate_kind_handover': 'gibt Zustaendigkeit ab', 'guardian.gate_default_off': 'aus (noch nichts entschieden)', 'guardian.gate_unknown': 'unbekannt', 'guardian.gate_always': 'Immer', 'guardian.gate_threshold': '{need} von {of} Guardians', 'guardian.gate_threshold_unknown': 'Schwelle unbekannt (andere Domain)', 'guardian.gate_irreversible': 'nicht rueckgaengig', 'guardian.gate_waiting': '{n} wartet auf euch', 'guardian.gate_blocked': 'geht erst, wenn {what} an ist', 'guardian.gate_propose_open': 'Vorschlagen: oeffnen', 'guardian.gate_propose_close': 'Vorschlagen: schliessen', 'guardian.gate_propose': 'Vorschlagen', 'push.n_gate_ask_t': 'Deine Antwort wird gebraucht', 'push.n_gate_ask_b': 'Vorschlag fuer {who}: {wat} {stand}', 'push.n_gate_done_t': 'Entscheidung gefallen', 'push.n_gate_done_b': '{wat} {stand} fuer {who}: {uitkomst}', 'push.n_test_t': 'Klonkt-Testmeldung', 'push.n_test_b': 'Funktioniert. So kommen Meldungen auf diesem Gerät an.',
    19681968    'apaid.t': 'Bezahlte Beiträge', 'apaid.intro': 'Verbinde deine eigene Patreon-Kampagne. Unterstützer entsperren bezahlte Beiträge mit einem Passkey, ohne Konto und ohne Cookie. Wir speichern keine Namen oder E-Mail-Adressen von Unterstützern, nur das verschlüsselte Token deiner Kampagne.', 'apaid.saved': 'Gespeichert.', 'apaid.nokey': 'Achtung: der Verschlüsselungsschlüssel konnte nicht erstellt oder gelesen werden (Schreibrechte auf dem Speicherordner?). Ohne Schlüssel können Secrets nicht sicher gespeichert werden.', 'apaid.status': 'Status:', 'apaid.connected': 'verbunden', 'apaid.campaign': 'Kampagne', 'apaid.configured': 'eingerichtet, noch nicht verbunden (Token eintragen)', 'apaid.notyet': 'noch nicht eingerichtet', 'apaid.redirect_h': 'Trage diese Redirect-URI in deinen Patreon-Client ein', 'apaid.redirect_p': 'In deinem Patreon-API-Client muss unter Redirect URIs genau diese Zeile stehen. Stimmt sie nicht, zeigt Patreon eine Fehlermeldung statt deine Unterstützer zurückzuschicken.', 'apaid.copy': 'Kopieren', 'apaid.copied': 'Kopiert', 'apaid.client_id': 'Patreon Client-ID', 'apaid.client_secret': 'Patreon Client-Secret', 'apaid.keep': 'Leer lassen = aktuellen Wert behalten.', 'apaid.campaign_id': 'Kampagnen-ID', 'apaid.public_page': 'Öffentliche Patreon-Seite', 'apaid.public_help': 'Der Link, unter dem Besucher Unterstützer werden können. Wird als "Unterstützer werden" gezeigt, wenn jemand noch nicht spendet.', 'apaid.access': 'Creator Access-Token', 'apaid.refresh': 'Creator Refresh-Token', 'apaid.token_help': 'Access- und Refresh-Token bekommst du auf deiner Patreon-API-Client-Seite. Wir verschlüsseln sie und erneuern automatisch.', 'apaid.min_eur': 'Standard-Unterstützungsbetrag für einen bezahlten Beitrag (Euro)', 'apaid.save': 'Speichern', 'apaid.disconnect': 'Verbindung entfernen', 'apaid.disconnect_confirm': 'Patreon-Verbindung entfernen?', 'apaid.unchanged': 'bleibt unverändert',
    19691969    'pgate.h': 'Für Unterstützer', 'pgate.sub': 'Dieser Beitrag ist für Unterstützer dieser Seite. Werde Unterstützer und entsperre ihn danach mit einem Passkey. Kein Konto auf dieser Seite, kein Cookie.', 'pgate.sub_cents': 'Dieser Beitrag ist für Unterstützer dieser Seite (ab €{eur} pro Monat auf Patreon). Werde Unterstützer und entsperre ihn danach mit einem Passkey. Kein Konto auf dieser Seite, kein Cookie.', 'pgate.join': 'Unterstützer werden auf Patreon', 'pgate.unlock_have': 'Schon Unterstützer? Entsperren', 'pgate.unlock': 'Mit Patreon entsperren', 'pgate.join_short': 'Unterstützer werden', 'pgate.confirm': 'Bestätige mit deinem Passkey…', 'pgate.failed': 'Entsperren fehlgeschlagen. Versuch es erneut.', 'pgate.error': 'Etwas ist schiefgegangen. Versuch es erneut.',
  • src/views/pages/ward.ejs

    r084b046 r5218863  
    5858  <p id="buoy-hint" class="sr-only"><%= state.strings.buoyHint %></p>
    5959
     60  <!-- De zwaai-hand (§5): alleen in berichtenstand, dezelfde hoek als de
     61       boei. Ze wisselen elkaar af: met de kaarten verdwijnt de boei, op de
     62       hemel hangt de hand. -->
     63  <button id="hand" type="button" hidden aria-describedby="hand-hint">👋</button>
     64  <p id="hand-hint" class="sr-only"><%= state.strings.handHint %></p>
     65
     66  <!-- Het gesprek schuift OVER de hemel; die blijft eronder gewoon draaien. -->
     67  <section id="thread" hidden>
     68    <header>
     69      <button id="thread-close" type="button" aria-label="<%= state.strings.close %>">←</button>
     70      <h2 id="thread-name"></h2>
     71    </header>
     72    <div id="thread-list"></div>
     73    <form id="thread-form">
     74      <input id="thread-text" type="text" autocomplete="off" maxlength="2000"
     75             placeholder="<%= state.strings.writeHere %>">
     76      <button type="submit" class="primary"><%= state.strings.send %></button>
     77    </form>
     78  </section>
     79
     80  <!-- Het zwaai-paneel: de tekst die je kiest IS het bericht. -->
     81  <dialog id="wave-dialog">
     82    <h2 id="wave-title"></h2>
     83    <div class="wave-answers">
     84      <button data-wave="1">👋 <%= state.strings.wave %></button>
     85      <button data-text="<%= state.strings.waveCall %>"><%= state.strings.waveCall %></button>
     86      <button data-text="<%= state.strings.waveThanks %>"><%= state.strings.waveThanks %></button>
     87    </div>
     88    <button id="wave-cancel" type="button"><%= state.strings.notNow %></button>
     89  </dialog>
     90
    6091  <dialog id="help-dialog">
    6192    <form method="dialog">
  • test/ward-pwa.test.js

    r084b046 r5218863  
    172172  } finally { server.close(); }
    173173});
     174
     175
     176test('het gesprek draagt beide kanten en een zwaai heet een zwaai', async () => {
     177  // Eén binnengekomen bericht (ap_mentions) en één eigen antwoord (ap_outbox,
     178  // direct). Het gesprek moet ze allebei dragen, elk met zijn richting.
     179  const VRIEND = 'https://elders.example/ap/users/vriend';
     180  db.prepare(`INSERT INTO ap_mentions (slug, object_uri, actor_uri, actor_name, actor_handle, content, wave, published, created_at)
     181              VALUES ('mee', 'https://elders.example/n/w1', ?, 'Vriend', '@vriend@elders.example', '<p>👋</p>', 1, datetime('now'), datetime('now'))`)
     182    .run(VRIEND);
     183  // post_id is NOT NULL (een reply hangt normaal onder een post); een direct
     184  // bericht draagt daar een leeg anker, precies zoals deliverDirectNote doet.
     185  db.prepare(`INSERT INTO ap_outbox (id, site_slug, post_id, in_reply_to, content, visibility, to_actors, created_at)
     186              VALUES ('out-1', 'mee', '', NULL, '<p>hoi terug</p>', 'direct', ?, datetime('now', '+1 minute'))`)
     187    .run(JSON.stringify([VRIEND]));
     188
     189  const { server, port } = await listen(appWith({ user: { id: 'u1' } }));
     190  try {
     191    const r = await fetch(`http://127.0.0.1:${port}/ward/api/thread?with=${encodeURIComponent(VRIEND)}`);
     192    assert.equal(r.status, 200);
     193    const { items } = await r.json();
     194    const dirs = items.map((i) => i.dir).sort();
     195    assert.deepEqual(dirs, ['in', 'out'], 'een kant van het gesprek ontbreekt');
     196    // De zwaai-vlag overleeft de reis: de client toont hem groter, en dat kan
     197    // alleen als de server hem niet als kale tekst plat slaat.
     198    assert.equal(items.find((i) => i.dir === 'in').wave, true);
     199  } finally { server.close(); }
     200});
     201
     202test('een bericht sturen eist een echte ontvanger en echte tekst', async () => {
     203  const { server, port } = await listen(appWith({ user: { id: 'u1' } }));
     204  try {
     205    const post = (body) => fetch(`http://127.0.0.1:${port}/ward/api/message`, {
     206      method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body),
     207    });
     208    // Geen uri: weigeren, want "aan niemand" bestaat niet.
     209    assert.equal((await post({ to: 'vriend', text: 'hoi' })).status, 400);
     210    // Lege tekst: weigeren, een leeg bericht versturen kan niet.
     211    assert.equal((await post({ to: 'https://elders.example/ap/users/vriend', text: '  ' })).status, 400);
     212  } finally { server.close(); }
     213});
Note: See TracChangeset for help on using the changeset viewer.