Files
JUSNandClaude Opus 5 585f027ba5 Bezahlseite erscheint in der Sprache des Nutzers
Wer von der tuerkischen Seite kam, landete bisher auf einer deutschen
Stripe-Seite — fuer die Zielgruppe die groesste Huerde im Kaufvorgang.

/kaufen nimmt jetzt 'sprache' entgegen und gibt sie als locale an Stripe
weiter. Nur Sprachen aus STRIPE_SPRACHEN werden geschickt: Ein unbekannter
Wert laesst Stripe die Session mit 400 ablehnen, der Kauf waere kaputt. Fuer
Arabisch, Tigrinya usw. (kennt Stripe nicht) wird nichts mitgeschickt, dann
waehlt Stripe selbst anhand des Browsers.

Alle drei Kauf-Stellen geben die Sprache mit: Sprachseiten fest ihre eigene,
Demo-Seite die dort gewaehlte Zielsprache, Startseite 'de'.

Geprueft: tr/de/pl/ar liefern Bezahlseiten, und eine erfundene Sprache faellt
sauber zurueck statt den Kauf zu brechen.

Stripe Link (die vorausgewaehlte Schnellzahlung) laesst sich NICHT per API
abschalten — laut Stripe-Docs nur in den Zahlungsmethoden-Einstellungen des
Dashboards.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 15:59:46 +02:00

266 lines
13 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="{{LANG}}"{{DIR}}>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{TITEL}}</title>
<meta name="description" content="{{BESCHREIBUNG}}">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
<meta name="theme-color" content="#1d4e89">
{{HREFLANG}}
<link rel="canonical" href="{{URL}}">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<meta property="og:site_name" content="BehördenKlar">
<meta property="og:type" content="website">
<meta property="og:locale" content="{{LOCALE}}">
<meta property="og:url" content="{{URL}}">
<meta property="og:title" content="{{OG_TITEL}}">
<meta property="og:description" content="{{OG_BESCHREIBUNG}}">
<meta property="og:image" content="https://behoerdenklar.de/vorschau.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<style>
:root {
--papier: #faf7f0; --papier-dunkel: #f1ecdf; --tinte: #21211d;
--grau: #6b675e; --amtsblau: #1d4e89; --stempelrot: #b3372b;
--marker: #ffe66b; --gruen: #2e7d4f; color-scheme: light;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
font-family: Georgia, 'Times New Roman', serif;
background: repeating-linear-gradient(0deg, transparent 0 34px, rgba(33,33,29,0.025) 34px 35px), var(--papier);
color: var(--tinte); line-height: 1.7; font-size: 17px;
}
.mono { font-family: 'Courier New', ui-monospace, monospace; letter-spacing: 0.02em; }
.wrap { max-width: 720px; margin: 0 auto; padding: 0 20px 72px; }
.briefkopf {
display: flex; justify-content: space-between; align-items: baseline;
padding: 20px 0 12px; border-bottom: 2px solid var(--tinte); font-size: 14px;
}
.briefkopf .absender { font-weight: 700; font-size: 16px; }
.briefkopf .az { color: var(--grau); font-size: 13px; }
.sprachen { padding: 12px 0 0; font-size: 15px; color: var(--grau); display: flex; flex-wrap: wrap; gap: 6px 12px; align-items: center; }{{WAEHLER_CSS}}
header { padding: 40px 0 8px; }
h1 { font-size: clamp(30px, 6vw, 46px); line-height: 1.15; font-weight: 700; }
.markiert {
background: linear-gradient(104deg, transparent 2%, var(--marker) 4%, var(--marker) 96%, transparent 98%);
padding: 0 6px; box-decoration-break: clone; -webkit-box-decoration-break: clone;
}
.intro { margin-top: 22px; font-size: 18px; max-width: 580px; }
.hero-fuss { display: flex; align-items: center; gap: 20px; flex-wrap: wrap; margin-top: 28px; }
.cta {
display: inline-block; padding: 16px 28px; background: var(--amtsblau); color: #fff;
text-decoration: none; font-family: inherit; font-size: 17px; font-weight: 700;
border: 2px solid var(--tinte); box-shadow: 5px 5px 0 var(--tinte);
transition: transform .12s ease, box-shadow .12s ease;
}
.cta:hover { transform: translate(2px,2px); box-shadow: 3px 3px 0 var(--tinte); }
.cta-sek { background: #fff; color: var(--amtsblau); }
.stempel {
display: inline-block; padding: 7px 14px; border: 2.5px solid var(--stempelrot);
color: var(--stempelrot); font-family: 'Courier New', ui-monospace, monospace;
font-weight: 700; font-size: 14px; letter-spacing: .1em; text-transform: uppercase;
transform: rotate(-4deg); opacity: .9;
}
section { margin-top: 56px; }
h2 {
font-size: 15px; text-transform: uppercase; letter-spacing: .14em; color: var(--grau);
font-weight: 400; margin-bottom: 18px; display: flex; align-items: center; gap: 12px;
}
h2::after { content: ''; flex: 1; border-top: 1px solid rgba(33,33,29,.25); }
.verwandlung { display: grid; gap: 14px; }
.brief-karte {
background: #fff; border: 1px solid rgba(33,33,29,.28); padding: 22px 24px;
position: relative; box-shadow: 4px 5px 0 rgba(33,33,29,.08);
}
.brief-karte.amtsdeutsch { transform: rotate(-.7deg); background: var(--papier-dunkel); }
.brief-karte.klartext { transform: rotate(.5deg); }
.karten-label {
position: absolute; top: -12px; inset-inline-start: 16px;
font-family: 'Courier New', ui-monospace, monospace; font-size: 12px;
text-transform: uppercase; letter-spacing: .1em;
background: var(--tinte); color: var(--papier); padding: 3px 10px;
}
.brief-karte.klartext .karten-label { background: var(--gruen); }
.amtsdeutsch p { font-family: 'Courier New', ui-monospace, monospace; font-size: 15px; direction: ltr; text-align: start; }
.pfeil { text-align: center; color: var(--grau); font-size: 15px; margin: 4px 0; }
.hinweis { margin-top: 18px; font-size: 15.5px; color: var(--grau); }
.schritte { display: grid; gap: 14px; }
.schritt { background: #fff; border: 1px solid rgba(33,33,29,.28); padding: 16px 20px; }
.schritt strong { font-weight: 700; }
.schritt span { color: var(--grau); }
.antrag {
background: #fff; border: 2px solid var(--tinte); box-shadow: 7px 8px 0 rgba(33,33,29,.9);
padding: 30px 28px; position: relative; margin-top: 8px;
}
.antrag .formular-kopf {
font-family: 'Courier New', ui-monospace, monospace; font-size: 13px;
text-transform: uppercase; letter-spacing: .1em; color: var(--grau); margin-bottom: 6px;
}
.antrag h3 { font-size: 26px; line-height: 1.25; }
.antrag p { margin-top: 12px; max-width: 540px; }
.bonus {
margin: 18px 0; padding: 14px 16px; font-size: 17px;
background: linear-gradient(104deg, transparent 1%, var(--marker) 3%, var(--marker) 97%, transparent 99%);
}
.antrag .klein { font-size: 13.5px; color: var(--grau); margin-top: 14px; }
.antrag .klein a { color: var(--grau); }
a { color: var(--amtsblau); }
footer { margin-top: 56px; padding-top: 14px; border-top: 2px solid var(--tinte); font-size: 14.5px; color: var(--grau); }
.wl-form { display: flex; flex-direction: column; gap: 12px; margin-top: 4px; }
.wl-input {
width: 100%; padding: 15px 16px; font-size: 17px; font-family: inherit;
border: 2px solid var(--tinte); background: #fff; color: var(--tinte);
}
.wl-input::placeholder { color: #9a958a; }
.wl-btn { width: 100%; cursor: pointer; text-align: center; font-family: inherit; }
details { border-bottom: 1px solid rgba(33,33,29,.28); padding: 14px 4px; }
summary { font-weight: 700; cursor: pointer; font-size: 17px; list-style: none; display: flex; justify-content: space-between; gap: 12px; }
summary::-webkit-details-marker { display: none; }
summary::after { content: '+'; font-family: 'Courier New', ui-monospace, monospace; font-size: 22px; color: var(--amtsblau); }
details[open] summary::after { content: '–'; }
details p { margin-top: 10px; color: var(--grau); font-size: 16px; }
</style>
<script type="application/ld+json">
{{SCHEMA}}
</script>
</head>
<body>
<div class="wrap">
<div class="briefkopf">
<span class="absender">📬 BehördenKlar <span style="font-weight:400;font-size:.62em;opacity:.6;letter-spacing:.04em;">by Webklar</span></span>
<span class="az mono">Az: KLAR-01/2026</span>
</div>
{{WAEHLER}}
<header>
<h1>{{H1_A}}<br><span class="markiert">{{H1_B}}</span></h1>
<p class="intro">{{INTRO}}</p>
<div class="hero-fuss">
<a class="cta" href="/demo?sprache={{LANG}}">📷 {{CTA_DEMO}}&nbsp;→</a>
<a class="cta cta-sek" href="#kaufen">{{CTA_KAUF}}</a>
</div>
<p style="margin-top: 16px; font-size: 15.5px; color: var(--grau);">
{{DEMO_HINWEIS}} &nbsp;·&nbsp; <a href="#anmelden">{{CTA_HERO}}</a>
</p>
</header>
<section>
<h2>§ 1 &nbsp;{{S1_TITEL}}</h2>
<div class="verwandlung">
<div class="brief-karte amtsdeutsch">
<span class="karten-label">{{VORHER_LABEL}}</span>
<p>
„Die Festsetzung erfolgt gemäß § 164 AO unter dem Vorbehalt der
Nachprüfung. Der Nachzahlungsbetrag ist binnen eines Monats nach
Bekanntgabe fällig."
</p>
</div>
<p class="pfeil">— 📷 {{PFEIL}} —</p>
<div class="brief-karte klartext">
<span class="karten-label">{{NACHHER_LABEL}}</span>
<p>{{NACHHER_TEXT}}</p>
</div>
</div>
<p class="hinweis">{{HINWEIS}}</p>
</section>
<section>
<h2>§ 2 &nbsp;{{S2_TITEL}}</h2>
<div class="schritte">
<div class="schritt"><div><strong>{{SCHRITT1_T}}</strong> <span>{{SCHRITT1_B}}</span></div></div>
<div class="schritt"><div><strong>{{SCHRITT2_T}}</strong> <span>{{SCHRITT2_B}}</span></div></div>
<div class="schritt"><div><strong>{{SCHRITT3_T}}</strong> <span>{{SCHRITT3_B}}</span></div></div>
</div>
</section>
<section id="kaufen">
<h2>§ 3 &nbsp;{{KAUF_TITEL}}</h2>
<div class="antrag" style="border-color: var(--amtsblau);">
<h3>{{KAUF_H3}}</h3>
<p>{{KAUF_TEXT}}</p>
<div id="paketListe" style="display: flex; flex-direction: column; gap: 12px; margin-top: 18px;"></div>
<p style="margin-top: 16px; background: #eef4fb; border-inline-start: 4px solid var(--amtsblau); padding: 12px 14px; font-size: 15px;">
📧 {{KAUF_EMAIL}}
</p>
<label style="display: flex; gap: 10px; align-items: flex-start; margin-top: 16px; font-size: 14px; line-height: 1.5; cursor: pointer;">
<input type="checkbox" id="kaufKonsens" style="margin-top: 3px; flex-shrink: 0;">
<span>{{KAUF_KONSENS}} <a href="/agb.html" target="_blank">AGB</a> · <a href="/widerruf.html" target="_blank">Widerruf</a> ({{AUF_DEUTSCH}})</span>
</label>
<p id="kaufFehler" style="display: none; margin-top: 12px; color: #b3261e; font-size: 14px; font-weight: 600;"></p>
<p class="klein">🔒 {{KAUF_SICHER}}</p>
</div>
</section>
<section id="anmelden">
<h2>§ 4 &nbsp;{{S3_TITEL}}</h2>
<div class="antrag">
<p class="formular-kopf">{{FORMULAR_KOPF}}</p>
<h3>{{FORM_H3}}</h3>
<p>{{FORM_TEXT}}</p>
<p class="bonus">🎁 {{BONUS}}</p>
<form class="wl-form" action="{{BREVO}}" method="POST">
<input class="wl-input" type="email" name="EMAIL" placeholder="{{EMAIL_PLATZHALTER}}" required autocomplete="email">
<input type="text" name="email_address_check" value="" style="position:absolute; left:-5000px;" tabindex="-1" autocomplete="off" aria-hidden="true">
<input type="hidden" name="locale" value="de">
<input type="hidden" name="html_type" value="simple">
<button class="cta wl-btn" type="submit">{{CTA_FORM}} →</button>
</form>
<p class="klein">{{KLEIN}} <a href="datenschutz.html">{{DATENSCHUTZ}}</a>.</p>
</div>
</section>
<section>
<h2>§ 5 &nbsp;{{S4_TITEL}}</h2>
{{FAQ_HTML}}
</section>
<footer>
{{FUSS_FRAGE}} 📧 <a href="mailto:behoerdenbriefhelfer@gmail.com">behoerdenbriefhelfer@gmail.com</a>
&nbsp;·&nbsp; <a href="impressum.html">{{IMPRESSUM}}</a>
&nbsp;·&nbsp; <a href="datenschutz.html">{{DATENSCHUTZ}}</a>
</footer>
</div>
<script>
(function () {
'use strict';
var BASIS = 'https://behoerdenklar-proxy.behoerdenbrief.workers.dev';
var PAKETE = [
{ priceId: 'price_1U6BNnBsRA1AOdnedGW5eefh', titel: '5', preis: '2,99 €' },
{ priceId: 'price_1U6BPRBsRA1AOdnemDUalzb8', titel: '15', preis: '6,99 €', best: true }
];
var liste = document.getElementById('paketListe');
var konsens = document.getElementById('kaufKonsens');
var fehler = document.getElementById('kaufFehler');
if (!liste) return;
konsens.addEventListener('change', function () { if (konsens.checked) fehler.style.display = 'none'; });
PAKETE.forEach(function (p) {
var b = document.createElement('button');
b.className = 'cta'; b.type = 'button';
b.style.width = '100%'; b.style.display = 'flex';
b.style.justifyContent = 'space-between'; b.style.alignItems = 'center';
var l = document.createElement('span');
l.textContent = (p.best ? '⭐ ' : '') + p.titel + ' \u00D7 {{PAKET_WORT}}';
var r = document.createElement('strong'); r.textContent = p.preis;
b.appendChild(l); b.appendChild(r);
b.addEventListener('click', function () { starte(p.priceId, b); });
liste.appendChild(b);
});
function starte(priceId, knopf) {
if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = '{{KAUF_FEHLER_HAKEN}}'; konsens.focus(); return; }
fehler.style.display = 'none';
var alt = knopf.innerHTML; knopf.disabled = true;
fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: '{{LANG}}' }) })
.then(function (r) { return r.json(); })
.then(function (d) { if (d && d.url) { window.location.href = d.url; return; } throw new Error('x'); })
.catch(function () { knopf.disabled = false; knopf.innerHTML = alt; fehler.style.display = 'block'; fehler.textContent = '{{KAUF_FEHLER_ALLG}}'; });
}
})();
</script>
<!-- Cloudflare Web Analytics: cookielose Reichweitenmessung, keine Nutzer-Profile -->
<script type='module' src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "11f017e9a707466b9151921db6125dde"}'></script>
</body>
</html>