aboutsummaryrefslogtreecommitdiff
path: root/src/hydrilla_website/app.py
diff options
context:
space:
mode:
authorWojtek Kosior <koszko@koszko.org>2022-10-31 18:08:33 +0100
committerWojtek Kosior <koszko@koszko.org>2022-10-31 18:08:33 +0100
commite5d9ee98a548e2b863104e52eb2bc309b1336179 (patch)
tree729b649284823a45d95baeec27618223c21e83a3 /src/hydrilla_website/app.py
parent5bd4d055f314eeba9187163b191ffa6ecce03f33 (diff)
downloadhydrilla-website-e5d9ee98a548e2b863104e52eb2bc309b1336179.tar.gz
hydrilla-website-e5d9ee98a548e2b863104e52eb2bc309b1336179.zip
add internationalization and polish translations
Diffstat (limited to 'src/hydrilla_website/app.py')
-rw-r--r--src/hydrilla_website/app.py55
1 files changed, 42 insertions, 13 deletions
diff --git a/src/hydrilla_website/app.py b/src/hydrilla_website/app.py
index a86c22a..289bf76 100644
--- a/src/hydrilla_website/app.py
+++ b/src/hydrilla_website/app.py
@@ -30,6 +30,8 @@ import typing as t
from pathlib import Path
import flask
+import werkzeug
+import itsdangerous
import jinja2
from . import common_jinja_templates
@@ -38,26 +40,34 @@ from . import common_jinja_templates
here = Path(__file__).resolve().parent
-supported_languages = {'en_US'}
+supported_locales = {'en_US', 'pl_PL'}
default_locale = 'en_US'
def choose_locale() -> None:
app = t.cast(HydrillaWebsite, flask.current_app)
- best_locale_match = flask.request.accept_languages.best_match(
- supported_languages,
- default = default_locale
- )
- if best_locale_match is None:
- app._hydrilla_request_locale = default_locale
+
+ user_chosen_locale = flask.request.cookies.get('chosen-locale')
+ if user_chosen_locale not in supported_locales:
+ user_chosen_locale = None
+
+ if user_chosen_locale is None:
+ best_locale_match = flask.request.accept_languages.best_match(
+ supported_locales,
+ default = default_locale
+ )
+ if best_locale_match is None:
+ app._hydrilla_request_locale = default_locale
+ else:
+ app._hydrilla_request_locale = best_locale_match
else:
- app._hydrilla_request_locale = best_locale_match
+ app._hydrilla_request_locale = user_chosen_locale
translations = gettext.translation(
- 'messages',
- localedir = here / 'locales',
- languages = [app._hydrilla_request_locale]
- )
+ 'messages',
+ localedir = here / 'locales',
+ languages = [app._hydrilla_request_locale]
+ )
app.jinja_env.install_gettext_translations(translations)
@@ -90,7 +100,10 @@ website_app = HydrillaWebsite()
@website_app.route('/', methods=['GET'])
def main() -> str:
- return flask.render_template('index.html.jinja')
+ return flask.render_template(
+ 'index.html.jinja',
+ locale_serializer = itsdangerous.Serializer(secret, salt='set_locale')
+ )
@website_app.route('/favicon.ico', methods=['GET'])
def favicon() -> str:
@@ -99,3 +112,19 @@ def favicon() -> str:
@website_app.route('/downloads', methods=['GET'])
def downloads() -> str:
return flask.render_template('downloads.html.jinja')
+
+@website_app.route('/set-lang', methods=['POST'])
+def set_locale() -> werkzeug.Response:
+ serializer = itsdangerous.Serializer(secret, salt='set_locale')
+ new_locale = serializer.loads(flask.request.form['lang_code'])
+
+ response = flask.redirect(flask.url_for('main') + '#langs', code=303)
+ response.set_cookie(key='chosen-locale', value=new_locale, path='/')
+
+ return response
+
+secret = 'not-so-secret'
+
+def set_secret(new_secret: str) -> None:
+ global secret
+ secret = new_secret