taler-merchant-demos

Python-based Frontends for the Demonstration Web site
Log | Files | Refs | Submodules | README | LICENSE

commit a80b6a5d8eada7c9d17bcc5964dd6ce3ac1478f2
parent 106f4efd54df8155130af9a2b1f4ff78376e4266
Author: MS <ms@taler.net>
Date:   Wed,  2 Nov 2022 11:20:44 +0100

i18n

manage unsupported languages

Diffstat:
Mtalermerchantdemos/blog/blog.py | 10++++++++++
Mtalermerchantdemos/donations/donations.py | 10++++++++++
Mtalermerchantdemos/httpcommon/__init__.py | 9+++++++++
Mtalermerchantdemos/landing/landing.py | 10+++++++++-
Mtalermerchantdemos/survey/survey.py | 9+++++++++
5 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/talermerchantdemos/blog/blog.py b/talermerchantdemos/blog/blog.py @@ -164,6 +164,16 @@ def favicon(): # @return response object of the index page. @app.route("/<lang>/") def start(lang): + + # get_locale defaults to english, hence the + # condition below happens only when lang is + # wrong or unsupported, respond 404. + if lang != get_locale(): + err_abort( + 404, + message="Language {} not found".format(lang), + ) + if lang in ARTICLES: translated = ARTICLES[lang] else: diff --git a/talermerchantdemos/donations/donations.py b/talermerchantdemos/donations/donations.py @@ -175,6 +175,16 @@ def index(): # @return response object of the index page. @app.route("/<lang>/") def start(lang): + + # get_locale defaults to english, hence the + # condition below happens only when lang is + # wrong or unsupported, respond 404. + if lang != get_locale(): + err_abort( + 404, + message=f"Language {lang} not found", + ) + return flask.render_template( "donations-index.html.j2", page_title=gettext("GNU Taler Demo: Donations"), diff --git a/talermerchantdemos/httpcommon/__init__.py b/talermerchantdemos/httpcommon/__init__.py @@ -5,6 +5,7 @@ from flask import request, url_for from datetime import datetime import time from flask_babel import gettext +import babel # used for lang sanity check import os import re import logging @@ -99,6 +100,14 @@ def get_locale(): # Totally unexpected path format, do not localize return "en" lang = parts[1] + + # Sanity check on the language code. + try: + babel.core.Locale.parse(lang) + except Exception as err: + # Not a locale, default to english. + LOGGER.error(f"language {lang} did not parse, default to english") + return "en" if lang == "static": # Static resource, not a language indicator. # Do not localize then. diff --git a/talermerchantdemos/landing/landing.py b/talermerchantdemos/landing/landing.py @@ -23,6 +23,7 @@ import base64 import logging import flask import uwsgi +import werkzeug from flask import request, url_for from flask_babel import Babel from flask_babel import refresh @@ -128,6 +129,12 @@ def index(): @app.route("/<lang>/", methods=["GET"]) def start(lang): + # get_locale defaults to english, hence the + # condition below happens only when lang is + # wrong or unsupported, respond 404. + if lang != get_locale(): + raise werkzeug.exceptions.NotFound() + if x := os.environ.get("TALER_ENV_URL_BANK"): bank_url = "/".join([x.strip("/"), f"?lang={lang}"]) bank_register_url = bank_url @@ -162,7 +169,8 @@ def start(lang): ) -@app.errorhandler(404) +@app.errorhandler(404) # How to trigger this? +@app.errorhandler(werkzeug.exceptions.NotFound) def handler_404(e): return flask.render_template( "landing-error.html.j2", diff --git a/talermerchantdemos/survey/survey.py b/talermerchantdemos/survey/survey.py @@ -22,6 +22,7 @@ import datetime import base64 import uwsgi import logging +import werkzeug from urllib.parse import urljoin import flask from flask import request @@ -159,6 +160,13 @@ def index(): @app.route("/<lang>/", methods=["GET"]) def start(lang): LOGGER.info("Serving main page. Currency: {}".format(CURRENCY)) + + # get_locale defaults to english, hence the + # condition below happens only when lang is + # wrong or unsupported, respond 404. + if lang != get_locale(): + raise werkzeug.exceptions.NotFound() + return flask.render_template( "survey-index.html.j2", page_title=gettext("GNU Taler Demo: Survey"), @@ -167,6 +175,7 @@ def start(lang): @app.errorhandler(404) +@app.errorhandler(werkzeug.exceptions.NotFound) def handler_404(e): return flask.render_template( "survey-error.html.j2",