Files
kolibrios.org/app.py
T

146 lines
3.6 KiB
Python
Raw Normal View History

2025-05-24 11:41:35 +03:00
from os import path, listdir
2025-03-22 18:27:43 +03:00
from datetime import date
from configparser import ConfigParser
2025-05-24 11:41:35 +03:00
from flask import (
Flask,
redirect,
render_template,
request,
url_for,
2025-08-03 10:43:19 +03:00
Response
2025-05-24 11:41:35 +03:00
)
2025-08-03 10:43:19 +03:00
# ---------- APP CONFIG ------------------------------------------------------
2025-03-22 18:27:43 +03:00
app = Flask(__name__)
2025-08-03 10:43:19 +03:00
# ---------- LOCALES FUNCTIONS -----------------------------------------------
def load_all_locales():
cp = ConfigParser()
locales_list = []
locales_dict = {}
2025-07-25 13:51:00 +03:00
locales_dir = "locales"
2025-05-24 11:41:35 +03:00
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)
2025-07-25 13:51:00 +03:00
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(
2025-07-25 13:51:00 +03:00
key=lambda loc: (0, priority.index(loc["code"]))
if loc["code"] in priority
else (1, loc["code"])
)
2025-07-25 13:51:00 +03:00
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()
2025-08-03 10:43:19 +03:00
# ---------- HELPER FUNCTIONS ------------------------------------------------
2025-07-25 13:51:00 +03:00
def get_best_lang():
return request.accept_languages.best_match(locales_code) or "en"
2025-05-24 11:41:35 +03:00
2025-07-25 13:51:00 +03:00
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,
)
2025-03-22 18:27:43 +03:00
2025-08-03 10:43:19 +03:00
# ---------- MAIN PAGES ------------------------------------------------------
2025-03-24 09:02:58 +02:00
@app.route("/")
def home():
2025-07-25 13:51:00 +03:00
return redirect(url_for("index", lang=get_best_lang()))
2025-03-24 09:02:58 +02:00
2025-05-24 11:41:35 +03:00
2025-03-22 18:27:43 +03:00
@app.route("/<lang>")
def index(lang):
2025-07-25 13:51:00 +03:00
return render_localized_template(lang, "index.html")
2025-05-24 11:41:35 +03:00
2025-03-22 18:27:43 +03:00
@app.route("/<lang>/download")
def download(lang):
2025-07-25 13:51:00 +03:00
return render_localized_template(lang, "download.html")
2025-03-22 18:27:43 +03:00
2025-08-03 10:43:19 +03:00
# ---------- ROBOTS.TXT + SITEMAP.XML ----------------------------------------
@app.route("/robots.txt")
def robots_txt():
base_url = request.url_root.rstrip("/")
content = [
"User-agent: *",
"Disallow:",
f"Sitemap: {base_url}/sitemap.xml",
]
return Response("\n".join(content), mimetype="text/plain")
@app.route("/sitemap.xml")
def sitemap_xml():
base_url = request.url_root.rstrip("/")
today = date.today().isoformat()
urls = []
for lang in locales_code:
urls.append(f"{base_url}/{lang}")
urls.append(f"{base_url}/{lang}/download")
xml_lines = [
'<?xml version="1.0" encoding="UTF-8"?>',
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
]
for loc in urls:
xml_lines.extend(
[
" <url>",
f" <loc>{loc}</loc>",
f" <lastmod>{today}</lastmod>",
" <changefreq>monthly</changefreq>",
" <priority>0.8</priority>",
" </url>",
]
)
xml_lines.append("</urlset>")
return Response("\n".join(xml_lines), mimetype="application/xml")
# ---------- APP ENTRY -------------------------------------------------------
2025-03-24 09:02:58 +02:00
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)