Add bilingual UI and improve event actions layout
Add persistent German/English switching, translated UI messages and English 12-hour times. Align desktop event actions while preserving mobile layouts and record bilingual project guidance. Include pending diary deletion exclusions. Validate both languages with nine tests.
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<html lang="{{ language() }}">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Veranstaltungsorte · MetalCircle</title>
|
||||
<title>{{ _('Veranstaltungsorte · MetalCircle') }}</title>
|
||||
<link rel="icon" type="image/png" href="/static/images/metalcircle-circle.png">
|
||||
<link rel="stylesheet" href="/static/css/style.css">
|
||||
<style>
|
||||
@@ -28,11 +28,13 @@
|
||||
@media (max-width: 900px) { .venue-fields { grid-template-columns: 1fr 1fr; } }
|
||||
@media (max-width: 560px) { .venue-fields, .merge-form { grid-template-columns: 1fr; } }
|
||||
</style>
|
||||
<link rel="stylesheet" href="/static/css/language.css">
|
||||
</head>
|
||||
<body>
|
||||
<header><div class="header-inner"><a href="/" class="logo"><img class="brand-logo" src="/static/images/metalcircle-full.png" alt="MetalCircle"></a>{% include '_user_menu.html' %}</div></header>
|
||||
<header><div class="header-inner"><a href="/" class="logo"><img class="brand-logo" src="/static/images/metalcircle-full.png" alt="MetalCircle"></a>{% include '_user_menu.html' %}</div> {% include '_language_switch.html' %}
|
||||
</header>
|
||||
<main>
|
||||
<div class="page-title"><h1>📍 Veranstaltungsorte</h1><p>Orte korrigieren, bestätigen, zusammenführen oder entfernen.</p></div>
|
||||
<div class="page-title"><h1>{{ _('📍 Veranstaltungsorte') }}</h1><p>{{ _('Orte korrigieren, bestätigen, zusammenführen oder entfernen.') }}</p></div>
|
||||
{% set admin_section = 'venues' %}{% include '_admin_nav.html' %}
|
||||
<section class="admin-section">
|
||||
<div class="admin-list">
|
||||
@@ -41,37 +43,37 @@
|
||||
<summary class="venue-summary">
|
||||
<span>
|
||||
<strong class="venue-summary-title">{{ venue.name }}{% if venue.city %} · {{ venue.city }}{% endif %}{% if venue.country %} · {{ venue.country }}{% endif %}</strong>
|
||||
<span class="venue-summary-meta"><span class="{% if venue.is_verified %}venue-verified{% else %}venue-unverified{% endif %}">{% if venue.is_verified %}✓ bestätigt{% else %}● unbestätigt{% endif %}</span> · {{ venue.concert_count }} Veranstaltung(en) · ID {{ venue.id }}</span>
|
||||
<span class="venue-summary-meta"><span class="{% if venue.is_verified %}venue-verified{% else %}venue-unverified{% endif %}">{% if venue.is_verified %}{{ _('✓ bestätigt') }}{% else %}{{ _('● unbestätigt') }}{% endif %}</span> · {{ venue.concert_count }} {{ _('Veranstaltung(en) · ID') }} {{ venue.id }}</span>
|
||||
</span>
|
||||
</summary>
|
||||
<div class="venue-editor">
|
||||
<form method="post" action="/admin/venues/{{ venue.id }}">
|
||||
<div class="venue-fields">
|
||||
<input name="name" value="{{ venue.name }}" aria-label="Name" required>
|
||||
<input name="street" value="{{ venue.street }}" placeholder="Straße" aria-label="Straße">
|
||||
<input name="postal_code" value="{{ venue.postal_code }}" placeholder="PLZ" aria-label="PLZ">
|
||||
<input name="city" value="{{ venue.city }}" placeholder="Ort" aria-label="Ort">
|
||||
<input name="country" value="{{ venue.country }}" placeholder="Land" aria-label="Land">
|
||||
<input name="street" value="{{ venue.street }}" placeholder="{{ _('Straße') }}" aria-label="{{ _('Straße') }}">
|
||||
<input name="postal_code" value="{{ venue.postal_code }}" placeholder="{{ _('PLZ') }}" aria-label="{{ _('PLZ') }}">
|
||||
<input name="city" value="{{ venue.city }}" placeholder="{{ _('Ort') }}" aria-label="{{ _('Ort') }}">
|
||||
<input name="country" value="{{ venue.country }}" placeholder="{{ _('Land') }}" aria-label="{{ _('Land') }}">
|
||||
</div>
|
||||
<input class="venue-aliases" name="aliases" value="{{ venue.aliases }}" placeholder="Aliase, durch Komma getrennt" aria-label="Aliase">
|
||||
<input class="venue-aliases" name="aliases" value="{{ venue.aliases }}" placeholder="{{ _('Aliase, durch Komma getrennt') }}" aria-label="{{ _('Aliase') }}">
|
||||
<div class="admin-actions venue-actions">
|
||||
<label><input type="checkbox" name="is_verified" {% if venue.is_verified %}checked{% endif %}> bestätigt</label>
|
||||
<span class="admin-meta">Quelle: {{ venue.source }} · {{ venue.concert_count }} Konzert(e) · ID {{ venue.id }}</span>
|
||||
<button class="button" type="submit">Speichern</button>
|
||||
<label><input type="checkbox" name="is_verified" {% if venue.is_verified %}checked{% endif %}> {{ _('bestätigt') }}</label>
|
||||
<span class="admin-meta">{{ _('Quelle:') }} {{ venue.source }} · {{ venue.concert_count }} {{ _('Konzert(e) · ID') }} {{ venue.id }}</span>
|
||||
<button class="button" type="submit">{{ _('Speichern') }}</button>
|
||||
</div>
|
||||
</form>
|
||||
{% if venues|length > 1 %}
|
||||
<form class="merge-form" method="post" action="/admin/venues/{{ venue.id }}/merge" onsubmit="return confirm('Alle Konzerte werden dem Zielort zugeordnet und dieser Eintrag wird gelöscht. Fortfahren?');">
|
||||
<select name="target_venue_id" required><option value="">Mit anderem Ort zusammenführen …</option>{% for target in venues %}{% if target.id != venue.id %}<option value="{{ target.id }}">{{ target.name }}{% if target.city %}, {{ target.city }}{% endif %}</option>{% endif %}{% endfor %}</select>
|
||||
<button class="admin-danger" type="submit">Zusammenführen</button>
|
||||
<form class="merge-form" method="post" action="/admin/venues/{{ venue.id }}/merge" onsubmit="return confirm({{ _('Alle Konzerte werden dem Zielort zugeordnet und dieser Eintrag wird gelöscht. Fortfahren?') | tojson | forceescape }});">
|
||||
<select name="target_venue_id" required><option value="">{{ _('Mit anderem Ort zusammenführen …') }}</option>{% for target in venues %}{% if target.id != venue.id %}<option value="{{ target.id }}">{{ target.name }}{% if target.city %}, {{ target.city }}{% endif %}</option>{% endif %}{% endfor %}</select>
|
||||
<button class="admin-danger" type="submit">{{ _('Zusammenführen') }}</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
<form class="delete-form" method="post" action="/admin/venues/{{ venue.id }}/delete" onsubmit="return confirm('{% if venue.concert_count %}Der Ort ist mit {{ venue.concert_count }} Konzert(en) verknüpft. Diese Konzerte haben danach keinen Veranstaltungsort mehr. {% endif %}Ort endgültig löschen?');">
|
||||
<button class="admin-danger" type="submit">Ort löschen{% if venue.concert_count %} ({{ venue.concert_count }} Verknüpfung(en)){% endif %}</button>
|
||||
<form class="delete-form" method="post" action="/admin/venues/{{ venue.id }}/delete" onsubmit="return confirm({{ (_('Der Ort ist mit {count} Konzert(en) verknüpft. Diese Konzerte haben danach keinen Veranstaltungsort mehr. Ort endgültig löschen?').format(count=venue.concert_count) if venue.concert_count else _('Ort endgültig löschen?')) | tojson | forceescape }});">
|
||||
<button class="admin-danger" type="submit">{{ _('Ort löschen') }}{% if venue.concert_count %} ({{ venue.concert_count }} {{ _('Verknüpfung(en))') }}{% endif %}</button>
|
||||
</form>
|
||||
</div>
|
||||
</details>
|
||||
{% else %}<p>Noch keine Veranstaltungsorte vorhanden.</p>{% endfor %}
|
||||
{% else %}<p>{{ _('Noch keine Veranstaltungsorte vorhanden.') }}</p>{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
Reference in New Issue
Block a user