feat/flask: small tweaks and fixes

This commit is contained in:
2025-07-25 13:51:00 +03:00
parent 3c6e21b4e8
commit e8ce7ee1d5

78
app.py
View File

@@ -4,7 +4,6 @@ from configparser import ConfigParser
from flask import ( from flask import (
Flask, Flask,
abort,
redirect, redirect,
render_template, render_template,
request, request,
@@ -18,87 +17,76 @@ app = Flask(__name__)
def load_all_locales(): def load_all_locales():
locales_list = [] locales_list = []
locales_dict = {} locales_dict = {}
locales_dir = "locales" locales_dir = "locales"
# ---------- load every .ini file ----------
for filename in listdir(locales_dir): for filename in listdir(locales_dir):
if filename.endswith(".ini"): if filename.endswith(".ini"):
lang = path.splitext(filename)[0] lang = path.splitext(filename)[0]
cp = ConfigParser()
with open(path.join(locales_dir, filename), encoding="utf-8") as f: with open(path.join(locales_dir, filename), encoding="utf-8") as f:
cp.read_file(f) cp.read_file(f)
locales_dict[lang] = {section: dict(cp[section]) for section in cp.sections()} locales_dict[lang] = {
section: dict(cp[section]) for section in cp.sections()
}
# ---------- turn it into a list ----------
for code, data in locales_dict.items(): for code, data in locales_dict.items():
full_name = data.get("title", {}).get("language", code) full_name = data.get("title", {}).get("language", code)
locales_list.append({"code": code, "name": full_name}) locales_list.append({"code": code, "name": full_name})
# ---------- hand-sort: en → ru → es → everything else (alphabetical) ----------
priority = ["en", "ru", "es"] priority = ["en", "ru", "es"]
locales_list.sort( locales_list.sort(
key=lambda loc: ( key=lambda loc: (0, priority.index(loc["code"]))
0, if loc["code"] in priority
priority.index(loc["code"]) else (1, loc["code"])
) if loc["code"] in priority else (
1,
loc["code"]
)
) )
return locales_list, locales_dict locales_code = [loc["code"] for loc in locales_list]
return locales_list, locales_dict, locales_code
locales_list, locales_dict = load_all_locales() locales_list, locales_dict, locales_code = load_all_locales()
def get_best_lang():
return request.accept_languages.best_match(locales_code) or "en"
def render_localized_template(lang, template_name):
if lang not in locales_dict:
return redirect(url_for("index", lang=get_best_lang()))
return render_template(
template_name,
loc_list=locales_list,
locale=locales_dict[lang],
lang=lang,
year=date.today().year,
current=request.endpoint,
)
@app.route("/favicon.ico") @app.route("/favicon.ico")
def favicon(): def favicon():
return send_from_directory( return send_from_directory(
app.static_folder, app.static_folder, "favicon.ico", mimetype="image/vnd.microsoft.icon"
"favicon.ico",
mimetype="image/vnd.microsoft.icon"
) )
@app.route("/") @app.route("/")
def home(): def home():
return redirect(url_for("index", lang="en")) return redirect(url_for("index", lang=get_best_lang()))
@app.route("/<lang>") @app.route("/<lang>")
def index(lang): def index(lang):
return render_localized_template(lang, "index.html")
if lang not in locales_dict:
abort(404)
return render_template(
"index.html",
loc_list = locales_list,
locale = locales_dict[lang],
lang = lang,
year = date.today().year,
current = request.endpoint,
)
@app.route("/<lang>/download") @app.route("/<lang>/download")
def download(lang): def download(lang):
return render_localized_template(lang, "download.html")
if lang not in locales_dict:
abort(404)
return render_template(
"download.html",
loc_list = locales_list,
locale = locales_dict[lang],
lang = lang,
year = date.today().year,
current = request.endpoint,
)
if __name__ == "__main__": if __name__ == "__main__":