feat/flask: autogenerate languages for dropdown from locale files
This commit is contained in:
40
app.py
40
app.py
@@ -12,13 +12,16 @@ 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_dir = "locales"
|
locales_list = []
|
||||||
|
locales_dict = {}
|
||||||
|
locales_dir = "locales"
|
||||||
|
|
||||||
for filename in listdir(locales_dir):
|
for filename in listdir(locales_dir):
|
||||||
if filename.endswith(".ini"):
|
if filename.endswith(".ini"):
|
||||||
@@ -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,30 +59,32 @@ 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,
|
||||||
lang=lang,
|
locale = locales_dict[lang],
|
||||||
year=date.today().year,
|
lang = lang,
|
||||||
current=request.endpoint,
|
year = date.today().year,
|
||||||
|
current = request.endpoint,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@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,
|
||||||
lang=lang,
|
locale = locales_dict[lang],
|
||||||
year=date.today().year,
|
lang = lang,
|
||||||
current=request.endpoint,
|
year = date.today().year,
|
||||||
|
current = request.endpoint,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,24 +1,27 @@
|
|||||||
<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"),
|
<font bg=#FF9800>
|
||||||
("de", "Deutsch"),
|
<a class="a-sel" href="{{ url_for(request.url_rule.endpoint, lang=lang_code) }}">
|
||||||
("it", "Italiano"),
|
<img
|
||||||
("nl", "Nederlands")
|
src="{{ url_for('static', filename='img/flags/%s.png' % lang_code) }}"
|
||||||
) %}
|
alt="{{ lang_code }}"
|
||||||
{%- if request.view_args['lang'] == l %}
|
/>
|
||||||
<font bg=#FF9800>
|
{{ lang_name }}
|
||||||
<a class='a-sel' href="{{ url_for(request.url_rule.endpoint, lang = l) }}">
|
</a>
|
||||||
<img src="{{ url_for('static', filename='img/flags/%s.png' % l) }}" alt='{{ l }}'/>
|
</font>
|
||||||
{{ lang }}
|
{%- else %}
|
||||||
|
<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>
|
</a>
|
||||||
</font>
|
{%- endif %}
|
||||||
{%- else %}
|
{%- endfor %}
|
||||||
<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>
|
|
||||||
{%- endif %}
|
|
||||||
{%- endfor %}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
Reference in New Issue
Block a user