Web-Demo mehrsprachig + Sprachseiten bekommen Demo und Kauf

Beim Nachgehen der Frage 'warum gibt es auf den Sprachseiten kein Payment'
kam heraus: Die Web-Demo antwortete AUSSCHLIESSLICH auf Deutsch. Die
Uebersetzung war bisher reine App-Funktion — und die App gibt es noch nicht.
Kauf-Knoepfe auf der tuerkischen Seite haetten also 2,99 EUR fuer eine
deutsche Antwort kassiert. Deshalb zuerst der Worker:

- /demo nimmt jetzt 'zielsprache' entgegen (28 erlaubte Codes, Whitelist —
  der Wert geht nie als freier Text in den Prompt, sonst koennte man eigene
  Anweisungen einschleusen).
- Der deutsche Fachbegriff bleibt deutsch, nur dessen Erklaerung wird
  uebersetzt — der Nutzer muss ihn im Brief wiederfinden.
- demo.html hat eine Sprachauswahl und merkt sich die Wahl; die Sprachseiten
  verlinken mit ?sprache=xx.

Erst danach die Sprachseiten: Demo-Knopf als Haupt-Handlung (es gab bisher
GAR KEINEN — man konnte das Produkt in 27 Sprachen nicht einmal ausprobieren)
und ein Kauf-Abschnitt mit uebersetzter Pflicht-Einwilligung nach §356 BGB.

Geprueft: 27 Dateien ohne Syntaxfehler, keine offenen Platzhalter, Kauf
liefert cs_live_. Zwei Tippfehler im bulgarischen Text korrigiert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
JUSNandClaude Opus 5 committed 2026-09-19 16:27:59 +02:00
1 parent 5486a6aafb
commit 7780d381b3
32 files changed
+2157 -114

No files matched your search

+62 -4
View File
@@ -90,6 +90,7 @@
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;
@@ -282,9 +283,12 @@
<h1>نامه‌ای از یک اداره آلمانی؟<br><span class="markiert">حالا قابل فهم است.</span></h1>
<p class="intro">از نامه عکس بگیرید. BehördenKlar آن را با کلمات ساده — <strong>و به فارسی</strong> — توضیح می‌دهد. با همه مهلت‌ها و فهرست کارها.</p>
<div class="hero-fuss">
<a class="cta" href="#anmelden">به فهرست انتظار بپیوندید&nbsp;→</a>
<span class="stempel">به‌زودی روی iPhone</span>
<a class="cta" href="/demo?sprache=fa">📷 همین حالا رایگان امتحان کنید&nbsp;→</a>
<a class="cta cta-sek" href="#kaufen">خرید اعتبار</a>
</div>
<p style="margin-top: 16px; font-size: 15.5px; color: var(--grau);">
۲ تحلیل رایگان — بدون حساب کاربری. &nbsp;·&nbsp; <a href="#anmelden">به فهرست انتظار بپیوندید</a>
</p>
</header>
<section>
@@ -316,8 +320,26 @@
</div>
</section>
<section id="kaufen">
<h2>§ 3 &nbsp;اعتبار بخرید و فوراً شروع کنید</h2>
<div class="antrag" style="border-color: var(--amtsblau);">
<h3>نامه‌های بیشتری را توضیح دهید</h3>
<p>لازم نیست صبر کنید: اعتبار بخرید و BehördenKlar را همین‌جا در مرورگر استفاده کنید — روی هر دستگاهی، بدون برنامه. اعتبار شما منقضی نمی‌شود.</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;">
📧 هنگام پرداخت نشانی ایمیل خود را وارد کنید. یک پیوند دسترسی شخصی دریافت می‌کنید — با آن اعتبارتان روی هر دستگاهی کار می‌کند.
</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>صراحتاً درخواست می‌کنم خدمات بلافاصله پس از خرید آغاز شود و می‌دانم که حق انصراف من با این کار از بین می‌رود. <a href="/agb.html" target="_blank">AGB</a> · <a href="/widerruf.html" target="_blank">Widerruf</a> (به آلمانی)</span>
</label>
<p id="kaufFehler" style="display: none; margin-top: 12px; color: #b3261e; font-size: 14px; font-weight: 600;"></p>
<p class="klein">🔒 پرداخت امن از طریق Stripe. بدون مالیات بر ارزش افزوده (§19 UStG). ارائه‌دهنده: Webklar GbR — در صورتحساب شما «Webklar» نمایش داده می‌شود.</p>
</div>
</section>
<section id="anmelden">
<h2>§ 3 &nbsp;دسترسی زودهنگام</h2>
<h2>§ 4 &nbsp;دسترسی زودهنگام</h2>
<div class="antrag">
<p class="formular-kopf">فرم F-01 · فهرست انتظار</p>
<h3>جزو اولین‌ها باشید</h3>
@@ -335,7 +357,7 @@
</section>
<section>
<h2>§ 4 &nbsp;پرسش‌های پرتکرار</h2>
<h2>§ 5 &nbsp;پرسش‌های پرتکرار</h2>
<details>
<summary>هزینه آن چقدر است؟</summary>
<p>سه نامه اول رایگان است (با کد فهرست انتظار ۵ نامه). پس از آن اعتبار می‌خرید: ۵ تحلیل با ۲٫۹۹ یورو یا ۱۵ تحلیل با ۶٫۹۹ یورو. بدون اشتراک و بدون حساب کاربری.</p>
@@ -356,6 +378,42 @@
&nbsp;·&nbsp; <a href="datenschutz.html">سیاست حفظ حریم خصوصی (آلمانی)</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 تحلیل';
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 = 'لطفاً ابتدا تیک را بزنید.'; 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 }) })
.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 = 'صفحه پرداخت باز نشد. لطفاً دوباره تلاش کنید.'; });
}
})();
</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>