gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-taler-merchant-demos] branch master updated (0ec9dfd -> 769ea27)


From: gnunet
Subject: [taler-taler-merchant-demos] branch master updated (0ec9dfd -> 769ea27)
Date: Tue, 03 Sep 2024 16:09:36 +0200

This is an automated email from the git hooks/post-receive script.

dold pushed a change to branch master
in repository taler-merchant-demos.

    from 0ec9dfd  separate backend config sections for each demo
     new 3403b8c  translations
     new 769ea27  don't use deprecated Python APIs, read config from file

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 talermerchantdemos/blog/blog.py                    | 300 +++++++++++----------
 talermerchantdemos/blog/content.py                 | 107 ++++----
 talermerchantdemos/cli.py                          |  21 +-
 talermerchantdemos/donations/donations.py          |  65 +++--
 talermerchantdemos/httpcommon/__init__.py          |  33 ++-
 talermerchantdemos/landing/landing.py              |  28 +-
 .../translations/ar/LC_MESSAGES/messages.po        | 119 ++++----
 .../translations/de/LC_MESSAGES/messages.po        | 151 +++++------
 .../translations/en/LC_MESSAGES/messages.po        | 118 ++++----
 .../translations/es/LC_MESSAGES/messages.po        | 131 ++++-----
 .../translations/fr/LC_MESSAGES/messages.po        | 119 ++++----
 .../translations/hi/LC_MESSAGES/messages.po        | 118 ++++----
 .../translations/it/LC_MESSAGES/messages.po        | 127 ++++-----
 .../translations/ja/LC_MESSAGES/messages.po        | 119 ++++----
 .../translations/ko/LC_MESSAGES/messages.po        | 119 ++++----
 talermerchantdemos/translations/messages.pot       | 122 ++++-----
 .../translations/pt/LC_MESSAGES/messages.po        | 119 ++++----
 .../translations/ru/LC_MESSAGES/messages.po        | 136 ++++------
 .../translations/sv/LC_MESSAGES/messages.po        | 119 ++++----
 .../translations/tr/LC_MESSAGES/messages.po        | 143 +++++-----
 .../translations/uk/LC_MESSAGES/messages.po        | 250 ++++++++---------
 .../translations/zh_Hant/LC_MESSAGES/messages.po   | 119 ++++----
 talermerchantdemos/util/talerconfig.py             |   8 +-
 23 files changed, 1195 insertions(+), 1496 deletions(-)

diff --git a/talermerchantdemos/blog/blog.py b/talermerchantdemos/blog/blog.py
index bcd1bb8..d90cce3 100644
--- a/talermerchantdemos/blog/blog.py
+++ b/talermerchantdemos/blog/blog.py
@@ -35,7 +35,7 @@ import time
 import sys
 from urllib.parse import urljoin, urlencode, urlparse
 from ..util.talerconfig import TalerConfig, ConfigurationError
-from ..blog.content import ARTICLES, get_article_file, get_image_file
+from ..blog.content import ARTICLES, get_article_contents
 from talermerchantdemos.httpcommon import (
     backend_get,
     backend_get_with_status,
@@ -48,14 +48,64 @@ from talermerchantdemos.httpcommon import (
     get_locale,
 )
 
+if not sys.version_info.major == 3 and sys.version_info.minor >= 6:
+    print("Python 3.6 or higher is required.")
+    print(
+        "You are using Python {}.{}.".format(
+            sys.version_info.major, sys.version_info.minor
+        )
+    )
+    sys.exit(1)
+
+app = flask.Flask(__name__, template_folder="../templates", 
static_folder="../static")
+app.wsgi_app = ProxyFix(app.wsgi_app, x_host=1, x_prefix=1)
+app.debug = True
+app.secret_key = base64.b64encode(os.urandom(64)).decode("utf-8")
+
+logging.basicConfig()
+LOGGER = logging.getLogger(__name__)
+
+config_filename = uwsgi.opt["config_filename"].decode("utf-8")
+if config_filename == "":
+    config_filename = None
+
+config = TalerConfig.from_file(config_filename)
+
+CURRENCY = config["taler"]["currency"].value_string(required=True)
+
+ARTICLE_AMOUNT = CURRENCY + ":0.5"
+BACKEND_URL = 
config["frontend-demo-blog"]["backend_url"].value_string(required=True)
+APIKEY = 
config["frontend-demo-blog"]["backend_apikey"].value_string(required=True)
+
+BABEL_TRANSLATION_DIRECTORIES = "../translations"
+
+app.config.from_object(__name__)
+babel = Babel(app)
+babel.localeselector(get_locale)
+
+LOGGER.info("Using translations from:" + 
":".join(list(babel.translation_directories)))
+translations = [str(translation) for translation in babel.list_translations()]
+if not "en" in translations:
+    translations.append("en")
+LOGGER.info(
+    "Operating with the following translations available: " + " 
".join(translations)
+)
+
+# Add context processor that will make additional variables
+# and functions available in the template.
+app.context_processor(
+    make_utility_processor("blog", 
os.environ.get("TALER_ENV_URL_MERCHANT_BLOG"))
+)
+
+
 def req_add_cookie_check():
     current_url = list(urllib.parse.urlparse(flask.request.base_url))
     args_writable = flask.request.args.copy()
     # Adding the used param.
     args_writable.update(dict(expect_state="yes"))
-    current_url[4] = urllib.parse.urlencode(args_writable) 
+    current_url[4] = urllib.parse.urlencode(args_writable)
     # Stringify the result.
-    return urllib.parse.urlunparse(current_url) 
+    return urllib.parse.urlunparse(current_url)
 
 
 def req_rm_cookie_check():
@@ -63,9 +113,9 @@ def req_rm_cookie_check():
     args_writable = flask.request.args.copy()
     # Stripping the used param.
     args_writable.pop("expect_state")
-    current_url[4] = urllib.parse.urlencode(args_writable) 
+    current_url[4] = urllib.parse.urlencode(args_writable)
     # Stringify the result.
-    return urllib.parse.urlunparse(current_url) 
+    return urllib.parse.urlunparse(current_url)
 
 
 def err_abort(abort_status_code, **params):
@@ -91,52 +141,6 @@ def refundable(pay_status):
         return True
     return False
 
-if not sys.version_info.major == 3 and sys.version_info.minor >= 6:
-    print("Python 3.6 or higher is required.")
-    print(
-        "You are using Python {}.{}.".format(
-            sys.version_info.major, sys.version_info.minor
-        )
-    )
-    sys.exit(1)
-
-app = flask.Flask(__name__, template_folder="../templates", 
static_folder="../static")
-app.wsgi_app = ProxyFix(app.wsgi_app, x_host=1, x_prefix=1)
-app.debug = True
-app.secret_key = base64.b64encode(os.urandom(64)).decode("utf-8")
-
-logging.basicConfig()
-LOGGER = logging.getLogger(__name__)
-try:
-
-    BACKEND_BASE_URL = uwsgi.opt["backend_url"].decode("utf-8")
-    CURRENCY = uwsgi.opt["currency"].decode("utf-8")
-    APIKEY = uwsgi.opt["apikey"].decode("utf-8")
-except ConfigurationError as ce:
-    print(ce)
-    exit(1)
-
-ARTICLE_AMOUNT = CURRENCY + ":0.5"
-BACKEND_URL = urljoin(BACKEND_BASE_URL, "instances/blog/")
-
-BABEL_TRANSLATION_DIRECTORIES = "../translations"
-
-app.config.from_object(__name__)
-babel = Babel(app)
-babel.localeselector(get_locale)
-
-LOGGER.info("Using translations from:" + 
":".join(list(babel.translation_directories)))
-translations = [str(translation) for translation in babel.list_translations()]
-if not "en" in translations:
-    translations.append("en")
-LOGGER.info(
-    "Operating with the following translations available: " + " 
".join(translations)
-)
-
-# Add context processor that will make additional variables
-# and functions available in the template.
-app.context_processor(make_utility_processor("blog", os.environ.get 
("TALER_ENV_URL_MERCHANT_BLOG")))
-
 
 ##
 # "Fallback" exception handler to capture all the unmanaged errors.
@@ -162,7 +166,7 @@ def internal_error(e):
 def index():
     default = "en"
     target = flask.request.accept_languages.best_match(translations, default)
-    return flask.redirect(url_for ('index') + target + "/", code=302)
+    return flask.redirect(url_for("index") + target + "/", code=302)
 
 
 ##
@@ -301,14 +305,14 @@ def render_article(article_name, lang, data, order_id, 
refundable):
         )
         err_abort(500, message=m)
     if data is not None:
-        if data in article_info.extra_files:
-            return flask.send_file(get_image_file(data))
-        m = gettext("Supplemental file ({}) for article ({}) not 
found.").format(
-            data, article_name
-        )
+        #if data in article_info.extra_files:
+        #    return flask.send_file(get_image_file(data))
+        #m = gettext("Supplemental file ({}) for article ({}) not 
found.").format(
+        #    data, article_name
+        #)
         err_abort(404, message=m)
     # the order_id is needed for refunds
-    article_contents = open(get_article_file(article_info)).read()
+    article_contents = get_article_contents(article_info)
     return flask.render_template(
         "blog-article-frame.html.j2",
         page_title=gettext("GNU Taler Demo: Article"),
@@ -387,25 +391,25 @@ def article(article_name, lang=None, data=None):
     article_url = flask.request.base_url
 
     if not session_id:
-      # If expect_state = yes then session_id should be set already
-      # this is a way to check that the client supports cookies
-      if maybe_expect_state == "yes":
-        error_page = flask.render_template(
-            "blog-error.html.j2",
-            page_title=gettext("GNU Taler Demo: Error"),
-            message=gettext("Please enable cookies."),
-        )
-        return flask.make_response(error_page, 412)
-      
-      # first time setting session_id
-      # check if browser support cookies with a flag
-      session_id = flask.session["session_id"] = str(uuid.uuid4())
-      return flask.redirect(req_add_cookie_check(), code=302)
-    
+        # If expect_state = yes then session_id should be set already
+        # this is a way to check that the client supports cookies
+        if maybe_expect_state == "yes":
+            error_page = flask.render_template(
+                "blog-error.html.j2",
+                page_title=gettext("GNU Taler Demo: Error"),
+                message=gettext("Please enable cookies."),
+            )
+            return flask.make_response(error_page, 412)
+
+        # first time setting session_id
+        # check if browser support cookies with a flag
+        session_id = flask.session["session_id"] = str(uuid.uuid4())
+        return flask.redirect(req_add_cookie_check(), code=302)
+
     # If session is present then we know that cookies are enabled
     # remove the flag if present
     if maybe_expect_state == "yes":
-      return flask.redirect(req_rm_cookie_check(), code=302)
+        return flask.redirect(req_rm_cookie_check(), code=302)
 
     ############################
     # user has a session and cookie works
@@ -415,66 +419,69 @@ def article(article_name, lang=None, data=None):
 
     # if an order_id is present then render if paid or refunded
     if current_order_id is not None:
-      status, current_order = backend_get_with_status(
-          BACKEND_URL,
-          f"private/orders/{current_order_id}",
-          params=dict(session_id=session_id),
-          auth_token=APIKEY,
-      )
-
-      if status == 200:
-        if current_order.get("order_status") == "paid" and not 
current_order.get("refunded"):
-          return render_article(
-              article_name,
-              lang,
-              data,
-              current_order_id,
-              refundable(current_order)
-          )
-        
-        # Checking repurchase case. That happens when the client
-        # visits this page in the same session where the article
-        # was paid already.
-        ai = current_order.get("already_paid_order_id")
-        au = current_order.get("already_paid_fulfillment_url")
-
-        if ai is not None:
-          print("== Merchant says 'see other': ", ai, au)
-          response = flask.redirect(article_url)
-          response.set_cookie(
-              "order_id",
-              ai,
-              path=urllib.parse.quote(url_for ('index') + 
f"essay/{article_name}")
-          )
-          response.set_cookie(
-              "order_id",
-              ai,
-              path=urllib.parse.quote(url_for ('index') + 
f"{lang}/essay/{article_name}")
-          )
-          return response
-        
-        # If new_if_refunded == "yes" the user already acknowledge the
-        # state of the current order and is asking for a new one.
-        if current_order.get("refunded") and new_if_refunded != "yes":
-          return flask.render_template(
-              "blog-article-refunded.html.j2",
-              page_title=gettext("GNU Taler Demo: Refunded"),
-              article_name=article_name,
-              article_lang=lang,
-              order_id=current_order_id,
-          )
-      
-      elif status != 404: 
-      # not found may be normal, could means that 
-      # merchant forgot about the order becuase
-      # it was a long time without being paid
-        raise BackendException(
-          message=gettext("Backend returned error status"),
-          backend_status=status,
-          backend_json=current_order,
+        status, current_order = backend_get_with_status(
+            BACKEND_URL,
+            f"private/orders/{current_order_id}",
+            params=dict(session_id=session_id),
+            auth_token=APIKEY,
         )
 
-          
+        if status == 200:
+            if current_order.get("order_status") == "paid" and not 
current_order.get(
+                "refunded"
+            ):
+                return render_article(
+                    article_name,
+                    lang,
+                    data,
+                    current_order_id,
+                    refundable(current_order),
+                )
+
+            # Checking repurchase case. That happens when the client
+            # visits this page in the same session where the article
+            # was paid already.
+            ai = current_order.get("already_paid_order_id")
+            au = current_order.get("already_paid_fulfillment_url")
+
+            if ai is not None:
+                print("== Merchant says 'see other': ", ai, au)
+                response = flask.redirect(article_url)
+                response.set_cookie(
+                    "order_id",
+                    ai,
+                    path=urllib.parse.quote(url_for("index") + 
f"essay/{article_name}"),
+                )
+                response.set_cookie(
+                    "order_id",
+                    ai,
+                    path=urllib.parse.quote(
+                        url_for("index") + f"{lang}/essay/{article_name}"
+                    ),
+                )
+                return response
+
+            # If new_if_refunded == "yes" the user already acknowledge the
+            # state of the current order and is asking for a new one.
+            if current_order.get("refunded") and new_if_refunded != "yes":
+                return flask.render_template(
+                    "blog-article-refunded.html.j2",
+                    page_title=gettext("GNU Taler Demo: Refunded"),
+                    article_name=article_name,
+                    article_lang=lang,
+                    order_id=current_order_id,
+                )
+
+        elif status != 404:
+            # not found may be normal, could means that
+            # merchant forgot about the order becuase
+            # it was a long time without being paid
+            raise BackendException(
+                message=gettext("Backend returned error status"),
+                backend_status=status,
+                backend_json=current_order,
+            )
+
     # Current order is not present or unpaid
     # Check if there is a paid but not refunded order in this session
     list_resp = backend_get(
@@ -483,12 +490,12 @@ def article(article_name, lang=None, data=None):
         params=dict(session_id=session_id, fulfillment_url=article_url, 
refunded="no"),
         auth_token=APIKEY,
     )
-    
+
     already_paid_order = None
     for order in list_resp.get("orders"):
-      if order.get("paid"):
-        already_paid_order = order
-        break
+        if order.get("paid"):
+            already_paid_order = order
+            break
 
     if already_paid_order is not None:
         # Found one, now this is the current order.
@@ -498,49 +505,46 @@ def article(article_name, lang=None, data=None):
         response.set_cookie(
             "order_id",
             order_id,
-            path=urllib.parse.quote(url_for ('index') + 
f"essay/{article_name}")
+            path=urllib.parse.quote(url_for("index") + 
f"essay/{article_name}"),
         )
         response.set_cookie(
             "order_id",
             order_id,
-            path=urllib.parse.quote(url_for ('index') + 
f"{lang}/essay/{article_name}")
+            path=urllib.parse.quote(url_for("index") + 
f"{lang}/essay/{article_name}"),
         )
         return response
-  
+
     ############################
     # We couln't find a paid order
     #
     # Note that it could be the case that the user is still paying
     # an order with another device, in other browser on the same
-    # session or claimed in the same brower. 
-    # Still, creating an order is cheap and we can safely redirect 
+    # session or claimed in the same brower.
+    # Still, creating an order is cheap and we can safely redirect
     # to a payment page and relay on repurchase detection to avoid
     # double payments.
     #
     # create a new order and ask for payment
     ############################
-      
+
     order_resp = post_order(article_name, article_url, session_id, lang)
     order_id = order_resp["order_id"]
     token = order_resp["token"]
 
     redirect_url = backend_payment_url(
-      BACKEND_URL,
-      f"orders/{order_id}",
-      session_id,
-      token
+        BACKEND_URL, f"orders/{order_id}", session_id, token
     )
     print("new order URL", redirect_url)
     response = flask.redirect(redirect_url)
     response.set_cookie(
         "order_id",
         order_id,
-        path=urllib.parse.quote(url_for ('index') + f"essay/{article_name}")
+        path=urllib.parse.quote(url_for("index") + f"essay/{article_name}"),
     )
     response.set_cookie(
         "order_id",
         order_id,
-        path=urllib.parse.quote(url_for ('index') + 
f"{lang}/essay/{article_name}")
+        path=urllib.parse.quote(url_for("index") + 
f"{lang}/essay/{article_name}"),
     )
 
     return response
diff --git a/talermerchantdemos/blog/content.py 
b/talermerchantdemos/blog/content.py
index 1b2a466..1f886c4 100644
--- a/talermerchantdemos/blog/content.py
+++ b/talermerchantdemos/blog/content.py
@@ -21,11 +21,12 @@ import logging
 import os
 import re
 from bs4 import BeautifulSoup
-from pkg_resources import resource_stream, resource_filename
 from os import listdir
 from os.path import isfile, join
 from urllib.parse import quote
 
+import importlib.resources
+
 
 LOGGER = logging.getLogger(__name__)
 NOISY_LOGGER = logging.getLogger("chardet.charsetprober")
@@ -39,6 +40,8 @@ Article = namedtuple("Article", "slug title teaser main_file 
extra_files lang")
 #      articles available in that language.
 ARTICLES = {}
 
+articles_per_lang = {}
+
 
 ##
 # Add article to the list of the available articles.
@@ -54,28 +57,17 @@ def add_article(slug, title, teaser, main_file, 
extra_files, lang="en"):
     if not (lang in ARTICLES):
         ARTICLES[lang] = OrderedDict()
     ARTICLES[lang][slug] = Article(slug, title, teaser, main_file, 
extra_files, lang)
+    articles_per_lang.setdefault(lang, 0)
+    articles_per_lang[lang] += 1
 
 
 ##
-# Build the file path of a image.
-#
-# @param image the image filename.
-# @return the path to the image file.
-def get_image_file(image):
-    filex = resource_filename("talermerchantdemos", os.path.join("blog/data/", 
image))
-    return os.path.abspath(filex)
-
-
-##
-# Build the file path of a article.
+# Return contents of an article.
 #
 # @param article the article filename.
-# @return the path to the article HTML file.
-def get_article_file(article):
-    filex = resource_filename(
-        "talermerchantdemos", article.main_file,
-    )
-    return os.path.abspath(filex)
+# @return text contents of the article
+def get_article_contents(article):
+    return article.main_file.read_text()
 
 
 ##
@@ -90,16 +82,14 @@ def get_article_file(article):
 #        HTML itself, so give it here if a explicit title needs to be
 #        specified.
 def add_from_html(resource_name, lang):
-    res = resource_stream("talermerchantdemos", resource_name)
-    soup = BeautifulSoup(res, "html.parser")
-    res.close()
+    soup = BeautifulSoup(resource_name.read_bytes(), "html.parser")
     title_el = soup.find("h2")
     if title_el is None:
         LOGGER.warning("Cannot extract title from '%s'", resource_name)
         return
     title = title_el.get_text().strip()
     slug = title.replace(" ", "_")
-    slug = re.sub(r'[^a-zA-Z0-9_]+', "-", slug)
+    slug = re.sub(r"[^a-zA-Z0-9_]+", "-", slug)
 
     teaser = soup.find("p", attrs={"id": ["teaser"]})
     if teaser is None:
@@ -107,7 +97,9 @@ def add_from_html(resource_name, lang):
         if len(paragraphs) > 0:
             teaser = paragraphs[0].prettify()
             if len(teaser) < 100:
-                LOGGER.warning("Cannot extract adequate teaser from '%s'", 
resource_name)
+                LOGGER.warning(
+                    "Cannot extract adequate teaser from '%s'", resource_name
+                )
                 return
         else:
             LOGGER.warning("Cannot extract teaser from '%s'", resource_name)
@@ -117,28 +109,53 @@ def add_from_html(resource_name, lang):
     re_proc = re.compile("^/[^/][^/]/essay/[^/]+/data/[^/]+$")
     imgs = soup.find_all("img")
     extra_files = []
-    for img in imgs:
-        # We require that any image whose access is regulated is src'd
-        # as "<slug>/data/img.png". We also need to check if the <slug>
-        # component actually matches the article's slug
-        if re_proc.match(img["src"]):
-            if img["src"].split(os.sep)[2] == slug:
-                LOGGER.info(
-                    "extra file for %s is %s" % (slug, 
os.path.basename(img["src"]))
-                )
-                extra_files.append(os.path.basename(img["src"]))
-            else:
-                LOGGER.warning(
-                    "Image src and slug don't match: '%s' != '%s'"
-                    % (img["src"].split(os.sep)[2], slug)
-                )
+    #for img in imgs:
+    #    # We require that any image whose access is regulated is src'd
+    #    # as "<slug>/data/img.png". We also need to check if the <slug>
+    #    # component actually matches the article's slug
+    #    if re_proc.match(img["src"]):
+    #        if img["src"].split(os.sep)[2] == slug:
+    #            LOGGER.info(
+    #                "extra file for %s is %s" % (slug, 
os.path.basename(img["src"]))
+    #            )
+    #            extra_files.append(os.path.basename(img["src"]))
+    #        else:
+    #            LOGGER.warning(
+    #                "Image src and slug don't match: '%s' != '%s'"
+    #                % (img["src"].split(os.sep)[2], slug)
+    #            )
     add_article(slug, title, teaser, resource_name, extra_files, lang)
 
 
-for l in listdir(resource_filename("talermerchantdemos", "blog/articles/")):
-    # Filter by active languages, otherwise this takes quite a while to load...
-    if l in {"en", "ar", "zh", "fr", "hi", "it", "ja", "ko", "pt", "pt_BR", 
"ru", "tr", "de", "sv", "es"}:
-        LOGGER.info("importing %s" % l)
-        for a in listdir(resource_filename("talermerchantdemos", 
"blog/articles/" + l)):
-            if os.path.isfile(resource_filename("talermerchantdemos", 
"blog/articles/" + l + "/" + a)):
-                add_from_html("blog/articles/" + l + "/" + a, l)
+pkgfiles = importlib.resources.files("talermerchantdemos")
+
+supported_langs = {
+    "en",
+    "ar",
+    "zh",
+    "fr",
+    "hi",
+    "it",
+    "ja",
+    "ko",
+    "pt",
+    "pt_BR",
+    "ru",
+    "tr",
+    "de",
+    "sv",
+    "es",
+}
+
+for l in pkgfiles.joinpath("blog/articles/").iterdir():
+    lang = l.name
+    if lang not in supported_langs:
+        continue
+    LOGGER.info("importing %s" % l)
+    for a in l.iterdir():
+        if not a.is_file():
+            continue
+        # Max 50 articles per language
+        if articles_per_lang.get(lang, 0) > 50:
+            break
+        add_from_html(a, lang)
diff --git a/talermerchantdemos/cli.py b/talermerchantdemos/cli.py
index 4afb13c..93891f9 100644
--- a/talermerchantdemos/cli.py
+++ b/talermerchantdemos/cli.py
@@ -44,9 +44,11 @@ arg_load_python = "--if-not-plugin python --plugins python 
--endif".split(" ")
 # The effect it to launch the blog HTTP service.
 #
 # @param args command line options.
-def handle_serve_http(config, which_shop, port=None):
+def handle_serve_http(config_filename, which_shop, port=None):
+    config = TalerConfig.from_file(config_filename)
     confsection = f"frontend-demo-{which_shop}"
     currency = config["taler"]["currency"].value_string(required=True)
+    cfg_arg = "" if config_filename is None else config_filename
     params = [
         "uwsgi",
         "uwsgi",
@@ -57,23 +59,11 @@ def handle_serve_http(config, which_shop, port=None):
         "--log-format",
         UWSGI_LOGFMT,
         "--set-ph",
-        f"currency={currency}",
+        f"config_filename={cfg_arg}",
         "--module",
         f"talermerchantdemos.{which_shop}:app",
     ]
 
-    # Only read backend config if necessary
-    has_backend = which_shop in ("blog", "donations")
-    if has_backend:
-        backend_url = 
config[confsection]["backend"].value_string(required=True)
-        apikey = 
config[confsection]["backend_apikey"].value_string(required=True)
-        extra = [
-            "--set-ph",
-            f"backend_url={backend_url}" "--set-ph",
-            f"apikey={apikey}",
-        ]
-        params.extend(extra)
-
     # Takes precedence.
     if port:
         http_serve = "tcp"
@@ -126,8 +116,7 @@ def demos(config, http_port, which_shop):
     if which_shop not in ["blog", "donations", "landing"]:
         print("Please use a valid shop name: blog, donations, landing.")
         sys.exit(1)
-    config_obj = TalerConfig.from_file(config)
-    handle_serve_http(config_obj, which_shop, http_port)
+    handle_serve_http(config, which_shop, http_port)
 
 
 demos()
diff --git a/talermerchantdemos/donations/donations.py 
b/talermerchantdemos/donations/donations.py
index 1a95f45..125554d 100644
--- a/talermerchantdemos/donations/donations.py
+++ b/talermerchantdemos/donations/donations.py
@@ -54,24 +54,32 @@ app = flask.Flask(__name__, template_folder="../templates", 
static_folder="../st
 app.wsgi_app = ProxyFix(app.wsgi_app, x_host=1, x_prefix=1)
 app.debug = True
 app.secret_key = base64.b64encode(os.urandom(64)).decode("utf-8")
-
-try:
-    BACKEND_BASE_URL = uwsgi.opt["backend_url"].decode("utf-8")
-    CURRENCY = uwsgi.opt["currency"].decode("utf-8")
-    APIKEY = uwsgi.opt["apikey"].decode("utf-8")
-except ConfigurationError as ce:
-    print(ce)
-    exit(1)
+app.config.from_object(__name__)
 
 BABEL_TRANSLATION_DIRECTORIES = "../translations"
-
-app.config.from_object(__name__)
 babel = Babel(app)
 babel.localeselector(get_locale)
 
+config_filename = uwsgi.opt["config_filename"].decode("utf-8")
+if config_filename == "":
+    config_filename = None
+config = TalerConfig.from_file(config_filename)
+
+CURRENCY = config["taler"]["currency"].value_string(required=True)
+
+backend_urls = {}
+backend_apikeys = {}
+
+def add_backend(name):
+    backend_urls[name] = 
config["frontend-demo-donations"][f"backend_url_{name}"].value_string(required=True)
+    backend_apikeys[name] = 
config["frontend-demo-donations"][f"backend_apikey_{name}"].value_string(required=True)
+
+add_backend("tor")
+add_backend("taler")
+add_backend("gnunet")
+
 
 LOGGER.info("Using translations from:" + 
":".join(list(babel.translation_directories)))
-LOGGER.info("backend: " + BACKEND_BASE_URL)
 LOGGER.info("currency: " + CURRENCY)
 translations = [str(translation) for translation in babel.list_translations()]
 if not "en" in translations:
@@ -82,7 +90,12 @@ LOGGER.info(
 
 # Add context processor that will make additional variables
 # and functions available in the template.
-app.context_processor(make_utility_processor("donations", os.environ.get 
("TALER_ENV_URL_MERCHANT_DONATIONS")))
+app.context_processor(
+    make_utility_processor(
+        "donations", os.environ.get("TALER_ENV_URL_MERCHANT_DONATIONS")
+    )
+)
+
 
 ##
 # Return a error response to the client.
@@ -102,8 +115,7 @@ def err_abort(abort_status_code, **params):
 # @return the JSON response from the backend, or a error response
 #         if something unexpected happens.
 def backend_instanced_get(instance, endpoint, params):
-    backend_url = urljoin(BACKEND_BASE_URL, f"instances/{instance}/")
-    return backend_get(backend_url, endpoint, params, auth_token=APIKEY)
+    return backend_get(backend_urls[instance], endpoint, params, 
auth_token=backend_apikeys[instance])
 
 
 ##
@@ -115,8 +127,7 @@ def backend_instanced_get(instance, endpoint, params):
 # @param json the POST's body.
 # @return the backend response (JSON format).
 def backend_instanced_post(instance, endpoint, json):
-    backend_url = urljoin(BACKEND_BASE_URL, f"instances/{instance}/")
-    return backend_post(backend_url, endpoint, json, auth_token=APIKEY)
+    return backend_post(backend_urls[instance], endpoint, json, 
auth_token=backend_apikeys[instance])
 
 
 ##
@@ -142,7 +153,9 @@ def internal_error(e):
     return flask.render_template(
         "donations-error.html.j2",
         page_title=gettext("GNU Taler Demo: Error"),
-        message=str(e))
+        message=str(e),
+    )
+
 
 ##
 # Serve the /favicon.ico requests.
@@ -166,7 +179,7 @@ def favicon():
 def index():
     default = "en"
     target = flask.request.accept_languages.best_match(translations, default)
-    return flask.redirect(url_for ('index') + target + "/", code=302)
+    return flask.redirect(url_for("index") + target + "/", code=302)
 
 
 ##
@@ -186,9 +199,9 @@ def start(lang):
         )
 
     return flask.render_template(
-        "donations-index.html.j2", 
+        "donations-index.html.j2",
         page_title=gettext("GNU Taler Demo: Donations"),
-        merchant_currency=CURRENCY
+        merchant_currency=CURRENCY,
     )
 
 
@@ -221,9 +234,9 @@ def checkout(lang):
 @app.route("/<lang>/provider-not-supported")
 def provider_not_supported(lang):
     return flask.render_template(
-        "donations-provider-not-supported.html.j2",         
+        "donations-provider-not-supported.html.j2",
         page_title=gettext("GNU Taler Demo: Donations"),
-)
+    )
 
 
 ##
@@ -257,7 +270,7 @@ def donate(lang):
         fulfillment_url=fulfillment_url,
         summary="Donation to {}".format(donation_receiver),
         wire_transfer_deadline=dict(t_s=int(time.time() + 10)),
-        minimum_age = 16
+        minimum_age=16,
     )
     order_resp = backend_instanced_post(
         donation_receiver, "private/orders", dict(order=order)
@@ -265,8 +278,8 @@ def donate(lang):
 
     if not order_resp:
         return err_abort(
-            500, # FIXME: status code got lost in the httpcommon module.
-            message=gettext("Backend could not create the order")
+            500,  # FIXME: status code got lost in the httpcommon module.
+            message=gettext("Backend could not create the order"),
         )
 
     order_id = order_resp["order_id"]
@@ -311,5 +324,5 @@ def handler(e):
     return flask.render_template(
         "donations-error.html.j2",
         page_title=gettext("GNU Taler Demo: Error"),
-        message=gettext("Page not found")
+        message=gettext("Page not found"),
     )
diff --git a/talermerchantdemos/httpcommon/__init__.py 
b/talermerchantdemos/httpcommon/__init__.py
index d2238ff..732f06c 100644
--- a/talermerchantdemos/httpcommon/__init__.py
+++ b/talermerchantdemos/httpcommon/__init__.py
@@ -5,13 +5,14 @@ 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 babel  # used for lang sanity check
 import os
 import re
 import logging
 
 LOGGER = logging.getLogger(__name__)
 
+
 class BackendException(Exception):
     """Exception for failed communication with the Taler merchant backend"""
 
@@ -20,6 +21,7 @@ class BackendException(Exception):
         self.backend_status = backend_status
         self.backend_json = backend_json
 
+
 ##
 # POST a request to the backend, and return a error
 # response if any error occurs.
@@ -53,11 +55,11 @@ def backend_post(backend_url, endpoint, json, 
auth_token=None):
             backend_status=resp.status_code,
             backend_json=response_json,
         )
-    print("Backend responds to {}: {}/{}".format(
-        final_url,
-        str(response_json),
-        resp.status_code
-    ))
+    print(
+        "Backend responds to {}: {}/{}".format(
+            final_url, str(response_json), resp.status_code
+        )
+    )
     return response_json
 
 
@@ -78,6 +80,7 @@ def backend_get(backend_url, endpoint, params, 
auth_token=None):
         )
     return json
 
+
 def backend_get_with_status(backend_url, endpoint, params, auth_token=None):
     headers = dict()
     if auth_token is not None:
@@ -97,6 +100,7 @@ def backend_get_with_status(backend_url, endpoint, params, 
auth_token=None):
     print("Backend responds to {}: {}".format(final_url, str(response_json)))
     return resp.status_code, response_json
 
+
 def get_locale():
     parts = request.path.split("/", 2)
     if 2 >= len(parts):
@@ -117,21 +121,22 @@ def get_locale():
         return "en"
     return lang
 
+
 ##
 # Construct the payment URL where customer can pay the order
 #
 # @param backend_url where the backend is located
 # @param order_id id of the order already created
 # @param session_id session in which the order is going to be paid
-# @param token if the order requires a token 
+# @param token if the order requires a token
 # @return the JSON response from the backend, or a error response
 #         if something unexpected happens.
 def backend_payment_url(backend_url, endpoint, session_id, token):
-  final_url = urljoin(backend_url, endpoint)
-  query = urlencode({"token":token, "session_id":session_id})
-  redirect_url = urlparse(final_url)._replace(query=query)
-  return urlunparse(redirect_url)
-    
+    final_url = urljoin(backend_url, endpoint)
+    query = urlencode({"token": token, "session_id": session_id})
+    redirect_url = urlparse(final_url)._replace(query=query)
+    return urlunparse(redirect_url)
+
 
 ##
 # Helper function used inside Jinja2 logic to create a links
@@ -192,7 +197,7 @@ all_languages = {
 # Make the environment available into templates.
 #
 # @return the environment-reading function
-def make_utility_processor(pagename,base_url):
+def make_utility_processor(pagename, base_url):
     def utility_processor():
         def getactive():
             return pagename
@@ -221,7 +226,7 @@ def make_utility_processor(pagename,base_url):
             getactive=getactive,
             getlang=getlang,
             all_languages=all_languages,
-            static=static
+            static=static,
         )
 
     return utility_processor
diff --git a/talermerchantdemos/landing/landing.py 
b/talermerchantdemos/landing/landing.py
index 13c8dc4..b19fd27 100644
--- a/talermerchantdemos/landing/landing.py
+++ b/talermerchantdemos/landing/landing.py
@@ -57,11 +57,15 @@ app.secret_key = 
base64.b64encode(os.urandom(64)).decode("utf-8")
 
 logging.basicConfig()
 LOGGER = logging.getLogger(__name__)
-try:
-    CURRENCY = uwsgi.opt["currency"].decode("utf-8")
-except ConfigurationError as ce:
-    print(ce)
-    exit(1)
+
+config_filename = uwsgi.opt["config_filename"].decode("utf-8")
+if config_filename == "":
+    config_filename = None
+
+config = TalerConfig.from_file(config_filename)
+
+CURRENCY = config["taler"]["currency"].value_string(required=True)
+
 
 BABEL_TRANSLATION_DIRECTORIES = "../translations"
 
@@ -80,7 +84,10 @@ LOGGER.info(
 
 # Add context processor that will make additional variables
 # and functions available in the template.
-app.context_processor(make_utility_processor("landing", os.environ.get 
("TALER_ENV_URL_INTRO")))
+app.context_processor(
+    make_utility_processor("landing", os.environ.get("TALER_ENV_URL_INTRO"))
+)
+
 
 ##
 # Exception handler to capture all the unmanaged errors.
@@ -120,7 +127,8 @@ def favicon():
 def index():
     default = "en"
     target = flask.request.accept_languages.best_match(translations, default)
-    return flask.redirect(url_for ('index') + target + "/", code=302)
+    return flask.redirect(url_for("index") + target + "/", code=302)
+
 
 ##
 # Serve the internationalized main index page.
@@ -166,13 +174,13 @@ def start(lang):
     )
 
 
-@app.errorhandler(404) # How to trigger this?
+@app.errorhandler(404)  # How to trigger this?
 @app.errorhandler(werkzeug.exceptions.NotFound)
 def handler_404(e):
     return flask.render_template(
-        "landing-error.html.j2", 
+        "landing-error.html.j2",
         page_title=gettext("GNU Taler Demo: Error"),
-        message=gettext("Page not found")
+        message=gettext("Page not found"),
     )
 
 
diff --git a/talermerchantdemos/translations/ar/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/ar/LC_MESSAGES/messages.po
index 06eb3ef..f95c665 100644
--- a/talermerchantdemos/translations/ar/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/ar/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2022-12-26 18:33+0000\n"
 "Last-Translator: Stefan Kügel <skuegel@web.de>\n"
 "Language: ar\n"
@@ -18,7 +18,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -37,101 +37,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "خطأ داخلي"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "تعذر استرداد المقالة غير المدفوعة"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "المقال غير قابل للاسترداد بعد الآن"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "لم تقم بالدفع لهذا المقال (محاولة جيدة!)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "المقال غير قابل للاسترداد (بعد الآن)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "خطأ داخلي: ملفات المقال ({}) غير موجودة."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "الملف الإضافي ({}) للمقال ({}) غير موجود."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "الدخول المباشر غير مسموح"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "عادت الخلفية لحالة الخطأ"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "خطأ في الserver الداخلي"
 
@@ -139,58 +132,57 @@ msgstr "خطأ في الserver الداخلي"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "الصفحة غير موجودة"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "المَعلَمة '{}' مطلوبة"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "لم نتمكن من إنشاء اتصال مع الشبكة الخلفية"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 #, fuzzy
 msgid "Could not parse the response from backend"
 msgstr "تعذر تحليل الاستجابة من الخلفية"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "تعذر تحليل الاستجابة من الخلفية"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 #, fuzzy
 msgid "GNU Taler Demo"
@@ -198,13 +190,11 @@ msgstr "العرض التجريبي لنظام الدفع Taler"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "طريقة HTTP غير مسموح بها لهذه الصفحة"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr ""
 
@@ -323,7 +313,6 @@ msgstr "طلب استرجاع"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "وجود خطأ"
 
@@ -332,7 +321,6 @@ msgstr "وجود خطأ"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "رمز الحالة للمبالغ المستردة {code}."
 
@@ -341,7 +329,6 @@ msgstr "رمز الحالة للمبالغ المستردة {code}."
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "استجابة الخلفية:"
 
@@ -352,7 +339,6 @@ msgstr "استجابة الخلفية:"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "إشارة تراكمية:"
 
@@ -443,13 +429,11 @@ msgstr "تبرعات"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "استطلاع الآراء"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 #, fuzzy
 msgid ""
 "You can learn more about GNU Taler on our main <a "
@@ -792,18 +776,15 @@ msgstr ""
 "تظهر في تلك الصفحة."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "الخطوة الخامسة: استطلاع الرأي"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 #, fuzzy
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr "يمكن أن تقدم المواقع الإلكترونية نصائح للزوار لإكمال المهام."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
@@ -812,28 +793,25 @@ msgstr ""
 "href=\"{url}\">استطلاعنا</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "الخطوة السادسة: تواصل معنا"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr "نقدرُ رأيك المتعلق بنظام Taler وهذا العرض التوضيحي."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr "شاركنا رأيك عن طريق <a href=\"{link}\"> التواصل معنا</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 #, fuzzy
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr "توضح هذه الصفحة كيفية إرشاد الزائرين لإكمال المهام الصغيرة."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 #, fuzzy
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
@@ -841,12 +819,10 @@ msgid ""
 msgstr "الاستطلاع هو طريقة لتقديم مكافآت نقدية تذهب مباشرة إلى محفظة المستخدم."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 #, fuzzy
 msgid ""
 "Please participate in our survey about payment systems and receive a "
@@ -854,15 +830,18 @@ msgid ""
 msgstr "يرجى المشاركة في استطلاعنا حول أنظمة الدفع والحصول على معلومات في 
المقابل."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "أي أنظمة الدفع تفضل؟"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "إرسال استطلاع الآراء"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "الخطوة السادسة: تواصل معنا"
+
 #~ msgid "English [en]"
 #~ msgstr ""
 
diff --git a/talermerchantdemos/translations/de/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/de/LC_MESSAGES/messages.po
index 09d581f..003b889 100644
--- a/talermerchantdemos/translations/de/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/de/LC_MESSAGES/messages.po
@@ -5,20 +5,19 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: taler-merchant-demos\n"
+"Project-Id-Version:  taler-merchant-demos\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2024-04-15 05:32+0000\n"
 "Last-Translator: Stefan Kügel <skuegel@web.de>\n"
-"Language-Team: German <https://weblate.taler.net/projects/gnu-taler/";
-"demonstration-pages/de/>\n"
 "Language: de\n"
+"Language-Team: German <https://weblate.taler.net/projects/gnu-taler";
+"/demonstration-pages/de/>\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.4.3\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -37,103 +36,96 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr "GNU Taler Demo: Fehler"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "Interner Fehler"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr "GNU Taler Demo: Buchhandlung"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr ""
 "Den Kaufpreis eines Artikels, der nicht bezahlt wurde, können wir nicht "
 "erstatten"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "Den Kaufpreis für diesen Aufsatz können wir leider nicht mehr 
erstatten"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr "GNU Taler Demo: Rückerstattung bestätigen"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "Für diesen Aufsatz wurde noch kein Kaufpreis entrichtet"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "Dieser Artikel kann nicht (mehr) erstattet werden"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "Interner Fehler: Die Datei für diesen Aufsatz ({}) wurden nicht 
gefunden."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "Die Zusatzdatei ({}) für den Artikel ({}) wurde nicht gefunden."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr "GNU Taler Demo: Artikel"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr "Bitte erlauben Sie das Speichern von Cookies."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "Direktzugriff verboten"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "Das Backend lieferte einen Fehlerstatus zurück"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr "GNU Taler Demo: Zurückerstattet"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "Interner Server-Fehler"
 
@@ -141,70 +133,67 @@ msgstr "Interner Server-Fehler"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "Seite nicht gefunden"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "Parameter '{}' erforderlich"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr "GNU Taler Demo: Die ‚Spenden‘-Funktion"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr "GNU Taler Demo: Spende durchführen"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr "Das Backend konnte die Bestellung nicht erzeugen"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "Es war nicht möglich, eine Verbindung zum Backend aufzubauen"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 msgid "Could not parse the response from backend"
 msgstr "Es war nicht möglich, die Rückmeldung des Backend zu parsen"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "Es war nicht möglich, die Rückmeldung des Backend zu parsen"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr "GNU Taler Demo"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "Die HTTP-Methode ist auf dieser Webseite nicht erlaubt"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr "GNU Taler Demo: Tipping/Umfrage"
 
@@ -337,7 +326,6 @@ msgstr "Erstattungsanfrage"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "Ein Fehler ist aufgetreten"
 
@@ -346,7 +334,6 @@ msgstr "Ein Fehler ist aufgetreten"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "Das Backend meldet folgenden Statuscode zurück {code}."
 
@@ -355,7 +342,6 @@ msgstr "Das Backend meldet folgenden Statuscode zurück 
{code}."
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "Backend-Rückmeldung:"
 
@@ -366,7 +352,6 @@ msgstr "Backend-Rückmeldung:"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "Stacktrace:"
 
@@ -413,8 +398,7 @@ msgstr "Die Aufsätze"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/blog-index.html.j2:25
 #: talermerchantdemos/templates/blog-index.html.j2:25
 msgid "Click on an individual chapter to purchase it with GNU Taler."
-msgstr ""
-"Mit einem Klick auf einzelne Aufsätze bezahlt man diese durch GNU Taler."
+msgstr "Mit einem Klick auf einzelne Aufsätze bezahlt man diese durch GNU 
Taler."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/blog-index.html.j2:26
 #: talermerchantdemos/templates/blog-index.html.j2:26
@@ -461,13 +445,11 @@ msgstr "Spenden"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "Tipping/Umfrage"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -841,9 +823,9 @@ msgid ""
 " the merchants on the <a href=\"{bank}\">public accounts page</a> of the "
 "bank."
 msgstr ""
-"In den <a href=\"{bank}\">öffentlich sichtbaren Konten</a> der Bank sind die "
-"Überweisungen vom Verrechnungskonto des Exchange an die Bankkonten der "
-"Zahlungsempfänger aufgelistet."
+"In den <a href=\"{bank}\">öffentlich sichtbaren Konten</a> der Bank sind "
+"die Überweisungen vom Verrechnungskonto des Exchange an die Bankkonten "
+"der Zahlungsempfänger aufgelistet."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:60
 #: talermerchantdemos/templates/landing-index.html.j2:60
@@ -855,21 +837,18 @@ msgstr ""
 "konfiguriert wurden."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "Schritt 5: Die Tipping-Funktion kennenlernen"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr ""
 "Webseiten können ihre Besucher für Arbeiten belohnen, indem sie ihnen "
-"digitales Bargeld in ihre Wallets buchen. Wir veranschaulichen die Reward-"
-"Funktion am Beispiel einer Umfrage, bei der die Teilnehmer für ihre Mühe "
-"eine kleine Belohnung erhalten."
+"digitales Bargeld in ihre Wallets buchen. Wir veranschaulichen die "
+"Reward-Funktion am Beispiel einer Umfrage, bei der die Teilnehmer für "
+"ihre Mühe eine kleine Belohnung erhalten."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
@@ -880,12 +859,11 @@ msgstr ""
 "Kenntnis der Kontonummern der Empfänger überweisen kann."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "Schritt 6: Mit uns in Kontakt treten"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr ""
 "Wir freuen uns auf Ihre Fragen zu GNU Taler, das Interesse an den "
@@ -893,21 +871,19 @@ msgstr ""
 "Seiten."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr ""
 "Sie können uns gern Ihre Ansichten zu GNU Taler <a "
 "href=\"{link}\">mitteilen</a>. Vielen Dank für Ihre Nachricht an uns."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr ""
-"Auf dieser Seite zeigen wir, wie Webseiten ihre Besucher für das Erfüllen "
-"kleiner Aufgaben belohnen können."
+"Auf dieser Seite zeigen wir, wie Webseiten ihre Besucher für das Erfüllen"
+" kleiner Aufgaben belohnen können."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
 "user's wallet."
@@ -916,29 +892,31 @@ msgstr ""
 "Nutzer."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr "Unerwartetes Ergebnis"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 msgid ""
 "Please participate in our survey about payment systems and receive a "
 "reward in return."
 msgstr ""
 "Bitte nehmen Sie zur Demonstration der Reward-Funktion von GNU Taler an "
-"unserer Umfrage teil – Sie erhalten dafür digitales Bargeld als Belohnung."
+"unserer Umfrage teil – Sie erhalten dafür digitales Bargeld als "
+"Belohnung."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "Welches Bezahlsystem bevorzugen Sie?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "Antwort abschicken"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "Schritt 6: Mit uns in Kontakt treten"
+
 #~ msgid "You did not like this article?"
 #~ msgstr ""
 
@@ -1210,3 +1188,4 @@ msgstr "Antwort abschicken"
 #~ "Alles Wissenswerte zu GNU Taler gibt "
 #~ "es auf unseren <a "
 #~ "href=\"{site}\">Webseiten</a>."
+
diff --git a/talermerchantdemos/translations/en/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/en/LC_MESSAGES/messages.po
index fbc4583..b946055 100644
--- a/talermerchantdemos/translations/en/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/en/LC_MESSAGES/messages.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language: en\n"
@@ -12,7 +12,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -31,101 +31,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr ""
 
@@ -133,70 +126,67 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 msgid "Could not parse the response from backend"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr ""
 
@@ -308,7 +298,6 @@ msgstr ""
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr ""
 
@@ -317,7 +306,6 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr ""
 
@@ -326,7 +314,6 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr ""
 
@@ -337,7 +324,6 @@ msgstr ""
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr ""
 
@@ -417,13 +403,11 @@ msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -724,71 +708,65 @@ msgid ""
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
 "user's wallet."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 msgid ""
 "Please participate in our survey about payment systems and receive a "
 "reward in return."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr ""
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+msgid "Step 5: Reach out to us"
+msgstr ""
+
 #~ msgid "GNU Taler"
 #~ msgstr ""
 
diff --git a/talermerchantdemos/translations/es/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/es/LC_MESSAGES/messages.po
index 3bade62..ab9f16e 100644
--- a/talermerchantdemos/translations/es/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/es/LC_MESSAGES/messages.po
@@ -7,18 +7,17 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2024-07-03 18:32+0000\n"
 "Last-Translator: Luis Avalos <avalos.diaz.0577@gmail.com>\n"
-"Language-Team: Spanish <https://weblate.taler.net/projects/gnu-taler/";
-"demonstration-pages/es/>\n"
 "Language: es\n"
+"Language-Team: Spanish <https://weblate.taler.net/projects/gnu-taler";
+"/demonstration-pages/es/>\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.5.5\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -37,101 +36,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr "GNU Taler Demo: Error"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "Error interno"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr "Demostración de GNU Taler: Tienda de Pruebas"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "No se puede realizar el reembolso de un artículo no pagado"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "El artículo ya no es reembolsable"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr "GNU Taler Demo: Confirmar reembolso"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "No has pagado por este artículo (¡buen intento!)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "Artículo no reembolsable"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "Error interno: Archivos para el artículo ({}) no encontrados."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "Archivo complementario ({}) para el artículo ({}) no encontrado."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr "GNU Taler Demo: Artículo"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr "Porfavor, habilita las cookies."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "Acceso directo prohibido"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "El backend ha retornado un estado de error"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr "GNU Taler Demo: Reembolsado"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "Error interno de servidor"
 
@@ -139,71 +131,68 @@ msgstr "Error interno de servidor"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "Página no encontrada"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "parámetro '{}' requerido"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr "GNU Taler Demo: Donaciones"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 #, fuzzy
 msgid "GNU Taler Demo: Donations checkout"
 msgstr "GNU Taler Demo: Pago de donaciones"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr "El backend no ha podido crear el pedido"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "No se puede establecer la conexión con el backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 msgid "Could not parse the response from backend"
 msgstr "No se puede analizar la respuesta del backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "No se puede analizar la respuesta del backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr "Demostración GNU Taler"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "El método HTTP no está permitido para esta página"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr "GNU Taler Demo: Encuesta"
 
@@ -325,7 +314,6 @@ msgstr "Solicitud de reembolso"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "Error encontrado"
 
@@ -334,7 +322,6 @@ msgstr "Error encontrado"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "El backend ha devuelto un código de estado {code}."
 
@@ -343,7 +330,6 @@ msgstr "El backend ha devuelto un código de estado {code}."
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "Respuesta backend:"
 
@@ -354,7 +340,6 @@ msgstr "Respuesta backend:"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "Seguimiento de Pila:"
 
@@ -446,13 +431,11 @@ msgstr "Donaciones"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "Encuesta"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -808,8 +791,8 @@ msgid ""
 "bank."
 msgstr ""
 "Puedes ver las transferencias bancarias desde la cuenta de depósito del "
-"proveedor hacia el comerciante en la <a href=\"{bank}\">página de cuentas "
-"públicas</a> del banco."
+"proveedor hacia el comerciante en la <a href=\"{bank}\">página de cuentas"
+" públicas</a> del banco."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:60
 #: talermerchantdemos/templates/landing-index.html.j2:60
@@ -821,18 +804,15 @@ msgstr ""
 "visibles son mostradas en esa página."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "Paso 5: Encuesta"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 #, fuzzy
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr "Las sitios Web pueden dar consejos a los visitantes para completar 
tareas."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
@@ -841,24 +821,22 @@ msgstr ""
 "href=\"{url}\">encuesta</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "Paso 6: Ponte en contacto con nosotros"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr "Apreciamos tu opinión sobre Taler y esta demostración."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr ""
 "Déjamos saber que piensas poniéndote en <a href=\"{link}\">contacto con "
 "nosotros</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 #, fuzzy
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr ""
@@ -866,7 +844,6 @@ msgstr ""
 "haber completado pequeñas tareas."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 #, fuzzy
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
@@ -876,12 +853,10 @@ msgstr ""
 " directamente al monedero de un usuario."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr "Resultado no esperado"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 #, fuzzy
 msgid ""
 "Please participate in our survey about payment systems and receive a "
@@ -891,15 +866,18 @@ msgstr ""
 "recibe un consejo a cambio."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "¿Que sistema de pago prefieres?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "Enviar Encuesta"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "Paso 6: Ponte en contacto con nosotros"
+
 #~ msgid ""
 #~ "After installation, you may be asked "
 #~ "to grant the brower-based Taler "
@@ -958,3 +936,4 @@ msgstr "Enviar Encuesta"
 #~ "Puedes entender más sobre GNU Taler "
 #~ "en nuestra <a href=\"{site}\">página "
 #~ "principal</a>."
+
diff --git a/talermerchantdemos/translations/fr/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/fr/LC_MESSAGES/messages.po
index ca6ef3b..e795c42 100644
--- a/talermerchantdemos/translations/fr/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/fr/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2023-02-11 11:03+0000\n"
 "Last-Translator: Stefan Kügel <skuegel@web.de>\n"
 "Language: fr\n"
@@ -17,7 +17,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -36,101 +36,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "Erreur interne"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "Impossible de rembourser l'article non payé"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "L'article n'est plus remboursable"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "Vous n'avez pas payé pour cet article (bien essayé !)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "Article non remboursable (plus)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "Erreur interne : Fichiers pour l'article ({}) non trouvés."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "Fichier supplémentaire ({}) pour l'article ({}) non trouvé."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "Accès direct interdit"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "Le backend a renvoyé un statut d'erreur"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "Erreur interne du serveur"
 
@@ -138,71 +131,68 @@ msgstr "Erreur interne du serveur"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "Page non trouvée"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "paramètre '{}' obligatoire"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr "Le backend n'a pas pu créer la commande"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "Impossible d'établir une connexion avec le backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 #, fuzzy
 msgid "Could not parse the response from backend"
 msgstr "Impossible d'analyser la réponse du backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "Impossible d'analyser la réponse du backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr "Demo de GNU Taler"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "Méthode HTTP non autorisée pour cette page"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr ""
 
@@ -327,7 +317,6 @@ msgstr "Demandez un remboursement"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "Erreur constatée"
 
@@ -336,7 +325,6 @@ msgstr "Erreur constatée"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "Le backend a renvoyé le code du statut {code}."
 
@@ -345,7 +333,6 @@ msgstr "Le backend a renvoyé le code du statut {code}."
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "Réponse du backend :"
 
@@ -356,7 +343,6 @@ msgstr "Réponse du backend :"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "Trace de la pile :"
 
@@ -448,13 +434,11 @@ msgstr "Dons"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "Sondage"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -832,12 +816,10 @@ msgstr ""
 "sont affichés sur cette page."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "Étape 5 : Enquête"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 #, fuzzy
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr ""
@@ -845,7 +827,6 @@ msgstr ""
 "des tâches."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
@@ -854,24 +835,22 @@ msgstr ""
 "href=\"{url}\">enquête</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "Étape 6 : contactez-nous"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr "Nous apprécions les commentaires sur Taler et ce démonstrateur."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr ""
 "Faites-nous savoir ce que vous pensez en <a href=\"{link}\">nous "
 "contactant</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 #, fuzzy
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr ""
@@ -879,7 +858,6 @@ msgstr ""
 "accomplissent de petites tâches."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 #, fuzzy
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
@@ -889,12 +867,10 @@ msgstr ""
 "directement dans le portefeuille de l'utilisateur."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr "Résultat inattendu"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 #, fuzzy
 msgid ""
 "Please participate in our survey about payment systems and receive a "
@@ -904,15 +880,18 @@ msgstr ""
 "pourboire en retour."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "Quel système de paiement préférez-vous ?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "Soumettre l'enquête"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "Étape 6 : contactez-nous"
+
 #~ msgid ""
 #~ "After installation, you may be asked "
 #~ "to grant the brower-based Taler "
diff --git a/talermerchantdemos/translations/hi/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/hi/LC_MESSAGES/messages.po
index 6190d2e..4129a07 100644
--- a/talermerchantdemos/translations/hi/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/hi/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language: hi\n"
@@ -16,7 +16,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -35,101 +35,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr ""
 
@@ -137,70 +130,67 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 msgid "Could not parse the response from backend"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr ""
 
@@ -312,7 +302,6 @@ msgstr ""
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr ""
 
@@ -321,7 +310,6 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr ""
 
@@ -330,7 +318,6 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr ""
 
@@ -341,7 +328,6 @@ msgstr ""
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr ""
 
@@ -421,13 +407,11 @@ msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -728,71 +712,65 @@ msgid ""
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
 "user's wallet."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 msgid ""
 "Please participate in our survey about payment systems and receive a "
 "reward in return."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr ""
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+msgid "Step 5: Reach out to us"
+msgstr ""
+
 #~ msgid "English [en]"
 #~ msgstr ""
 
diff --git a/talermerchantdemos/translations/it/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/it/LC_MESSAGES/messages.po
index 83f2655..01bd851 100644
--- a/talermerchantdemos/translations/it/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/it/LC_MESSAGES/messages.po
@@ -7,18 +7,17 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2024-03-01 16:37+0000\n"
 "Last-Translator: Wrath <wrath@ed-e.eu.org>\n"
-"Language-Team: Italian <https://weblate.taler.net/projects/gnu-taler/";
-"demonstration-pages/it/>\n"
 "Language: it\n"
+"Language-Team: Italian <https://weblate.taler.net/projects/gnu-taler";
+"/demonstration-pages/it/>\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.2.1\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -37,101 +36,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr "GNU Taler Demo: Errore"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "Errore interno"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr "GNU Taler Demo: Negozio di Saggi"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "Impossibile rimborsare un articolo non pagato"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "L'articolo non è più rimborsabile"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr "GNU Taler Demo: Conferma rimborso"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "Non hai pagato questo articolo (bel tentativo!)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "Articolo non (più) rimborsabile"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "Errore interno: File per l'articolo ({}) non trovati."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "File supplementare ({}) per l'articolo ({}) non trovato."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr "GNU Taler Demo: Articolo"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr "Per favore, abilita i cookie."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "Accesso diretto vietato"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "Il backend ha segnalato uno stato di errore"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr "GNU Taler Demo: Rimborsato"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "Errore del server"
 
@@ -139,72 +131,69 @@ msgstr "Errore del server"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "Pagina non trovata"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "parametro '{}' richiesto"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr "GNU Taler Demo: Donazioni"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 #, fuzzy
 msgid "GNU Taler Demo: Donations checkout"
 msgstr "GNU Taler Demo: Procedi alla donazione"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr "Il backend non ha potuto creare l'ordine"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "Impossibile stabilire la connessione al backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 #, fuzzy
 msgid "Could not parse the response from backend"
 msgstr "Impossibile analizzare la risposta del backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "Impossibile analizzare la risposta del backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr "GNU Taler Demo"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "Il metodo HTTP non è permesso in questa pagina"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr "GNU Taler Demo: Sondaggio"
 
@@ -333,7 +322,6 @@ msgstr "Richiesta di rimborso"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "Errore riscontrato"
 
@@ -342,7 +330,6 @@ msgstr "Errore riscontrato"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "Il backend ha restituito il codice di stato {code}."
 
@@ -351,7 +338,6 @@ msgstr "Il backend ha restituito il codice di stato {code}."
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "Risposta del backend:"
 
@@ -362,7 +348,6 @@ msgstr "Risposta del backend:"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "Traccia dello stack:"
 
@@ -454,13 +439,11 @@ msgstr "Donazioni"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "Sondaggio"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -822,18 +805,15 @@ msgstr ""
 "visibili sono mostrati in questa pagina."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "Passo 5: Questionario"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 #, fuzzy
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr "I siti Web possono premiare in denaro gli utenti che risolvano un 
compito."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
@@ -842,22 +822,20 @@ msgstr ""
 "href=\"{url}\">questionario</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "Passo 6: Mettiti in contatto con noi"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr "Apprezziamo la tua opinione su Taler e questa dimostrazione."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr "Facci sapere cosa pensi <a href=\"{link}\">contattandoci</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 #, fuzzy
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr ""
@@ -865,7 +843,6 @@ msgstr ""
 "completato dei piccoli compiti."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 #, fuzzy
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
@@ -875,12 +852,10 @@ msgstr ""
 "direttamente nel portafoglio dell'utente."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr "Risultato inaspettato"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 #, fuzzy
 msgid ""
 "Please participate in our survey about payment systems and receive a "
@@ -890,15 +865,18 @@ msgstr ""
 "ricevi una mancia in cambio."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "Che sistema di pagamento preferisci?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "Invia sondaggio"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "Passo 6: Mettiti in contatto con noi"
+
 #~ msgid "English [en]"
 #~ msgstr "Inglese [en]"
 
@@ -942,3 +920,4 @@ msgstr "Invia sondaggio"
 #~ msgstr ""
 #~ "Puoi saperne di più su GNU Taler"
 #~ " sul nostro <a href=\"{site}\">sito</a>."
+
diff --git a/talermerchantdemos/translations/ja/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/ja/LC_MESSAGES/messages.po
index 7eacf87..cc6642a 100644
--- a/talermerchantdemos/translations/ja/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/ja/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2022-12-26 18:33+0000\n"
 "Last-Translator: Stefan Kügel <skuegel@web.de>\n"
 "Language: ja\n"
@@ -17,7 +17,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -36,101 +36,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "内部エラー"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "未払いの記事の返金はできません"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "記事はもう払い戻しできません"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "この記事のためにお金を払っていない (頑張った)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "(もはや)払い戻し不可な商品"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "内部エラー: 記事 ({}) のファイルが見つかりません。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "記事 ({}) の補足ファイル ({}) が見つかりません。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "直接アクセスは禁止されています"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "Backend は、エラー・ステータスを返してきました"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "サーバー 内部エラー"
 
@@ -138,71 +131,68 @@ msgstr "サーバー 内部エラー"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "ページが見つかりません"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "パラメータ「{}」が必要です"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr "backendは注文を作成できませんでした"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "backendへのコネクションを確立することができませんでした"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 #, fuzzy
 msgid "Could not parse the response from backend"
 msgstr "backendからの応答を解析することができませんでした"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "backendからの応答を解析することができませんでした"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr "GNU Taler デモ"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "HTTPメソッドは、このページでは許可されていません"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr ""
 
@@ -317,7 +307,6 @@ msgstr "払い戻しをリクエストする"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "エラーが発生しました"
 
@@ -326,7 +315,6 @@ msgstr "エラーが発生しました"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "バックエンドがステータスコード{code}を返しました。"
 
@@ -335,7 +323,6 @@ msgstr "バックエンドがステータスコード{code}を返しました。
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "バックエンドの応答:"
 
@@ -346,7 +333,6 @@ msgstr "バックエンドの応答:"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "スタックトレース:"
 
@@ -429,13 +415,11 @@ msgstr "寄付"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "アンケート"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -743,46 +727,40 @@ msgid ""
 msgstr "公に見ることができると設定された口座のみがそのページに示されることに注意してください。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "ステップ5:アンケート"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 #, fuzzy
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr "ウェブサイトは、訪問者に対し、タスクを完了するためのヒントを与えることができます。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
 msgstr "<a href=\"{url}\">アンケート</a>に記入することで、いくらかの {currency} コインを得ることができます。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "ステップ6:私たちに、手を差し伸べてください"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr "Talerとこのデモについてのフィードバックを歓迎します。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr "<a href=\"{link}\">私たちにコンタクトする</a>ことにより、あなたの感想を聞かせてください。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 #, fuzzy
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr "このページでは、小さいタスクの完了に対して訪問者にチップを与える方法を紹介します。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 #, fuzzy
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
@@ -790,12 +768,10 @@ msgid ""
 msgstr "チップは、ユーザーのウォレットに直接入金される現金により報酬を与えるひとつの方法です。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 #, fuzzy
 msgid ""
 "Please participate in our survey about payment systems and receive a "
@@ -803,15 +779,18 @@ msgid ""
 msgstr "支払システムについてのアンケートに参加し、その代わりにチップをお受け取りください。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "どの支払システムがよいですか?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "アンケートを提出する"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "ステップ6:私たちに、手を差し伸べてください"
+
 #~ msgid "English [en]"
 #~ msgstr "英語 [en]"
 
diff --git a/talermerchantdemos/translations/ko/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/ko/LC_MESSAGES/messages.po
index 174eb95..a73956c 100644
--- a/talermerchantdemos/translations/ko/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/ko/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2022-12-26 18:33+0000\n"
 "Last-Translator: Stefan Kügel <skuegel@web.de>\n"
 "Language: ko\n"
@@ -17,7 +17,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -36,101 +36,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "내부 오류"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "미결제 기사는 환불할 수 없습니다"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "이 기사는 더이상 환불할 수 없습니다"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "이 기사를 구매하지 않았습니다(다시 시도하세요!)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "환불 불가 상품(기간 만료)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "내부 오류: 기사 ({}) 관련 파일들을 찾을 수 없습니다."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "기사 관련 ({}) 추가 파일을 ({}) 찾을 수 없습니다."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "직접 접속 불가능"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "백엔드에 대한 오류 수신"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "내부 서버 오류"
 
@@ -138,71 +131,68 @@ msgstr "내부 서버 오류"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "이 페이지를 찾을 수 없습니다"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "파라메터 '{}' 필요"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "백엔드와 연결을 하지 못하고 있습니다"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 #, fuzzy
 msgid "Could not parse the response from backend"
 msgstr "백엔드의 응답을 분석할 수 없습니다"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "백엔드의 응답을 분석할 수 없습니다"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr "GNU Taler 데모"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "이 페이지에서는 HTTP가 유효하지 않습니다"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr ""
 
@@ -317,7 +307,6 @@ msgstr "환불 요청"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "오류가 발생했습니다"
 
@@ -326,7 +315,6 @@ msgstr "오류가 발생했습니다"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "백엔드에서 상태 코드 {code}를 반환했습니다."
 
@@ -335,7 +323,6 @@ msgstr "백엔드에서 상태 코드 {code}를 반환했습니다."
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "백엔드 응답:"
 
@@ -346,7 +333,6 @@ msgstr "백엔드 응답:"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "스택 추적:"
 
@@ -431,13 +417,11 @@ msgstr "기부"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "설문조사"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -754,46 +738,40 @@ msgid ""
 msgstr "공개적으로 볼 수 있도록 설정된 계정만 이 페이지에서 확인 가능합니다."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "5단계: 설문조사하기"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 #, fuzzy
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr "웹사이트에서는 특정 단계를 마무리한 방문자들이 한해서 팁을 제공하고 있습니다."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
 msgstr "사용자분들은 <a href=\"{url}\">설문조사</a>를 완료하시면 소정의 {currency}를 지급받으실 수 있습니다."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "6단계: 관리자에게 연락하는 방법"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr "저희 Taler에서는 자사와 웹사이트 관리에 대한 피드백을 적극 수용하고 있습니다."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr "저희에게 <a href=\"{link}\">관리자에게 연락하기</a>를 통해 여러분의 의견을 들려주세요."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 #, fuzzy
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr "해당 페이지에서는 방문자가 작은 단계를 마무리할 때마다 어떤 식으로 팀을 받는지 설명하고 있습니다."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 #, fuzzy
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
@@ -801,12 +779,10 @@ msgid ""
 msgstr "여기서 팁을 준다는 의미는 사용자분들은 walllet에 현금 보상이 곧바로 지급되는 과정을 말합니다."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 #, fuzzy
 msgid ""
 "Please participate in our survey about payment systems and receive a "
@@ -814,15 +790,18 @@ msgid ""
 msgstr "저희 결제 시스템에 대한 설문조사에 참여하시고 팁을 받아가세요."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "어떤 결제 시스템을 선호하시나요?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "설문조사 제출하기"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "6단계: 관리자에게 연락하는 방법"
+
 #~ msgid "English [en]"
 #~ msgstr "영어[en]"
 
diff --git a/talermerchantdemos/translations/messages.pot 
b/talermerchantdemos/translations/messages.pot
index 601bb47..5e387ba 100644
--- a/talermerchantdemos/translations/messages.pot
+++ b/talermerchantdemos/translations/messages.pot
@@ -1,21 +1,21 @@
 # Translations template for PROJECT.
-# Copyright (C) 2023 ORGANIZATION
+# Copyright (C) 2024 ORGANIZATION
 # This file is distributed under the same license as the PROJECT project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2023.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.
 #
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -34,101 +34,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr ""
 
@@ -136,70 +129,67 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 msgid "Could not parse the response from backend"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr ""
 
@@ -311,7 +301,6 @@ msgstr ""
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr ""
 
@@ -320,7 +309,6 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr ""
 
@@ -329,7 +317,6 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr ""
 
@@ -340,7 +327,6 @@ msgstr ""
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr ""
 
@@ -420,13 +406,11 @@ msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -727,68 +711,62 @@ msgid ""
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
 "user's wallet."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 msgid ""
 "Please participate in our survey about payment systems and receive a "
 "reward in return."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr ""
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+msgid "Step 5: Reach out to us"
+msgstr ""
+
diff --git a/talermerchantdemos/translations/pt/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/pt/LC_MESSAGES/messages.po
index 4e0ee75..c830e3e 100644
--- a/talermerchantdemos/translations/pt/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/pt/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2022-12-26 18:33+0000\n"
 "Last-Translator: Stefan Kügel <skuegel@web.de>\n"
 "Language: pt\n"
@@ -17,7 +17,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -36,101 +36,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "Erro interno"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "Não é possível reembolsar artigo por pagar"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "Já não é possível reembolsar artigo"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "Não pagou este artigo (boa tentativa!)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "Artigo (já) não é reembolsável"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "Erro interno: Não foram encontrados os ficheiros para o artigo ({})."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "Não foi encontrado o ficheiro suplementar ({}) do artigo ({})."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "Acesso direto proibido"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "Backend apresentou um erro"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "Erro interno do servidor"
 
@@ -138,58 +131,57 @@ msgstr "Erro interno do servidor"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "Página não encontrada"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "necessário parâmetro '{}'"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "Não foi possível estabelecer uma ligação ao backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 #, fuzzy
 msgid "Could not parse the response from backend"
 msgstr "Não foi possível analisar a resposta do backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "Não foi possível analisar a resposta do backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 #, fuzzy
 msgid "GNU Taler Demo"
@@ -197,13 +189,11 @@ msgstr "Demonstração do Taler"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "Método HTTP não permitido para esta página"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr ""
 
@@ -327,7 +317,6 @@ msgstr "Pedir reembolso"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "Ocorreu um erro"
 
@@ -336,7 +325,6 @@ msgstr "Ocorreu um erro"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr ""
 
@@ -345,7 +333,6 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr ""
 
@@ -356,7 +343,6 @@ msgstr ""
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr ""
 
@@ -449,13 +435,11 @@ msgstr "Doações"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "Inquérito"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -818,18 +802,15 @@ msgstr ""
 "são mostradas nessa página."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "Passo 5: Inquérito"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 #, fuzzy
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr "Websites podem dar gorjetas aos visitantes que completarem tarefas."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
@@ -838,22 +819,20 @@ msgstr ""
 "href=\"{url}\">inquérito</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "Passo 6: Contacte-nos"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr "Valorizamos feedback acerca do Talor e desta demonstração."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr "<a href=\"{link}\">Contacte-nos</a> e diga-nos aquilo que pensa."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 #, fuzzy
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr ""
@@ -861,7 +840,6 @@ msgstr ""
 "pequenas tarefas."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 #, fuzzy
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
@@ -871,12 +849,10 @@ msgstr ""
 "diretamente para a carteira de um usuário."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 #, fuzzy
 msgid ""
 "Please participate in our survey about payment systems and receive a "
@@ -886,15 +862,18 @@ msgstr ""
 "troca, receba uma gorjeta."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "Que sistema de pagamento prefere?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "Submeter Inquérito"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "Passo 6: Contacte-nos"
+
 #~ msgid "English [en]"
 #~ msgstr "Inglês [en]"
 
diff --git a/talermerchantdemos/translations/ru/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/ru/LC_MESSAGES/messages.po
index 401e0cc..8304cd9 100644
--- a/talermerchantdemos/translations/ru/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/ru/LC_MESSAGES/messages.po
@@ -7,19 +7,18 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2024-07-27 11:07+0000\n"
 "Last-Translator: Bohdan Potuzhnyi <bohdan.potuzhnyi@students.bfh.ch>\n"
-"Language-Team: Russian <https://weblate.taler.net/projects/gnu-taler/";
-"demonstration-pages/ru/>\n"
 "Language: ru\n"
+"Language-Team: Russian <https://weblate.taler.net/projects/gnu-taler";
+"/demonstration-pages/ru/>\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
-"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 5.5.5\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -38,101 +37,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr "Демо GNU Taler: Ошибка"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "Внутренняя ошибка"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr "Демо GNU Taler: Магазин эссе"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "Возврат средств за неоплаченный товар невозможен"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "Товар более не подлежит возврату"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr "Демо GNU Taler: Подтвердите возврат"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "Вы не оплатили этот товар (Неплохая попытка!)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "Товар более не подлежит возврату"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "Внутренняя ошибка. Файлы для товара ({}) не найдены."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "Вспомогательный файл ({}) для товара ({}) не найден."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr "Демо GNU Taler: Статья"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr "Пожалуйста включите куки."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "Прямой доступ запрещён"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "Бэкэнд вернул ошибку кода"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr "Демо GNU Taler: Средства возвращены"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "Внутренняя ошибка сервера"
 
@@ -140,70 +132,67 @@ msgstr "Внутренняя ошибка сервера"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "Страница не найдена"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "обязательный '{}'параметр"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr "Демо GNU Taler: Пожертвования"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr "Демо GNU Taler: Оформление пожертвований"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr "Бэкэнд не смог создать заказ"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "Не удалось подключиться к бэкэнду"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 msgid "Could not parse the response from backend"
 msgstr "Не удалось разобрать ответ от бэкэнда"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "Не удалось проанализировать ответ бэкэнда"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr "Демонстрация GNU Taler"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "HTTP-метод не разрешён для этой страницы"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr "Демо GNU Taler: Опрос"
 
@@ -238,8 +227,7 @@ msgstr "Возвращено на счёт"
 msgid ""
 "Your payment (order ID <tt>{order}<tt>) for the article \"{article}\" has"
 " been refunded."
-msgstr ""
-"Ваш платёж (заказ №<tt>{order}<tt>) за статью \"{article}\" был возвращён."
+msgstr "Ваш платёж (заказ №<tt>{order}<tt>) за статью \"{article}\" был 
возвращён."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/blog-article-refunded.html.j2:14
 #: talermerchantdemos/templates/blog-article-refunded.html.j2:14
@@ -327,7 +315,6 @@ msgstr "Запросить возврат"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "Обнаружена ошибка"
 
@@ -336,7 +323,6 @@ msgstr "Обнаружена ошибка"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "Бэкэнд вернул код состояния {code}."
 
@@ -345,7 +331,6 @@ msgstr "Бэкэнд вернул код состояния {code}."
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "Бэкэнд ответ:"
 
@@ -356,7 +341,6 @@ msgstr "Бэкэнд ответ:"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "Стек-трейс:"
 
@@ -451,13 +435,11 @@ msgstr "Поддержать проект"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "Опрос"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -821,17 +803,14 @@ msgstr ""
 "настройкой на право публичного просмотра."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "Шаг 5. Опрос"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr "Сайты могут давать вознаграждение за выполнение задач."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
@@ -840,26 +819,24 @@ msgstr ""
 "href=\"{url}\">опросник</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "Шаг 6. Обратная связь"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr ""
 "Мы благодарны за любые комментарии относительно системы Taler и этого "
 "демонстрационного сайта."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr ""
 "Не стесняйтесь <a href=\"{link}\">писать</a> о том, что вы думаете о "
 "Таler."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 #, fuzzy
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr ""
@@ -867,7 +844,6 @@ msgstr ""
 "выполнение небольших заданий."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 #, fuzzy
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
@@ -877,29 +853,30 @@ msgstr ""
 "которые поступают сразу на электронный кошелёк пользователя."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr "Неожиданный результат"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 msgid ""
 "Please participate in our survey about payment systems and receive a "
 "reward in return."
 msgstr ""
-"Пожалуйста, примите участие в нашем опросе о платёжных системам и получите "
-"за это вознаграждение."
+"Пожалуйста, примите участие в нашем опросе о платёжных системам и "
+"получите за это вознаграждение."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "Какую платёжную систему вы предпочитаете?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "Отправить"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "Шаг 6. Обратная связь"
+
 #~ msgid "English [en]"
 #~ msgstr ""
 
@@ -943,3 +920,4 @@ msgstr "Отправить"
 #~ msgstr ""
 #~ "Подробнее о GNU Taler можно прочитать"
 #~ " на нашем <a href=\"{site}\">сайте</a>."
+
diff --git a/talermerchantdemos/translations/sv/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/sv/LC_MESSAGES/messages.po
index 5c3c6f8..638effb 100644
--- a/talermerchantdemos/translations/sv/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/sv/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2022-12-26 18:33+0000\n"
 "Last-Translator: Stefan Kügel <skuegel@web.de>\n"
 "Language: sv\n"
@@ -17,7 +17,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -36,101 +36,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "Internt fel"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "Obetald artikel kan ej återbetalas"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "Återbetalning är inte längre möjlig"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "Du har inte betalt denna artikel (kul försök!)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "Återbetalning kan inte (längre) göras"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "Internt fel: Underlag för artikel ({}) hittades inte."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "Kompletterande information ({}) för artikel ({}) hittades inte."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "Direkt åtkomst förbjuden"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "Backend returnerade felstatus"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "Internt serverfel"
 
@@ -138,71 +131,68 @@ msgstr "Internt serverfel"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "Sidan hittades inte"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "parameter '{}' krävs"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr "Backend kunde inte skapa beställningen"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "Det gick inte att upprätta anslutning till backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 #, fuzzy
 msgid "Could not parse the response from backend"
 msgstr "Det gick inte att tolka svaret från backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "Det gick inte att tolka svaret från backend"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr "GNU Taler Demo"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "HTTP-metoden är inte tillåten för den här sidan"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr ""
 
@@ -327,7 +317,6 @@ msgstr "Begär återbetalning"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "Fel påträffades"
 
@@ -336,7 +325,6 @@ msgstr "Fel påträffades"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "Backend returnerade statuskoden {code}."
 
@@ -345,7 +333,6 @@ msgstr "Backend returnerade statuskoden {code}."
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "Svar från backend:"
 
@@ -356,7 +343,6 @@ msgstr "Svar från backend:"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "Stackspårning:"
 
@@ -450,13 +436,11 @@ msgstr "Donationer"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "Enkät"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -807,18 +791,15 @@ msgstr ""
 "offentligt visas på den sidan."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "Steg 5: Undersökning"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 #, fuzzy
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr "Webbplatser kan ge en slant till besökare för att slutföra uppgifter."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
@@ -827,28 +808,25 @@ msgstr ""
 "href=\"{url}\">undersökning</a> ."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "Steg 6: Kontakta oss"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr "Vi uppskattar feedback om Taler och denna demo."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr "Låt oss veta vad du tycker genom att <a href=\"{link}\">kontakta 
oss</a> ."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 #, fuzzy
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr "Den här sidan visar hur du kan belöna besökare som utfört små 
uppgifter."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 #, fuzzy
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
@@ -858,12 +836,10 @@ msgstr ""
 "användares plånbok."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 #, fuzzy
 msgid ""
 "Please participate in our survey about payment systems and receive a "
@@ -873,15 +849,18 @@ msgstr ""
 "utbyte."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "Vilket betalningssystem föredrar du?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "Skicka in enkäten"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "Steg 6: Kontakta oss"
+
 #~ msgid ""
 #~ "After installation, you may be asked "
 #~ "to grant the brower-based Taler "
diff --git a/talermerchantdemos/translations/tr/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/tr/LC_MESSAGES/messages.po
index dfd5cd8..b5881f9 100644
--- a/talermerchantdemos/translations/tr/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/tr/LC_MESSAGES/messages.po
@@ -7,18 +7,17 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2023-12-05 18:52+0000\n"
 "Last-Translator: Alp <berna.alp@digitalekho.com>\n"
-"Language-Team: Turkish <https://weblate.taler.net/projects/gnu-taler/";
-"demonstration-pages/tr/>\n"
 "Language: tr\n"
+"Language-Team: Turkish <https://weblate.taler.net/projects/gnu-taler";
+"/demonstration-pages/tr/>\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 5.2.1\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -37,101 +36,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr "GNU Taler Demo: Hata"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "Iç hata"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr "GNU Taler Demo: Makale Mağazası"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "Ücreti ödenmemiş makalenin parası iade edilemez"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "Bu makalenin ücreti artık iade edilemez"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr "GNU Taler Demo: Geri ödemeyi onayla"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "Bu makale için ödeme yapmadınız (iyi deneme!)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "Ürün iade edilemez (artık)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "içsel hata: ({}) makalesi için dosyalar bulunamadı."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "({}) makalesi için ek dosya ({}) bulunamadı."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr "GNU Taler Demo: Makale"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr "Lütfen çerezleri etkinleştirin."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "Doğrudan erişim yasak"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "Arka uç hata durumu verdi"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr "GNU Taler Demo: İade Edildi"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "İç Sunucu Hatası"
 
@@ -139,70 +131,67 @@ msgstr "İç Sunucu Hatası"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "Sayfa bulunamadı"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "'{}' parametresi gerekli"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr "GNU Taler Demo: Bağışlar"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr "GNU Taler Demo: Bağış ödeme"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr "Arka uç siparişi oluşturamadı"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "Arka uçla bağlantı kurulamadı"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 msgid "Could not parse the response from backend"
 msgstr "Arka uçtan gelen yanıt ayrıştırılamadı."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "Arka uçtan gelen yanıt ayrıştırılamadı"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr "GNU Taler demonstrasyon"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "Bu sayfa için HTTP yöntemine izin verilmiyor"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr "GNU Taler Demo: Anket"
 
@@ -238,8 +227,8 @@ msgid ""
 "Your payment (order ID <tt>{order}<tt>) for the article \"{article}\" has"
 " been refunded."
 msgstr ""
-"Makale \"{article}\" için yaptığınız ödeme (sipariş ID <tt>{order}<tt>) iade "
-"edildi."
+"Makale \"{article}\" için yaptığınız ödeme (sipariş ID <tt>{order}<tt>) "
+"iade edildi."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/blog-article-refunded.html.j2:14
 #: talermerchantdemos/templates/blog-article-refunded.html.j2:14
@@ -326,7 +315,6 @@ msgstr "Geri iade iste"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "Hata oluştu"
 
@@ -335,7 +323,6 @@ msgstr "Hata oluştu"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "Arka uç, {code} durum kodunu verdi."
 
@@ -344,7 +331,6 @@ msgstr "Arka uç, {code} durum kodunu verdi."
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "Arka uçun yanıtı:"
 
@@ -355,7 +341,6 @@ msgstr "Arka uçun yanıtı:"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "Stack trace:"
 
@@ -445,19 +430,17 @@ msgstr "Bağışlar"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "Anket"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
 msgstr ""
-"GNU Taler hakkında daha fazla bilgi edinmek için ana <a href=\"{site}\">web "
-"sitemizi</a> ziyaret edebilirsiniz."
+"GNU Taler hakkında daha fazla bilgi edinmek için ana <a "
+"href=\"{site}\">web sitemizi</a> ziyaret edebilirsiniz."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-base.html.j2:13
 #: talermerchantdemos/templates/donations-base.html.j2:13
@@ -815,19 +798,16 @@ msgstr ""
 " gösteriliyor."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "5. Adim: Soruşturma"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr ""
 "Web siteleri, ziyaretçilere görevleri tamamlamaları karşılığında ödüller "
 "verebilir."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
@@ -836,24 +816,22 @@ msgstr ""
 "kazanabilirsiniz."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "6. Adım: Bize Erişin"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr "Bu demostrasyon hakkındaki görüşlerinizi bize iletirseniz memnun 
oluruz."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr ""
 "Hakkımızda ne düşündüğünüzü <a href=\"{link}\">bize ulaşın</a> üzerinde "
 "bize iletebilirsiniz."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 #, fuzzy
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr ""
@@ -861,38 +839,38 @@ msgstr ""
 "verileceğini gösterir."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
 "user's wallet."
 msgstr ""
-"Ödüllendirme, kullanıcıların cüzdanlarına doğrudan nakit ödüller sunmanın "
-"bir yoludur."
+"Ödüllendirme, kullanıcıların cüzdanlarına doğrudan nakit ödüller sunmanın"
+" bir yoludur."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr "Beklenmeyen sonuç"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 msgid ""
 "Please participate in our survey about payment systems and receive a "
 "reward in return."
 msgstr ""
-"Lütfen ödeme sistemleri hakkındaki anketimize katılın ve karşılığında bir "
-"ödül kazanın."
+"Lütfen ödeme sistemleri hakkındaki anketimize katılın ve karşılığında bir"
+" ödül kazanın."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "Hangi ödeme sistemini tercih edersiniz?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "Anketi Gönder"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "6. Adım: Bize Erişin"
+
 #~ msgid "Bank"
 #~ msgstr "Banka"
 
@@ -910,3 +888,4 @@ msgstr "Anketi Gönder"
 #~ "GNU Taler hakkında daha fazla bilgi "
 #~ "için <a href=\"{site}\">sahifesini ziyaret</a> "
 #~ "edebilirsiniz."
+
diff --git a/talermerchantdemos/translations/uk/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/uk/LC_MESSAGES/messages.po
index 876684c..dd0e178 100644
--- a/talermerchantdemos/translations/uk/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/uk/LC_MESSAGES/messages.po
@@ -1,4 +1,4 @@
-# Translations template for PROJECT.
+# Ukrainian translations for PROJECT.
 # Copyright (C) 2023 ORGANIZATION
 # This file is distributed under the same license as the PROJECT project.
 # FIRST AUTHOR <EMAIL@ADDRESS>, 2023.
@@ -7,19 +7,18 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2024-08-07 10:40+0000\n"
 "Last-Translator: Vlada Svirsh <vlada.svirsh@students.bfh.ch>\n"
-"Language-Team: Ukrainian <https://weblate.taler.net/projects/gnu-taler/";
-"demonstration-pages/uk/>\n"
 "Language: uk\n"
+"Language-Team: Ukrainian <https://weblate.taler.net/projects/gnu-taler";
+"/demonstration-pages/uk/>\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
-"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 5.5.5\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -38,101 +37,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr "Демо GNU Taler: Помилка"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "Внутрішня помилка"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr "Демо GNU Taler: Магазин есе"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "Неможливо повернути кошти за неоплачений товар"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "Товар більше не можна повернути"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr "Демо GNU Taler: Підтвердити повернення коштів"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "Ви не оплатили цей товар (гарна спроба!)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "Товар більше не підлягає поверненню"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "Внутрішня помилка: файли для товара ({}) не знайдені."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "Додатковий файл ({}) для товару ({}) не знайдено."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr "Демо GNU Taler: Стаття"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr "Будь ласка, увімкніть файли cookies."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "Прямий доступ заборонено"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "Бекенд повернув статус помилки"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr "Демо GNU Taler: Кошти повернено"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "Внутрішня помилка сервера"
 
@@ -140,70 +132,67 @@ msgstr "Внутрішня помилка сервера"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "Сторінку не знайдено"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "необхідний параметр '{}'"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr "Демо GNU Taler: Донати"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr "Демо GNU Taler: Оформлення донату"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr "Бекенд не зміг створити замовлення"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "Не вдалося встановити з’єднання з бекендом"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 msgid "Could not parse the response from backend"
 msgstr "Не вдалося зпарсити відповідь з бекенду"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "Не вдалося обробити відповідь з бекенду"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr "Демо GNU Taler"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "HTTP-метод заборонено використовувати для цієї сторінки"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr "Демо GNU Taler: Опитування"
 
@@ -277,8 +266,8 @@ msgid ""
 "The book is <a href=\"{shop}\">published by the FSF</a> and available "
 "gratis at <a href=\"{gnu}\">gnu.org</a>."
 msgstr ""
-"Книгу <a href=\"{shop}\">видає FSF</a> безкоштовно її можна отримати на <a "
-"href=\"{gnu}\">gnu.org</a>."
+"Книгу <a href=\"{shop}\">видає FSF</a> безкоштовно її можна отримати на "
+"<a href=\"{gnu}\">gnu.org</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/blog-confirm-refund.html.j2:3
 #: talermerchantdemos/templates/blog-confirm-refund.html.j2:3
@@ -295,8 +284,7 @@ msgstr "Хочете отримати відшкодування за товар
 msgid ""
 "In this demonstration, refunds will be automatically approved by the "
 "merchant."
-msgstr ""
-"У цій демонстрації відшкодування буде автоматично затверджено продавцем."
+msgstr "У цій демонстрації відшкодування буде автоматично затверджено 
продавцем."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/blog-confirm-refund.html.j2:9
 #: talermerchantdemos/templates/blog-confirm-refund.html.j2:9
@@ -311,8 +299,8 @@ msgid ""
 "You will only be able to receive the refund on the same wallet that you "
 "have used to pay for this article originally."
 msgstr ""
-"Ви зможете отримати повернення коштів тільки на той самий гаманець, який ви "
-"використовували для сплати за цю статтю спочатку."
+"Ви зможете отримати повернення коштів тільки на той самий гаманець, який "
+"ви використовували для сплати за цю статтю спочатку."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/blog-confirm-refund.html.j2:22
 #: talermerchantdemos/templates/blog-confirm-refund.html.j2:22
@@ -326,7 +314,6 @@ msgstr "Запросити повернення коштів"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "Виникла помилка"
 
@@ -335,7 +322,6 @@ msgstr "Виникла помилка"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "Бекенд повернув код статусу {code}."
 
@@ -344,7 +330,6 @@ msgstr "Бекенд повернув код статусу {code}."
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "Відповідь бекенда:"
 
@@ -355,7 +340,6 @@ msgstr "Відповідь бекенда:"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "Стек викликів:"
 
@@ -370,8 +354,8 @@ msgid ""
 "This is the latest edition of <cite>Free Software, Free Society: Selected"
 " Essays of Richard M. Stallman.</cite>"
 msgstr ""
-"Це останнє видання <cite>Вільне програмне забезпечення, вільне суспільство: "
-"вибрані есе Річарда М. Столмана.</cite>"
+"Це останнє видання <cite>Вільне програмне забезпечення, вільне "
+"суспільство: вибрані есе Річарда М. Столмана.</cite>"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/blog-index.html.j2:15
 #: talermerchantdemos/templates/blog-index.html.j2:15
@@ -383,10 +367,10 @@ msgid ""
 "translation has been approved by the Free Software Foundation and the "
 "copyright notice and this permission notice are preserved on all copies."
 msgstr ""
-"Дозволяється дослівне копіювання та розповсюдження цієї книги у всьому світі "
-"без виплати роялті на будь-якому носії, за умови збереження цього "
-"повідомлення. Надається дозвіл на копіювання та розповсюдження перекладів "
-"цієї книги з оригінальної англійської мови на іншу мову, за умови, що "
+"Дозволяється дослівне копіювання та розповсюдження цієї книги у всьому "
+"світі без виплати роялті на будь-якому носії, за умови збереження цього "
+"повідомлення. Надається дозвіл на копіювання та розповсюдження перекладів"
+" цієї книги з оригінальної англійської мови на іншу мову, за умови, що "
 "переклад було затверджено ФВПЗ, а авторське право та це повідомлення про "
 "дозвіл зберігаються на всіх копіях."
 
@@ -406,8 +390,8 @@ msgid ""
 "You can get free, virtual money to buy articles on this page at the <a "
 "href=\"{}\">bank</a>."
 msgstr ""
-"Ви можете отримати безкоштовні віртуальні гроші для придбання товарів на цій "
-"сторінці в <a href=\"{}\">банку</a>."
+"Ви можете отримати безкоштовні віртуальні гроші для придбання товарів на "
+"цій сторінці в <a href=\"{}\">банку</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/blog-index.html.j2:32
 #: talermerchantdemos/templates/blog-index.html.j2:32
@@ -445,18 +429,17 @@ msgstr "Підтримати проєкт"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "Опитування"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
 msgstr ""
-"Детальніше про Taler можна дізнатися на нашому <a href=\"{site}\">сайті</a>."
+"Детальніше про Taler можна дізнатися на нашому <a "
+"href=\"{site}\">сайті</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-base.html.j2:13
 #: talermerchantdemos/templates/donations-base.html.j2:13
@@ -469,8 +452,8 @@ msgid ""
 "Using this page you can make donations in {currency} to Free Software "
 "projects."
 msgstr ""
-"Використовуючи цю сторінку, ви можете зробити донати у {currency} на проекти "
-"вільного програмного забезпечення."
+"Використовуючи цю сторінку, ви можете зробити донати у {currency} на "
+"проекти вільного програмного забезпечення."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-checkout.html.j2:5
 #: talermerchantdemos/templates/donations-checkout.html.j2:5
@@ -515,8 +498,8 @@ msgid ""
 " demonstration."
 msgstr ""
 "Зауважте, що ви повинні обрати тут Taler, щоб продовжити демонстрацію, "
-"оскільки інші варіанти оплати є лише заповнювачами й насправді не працюють у "
-"демонстрації."
+"оскільки інші варіанти оплати є лише заповнювачами й насправді не "
+"працюють у демонстрації."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-checkout.html.j2:18
 #: talermerchantdemos/templates/donations-checkout.html.j2:18
@@ -526,8 +509,8 @@ msgid ""
 "to keep each step as simple as possible."
 msgstr ""
 "Можна було б попросити користувача зробити цей вибір вже на попередній "
-"сторінці під час додавання товару у кошик; ми просто розділили два кроки, "
-"щоб зробити кожен крок максимально простим."
+"сторінці під час додавання товару у кошик; ми просто розділили два кроки,"
+" щоб зробити кожен крок максимально простим."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-checkout.html.j2:44
 #: talermerchantdemos/templates/donations-checkout.html.j2:44
@@ -545,8 +528,8 @@ msgid ""
 "Thank you, <strong>{donor}</strong>, for donating "
 "<strong>{amount}</strong> to <strong>{receiver}</strong>."
 msgstr ""
-"Дякуємо, <strong>{donor}</strong>, що задонатили <strong>{amount}</"
-"strong>для <strong>{receiver}</strong>."
+"Дякуємо, <strong>{donor}</strong>, що задонатили "
+"<strong>{amount}</strong>для <strong>{receiver}</strong>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-fulfillment.html.j2:12
 #: talermerchantdemos/templates/donations-fulfillment.html.j2:12
@@ -554,8 +537,8 @@ msgid ""
 "Please keep the order identifier <strong>{id}</strong> as a receipt for "
 "your donation."
 msgstr ""
-"Будь ласка, збережіть номер замовлення <strong>{id}</strong> як квитанцію "
-"про ваш донат."
+"Будь ласка, збережіть номер замовлення <strong>{id}</strong> як квитанцію"
+" про ваш донат."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-fulfillment.html.j2:13
 #: talermerchantdemos/templates/donations-fulfillment.html.j2:13
@@ -563,8 +546,8 @@ msgid ""
 "You can show other people that you donated by sharing <a "
 "href=\"{link}\">this link</a> with them."
 msgstr ""
-"Ви можете показати іншим людям, що ви зробили донат, поділившись з ними <a "
-"href=\"{link}\">цим посиланням</a>."
+"Ви можете показати іншим людям, що ви зробили донат, поділившись з ними "
+"<a href=\"{link}\">цим посиланням</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-fulfillment.html.j2:19
 #: talermerchantdemos/templates/donations-fulfillment.html.j2:19
@@ -582,8 +565,8 @@ msgid ""
 "This donations website shows the user experience for donations with GNU "
 "Taler."
 msgstr ""
-"Цей веб-сайт демонструє, як користуватися сторінкою для збирання донатів на "
-"підтримку проєкту за допомогою GNU Taler."
+"Цей веб-сайт демонструє, як користуватися сторінкою для збирання донатів "
+"на підтримку проєкту за допомогою GNU Taler."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-index.html.j2:9
 #: talermerchantdemos/templates/donations-index.html.j2:9
@@ -620,11 +603,12 @@ msgid ""
 " from the merchant in the Taler wallet.  That way, Taler protects you "
 "from committing to erroneous payments."
 msgstr ""
-"(*) Щоб зробити демоверсію трохи цікавішою, параметр 5 {currency} навмисно "
-"реалізовано з помилкою: продавець намагатиметься змусити вас задонатити 6 "
-"{currency} замість 5 {currency}, показаних у формі. Але не хвилюйтесь, вам "
-"буде надана можливість переглянути остаточну пропозицію від продавця в "
-"гаманець Taler. Таким чином Taler захищає вас від помилкових платежів."
+"(*) Щоб зробити демоверсію трохи цікавішою, параметр 5 {currency} "
+"навмисно реалізовано з помилкою: продавець намагатиметься змусити вас "
+"задонатити 6 {currency} замість 5 {currency}, показаних у формі. Але не "
+"хвилюйтесь, вам буде надана можливість переглянути остаточну пропозицію "
+"від продавця в гаманець Taler. Таким чином Taler захищає вас від "
+"помилкових платежів."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-provider-not-supported.html.j2:4
 #: talermerchantdemos/templates/donations-provider-not-supported.html.j2:4
@@ -634,8 +618,7 @@ msgstr "Платіжний постачальник не підтримуєть
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-provider-not-supported.html.j2:7
 #: talermerchantdemos/templates/donations-provider-not-supported.html.j2:7
 msgid "Unfortunately the selected payment provider is not supported in this 
demo."
-msgstr ""
-"На жаль, вибраний постачальник платежів не підтримується в цій демоверсії."
+msgstr "На жаль, вибраний постачальник платежів не підтримується в цій 
демоверсії."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/donations-provider-not-supported.html.j2:8
 #: talermerchantdemos/templates/donations-provider-not-supported.html.j2:8
@@ -651,8 +634,8 @@ msgstr "Це демоверсія GNU Taler."
 #: talermerchantdemos/templates/landing-base.html.j2:8
 msgid "Here you can try out the GNU Taler payment system using a toy currency."
 msgstr ""
-"Тут ви можете спробувати платіжну систему GNU Taler за допомогою іграшкової "
-"валюти."
+"Тут ви можете спробувати платіжну систему GNU Taler за допомогою "
+"іграшкової валюти."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:4
 #: talermerchantdemos/templates/landing-index.html.j2:4
@@ -676,8 +659,8 @@ msgid ""
 "wallet additional optional permissions that allow it to improve your user"
 " experience."
 msgstr ""
-"Після встановлення Вас можуть попросити надати веб-браузерному гаманцю Taler "
-"додаткові дозволи, які дозволять покращити досвід користувача."
+"Після встановлення Вас можуть попросити надати веб-браузерному гаманцю "
+"Taler додаткові дозволи, які дозволять покращити досвід користувача."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:13
 #: talermerchantdemos/templates/landing-index.html.j2:13
@@ -685,8 +668,8 @@ msgid ""
 "These permissions will allow the wallet to automatically open if a page "
 "asks for a Taler payment."
 msgstr ""
-"Ці дозволи дозволять гаманцю автоматично відкриватися, якщо сторінка просить "
-"оплату через Taler."
+"Ці дозволи дозволять гаманцю автоматично відкриватися, якщо сторінка "
+"просить оплату через Taler."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:14
 #: talermerchantdemos/templates/landing-index.html.j2:14
@@ -713,8 +696,8 @@ msgid ""
 "To withdraw {currency} coins you must first create an account at our <a "
 "href=\"{bank}\">bank</a>."
 msgstr ""
-"Щоб зняти {currency} монети, Ви повинні спочатку створити рахунок у нашому "
-"<a href=\"{bank}\">банку</a>."
+"Щоб зняти {currency} монети, Ви повинні спочатку створити рахунок у "
+"нашому <a href=\"{bank}\">банку</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:24
 #: talermerchantdemos/templates/landing-index.html.j2:24
@@ -727,8 +710,8 @@ msgid ""
 "When you create an account at our bank, you will be credited 100 "
 "{currency} for signing up."
 msgstr ""
-"Після створення рахунку у нашому банку, вам буде нараховано 100 {currency} "
-"за реєстрацію."
+"Після створення рахунку у нашому банку, вам буде нараховано 100 "
+"{currency} за реєстрацію."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:26
 #: talermerchantdemos/templates/landing-index.html.j2:26
@@ -736,8 +719,8 @@ msgid ""
 "Afterwards, use the bank's Web interface to authorize the transfer of "
 "{currency} to your wallet."
 msgstr ""
-"Після цього скористайтеся веб-інтерфейсом банку, щоб авторизувати переказ "
-"{currency} на свій гаманець."
+"Після цього скористайтеся веб-інтерфейсом банку, щоб авторизувати переказ"
+" {currency} на свій гаманець."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:30
 #: talermerchantdemos/templates/landing-index.html.j2:30
@@ -745,8 +728,8 @@ msgid ""
 "Once you have completed this step, you can click on the Taler icon in "
 "your browser to check your balance."
 msgstr ""
-"Виконавши цей крок, Ви можете натиснути іконку Taler у своєму браузері, щоб "
-"перевірити свій баланс."
+"Виконавши цей крок, Ви можете натиснути іконку Taler у своєму браузері, "
+"щоб перевірити свій баланс."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:35
 #: talermerchantdemos/templates/landing-index.html.j2:35
@@ -766,8 +749,8 @@ msgid ""
 "Free Society&quot;."
 msgstr ""
 "У <a href=\"{blog}\">магазині есе</a> Ви можете заплатити {currency} за "
-"окремі розділи книги Річарда Столмана «Вільне програмне забезпечення, вільне "
-"суспільство»."
+"окремі розділи книги Річарда Столмана «Вільне програмне забезпечення, "
+"вільне суспільство»."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:45
 #: talermerchantdemos/templates/landing-index.html.j2:45
@@ -781,8 +764,8 @@ msgid ""
 "respect to a software project of your choice by donating {currency} to "
 "them."
 msgstr ""
-"На <a href=\"{donations}\">веб-сайті донатів</a> Ви можете висловити повагу "
-"обраному програмному проєкту, задонативши йому {currency}."
+"На <a href=\"{donations}\">веб-сайті донатів</a> Ви можете висловити "
+"повагу обраному програмному проєкту, задонативши йому {currency}."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:56
 #: talermerchantdemos/templates/landing-index.html.j2:56
@@ -809,63 +792,54 @@ msgstr ""
 "налаштовані для загального перегляду."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "Крок 5: Опитування"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr "Веб-сайти можуть нагороджувати відвідувачів за виконання завдань."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
 msgstr ""
-"Ви можете заробити кілька монет {currency}, заповнивши наше <a href=\"{url}\""
-">опитування</a>."
+"Ви можете заробити кілька монет {currency}, заповнивши наше <a "
+"href=\"{url}\">опитування</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "Крок 6. Зв’яжіться з нами"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr "Ми цінуємо будь які відгуки про Taler і цю демонстрацію."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
-msgstr ""
-"Дайте нам знати, що ви думаєте, <a href=\"{link}\">зв'язавшись з нами</a>."
+msgstr "Дайте нам знати, що ви думаєте, <a href=\"{link}\">зв'язавшись з 
нами</a>."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr ""
 "На цій сторінці показано, як винагороджувати відвідувачів за виконання "
 "невеликих завдань."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
 "user's wallet."
 msgstr ""
-"Винагорода — це спосіб пропонувати грошові винагороди, які надходять прямо в "
-"гаманець користувача."
+"Винагорода — це спосіб пропонувати грошові винагороди, які надходять "
+"прямо в гаманець користувача."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr "Неочікуваний результат"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 msgid ""
 "Please participate in our survey about payment systems and receive a "
 "reward in return."
@@ -874,11 +848,15 @@ msgstr ""
 "отримайте винагороду."
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "Якій платіжній системі Ви надаєте перевагу?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "Надіслати анкету"
+
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "Крок 6. Зв’яжіться з нами"
+
diff --git a/talermerchantdemos/translations/zh_Hant/LC_MESSAGES/messages.po 
b/talermerchantdemos/translations/zh_Hant/LC_MESSAGES/messages.po
index c97b40a..d339f17 100644
--- a/talermerchantdemos/translations/zh_Hant/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/zh_Hant/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: eintritt@hotmail.com\n"
-"POT-Creation-Date: 2023-10-16 18:03+0200\n"
+"POT-Creation-Date: 2024-09-03 16:04+0200\n"
 "PO-Revision-Date: 2022-12-26 18:33+0000\n"
 "Last-Translator: Stefan Kügel <skuegel@web.de>\n"
 "Language: zh_Hant\n"
@@ -17,7 +17,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.11.0\n"
+"Generated-By: Babel 2.16.0\n"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:150
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:229
@@ -36,101 +36,94 @@ msgstr ""
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:203
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:212
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:220
-#: talermerchantdemos/blog/blog.py:150 talermerchantdemos/blog/blog.py:229
-#: talermerchantdemos/blog/blog.py:389 talermerchantdemos/blog/blog.py:558
-#: talermerchantdemos/blog/blog.py:567 talermerchantdemos/blog/blog.py:577
-#: talermerchantdemos/donations/donations.py:144
-#: talermerchantdemos/donations/donations.py:313
-#: talermerchantdemos/landing/landing.py:95
-#: talermerchantdemos/landing/landing.py:180
-#: talermerchantdemos/landing/landing.py:189
-#: talermerchantdemos/survey/survey.py:106
-#: talermerchantdemos/survey/survey.py:182
-#: talermerchantdemos/survey/survey.py:191
-#: talermerchantdemos/survey/survey.py:203
-#: talermerchantdemos/survey/survey.py:212
-#: talermerchantdemos/survey/survey.py:220
+#: talermerchantdemos/blog/blog.py:155 talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:399 talermerchantdemos/blog/blog.py:557
+#: talermerchantdemos/blog/blog.py:566 talermerchantdemos/blog/blog.py:576
+#: talermerchantdemos/donations/donations.py:155
+#: talermerchantdemos/donations/donations.py:326
+#: talermerchantdemos/landing/landing.py:102
+#: talermerchantdemos/landing/landing.py:182
+#: talermerchantdemos/landing/landing.py:191
 msgid "GNU Taler Demo: Error"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:151
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:96
-#: talermerchantdemos/blog/blog.py:151 talermerchantdemos/landing/landing.py:96
+#: talermerchantdemos/blog/blog.py:156
+#: talermerchantdemos/landing/landing.py:103
 msgid "Internal error"
 msgstr "內部錯誤"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:204
-#: talermerchantdemos/blog/blog.py:204
+#: talermerchantdemos/blog/blog.py:209
 msgid "GNU Taler Demo: Essay Shop"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:222
-#: talermerchantdemos/blog/blog.py:222
+#: talermerchantdemos/blog/blog.py:227
 msgid "Cannot refund unpaid article"
 msgstr "無法對於未付款文章進行退款"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:230
-#: talermerchantdemos/blog/blog.py:230
+#: talermerchantdemos/blog/blog.py:235
 msgid "Article is not anymore refundable"
 msgstr "已無法對此文章進行退款"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:234
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:239
 msgid "GNU Taler Demo: Confirm refund"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:267
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:272
 msgid "You did not pay for this article (nice try!)"
 msgstr "您並沒有為此文章付款(想得美!)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:272
-#: talermerchantdemos/blog/blog.py:272
+#: talermerchantdemos/blog/blog.py:277
 msgid "Item not refundable (anymore)"
 msgstr "此文章無法進行退款(已無法)"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:298
-#: talermerchantdemos/blog/blog.py:298
+#: talermerchantdemos/blog/blog.py:303
 msgid "Internal error: Files for article ({}) not found."
 msgstr "內部錯誤:找不到此文章 ({}) 的檔案。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:305
-#: talermerchantdemos/blog/blog.py:305
 msgid "Supplemental file ({}) for article ({}) not found."
 msgstr "找不到文章 ({}) 的補充文件 ({}) 。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:313
-#: talermerchantdemos/blog/blog.py:313
+#: talermerchantdemos/blog/blog.py:318
 msgid "GNU Taler Demo: Article"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:390
-#: talermerchantdemos/blog/blog.py:390
+#: talermerchantdemos/blog/blog.py:400
 msgid "Please enable cookies."
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:408
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:439
-#: talermerchantdemos/blog/blog.py:408 talermerchantdemos/blog/blog.py:439
 msgid "Direct access forbidden"
 msgstr "禁止直接訪問"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:431
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:52
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:75
-#: talermerchantdemos/blog/blog.py:431
-#: talermerchantdemos/httpcommon/__init__.py:52
-#: talermerchantdemos/httpcommon/__init__.py:75
+#: talermerchantdemos/blog/blog.py:480
+#: talermerchantdemos/httpcommon/__init__.py:54
+#: talermerchantdemos/httpcommon/__init__.py:77
 msgid "Backend returned error status"
 msgstr "後台回傳錯誤狀態"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:490
-#: talermerchantdemos/blog/blog.py:490
+#: talermerchantdemos/blog/blog.py:469
 msgid "GNU Taler Demo: Refunded"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/blog/blog.py:559
-#: talermerchantdemos/blog/blog.py:559
+#: talermerchantdemos/blog/blog.py:558
 msgid "Internal server error"
 msgstr "內部伺服器錯誤"
 
@@ -138,71 +131,68 @@ msgstr "內部伺服器錯誤"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:314
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:181
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:183
-#: talermerchantdemos/blog/blog.py:568
-#: talermerchantdemos/donations/donations.py:314
-#: talermerchantdemos/landing/landing.py:181
-#: talermerchantdemos/survey/survey.py:183
+#: talermerchantdemos/blog/blog.py:567
+#: talermerchantdemos/donations/donations.py:327
+#: talermerchantdemos/landing/landing.py:183
 msgid "Page not found"
 msgstr "找不到此頁面"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:130
-#: talermerchantdemos/donations/donations.py:130
+#: talermerchantdemos/donations/donations.py:141
 msgid "parameter '{}' required"
 msgstr "需要 '{}' 參數"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:225
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:299
-#: talermerchantdemos/donations/donations.py:190
-#: talermerchantdemos/donations/donations.py:225
-#: talermerchantdemos/donations/donations.py:299
+#: talermerchantdemos/donations/donations.py:203
+#: talermerchantdemos/donations/donations.py:238
+#: talermerchantdemos/donations/donations.py:312
 msgid "GNU Taler Demo: Donations"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:208
-#: talermerchantdemos/donations/donations.py:208
+#: talermerchantdemos/donations/donations.py:221
 msgid "GNU Taler Demo: Donations checkout"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/donations/donations.py:269
-#: talermerchantdemos/donations/donations.py:269
+#: talermerchantdemos/donations/donations.py:282
 msgid "Backend could not create the order"
 msgstr "後端無法創建訂單"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:41
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:91
-#: talermerchantdemos/httpcommon/__init__.py:41
-#: talermerchantdemos/httpcommon/__init__.py:91
+#: talermerchantdemos/httpcommon/__init__.py:43
+#: talermerchantdemos/httpcommon/__init__.py:94
 msgid "Could not establish connection to backend"
 msgstr "無法建立後台連線"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:47
-#: talermerchantdemos/httpcommon/__init__.py:47
+#: talermerchantdemos/httpcommon/__init__.py:49
 #, fuzzy
 msgid "Could not parse the response from backend"
 msgstr "無法解析後台回覆"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/httpcommon/__init__.py:96
-#: talermerchantdemos/httpcommon/__init__.py:96
+#: talermerchantdemos/httpcommon/__init__.py:99
 msgid "Could not parse response from backend"
 msgstr "無法解析後台回覆"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:165
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:20
-#: talermerchantdemos/landing/landing.py:165
+#: talermerchantdemos/landing/landing.py:168
 #: talermerchantdemos/templates/common-base.html.j2:20
 msgid "GNU Taler Demo"
 msgstr "GNU Taler Demo"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/landing/landing.py:190
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:192
-#: talermerchantdemos/landing/landing.py:190
-#: talermerchantdemos/survey/survey.py:192
+#: talermerchantdemos/landing/landing.py:192
 msgid "HTTP method not allowed for this page"
 msgstr "HTTP 方法不被此頁面允許"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/survey/survey.py:172
-#: talermerchantdemos/survey/survey.py:172
 msgid "GNU Taler Demo: Survey"
 msgstr ""
 
@@ -315,7 +305,6 @@ msgstr "要求退款"
 #: talermerchantdemos/templates/blog-error.html.j2:3
 #: talermerchantdemos/templates/donations-error.html.j2:3
 #: talermerchantdemos/templates/landing-error.html.j2:3
-#: talermerchantdemos/templates/survey-error.html.j2:3
 msgid "Error encountered"
 msgstr "發生錯誤"
 
@@ -324,7 +313,6 @@ msgstr "發生錯誤"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:9
 #: talermerchantdemos/templates/blog-error.html.j2:9
 #: talermerchantdemos/templates/donations-error.html.j2:9
-#: talermerchantdemos/templates/survey-error.html.j2:9
 msgid "The backend returned status code {code}."
 msgstr "後端回傳狀態碼 {code}。"
 
@@ -333,7 +321,6 @@ msgstr "後端回傳狀態碼 {code}。"
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error.html.j2:14
 #: talermerchantdemos/templates/blog-error.html.j2:14
 #: talermerchantdemos/templates/donations-error.html.j2:14
-#: talermerchantdemos/templates/survey-error.html.j2:14
 msgid "Backend response:"
 msgstr "後端回應:"
 
@@ -344,7 +331,6 @@ msgstr "後端回應:"
 #: talermerchantdemos/templates/blog-error.html.j2:19
 #: talermerchantdemos/templates/donations-error.html.j2:19
 #: talermerchantdemos/templates/landing-error.html.j2:8
-#: talermerchantdemos/templates/survey-error.html.j2:19
 msgid "Stack trace:"
 msgstr "堆疊追蹤:"
 
@@ -430,13 +416,11 @@ msgstr "捐款"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:70
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:11
-#: talermerchantdemos/templates/common-base.html.j2:70
-#: talermerchantdemos/templates/survey-base.html.j2:11
 msgid "Survey"
 msgstr "問卷調查"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/common-base.html.j2:109
-#: talermerchantdemos/templates/common-base.html.j2:109
+#: talermerchantdemos/templates/common-base.html.j2:106
 msgid ""
 "You can learn more about GNU Taler on our main <a "
 "href=\"{site}\">website</a>."
@@ -744,46 +728,40 @@ msgid ""
 msgstr "請注意,只有被設定為公開檢視的帳號會顯示在此頁面。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:65
-#: talermerchantdemos/templates/landing-index.html.j2:65
 msgid "Step 5: Survey"
 msgstr "步驟五:問卷調查"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:68
-#: talermerchantdemos/templates/landing-index.html.j2:68
 #, fuzzy
 msgid "Websites can give rewards to visitors for completing tasks."
 msgstr "這些網站可以提供指點予訪客以完成任務。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:69
-#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid ""
 "You can earn some {currency} coins by filling in our <a "
 "href=\"{url}\">survey</a>."
 msgstr "您可以透過填寫我們的<a href=\"{url}\">問卷調查</a>獲得一些 {currency} 貨幣。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:81
-#: talermerchantdemos/templates/landing-index.html.j2:81
 msgid "Step 6: Reach out to us"
 msgstr "步驟六:與我們聯絡"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:84
-#: talermerchantdemos/templates/landing-index.html.j2:84
+#: talermerchantdemos/templates/landing-index.html.j2:68
 msgid "We appreciate feedback about Taler and this demonstrator."
 msgstr "謝謝您對於 Taler 和此示範的回饋。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/landing-index.html.j2:85
-#: talermerchantdemos/templates/landing-index.html.j2:85
+#: talermerchantdemos/templates/landing-index.html.j2:69
 msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
 msgstr "<a href=\"{link}\">聯絡我們</a>並讓我們知道您的想法。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:13
-#: talermerchantdemos/templates/survey-base.html.j2:13
 #, fuzzy
 msgid "This page demonstrates how to reward visitors for completing small 
tasks."
 msgstr "此頁面演示了如何提示參觀者完成小型任務。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-base.html.j2:14
-#: talermerchantdemos/templates/survey-base.html.j2:14
 #, fuzzy
 msgid ""
 "Rewarding is a way of offering cash rewards that go straight into a "
@@ -791,12 +769,10 @@ msgid ""
 msgstr "給予小費是一種直接提供現金回饋至使用者錢包的方式。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-error-graceful.html.j2:3
-#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
 msgid "Unexpected result"
 msgstr ""
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:6
-#: talermerchantdemos/templates/survey-index.html.j2:6
 #, fuzzy
 msgid ""
 "Please participate in our survey about payment systems and receive a "
@@ -804,15 +780,18 @@ msgid ""
 msgstr "請參與我們關於支付系統的問卷調查以獲得小費。"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:13
-#: talermerchantdemos/templates/survey-index.html.j2:13
 msgid "Which payment system do you prefer?"
 msgstr "請問您偏好哪個支付系統?"
 
 #: 
dist/talermerchantdemos-0.8.2-py3-none-any/talermerchantdemos/templates/survey-index.html.j2:24
-#: talermerchantdemos/templates/survey-index.html.j2:24
 msgid "Submit Survey"
 msgstr "提交問卷"
 
+#: talermerchantdemos/templates/landing-index.html.j2:65
+#, fuzzy
+msgid "Step 5: Reach out to us"
+msgstr "步驟六:與我們聯絡"
+
 #~ msgid "English [en]"
 #~ msgstr "英語 [en]"
 
diff --git a/talermerchantdemos/util/talerconfig.py 
b/talermerchantdemos/util/talerconfig.py
index 985979a..9419351 100644
--- a/talermerchantdemos/util/talerconfig.py
+++ b/talermerchantdemos/util/talerconfig.py
@@ -32,6 +32,7 @@ LOGGER = logging.getLogger(__name__)
 
 __all__ = ["TalerConfig"]
 
+
 ##
 # Exception class for a any configuration error.
 class ConfigurationError(Exception):
@@ -100,6 +101,7 @@ def expand(var: str, getter: Callable[[str], str]) -> str:
 
     return result + var[pos:]
 
+
 ##
 # A configuration entry.
 class Entry:
@@ -158,8 +160,10 @@ class Entry:
     # @return the value, or the given @a default, if not found.
     def value_string(self, default=None, required=False, warn=False) -> str:
         if required and self.value is None:
-            print("Missing required option '%s' in section '%s'"
-                % (self.option.upper(), self.section.upper()))
+            print(
+                "Missing required option '%s' in section '%s'"
+                % (self.option.upper(), self.section.upper())
+            )
             sys.exit(1)
 
         if self.value is None:

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]