refactor(i18n): Batch 4 — eliminate {% if lang %} blocks in suppliers templates

65 new keys added to en/de locale files (1030 → 1095). All {% if lang %}
blocks replaced with {{ t.key }} / {{ t.key | tformat(...) }} in the 8
supplier signup, waitlist, and confirmation templates. JS-embedded strings
use | tojson. features_de pattern in step_1/waitlist deferred to Phase 4.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Deeman
2026-02-21 00:08:25 +01:00
parent dd6f73a7a2
commit 43905b343b
10 changed files with 197 additions and 67 deletions

View File

@@ -521,15 +521,80 @@
"sup_signup_step2": "Boost-Add-ons",
"sup_signup_step3": "Credit-Pakete",
"sup_signup_step4": "Kontodaten",
"sup_signup_page_title": "Anbieter-Registrierung",
"sup_signup_of_steps": "von 4",
"sup_success_h2": "Alles bereit!",
"sup_success_text": "Dein Anbieter-Konto wird aktiviert. Du erhältst in Kürze qualifizierte Leads, die Deinen Leistungen entsprechen.",
"sup_success_next_h3": "Was als nächstes passiert:",
"sup_success_btn": "Zum Lead-Feed",
"sup_success_page_title": "Willkommen!",
"sup_success_li1": "Dein Eintrag wird in wenigen Minuten aktualisiert",
"sup_success_li2": "Lead-Credits wurden deinem Konto hinzugefügt",
"sup_success_li3": "Prüfe deine E-Mail auf einen Anmelde-Link",
"sup_success_li4": "Durchsuche und entsperre Leads in deinem Feed",
"sup_waitlist_h1": "Auf die Warteliste für die Anbieter-Plattform",
"sup_waitlist_email_label": "E-Mail",
"sup_waitlist_submit": "Zur Warteliste",
"sup_waitlist_signin_text": "Bereits ein Konto?",
"sup_waitlist_signin_link": "Anmelden",
"sup_waitlist_page_title": "Anbieter-Warteliste",
"sup_waitlist_intro": "Wir bauen die ultimative Plattform, um verifizierte Padel-Anbieter mit Unternehmern zu verbinden. Sei Erster in der Schlange für den {plan_name}-Tier-Zugang.",
"sup_waitlist_plan_h3": "{name} Plan-Highlights",
"sup_waitlist_hint": "Frühzeitiger Zugang, exklusiver Launch-Preis und bevorzugtes Onboarding.",
"sup_waitlist_conf_page_title": "Du stehst auf der Anbieter-Warteliste",
"sup_waitlist_conf_h1": "Du stehst auf der Anbieter-Warteliste!",
"sup_waitlist_conf_msg": "Wir haben eine Bestätigung gesendet an:",
"sup_waitlist_conf_first_pre": "Du gehörst zu den ersten Anbietern mit Zugang zum ",
"sup_waitlist_conf_first_post": "-Tier bei unserem Launch.",
"sup_waitlist_conf_early_h3": "Was du als Frühmitglied erhältst:",
"sup_waitlist_conf_li1": "Erster Zugang zu qualifizierten Leads von Padel-Unternehmern",
"sup_waitlist_conf_li2": "Exklusiver Launch-Preis (für 12 Monate festgeschrieben)",
"sup_waitlist_conf_li3": "Vorrangiges Onboarding und Support bei der Eintragsoptimierung",
"sup_waitlist_conf_li4": "Hervorgehobene Platzierung im Verzeichnis beim Launch",
"sup_waitlist_conf_btn": "Anbieterverzeichnis durchsuchen",
"sup_btn_back": "Zurück",
"sup_step1_title": "Plan auswählen",
"sup_step1_sub": "Wähle den Plan, der zu deinen Wachstumszielen passt.",
"sup_step1_monthly": "Monatlich",
"sup_step1_yearly": "Jährlich",
"sup_step1_save_badge": "Bis zu 26 % sparen",
"sup_step1_popular": "Beliebtester",
"sup_step1_billed_yearly": "jährl. €{price}",
"sup_step1_billed_monthly": "monatliche Abrechnung",
"sup_step1_next": "Weiter: Add-ons",
"sup_step2_title": "Boost-Add-ons",
"sup_step2_sub_pre": "Erhöhe deine Sichtbarkeit mit optionalen Boosts.",
"sup_step2_sub_included": "Einige sind in deinem Plan enthalten.",
"sup_step2_included": "Im Plan enthalten",
"sup_step2_next": "Weiter: Credit-Pakete",
"sup_step3_title": "Credit-Pakete",
"sup_step3_sub": "Optional deine Lead-Credits aufstocken. Dein Plan enthält monatliche Credits — Pakete geben dir zusätzliche.",
"sup_step3_free": "Kostenlos",
"sup_step3_free_desc": "Nur Plan-Credits",
"sup_step3_next": "Weiter: Deine Daten",
"sup_step4_title": "Kontodaten",
"sup_step4_sub": "Erzähl uns von deinem Unternehmen und wie wir dich erreichen können.",
"sup_step4_contact_name": "Ansprechpartner",
"sup_step4_email": "E-Mail",
"sup_step4_phone": "Telefon",
"sup_step4_short_desc": "Kurzbeschreibung",
"sup_step4_short_desc_ph": "max. 160 Zeichen",
"sup_step4_service_cats": "Leistungskategorien",
"sup_step4_service_cats_ph": "z.B. schlüsselfertig, Beläge, Beleuchtung",
"sup_step4_service_area": "Servicegebiet (Länder)",
"sup_step4_years": "Jahre im Geschäft",
"sup_step4_projects": "Anzahl Projekte",
"sup_step4_claiming": "Eintrag beanspruchen:",
"sup_step4_order_h3": "Bestellübersicht",
"sup_step4_boost_row": "Boost-Add-ons",
"sup_step4_total_yearly": "Jahresgesamt",
"sup_step4_total_monthly": "Monatsgesamt",
"sup_step4_equiv": "/Mon. äquiv.",
"sup_step4_credit_row": "Credit-Paket (einmalig)",
"sup_step4_checkout": "Zur Kasse",
"sup_step4_loading": "Wird geladen…",
"sup_step4_error": "Etwas ist schiefgelaufen. Bitte versuch es erneut.",
"sup_step4_network_error": "Netzwerkfehler. Bitte überprüfe Deine Verbindung und versuch es erneut.",
"mkt_heading": "Padel-Märkte",
"mkt_subheading": "Kostenanalysen und Finanzprojektionen für Padel-Center weltweit.",
"mkt_search_placeholder": "Märkte suchen…",

View File

@@ -521,15 +521,80 @@
"sup_signup_step2": "Boost Add-Ons",
"sup_signup_step3": "Credit Packs",
"sup_signup_step4": "Account Details",
"sup_signup_page_title": "Supplier Signup",
"sup_signup_of_steps": "of 4",
"sup_success_h2": "Youre All Set!",
"sup_success_text": "Your supplier account is being activated. Youll start receiving qualified leads matching your services.",
"sup_success_next_h3": "What happens next:",
"sup_success_btn": "Go to Lead Feed",
"sup_success_page_title": "Welcome!",
"sup_success_li1": "Your listing will be upgraded within minutes",
"sup_success_li2": "Lead credits have been added to your account",
"sup_success_li3": "Check your email for a sign-in link",
"sup_success_li4": "Browse and unlock leads in your feed",
"sup_waitlist_h1": "Join the Supplier Platform Waitlist",
"sup_waitlist_email_label": "Email",
"sup_waitlist_submit": "Join Waitlist",
"sup_waitlist_signin_text": "Already have an account?",
"sup_waitlist_signin_link": "Sign in",
"sup_waitlist_page_title": "Supplier Waitlist",
"sup_waitlist_intro": "We're building the ultimate platform to connect verified padel suppliers with entrepreneurs. Be first in line for {plan_name} tier access.",
"sup_waitlist_plan_h3": "{name} Plan Highlights",
"sup_waitlist_hint": "Get early access, exclusive launch pricing, and priority onboarding.",
"sup_waitlist_conf_page_title": "You're on the Supplier Waitlist",
"sup_waitlist_conf_h1": "You're on the Supplier Waitlist!",
"sup_waitlist_conf_msg": "We've sent a confirmation to:",
"sup_waitlist_conf_first_pre": "You'll be among the first suppliers with access to the ",
"sup_waitlist_conf_first_post": " tier when we launch.",
"sup_waitlist_conf_early_h3": "What you'll get as an early member:",
"sup_waitlist_conf_li1": "First access to qualified leads from padel entrepreneurs",
"sup_waitlist_conf_li2": "Exclusive launch pricing (locked in for 12 months)",
"sup_waitlist_conf_li3": "Priority onboarding and listing optimization support",
"sup_waitlist_conf_li4": "Featured placement in the directory at launch",
"sup_waitlist_conf_btn": "Browse Supplier Directory",
"sup_btn_back": "Back",
"sup_step1_title": "Choose Your Plan",
"sup_step1_sub": "Select the plan that fits your growth goals.",
"sup_step1_monthly": "Monthly",
"sup_step1_yearly": "Yearly",
"sup_step1_save_badge": "Save up to 26%",
"sup_step1_popular": "Most Popular",
"sup_step1_billed_yearly": "billed at €{price}/yr",
"sup_step1_billed_monthly": "billed monthly",
"sup_step1_next": "Next: Add-Ons",
"sup_step2_title": "Boost Add-Ons",
"sup_step2_sub_pre": "Increase your visibility with optional boosts.",
"sup_step2_sub_included": "Some are included in your plan.",
"sup_step2_included": "Included in plan",
"sup_step2_next": "Next: Credit Packs",
"sup_step3_title": "Credit Packs",
"sup_step3_sub": "Optionally top up your lead credits. Your plan includes monthly credits — packs give you extra.",
"sup_step3_free": "Free",
"sup_step3_free_desc": "Plan credits only",
"sup_step3_next": "Next: Your Details",
"sup_step4_title": "Account Details",
"sup_step4_sub": "Tell us about your company and how to reach you.",
"sup_step4_contact_name": "Contact Name",
"sup_step4_email": "Email",
"sup_step4_phone": "Phone",
"sup_step4_short_desc": "Short Description",
"sup_step4_short_desc_ph": "160 chars max",
"sup_step4_service_cats": "Service Categories",
"sup_step4_service_cats_ph": "e.g. turnkey, surfaces, lighting",
"sup_step4_service_area": "Service Area (countries)",
"sup_step4_years": "Years in Business",
"sup_step4_projects": "Project Count",
"sup_step4_claiming": "Claiming listing:",
"sup_step4_order_h3": "Order Summary",
"sup_step4_boost_row": "Boost add-ons",
"sup_step4_total_yearly": "Yearly total",
"sup_step4_total_monthly": "Monthly total",
"sup_step4_equiv": "/mo equiv.",
"sup_step4_credit_row": "Credit pack (one-time)",
"sup_step4_checkout": "Proceed to Checkout",
"sup_step4_loading": "Loading…",
"sup_step4_error": "Something went wrong. Please try again.",
"sup_step4_network_error": "Network error. Please check your connection and try again.",
"mkt_heading": "Padel Markets",
"mkt_subheading": "Cost analysis and financial projections for padel centers worldwide.",
"mkt_search_placeholder": "Search markets…",

View File

@@ -1,6 +1,6 @@
<div data-step="1">
<h2 class="s-step-title">{% if lang == 'de' %}Plan auswählen{% else %}Choose Your Plan{% endif %}</h2>
<p class="s-step-sub">{% if lang == 'de' %}Wähle den Plan, der zu deinen Wachstumszielen passt.{% else %}Select the plan that fits your growth goals.{% endif %}</p>
<h2 class="s-step-title">{{ t.sup_step1_title }}</h2>
<p class="s-step-sub">{{ t.sup_step1_sub }}</p>
<!-- Billing period toggle (CSS sibling selector trick).
Radios must be direct siblings of .s-billing-toggle AND <form> so that
@@ -11,9 +11,9 @@
{% if data.get('billing_period', 'yearly') != 'monthly' %}checked{% endif %}>
<div class="s-billing-toggle">
<div class="s-billing-toggle__pill">
<label for="bp-monthly" class="s-billing-toggle__opt">{% if lang == 'de' %}Monatlich{% else %}Monthly{% endif %}</label>
<label for="bp-monthly" class="s-billing-toggle__opt">{{ t.sup_step1_monthly }}</label>
<label for="bp-yearly" class="s-billing-toggle__opt">
{% if lang == 'de' %}Jährlich{% else %}Yearly{% endif %} <span class="s-save-badge">{% if lang == 'de' %}Bis zu 26 % sparen{% else %}Save up to 26%{% endif %}</span>
{{ t.sup_step1_yearly }} <span class="s-save-badge">{{ t.sup_step1_save_badge }}</span>
</label>
</div>
</div>
@@ -61,15 +61,15 @@
<label class="s-plan-card {% if data.get('plan', 'supplier_growth') == key %}s-plan-card--selected{% endif %}"
onclick="this.parentNode.querySelectorAll('.s-plan-card').forEach(c=>c.classList.remove('s-plan-card--selected')); this.classList.add('s-plan-card--selected')">
<input type="radio" name="plan" value="{{ key }}" {% if data.get('plan', 'supplier_growth') == key %}checked{% endif %}>
{% if key == 'supplier_growth' %}<div class="s-plan-card__popular">{% if lang == 'de' %}Beliebtester{% else %}Most Popular{% endif %}</div>{% endif %}
{% if key == 'supplier_growth' %}<div class="s-plan-card__popular">{{ t.sup_step1_popular }}</div>{% endif %}
<h3>{{ plan.name }}</h3>
<div class="price-yearly">
<div class="price">&euro;{{ plan.yearly_monthly_equivalent }} <span>/mo</span></div>
<div style="font-size:0.6875rem;color:#94A3B8;margin-top:2px">{% if lang == 'de' %}jährl. &euro;{{ plan.yearly_price }}{% else %}billed at &euro;{{ plan.yearly_price }}/yr{% endif %}</div>
<div style="font-size:0.6875rem;color:#94A3B8;margin-top:2px">{{ t.sup_step1_billed_yearly | tformat(price=plan.yearly_price) }}</div>
</div>
<div class="price-monthly">
<div class="price">&euro;{{ plan.monthly_price }} <span>/mo</span></div>
<div style="font-size:0.6875rem;color:#94A3B8;margin-top:2px">{% if lang == 'de' %}monatliche Abrechnung{% else %}billed monthly{% endif %}</div>
<div style="font-size:0.6875rem;color:#94A3B8;margin-top:2px">{{ t.sup_step1_billed_monthly }}</div>
</div>
<ul>
{% for f in (plan.features_de if lang == 'de' else plan.features) %}
@@ -82,7 +82,7 @@
<div class="s-nav">
<span></span>
<button type="submit" class="s-btn-next">{% if lang == 'de' %}Weiter: Add-ons{% else %}Next: Add-Ons{% endif %}</button>
<button type="submit" class="s-btn-next">{{ t.sup_step1_next }}</button>
</div>
</form>

View File

@@ -1,6 +1,6 @@
<div data-step="2">
<h2 class="s-step-title">{% if lang == 'de' %}Boost-Add-ons{% else %}Boost Add-Ons{% endif %}</h2>
<p class="s-step-sub">{% if lang == 'de' %}Erhöhe deine Sichtbarkeit mit optionalen Boosts. {% if included_boosts %}Einige sind in deinem Plan enthalten.{% endif %}{% else %}Increase your visibility with optional boosts. {% if included_boosts %}Some are included in your plan.{% endif %}{% endif %}</p>
<h2 class="s-step-title">{{ t.sup_step2_title }}</h2>
<p class="s-step-sub">{{ t.sup_step2_sub_pre }} {% if included_boosts %}{{ t.sup_step2_sub_included }}{% endif %}</p>
<form hx-post="{{ url_for('suppliers.signup_step', step=2) }}"
hx-target="#signup-step" hx-swap="innerHTML">
@@ -21,7 +21,7 @@
{% endif %}
<strong>{{ b.name }}</strong>
{% if is_included %}
<span class="boost-included">{% if lang == 'de' %}Im Plan enthalten{% else %}Included in plan{% endif %}</span>
<span class="boost-included">{{ t.sup_step2_included }}</span>
{% else %}
<span class="boost-price">&euro;{{ b.price }}/mo</span>
{% endif %}
@@ -33,8 +33,8 @@
<div class="s-nav">
<button type="button" class="s-btn-back"
hx-get="{{ url_for('suppliers.signup_step', step=1) }}?_accumulated={{ data | tojson | urlencode }}"
hx-target="#signup-step" hx-swap="innerHTML">{% if lang == 'de' %}Zurück{% else %}Back{% endif %}</button>
<button type="submit" class="s-btn-next">{% if lang == 'de' %}Weiter: Credit-Pakete{% else %}Next: Credit Packs{% endif %}</button>
hx-target="#signup-step" hx-swap="innerHTML">{{ t.sup_btn_back }}</button>
<button type="submit" class="s-btn-next">{{ t.sup_step2_next }}</button>
</div>
</form>
</div>

View File

@@ -1,6 +1,6 @@
<div data-step="3">
<h2 class="s-step-title">{% if lang == 'de' %}Credit-Pakete{% else %}Credit Packs{% endif %}</h2>
<p class="s-step-sub">{% if lang == 'de' %}Optional deine Lead-Credits aufstocken. Dein Plan enthält monatliche Credits — Pakete geben dir zusätzliche.{% else %}Optionally top up your lead credits. Your plan includes monthly credits — packs give you extra.{% endif %}</p>
<h2 class="s-step-title">{{ t.sup_step3_title }}</h2>
<p class="s-step-sub">{{ t.sup_step3_sub }}</p>
<form hx-post="{{ url_for('suppliers.signup_step', step=3) }}"
hx-target="#signup-step" hx-swap="innerHTML">
@@ -12,8 +12,8 @@
onclick="this.parentNode.querySelectorAll('.s-credit-card').forEach(c=>c.classList.remove('s-credit-card--selected')); this.classList.add('s-credit-card--selected')">
<input type="radio" name="credit_pack" value="" {% if not data.get('credit_pack') %}checked{% endif %}>
<div class="amount">0</div>
<div class="price">{% if lang == 'de' %}Kostenlos{% else %}Free{% endif %}</div>
<div class="per">{% if lang == 'de' %}Nur Plan-Credits{% else %}Plan credits only{% endif %}</div>
<div class="price">{{ t.sup_step3_free }}</div>
<div class="per">{{ t.sup_step3_free_desc }}</div>
</label>
{% for cp in credit_packs %}
<label class="s-credit-card {% if data.get('credit_pack') == cp.key %}s-credit-card--selected{% endif %}"
@@ -30,8 +30,8 @@
<button type="button" class="s-btn-back"
hx-post="{{ url_for('suppliers.signup_step', step=1) }}"
hx-target="#signup-step" hx-swap="innerHTML"
hx-include="[name='_accumulated']">{% if lang == 'de' %}Zurück{% else %}Back{% endif %}</button>
<button type="submit" class="s-btn-next">{% if lang == 'de' %}Weiter: Deine Daten{% else %}Next: Your Details{% endif %}</button>
hx-include="[name='_accumulated']">{{ t.sup_btn_back }}</button>
<button type="submit" class="s-btn-next">{{ t.sup_step3_next }}</button>
</div>
</form>
</div>

View File

@@ -1,6 +1,6 @@
<div data-step="4">
<h2 class="s-step-title">{% if lang == 'de' %}Kontodaten{% else %}Account Details{% endif %}</h2>
<p class="s-step-sub">{% if lang == 'de' %}Erzähl uns von deinem Unternehmen und wie wir dich erreichen können.{% else %}Tell us about your company and how to reach you.{% endif %}</p>
<h2 class="s-step-title">{{ t.sup_step4_title }}</h2>
<p class="s-step-sub">{{ t.sup_step4_sub }}</p>
<form method="post" action="{{ url_for('suppliers.signup_checkout') }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
@@ -8,39 +8,39 @@
<div style="display:grid;grid-template-columns:1fr 1fr;gap:0 1rem">
<div class="s-field">
<label class="s-label">{% if lang == 'de' %}Ansprechpartner{% else %}Contact Name{% endif %} <span style="color:#EF4444">*</span></label>
<label class="s-label">{{ t.sup_step4_contact_name }} <span style="color:#EF4444">*</span></label>
<input type="text" name="contact_name" class="s-input" value="{{ data.get('contact_name', '') }}" required>
</div>
<div class="s-field">
<label class="s-label">{% if lang == 'de' %}E-Mail{% else %}Email{% endif %} <span style="color:#EF4444">*</span></label>
<label class="s-label">{{ t.sup_step4_email }} <span style="color:#EF4444">*</span></label>
<input type="email" name="contact_email" class="s-input" value="{{ data.get('contact_email', '') }}" required>
</div>
<div class="s-field">
<label class="s-label">{% if lang == 'de' %}Telefon{% else %}Phone{% endif %}</label>
<label class="s-label">{{ t.sup_step4_phone }}</label>
<input type="tel" name="contact_phone" class="s-input" value="{{ data.get('contact_phone', '') }}">
</div>
<div class="s-field">
<label class="s-label">{% if lang == 'de' %}Kurzbeschreibung{% else %}Short Description{% endif %}</label>
<label class="s-label">{{ t.sup_step4_short_desc }}</label>
<input type="text" name="short_description" class="s-input" maxlength="160"
value="{{ data.get('short_description', '') }}" placeholder="{% if lang == 'de' %}max. 160 Zeichen{% else %}160 chars max{% endif %}">
value="{{ data.get('short_description', '') }}" placeholder="{{ t.sup_step4_short_desc_ph }}">
</div>
<div class="s-field">
<label class="s-label">{% if lang == 'de' %}Leistungskategorien{% else %}Service Categories{% endif %}</label>
<label class="s-label">{{ t.sup_step4_service_cats }}</label>
<input type="text" name="service_categories" class="s-input"
value="{{ data.get('service_categories', '') }}" placeholder="{% if lang == 'de' %}z.B. schlüsselfertig, Beläge, Beleuchtung{% else %}e.g. turnkey, surfaces, lighting{% endif %}">
value="{{ data.get('service_categories', '') }}" placeholder="{{ t.sup_step4_service_cats_ph }}">
</div>
<div class="s-field">
<label class="s-label">{% if lang == 'de' %}Servicegebiet (Länder){% else %}Service Area (countries){% endif %}</label>
<label class="s-label">{{ t.sup_step4_service_area }}</label>
<input type="text" name="service_area" class="s-input"
value="{{ data.get('service_area', '') }}" placeholder="e.g. DE, ES, FR">
</div>
<div class="s-field">
<label class="s-label">{% if lang == 'de' %}Jahre im Geschäft{% else %}Years in Business{% endif %}</label>
<label class="s-label">{{ t.sup_step4_years }}</label>
<input type="number" name="years_in_business" class="s-input" min="0"
value="{{ data.get('years_in_business', '') }}">
</div>
<div class="s-field">
<label class="s-label">{% if lang == 'de' %}Anzahl Projekte{% else %}Project Count{% endif %}</label>
<label class="s-label">{{ t.sup_step4_projects }}</label>
<input type="number" name="project_count" class="s-input" min="0"
value="{{ data.get('project_count', '') }}">
</div>
@@ -48,13 +48,13 @@
{% if data.get('supplier_name') %}
<p style="font-size:12px;color:#64748B;margin-top:0.5rem">
{% if lang == 'de' %}Eintrag beanspruchen:{% else %}Claiming listing:{% endif %} <strong>{{ data.get('supplier_name') }}</strong>
{{ t.sup_step4_claiming }} <strong>{{ data.get('supplier_name') }}</strong>
</p>
{% endif %}
<!-- Order Summary -->
<div class="s-summary">
<h3>{% if lang == 'de' %}Bestellübersicht{% else %}Order Summary{% endif %}</h3>
<h3>{{ t.sup_step4_order_h3 }}</h3>
<div class="s-summary-row">
<span>{{ order.plan_name }} Plan</span>
<span>
@@ -71,17 +71,17 @@
</div>
{% if order.boost_monthly > 0 %}
<div class="s-summary-row">
<span>{% if lang == 'de' %}Boost-Add-ons{% else %}Boost add-ons{% endif %}</span>
<span>{{ t.sup_step4_boost_row }}</span>
<span>+&euro;{{ order.boost_monthly }}/mo</span>
</div>
{% endif %}
<div class="s-summary-row s-summary-total">
<span>{% if order.billing_period == 'yearly' %}{% if lang == 'de' %}Jahresgesamt{% else %}Yearly total{% endif %}{% else %}{% if lang == 'de' %}Monatsgesamt{% else %}Monthly total{% endif %}{% endif %}</span>
<span>&euro;{{ order.monthly_total }}{% if order.billing_period == 'yearly' %}{% if lang == 'de' %}/Mon. äquiv.{% else %}/mo equiv.{% endif %}{% else %}/mo{% endif %}</span>
<span>{% if order.billing_period == 'yearly' %}{{ t.sup_step4_total_yearly }}{% else %}{{ t.sup_step4_total_monthly }}{% endif %}</span>
<span>&euro;{{ order.monthly_total }}{% if order.billing_period == 'yearly' %}{{ t.sup_step4_equiv }}{% else %}/mo{% endif %}</span>
</div>
{% if order.one_time_total > 0 %}
<div class="s-summary-row" style="margin-top:8px">
<span>{% if lang == 'de' %}Credit-Paket (einmalig){% else %}Credit pack (one-time){% endif %}</span>
<span>{{ t.sup_step4_credit_row }}</span>
<span>&euro;{{ order.one_time_total }}</span>
</div>
{% endif %}
@@ -91,8 +91,8 @@
<button type="button" class="s-btn-back"
hx-post="{{ url_for('suppliers.signup_step', step=2) }}"
hx-target="#signup-step" hx-swap="innerHTML"
hx-include="[name='_accumulated']">{% if lang == 'de' %}Zurück{% else %}Back{% endif %}</button>
<button type="submit" class="s-btn-next" id="checkout-btn">{% if lang == 'de' %}Zur Kasse{% else %}Proceed to Checkout{% endif %}</button>
hx-include="[name='_accumulated']">{{ t.sup_btn_back }}</button>
<button type="submit" class="s-btn-next" id="checkout-btn">{{ t.sup_step4_checkout }}</button>
</div>
<div id="checkout-error" hidden
@@ -107,7 +107,7 @@
var btn = document.getElementById('checkout-btn');
var errBox = document.getElementById('checkout-error');
btn.disabled = true;
btn.textContent = '{% if lang == 'de' %}Wird geladen\u2026{% else %}Loading\u2026{% endif %}';
btn.textContent = {{ t.sup_step4_loading | tojson }};
errBox.hidden = true;
fetch(form.action, {
@@ -118,10 +118,10 @@
.then(function(res) { return res.json().then(function(d) { return { ok: res.ok, data: d }; }); })
.then(function(result) {
if (!result.ok || result.data.error) {
errBox.textContent = result.data.error || '{% if lang == 'de' %}Etwas ist schiefgelaufen. Bitte versuch es erneut.{% else %}Something went wrong. Please try again.{% endif %}';
errBox.textContent = result.data.error || {{ t.sup_step4_error | tojson }};
errBox.hidden = false;
btn.disabled = false;
btn.textContent = '{% if lang == 'de' %}Zur Kasse{% else %}Proceed to Checkout{% endif %}';
btn.textContent = {{ t.sup_step4_checkout | tojson }};
return;
}
Paddle.Checkout.open({
@@ -130,13 +130,13 @@
settings: result.data.settings
});
btn.disabled = false;
btn.textContent = '{% if lang == 'de' %}Zur Kasse{% else %}Proceed to Checkout{% endif %}';
btn.textContent = {{ t.sup_step4_checkout | tojson }};
})
.catch(function() {
errBox.textContent = '{% if lang == 'de' %}Netzwerkfehler. Bitte überprüfe Deine Verbindung und versuch es erneut.{% else %}Network error. Please check your connection and try again.{% endif %}';
errBox.textContent = {{ t.sup_step4_network_error | tojson }};
errBox.hidden = false;
btn.disabled = false;
btn.textContent = '{% if lang == 'de' %}Zur Kasse{% else %}Proceed to Checkout{% endif %}';
btn.textContent = {{ t.sup_step4_checkout | tojson }};
});
});
})();

View File

@@ -1,5 +1,5 @@
{% extends "base.html" %}
{% block title %}{% if lang == 'de' %}Anbieter-Registrierung - {{ config.APP_NAME }}{% else %}Supplier Signup - {{ config.APP_NAME }}{% endif %}{% endblock %}
{% block title %}{{ t.sup_signup_page_title }} - {{ config.APP_NAME }}{% endblock %}
{% block paddle %}{% include "_paddle.html" %}{% endblock %}
{% block head %}
@@ -119,7 +119,7 @@
<div class="s-progress" id="s-progress">
<div class="s-progress__meta">
<span class="s-progress__label" id="s-progress-label">{{ t.sup_signup_step1 }}</span>
<span class="s-progress__count" id="s-progress-count">1 {% if lang == 'de' %}von 4{% else %}of 4{% endif %}</span>
<span class="s-progress__count" id="s-progress-count">1 {{ t.sup_signup_of_steps }}</span>
</div>
<div class="s-progress__track">
<div class="s-progress__fill" id="s-progress-fill" style="width: 25%"></div>
@@ -144,7 +144,7 @@ document.body.addEventListener('htmx:afterSwap', function(e) {
var n = parseInt(step.dataset.step);
var labels = [{{ t.sup_signup_step1 | tojson }}, {{ t.sup_signup_step2 | tojson }}, {{ t.sup_signup_step3 | tojson }}, {{ t.sup_signup_step4 | tojson }}];
document.getElementById('s-progress-label').textContent = labels[n-1] || '';
document.getElementById('s-progress-count').textContent = n + ' {% if lang == 'de' %}von 4{% else %}of 4{% endif %}';
document.getElementById('s-progress-count').textContent = n + ' ' + {{ t.sup_signup_of_steps | tojson }};
document.getElementById('s-progress-fill').style.width = (n * 25) + '%';
}
}

View File

@@ -1,5 +1,5 @@
{% extends "base.html" %}
{% block title %}{% if lang == 'de' %}Willkommen! - {{ config.APP_NAME }}{% else %}Welcome! - {{ config.APP_NAME }}{% endif %}{% endblock %}
{% block title %}{{ t.sup_success_page_title }} - {{ config.APP_NAME }}{% endblock %}
{% block content %}
<main style="background: linear-gradient(180deg, #F1F5F9, #F8FAFC); min-height: 80vh;">
@@ -16,10 +16,10 @@
<div style="background:#F8FAFC;border-radius:12px;padding:1rem;margin-bottom:1.5rem;text-align:left">
<h3 style="font-size:0.8125rem;font-weight:700;margin:0 0 0.5rem">{{ t.sup_success_next_h3 }}</h3>
<ul style="list-style:none;padding:0;margin:0;font-size:0.8125rem;color:#475569">
<li style="padding:3px 0">&#x2713; {% if lang == 'de' %}Dein Eintrag wird in wenigen Minuten aktualisiert{% else %}Your listing will be upgraded within minutes{% endif %}</li>
<li style="padding:3px 0">&#x2713; {% if lang == 'de' %}Lead-Credits wurden deinem Konto hinzugefügt{% else %}Lead credits have been added to your account{% endif %}</li>
<li style="padding:3px 0">&#x2713; {% if lang == 'de' %}Prüfe deine E-Mail auf einen Anmelde-Link{% else %}Check your email for a sign-in link{% endif %}</li>
<li style="padding:3px 0">&#x2713; {% if lang == 'de' %}Durchsuche und entsperre Leads in deinem Feed{% else %}Browse and unlock leads in your feed{% endif %}</li>
<li style="padding:3px 0">&#x2713; {{ t.sup_success_li1 }}</li>
<li style="padding:3px 0">&#x2713; {{ t.sup_success_li2 }}</li>
<li style="padding:3px 0">&#x2713; {{ t.sup_success_li3 }}</li>
<li style="padding:3px 0">&#x2713; {{ t.sup_success_li4 }}</li>
</ul>
</div>

View File

@@ -1,6 +1,6 @@
{% extends "base.html" %}
{% block title %}{% if lang == 'de' %}Anbieter-Warteliste - {{ config.APP_NAME }}{% else %}Supplier Waitlist - {{ config.APP_NAME }}{% endif %}{% endblock %}
{% block title %}{{ t.sup_waitlist_page_title }} - {{ config.APP_NAME }}{% endblock %}
{% block content %}
<main class="container-page py-12">
@@ -8,10 +8,10 @@
{% set plan_info = plans.get(plan, plans['supplier_growth']) %}
<h1 class="text-2xl mb-1">{{ t.sup_waitlist_h1 }}</h1>
<p class="text-slate mb-6">{% if lang == 'de' %}Wir bauen die ultimative Plattform, um verifizierte Padel-Anbieter mit Unternehmern zu verbinden. Sei Erster in der Schlange für den {{ plan_info.name }}-Tier-Zugang.{% else %}We're building the ultimate platform to connect verified padel suppliers with entrepreneurs. Be first in line for {{ plan_info.name }} tier access.{% endif %}</p>
<p class="text-slate mb-6">{{ t.sup_waitlist_intro | tformat(plan_name=plan_info.name) }}</p>
<div class="bg-slate-50 border border-slate-200 rounded-lg p-4 mb-6">
<h3 class="font-semibold text-navy text-sm mb-2">{% if lang == 'de' %}{{ plan_info.name }} Plan-Highlights{% else %}{{ plan_info.name }} Plan Highlights{% endif %}</h3>
<h3 class="font-semibold text-navy text-sm mb-2">{{ t.sup_waitlist_plan_h3 | tformat(name=plan_info.name) }}</h3>
<ul class="text-sm text-slate-dark space-y-1">
{% set feature_list = plan_info.features_de if lang == 'de' else plan_info.features %}
{% for feature in feature_list[:4] %}
@@ -40,7 +40,7 @@
required
autofocus
>
<p class="form-hint">{% if lang == 'de' %}Frühzeitiger Zugang, exklusiver Launch-Preis und bevorzugtes Onboarding.{% else %}Get early access, exclusive launch pricing, and priority onboarding.{% endif %}</p>
<p class="form-hint">{{ t.sup_waitlist_hint }}</p>
</div>
<button type="submit" class="btn w-full">{{ t.sup_waitlist_submit }}</button>

View File

@@ -1,32 +1,32 @@
{% extends "base.html" %}
{% block title %}{% if lang == 'de' %}Du stehst auf der Anbieter-Warteliste - {{ config.APP_NAME }}{% else %}You're on the Supplier Waitlist - {{ config.APP_NAME }}{% endif %}{% endblock %}
{% block title %}{{ t.sup_waitlist_conf_page_title }} - {{ config.APP_NAME }}{% endblock %}
{% block content %}
<main class="container-page py-12">
<div class="card max-w-sm mx-auto mt-8 text-center">
{% set plan_info = plans.get(plan, plans['supplier_growth']) %}
<h1 class="text-2xl mb-4">{% if lang == 'de' %}Du stehst auf der Anbieter-Warteliste!{% else %}You're on the Supplier Waitlist!{% endif %}</h1>
<h1 class="text-2xl mb-4">{{ t.sup_waitlist_conf_h1 }}</h1>
<p class="text-slate-dark">{% if lang == 'de' %}Wir haben eine Bestätigung gesendet an:{% else %}We've sent a confirmation to:{% endif %}</p>
<p class="text-slate-dark">{{ t.sup_waitlist_conf_msg }}</p>
<p class="font-semibold text-navy my-2">{{ email }}</p>
<p class="text-slate text-sm mb-2">{% if lang == 'de' %}Du gehörst zu den ersten Anbietern mit Zugang zum <strong>{{ plan_info.name }}</strong>-Tier bei unserem Launch.{% else %}You'll be among the first suppliers with access to the <strong>{{ plan_info.name }}</strong> tier when we launch.{% endif %}</p>
<p class="text-slate text-sm mb-2">{{ t.sup_waitlist_conf_first_pre }}<strong>{{ plan_info.name }}</strong>{{ t.sup_waitlist_conf_first_post }}</p>
<hr>
<div class="text-left mt-6">
<h3 class="text-sm font-semibold text-navy mb-3">{% if lang == 'de' %}Was du als Frühmitglied erhältst:{% else %}What you'll get as an early member:{% endif %}</h3>
<h3 class="text-sm font-semibold text-navy mb-3">{{ t.sup_waitlist_conf_early_h3 }}</h3>
<ul class="list-disc pl-6 space-y-1 text-sm text-slate-dark">
<li>{% if lang == 'de' %}Erster Zugang zu qualifizierten Leads von Padel-Unternehmern{% else %}First access to qualified leads from padel entrepreneurs{% endif %}</li>
<li>{% if lang == 'de' %}Exklusiver Launch-Preis (für 12 Monate festgeschrieben){% else %}Exclusive launch pricing (locked in for 12 months){% endif %}</li>
<li>{% if lang == 'de' %}Vorrangiges Onboarding und Support bei der Eintragsoptimierung{% else %}Priority onboarding and listing optimization support{% endif %}</li>
<li>{% if lang == 'de' %}Hervorgehobene Platzierung im Verzeichnis beim Launch{% else %}Featured placement in the directory at launch{% endif %}</li>
<li>{{ t.sup_waitlist_conf_li1 }}</li>
<li>{{ t.sup_waitlist_conf_li2 }}</li>
<li>{{ t.sup_waitlist_conf_li3 }}</li>
<li>{{ t.sup_waitlist_conf_li4 }}</li>
</ul>
</div>
<a href="{{ url_for('directory.index') }}" class="btn-outline w-full mt-6">{% if lang == 'de' %}Anbieterverzeichnis durchsuchen{% else %}Browse Supplier Directory{% endif %}</a>
<a href="{{ url_for('directory.index') }}" class="btn-outline w-full mt-6">{{ t.sup_waitlist_conf_btn }}</a>
</div>
</main>
{% endblock %}