From e5d9ee98a548e2b863104e52eb2bc309b1336179 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Mon, 31 Oct 2022 18:08:33 +0100 Subject: add internationalization and polish translations --- src/hydrilla_website/app.py | 55 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 13 deletions(-) (limited to 'src/hydrilla_website/app.py') 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 -- cgit v1.2.3