diff --git a/bk_logo.png b/bk_logo.png new file mode 100644 index 0000000..690c272 Binary files /dev/null and b/bk_logo.png differ diff --git a/proxy/src/index.ts b/proxy/src/index.ts index d72b3b7..edf11ae 100644 --- a/proxy/src/index.ts +++ b/proxy/src/index.ts @@ -477,13 +477,26 @@ async function guthabenMail(env: Env, email: string, link: string, credits: numb } /** POST /kaufen — Stripe-Checkout-Session anlegen. */ +/** + * Sprachen, die die Stripe-Bezahlseite selbst beherrscht. Nur diese duerfen + * als `locale` mitgegeben werden — ein unbekannter Wert laesst Stripe die + * Session mit 400 ablehnen, und der Kauf waere kaputt. Fehlt eine Sprache + * hier (z. B. Arabisch, Tigrinya), schicken wir GAR NICHTS mit; Stripe + * waehlt dann selbst anhand des Browsers. + */ +const STRIPE_SPRACHEN = new Set([ + 'bg','cs','da','de','el','en','es','et','fi','fil','fr','hr','hu','id','it', + 'ja','ko','lt','lv','ms','mt','nb','nl','pl','pt','ro','ru','sk','sl','sv', + 'th','tr','vi','zh', +]); + async function kaufenHandler(request: Request, env: Env): Promise { const origin = request.headers.get('origin'); if (request.method === 'OPTIONS') return new Response(null, { status: 204, headers: demoCorsHeaders(origin) }); if (request.method !== 'POST') return demoFehler(405, 'methode', 'Nur POST erlaubt.', origin); if (!origin || !DEMO_ORIGIN_MUSTER.test(origin)) return demoFehler(403, 'origin', 'Aufruf nur von der BehördenKlar-Webseite erlaubt.', origin); - let body: { priceId?: string }; + let body: { priceId?: string; sprache?: string }; try { body = await request.json(); } catch { @@ -503,6 +516,10 @@ async function kaufenHandler(request: Request, env: Env): Promise { params.set('metadata[walletId]', walletId); params.set('metadata[credits]', String(paket.credits)); params.set('metadata[origin]', origin); + // Bezahlseite in der Sprache zeigen, aus der der Nutzer kommt. + if (typeof body.sprache === 'string' && STRIPE_SPRACHEN.has(body.sprache)) { + params.set('locale', body.sprache); + } const r = await fetch('https://api.stripe.com/v1/checkout/sessions', { method: 'POST', diff --git a/tools/sprachseiten/vorlage.html b/tools/sprachseiten/vorlage.html index 9651ae8..3b65fe4 100644 --- a/tools/sprachseiten/vorlage.html +++ b/tools/sprachseiten/vorlage.html @@ -252,7 +252,7 @@ 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 }) }) + 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}}'; }); diff --git a/webseite/ar.html b/webseite/ar.html index 380f52f..401a11f 100644 --- a/webseite/ar.html +++ b/webseite/ar.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'ar' }) }) .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 = 'تعذّر فتح صفحة الدفع. يرجى المحاولة مرة أخرى.'; }); diff --git a/webseite/bg.html b/webseite/bg.html index dfe20ef..10543cc 100644 --- a/webseite/bg.html +++ b/webseite/bg.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'bg' }) }) .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 = 'Страницата за плащане не можа да се отвори. Опитайте отново.'; }); diff --git a/webseite/bs.html b/webseite/bs.html index 0154d0a..ab35ac8 100644 --- a/webseite/bs.html +++ b/webseite/bs.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Molimo najprije označite polje.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'bs' }) }) .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 = 'Stranica za plaćanje nije se mogla otvoriti. Pokušajte ponovo.'; }); diff --git a/webseite/demo.html b/webseite/demo.html index 43c3b92..b562469 100644 --- a/webseite/demo.html +++ b/webseite/demo.html @@ -795,7 +795,7 @@ fetch(KAUFEN_ENDPUNKT, { method: 'POST', headers: { 'content-type': 'application/json' }, - body: JSON.stringify({ priceId: priceId }), + body: JSON.stringify({ priceId: priceId, sprache: zielsprache() }), }) .then(function (r) { return r.json(); }) .then(function (d) { diff --git a/webseite/el.html b/webseite/el.html index b007034..d3eb325 100644 --- a/webseite/el.html +++ b/webseite/el.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'el' }) }) .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 = 'Η σελίδα πληρωμής δεν άνοιξε. Δοκιμάστε ξανά.'; }); diff --git a/webseite/en.html b/webseite/en.html index e6c6449..d257467 100644 --- a/webseite/en.html +++ b/webseite/en.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Please tick the box first.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'en' }) }) .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 = 'The payment page could not be opened. Please try again.'; }); diff --git a/webseite/es.html b/webseite/es.html index 31c1bab..387082d 100644 --- a/webseite/es.html +++ b/webseite/es.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Marca primero la casilla.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'es' }) }) .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 = 'No se pudo abrir la página de pago. Inténtalo de nuevo.'; }); diff --git a/webseite/fa.html b/webseite/fa.html index 5cb943f..910febc 100644 --- a/webseite/fa.html +++ b/webseite/fa.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'fa' }) }) .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 = 'صفحه پرداخت باز نشد. لطفاً دوباره تلاش کنید.'; }); diff --git a/webseite/fr.html b/webseite/fr.html index adc49ae..f1395d0 100644 --- a/webseite/fr.html +++ b/webseite/fr.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Veuillez d’abord cocher la case.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'fr' }) }) .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 = 'La page de paiement n’a pas pu être ouverte. Réessayez.'; }); diff --git a/webseite/hi.html b/webseite/hi.html index 682a2a7..5a7a448 100644 --- a/webseite/hi.html +++ b/webseite/hi.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'hi' }) }) .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 = 'भुगतान पृष्ठ नहीं खुल सका। कृपया फिर कोशिश करें।'; }); diff --git a/webseite/hr.html b/webseite/hr.html index f915b9a..734e66f 100644 --- a/webseite/hr.html +++ b/webseite/hr.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Molimo najprije označite kućicu.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'hr' }) }) .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 = 'Stranica za plaćanje nije se mogla otvoriti. Pokušajte ponovno.'; }); diff --git a/webseite/hu.html b/webseite/hu.html index fcf9b39..cc14fa8 100644 --- a/webseite/hu.html +++ b/webseite/hu.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Kérjük, előbb jelölje be a négyzetet.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'hu' }) }) .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 = 'A fizetési oldal nem nyílt meg. Próbálja újra.'; }); diff --git a/webseite/index.html b/webseite/index.html index 7e7842d..1b785e7 100644 --- a/webseite/index.html +++ b/webseite/index.html @@ -735,7 +735,7 @@ fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, - body: JSON.stringify({ priceId: priceId }), + body: JSON.stringify({ priceId: priceId, sprache: 'de' }), }) .then(function (r) { return r.json(); }) .then(function (d) { if (d && d.url) { window.location.href = d.url; return; } throw new Error('keine url'); }) diff --git a/webseite/it.html b/webseite/it.html index d90abcb..ce77260 100644 --- a/webseite/it.html +++ b/webseite/it.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Spunta prima la casella.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'it' }) }) .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 = 'Non è stato possibile aprire la pagina di pagamento. Riprova.'; }); diff --git a/webseite/ku.html b/webseite/ku.html index 7ff75a5..a530020 100644 --- a/webseite/ku.html +++ b/webseite/ku.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Ji kerema xwe pêşî qutîkê nîşan bike.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'ku' }) }) .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 = 'Rûpela dravdanê venebû. Ji kerema xwe dîsa biceribîne.'; }); diff --git a/webseite/pl.html b/webseite/pl.html index feb453d..335af8b 100644 --- a/webseite/pl.html +++ b/webseite/pl.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Najpierw zaznacz pole.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'pl' }) }) .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 = 'Nie udało się otworzyć strony płatności. Spróbuj ponownie.'; }); diff --git a/webseite/ps.html b/webseite/ps.html index 4f3ea01..c179045 100644 --- a/webseite/ps.html +++ b/webseite/ps.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'ps' }) }) .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 = 'د تادیې پاڼه نه پرانیستل کېده. مهرباني وکړئ بیا هڅه وکړئ.'; }); diff --git a/webseite/pt.html b/webseite/pt.html index 05c388e..75ed7f5 100644 --- a/webseite/pt.html +++ b/webseite/pt.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Assinale primeiro a caixa.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'pt' }) }) .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 = 'Não foi possível abrir a página de pagamento. Tente novamente.'; }); diff --git a/webseite/ro.html b/webseite/ro.html index e78d5ef..9bb0c14 100644 --- a/webseite/ro.html +++ b/webseite/ro.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Te rugăm să bifezi mai întâi căsuța.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'ro' }) }) .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 = 'Pagina de plată nu a putut fi deschisă. Încearcă din nou.'; }); diff --git a/webseite/ru.html b/webseite/ru.html index 9d297e3..c300379 100644 --- a/webseite/ru.html +++ b/webseite/ru.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'ru' }) }) .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 = 'Страницу оплаты не удалось открыть. Попробуйте ещё раз.'; }); diff --git a/webseite/sitemap.xml b/webseite/sitemap.xml index 932eaf8..b0f8da8 100644 --- a/webseite/sitemap.xml +++ b/webseite/sitemap.xml @@ -3,7 +3,7 @@ xmlns:xhtml="http://www.w3.org/1999/xhtml"> https://behoerdenklar.de/ - 2026-09-19 + 2026-09-23 @@ -36,7 +36,7 @@ https://behoerdenklar.de/tr - 2026-09-19 + 2026-09-23 @@ -69,7 +69,7 @@ https://behoerdenklar.de/ar - 2026-09-19 + 2026-09-23 @@ -102,7 +102,7 @@ https://behoerdenklar.de/ru - 2026-09-19 + 2026-09-23 @@ -135,7 +135,7 @@ https://behoerdenklar.de/uk - 2026-09-19 + 2026-09-23 @@ -168,7 +168,7 @@ https://behoerdenklar.de/pl - 2026-09-19 + 2026-09-23 @@ -201,7 +201,7 @@ https://behoerdenklar.de/ro - 2026-09-19 + 2026-09-23 @@ -234,7 +234,7 @@ https://behoerdenklar.de/en - 2026-09-19 + 2026-09-23 @@ -267,7 +267,7 @@ https://behoerdenklar.de/fa - 2026-09-19 + 2026-09-23 @@ -300,7 +300,7 @@ https://behoerdenklar.de/ku - 2026-09-19 + 2026-09-23 @@ -333,7 +333,7 @@ https://behoerdenklar.de/bg - 2026-09-19 + 2026-09-23 @@ -366,7 +366,7 @@ https://behoerdenklar.de/hr - 2026-09-19 + 2026-09-23 @@ -399,7 +399,7 @@ https://behoerdenklar.de/sr - 2026-09-19 + 2026-09-23 @@ -432,7 +432,7 @@ https://behoerdenklar.de/bs - 2026-09-19 + 2026-09-23 @@ -465,7 +465,7 @@ https://behoerdenklar.de/sq - 2026-09-19 + 2026-09-23 @@ -498,7 +498,7 @@ https://behoerdenklar.de/it - 2026-09-19 + 2026-09-23 @@ -531,7 +531,7 @@ https://behoerdenklar.de/el - 2026-09-19 + 2026-09-23 @@ -564,7 +564,7 @@ https://behoerdenklar.de/es - 2026-09-19 + 2026-09-23 @@ -597,7 +597,7 @@ https://behoerdenklar.de/pt - 2026-09-19 + 2026-09-23 @@ -630,7 +630,7 @@ https://behoerdenklar.de/fr - 2026-09-19 + 2026-09-23 @@ -663,7 +663,7 @@ https://behoerdenklar.de/hu - 2026-09-19 + 2026-09-23 @@ -696,7 +696,7 @@ https://behoerdenklar.de/vi - 2026-09-19 + 2026-09-23 @@ -729,7 +729,7 @@ https://behoerdenklar.de/hi - 2026-09-19 + 2026-09-23 @@ -762,7 +762,7 @@ https://behoerdenklar.de/ur - 2026-09-19 + 2026-09-23 @@ -795,7 +795,7 @@ https://behoerdenklar.de/ps - 2026-09-19 + 2026-09-23 @@ -828,7 +828,7 @@ https://behoerdenklar.de/ti - 2026-09-19 + 2026-09-23 @@ -861,7 +861,7 @@ https://behoerdenklar.de/so - 2026-09-19 + 2026-09-23 @@ -894,7 +894,7 @@ https://behoerdenklar.de/zh - 2026-09-19 + 2026-09-23 diff --git a/webseite/so.html b/webseite/so.html index a0d0237..49a2859 100644 --- a/webseite/so.html +++ b/webseite/so.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Fadlan marka hore calaamadee sanduuqa.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'so' }) }) .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 = 'Boggii lacag bixinta lama furi karin. Fadlan mar kale isku day.'; }); diff --git a/webseite/sq.html b/webseite/sq.html index 541ce8f..78afffa 100644 --- a/webseite/sq.html +++ b/webseite/sq.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Ju lutemi shënoni fillimisht kutinë.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'sq' }) }) .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 = 'Faqja e pagesës nuk u hap. Ju lutemi provoni sërish.'; }); diff --git a/webseite/sr.html b/webseite/sr.html index da8f486..2e6e1ee 100644 --- a/webseite/sr.html +++ b/webseite/sr.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'sr' }) }) .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 = 'Страница за плаћање није могла да се отвори. Покушајте поново.'; }); diff --git a/webseite/ti.html b/webseite/ti.html index 724ef74..46fd741 100644 --- a/webseite/ti.html +++ b/webseite/ti.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'ti' }) }) .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 = 'ናይ ክፍሊት ገጽ ክኽፈት ኣይከኣለን። በጃኻ እንደገና ፈትን።'; }); diff --git a/webseite/tr.html b/webseite/tr.html index 1285096..a8768cb 100644 --- a/webseite/tr.html +++ b/webseite/tr.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Lütfen önce kutucuğu işaretleyin.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'tr' }) }) .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 = 'Ödeme sayfası açılamadı. Lütfen tekrar deneyin.'; }); diff --git a/webseite/uk.html b/webseite/uk.html index 987e4b6..be2c378 100644 --- a/webseite/uk.html +++ b/webseite/uk.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'uk' }) }) .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 = 'Не вдалося відкрити сторінку оплати. Спробуйте ще раз.'; }); diff --git a/webseite/ur.html b/webseite/ur.html index 6003df9..ca068ab 100644 --- a/webseite/ur.html +++ b/webseite/ur.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'ur' }) }) .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 = 'ادائیگی کا صفحہ نہیں کھل سکا۔ براہ کرم دوبارہ کوشش کریں۔'; }); diff --git a/webseite/vi.html b/webseite/vi.html index ab5d3fd..cd061ba 100644 --- a/webseite/vi.html +++ b/webseite/vi.html @@ -407,7 +407,7 @@ if (!konsens.checked) { fehler.style.display = 'block'; fehler.textContent = 'Vui lòng đánh dấu ô trước.'; 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'vi' }) }) .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 = 'Không mở được trang thanh toán. Vui lòng thử lại.'; }); diff --git a/webseite/zh.html b/webseite/zh.html index 2ab1a71..8f67375 100644 --- a/webseite/zh.html +++ b/webseite/zh.html @@ -407,7 +407,7 @@ 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 }) }) + fetch(BASIS + '/kaufen', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ priceId: priceId, sprache: 'zh' }) }) .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 = '无法打开付款页面,请重试。'; });