You've already forked snikket-web-portal
Compare commits
18 Commits
feature/up
...
premerge
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f2c79044e0 | ||
|
|
13bc4bb227 | ||
|
|
f1351eb5cc | ||
|
|
41573569af | ||
|
|
b1f3026b8a | ||
|
|
6794314a59 | ||
|
|
077e957a00 | ||
|
|
4902941145 | ||
|
|
5222c8eafe | ||
|
|
03ca7ac5bb | ||
|
|
56cee8bab6 | ||
|
|
eb22688302 | ||
|
|
73fda3d623 | ||
|
|
a998348804 | ||
|
|
20abe4b903 | ||
|
|
a1ecb4ce80 | ||
|
|
b84b84b394 | ||
|
|
6d50b1c2c7 |
23
.github/workflows/main.yaml
vendored
23
.github/workflows/main.yaml
vendored
@@ -50,6 +50,29 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
python -m flake8 snikket_web
|
python -m flake8 snikket_web
|
||||||
|
|
||||||
|
translation-check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
name: 'lint: i18n'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: '3.9'
|
||||||
|
- name: Install
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
pip install flask-babel
|
||||||
|
- name: Linting
|
||||||
|
run: |
|
||||||
|
sed -ri '/^"POT-Creation-Date: /d' snikket_web/translations/messages.pot
|
||||||
|
git add snikket_web/translations/messages.pot
|
||||||
|
make extract_translations
|
||||||
|
sed -ri '/^"POT-Creation-Date: /d' snikket_web/translations/messages.pot
|
||||||
|
git diff --exit-code --color -- snikket_web/translations/messages.pot
|
||||||
|
|
||||||
|
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
[python: snikket_web/**.py]
|
[python: snikket_web/**.py]
|
||||||
[jinja2: snikket_web/templates/**.html]
|
[jinja2: snikket_web/templates/**.html]
|
||||||
[jinja2: snikket_web/templates/**.j2]
|
[jinja2: snikket_web/templates/**.j2]
|
||||||
extensions=jinja2.ext.autoescape,jinja2.ext.with_
|
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ export SNIKKET_WEB_DOMAIN="$SNIKKET_DOMAIN"
|
|||||||
export SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE="${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE-127.0.0.1}"
|
export SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE="${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE-127.0.0.1}"
|
||||||
export SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT="${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT-5765}"
|
export SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT="${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT-5765}"
|
||||||
|
|
||||||
exec hypercorn -b "${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE}:${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT}" 'snikket_web:create_app()'
|
exec hypercorn -b "${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE}:${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT}" --access-logfile=- --log-file=- 'snikket_web:create_app()'
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ hsluv~=5.0
|
|||||||
flask-babel~=1.0
|
flask-babel~=1.0
|
||||||
email-validator~=1.1
|
email-validator~=1.1
|
||||||
environ-config~=20.0
|
environ-config~=20.0
|
||||||
wtforms~=2.3
|
wtforms~=3.0
|
||||||
typing-extensions
|
typing-extensions
|
||||||
|
|||||||
@@ -147,9 +147,13 @@ class AppConfig:
|
|||||||
site_name = environ.var("")
|
site_name = environ.var("")
|
||||||
avatar_cache_ttl = environ.var(1800, converter=int)
|
avatar_cache_ttl = environ.var(1800, converter=int)
|
||||||
languages = environ.var([
|
languages = environ.var([
|
||||||
|
# Keep `en` as the first language, because it is used as a fallback
|
||||||
|
# if the language negotiation cannot find another match. It is more
|
||||||
|
# likely that users are able to read english (or find a suitable
|
||||||
|
# online translator) than, for instance, danish.
|
||||||
|
"en",
|
||||||
"da",
|
"da",
|
||||||
"de",
|
"de",
|
||||||
"en",
|
|
||||||
"fr",
|
"fr",
|
||||||
"id",
|
"id",
|
||||||
"it",
|
"it",
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import werkzeug.exceptions
|
|||||||
import quart.flask_patch
|
import quart.flask_patch
|
||||||
|
|
||||||
import wtforms
|
import wtforms
|
||||||
import wtforms.fields.html5
|
|
||||||
|
|
||||||
from quart import (
|
from quart import (
|
||||||
Blueprint,
|
Blueprint,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import quart.flask_patch # noqa:F401
|
|||||||
from quart import (
|
from quart import (
|
||||||
current_app,
|
current_app,
|
||||||
request,
|
request,
|
||||||
|
g,
|
||||||
)
|
)
|
||||||
|
|
||||||
import flask_babel
|
import flask_babel
|
||||||
@@ -34,6 +35,7 @@ BYTE_UNIT_SCALE_MAP = [
|
|||||||
|
|
||||||
@babel.localeselector # type:ignore
|
@babel.localeselector # type:ignore
|
||||||
def selected_locale() -> str:
|
def selected_locale() -> str:
|
||||||
|
g.language_header_accessed = True
|
||||||
selected = request.accept_languages.best_match(
|
selected = request.accept_languages.best_match(
|
||||||
current_app.config['LANGUAGES']
|
current_app.config['LANGUAGES']
|
||||||
) or current_app.config['LANGUAGES'][0]
|
) or current_app.config['LANGUAGES'][0]
|
||||||
@@ -68,6 +70,12 @@ def format_bytes(n: float) -> str:
|
|||||||
return "{} {}".format(n, unit)
|
return "{} {}".format(n, unit)
|
||||||
|
|
||||||
|
|
||||||
|
def add_vary_language_header(resp: quart.Response) -> quart.Response:
|
||||||
|
if getattr(g, "language_header_accessed", False):
|
||||||
|
resp.vary.add("Accept-Language")
|
||||||
|
return resp
|
||||||
|
|
||||||
|
|
||||||
def init_templating(app: quart.Quart) -> None:
|
def init_templating(app: quart.Quart) -> None:
|
||||||
app.template_filter("repr")(repr)
|
app.template_filter("repr")(repr)
|
||||||
app.template_filter("format_datetime")(flask_babel.format_datetime)
|
app.template_filter("format_datetime")(flask_babel.format_datetime)
|
||||||
@@ -78,6 +86,7 @@ def init_templating(app: quart.Quart) -> None:
|
|||||||
app.template_filter("format_bytes")(format_bytes)
|
app.template_filter("format_bytes")(format_bytes)
|
||||||
app.template_filter("flatten")(flatten)
|
app.template_filter("flatten")(flatten)
|
||||||
app.template_filter("circle_name")(circle_name)
|
app.template_filter("circle_name")(circle_name)
|
||||||
|
app.after_request(add_vary_language_header)
|
||||||
|
|
||||||
|
|
||||||
def generate_error_id() -> str:
|
def generate_error_id() -> str:
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ bp = quart.Blueprint("main", __name__)
|
|||||||
|
|
||||||
|
|
||||||
class LoginForm(BaseForm):
|
class LoginForm(BaseForm):
|
||||||
address = wtforms.TextField(
|
address = wtforms.StringField(
|
||||||
_l("Address"),
|
_l("Address"),
|
||||||
validators=[wtforms.validators.InputRequired()],
|
validators=[wtforms.validators.InputRequired()],
|
||||||
)
|
)
|
||||||
@@ -93,10 +93,16 @@ async def login() -> typing.Union[str, werkzeug.Response]:
|
|||||||
@bp.route("/meta/about.html")
|
@bp.route("/meta/about.html")
|
||||||
async def about() -> str:
|
async def about() -> str:
|
||||||
version = None
|
version = None
|
||||||
|
core_versions = {}
|
||||||
extra_versions = {}
|
extra_versions = {}
|
||||||
|
|
||||||
if current_app.debug or client.is_admin_session:
|
if current_app.debug or client.is_admin_session:
|
||||||
version = _version.version
|
version = _version.version
|
||||||
|
try:
|
||||||
|
core_versions["Prosody"] = await client.get_server_version()
|
||||||
|
except werkzeug.exceptions.Unauthorized:
|
||||||
|
core_versions["Prosody"] = "unknown"
|
||||||
|
|
||||||
|
if current_app.debug:
|
||||||
extra_versions["aiohttp"] = aiohttp.__version__
|
extra_versions["aiohttp"] = aiohttp.__version__
|
||||||
extra_versions["babel"] = babel.__version__
|
extra_versions["babel"] = babel.__version__
|
||||||
extra_versions["wtforms"] = wtforms.__version__
|
extra_versions["wtforms"] = wtforms.__version__
|
||||||
@@ -110,6 +116,7 @@ async def about() -> str:
|
|||||||
"about.html",
|
"about.html",
|
||||||
version=version,
|
version=version,
|
||||||
extra_versions=extra_versions,
|
extra_versions=extra_versions,
|
||||||
|
core_versions=core_versions,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,9 +17,12 @@
|
|||||||
<h3>{% trans %}Trademarks{% endtrans %}</h3>
|
<h3>{% trans %}Trademarks{% endtrans %}</h3>
|
||||||
<p>{% trans trademarks_url="https://snikket.org/about/trademarks/" %}“Snikket” and the parrot logo are trademarks of Snikket Community Interest Company. For more information about the trademarks, visit the <a href="{{ trademarks_url }}">Snikket Trademarks information page</a>.{% endtrans %}
|
<p>{% trans trademarks_url="https://snikket.org/about/trademarks/" %}“Snikket” and the parrot logo are trademarks of Snikket Community Interest Company. For more information about the trademarks, visit the <a href="{{ trademarks_url }}">Snikket Trademarks information page</a>.{% endtrans %}
|
||||||
<h3>{% trans %}Software Versions{% endtrans %}</h3>
|
<h3>{% trans %}Software Versions{% endtrans %}</h3>
|
||||||
<pre>Snikket Server
|
<pre>Domain: {{ config["SNIKKET_DOMAIN"] }}
|
||||||
Domain: {{ config["SNIKKET_DOMAIN"] }}
|
Web Portal{% if version %} ({{ version }}){% endif %}
|
||||||
Snikket Web Portal{% if version %} ({{ version }}){% endif %}
|
{%- if core_versions -%}
|
||||||
|
{% for name, version in core_versions.items() %}
|
||||||
|
{{ name }} ({{ version }}){% endfor %}
|
||||||
|
{%- endif -%}
|
||||||
{%- if extra_versions -%}
|
{%- if extra_versions -%}
|
||||||
{% for name, version in extra_versions.items() %}
|
{% for name, version in extra_versions.items() %}
|
||||||
{{ name }} ({{ version }}){% endfor %}
|
{{ name }} ({{ version }}){% endfor %}
|
||||||
|
|||||||
@@ -11,6 +11,8 @@
|
|||||||
{% call render_errors(form) %}{% endcall %}
|
{% call render_errors(form) %}{% endcall %}
|
||||||
|
|
||||||
<div class="f-bbox">
|
<div class="f-bbox">
|
||||||
|
{%- call standard_button("back", url_for('.index'), class="tertiary") %}{% trans %}Back{% endtrans %}{% endcall -%}
|
||||||
|
|
||||||
<form method="POST">
|
<form method="POST">
|
||||||
{{ form.csrf_token }}
|
{{ form.csrf_token }}
|
||||||
{%- call form_button("download", form.action_export, class="primary") %}{% endcall -%}
|
{%- call form_button("download", form.action_export, class="primary") %}{% endcall -%}
|
||||||
|
|||||||
@@ -8,287 +8,287 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PROJECT VERSION\n"
|
"Project-Id-Version: PROJECT VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2022-01-17 17:27+0100\n"
|
"POT-Creation-Date: 2022-06-06 19:52+0200\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Generated-By: Babel 2.9.1\n"
|
"Generated-By: Babel 2.10.1\n"
|
||||||
|
|
||||||
#: snikket_web/admin.py:68 snikket_web/templates/admin_delete_user.html:10
|
#: snikket_web/admin.py:69 snikket_web/templates/admin_delete_user.html:10
|
||||||
#: snikket_web/templates/admin_edit_circle.html:59
|
#: snikket_web/templates/admin_edit_circle.html:59
|
||||||
#: snikket_web/templates/admin_users.html:8
|
#: snikket_web/templates/admin_users.html:8
|
||||||
msgid "Login name"
|
msgid "Login name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:72 snikket_web/templates/admin_delete_user.html:12
|
#: snikket_web/admin.py:73 snikket_web/templates/admin_delete_user.html:12
|
||||||
#: snikket_web/templates/admin_edit_circle.html:60
|
#: snikket_web/templates/admin_edit_circle.html:60
|
||||||
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
|
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
|
||||||
msgid "Display name"
|
msgid "Display name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:76 snikket_web/templates/admin_edit_user.html:32
|
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
|
||||||
msgid "Access Level"
|
msgid "Access Level"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:78
|
#: snikket_web/admin.py:79
|
||||||
msgid "Limited"
|
msgid "Limited"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:79
|
#: snikket_web/admin.py:80
|
||||||
msgid "Normal user"
|
msgid "Normal user"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:80
|
#: snikket_web/admin.py:81
|
||||||
msgid "Administrator"
|
msgid "Administrator"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:85
|
#: snikket_web/admin.py:86
|
||||||
msgid "Update user"
|
msgid "Update user"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:89
|
#: snikket_web/admin.py:90
|
||||||
msgid "Create password reset link"
|
msgid "Create password reset link"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:107
|
#: snikket_web/admin.py:108
|
||||||
msgid "Password reset link created"
|
msgid "Password reset link created"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:122
|
#: snikket_web/admin.py:123
|
||||||
msgid "User information updated."
|
msgid "User information updated."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:144
|
#: snikket_web/admin.py:145
|
||||||
msgid "Delete user permanently"
|
msgid "Delete user permanently"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:157
|
#: snikket_web/admin.py:158
|
||||||
msgid "User deleted"
|
msgid "User deleted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:195
|
#: snikket_web/admin.py:196
|
||||||
msgid "Password reset link not found"
|
msgid "Password reset link not found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:207
|
#: snikket_web/admin.py:208
|
||||||
msgid "Password reset link deleted"
|
msgid "Password reset link deleted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:227
|
#: snikket_web/admin.py:228
|
||||||
msgid "Invite to circle"
|
msgid "Invite to circle"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:233
|
#: snikket_web/admin.py:234
|
||||||
msgid "At least one circle must be selected"
|
msgid "At least one circle must be selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:238
|
#: snikket_web/admin.py:239
|
||||||
msgid "Valid for"
|
msgid "Valid for"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:240
|
#: snikket_web/admin.py:241
|
||||||
msgid "One hour"
|
msgid "One hour"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:241
|
#: snikket_web/admin.py:242
|
||||||
msgid "Twelve hours"
|
msgid "Twelve hours"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:242
|
#: snikket_web/admin.py:243
|
||||||
msgid "One day"
|
msgid "One day"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:243
|
#: snikket_web/admin.py:244
|
||||||
msgid "One week"
|
msgid "One week"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:244
|
#: snikket_web/admin.py:245
|
||||||
msgid "Four weeks"
|
msgid "Four weeks"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:250 snikket_web/templates/admin_edit_invite.html:17
|
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
|
||||||
msgid "Invitation type"
|
msgid "Invitation type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:252 snikket_web/templates/library.j2:116
|
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
|
||||||
msgid "Individual"
|
msgid "Individual"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:114
|
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
|
||||||
msgid "Group"
|
msgid "Group"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:259
|
#: snikket_web/admin.py:260
|
||||||
msgid "New invitation link"
|
msgid "New invitation link"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:321
|
#: snikket_web/admin.py:322
|
||||||
msgid "Revoke"
|
msgid "Revoke"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:345
|
#: snikket_web/admin.py:346
|
||||||
msgid "Invitation created"
|
msgid "Invitation created"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:361
|
#: snikket_web/admin.py:362
|
||||||
msgid "No such invitation exists"
|
msgid "No such invitation exists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:376
|
#: snikket_web/admin.py:377
|
||||||
msgid "Invitation revoked"
|
msgid "Invitation revoked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:393 snikket_web/admin.py:441
|
#: snikket_web/admin.py:394 snikket_web/admin.py:442
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:398 snikket_web/templates/admin_circles.html:47
|
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
|
||||||
msgid "Create circle"
|
msgid "Create circle"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:428
|
#: snikket_web/admin.py:429
|
||||||
msgid "Circle created"
|
msgid "Circle created"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:446
|
#: snikket_web/admin.py:447
|
||||||
msgid "Select user"
|
msgid "Select user"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:451
|
#: snikket_web/admin.py:452
|
||||||
msgid "Update circle"
|
msgid "Update circle"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:455
|
#: snikket_web/admin.py:456
|
||||||
msgid "Delete circle permanently"
|
msgid "Delete circle permanently"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:461
|
#: snikket_web/admin.py:462
|
||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:477
|
#: snikket_web/admin.py:478
|
||||||
msgid "No such circle exists"
|
msgid "No such circle exists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:514
|
#: snikket_web/admin.py:515
|
||||||
msgid "Circle data updated"
|
msgid "Circle data updated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:520
|
#: snikket_web/admin.py:521
|
||||||
msgid "Circle deleted"
|
msgid "Circle deleted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:531
|
#: snikket_web/admin.py:532
|
||||||
msgid "User added to circle"
|
msgid "User added to circle"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:540
|
#: snikket_web/admin.py:541
|
||||||
msgid "User removed from circle"
|
msgid "User removed from circle"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:609
|
#: snikket_web/admin.py:610
|
||||||
msgid "Message contents"
|
msgid "Message contents"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:615
|
#: snikket_web/admin.py:616
|
||||||
msgid "Only send to online users"
|
msgid "Only send to online users"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:619
|
#: snikket_web/admin.py:620
|
||||||
msgid "Post to all users"
|
msgid "Post to all users"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:623
|
#: snikket_web/admin.py:624
|
||||||
msgid "Send preview to yourself"
|
msgid "Send preview to yourself"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/admin.py:645
|
#: snikket_web/admin.py:646
|
||||||
msgid "Announcement sent!"
|
msgid "Announcement sent!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/infra.py:51
|
#: snikket_web/infra.py:53
|
||||||
msgid "Main"
|
msgid "Main"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:33
|
#: snikket_web/invite.py:35
|
||||||
msgid ""
|
msgid ""
|
||||||
"The account data you tried to import is too large to upload. Please "
|
"The account data you tried to import is too large to upload. Please "
|
||||||
"contact your Snikket operator."
|
"contact your Snikket operator."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:112
|
#: snikket_web/invite.py:114
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:116 snikket_web/invite.py:184 snikket_web/main.py:41
|
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:120 snikket_web/invite.py:188
|
#: snikket_web/invite.py:122 snikket_web/invite.py:190
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:124 snikket_web/invite.py:192
|
#: snikket_web/invite.py:126 snikket_web/invite.py:194
|
||||||
msgid "The passwords must match."
|
msgid "The passwords must match."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:129
|
#: snikket_web/invite.py:131
|
||||||
msgid "Create account"
|
msgid "Create account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:156
|
#: snikket_web/invite.py:158
|
||||||
msgid "That username is already taken."
|
msgid "That username is already taken."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:160 snikket_web/invite.py:225
|
#: snikket_web/invite.py:162 snikket_web/invite.py:227
|
||||||
msgid "Registration was declined for unknown reasons."
|
msgid "Registration was declined for unknown reasons."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:164
|
#: snikket_web/invite.py:166
|
||||||
msgid "The username is not valid."
|
msgid "The username is not valid."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:197 snikket_web/templates/user_home.html:32
|
#: snikket_web/invite.py:199 snikket_web/templates/user_home.html:32
|
||||||
#: snikket_web/templates/user_passwd.html:29
|
#: snikket_web/templates/user_passwd.html:29
|
||||||
msgid "Change password"
|
msgid "Change password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:244
|
#: snikket_web/invite.py:246
|
||||||
msgid "Account data file"
|
msgid "Account data file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:248
|
#: snikket_web/invite.py:250
|
||||||
msgid "Import data"
|
msgid "Import data"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:269
|
#: snikket_web/invite.py:271
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"The account data you tried to import is in an unknown format. Please "
|
"The account data you tried to import is in an unknown format. Please "
|
||||||
"upload an XML file in XEP-0227 format (provided format: %(mimetype)s)."
|
"upload an XML file in XEP-0227 format (provided format: %(mimetype)s)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/invite.py:289 snikket_web/templates/unauth.html:18
|
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
|
||||||
#: snikket_web/user.py:178
|
#: snikket_web/user.py:178
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/main.py:36
|
#: snikket_web/main.py:38
|
||||||
msgid "Address"
|
msgid "Address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/main.py:46
|
#: snikket_web/main.py:48
|
||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/main.py:55
|
#: snikket_web/main.py:57
|
||||||
msgid "Invalid username or password."
|
msgid "Invalid username or password."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/main.py:83
|
#: snikket_web/main.py:85
|
||||||
msgid "Login successful!"
|
msgid "Login successful!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -445,7 +445,7 @@ msgstr ""
|
|||||||
msgid "Software Versions"
|
msgid "Software Versions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: snikket_web/templates/about.html:29
|
#: snikket_web/templates/about.html:32
|
||||||
msgid "Back to the main page"
|
msgid "Back to the main page"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -580,6 +580,7 @@ msgstr ""
|
|||||||
#: snikket_web/templates/admin_delete_user.html:19
|
#: snikket_web/templates/admin_delete_user.html:19
|
||||||
#: snikket_web/templates/admin_reset_user_password.html:25
|
#: snikket_web/templates/admin_reset_user_password.html:25
|
||||||
#: snikket_web/templates/user_logout.html:10
|
#: snikket_web/templates/user_logout.html:10
|
||||||
|
#: snikket_web/templates/user_manage_data.html:14
|
||||||
#: snikket_web/templates/user_passwd.html:27
|
#: snikket_web/templates/user_passwd.html:27
|
||||||
#: snikket_web/templates/user_profile.html:32
|
#: snikket_web/templates/user_profile.html:32
|
||||||
msgid "Back"
|
msgid "Back"
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ _ACCESS_MODEL_CHOICES = [
|
|||||||
|
|
||||||
|
|
||||||
class ProfileForm(BaseForm):
|
class ProfileForm(BaseForm):
|
||||||
nickname = wtforms.TextField(
|
nickname = wtforms.StringField(
|
||||||
_l("Display name"),
|
_l("Display name"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user