summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--poetry.lock348
-rw-r--r--pyproject.toml58
-rwxr-xr-xsetup.py49
l---------talermerchantdemos/blog/articles/pt_BR1
-rw-r--r--talermerchantdemos/blog/blog.py32
-rw-r--r--talermerchantdemos/blog/content.py3
-rw-r--r--[-rwxr-xr-x]talermerchantdemos/cli.py (renamed from bin/taler-merchant-demos)76
-rw-r--r--talermerchantdemos/donations/donations.py4
-rw-r--r--talermerchantdemos/httpcommon/__init__.py29
-rw-r--r--talermerchantdemos/landing/landing.py4
-rw-r--r--talermerchantdemos/survey/survey.py4
-rw-r--r--talermerchantdemos/templates/blog-base.html.j22
-rw-r--r--talermerchantdemos/templates/common-base.html.j22
-rw-r--r--talermerchantdemos/templates/donations-base.html.j22
-rw-r--r--talermerchantdemos/templates/survey-index.html.j22
-rw-r--r--talermerchantdemos/translations/it/LC_MESSAGES/messages.po61
-rw-r--r--talermerchantdemos/translations/pt_BR/LC_MESSAGES/messages.po600
18 files changed, 549 insertions, 729 deletions
diff --git a/.gitignore b/.gitignore
index f14b51b..d7cf17a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,5 @@ translations/*/LC_MESSAGES/messages.mo
config.mk
*~
.sass-cache
+dist/
.vscode
diff --git a/poetry.lock b/poetry.lock
new file mode 100644
index 0000000..8529e3a
--- /dev/null
+++ b/poetry.lock
@@ -0,0 +1,348 @@
+[[package]]
+name = "babel"
+version = "2.9.1"
+description = "Internationalization utilities"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.dependencies]
+pytz = ">=2015.7"
+
+[[package]]
+name = "beautifulsoup4"
+version = "4.10.0"
+description = "Screen-scraping library"
+category = "main"
+optional = false
+python-versions = ">3.0.0"
+
+[package.dependencies]
+soupsieve = ">1.2"
+
+[package.extras]
+html5lib = ["html5lib"]
+lxml = ["lxml"]
+
+[[package]]
+name = "certifi"
+version = "2021.10.8"
+description = "Python package for providing Mozilla's CA Bundle."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "charset-normalizer"
+version = "2.0.7"
+description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+category = "main"
+optional = false
+python-versions = ">=3.5.0"
+
+[package.extras]
+unicode_backport = ["unicodedata2"]
+
+[[package]]
+name = "click"
+version = "8.0.3"
+description = "Composable command line interface toolkit"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[[package]]
+name = "colorama"
+version = "0.4.4"
+description = "Cross-platform colored terminal text."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "flask"
+version = "2.0.2"
+description = "A simple framework for building complex web applications."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+click = ">=7.1.2"
+itsdangerous = ">=2.0"
+Jinja2 = ">=3.0"
+Werkzeug = ">=2.0"
+
+[package.extras]
+async = ["asgiref (>=3.2)"]
+dotenv = ["python-dotenv"]
+
+[[package]]
+name = "flask-babel"
+version = "2.0.0"
+description = "Adds i18n/l10n support to Flask applications"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+Babel = ">=2.3"
+Flask = "*"
+Jinja2 = ">=2.5"
+pytz = "*"
+
+[package.extras]
+dev = ["pytest", "pytest-mock", "bumpversion", "ghp-import", "sphinx", "pallets-sphinx-themes"]
+
+[[package]]
+name = "idna"
+version = "3.3"
+description = "Internationalized Domain Names in Applications (IDNA)"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[[package]]
+name = "itsdangerous"
+version = "2.0.1"
+description = "Safely pass data to untrusted environments and back."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "jinja2"
+version = "3.0.2"
+description = "A very fast and expressive template engine."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+MarkupSafe = ">=2.0"
+
+[package.extras]
+i18n = ["Babel (>=2.7)"]
+
+[[package]]
+name = "markupsafe"
+version = "2.0.1"
+description = "Safely add untrusted strings to HTML/XML markup."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "pytz"
+version = "2021.3"
+description = "World timezone definitions, modern and historical"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "requests"
+version = "2.26.0"
+description = "Python HTTP for Humans."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""}
+idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""}
+urllib3 = ">=1.21.1,<1.27"
+
+[package.extras]
+socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
+use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
+
+[[package]]
+name = "soupsieve"
+version = "2.2.1"
+description = "A modern CSS selector implementation for Beautiful Soup."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "taler-util"
+version = "0.8.3"
+description = "Util library for GNU Taler"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "urllib3"
+version = "1.26.7"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+
+[package.extras]
+brotli = ["brotlipy (>=0.6.0)"]
+secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
+socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
+
+[[package]]
+name = "werkzeug"
+version = "2.0.2"
+description = "The comprehensive WSGI web application library."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+watchdog = ["watchdog"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = "^3.8"
+content-hash = "0a8bd3c73fbceb159d7af4b517aedb0d80060648bc5779bc0e05181d4ed4da20"
+
+[metadata.files]
+babel = [
+ {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"},
+ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"},
+]
+beautifulsoup4 = [
+ {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"},
+ {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"},
+]
+certifi = [
+ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
+ {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
+]
+charset-normalizer = [
+ {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"},
+ {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"},
+]
+click = [
+ {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"},
+ {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"},
+]
+colorama = [
+ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
+ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
+]
+flask = [
+ {file = "Flask-2.0.2-py3-none-any.whl", hash = "sha256:cb90f62f1d8e4dc4621f52106613488b5ba826b2e1e10a33eac92f723093ab6a"},
+ {file = "Flask-2.0.2.tar.gz", hash = "sha256:7b2fb8e934ddd50731893bdcdb00fc8c0315916f9fcd50d22c7cc1a95ab634e2"},
+]
+flask-babel = [
+ {file = "Flask-Babel-2.0.0.tar.gz", hash = "sha256:f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d"},
+ {file = "Flask_Babel-2.0.0-py3-none-any.whl", hash = "sha256:e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468"},
+]
+idna = [
+ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
+ {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
+]
+itsdangerous = [
+ {file = "itsdangerous-2.0.1-py3-none-any.whl", hash = "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c"},
+ {file = "itsdangerous-2.0.1.tar.gz", hash = "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"},
+]
+jinja2 = [
+ {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"},
+ {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"},
+]
+markupsafe = [
+ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
+ {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
+]
+pytz = [
+ {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"},
+ {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
+]
+requests = [
+ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
+ {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"},
+]
+soupsieve = [
+ {file = "soupsieve-2.2.1-py3-none-any.whl", hash = "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b"},
+ {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"},
+]
+taler-util = [
+ {file = "taler-util-0.8.3.tar.gz", hash = "sha256:3ff81faf6dff494ae1727d47cec9d853d8719f9d5325a1e7775fa3cc9ded88c1"},
+ {file = "taler_util-0.8.3-py3-none-any.whl", hash = "sha256:b00105961024ce73f3142aaa6379e17251815ce7bc4b3a472d91efd9089a5003"},
+]
+urllib3 = [
+ {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"},
+ {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
+]
+werkzeug = [
+ {file = "Werkzeug-2.0.2-py3-none-any.whl", hash = "sha256:63d3dc1cf60e7b7e35e97fa9861f7397283b75d765afcaefd993d6046899de8f"},
+ {file = "Werkzeug-2.0.2.tar.gz", hash = "sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a"},
+]
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..5edb8b6
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,58 @@
+[tool.poetry]
+name = "talermerchantdemos"
+version = "0.8.2"
+description = "Taler merchant demos"
+authors = [
+ "Florian Dold <dold@taler.net>",
+ "Marcello Stanisci <ms@taler.net>",
+ "Christian Grothoff <grothoff@taler.net>",
+]
+license = "AGPL3+"
+include = [
+ # Common
+ "static/*.css",
+ "static/*.svg",
+ "templates/*.j2",
+ # Landing files
+ "landing/templates/*.j2",
+ "landing/static/*.css",
+ "landing/translations/*/LC_MESSAGES/*.mo",
+ # Blog files
+ "blog/templates/*.html",
+ "blog/templates/*.j2",
+ "blog/static/favicon.ico",
+ "blog/static/*.css",
+ #"blog/articles/*/*",
+ "blog/translations/*/LC_MESSAGES/*.mo",
+ "translations/*/LC_MESSAGES/*.mo",
+ "blog/data/*",
+ # Donation files
+ "donations/templates/*.j2",
+ "donations/static/*.css",
+ "donations/translations/*/LC_MESSAGES/*.mo",
+ # Survey files
+ "survey/templates/*.j2",
+ "survey/static/favicon.ico",
+ "survey/static/*.js",
+ "survey/static/*.css",
+ "survey/translations/*/LC_MESSAGES/*.mo",
+]
+
+
+[tool.poetry.dependencies]
+python = "^3.8"
+Flask = "^2.0.2"
+requests = "^2.26.0"
+taler-util = "^0.8.3"
+beautifulsoup4 = "^4.10.0"
+Flask-Babel = "^2.0.0"
+
+[tool.poetry.dev-dependencies]
+
+[tool.poetry.scripts]
+taler-merchant-demos = 'talermerchantdemos.cli:run'
+
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
diff --git a/setup.py b/setup.py
deleted file mode 100755
index f1f54be..0000000
--- a/setup.py
+++ /dev/null
@@ -1,49 +0,0 @@
-from setuptools import setup, find_packages
-
-setup(name='talermerchantdemos',
- version='0.8.0',
- description='Example blog/donations/survey sites for GNU Taler',
- url='git://taler.net/taler-merchant-demos',
- author=['Marcello Stanisci', 'Florian Dold', 'Christian Grothoff'],
- author_email=['ms@taler.net', 'florian@dold.me', 'cg@taler.net'],
- license='AGPL',
- packages=find_packages(),
- install_requires=["Flask>=0.10",
- "beautifulsoup4",
- "flask_babel",
- "jsmin",
- "requests",
- "taler-util"],
- package_data={
- '':[
- # Common
- "static/*.css",
- "static/*.svg",
- "templates/*.j2",
- # Landing files
- "landing/templates/*.j2",
- "landing/static/*.css",
- "landing/translations/*/LC_MESSAGES/*.mo",
- # Blog files
- "blog/templates/*.html",
- "blog/templates/*.j2",
- "blog/static/favicon.ico",
- "blog/static/*.css",
- "blog/articles/*/*",
- "blog/translations/*/LC_MESSAGES/*.mo",
- "translations/*/LC_MESSAGES/*.mo",
- "blog/data/*",
- # Donation files
- "donations/templates/*.j2",
- "donations/static/*.css",
- "donations/translations/*/LC_MESSAGES/*.mo",
- # Survey files
- "survey/templates/*.j2",
- "survey/static/favicon.ico",
- "survey/static/*.js",
- "survey/static/*.css",
- "survey/translations/*/LC_MESSAGES/*.mo",
- ]
- },
- scripts=['./bin/taler-merchant-demos'],
- zip_safe=False)
diff --git a/talermerchantdemos/blog/articles/pt_BR b/talermerchantdemos/blog/articles/pt_BR
deleted file mode 120000
index 9e3340e..0000000
--- a/talermerchantdemos/blog/articles/pt_BR
+++ /dev/null
@@ -1 +0,0 @@
-pt \ No newline at end of file
diff --git a/talermerchantdemos/blog/blog.py b/talermerchantdemos/blog/blog.py
index 7a1fbf1..c257eb8 100644
--- a/talermerchantdemos/blog/blog.py
+++ b/talermerchantdemos/blog/blog.py
@@ -29,6 +29,7 @@ from flask_babel import Babel
from flask_babel import refresh
from flask_babel import force_locale
from flask_babel import gettext
+from werkzeug.middleware.proxy_fix import ProxyFix
import time
import sys
from urllib.parse import urljoin, urlencode, urlparse
@@ -78,6 +79,7 @@ if not sys.version_info.major == 3 and sys.version_info.minor >= 6:
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")
@@ -136,7 +138,7 @@ def internal_error(e):
def index():
default = "en"
target = flask.request.accept_languages.best_match(translations, default)
- return flask.redirect("/" + target + "/", code=302)
+ return flask.redirect(target + "/", code=302)
##
@@ -390,18 +392,38 @@ def article(article_name, lang=None, data=None):
if ai is not None and au is not None:
response = flask.redirect(au)
response.set_cookie(
- "order_id", ai, path=urllib.parse.quote(f"/essay/{article_name}")
+ "order_id",
+ ai,
+ path=urllib.parse.quote(
+ flask.request.environ.get("SCRIPT_NAME", "") + f"/essay/{article_name}"
+ )
)
response.set_cookie(
- "order_id", ai, path=urllib.parse.quote(f"/{lang}/essay/{article_name}")
+ "order_id",
+ ai,
+ path=urllib.parse.quote(
+ flask.request.environ.get("SCRIPT_NAME", "") + f"/{lang}/essay/{article_name}"
+ )
)
return response
# Redirect the browser to a page where the wallet can
# run the payment protocol.
response = flask.redirect(pay_status["order_status_url"])
- response.set_cookie("order_id", order_id, path=f"/essay/{article_name}")
- response.set_cookie("order_id", order_id, path=f"/{lang}/essay/{article_name}")
+ response.set_cookie(
+ "order_id",
+ order_id,
+ path=urllib.parse.quote(
+ flask.request.environ["SCRIPT_NAME"] + f"/essay/{article_name}"
+ )
+ )
+ response.set_cookie(
+ "order_id",
+ order_id,
+ path=urllib.parse.quote(
+ flask.request.environ["SCRIPT_NAME"] + f"/{lang}/essay/{article_name}"
+ )
+ )
return response
diff --git a/talermerchantdemos/blog/content.py b/talermerchantdemos/blog/content.py
index d049718..658f017 100644
--- a/talermerchantdemos/blog/content.py
+++ b/talermerchantdemos/blog/content.py
@@ -99,7 +99,8 @@ def add_from_html(resource_name, lang):
title = resource_name
else:
title = title_el.get_text().strip()
- slug = quote(title.replace(" ", "_"), safe="")
+ slug = title.replace(" ", "_")
+ # slug = quote(title.replace(" ", "_"), safe="")
teaser = soup.find("p", attrs={"id": ["teaser"]})
if teaser is None:
diff --git a/bin/taler-merchant-demos b/talermerchantdemos/cli.py
index b252bb6..78f9049 100755..100644
--- a/bin/taler-merchant-demos
+++ b/talermerchantdemos/cli.py
@@ -1,21 +1,19 @@
-#!/usr/bin/env python3
-
##
-# This file is part of TALER
-# (C) 2017 INRIA
+# This file is part of GNU Taler
+# (C) 2017,2021 Taler Systems S.A.
#
-# TALER is free software; you can redistribute it and/or
+# GNU Taler is free software; you can redistribute it and/or
# modify it under the terms of the GNU Affero General Public
# License as published by the Free Software Foundation; either
# version 3, or (at your option) any later version.
#
-# TALER is distributed in the hope that it will be useful,
+# GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public
-# License along with TALER; see the file COPYING. If not,
+# License along with GNU Taler; see the file COPYING. If not,
# see <http://www.gnu.org/licenses/>
#
# @author Florian Dold
@@ -59,7 +57,7 @@ def handle_serve_uwsgi(config, which_shop):
"talermerchantdemos.{}:app".format(which_shop),
"--need-app",
"--cache2",
- "name=paid_articles,items=500",
+ "name=paid_articles,items=500"
]
if serve_uwsgi == "tcp":
port = config[which_shop]["uwsgi_port"].value_int(required=True)
@@ -87,33 +85,47 @@ def handle_serve_uwsgi(config, which_shop):
#
# @param args command line options.
def handle_serve_http(config, which_shop, port=None):
- if port is None:
- port = config[which_shop]["http_port"].value_int(required=True)
- if port is None:
- print("'http_port' configuration option is missing")
- exit(1)
- spec = ":%d" % (port,)
+ params = [
+ "uwsgi",
+ "uwsgi",
+ *arg_load_python,
+ "--master",
+ "--die-on-term",
+ "--log-format",
+ UWSGI_LOGFMT,
+ "--module",
+ "talermerchantdemos.{}:app".format(which_shop),
+ ]
+
+ # Takes precedence.
+ if port:
+ http_serve = "tcp"
+ else:
+ http_serve = config[which_shop]["http_serve"].value_string(
+ required=False,
+ default="tcp"
+ ).lower()
+
+ if http_serve == "tcp":
+ port_launch = config[which_shop]["http_port"].value_int(required=False) if not port else port
+ if not port_launch:
+ sys.stderr.write("Port number wasn't found in config and in arguments.")
+ exit(1)
+ params.extend(["--http", f":{port_launch}"])
+
+ if http_serve == "unix":
+ path = config[which_shop]["http_unixpath"].value_filename(required=True)
+ mode = config[which_shop]["http_unixpath_mode"].value_filename(required=True)
+ params.extend(["--http-socket", path])
+ params.extend(["--chmod-socket=" + mode])
+ os.makedirs(os.path.dirname(path), exist_ok=True)
+
try:
- os.execlp(
- "uwsgi",
- "uwsgi",
- *arg_load_python,
- "--master",
- "--die-on-term",
- "--log-format",
- UWSGI_LOGFMT,
- "--http",
- spec,
- "--module",
- "talermerchantdemos.{}:app".format(which_shop),
- )
+ os.execlp(*params)
except:
- sys.stderr.write(
- "Failed to start uwsgi. Please make sure to install uwsgi for Python3."
- )
+ sys.stderr.write("Failed to start uwsgi. Please make sure to install uwsgi for Python3.")
sys.exit(1)
-
def handle_serve_from_config(config_obj, which_shop):
try:
if (
@@ -128,7 +140,7 @@ def handle_serve_from_config(config_obj, which_shop):
@click.command("Global shop launcher")
-@click.option("--config", help="Configuration file", required=False)
+@click.option("-c", "--config", help="Configuration file", required=False)
@click.option(
"--http-port",
help="HTTP port to serve (if not given, serving comes from config)",
diff --git a/talermerchantdemos/donations/donations.py b/talermerchantdemos/donations/donations.py
index 01e8f12..dd42713 100644
--- a/talermerchantdemos/donations/donations.py
+++ b/talermerchantdemos/donations/donations.py
@@ -25,6 +25,7 @@ from flask_babel import Babel
from flask_babel import refresh
from flask_babel import force_locale
from flask_babel import gettext
+from werkzeug.middleware.proxy_fix import ProxyFix
import os
import time
import traceback
@@ -48,6 +49,7 @@ LOGGER = logging.getLogger(__name__)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
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")
@@ -158,7 +160,7 @@ def favicon():
def index():
default = "en"
target = flask.request.accept_languages.best_match(translations, default)
- return flask.redirect("/" + target + "/", code=302)
+ return flask.redirect(target + "/", code=302)
##
diff --git a/talermerchantdemos/httpcommon/__init__.py b/talermerchantdemos/httpcommon/__init__.py
index 8d3357c..a8ac5b1 100644
--- a/talermerchantdemos/httpcommon/__init__.py
+++ b/talermerchantdemos/httpcommon/__init__.py
@@ -144,20 +144,20 @@ class Deadline:
all_languages = {
"en": "English&nbsp;[en]",
- "ar": "Arabic&nbsp;[ar]",
- "zh_Hant": "Chinese&nbsp;[zh]",
- "fr": "French&nbsp;[fr]",
- "de": "German&nbsp;[de]",
- "hi": "Hindi&nbsp;[hi]",
- "it": "Italian&nbsp;[it]",
- "ja": "Japanese&nbsp;[ja]",
- "ko": "Korean&nbsp;[ko]",
- "pt": "Portuguese&nbsp;[pt]",
- "pt_BR": "Portuguese (Brazil)&nbsp;[pt_BR]",
- "ru": "Russian&nbsp;[ru]",
- "es": "Spanish&nbsp;[es]",
- "sv": "Swedish&nbsp;[sv]",
- "tr": "Turkish&nbsp;[tr]",
+ "ar": "عربى&nbsp;[ar]",
+ "zh_Hant": "繁體中文&nbsp;[zh]",
+ "fr": "Français&nbsp;[fr]",
+ "de": "Deutsch&nbsp;[de]",
+ "hi": "हिंदी&nbsp;[hi]",
+ "it": "Italiano&nbsp;[it]",
+ "ja": "日本語&nbsp;[ja]",
+ "ko": "한국어&nbsp;[ko]",
+ "pt": "Português&nbsp;[pt]",
+ "pt_BR": "Português (Brazil)&nbsp;[pt_BR]",
+ "ru": "Ру́сский язы́к&nbsp;[ru]",
+ "es": "Español&nbsp;[es]",
+ "sv": "Svenska&nbsp;[sv]",
+ "tr": "Türk&nbsp;[tr]",
}
@@ -195,6 +195,7 @@ def make_utility_processor(pagename):
getlang=getlang,
all_languages=all_languages,
static=static,
+ script_name=request.environ.get("SCRIPT_NAME", ""),
)
return utility_processor
diff --git a/talermerchantdemos/landing/landing.py b/talermerchantdemos/landing/landing.py
index 58b111f..b628deb 100644
--- a/talermerchantdemos/landing/landing.py
+++ b/talermerchantdemos/landing/landing.py
@@ -27,6 +27,7 @@ from flask_babel import Babel
from flask_babel import refresh
from flask_babel import force_locale
from flask_babel import gettext
+from werkzeug.middleware.proxy_fix import ProxyFix
import traceback
from taler.util.talerconfig import TalerConfig, ConfigurationError
from ..httpcommon import (
@@ -48,6 +49,7 @@ if not sys.version_info.major == 3 and sys.version_info.minor >= 6:
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")
@@ -117,7 +119,7 @@ def favicon():
def index():
default = "en"
target = flask.request.accept_languages.best_match(translations, default)
- return flask.redirect("/" + target + "/", code=302)
+ return flask.redirect(target + "/", code=302)
##
diff --git a/talermerchantdemos/survey/survey.py b/talermerchantdemos/survey/survey.py
index 57acb1d..8c5ebb9 100644
--- a/talermerchantdemos/survey/survey.py
+++ b/talermerchantdemos/survey/survey.py
@@ -28,6 +28,7 @@ from flask_babel import Babel
from flask_babel import refresh
from flask_babel import force_locale
from flask_babel import gettext
+from werkzeug.middleware.proxy_fix import ProxyFix
import traceback
from taler.util.talerconfig import TalerConfig, ConfigurationError
from ..httpcommon import (
@@ -50,6 +51,7 @@ if not sys.version_info.major == 3 and sys.version_info.minor >= 6:
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")
@@ -140,7 +142,7 @@ def submit_survey(lang):
def index():
default = "en"
target = flask.request.accept_languages.best_match(translations, default)
- return flask.redirect("/" + target + "/", code=302)
+ return flask.redirect(target + "/", code=302)
##
diff --git a/talermerchantdemos/templates/blog-base.html.j2 b/talermerchantdemos/templates/blog-base.html.j2
index 771f6ee..abe3158 100644
--- a/talermerchantdemos/templates/blog-base.html.j2
+++ b/talermerchantdemos/templates/blog-base.html.j2
@@ -6,7 +6,7 @@
{% block header_content %}
-<h1><span class="it"><a href="{{ env('TALER_ENV_URL_MERCHANT_BLOG') }}">{{ gettext("Essay shop") }}</a></span></h1>
+<h1><span class="it"><a href="{{ env('TALER_ENV_URL_MERCHANT_BLOG', '#') }}">{{ gettext("Essay shop") }}</a></span></h1>
<p>{{
gettext("On this page you can buy articles using an imaginary currency.") + "<br>" +
gettext("The articles are chapters from Richard Stallman's book &quot;Free Software, Free Society&quot;.") + "<br>" +
diff --git a/talermerchantdemos/templates/common-base.html.j2 b/talermerchantdemos/templates/common-base.html.j2
index fd5a371..2a6be8c 100644
--- a/talermerchantdemos/templates/common-base.html.j2
+++ b/talermerchantdemos/templates/common-base.html.j2
@@ -63,7 +63,7 @@
<br>
{% for lang_code, lang_display in all_languages.items() %}
{% if lang_code != getlang() %}
- <a href="/{{ lang_code }}/" class="navbtn langbtn">{{ lang_display }}</a>
+ <a href="{{ script_name }}/{{ lang_code }}/" class="navbtn langbtn">{{ lang_display }}</a>
<br>
{% endif %}
{% endfor %}
diff --git a/talermerchantdemos/templates/donations-base.html.j2 b/talermerchantdemos/templates/donations-base.html.j2
index b214eac..9f772a4 100644
--- a/talermerchantdemos/templates/donations-base.html.j2
+++ b/talermerchantdemos/templates/donations-base.html.j2
@@ -3,7 +3,7 @@
{% block header_content %}
<h1>
-<span class="it"><a href="{{ env('TALER_ENV_URL_MERCHANT_DONATIONS') }}">{{gettext("Donations")}}</a></span></h1>
+<span class="it"><a href="{{ env('TALER_ENV_URL_MERCHANT_DONATIONS', '#') }}">{{gettext("Donations")}}</a></span></h1>
<p>{{
gettext ("This is the donation page.") + "<br>" +
gettext ("Using this page you can make donations in {currency} to Free Software projects.").format(currency=merchant_currency)
diff --git a/talermerchantdemos/templates/survey-index.html.j2 b/talermerchantdemos/templates/survey-index.html.j2
index d860573..0d0f87a 100644
--- a/talermerchantdemos/templates/survey-index.html.j2
+++ b/talermerchantdemos/templates/survey-index.html.j2
@@ -8,7 +8,7 @@
</p>
</div>
<div>
- <form action="{{ "/" + getlang() + "/submit-survey" }}" method="post" class="pure-form pure-form-stacked">
+ <form action="{{ script_name + "/" + getlang() + "/submit-survey" }}" method="post" class="pure-form pure-form-stacked">
<legend>{{ gettext("Which payment system do you prefer?") }}</legend>
<fieldset>
<label for="option-taler">
diff --git a/talermerchantdemos/translations/it/LC_MESSAGES/messages.po b/talermerchantdemos/translations/it/LC_MESSAGES/messages.po
index d58cd9a..1d882e5 100644
--- a/talermerchantdemos/translations/it/LC_MESSAGES/messages.po
+++ b/talermerchantdemos/translations/it/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: 2021-06-11 07:56+0200\n"
+"POT-Creation-Date: 2021-11-26 21:19+0100\n"
"PO-Revision-Date: 2021-05-13 21:09+0000\n"
"Last-Translator: Stefan <eintritt@hotmail.com>\n"
"Language: it\n"
@@ -17,56 +17,56 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.9.0\n"
+"Generated-By: Babel 2.9.1\n"
-#: talermerchantdemos/blog/blog.py:126 talermerchantdemos/landing/landing.py:93
+#: talermerchantdemos/blog/blog.py:128 talermerchantdemos/landing/landing.py:95
msgid "Internal error"
msgstr "Errore interno"
-#: talermerchantdemos/blog/blog.py:186
+#: talermerchantdemos/blog/blog.py:188
msgid "Cannot refund unpaid article"
msgstr "Impossibile rimborsare un articolo non pagato"
-#: talermerchantdemos/blog/blog.py:193
+#: talermerchantdemos/blog/blog.py:195
msgid "Article is not anymore refundable"
msgstr "L'articolo non è più rimborsabile"
-#: talermerchantdemos/blog/blog.py:229
+#: talermerchantdemos/blog/blog.py:231
msgid "You did not pay for this article (nice try!)"
msgstr "Non hai pagato questo articolo (bel tentativo!)"
-#: talermerchantdemos/blog/blog.py:234
+#: talermerchantdemos/blog/blog.py:236
msgid "Item not refundable (anymore)"
msgstr "Articolo non (più) rimborsabile"
-#: talermerchantdemos/blog/blog.py:260
+#: talermerchantdemos/blog/blog.py:262
msgid "Internal error: Files for article ({}) not found."
msgstr "Errore interno: File per l'articolo ({}) non trovati."
-#: talermerchantdemos/blog/blog.py:267
+#: talermerchantdemos/blog/blog.py:269
msgid "Supplemental file ({}) for article ({}) not found."
msgstr "File supplementare ({}) per l'articolo ({}) non trovato."
-#: talermerchantdemos/blog/blog.py:345 talermerchantdemos/blog/blog.py:359
+#: talermerchantdemos/blog/blog.py:348 talermerchantdemos/blog/blog.py:362
msgid "Direct access forbidden"
msgstr "Accesso diretto vietato"
-#: talermerchantdemos/blog/blog.py:411
+#: talermerchantdemos/blog/blog.py:434
msgid "Internal server error"
msgstr "Errore del server"
-#: talermerchantdemos/blog/blog.py:419
-#: talermerchantdemos/donations/donations.py:284
-#: talermerchantdemos/landing/landing.py:166
-#: talermerchantdemos/survey/survey.py:162
+#: talermerchantdemos/blog/blog.py:442
+#: talermerchantdemos/donations/donations.py:286
+#: talermerchantdemos/landing/landing.py:168
+#: talermerchantdemos/survey/survey.py:164
msgid "Page not found"
msgstr "Pagina non trovata"
-#: talermerchantdemos/donations/donations.py:125
+#: talermerchantdemos/donations/donations.py:127
msgid "parameter '{}' required"
msgstr "parametro '{}' richiesto"
-#: talermerchantdemos/donations/donations.py:242
+#: talermerchantdemos/donations/donations.py:244
msgid "Backend could not create the order"
msgstr ""
@@ -85,8 +85,8 @@ msgstr "Impossibile analizzare la risposta del backend"
msgid "Backend returned error status"
msgstr "Il backend ha segnalato uno stato di errore"
-#: talermerchantdemos/landing/landing.py:174
-#: talermerchantdemos/survey/survey.py:170
+#: talermerchantdemos/landing/landing.py:176
+#: talermerchantdemos/survey/survey.py:172
msgid "HTTP method not allowed for this page"
msgstr "Il metodo HTTP non è permesso in questa pagina"
@@ -108,6 +108,23 @@ msgstr ""
msgid "This article can't be refunded anymore."
msgstr "Articolo non (più) rimborsabile"
+#: talermerchantdemos/templates/blog-article-refunded.html.j2:4
+msgid "Refunded"
+msgstr ""
+
+#: talermerchantdemos/templates/blog-article-refunded.html.j2:8
+msgid ""
+"Your payment (order ID <tt>{order}<tt>) for the article \"{article}\" has"
+" been refunded."
+msgstr ""
+
+#: talermerchantdemos/templates/blog-article-refunded.html.j2:14
+#, fuzzy
+msgid "You will not be able to read the article until you pay for it again."
+msgstr ""
+"Dopo aver ottenuto un rimborso, non sarà più possibile leggere questo "
+"articolo."
+
#: talermerchantdemos/templates/blog-base.html.j2:9
msgid "Essay shop"
msgstr "Negozio di saggistica"
@@ -378,7 +395,7 @@ msgstr "Puoi sempre fare <a href=\"{link}\">altre donazioni</a>."
#: talermerchantdemos/templates/donations-index.html.j2:4
msgid "Donate to Free Software projects"
-msgstr "Dona al progetto Free Software"
+msgstr "Dona a progetti Free Software"
#: talermerchantdemos/templates/donations-index.html.j2:8
msgid ""
@@ -632,6 +649,10 @@ msgstr ""
"Lasciare la mancia è un modo di offrire ricompense in denaro che vanno "
"direttamente nel portafoglio dell'utente."
+#: talermerchantdemos/templates/survey-error-graceful.html.j2:3
+msgid "Unexpected result"
+msgstr ""
+
#: talermerchantdemos/templates/survey-index.html.j2:6
msgid ""
"Please participate in our survey about payment systems and receive a tip "
diff --git a/talermerchantdemos/translations/pt_BR/LC_MESSAGES/messages.po b/talermerchantdemos/translations/pt_BR/LC_MESSAGES/messages.po
deleted file mode 100644
index 33e0e18..0000000
--- a/talermerchantdemos/translations/pt_BR/LC_MESSAGES/messages.po
+++ /dev/null
@@ -1,600 +0,0 @@
-# Portuguese (Brazil) translations for PROJECT.
-# Copyright (C) 2021 ORGANIZATION
-# This file is distributed under the same license as the PROJECT project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PROJECT VERSION\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-06-11 07:56+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language: pt_BR\n"
-"Language-Team: none\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"
-"Generated-By: Babel 2.9.0\n"
-
-#: talermerchantdemos/blog/blog.py:126 talermerchantdemos/landing/landing.py:93
-msgid "Internal error"
-msgstr ""
-
-#: talermerchantdemos/blog/blog.py:186
-msgid "Cannot refund unpaid article"
-msgstr ""
-
-#: talermerchantdemos/blog/blog.py:193
-msgid "Article is not anymore refundable"
-msgstr ""
-
-#: talermerchantdemos/blog/blog.py:229
-msgid "You did not pay for this article (nice try!)"
-msgstr ""
-
-#: talermerchantdemos/blog/blog.py:234
-msgid "Item not refundable (anymore)"
-msgstr ""
-
-#: talermerchantdemos/blog/blog.py:260
-msgid "Internal error: Files for article ({}) not found."
-msgstr ""
-
-#: talermerchantdemos/blog/blog.py:267
-msgid "Supplemental file ({}) for article ({}) not found."
-msgstr ""
-
-#: talermerchantdemos/blog/blog.py:345 talermerchantdemos/blog/blog.py:359
-msgid "Direct access forbidden"
-msgstr ""
-
-#: talermerchantdemos/blog/blog.py:411
-msgid "Internal server error"
-msgstr ""
-
-#: talermerchantdemos/blog/blog.py:419
-#: talermerchantdemos/donations/donations.py:284
-#: talermerchantdemos/landing/landing.py:166
-#: talermerchantdemos/survey/survey.py:162
-msgid "Page not found"
-msgstr ""
-
-#: talermerchantdemos/donations/donations.py:125
-msgid "parameter '{}' required"
-msgstr ""
-
-#: talermerchantdemos/donations/donations.py:242
-msgid "Backend could not create the order"
-msgstr ""
-
-#: talermerchantdemos/httpcommon/__init__.py:40
-#: talermerchantdemos/httpcommon/__init__.py:80
-msgid "Could not establish connection to backend"
-msgstr ""
-
-#: talermerchantdemos/httpcommon/__init__.py:46
-#: talermerchantdemos/httpcommon/__init__.py:85
-msgid "Could not parse response from backend"
-msgstr ""
-
-#: talermerchantdemos/httpcommon/__init__.py:51
-#: talermerchantdemos/httpcommon/__init__.py:88
-msgid "Backend returned error status"
-msgstr ""
-
-#: talermerchantdemos/landing/landing.py:174
-#: talermerchantdemos/survey/survey.py:170
-msgid "HTTP method not allowed for this page"
-msgstr ""
-
-#: talermerchantdemos/templates/blog-article-frame.html.j2:11
-#: talermerchantdemos/templates/blog-article-frame.html.j2:16
-msgid "Taler allows merchants to offer refunds to customers."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-article-frame.html.j2:12
-msgid ""
-"You can <a href=\"{url}\">request a refund</a> within the first hour "
-"after buying this article."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-article-frame.html.j2:17
-msgid "This article can't be refunded anymore."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-base.html.j2:9
-msgid "Essay shop"
-msgstr ""
-
-#: talermerchantdemos/templates/blog-base.html.j2:11
-msgid "On this page you can buy articles using an imaginary currency."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-base.html.j2:12
-msgid ""
-"The articles are chapters from Richard Stallman's book &quot;Free "
-"Software, Free Society&quot;."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-base.html.j2:13
-msgid ""
-"The book is <a href=\"{shop}\">published by the FSF</a> and available "
-"gratis at <a href=\"{gnu}\">gnu.org</a>."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-confirm-refund.html.j2:3
-msgid "Confirm refund request for article"
-msgstr ""
-
-#: talermerchantdemos/templates/blog-confirm-refund.html.j2:7
-msgid "Do you want to get a refund for the article <em>{name}</em>?"
-msgstr ""
-
-#: talermerchantdemos/templates/blog-confirm-refund.html.j2:8
-msgid ""
-"In this demonstration, refunds will be automatically approved by the "
-"merchant."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-confirm-refund.html.j2:9
-msgid ""
-"After you have obtained a refund, you will not be able to read the "
-"article anymore."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-confirm-refund.html.j2:15
-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 ""
-
-#: talermerchantdemos/templates/blog-confirm-refund.html.j2:21
-msgid "Request refund"
-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 ""
-
-#: 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 ""
-
-#: 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 ""
-
-#: 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 ""
-
-#: talermerchantdemos/templates/blog-index.html.j2:3
-msgid "Essay Shop: Free Software, Free Society"
-msgstr ""
-
-#: talermerchantdemos/templates/blog-index.html.j2:5
-msgid ""
-"This is the latest edition of <cite>Free Software, Free Society: Selected"
-" Essays of Richard M. Stallman.</cite>"
-msgstr ""
-
-#: talermerchantdemos/templates/blog-index.html.j2:13
-msgid ""
-"Verbatim copying and distribution of this entire book are permitted "
-"worldwide, without royalty, in any medium, provided this notice is "
-"preserved. Permission is granted to copy and distribute translations of "
-"this book from the original English into another language provided the "
-"translation has been approved by the Free Software Foundation and the "
-"copyright notice and this permission notice are preserved on all copies."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-index.html.j2:18
-msgid "Chapters"
-msgstr ""
-
-#: talermerchantdemos/templates/blog-index.html.j2:20
-msgid "Click on an individual chapter to to purchase it with GNU Taler."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-index.html.j2:21
-msgid ""
-"You can get free, virtual money to buy articles on this page at the <a "
-"href=\"{}\")\">bank</a>."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-index.html.j2:28
-msgid "Pay to read more..."
-msgstr ""
-
-#: talermerchantdemos/templates/blog-index.html.j2:31
-msgid "No articles available in this language."
-msgstr ""
-
-#: talermerchantdemos/templates/common-base.html.j2:20
-msgid "GNU Taler Demo"
-msgstr ""
-
-#: talermerchantdemos/templates/common-base.html.j2:44
-#: talermerchantdemos/templates/landing-base.html.j2:5
-msgid "Introduction"
-msgstr ""
-
-#: talermerchantdemos/templates/common-base.html.j2:47
-msgid "Bank"
-msgstr ""
-
-#: talermerchantdemos/templates/common-base.html.j2:50
-msgid "Essay Shop"
-msgstr ""
-
-#: talermerchantdemos/templates/common-base.html.j2:53
-#: talermerchantdemos/templates/donations-base.html.j2:6
-msgid "Donations"
-msgstr ""
-
-#: talermerchantdemos/templates/common-base.html.j2:56
-msgid "Tipping/Survey"
-msgstr ""
-
-#: talermerchantdemos/templates/common-base.html.j2:85
-msgid ""
-"You can learn more about GNU Taler on our main <a "
-"href=\"{site}\">website</a>."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-base.html.j2:8
-msgid "This is the donation page."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-base.html.j2:9
-msgid ""
-"Using this page you can make donations in {currency} to Free Software "
-"projects."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-checkout.html.j2:5
-msgid "Select your payment method"
-msgstr ""
-
-#: talermerchantdemos/templates/donations-checkout.html.j2:9
-msgid "This is an example for a \"checkout\" page of a Web shop."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-checkout.html.j2:10
-msgid ""
-"On the previous page, you have created the shopping cart and decided "
-"which product to buy (i.e. which project to donate KUDOS to)."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-checkout.html.j2:11
-msgid ""
-"As Taler is not yet universally used, we expect merchants will offer "
-"various payment options."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-checkout.html.j2:12
-msgid "To continue with the demo, select the &quot;Taler&quot; payment option."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-checkout.html.j2:17
-msgid ""
-"Note that you must select Taler here for the demo to continue, as the "
-"other payment options are just placeholders and not really working in the"
-" demonstration."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-checkout.html.j2:18
-msgid ""
-"It would be possible to ask the user to make this choice already on the "
-"previous page (with the shopping cart); we just separated the two steps "
-"to keep each step as simple as possible."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-checkout.html.j2:44
-msgid "Confirm selection"
-msgstr ""
-
-#: talermerchantdemos/templates/donations-fulfillment.html.j2:4
-msgid "Donation Receipt"
-msgstr ""
-
-#: talermerchantdemos/templates/donations-fulfillment.html.j2:7
-msgid ""
-"Thank you, <strong>{donor}</strong>, for donating "
-"<strong>{amount}</strong> to <strong>{receiver}</strong>."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-fulfillment.html.j2:12
-msgid ""
-"Please keep the order identifier <strong>{id}</strong> as a receipt for "
-"your donation."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-fulfillment.html.j2:13
-msgid ""
-"You can show other people that you donated by sharing <a "
-"href=\"{link}\">this link</a> with them."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-fulfillment.html.j2:19
-msgid "You can always make <a href=\"{link}\">another donation</a>."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-index.html.j2:4
-msgid "Donate to Free Software projects"
-msgstr ""
-
-#: talermerchantdemos/templates/donations-index.html.j2:8
-msgid ""
-"This donations website shows the user experience for donations with GNU "
-"Taler."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-index.html.j2:9
-msgid "You can make donations in an toy currency ({currency})"
-msgstr ""
-
-#: talermerchantdemos/templates/donations-index.html.j2:16
-msgid ""
-"Please select a project, the amount (*) of {currency} you wish to donate,"
-" and enter the donor's name that will appear on your receipt:"
-msgstr ""
-
-#: talermerchantdemos/templates/donations-index.html.j2:33
-msgid "Anonymous Donor"
-msgstr ""
-
-#: talermerchantdemos/templates/donations-index.html.j2:34
-msgid "Donate!"
-msgstr ""
-
-#: talermerchantdemos/templates/donations-index.html.j2:39
-msgid ""
-"(*) To make the demo a bit more interesting, the 5 {currency} option is "
-"deliberately implemented with a fault: the merchant will try to make you "
-"donate 6 {currency} instead of the 5 {currency} shown in the form. But "
-"do not worry, you will be given the opportunity to review the final offer"
-" from the merchant in the Taler wallet. That way, Taler protects you "
-"from committing to erroneous payments."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-provider-not-supported.html.j2:4
-msgid "Payment Provider Not Supported"
-msgstr ""
-
-#: talermerchantdemos/templates/donations-provider-not-supported.html.j2:7
-msgid "Unfortunately the selected payment provider is not supported in this demo."
-msgstr ""
-
-#: talermerchantdemos/templates/donations-provider-not-supported.html.j2:8
-msgid "Please go back and select &quot;Taler&quot;."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-base.html.j2:7
-msgid "This is the GNU Taler demo."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-base.html.j2:8
-msgid "Here you can try out the GNU Taler payment system using a toy currency."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:4
-msgid "Step 1: Install the Taler wallet"
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:7
-msgid "Install the wallet from the <a href=\"{link}\">installation page</a>."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:8
-msgid "Installation only takes one click."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:12
-msgid ""
-"After installation, you may be asked to grant the browser-based Taler "
-"wallet additional optional permissions that allow it to improve your user"
-" experience."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:13
-msgid ""
-"These permissions will allow the wallet to automatically open if a page "
-"asks for a Taler payment."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:14
-msgid ""
-"Regardless of the permissions you grant, the wallet will never transmit "
-"information about you or your browsing history to anyone."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:19
-msgid "Step 2: Withdraw coins"
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:22
-msgid "In this demo you are paying with {currency}, an imaginary currency."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:23
-msgid ""
-"To withdraw {currency} coins you must first create an account at our <a "
-"href=\"{bank}\">bank</a>."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:24
-msgid "Signing up only requires you to pick a username and password."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:25
-msgid ""
-"When you create an account at our bank, you will be credited 100 "
-"{currency} for signing up."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:26
-msgid ""
-"Afterwards, use the bank's Web interface to authorize the transfer of "
-"{currency} to your wallet."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:30
-msgid ""
-"Once you have completed this step, you can click on the Taler icon in "
-"your browser to check your balance."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:35
-msgid "Step 3: Pay"
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:38
-msgid "We have two demo merchants where you can spend your coins:"
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:44
-msgid ""
-"At the <a href=\"{blog}\">essay store</a> you can pay in {currency} for "
-"individual chapters of Richard Stallman&#39;s book &quot;Free Software, "
-"Free Society&quot;."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:45
-msgid "The book is also available for free at <a href=\"{fsf}\">the FSF</a>."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:50
-msgid ""
-"At the project <a href=\"{donations}\">donation website</a> you can show "
-"respect to a software project of your choice by donating {currency} to "
-"them."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:56
-msgid "Step 4: Check money flow"
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:59
-msgid ""
-"You can see the wire transfers from the escrow account of the exchange to"
-" the merchants on the <a href=\"{bank}\">public accounts page</a> of the "
-"bank."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:60
-msgid ""
-"Note that only accounts configured to be publicly viewable are shown on "
-"that page."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:65
-msgid "Step 5: Survey"
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:68
-msgid "Websites can give tips to visitors for completing tasks."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:69
-msgid ""
-"You can earn some {currency} coins by filling in our <a "
-"href=\"{url}\">survey</a>."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:81
-msgid "Step 6: Reach out to us"
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:84
-msgid "We appreciate feedback about Taler and this demonstrator."
-msgstr ""
-
-#: talermerchantdemos/templates/landing-index.html.j2:85
-msgid "Let us know what you think by <a href=\"{link}\">contacting us</a>."
-msgstr ""
-
-#: talermerchantdemos/templates/survey-base.html.j2:6
-msgid "Survey"
-msgstr ""
-
-#: talermerchantdemos/templates/survey-base.html.j2:8
-msgid "This page demonstrates how to tip visitors for completing small tasks."
-msgstr ""
-
-#: talermerchantdemos/templates/survey-base.html.j2:9
-msgid ""
-"Tipping is a way for offer cash rewards that go directly into a user's "
-"wallet."
-msgstr ""
-
-#: talermerchantdemos/templates/survey-index.html.j2:6
-msgid ""
-"Please participate in our survey about payment systems and receive a tip "
-"in return."
-msgstr ""
-
-#: talermerchantdemos/templates/survey-index.html.j2:12
-msgid "Which payment system do you prefer?"
-msgstr ""
-
-#: talermerchantdemos/templates/survey-index.html.j2:23
-msgid "Submit Survey"
-msgstr ""
-
-#~ msgid "English [en]"
-#~ msgstr ""
-
-#~ msgid "Spanish [es]"
-#~ msgstr ""
-
-#~ msgid "German [de]"
-#~ msgstr ""
-
-#~ msgid "Swedish [sv]"
-#~ msgstr ""
-
-#~ msgid "GNU Taler Demo: Essay Shop"
-#~ msgstr ""
-
-#~ msgid "Taler Demo"
-#~ msgstr ""
-
-#~ msgid ""
-#~ "You can get free, virtual money to"
-#~ " buy articles on this page at "
-#~ "the <a href=\"{}\")\">bank</a>"
-#~ msgstr ""
-
-#~ msgid "Back-office"
-#~ msgstr ""
-
-#~ msgid "GNU Taler Demo: Donations"
-#~ msgstr ""
-
-#~ msgid "GNU Taler Demo: Introduction"
-#~ msgstr ""
-
-#~ msgid ""
-#~ "You can see the wire transfers "
-#~ "from the escrow account of the "
-#~ "exchange to the merchants on the "
-#~ "<a href=\"{bank}/public-accounts\">public accounts"
-#~ " page</a> of the bank."
-#~ msgstr ""
-
-#~ msgid "GNU Taler Demo: Survey"
-#~ msgstr ""
-