summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-10-11 17:03:12 +0200
committerChristian Grothoff <christian@grothoff.org>2020-10-11 17:03:12 +0200
commitd69934f816c7e48d758452dd443eca0f02dd14ce (patch)
treee0b4493cc328b2bbda16a83edf443a697d47957d
parentaa06ddd3cf1de03922fc4e45e46ef3476a69e3f8 (diff)
downloadtaler-merchant-demos-d69934f816c7e48d758452dd443eca0f02dd14ce.tar.gz
taler-merchant-demos-d69934f816c7e48d758452dd443eca0f02dd14ce.tar.bz2
taler-merchant-demos-d69934f816c7e48d758452dd443eca0f02dd14ce.zip
add landing subpage, simplify deployment
-rwxr-xr-xbin/taler-merchant-demos20
-rwxr-xr-xsetup.py3
-rw-r--r--talermerchantdemos/landing/__init__.py3
-rw-r--r--talermerchantdemos/landing/landing.py164
l---------talermerchantdemos/landing/static1
-rw-r--r--talermerchantdemos/landing/templates/base.html.j2114
-rw-r--r--talermerchantdemos/landing/templates/error.html.j213
-rw-r--r--talermerchantdemos/landing/templates/index.html.j273
l---------talermerchantdemos/landing/translations1
-rw-r--r--translations/de/LC_MESSAGES/messages.po34
-rw-r--r--translations/messages.pot34
11 files changed, 440 insertions, 20 deletions
diff --git a/bin/taler-merchant-demos b/bin/taler-merchant-demos
index e4286a2..ade40cf 100755
--- a/bin/taler-merchant-demos
+++ b/bin/taler-merchant-demos
@@ -40,22 +40,22 @@ UWSGI_LOGFMT = "%(ltime) %(proto) %(method) %(uri) %(proto) => %(status)"
# is accessed via a reverse proxy (like Nginx, for example).
#
# @param command line options.
-def handle_serve_uwsgi(config, whichShop):
- serve_uwsgi = config[whichShop]["uwsgi_serve"].value_string(required=True).lower()
+def handle_serve_uwsgi(config, which_shop):
+ serve_uwsgi = config[which_shop]["uwsgi_serve"].value_string(required=True).lower()
params = ["uwsgi", "uwsgi",
"--master",
"--die-on-term",
"--log-format", UWSGI_LOGFMT,
- "--module", "talermerchantdemos.{}:app".format(whichShop),
+ "--module", "talermerchantdemos.{}:app".format(which_shop),
"--need-app",
"--cache2", "name=paid_articles,items=500"]
if serve_uwsgi == "tcp":
- port = config[whichShop]["uwsgi_port"].value_int(required=True)
+ port = config[which_shop]["uwsgi_port"].value_int(required=True)
spec = ":%d" % (port,)
params.extend(["--socket", spec])
elif serve_uwsgi == "unix":
- spec = config[whichShop]["uwsgi_unixpath"].value_filename(required=True)
- mode = config[whichShop]["uwsgi_unixpath_mode"].value_filename(required=True)
+ spec = config[which_shop]["uwsgi_unixpath"].value_filename(required=True)
+ mode = config[which_shop]["uwsgi_unixpath_mode"].value_filename(required=True)
params.extend(["--socket", spec])
params.extend(["--chmod-socket="+mode])
os.makedirs(os.path.dirname(spec), exist_ok=True)
@@ -71,9 +71,9 @@ def handle_serve_uwsgi(config, whichShop):
# The effect it to launch the blog HTTP service.
#
# @param args command line options.
-def handle_serve_http(config, whichShop, port=None):
+def handle_serve_http(config, which_shop, port=None):
if port is None:
- port = config[whichShop]["http_port"].value_int(required=True)
+ port = config[which_shop]["http_port"].value_int(required=True)
if port is None:
print("'http_port' configuration option is missing")
exit(1)
@@ -84,7 +84,7 @@ def handle_serve_http(config, whichShop, port=None):
"--die-on-term",
"--log-format", UWSGI_LOGFMT,
"--http", spec,
- "--module", "talermerchantdemos.{}:app".format(whichShop))
+ "--module", "talermerchantdemos.{}:app".format(which_shop))
except:
sys.stderr.write("Failed to start uwsgi. Please make sure to install uwsgi for Python3.")
sys.exit(1)
@@ -105,7 +105,7 @@ def handle_serve_from_config(config_obj, which_shop):
@click.argument("which-shop")
def demos(config, http_port, which_shop):
"""
- WHICH_SHOP is one of: blog, donations, or survey.
+ WHICH_SHOP is one of: blog, donations, survey or landing.
"""
if config:
os.environ["TALER_CONFIG_FILE"] = config
diff --git a/setup.py b/setup.py
index 1a031e3..5e8db52 100755
--- a/setup.py
+++ b/setup.py
@@ -18,6 +18,9 @@ setup(name='talermerchantdemos',
# Common
"static/*.css",
"static/*.svg",
+ # Landing files
+ "landing/templates/*.j2",
+ "landing/translations/*/LC_MESSAGES/*.mo",
# Blog files
"blog/templates/*.html",
"blog/templates/*.j2",
diff --git a/talermerchantdemos/landing/__init__.py b/talermerchantdemos/landing/__init__.py
new file mode 100644
index 0000000..b5d856c
--- /dev/null
+++ b/talermerchantdemos/landing/__init__.py
@@ -0,0 +1,3 @@
+from talermerchantdemos.landing.landing import app
+
+__all__ = ["app"]
diff --git a/talermerchantdemos/landing/landing.py b/talermerchantdemos/landing/landing.py
new file mode 100644
index 0000000..6bc4249
--- /dev/null
+++ b/talermerchantdemos/landing/landing.py
@@ -0,0 +1,164 @@
+##
+# This file is part of GNU TALER.
+# Copyright (C) 2017, 2020 Taler Systems SA
+#
+# TALER is free software; you can redistribute it and/or modify it under the
+# terms of the GNU Lesser General Public License as published by the Free Software
+# Foundation; either version 2.1, or (at your option) any later version.
+#
+# TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along with
+# GNU TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+#
+# @author Christian Grothoff
+# @brief Minimal Website for the landing page.
+
+import os
+import re
+import datetime
+import base64
+import logging
+from urllib.parse import urljoin
+import flask
+from flask import request
+from flask_babel import Babel
+from flask_babel import refresh
+from flask_babel import force_locale
+from flask_babel import gettext
+import traceback
+from taler.util.talerconfig import TalerConfig, ConfigurationError
+from ..httpcommon import backend_get, backend_post, self_localized
+import sys
+
+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)
+
+BASE_DIR = os.path.dirname(os.path.abspath(__file__))
+app = flask.Flask(__name__, template_folder=BASE_DIR)
+app.debug = True
+app.secret_key = base64.b64encode(os.urandom(64)).decode('utf-8')
+
+LOGGER = logging.getLogger(__name__)
+TC = TalerConfig.from_env()
+try:
+ BACKEND_URL = TC["frontends"]["backend"].value_string(required=True)
+ CURRENCY = TC["taler"]["currency"].value_string(required=True)
+ APIKEY = TC["frontends"]["backend_apikey"].value_string(required=True)
+except ConfigurationError as ce:
+ print(ce)
+ exit(1)
+
+app.config.from_object(__name__)
+babel = Babel(app)
+
+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))
+
+app.jinja_env.globals.update(self_localized=self_localized)
+
+@babel.localeselector
+def get_locale():
+ parts = request.path.split('/', 2)
+ if (2 >= len(parts)):
+ # Totally unexpected path format, do not localize
+ return "en"
+ lang = parts[1]
+ if lang in translations:
+ return lang
+ return "en"
+
+##
+# Make the environment available into templates.
+#
+# @return the environment-reading function.
+@app.context_processor
+def utility_processor():
+ def env(name, default=None):
+ return os.environ.get(name, default)
+
+ def prettydate(talerdate):
+ parsed_time = re.search(r"/Date\(([0-9]+)\)/", talerdate)
+ if not parsed_time:
+ return "malformed date given"
+ parsed_time = int(parsed_time.group(1))
+ timestamp = datetime.datetime.fromtimestamp(parsed_time)
+ # returns the YYYY-MM-DD date format.
+ return timestamp.strftime("%Y-%b-%d")
+
+ return dict(env=env, prettydate=prettydate)
+
+
+##
+# Exception handler to capture all the unmanaged errors.
+#
+# @param e the Exception object, currently unused.
+# @return flask-native response object carrying the error message
+# (and execution stack!).
+@app.errorhandler(Exception)
+def internal_error(e):
+ return flask.render_template(
+ "templates/error.html.j2",
+ message=gettext("Internal error"),
+ stack=traceback.format_exc(),
+ lang=get_locale()
+ )
+
+##
+# Serve the /favicon.ico requests.
+#
+# @return the favicon.ico file.
+@app.route("/favicon.ico")
+def favicon():
+ LOGGER.info("will look into: " + os.path.join(app.root_path, 'static'))
+ return flask.send_from_directory(
+ os.path.join(app.root_path, 'static'),
+ "favicon.ico",
+ mimetype="image/vnd.microsoft.ico"
+ )
+
+
+##
+# Serve the main index page, redirecting to /<lang>/
+#
+# @return response object of the index page.
+@app.route("/")
+def index():
+ default = 'en'
+ target = flask.request.accept_languages.best_match(translations, default)
+ return flask.redirect("/" + target + "/", code=302)
+
+##
+# Serve the internationalized main index page.
+#
+# @return response object of the index page.
+@app.route("/<lang>/", methods=["GET"])
+def start(lang):
+ return flask.render_template(
+ "templates/index.html.j2",
+ merchant_currency=CURRENCY,
+ lang=lang
+ )
+
+@app.errorhandler(404)
+def handler(e):
+ return flask.render_template(
+ "templates/error.html.j2",
+ message=gettext("Page not found"),
+ lang=get_locale()
+ )
+
+@app.errorhandler(405)
+def handler(e):
+ return flask.render_template(
+ "templates/error.html.j2",
+ message=gettext("HTTP method not allowed for this page"),
+ lang=get_locale()
+ )
diff --git a/talermerchantdemos/landing/static b/talermerchantdemos/landing/static
new file mode 120000
index 0000000..d9bc54d
--- /dev/null
+++ b/talermerchantdemos/landing/static
@@ -0,0 +1 @@
+../static/ \ No newline at end of file
diff --git a/talermerchantdemos/landing/templates/base.html.j2 b/talermerchantdemos/landing/templates/base.html.j2
new file mode 100644
index 0000000..7cf16f1
--- /dev/null
+++ b/talermerchantdemos/landing/templates/base.html.j2
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<!--
+ This file is part of GNU TALER.
+ Copyright (C) 2014, 2015, 2016, 2020 Taler Systems SA
+
+ TALER is free software; you can redistribute it and/or modify it under the
+ terms of the GNU Lesser General Public License as published by the Free Software
+ Foundation; either version 2.1, or (at your option) any later version.
+
+ TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License along with
+ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+-->
+
+<html data-taler-nojs="true">
+<head>
+ <title>{{ gettext("Taler Demo") }}</title>
+ <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='pure.css') }}" />
+ <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='demo.css') }}" />
+ <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='navbar.css') }}" />
+ <style>
+ .warn {
+ background-color: #aa393977;
+ padding: 1em;
+ }
+ @keyframes hoveranim {
+ from {left:0;}
+ to {left:1vw;}
+ }
+ @keyframes hoveranimrevert {
+ from {left:1vw;}
+ to {left:0;}
+ }
+ .notice {
+ border-radius: 1em;
+ background: #0333;
+ border-left: 0.3em solid #033;
+ padding-left: 1em;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ margin-top: 2em;
+ margin-bottom: 2em;
+ }
+ .notice {
+ position: relative;
+ left: 0;
+ animation-name: hoveranimrevert;
+ animation-duration: 1s;
+ }
+ .notice:hover {
+ left: 1vw;
+ animation-name: hoveranim;
+ animation-duration: 1s;
+ }
+ #main a:link, #main a:visited, #main a:hover, #main a:active {
+ color: black;
+ }
+ </style>
+
+ {% block styles %}{% endblock %}
+ {% block scripts %}{% endblock %}
+</head>
+
+<body>
+ <header class="demobar" style="display: flex; flex-direction: column;">
+ <h1><span class="tt adorn-brackets">{{ gettext("Taler Demo") }}</span></h1>
+ <h1><span class="it"><a href="{{ env('TALER_ENV_URL_MERCHANT_SURVEY') }}">{{ gettext("Survey") }}</a></span></h1>
+ <p>{{
+ gettext("This is the Taler demo.") + "<br>" +
+ gettext("Here you can try out the Taler payment system using a toy currency.")
+ }}
+ </p>
+ </header>
+ <div style="display:flex; flex-direction: column;" class="navcontainer">
+ <nav class="demolist">
+ <a href="{{ env('TALER_ENV_URL_INTRO', '#') }}" class="active">{{gettext("Introduction")}}</a>
+ <a href="{{ env('TALER_ENV_URL_BANK', '#') }}">{{gettext("Bank")}}</a>
+ <a href="{{ env('TALER_ENV_URL_MERCHANT_BLOG', '#') }}">{{gettext("Essay Shop")}}</a>
+ <a href="{{ env('TALER_ENV_URL_MERCHANT_DONATIONS', '#') }}">{{gettext("Donations")}}</a>
+ <a href="{{ env('TALER_ENV_URL_MERCHANT_SURVEY', '#') }}">{{gettext("Tipping/Survey")}}</a>
+ <!-- a href="{{ env('TALER_ENV_URL_BACKOFFICE', '#') }}">{{gettext("Back-office")}}</a -->
+ <span class="right">
+ {{ gettext("English [en]") }}
+ <!-- <input type="checkbox"> -->
+ <div class="nav">
+ <br>
+ <!--<hr style="width: 100%;">-->
+ {% if lang != 'en' %}
+ <a href="/en/" class="navbtn">English [en]</a><br>
+ {% endif %}
+ {% if lang != 'de' %}
+ <a href="/de/" class="navbtn">Deutsch [de]</a><br>
+ {% endif %}
+ </div>
+ </span>
+ </nav>
+ </div>
+
+ <section id="main" class="content">
+ {% block main %}
+ This is the main content of the page.
+ {% endblock %}
+ <hr />
+ <div>
+ <p>{{ gettext('You can learn more about Taler on our main <a href="{site}">website</a>.').format(site="https://taler.net/") }}</p>
+ <div style="flex-grow:1"></div>
+ <p>Copyright &copy; 2014&mdash;2020 Taler Systems SA</p>
+ </div>
+ </section>
+</body>
+</html>
diff --git a/talermerchantdemos/landing/templates/error.html.j2 b/talermerchantdemos/landing/templates/error.html.j2
new file mode 100644
index 0000000..009947c
--- /dev/null
+++ b/talermerchantdemos/landing/templates/error.html.j2
@@ -0,0 +1,13 @@
+{% extends "templates/base.html.j2" %}
+{% block main %}
+ <h1>{{ gettext("Error encountered") }}</h1>
+
+ <p>{{ message }}</p>
+
+ {% if stack %}
+ <p>{{gettext("Stack trace:")}}</p>
+ <pre>
+ {{ stack }}
+ </pre>
+ {% endif %}
+{% endblock main %}
diff --git a/talermerchantdemos/landing/templates/index.html.j2 b/talermerchantdemos/landing/templates/index.html.j2
new file mode 100644
index 0000000..cc6b874
--- /dev/null
+++ b/talermerchantdemos/landing/templates/index.html.j2
@@ -0,0 +1,73 @@
+{% extends "templates/base.html.j2" %}
+{% block main %}
+ <article>
+ <h2>Step 1: Install the Taler wallet</h2>
+ Install the wallet from the <a href="https://wallet.taler.net/">installation page</a>.
+ It only takes one click.
+ <p class="bluebox taler-installed-hide">
+ You don't have a wallet installed yet.
+ </p>
+ <p class="greenbox taler-installed-show">
+ Congratulations, you have installed the Taler wallet correctly.
+ You can now proceed with the next steps.
+ </p>
+ </article>
+
+ <article>
+ <h2>Step 2: Withdraw coins</h2>
+ <p>
+
+ Now you can withdraw coins into your wallet by going to our <a href="{{ bank_url }}">bank</a>.
+
+ In this demo you are paying with KUDOS, an imaginary currency. When you
+ create an account at our bank, you'll get 100 KUDOS for free.
+ </p>
+ <p class="graybox">
+ We cannnot check if you were able to complete this step, since websites
+ cannot see the balance in your wallet. Please click on the Taler icon
+ in your browser to check your balance.
+ </p>
+ </article>
+
+ <article>
+ <h2>Step 3: Pay</h2>
+ We have two demo merchants where you can spend your coins:
+ <ul>
+ <li>
+ The <a href="{{ merchant_blog_url }}">essay store</a>, where you can pay KUDOS for
+ individual chapters of Richard Stallman's book "Free Software, Free
+ Society", which is also available for free at <a href="http://www.fsf.org/">the FSF</a>.
+ </li>
+ <li>
+ The <a href="{{ merchant_donations_url }}">project donation website</a>, where
+ you can show respect to a software project of your choice
+ by giving them KUDOS.
+ </li>
+ </ul>
+ </article>
+ <article>
+ <h2>Step 4: Check money flow</h2>
+ <ul>
+ <li>
+ Check if people who received your Taler payment got eventually
+ paid by the exchange via a wire transfer; visit the:
+ <a href="{{ bank_url }}/public-accounts">public accounts page</a> at the bank.
+ Note that only those account whose owners gave permission are showed
+ on that page.
+ </li>
+ </ul>
+ </article>
+ <!-- article>
+ <h2>Step 5: Merchant? Consult back-office</h2>
+ <ul>
+ <li>
+ If you are a merchant, you can check the <a href="{{ backoffice_url }}">back-office</a>
+ website to see how your Taler transactions got payed back by bank wire transfers.
+ </li>
+ </ul>
+ </article -->
+ <article>
+ <h2>Step 5: Reach out to us</h2>
+ Let us know what you think by <a href="mailto:demo-feedback@taler.net">contacting us</a>.
+ </article>
+{% endblock %}
diff --git a/talermerchantdemos/landing/translations b/talermerchantdemos/landing/translations
new file mode 120000
index 0000000..0a951f7
--- /dev/null
+++ b/talermerchantdemos/landing/translations
@@ -0,0 +1 @@
+../../translations/ \ No newline at end of file
diff --git a/translations/de/LC_MESSAGES/messages.po b/translations/de/LC_MESSAGES/messages.po
index 2b4ebe4..e78b5b5 100644
--- a/translations/de/LC_MESSAGES/messages.po
+++ b/translations/de/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: taler-merchant-demos\n"
"Report-Msgid-Bugs-To: taler@gnu.org\n"
-"POT-Creation-Date: 2020-10-11 16:14+0200\n"
+"POT-Creation-Date: 2020-10-11 16:57+0200\n"
"PO-Revision-Date: 2020-10-09 21:25+0200\n"
"Last-Translator: Christian Grothoff <cg@taler.net>\n"
"Language: de\n"
@@ -20,6 +20,7 @@ msgstr ""
#: talermerchantdemos/blog/blog.py:114
#: talermerchantdemos/donations/donations.py:157
+#: talermerchantdemos/landing/landing.py:109
#: talermerchantdemos/survey/survey.py:110
msgid "Internal error"
msgstr "Interner Fehler"
@@ -58,6 +59,7 @@ msgstr ""
#: talermerchantdemos/blog/blog.py:412
#: talermerchantdemos/donations/donations.py:323
+#: talermerchantdemos/landing/landing.py:154
#: talermerchantdemos/survey/survey.py:171
msgid "Page not found"
msgstr ""
@@ -78,6 +80,8 @@ msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:72
#: talermerchantdemos/donations/templates/base.html.j2:69
+#: talermerchantdemos/landing/templates/base.html.j2:20
+#: talermerchantdemos/landing/templates/base.html.j2:69
#: talermerchantdemos/survey/templates/base.html.j2:69
msgid "Taler Demo"
msgstr "Taler Demonstrator"
@@ -104,18 +108,21 @@ msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:83
#: talermerchantdemos/donations/templates/base.html.j2:80
+#: talermerchantdemos/landing/templates/base.html.j2:79
#: talermerchantdemos/survey/templates/base.html.j2:80
msgid "Introduction"
msgstr "Einführung"
#: talermerchantdemos/blog/templates/base.html.j2:84
#: talermerchantdemos/donations/templates/base.html.j2:81
+#: talermerchantdemos/landing/templates/base.html.j2:80
#: talermerchantdemos/survey/templates/base.html.j2:81
msgid "Bank"
msgstr "Bank"
#: talermerchantdemos/blog/templates/base.html.j2:85
#: talermerchantdemos/donations/templates/base.html.j2:82
+#: talermerchantdemos/landing/templates/base.html.j2:81
#: talermerchantdemos/survey/templates/base.html.j2:82
msgid "Essay Shop"
msgstr ""
@@ -123,36 +130,42 @@ msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:86
#: talermerchantdemos/donations/templates/base.html.j2:70
#: talermerchantdemos/donations/templates/base.html.j2:83
+#: talermerchantdemos/landing/templates/base.html.j2:82
#: talermerchantdemos/survey/templates/base.html.j2:83
msgid "Donations"
msgstr "Spenden"
#: talermerchantdemos/blog/templates/base.html.j2:87
#: talermerchantdemos/donations/templates/base.html.j2:84
+#: talermerchantdemos/landing/templates/base.html.j2:83
#: talermerchantdemos/survey/templates/base.html.j2:84
msgid "Tipping/Survey"
msgstr "Umfrage"
#: talermerchantdemos/blog/templates/base.html.j2:88
#: talermerchantdemos/donations/templates/base.html.j2:85
+#: talermerchantdemos/landing/templates/base.html.j2:84
#: talermerchantdemos/survey/templates/base.html.j2:85
msgid "Back-office"
msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:90
#: talermerchantdemos/donations/templates/base.html.j2:87
+#: talermerchantdemos/landing/templates/base.html.j2:86
#: talermerchantdemos/survey/templates/base.html.j2:87
msgid "English [en]"
msgstr "Deutsch [de]"
#: talermerchantdemos/blog/templates/base.html.j2:112
#: talermerchantdemos/donations/templates/base.html.j2:109
+#: talermerchantdemos/landing/templates/base.html.j2:108
#: talermerchantdemos/survey/templates/base.html.j2:109
msgid "You can learn more about Taler on our main <a href=\"{site}\">website</a>."
msgstr ""
#: talermerchantdemos/blog/templates/error.html.j2:3
#: talermerchantdemos/donations/templates/error.html.j2:3
+#: talermerchantdemos/landing/templates/error.html.j2:3
#: talermerchantdemos/survey/templates/error.html.j2:3
msgid "Error encountered"
msgstr ""
@@ -171,6 +184,7 @@ msgstr ""
#: talermerchantdemos/blog/templates/error.html.j2:19
#: talermerchantdemos/donations/templates/error.html.j2:19
+#: talermerchantdemos/landing/templates/error.html.j2:8
#: talermerchantdemos/survey/templates/error.html.j2:19
msgid "Stack trace:"
msgstr ""
@@ -338,18 +352,28 @@ msgstr ""
msgid "Backend returned error status"
msgstr ""
+#: talermerchantdemos/landing/landing.py:162
#: talermerchantdemos/survey/survey.py:179
msgid "HTTP method not allowed for this page"
msgstr ""
-#: talermerchantdemos/survey/templates/base.html.j2:20
-msgid "Taler Survey Demo"
-msgstr ""
-
+#: talermerchantdemos/landing/templates/base.html.j2:70
#: talermerchantdemos/survey/templates/base.html.j2:70
msgid "Survey"
msgstr "Umfrage"
+#: talermerchantdemos/landing/templates/base.html.j2:72
+msgid "This is the Taler demo."
+msgstr ""
+
+#: talermerchantdemos/landing/templates/base.html.j2:73
+msgid "Here you can try out the Taler payment system using a toy currency."
+msgstr ""
+
+#: talermerchantdemos/survey/templates/base.html.j2:20
+msgid "Taler Survey Demo"
+msgstr ""
+
#: talermerchantdemos/survey/templates/base.html.j2:72
msgid "This is the Taler survey demonstration."
msgstr ""
diff --git a/translations/messages.pot b/translations/messages.pot
index 05549ae..5e626cf 100644
--- a/translations/messages.pot
+++ b/translations/messages.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-10-11 16:14+0200\n"
+"POT-Creation-Date: 2020-10-11 16:57+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"
@@ -19,6 +19,7 @@ msgstr ""
#: talermerchantdemos/blog/blog.py:114
#: talermerchantdemos/donations/donations.py:157
+#: talermerchantdemos/landing/landing.py:109
#: talermerchantdemos/survey/survey.py:110
msgid "Internal error"
msgstr ""
@@ -57,6 +58,7 @@ msgstr ""
#: talermerchantdemos/blog/blog.py:412
#: talermerchantdemos/donations/donations.py:323
+#: talermerchantdemos/landing/landing.py:154
#: talermerchantdemos/survey/survey.py:171
msgid "Page not found"
msgstr ""
@@ -77,6 +79,8 @@ msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:72
#: talermerchantdemos/donations/templates/base.html.j2:69
+#: talermerchantdemos/landing/templates/base.html.j2:20
+#: talermerchantdemos/landing/templates/base.html.j2:69
#: talermerchantdemos/survey/templates/base.html.j2:69
msgid "Taler Demo"
msgstr ""
@@ -103,18 +107,21 @@ msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:83
#: talermerchantdemos/donations/templates/base.html.j2:80
+#: talermerchantdemos/landing/templates/base.html.j2:79
#: talermerchantdemos/survey/templates/base.html.j2:80
msgid "Introduction"
msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:84
#: talermerchantdemos/donations/templates/base.html.j2:81
+#: talermerchantdemos/landing/templates/base.html.j2:80
#: talermerchantdemos/survey/templates/base.html.j2:81
msgid "Bank"
msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:85
#: talermerchantdemos/donations/templates/base.html.j2:82
+#: talermerchantdemos/landing/templates/base.html.j2:81
#: talermerchantdemos/survey/templates/base.html.j2:82
msgid "Essay Shop"
msgstr ""
@@ -122,36 +129,42 @@ msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:86
#: talermerchantdemos/donations/templates/base.html.j2:70
#: talermerchantdemos/donations/templates/base.html.j2:83
+#: talermerchantdemos/landing/templates/base.html.j2:82
#: talermerchantdemos/survey/templates/base.html.j2:83
msgid "Donations"
msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:87
#: talermerchantdemos/donations/templates/base.html.j2:84
+#: talermerchantdemos/landing/templates/base.html.j2:83
#: talermerchantdemos/survey/templates/base.html.j2:84
msgid "Tipping/Survey"
msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:88
#: talermerchantdemos/donations/templates/base.html.j2:85
+#: talermerchantdemos/landing/templates/base.html.j2:84
#: talermerchantdemos/survey/templates/base.html.j2:85
msgid "Back-office"
msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:90
#: talermerchantdemos/donations/templates/base.html.j2:87
+#: talermerchantdemos/landing/templates/base.html.j2:86
#: talermerchantdemos/survey/templates/base.html.j2:87
msgid "English [en]"
msgstr ""
#: talermerchantdemos/blog/templates/base.html.j2:112
#: talermerchantdemos/donations/templates/base.html.j2:109
+#: talermerchantdemos/landing/templates/base.html.j2:108
#: talermerchantdemos/survey/templates/base.html.j2:109
msgid "You can learn more about Taler on our main <a href=\"{site}\">website</a>."
msgstr ""
#: talermerchantdemos/blog/templates/error.html.j2:3
#: talermerchantdemos/donations/templates/error.html.j2:3
+#: talermerchantdemos/landing/templates/error.html.j2:3
#: talermerchantdemos/survey/templates/error.html.j2:3
msgid "Error encountered"
msgstr ""
@@ -170,6 +183,7 @@ msgstr ""
#: talermerchantdemos/blog/templates/error.html.j2:19
#: talermerchantdemos/donations/templates/error.html.j2:19
+#: talermerchantdemos/landing/templates/error.html.j2:8
#: talermerchantdemos/survey/templates/error.html.j2:19
msgid "Stack trace:"
msgstr ""
@@ -337,18 +351,28 @@ msgstr ""
msgid "Backend returned error status"
msgstr ""
+#: talermerchantdemos/landing/landing.py:162
#: talermerchantdemos/survey/survey.py:179
msgid "HTTP method not allowed for this page"
msgstr ""
-#: talermerchantdemos/survey/templates/base.html.j2:20
-msgid "Taler Survey Demo"
-msgstr ""
-
+#: talermerchantdemos/landing/templates/base.html.j2:70
#: talermerchantdemos/survey/templates/base.html.j2:70
msgid "Survey"
msgstr ""
+#: talermerchantdemos/landing/templates/base.html.j2:72
+msgid "This is the Taler demo."
+msgstr ""
+
+#: talermerchantdemos/landing/templates/base.html.j2:73
+msgid "Here you can try out the Taler payment system using a toy currency."
+msgstr ""
+
+#: talermerchantdemos/survey/templates/base.html.j2:20
+msgid "Taler Survey Demo"
+msgstr ""
+
#: talermerchantdemos/survey/templates/base.html.j2:72
msgid "This is the Taler survey demonstration."
msgstr ""