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

Add 19 new locale keys (q_page_title, q_step_counter, q1/2/5/7/9 error
hints, qs_matched_*, qv_sent_msg, qv_instructions, qv_no_email,
qv_check_email_pre/post) and replace all 22 {% if lang %} blocks across
quote_request.html, quote_verify_sent.html, quote_submitted.html, and
all 9 quote_step_*.html partials.

Progress bar OOB counter shared across all 9 step partials now uses
{{ t.q_step_counter | tformat(step=step, total=steps|length) }}.
Complex project description in quote_submitted.html uses 5 fragment
keys (qs_matched_*) with qs_matched_facility_fmt="{type}" vs "{type}-"
to handle EN/DE compound-word suffix without empty-value keys.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Deeman
2026-02-20 23:41:52 +01:00
parent 84df11aee7
commit 5c99b1bf44
14 changed files with 67 additions and 33 deletions

View File

@@ -17,7 +17,7 @@
<div class="q-field-group">
<span class="q-label">{{ t.q1_facility_label }} <span class="required">*</span></span>
{% if 'facility_type' in errors %}<p class="q-error-hint">{% if lang == 'de' %}Bitte wähle einen Anlagentyp{% else %}Please select a facility type{% endif %}</p>{% endif %}
{% if 'facility_type' in errors %}<p class="q-error-hint">{{ t.q1_error_facility }}</p>{% endif %}
<div class="q-pills">
{% for val, label in [('indoor', t.q1_facility_indoor), ('outdoor', t.q1_facility_outdoor), ('both', t.q1_facility_both)] %}
<label><input type="radio" name="facility_type" value="{{ val }}" {{ 'checked' if data.get('facility_type') == val }}><span class="q-pill">{{ label }}</span></label>
@@ -57,7 +57,7 @@
<div id="q-progress" hx-swap-oob="innerHTML">
<div class="q-progress__meta">
<span class="q-progress__label">{{ steps[step - 1].title }}</span>
<span class="q-progress__count">{% if lang == 'de' %}Schritt {{ step }} von {{ steps|length }}{% else %}{{ step }} of {{ steps|length }}{% endif %}</span>
<span class="q-progress__count">{{ t.q_step_counter | tformat(step=step, total=steps|length) }}</span>
</div>
<div class="q-progress__track">
<div class="q-progress__fill" style="width: {{ (step / steps|length * 100) | round }}%"></div>

View File

@@ -14,7 +14,7 @@
<div class="q-field-group">
<label class="q-label" for="country">{{ t.q2_country_label }} <span class="required">*</span></label>
{% if 'country' in errors %}<p class="q-error-hint">{% if lang == 'de' %}Bitte wähle ein Land{% else %}Please select a country{% endif %}</p>{% endif %}
{% if 'country' in errors %}<p class="q-error-hint">{{ t.q2_error_country }}</p>{% endif %}
<select id="country" name="country" class="q-input {% if 'country' in errors %}q-input--error{% endif %}">
<option value="">{{ t.q2_country_default }}</option>
{% for code, name in [('DE', 'Germany'), ('ES', 'Spain'), ('IT', 'Italy'), ('FR', 'France'), ('NL', 'Netherlands'), ('SE', 'Sweden'), ('UK', 'United Kingdom'), ('PT', 'Portugal'), ('BE', 'Belgium'), ('AT', 'Austria'), ('CH', 'Switzerland'), ('DK', 'Denmark'), ('FI', 'Finland'), ('NO', 'Norway'), ('PL', 'Poland'), ('CZ', 'Czech Republic'), ('AE', 'UAE'), ('SA', 'Saudi Arabia'), ('US', 'United States'), ('OTHER', 'Other')] %}
@@ -34,7 +34,7 @@
<div id="q-progress" hx-swap-oob="innerHTML">
<div class="q-progress__meta">
<span class="q-progress__label">{{ steps[step - 1].title }}</span>
<span class="q-progress__count">{% if lang == 'de' %}Schritt {{ step }} von {{ steps|length }}{% else %}{{ step }} of {{ steps|length }}{% endif %}</span>
<span class="q-progress__count">{{ t.q_step_counter | tformat(step=step, total=steps|length) }}</span>
</div>
<div class="q-progress__track">
<div class="q-progress__fill" style="width: {{ (step / steps|length * 100) | round }}%"></div>

View File

@@ -27,7 +27,7 @@
<div id="q-progress" hx-swap-oob="innerHTML">
<div class="q-progress__meta">
<span class="q-progress__label">{{ steps[step - 1].title }}</span>
<span class="q-progress__count">{% if lang == 'de' %}Schritt {{ step }} von {{ steps|length }}{% else %}{{ step }} of {{ steps|length }}{% endif %}</span>
<span class="q-progress__count">{{ t.q_step_counter | tformat(step=step, total=steps|length) }}</span>
</div>
<div class="q-progress__track">
<div class="q-progress__fill" style="width: {{ (step / steps|length * 100) | round }}%"></div>

View File

@@ -27,7 +27,7 @@
<div id="q-progress" hx-swap-oob="innerHTML">
<div class="q-progress__meta">
<span class="q-progress__label">{{ steps[step - 1].title }}</span>
<span class="q-progress__count">{% if lang == 'de' %}Schritt {{ step }} von {{ steps|length }}{% else %}{{ step }} of {{ steps|length }}{% endif %}</span>
<span class="q-progress__count">{{ t.q_step_counter | tformat(step=step, total=steps|length) }}</span>
</div>
<div class="q-progress__track">
<div class="q-progress__fill" style="width: {{ (step / steps|length * 100) | round }}%"></div>

View File

@@ -9,7 +9,7 @@
<div class="q-field-group">
<span class="q-label">{{ t.q5_timeline_label }} <span class="required">*</span></span>
{% if 'timeline' in errors %}<p class="q-error-hint">{% if lang == 'de' %}Bitte wähle einen Zeitplan{% else %}Please select a timeline{% endif %}</p>{% endif %}
{% if 'timeline' in errors %}<p class="q-error-hint">{{ t.q5_error_timeline }}</p>{% endif %}
<div class="q-pills">
{% for val, label in [('asap', t.q5_timeline_asap), ('3-6mo', t.q5_timeline_3_6), ('6-12mo', t.q5_timeline_6_12), ('12+mo', t.q5_timeline_12_plus)] %}
<label><input type="radio" name="timeline" value="{{ val }}" {{ 'checked' if data.get('timeline') == val }}><span class="q-pill">{{ label }}</span></label>
@@ -33,7 +33,7 @@
<div id="q-progress" hx-swap-oob="innerHTML">
<div class="q-progress__meta">
<span class="q-progress__label">{{ steps[step - 1].title }}</span>
<span class="q-progress__count">{% if lang == 'de' %}Schritt {{ step }} von {{ steps|length }}{% else %}{{ step }} of {{ steps|length }}{% endif %}</span>
<span class="q-progress__count">{{ t.q_step_counter | tformat(step=step, total=steps|length) }}</span>
</div>
<div class="q-progress__track">
<div class="q-progress__fill" style="width: {{ (step / steps|length * 100) | round }}%"></div>

View File

@@ -45,7 +45,7 @@
<div id="q-progress" hx-swap-oob="innerHTML">
<div class="q-progress__meta">
<span class="q-progress__label">{{ steps[step - 1].title }}</span>
<span class="q-progress__count">{% if lang == 'de' %}Schritt {{ step }} von {{ steps|length }}{% else %}{{ step }} of {{ steps|length }}{% endif %}</span>
<span class="q-progress__count">{{ t.q_step_counter | tformat(step=step, total=steps|length) }}</span>
</div>
<div class="q-progress__track">
<div class="q-progress__fill" style="width: {{ (step / steps|length * 100) | round }}%"></div>

View File

@@ -9,7 +9,7 @@
<div class="q-field-group">
<span class="q-label">{{ t.q7_role_label }} <span class="required">*</span></span>
{% if 'stakeholder_type' in errors %}<p class="q-error-hint">{% if lang == 'de' %}Bitte wähle Deine Rolle{% else %}Please select your role{% endif %}</p>{% endif %}
{% if 'stakeholder_type' in errors %}<p class="q-error-hint">{{ t.q7_error_role }}</p>{% endif %}
<div class="q-pills">
{% for val, label in [('entrepreneur', t.q7_role_entrepreneur), ('tennis_club', t.q7_role_tennis), ('municipality', t.q7_role_municipality), ('developer', t.q7_role_developer), ('operator', t.q7_role_operator), ('architect', t.q7_role_architect)] %}
<label><input type="radio" name="stakeholder_type" value="{{ val }}" {{ 'checked' if data.get('stakeholder_type') == val }}><span class="q-pill">{{ label }}</span></label>
@@ -37,7 +37,7 @@
<div id="q-progress" hx-swap-oob="innerHTML">
<div class="q-progress__meta">
<span class="q-progress__label">{{ steps[step - 1].title }}</span>
<span class="q-progress__count">{% if lang == 'de' %}Schritt {{ step }} von {{ steps|length }}{% else %}{{ step }} of {{ steps|length }}{% endif %}</span>
<span class="q-progress__count">{{ t.q_step_counter | tformat(step=step, total=steps|length) }}</span>
</div>
<div class="q-progress__track">
<div class="q-progress__fill" style="width: {{ (step / steps|length * 100) | round }}%"></div>

View File

@@ -49,7 +49,7 @@
<div id="q-progress" hx-swap-oob="innerHTML">
<div class="q-progress__meta">
<span class="q-progress__label">{{ steps[step - 1].title }}</span>
<span class="q-progress__count">{% if lang == 'de' %}Schritt {{ step }} von {{ steps|length }}{% else %}{{ step }} of {{ steps|length }}{% endif %}</span>
<span class="q-progress__count">{{ t.q_step_counter | tformat(step=step, total=steps|length) }}</span>
</div>
<div class="q-progress__track">
<div class="q-progress__fill" style="width: {{ (step / steps|length * 100) | round }}%"></div>

View File

@@ -21,19 +21,19 @@
<div class="q-field-group">
<label class="q-label" for="contact_name">{{ t.q9_name_label }} <span class="required">*</span></label>
{% if 'contact_name' in errors %}<p class="q-error-hint">{% if lang == 'de' %}Vollständiger Name ist erforderlich{% else %}Full name is required{% endif %}</p>{% endif %}
{% if 'contact_name' in errors %}<p class="q-error-hint">{{ t.q9_error_name }}</p>{% endif %}
<input type="text" id="contact_name" name="contact_name" class="q-input {% if 'contact_name' in errors %}q-input--error{% endif %}" value="{{ data.get('contact_name', '') }}" required>
</div>
<div class="q-field-group">
<label class="q-label" for="contact_email">{{ t.q9_email_label }} <span class="required">*</span></label>
{% if 'contact_email' in errors %}<p class="q-error-hint">{% if lang == 'de' %}E-Mail ist erforderlich{% else %}Email is required{% endif %}</p>{% endif %}
{% if 'contact_email' in errors %}<p class="q-error-hint">{{ t.q9_error_email }}</p>{% endif %}
<input type="email" id="contact_email" name="contact_email" class="q-input {% if 'contact_email' in errors %}q-input--error{% endif %}" value="{{ data.get('contact_email', '') }}" required>
</div>
<div class="q-field-group">
<label class="q-label" for="contact_phone">{{ t.q9_phone_label }} <span class="required">*</span></label>
{% if 'contact_phone' in errors %}<p class="q-error-hint">{% if lang == 'de' %}Telefonnummer ist erforderlich{% else %}Phone number is required{% endif %}</p>{% endif %}
{% if 'contact_phone' in errors %}<p class="q-error-hint">{{ t.q9_error_phone }}</p>{% endif %}
<input type="tel" id="contact_phone" name="contact_phone" class="q-input {% if 'contact_phone' in errors %}q-input--error{% endif %}" value="{{ data.get('contact_phone', '') }}" required>
</div>
@@ -62,7 +62,7 @@
<div id="q-progress" hx-swap-oob="innerHTML">
<div class="q-progress__meta">
<span class="q-progress__label">{{ steps[step - 1].title }}</span>
<span class="q-progress__count">{% if lang == 'de' %}Schritt {{ step }} von {{ steps|length }}{% else %}{{ step }} of {{ steps|length }}{% endif %}</span>
<span class="q-progress__count">{{ t.q_step_counter | tformat(step=step, total=steps|length) }}</span>
</div>
<div class="q-progress__track">
<div class="q-progress__fill" style="width: {{ (step / steps|length * 100) | round }}%"></div>

View File

@@ -1,5 +1,5 @@
{% extends "base.html" %}
{% block title %}{% if lang == 'de' %}Angebote von Bauunternehmen erhalten - {{ config.APP_NAME }}{% else %}Get Builder Quotes - {{ config.APP_NAME }}{% endif %}{% endblock %}
{% block title %}{{ t.q_page_title }} - {{ config.APP_NAME }}{% endblock %}
{% block head %}
<style>
@@ -105,7 +105,7 @@
<div class="q-progress" id="q-progress">
<div class="q-progress__meta">
<span class="q-progress__label">{{ steps[step - 1].title }}</span>
<span class="q-progress__count">{% if lang == 'de' %}Schritt {{ step }} von {{ steps|length }}{% else %}{{ step }} of {{ steps|length }}{% endif %}</span>
<span class="q-progress__count">{{ t.q_step_counter | tformat(step=step, total=steps|length) }}</span>
</div>
<div class="q-progress__track">
<div class="q-progress__fill" style="width: {{ (step / steps|length * 100) | round }}%"></div>

View File

@@ -57,16 +57,12 @@
<h1 class="text-2xl" style="margin-bottom: 0.5rem;">{{ t.qs_title }}</h1>
<p style="color: #64748B; font-size: 0.9375rem;">
{% if lang == 'de' %}
Wir haben Dein{% if court_count %} {{ court_count }}-Platz-{% endif %}{% if facility_type %} {{ facility_type }}-{% endif %}Projekt{% if country %} in {{ country }}{% endif %} mit verifizierten Anbietern abgestimmt, die sich mit maßgeschneiderten Angeboten bei Dir melden.
{% else %}
We've matched your
{% if court_count %}{{ court_count }}-court{% endif %}
{% if facility_type %}{{ facility_type }}{% endif %}
project
{{ t.qs_matched_pre }}
{% if court_count %}{{ court_count }}{{ t.qs_matched_court_suffix }}{% endif %}
{% if facility_type %}{{ t.qs_matched_facility_fmt | tformat(type=facility_type) }}{% endif %}
{{ t.qs_matched_project }}
{% if country %}in {{ country }}{% endif %}
with verified suppliers who'll reach out with tailored proposals.
{% endif %}
{{ t.qs_matched_post }}
</p>
<div class="next-steps">

View File

@@ -8,11 +8,11 @@
<h1 class="text-2xl mb-4">{{ t.qv_heading }}</h1>
<p class="text-slate-dark">{% if lang == 'de' %}Wir haben einen Verifizierungslink an folgende Adresse gesendet:{% else %}We've sent a verification link to:{% endif %}</p>
<p class="text-slate-dark">{{ t.qv_sent_msg }}</p>
<p class="font-semibold text-navy my-2">{{ contact_email }}</p>
<p class="text-slate text-sm" style="margin-top: 1rem;">
{% if lang == 'de' %}Klick auf den Link in der E-Mail, um Deine Adresse zu bestätigen und Deine Angebotsanfrage zu aktivieren. Dadurch wird auch Dein {{ config.APP_NAME }}-Konto erstellt und du wirst automatisch angemeldet.{% else %}Click the link in the email to verify your address and activate your quote request. This will also create your {{ config.APP_NAME }} account and log you in automatically.{% endif %}
{{ t.qv_instructions | tformat(app_name=config.APP_NAME) }}
</p>
<p class="text-slate text-sm" style="margin-top: 0.5rem;">
@@ -22,10 +22,10 @@
<hr>
<details class="text-left">
<summary class="cursor-pointer text-sm font-medium text-navy">{% if lang == 'de' %}E-Mail nicht erhalten?{% else %}Didn't receive the email?{% endif %}</summary>
<summary class="cursor-pointer text-sm font-medium text-navy">{{ t.qv_no_email }}</summary>
<ul class="list-disc pl-6 mt-2 space-y-1 text-sm text-slate-dark">
<li>{{ t.qv_spam }}</li>
<li>{% if lang == 'de' %}Stell sicher, dass <strong>{{ contact_email }}</strong> korrekt ist{% else %}Make sure <strong>{{ contact_email }}</strong> is correct{% endif %}</li>
<li>{{ t.qv_check_email_pre }}<strong>{{ contact_email }}</strong>{{ t.qv_check_email_post }}</li>
<li>{{ t.qv_wait }}</li>
</ul>
<p class="text-sm text-slate mt-3">

View File

@@ -357,6 +357,8 @@
"q_btn_next": "Weiter →",
"q_btn_back": "← Zurück",
"q_btn_submit": "Absenden & Angebote erhalten →",
"q_page_title": "Angebote von Bauunternehmen erhalten",
"q_step_counter": "Schritt {step} von {total}",
"q1_heading": "Dein Projekt",
"q1_subheading": "Welche Art von Padel-Anlage planst Du?",
"q1_prefill_sub": "Aus dem Planer vorausgefüllt — passe die Angaben nach Bedarf an.",
@@ -378,12 +380,14 @@
"q1_lighting_led_comp": "LED Wettkampf",
"q1_lighting_natural": "Tageslicht",
"q1_lighting_not_sure": "Noch unklar",
"q1_error_facility": "Bitte wähle einen Anlagentyp",
"q2_heading": "Standort",
"q2_subheading": "Wo planst Du zu bauen?",
"q2_city_label": "Stadt / Region",
"q2_city_placeholder": "z.B. München, Bayern",
"q2_country_label": "Land",
"q2_country_default": "Land auswählen…",
"q2_error_country": "Bitte wähle ein Land",
"q3_heading": "Projektsituation",
"q3_subheading": "Was beschreibt Dein Projekt am besten?",
"q3_context_label": "Projektsituation",
@@ -409,6 +413,7 @@
"q5_timeline_6_12": "612 Monate",
"q5_timeline_12_plus": "12+ Monate",
"q5_budget_label": "Budget (€)",
"q5_error_timeline": "Bitte wähle einen Zeitplan",
"q6_heading": "Finanzierung",
"q6_subheading": "Wie finanzierst Du das Projekt?",
"q6_status_label": "Finanzierungsstatus",
@@ -434,6 +439,7 @@
"q7_contact_first": "Zum ersten Mal",
"q7_contact_researching": "Optionen erkunden",
"q7_contact_received": "Bereits Angebote erhalten",
"q7_error_role": "Bitte wähle Deine Rolle",
"q8_heading": "Gewünschte Leistungen",
"q8_subheading": "Wähle alles Zutreffende aus. Das hilft Anbietern, relevante Angebote vorzubereiten.",
"q8_services_label": "Leistungen",
@@ -459,6 +465,9 @@
"q9_consent_privacy": "Datenschutzerklärung",
"q9_consent_terms": "AGB",
"q9_no_obligation": "Keine Verpflichtung.",
"q9_error_name": "Vollständiger Name ist erforderlich",
"q9_error_email": "E-Mail ist erforderlich",
"q9_error_phone": "Telefonnummer ist erforderlich",
"qs_title": "Erfolgreich vermittelt!",
"qs_next_h2": "Was als nächstes passiert",
"qs_step_1": "Anbieter prüfen Deinen Projektbrief und bereiten Angebote vor",
@@ -473,12 +482,22 @@
"qs_signup_text": "Szenarien speichern, Projekt verfolgen und benachrichtigt werden, wenn Anbieter antworten.",
"qs_signup_btn": "Konto erstellen",
"qs_back_planner": "Zum Planer",
"qs_matched_pre": "Wir haben Dein",
"qs_matched_court_suffix": "-Platz-",
"qs_matched_facility_fmt": "{type}-",
"qs_matched_project": "Projekt",
"qs_matched_post": "mit verifizierten Anbietern abgestimmt, die sich mit maßgeschneiderten Angeboten bei Dir melden.",
"qv_heading": "E-Mail prüfen",
"qv_link_expiry": "Der Link läuft in 60 Minuten ab.",
"qv_spam": "Spam-Ordner überprüfen",
"qv_wait": "Einen Moment warten — die Zustellung kann etwas dauern",
"qv_wrong_email": "Falsche E-Mail?",
"qv_wrong_email_link": "Neue Anfrage stellen",
"qv_sent_msg": "Wir haben einen Verifizierungslink an folgende Adresse gesendet:",
"qv_instructions": "Klick auf den Link in der E-Mail, um Deine Adresse zu bestätigen und Deine Angebotsanfrage zu aktivieren. Dadurch wird auch Dein {app_name}-Konto erstellt und du wirst automatisch angemeldet.",
"qv_no_email": "E-Mail nicht erhalten?",
"qv_check_email_pre": "Stell sicher, dass ",
"qv_check_email_post": " korrekt ist",
"sup_signup_step1": "Plan auswählen",
"sup_signup_step2": "Boost-Add-ons",
"sup_signup_step3": "Credit-Pakete",
@@ -991,4 +1010,4 @@
"markets_country_label": "Land",
"article_detail_published_label": "Veröffentlicht",
"article_detail_research_label": "Padelnomics Forschung"
}
}

View File

@@ -357,6 +357,8 @@
"q_btn_next": "Next →",
"q_btn_back": "← Back",
"q_btn_submit": "Submit & Get Quotes →",
"q_page_title": "Get Builder Quotes",
"q_step_counter": "{step} of {total}",
"q1_heading": "Your Project",
"q1_subheading": "What type of padel facility are you planning?",
"q1_prefill_sub": "Pre-filled from your planner — adjust as needed.",
@@ -378,12 +380,14 @@
"q1_lighting_led_comp": "LED Competition",
"q1_lighting_natural": "Natural Light",
"q1_lighting_not_sure": "Not Sure",
"q1_error_facility": "Please select a facility type",
"q2_heading": "Location",
"q2_subheading": "Where are you planning to build?",
"q2_city_label": "City / Region",
"q2_city_placeholder": "e.g. Munich, Bavaria",
"q2_country_label": "Country",
"q2_country_default": "Select country...",
"q2_error_country": "Please select a country",
"q3_heading": "Build Context",
"q3_subheading": "What best describes your project?",
"q3_context_label": "Build Context",
@@ -409,6 +413,7 @@
"q5_timeline_6_12": "612 Months",
"q5_timeline_12_plus": "12+ Months",
"q5_budget_label": "Budget Estimate (€)",
"q5_error_timeline": "Please select a timeline",
"q6_heading": "Financing",
"q6_subheading": "How are you funding the project?",
"q6_status_label": "Financing Status",
@@ -434,6 +439,7 @@
"q7_contact_first": "First time",
"q7_contact_researching": "Researching options",
"q7_contact_received": "Already received quotes",
"q7_error_role": "Please select your role",
"q8_heading": "Services Needed",
"q8_subheading": "Select all that apply. This helps suppliers prepare relevant proposals.",
"q8_services_label": "Services",
@@ -459,6 +465,9 @@
"q9_consent_privacy": "Privacy Policy",
"q9_consent_terms": "Terms",
"q9_no_obligation": "No obligation.",
"q9_error_name": "Full name is required",
"q9_error_email": "Email is required",
"q9_error_phone": "Phone number is required",
"qs_title": "Youre matched!",
"qs_next_h2": "What happens next",
"qs_step_1": "Suppliers review your project brief and prepare proposals",
@@ -473,12 +482,22 @@
"qs_signup_text": "Save scenarios, track your project, and get notified when suppliers respond.",
"qs_signup_btn": "Create Account",
"qs_back_planner": "Back to Planner",
"qs_matched_pre": "We've matched your",
"qs_matched_court_suffix": "-court",
"qs_matched_facility_fmt": "{type}",
"qs_matched_project": "project",
"qs_matched_post": "with verified suppliers who'll reach out with tailored proposals.",
"qv_heading": "Check your email",
"qv_link_expiry": "The link expires in 60 minutes.",
"qv_spam": "Check your spam folder",
"qv_wait": "Wait a minute — delivery can take a moment",
"qv_wrong_email": "Wrong email?",
"qv_wrong_email_link": "Submit a new request",
"qv_sent_msg": "We've sent a verification link to:",
"qv_instructions": "Click the link in the email to verify your address and activate your quote request. This will also create your {app_name} account and log you in automatically.",
"qv_no_email": "Didn't receive the email?",
"qv_check_email_pre": "Make sure ",
"qv_check_email_post": " is correct",
"sup_signup_step1": "Choose Your Plan",
"sup_signup_step2": "Boost Add-Ons",
"sup_signup_step3": "Credit Packs",
@@ -991,4 +1010,4 @@
"markets_country_label": "Country",
"article_detail_published_label": "Published",
"article_detail_research_label": "Padelnomics Research"
}
}