feat/flask: autogenerate languages for dropdown from locale files

This commit is contained in:
2025-06-01 18:40:57 +03:00
parent 110a0c172c
commit 52ec2ae623
2 changed files with 49 additions and 36 deletions

26
app.py
View File

@@ -12,12 +12,15 @@ from flask import (
url_for, url_for,
) )
cp = ConfigParser() cp = ConfigParser()
app = Flask(__name__) app = Flask(__name__)
def load_all_locales(): def load_all_locales():
locales = {}
locales_list = []
locales_dict = {}
locales_dir = "locales" locales_dir = "locales"
for filename in listdir(locales_dir): for filename in listdir(locales_dir):
@@ -26,12 +29,17 @@ def load_all_locales():
cp = ConfigParser() 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[lang] = {section: dict(cp[section]) for section in cp.sections()} locales_dict[lang] = {section: dict(cp[section]) for section in cp.sections()}
return locales for code, data in locales_dict.items():
full_name = data.get("title", {}).get("language", code)
locales_list.append({"code": code, "name": full_name})
print(locales_list)
return locales_list, locales_dict
locales = load_all_locales() locales_list, locales_dict = load_all_locales()
@app.route("/favicon.ico") @app.route("/favicon.ico")
@@ -51,12 +59,13 @@ def home():
@app.route("/<lang>") @app.route("/<lang>")
def index(lang): def index(lang):
if lang not in locales: if lang not in locales_dict:
abort(404) abort(404)
return render_template( return render_template(
f"{lang}.html", f"{lang}.html",
locale=locales[lang], loc_list = locales_list,
locale = locales_dict[lang],
lang = lang, lang = lang,
year = date.today().year, year = date.today().year,
current = request.endpoint, current = request.endpoint,
@@ -66,12 +75,13 @@ def index(lang):
@app.route("/<lang>/download") @app.route("/<lang>/download")
def download_page(lang): def download_page(lang):
if lang not in locales: if lang not in locales_dict:
abort(404) abort(404)
return render_template( return render_template(
"tmpl/download.htm", "tmpl/download.htm",
locale=locales[lang], loc_list = locales_list,
locale = locales_dict[lang],
lang = lang, lang = lang,
year = date.today().year, year = date.today().year,
current = request.endpoint, current = request.endpoint,

View File

@@ -1,23 +1,26 @@
<div id="lang-dropdown"> <div id="lang-dropdown">
<div> <div>
{%- for l, lang in ( {%- for lang_item in loc_list %}
("en", "English"), {% set lang_code = lang_item.code %}
("ru", "Русский"), {% set lang_name = lang_item.name %}
("es", "Español"), {%- if request.view_args["lang"] == lang_code %}
("fr", "Français"),
("de", "Deutsch"),
("it", "Italiano"),
("nl", "Nederlands")
) %}
{%- if request.view_args['lang'] == l %}
<font bg=#FF9800> <font bg=#FF9800>
<a class='a-sel' href="{{ url_for(request.url_rule.endpoint, lang = l) }}"> <a class="a-sel" href="{{ url_for(request.url_rule.endpoint, lang=lang_code) }}">
<img src="{{ url_for('static', filename='img/flags/%s.png' % l) }}" alt='{{ l }}'/> <img
{{ lang }} src="{{ url_for('static', filename='img/flags/%s.png' % lang_code) }}"
alt="{{ lang_code }}"
/>
{{ lang_name }}
</a> </a>
</font> </font>
{%- else %} {%- else %}
<a href="{{ url_for(request.url_rule.endpoint, lang = l) }}"><img src="{{ url_for('static', filename='img/flags/%s.png' % l) }}" alt='de'/>{{ lang }}</a> <a href="{{ url_for(request.url_rule.endpoint, lang=lang_code) }}">
<img
src="{{ url_for('static', filename='img/flags/%s.png' % lang_code) }}"
alt="{{ lang_code }}"
/>
{{ lang_name }}
</a>
{%- endif %} {%- endif %}
{%- endfor %} {%- endfor %}
</div> </div>