modified: app.py

modified:   static/css/style.css
	modified:   templates/base.html
	modified:   templates/index.html
	modified:   templates/weather.html
	new file:   translations.py
This commit is contained in:
simon
2026-04-27 11:06:16 +02:00
parent e793804cea
commit 2b671b10ff
6 changed files with 285 additions and 57 deletions

31
app.py
View File

@@ -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))