from os import path, listdir from datetime import date from configparser import ConfigParser from flask import ( Flask, redirect, render_template, request, send_from_directory, url_for, ) cp = ConfigParser() app = Flask(__name__) def load_all_locales(): locales_list = [] locales_dict = {} locales_dir = "locales" for filename in listdir(locales_dir): if filename.endswith(".ini"): lang = path.splitext(filename)[0] with open(path.join(locales_dir, filename), encoding="utf-8") as f: cp.read_file(f) locales_dict[lang] = { section: dict(cp[section]) for section in cp.sections() } for code, data in locales_dict.items(): full_name = data.get("title", {}).get("language", code) locales_list.append({"code": code, "name": full_name}) priority = ["en", "ru", "es"] locales_list.sort( key=lambda loc: (0, priority.index(loc["code"])) if loc["code"] in priority else (1, loc["code"]) ) locales_code = [loc["code"] for loc in locales_list] return locales_list, locales_dict, locales_code 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") def favicon(): return send_from_directory( app.static_folder, "favicon.ico", mimetype="image/vnd.microsoft.icon" ) @app.route("/") def home(): return redirect(url_for("index", lang=get_best_lang())) @app.route("/") def index(lang): return render_localized_template(lang, "index.html") @app.route("//download") def download(lang): return render_localized_template(lang, "download.html") if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)