/* global React */
const { useState, useContext, createContext, useEffect } = React;
// ============================================================
// i18n
// ============================================================
const STRINGS = {
de: {
htmlLang: 'de',
nav: { features: 'Funktionen', security: 'Sicherheit', pricing: 'Preise', faq: 'FAQ', cta: 'Auf die Warteliste' },
hero: {
badge: 'Bald verfügbar — iOS & Android',
titleA: 'Behördenpost', titleB: 'im Griff.',
body: 'Fotografieren Sie einen Brief vom Finanzamt, Jobcenter oder der Bußgeldstelle — FristRadar erkennt die Frist, plant die Schritte und erstellt die DIN 5008 Antwort.',
cta: 'Auf die Warteliste',
ghost: 'So funktioniert’s',
soon: 'Bald verfügbar',
tooltip: 'Bald im App Store & Play Store — jetzt vormerken lassen.',
},
mini: {
brand: 'FristRadar', scan: 'Brief scannen', latest: 'Letzte Briefe',
letters: [
{ from: 'Finanzamt Berlin‑Mitte', subj: 'Einkommensteuererklärung 2024', risk: 'high', days: '15', deadline: '19.03.2026' },
{ from: 'Bußgeldstelle Köln', subj: 'Anhörung – Geschwindigkeit', risk: 'mid', days: '22', deadline: '26.03.2026' },
{ from: 'Jobcenter München', subj: 'Weiterbewilligungsantrag', risk: 'low', days: '37', deadline: '10.04.2026' },
],
heroLetterFrom: 'FINANZAMT BERLIN‑MITTE',
heroLetterDeadline: 'Frist: 19.03.2026',
daysWord: 'Tage',
risks: { high: 'Hohes Risiko', mid: 'Mittleres', low: 'Geringes' },
},
waitlist: {
badge: 'Early Bird', title: 'Werde Early Bird.',
bodyA: 'Trag dich in die Warteliste ein und erhalte ',
bodyB: '3–6 Monate FristRadar Premium kostenlos',
bodyC: ', sobald die App live ist.',
placeholder: 'ihre@email.de', cta: 'Vormerken',
ctaSending: 'Wird gesendet…',
reassure: 'Kein Spam. Wir melden uns nur einmal — wenn die App startet.',
successTitle: 'Sie sind dabei.',
successBody: 'Wir haben Ihnen eine Bestätigung an Ihre E-Mail-Adresse geschickt.',
errorInvalid: 'Bitte geben Sie eine gültige E-Mail-Adresse ein.',
errorGeneric: 'Etwas ist schiefgelaufen. Bitte später noch einmal versuchen.',
},
problem: {
eyebrow: 'Das Problem',
title: 'Eine verpasste Frist kann teuer werden.',
body: 'Behördenbriefe kommen in Papier. Sie liegen Tage auf dem Küchentisch. Niemand erinnert. Niemand trackt. Eine versäumte Frist kostet Geld, manchmal eine Genehmigung, manchmal mehr — und es gibt schlicht kein System dafür.',
},
how: {
eyebrow: 'So funktioniert’s',
title: 'Vier Schritte vom Brief zum Nachweis.',
steps: [
{ n: '01', t: 'Foto machen', d: 'Fotografieren Sie den Brief — vorne und hinten. Die Texterkennung läuft auf Ihrem Gerät.' },
{ n: '02', t: 'Frist & Risiko sehen', d: 'FristRadar erkennt die Frist und stuft das Risiko ein: Was passiert, wenn Sie sie versäumen?' },
{ n: '03', t: 'Aktionsplan + Antwort', d: 'Schritt‑für‑Schritt‑Plan plus eine fertige Antwortvorlage im DIN 5008 Format.' },
{ n: '04', t: 'Nachweis ablegen', d: 'Versandbeleg fotografieren. Tracking‑Nummer eintragen. Frist sauber abgeschlossen.' },
],
},
features: {
eyebrow: 'Funktionen',
title: 'Alles, was zwischen Briefkasten und Frist passiert.',
items: [
{ t: 'Frist‑Erkennung mit Risikostufe', d: 'Drei Stufen: hoch, mittel, gering — mit konkreter Konsequenz in Euro.' },
{ t: 'Aktionsplan pro Behörde', d: 'Vorgefertigte Schritte für Finanzamt, Jobcenter, Bußgeldstelle, Ausländerbehörde und mehr.' },
{ t: 'DIN 5008 Antwort‑Generator', d: 'Formaler Antwortbrief, fertig zum Drucken oder als PDF — Adressblock, Aktenzeichen, Betreff.' },
{ t: 'Nachweis‑Ordner', d: 'Posteingang, Sendebeleg, Tracking. Pro Brief ein vollständiger Vorgang.' },
{ t: 'Kalender‑Sync + Reminder', d: 'T‑7, T‑3, T‑1 als Push. „Erledigt"‑Knopf schließt die Frist sauber ab.' },
{ t: 'On‑Device OCR', d: 'Daten bleiben auf Ihrem Gerät. Cloud‑OCR nur, wenn Sie es ausdrücklich wählen.' },
],
},
authorities: {
eyebrow: 'Unterstützte Behörden',
title: 'Von Finanzamt bis Gericht.',
list: ['Finanzamt', 'Bußgeldstelle', 'Jobcenter / Agentur für Arbeit', 'Ausländerbehörde', 'Krankenkasse', 'Rentenversicherung', 'Bauamt', 'Kfz‑Zulassung', 'Kita / Schule', 'Gericht'],
},
privacy: {
eyebrow: 'Datenschutz',
title: 'Ihre Briefe bleiben Ihre Briefe.',
body: 'FristRadar ist für deutsche Nutzer gebaut — und das schließt deutschen Datenschutz‑Anspruch ein.',
items: [
['On‑Device OCR', 'Standard. Texterkennung passiert auf Ihrem Gerät — der Brief verlässt es nicht.'],
['EU‑only Hosting', 'Cloudflare EU. Keine Drittland‑Übermittlung, keine US‑Hyperscaler.'],
['Datenminimierung', 'Wir speichern nur, was die App braucht. Keine Werbe‑IDs, kein Tracking.'],
['Verschlüsselung', 'At rest und in transit. AES‑256 / TLS 1.3.'],
['Auto‑Löschung', 'Konfigurierbar pro Brief: nach 90, 180 oder 365 Tagen.'],
['Open Audit', 'Datenschutzkonzept und Sicherheitsbericht öffentlich einsehbar.'],
],
},
pricing: {
eyebrow: 'Preise', title: 'Klar, fair, deutsch.',
free: { name: 'Free', desc: 'Für gelegentliche Briefe.', price: '0 €', items: ['5 Scans pro Monat', '3 aktive Fristen', 'Manueller .ics‑Export', 'Vorlagen nur lesen'] },
premium: {
name: 'Premium', desc: 'Für alle, die alles im Griff brauchen.',
price: '4,99 €', perMonth: '/ Monat',
earlyBird: 'Early Bird · 3–6 Monate gratis',
earlyBirdNote: 'Auf der Warteliste: 3–6 Monate gratis',
items: ['Unbegrenzte Scans & Fristen', 'Auto‑Kalender‑Sync', 'Antwortvorlagen generieren & bearbeiten', 'DIN 5008 PDF‑Export', 'Cloud‑OCR (auch Handschrift)'],
},
},
faq: {
eyebrow: 'Fragen & Antworten', title: 'Was Sie wissen sollten.',
qa: [
['Wann startet die App?', 'Wir planen den Launch im Lauf des Jahres 2026 — iOS und Android gemeinsam. Early Birds bekommen die App eine Woche vor allen anderen.'],
['Was bekomme ich als Early Bird genau?', '3 bis 6 Monate FristRadar Premium kostenlos, sobald die App live ist. Die Länge richtet sich nach Ihrer Position auf der Warteliste.'],
['Wo werden meine Daten gespeichert?', 'Ausschließlich in der EU, gehostet bei Cloudflare EU. Texterkennung läuft standardmäßig auf Ihrem Gerät — nichts verlässt das Telefon ohne Ihre Zustimmung.'],
['Funktioniert das auch mit handschriftlichen Briefen?', 'Mit Premium: ja. Cloud‑OCR erkennt auch deutsche Handschrift in Druckbuchstaben — Sie können das Ergebnis vor dem Speichern korrigieren.'],
['Welche Behörden werden unterstützt?', 'Finanzamt, Jobcenter, Bußgeldstelle, Ausländerbehörde, Krankenkasse, Rentenversicherung, Bauamt, Kfz‑Zulassung, Kita/Schule, Gericht. Andere Behörden lassen sich manuell anlegen.'],
['iOS und Android?', 'Beides. Beide Plattformen starten gleichzeitig.'],
],
},
footer: {
tagline: 'Behördenpost im Griff. Frist erkennen, handeln, Nachweis sichern.',
colProduct: 'Produkt', colLegal: 'Rechtliches', colContact: 'Kontakt',
productLinks: [['Funktionen', '#funktionen'], ['Sicherheit', '#sicherheit'], ['Preise', '#preise'], ['FAQ', '#faq']],
legalLinks: [['Impressum', 'https://teknora.de/de/contact#legal'], ['Datenschutz', 'https://teknora.de/de/privacy-policy']],
contactLinks: [['info@teknora.de', 'mailto:info@teknora.de'], ['Kontaktformular', 'https://teknora.de/de/contact']],
copyright: '© 2026 Teknora e.K. · Made in Germany',
},
},
en: {
htmlLang: 'en',
nav: { features: 'Features', security: 'Privacy', pricing: 'Pricing', faq: 'FAQ', cta: 'Join the waitlist' },
hero: {
badge: 'Coming soon — iOS & Android',
titleA: 'Government mail,', titleB: 'under control.',
body: 'Photograph a letter from the Finanzamt, Jobcenter or Bußgeldstelle — FristRadar detects the deadline, plans the steps, and drafts a DIN 5008 reply for you.',
cta: 'Join the waitlist',
ghost: 'How it works',
soon: 'Coming soon',
tooltip: 'Coming to App Store & Play Store — sign up to be notified.',
},
mini: {
brand: 'FristRadar', scan: 'Scan letter', latest: 'Recent letters',
letters: [
{ from: 'Finanzamt Berlin‑Mitte', subj: 'Income tax return 2024', risk: 'high', days: '15', deadline: '19.03.2026' },
{ from: 'Bußgeldstelle Köln', subj: 'Hearing — speeding', risk: 'mid', days: '22', deadline: '26.03.2026' },
{ from: 'Jobcenter München', subj: 'Benefits renewal', risk: 'low', days: '37', deadline: '10.04.2026' },
],
heroLetterFrom: 'FINANZAMT BERLIN‑MITTE',
heroLetterDeadline: 'Deadline: 19.03.2026',
daysWord: 'days',
risks: { high: 'High risk', mid: 'Medium', low: 'Low' },
},
waitlist: {
badge: 'Early Bird', title: 'Become an early bird.',
bodyA: 'Join the waitlist and receive ',
bodyB: '3–6 months of FristRadar Premium for free',
bodyC: ' as soon as the app launches.',
placeholder: 'your@email.com', cta: 'Notify me',
ctaSending: 'Sending…',
reassure: 'No spam. We’ll write you exactly once — when the app goes live.',
successTitle: 'You’re on the list.',
successBody: 'We’ve sent a confirmation to your inbox.',
errorInvalid: 'Please enter a valid email address.',
errorGeneric: 'Something went wrong. Please try again later.',
},
problem: {
eyebrow: 'The problem',
title: 'A missed deadline can get expensive — fast.',
body: 'Government letters arrive on paper. They sit on the kitchen table for days. Nobody reminds you. Nobody tracks them. A missed deadline costs money, sometimes a permit, sometimes more — and there is simply no system for it.',
},
how: {
eyebrow: 'How it works',
title: 'Four steps from letter to proof of delivery.',
steps: [
{ n: '01', t: 'Take a photo', d: 'Photograph the letter — front and back. Text recognition runs on your device.' },
{ n: '02', t: 'See deadline & risk', d: 'FristRadar detects the deadline and rates the risk: what happens if you miss it?' },
{ n: '03', t: 'Action plan + reply', d: 'Step‑by‑step plan plus a ready‑to‑send DIN 5008 response template.' },
{ n: '04', t: 'File the proof', d: 'Photograph the postal receipt. Add the tracking number. Deadline cleanly closed.' },
],
},
features: {
eyebrow: 'Features',
title: 'Everything that happens between the mailbox and the deadline.',
items: [
{ t: 'Deadline detection with risk level', d: 'Three tiers: high, medium, low — with concrete consequences in euros.' },
{ t: 'Action plan per authority', d: 'Pre‑built steps for Finanzamt, Jobcenter, Bußgeldstelle, Ausländerbehörde and more.' },
{ t: 'DIN 5008 response generator', d: 'A formal reply letter, ready to print or as PDF — address block, file number, subject.' },
{ t: 'Proof folder', d: 'Inbox, postal receipt, tracking. One complete record per letter.' },
{ t: 'Calendar sync + reminders', d: 'T‑7, T‑3, T‑1 as push. “Done” button closes the deadline cleanly.' },
{ t: 'On‑device OCR', d: 'Your data stays on your device. Cloud OCR only when you explicitly choose it.' },
],
},
authorities: {
eyebrow: 'Supported authorities',
title: 'From Finanzamt to Gericht.',
list: ['Finanzamt', 'Bußgeldstelle', 'Jobcenter / Agentur für Arbeit', 'Ausländerbehörde', 'Krankenkasse', 'Rentenversicherung', 'Bauamt', 'Kfz‑Zulassung', 'Kita / Schule', 'Gericht'],
},
privacy: {
eyebrow: 'Privacy',
title: 'Your letters stay your letters.',
body: 'FristRadar is built for German users — and that includes a German‑level expectation of privacy.',
items: [
['On‑device OCR', 'Default. Text recognition runs on your device — the letter never leaves it.'],
['EU‑only hosting', 'Cloudflare EU. No third‑country transfers, no US hyperscalers.'],
['Data minimisation', 'We only store what the app needs. No advertising IDs, no tracking.'],
['Encryption', 'At rest and in transit. AES‑256 / TLS 1.3.'],
['Auto‑deletion', 'Configurable per letter: after 90, 180 or 365 days.'],
['Open audit', 'Privacy concept and security report publicly available.'],
],
},
pricing: {
eyebrow: 'Pricing', title: 'Clear, fair, no surprises.',
free: { name: 'Free', desc: 'For occasional letters.', price: '€ 0', items: ['5 scans per month', '3 active deadlines', 'Manual .ics export', 'Templates read‑only'] },
premium: {
name: 'Premium', desc: 'For everyone who needs all of it under control.',
price: '€ 4.99', perMonth: '/ month',
earlyBird: 'Early Bird · 3–6 months free',
earlyBirdNote: 'On the waitlist: 3–6 months free',
items: ['Unlimited scans & deadlines', 'Auto calendar sync', 'Generate & edit response templates', 'DIN 5008 PDF export', 'Cloud OCR (handwriting too)'],
},
},
faq: {
eyebrow: 'Questions & answers', title: 'What you should know.',
qa: [
['When is the app launching?', 'We are planning the launch during 2026 — iOS and Android together. Early birds get the app a week before everyone else.'],
['What exactly do I get as an early bird?', '3 to 6 months of FristRadar Premium for free, as soon as the app launches. The length depends on your position on the waitlist.'],
['Where is my data stored?', 'Exclusively in the EU, hosted on Cloudflare EU. Text recognition runs on your device by default — nothing leaves your phone without your consent.'],
['Does it work with handwritten letters?', 'With Premium: yes. Cloud OCR also recognises German block‑letter handwriting — and you can correct the result before saving.'],
['Which authorities are supported?', 'Finanzamt, Jobcenter, Bußgeldstelle, Ausländerbehörde, Krankenkasse, Rentenversicherung, Bauamt, Kfz‑Zulassung, Kita/Schule, Gericht. Other authorities can be added manually.'],
['iOS and Android?', 'Both. Both platforms launch at the same time.'],
],
},
footer: {
tagline: 'Government mail under control. Detect, act, prove.',
colProduct: 'Product', colLegal: 'Legal', colContact: 'Contact',
productLinks: [['Features', '#funktionen'], ['Privacy', '#sicherheit'], ['Pricing', '#preise'], ['FAQ', '#faq']],
legalLinks: [['Legal notice', 'https://teknora.de/en/contact#legal'], ['Privacy policy', 'https://teknora.de/en/privacy-policy']],
contactLinks: [['info@teknora.de', 'mailto:info@teknora.de'], ['Contact form', 'https://teknora.de/en/contact']],
copyright: '© 2026 Teknora e.K. · Made in Germany',
},
},
};
const I18nContext = createContext({ t: STRINGS.de, lang: 'de', setLang: () => {} });
const useT = () => useContext(I18nContext);
function I18nProvider({ children }) {
const initial = (() => {
if (typeof window === 'undefined') return 'de';
const saved = window.localStorage?.getItem('fristradar-lang');
if (saved === 'de' || saved === 'en') return saved;
const nav = (window.navigator?.language || 'de').toLowerCase();
return nav.startsWith('en') ? 'en' : 'de';
})();
const [lang, _setLang] = useState(initial);
const setLang = (l) => {
_setLang(l);
try { window.localStorage.setItem('fristradar-lang', l); } catch {}
document.documentElement.lang = STRINGS[l].htmlLang;
};
useEffect(() => { document.documentElement.lang = STRINGS[lang].htmlLang; }, [lang]);
return (
{t.hero.body}
{status === 'ok' ? t.waitlist.successBody : (<>{t.waitlist.bodyA}{t.waitlist.bodyB}{t.waitlist.bodyC}>)}
{status !== 'ok' && ( <> {status === 'error' && ({errorMsg}
)}{t.waitlist.reassure}
> )} {status === 'ok' && ({t.problem.body}
{t.privacy.body}
{a}