diff --git a/app.py b/app.py index 5cdf01b..7295042 100644 --- a/app.py +++ b/app.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- -from flask import Flask, render_template, request, jsonify +from flask import Flask, render_template, request, jsonify, redirect, make_response, g +from translations import TRANSLATIONS from geopy.geocoders import Nominatim from geopy.exc import GeocoderTimedOut import math @@ -19,6 +20,18 @@ import requests as _requests app = Flask(__name__) app.logger.setLevel(logging.INFO) +@app.before_request +def _set_language(): + lang = request.cookies.get("lang", "de") + if lang not in TRANSLATIONS: + lang = "de" + g.lang = lang + g.T = TRANSLATIONS[lang] + +@app.context_processor +def _inject_i18n(): + return {"T": g.get("T", TRANSLATIONS["de"]), "lang": g.get("lang", "de")} + _GEOLOCATOR = Nominatim(user_agent="skywatcher-app/1.0") # ── Zeitzone ──────────────────────────────────────────────────────────── @@ -810,6 +823,16 @@ def filter_unrealistic_warnings(warnings, forecast, now_local=None): return result +@app.route("/set-lang") +def set_lang(): + lang = request.args.get("lang", "de") + if lang not in TRANSLATIONS: + lang = "de" + dest = request.args.get("next") or request.referrer or "/" + resp = make_response(redirect(dest)) + resp.set_cookie("lang", lang, max_age=60*60*24*365, samesite="Lax") + return resp + @app.route("/") def index(): return render_template("index.html") @@ -840,14 +863,14 @@ def wetter(): if lat is None: if not ort: - return render_template("index.html", error="Bitte einen Ort eingeben.") + return render_template("index.html", error=g.T["error_no_place"]) lat, lon, display_name, state_hint, location_names = geocode_location(ort) if lat is None: - return render_template("index.html", error=f'Ort "{ort}" konnte nicht gefunden werden.') + return render_template("index.html", error=g.T["error_place_not_found"].format(ort=ort)) loc_tz, location_tz = _get_location_tz(lat, lon) forecast, mosmix_station = get_mosmix_forecast(lat, lon, hours=240, loc_tz=loc_tz) if not forecast: - return render_template("index.html", error="Keine Wetterdaten verfügbar. Bitte später erneut versuchen.") + return render_template("index.html", error=g.T["error_no_data"]) station_name = mosmix_station.get("name", ort) station_id = mosmix_station.get("station_id", "–") station_lat = float(mosmix_station.get("latitude", lat)) diff --git a/static/css/style.css b/static/css/style.css index b23a852..d1e1f1b 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -61,6 +61,24 @@ main { flex: 1; } letter-spacing: 0.02em; white-space: nowrap; } +.lang-switch { + display: flex; align-items: center; gap: 0.15rem; + flex-shrink: 0; +} +.lang-btn { + font-size: 0.78rem; font-weight: 600; + padding: 0.2rem 0.45rem; + border-radius: 5px; + color: var(--muted); + text-decoration: none; + letter-spacing: 0.04em; + transition: color 0.15s, background 0.15s; +} +.lang-btn:hover { color: var(--text); } +.lang-btn--active { + color: var(--orange); + background: rgba(255,140,50,0.12); +} .nav-search-wrap { position: relative; display: flex; align-items: center; } .nav-search-icon { position: absolute; left: 10px; width: 16px; height: 16px; diff --git a/templates/base.html b/templates/base.html index ed3758d..1ae561c 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,5 +1,5 @@ - + @@ -15,17 +15,21 @@ - + +
{% block content %}{% endblock %}