Compare commits

...

119 Commits

Author SHA1 Message Date
Matthew Wild
55b195cd7f Update translations 2023-12-08 12:08:43 +00:00
Matthew Wild
46a7d0c37d Fix some type annotations 2023-12-08 12:06:43 +00:00
Matthew Wild
c63b95c6e0 Align avatar flush with left edge of container 2023-12-08 11:42:30 +00:00
Matthew Wild
6848691141 css: Remove avatar border and round the edges to match the app 2023-12-08 11:42:03 +00:00
Matthew Wild
1e83881a24 Ensure we only have a single primary button to reduce confusion 2023-12-08 11:12:26 +00:00
Matthew Wild
35e6bec328 Improvements for admin user listing view 2023-12-08 11:11:31 +00:00
Matthew Wild
d345f0d98d css: Fix dark mode contrast issue for legend text 2023-12-08 11:11:02 +00:00
Matthew Wild
f5ccb7d858 admin: Support for unlocking/restoring locked/deleted user accounts 2023-12-08 11:10:32 +00:00
Matthew Wild
f7c8bccfa2 import-icons.sh: Use sensible defaults where possible 2023-12-08 10:52:48 +00:00
Matthew Wild
e5d06877a4 prosodyclient: Update for new mod_http_admin_api (5c589fab6f53)
This adds new features including:

- User account enabled/disabled status (read and write)
- Deletion status (if an account is scheduled for deletion)
- Avatar metadata
2023-12-08 10:50:23 +00:00
Matthew Wild
e7ed9dd176 infra: Extend time/date utilities 2023-12-08 10:50:06 +00:00
Matthew Wild
6778557db8 On success, return to user listing (edit is complete) 2023-12-08 10:49:26 +00:00
Matthew Wild
73f3f25515 Add lock_open and restore_from_trash icons 2023-12-08 10:45:08 +00:00
Matthew Wild
bd66600d05 Merge pull request #165 from snikket-im/feature/multiple-circle-mucs
Support circles with multiple group chats, remove default group chat
2023-11-06 14:26:11 +00:00
Matthew Wild
db363367da Support circles with multiple group chats, remove default group chat 2023-11-06 13:52:30 +00:00
Matthew Wild
7ce13b55ac Merge pull request #162 from snikket-im/feature/policies-and-contacts
Add policy URLs and contact addresses for instances in the relevant places
2023-10-25 16:19:44 +01:00
Matthew Wild
d6d4bb5afb Add policy URLs and contact addresses for instances in the relevant places 2023-10-25 16:18:12 +01:00
Kim Alvefur
da52771ebe Merge pull request #161 from Zash/fix-logout
Fix revokation of token on logout
2023-10-21 15:57:46 +02:00
Kim Alvefur
e39b6ca8bb Fix revokation of token on logout
In OAuth 2.0, you don't authenticate with the revocation endpoint using
the token you are revoking, but rather the OAuth client credentials.
2023-10-07 17:39:37 +02:00
Kim Alvefur
14368c5e9a Merge pull request #158 from Zash/prosody-split-user-roles
Update for role changes in Prosody
2023-10-07 14:17:58 +02:00
Kim Alvefur
2cdcf7f282 Update for role changes in Prosody
See https://hg.prosody.im/trunk/rev/082c7d856e61
2023-10-07 12:59:43 +02:00
Kim Alvefur
0f1e76e38c Merge pull request #157 from Zash/debian12
Switch base image to Debian 12
2023-10-07 12:58:58 +02:00
Kim Alvefur
ad9af20f12 Workaround for Flask context change 2023-10-04 23:27:05 +02:00
Kim Alvefur
9672cd6870 Install as many packages as possible from Debian
The only missing piece appears to be environ-config.

This **fails to start** with

```
ImportError: cannot import name '_app_ctx_stack' from 'quart' (/usr/lib/python3/dist-packages/quart/__init__.py)
```
2023-10-04 23:27:05 +02:00
Kim Alvefur
d3a6be7bec Switch base image to Debian 12 2023-08-07 08:47:55 +02:00
Kim Alvefur
7a4b56914c Switch to sassc for CSS building
Because https://github.com/Kronuz/pyScss/pull/426 is not yet in a
release, also just look at the diffstat!
2023-08-02 22:35:32 +02:00
Roberto Resoli
0f74b1b8f2 Translated using Weblate (Italian)
Currently translated at 91.8% (294 of 320 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/it/
2023-07-13 11:17:54 +00:00
misiek
df78e8a8b0 Translated using Weblate (Polish)
Currently translated at 100.0% (320 of 320 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/pl/
2023-04-04 14:11:31 +00:00
Kim Alvefur
77ccdd5eed Translated using Weblate (Swedish)
Currently translated at 100.0% (320 of 320 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/sv/
2023-04-02 15:17:18 +00:00
uira
54b6cad7cd Translated using Weblate (Indonesian)
Currently translated at 100.0% (320 of 320 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/id/
2023-04-02 15:17:15 +00:00
Jonas Schäfer
fbb618c178 Translated using Weblate (German)
Currently translated at 100.0% (320 of 320 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/de/
2023-04-01 11:13:44 +00:00
Weblate
bd3d56851b Update translation files
Updated by "Update PO files to match POT (msgmerge)" hook in Weblate.

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/
2023-04-01 10:17:56 +00:00
Jonas Schäfer
c475b83c02 Merge pull request #154 from snikket-im/feature/protect-circle-deletion
Add confirmation step to circle deletion
2023-04-01 10:22:23 +02:00
Jonas Schäfer
d9b73055a8 Add confirmation step to circle deletion
Deleting a circle is highly destructive. It removes the group chat
alongside history, as well as the user list. It should definitely be
protected by a confirmation dialogue, I have no clue why it wasn't.

Fixes #153.
2023-04-01 10:08:52 +02:00
Matthew Wild
f37270594e Merge pull request #152 from snikket-im/fix/role-config
Follow new role scheme in Prosody
2023-03-29 20:16:36 +01:00
Jonas Schäfer
fcfcdbeb23 Follow new role scheme in Prosody
Prosody changed its role scheme to only support a single primary role
for each user. In addition, the names of the built-in roles have been
changed. We thus follow those changes to be compatible with the most
recent trunk.

One open question is whether we should switch admin -> operator here,
too (operator being a server-wide admin), but so far there's no need
to.
2023-03-29 18:42:53 +02:00
Jonas Schäfer
fd566b7f30 Merge pull request #151 from snikket-im/fix/user-listing-roles
Make AdminUserInfo compatible with new API
2023-03-28 22:23:06 +02:00
Jonas Schäfer
2762304ae8 Make AdminUserInfo compatible with new API
The mod_http_admin_api changed recently [1], so we need to follow
suit.

Fixes #149.

   [1]: https://hg.prosody.im/prosody-modules/rev/d68348323406
2023-03-28 22:21:07 +02:00
Jonas Schäfer
49bbc3ab09 Merge pull request #148 from Zash/newscopes
Update to match new Prosody scope naming scheme
2023-03-28 21:42:00 +02:00
Kim Alvefur
8f1f80b7d7 Update to match new Prosody scope naming scheme
Ref https://hg.prosody.im/prosody-modules/rev/5ab134b7e510

Thanks Jonas
2023-03-28 21:14:20 +02:00
Jonas Schäfer
13bc283a3e Merge pull request #140 from snikket-im/feature/site-name-consistency
entrypoint: default SNIKKET_WEB_SITE_NAME to SNIKKET_SITE_NAME
2023-03-28 20:59:17 +02:00
Jonas Schäfer
abc0af3918 entrypoint: default SNIKKET_WEB_SITE_NAME to SNIKKET_SITE_NAME
The documentation only talks about SNIKKET_SITE_NAME,
and users thus do not know that they must
set SNIKKET_WEB_SITE_NAME to make
their site name appear on the portal.
2023-03-28 20:54:47 +02:00
Jonas Schäfer
0aff4fc99d Merge pull request #144 from snikket-im/fix/invite-link-header
Fix Link header on invite pages
2023-03-28 20:48:59 +02:00
Jonas Schäfer
40562d16f6 Fix Link header on invite pages
Thanks @singpolyma.
2023-03-28 19:19:43 +02:00
Jonas Schäfer
48a4a8f587 Merge pull request #147 from snikket-im/fix/i18n-lint
Fix i18n CI linting
2023-03-28 19:19:35 +02:00
Jonas Schäfer
664112bf53 Fix i18n CI linting
It diffs the things, and we're in 2023 now.
2023-03-28 19:16:27 +02:00
Jonas Schäfer
2dfc39e757 Merge pull request #141 from snikket-im/fix/quart-dep
Update WTForms and pin quart version
2023-03-28 19:14:30 +02:00
Jonas Schäfer
31b743a97f Update WTForms and pin quart version
The quart pin is required to fix an attribute error which otherwise
occurs during startup. Hence, this should be a good qualifier to know
when it's safe to upgrade.

Note that this is not a problem in Quart, but in flask-WTForms. But
downgrading flask-wtforms does not help [1], so we don't revert that
uprade.

```
AttributeError: module 'quart.json' has no attribute 'JSONEncoder'
```

   [1]: https://github.com/pallets/quart/issues/163
2022-10-24 10:14:03 +02:00
Weblate
14a335bb06 Update translation files
Updated by "Update PO files to match POT (msgmerge)" hook in Weblate.

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/
2022-06-07 20:34:03 +00:00
Jonas Schäfer
6c8c213a88 Merge pull request #100 from snikket-im/feature/drop-xmpp-qr-code
Remove XMPP URI QR code
2022-06-07 22:33:53 +02:00
Jonas Schäfer
2e224d96ce Remove XMPP URI QR code
At the same time, we can also drop the CSS used for that makeshift tab
box. I always felt a bit uneasy about it, a11y-wise, so it's good
riddance.

Fixes #99.
2022-06-07 22:31:40 +02:00
Weblate
b70cb57497 Update translation files
Updated by "Update PO files to match POT (msgmerge)" hook in Weblate.

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/
2022-06-06 17:55:08 +00:00
Jonas Schäfer
124e0ce145 Merge pull request #137 from snikket-im/premerge
Merge a bunch of things together
2022-06-06 19:54:54 +02:00
Jonas Schäfer
f2c79044e0 Clean up post-merge lint
I am a *bit* sorry for this commit, because ideally this would've been
folded into 6d50b1c2c7 and whatever the
source of the other "conflict" was.

However, as the things have been merged in a batch, I can't do much more
than this.
2022-06-06 19:52:24 +02:00
Jonas Schäfer
13bc4bb227 Merge branch 'fix/babel-extraction' into premerge 2022-06-06 19:46:59 +02:00
Jonas Schäfer
f1351eb5cc Merge branch 'fix/use-english-default' into premerge 2022-06-06 19:46:49 +02:00
Jonas Schäfer
41573569af Merge branch 'feature/export-back-button' into premerge 2022-06-06 19:46:43 +02:00
Jonas Schäfer
b1f3026b8a Merge branch 'feature/wtforms-3' into premerge 2022-06-06 19:46:32 +02:00
Jonas Schäfer
6794314a59 Merge branch 'feature/vary-accept-language' into premerge 2022-06-06 19:46:25 +02:00
Jonas Schäfer
077e957a00 Merge branch 'feature/ci-extract-translations' into premerge 2022-06-06 19:46:19 +02:00
Jonas Schäfer
4902941145 Merge branch 'feature/strip-versions' into premerge 2022-06-06 19:46:09 +02:00
Jonas Schäfer
5222c8eafe Merge branch 'feature/hypercorn-stdout' into premerge 2022-06-06 19:44:39 +02:00
Jonas Schäfer
03ca7ac5bb Unbreak translation text extraction
It was broken because of the same jinja2 update (presumably) which
prompted 68f72743c5.
2022-05-30 20:51:37 +02:00
Matthew Wild
56cee8bab6 Merge pull request #135 from snikket-im/feature/update-dependencies
Update dependencies
2022-05-30 16:59:22 +01:00
Jonas Schäfer
b36fc0d5ac Bump hsluv to 5.x
Fixes #134.
2022-05-30 17:38:18 +02:00
Jonas Schäfer
68f72743c5 Bump quart to version 0.17
This is needed because jinja2 had an update which caused the portal to
not work at all:

```
ImportError: cannot import name 'escape' from 'jinja2'
```

Quart needed updating for that.

This update required a lot of typefixes. Apparently, the "canned"
responses (like redirect) are now plain werkzeug responses, while
quart.Response does not inherit from werkzeug.Response (otherwise, we
could've changed the type annotations to werkzeug.Response everywhere,
but that doesn't work because a quart.Response is not a
werkzeug.Response).

P.S.: This time, I *did* check that avatar uploads don't break (see
b007afc).
2022-05-30 17:37:54 +02:00
Daniel Holmgaard
8741efb2c4 Translated using Weblate (Danish)
Currently translated at 100.0% (321 of 321 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/da/
2022-05-30 14:01:08 +00:00
Daniel Holmgaard
a0e8933b64 Translated using Weblate (Danish)
Currently translated at 95.6% (307 of 321 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/da/
2022-05-26 23:01:53 +00:00
Zack Zhou
edb3154127 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (321 of 321 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/zh_Hans/
2022-05-20 00:01:45 +00:00
Jonas Schäfer
eb22688302 Use english as default language instead of danish
It is more likely that a user for whose language no translation exists
can read english than danish.

The fallback to english was apparently introduced in c58ce845, though it
is possible that `best_match` did that internally before.

Fixes #131.
2022-05-15 14:12:51 +02:00
Jonas Schäfer
c278d4ace9 Merge pull request #132 from Raka-loah/master
Add Simplified Chinese support
2022-05-15 08:14:08 +02:00
Raka-loah
bbfe8624ef Add Simplified Chinese support 2022-05-14 17:53:40 +08:00
David Baraniak
8bcf619cef Translated using Weblate (French)
Currently translated at 100.0% (321 of 321 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/fr/
2022-04-11 13:00:44 +00:00
Kim Alvefur
73fda3d623 Add a Back button from export panel for consistency
The other user related sections all have a Back button so it makes sense
that this one ought to have one as well.
2022-02-19 16:28:38 +01:00
Matthew Wild
846a5e49fd Merge pull request #122 from snikket-im/feature/autocomplete-hints
Add autocomplete hints to password forms
2022-02-07 11:43:20 +00:00
Matthew Wild
b3ff7f04b5 Merge pull request #127 from snikket-im/fix/unhealthy
Install netcat in final image instead of build image
2022-02-07 11:42:40 +00:00
Jonas Schäfer
0ac4ab8142 Install netcat in final image instead of build image
`nc` (from netcat) is required for the healthcheck. In
c1cf6ab1e5, the installation was
erroneously moved to the builder image, instead of the final image, so
it was missing since then from the actual application image, causing it
to always show as unhealthy.

Fixes #126.
2022-02-05 13:51:30 +01:00
Matthew Wild
d4a38f5049 Merge pull request #125 from snikket-im/fix/support-requirements-compilation
Dockerfile: Add dev headers required for building deps
2022-02-01 09:09:50 +00:00
Matthew Wild
344a4d3e93 Dockerfile: Add dev headers required for building deps 2022-02-01 09:04:25 +00:00
Matthew Wild
57f1047526 Merge pull request #124 from snikket-im/fix/support-requirements-compilation
Dockerfile: Ensure a compiler is available while pip-installing requirements
2022-02-01 08:16:33 +00:00
Matthew Wild
b036caa85e Dockerfile: Ensure a compiler is available while pip-installing requirements
Dependencies are not necessarily packaged for all architectures. In some cases
(such as aiohttp, and others, on ARM) pip will attempt to compile the
dependency from scratch. Since switching to multi-stage builds, we have been
installing these without a compiler present which caused the build to fail on
ARM architectures.

This commit temporarily installs build-essential packages while running pip,
then removes them again afterwards.
2022-01-31 21:45:39 +00:00
Matthew Wild
08845cb9f0 Merge pull request #123 from snikket-im/hotfix/error-handling
Fix error handling when building image
2022-01-31 18:11:58 +00:00
Jonas Schäfer
6aa6e12680 Fix error handling when building image
Apparently, we managed to publish an image without working aiohttp
because of this.

Partially a regression from 5d7183a.
2022-01-31 19:09:03 +01:00
Jonas Schäfer
4bd58c1104 Add autocomplete hints to password forms
This allows user agents to do smart things like filling in the current
password only where it makes sense or integrate nicely with a password
manager.

Fixes #94.
2022-01-22 15:34:27 +01:00
Jonas Schäfer
a998348804 Make hypercorn log to stdout in Docker
This may help with debugging issues, because we now actually see
incoming requests also on the hypercorn layer.

Fixes #97.
2022-01-22 15:20:36 +01:00
Jonas Schäfer
20abe4b903 Add Vary: Accept-Language to all pages using that information
It was found during testing that some user agents cache aggressively
even between switches of the UI language. To properly indicate that the
pages actually depend on that information, we add the correct Vary
header.

Fixes #106.
2022-01-22 15:19:29 +01:00
Jonas Schäfer
a1ecb4ce80 Port to WTForms 3.x
Fixes #103.
2022-01-22 15:17:48 +01:00
Jonas Schäfer
b84b84b394 Add check for a missing make extract_translations
Forgetting to run that causes weblate (or other translation tools) to
show outdated strings and not import new strings, which is bad for the
collaboration.

Fixes #118.
2022-01-22 14:57:59 +01:00
misiek
4f7a4fb5d4 Translated using Weblate (Polish)
Currently translated at 100.0% (321 of 321 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/pl/
2022-01-21 15:00:36 +00:00
Jonas Schäfer
6d50b1c2c7 Do not show dependency versions even to admins by default
Dependency versions are generally not useful, unless you are developing
or otherwise outside of a normal release situation: If you are on a
normal release, we can figure out the dep versions by looking at the
docker image.

To reduce the amount of information displayed and the amount of
information which needs to be conveyed in case of problems, we only show
the web portal and prosody versions to admins, unless debug mode is
enabled.

The behaviour that versions are only shown to logged in admins (unless
debug mode is enabled) remains unchanged.

Fixes #115.
2022-01-20 18:11:47 +01:00
uira
34a23f8505 Translated using Weblate (Indonesian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/id/
2022-01-18 14:59:01 +00:00
Jonas Schäfer
ebcb083b6a Translated using Weblate (German)
Currently translated at 100.0% (321 of 321 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/de/
2022-01-18 14:59:01 +00:00
Kim Alvefur
2f0b38b149 Translated using Weblate (Swedish)
Currently translated at 100.0% (321 of 321 strings)

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/sv/
2022-01-18 09:21:29 +00:00
Weblate
6244ad5c8a Update translation files
Updated by "Update PO files to match POT (msgmerge)" hook in Weblate.

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/
2022-01-17 16:27:36 +00:00
Jonas Schäfer
07fa1f0abd Fix missing space in string 2022-01-17 17:27:26 +01:00
Weblate
3d22458f9b Update translation files
Updated by "Update PO files to match POT (msgmerge)" hook in Weblate.

Translation: Snikket/Web Portal
Translate-URL: http://i18n.sotecware.net/projects/snikket/web-portal/
2022-01-17 16:26:16 +00:00
Jonas Schäfer
3b768fe220 Extract translations 2022-01-17 17:26:02 +01:00
Matthew Wild
19cf82e894 Merge pull request #111 from snikket-im/fix/byte-scaling
Fix corner cases of byte number formatting
2022-01-17 15:47:57 +00:00
Matthew Wild
fe0316708b Merge pull request #113 from snikket-im/feature/flake8-print
Include flake8-print plugin
2022-01-17 15:47:21 +00:00
Jonas Schäfer
81b0a58dc9 Merge pull request #107 from Zash/storagestats
Show how much storage space is used by shared files
2022-01-17 16:40:16 +01:00
Jonas Schäfer
08aea153f9 Merge pull request #110 from snikket-im/feature/account-export
Feature: account import/export
2022-01-17 16:38:04 +01:00
Jonas Schäfer
958b3365f7 Remove strange greeting copied over from user_home 2022-01-17 16:34:30 +01:00
Matthew Wild
05caf38d37 Use PUT method instead of POST, as expected by API 2022-01-17 16:33:46 +01:00
Matthew Wild
390ecded42 Include PEP data in export/import 2022-01-17 16:33:29 +01:00
Matthew Wild
f6395d4d9c Complete the implementation of data import 2022-01-17 16:33:00 +01:00
Matthew Wild
32179c72cd Add account data import UI on registration success page 2022-01-17 16:24:00 +01:00
Matthew Wild
3cb8185b1a prosodyclient: Add API to import XEP-0227 account data 2022-01-17 16:23:58 +01:00
Matthew Wild
481379d03f Switch to HTTP 204 to indicate no data to export
This is more robust, as it indicates the request was successfully
authenticated and processed, but that there is no data to export. This is
different from the URL not existing (which would also happen if the module was
unavailable, which should be a notable error instead).
2022-01-17 16:23:57 +01:00
Matthew Wild
275b302531 Add UI for exporting user account data 2022-01-17 16:23:56 +01:00
Matthew Wild
e18f727db0 prosodyclient: Add support for exporting a user's account data 2022-01-17 16:23:55 +01:00
Matthew Wild
f7429413cd Add more icons to the repertoire 2022-01-17 16:23:35 +01:00
Jonas Schäfer
d5a46b69a6 Include flake8-print plugin
This alerts us of stray print statements, which should never occur
because this is a non-TUI application.
2022-01-15 17:07:16 +01:00
Jonas Schäfer
51f2ebbd13 Handle the correct exception when formatting extremely high amounts of bytes
Found in production. Yes really. Due to some borked LXC integration, my
snikket host reports

```
MemTotal:       9007199254740991 kB
MemFree:        9007199254690591 kB
MemAvailable:   9007199254690591 kB
```

That is more than 1024 TiB, so it tries to go further up in the scale,
which then causes a Guru Meditation because of the uncaught IndexError.
2022-01-10 17:32:11 +01:00
Jonas Schäfer
b4e6ee8943 Fix formatting of zero bytes
Previously, that would raise a ValueError (math domain error), because
log(0) is undefined.
2022-01-10 17:31:50 +01:00
Jonas Schäfer
52d8047546 Correctly detect presence of storage metric
If there have been no uploads yet, the metric will be zero, so the if
condition would fail the test, so it would render as "unknown".
2022-01-10 16:56:31 +01:00
Jonas Schäfer
aed9ad1cde Merge pull request #93 from Zash/debianbullseye
Dockerfile: Switch base image to Debian 11
2022-01-10 16:40:28 +01:00
Kim Alvefur
b545c137b1 Dockerfile: Switch base image to Debian 11 2022-01-10 16:27:38 +01:00
Matthew Wild
47642dc384 Merge pull request #108 from snikket-im/feature/multi-stage-dockerfile
Dockerfile: Split build into multiple stages
2022-01-10 14:21:57 +00:00
Kim Alvefur
4af78f635e Show how much storage space is used by shared files
Requires at least https://hg.prosody.im/prosody-modules/rev/883ad8b0a7c0
2021-11-18 19:50:47 +01:00
64 changed files with 6525 additions and 2459 deletions

View File

@@ -45,11 +45,34 @@ jobs:
- name: Install
run: |
set -euo pipefail
pip install flake8
pip install flake8 flake8-print
- name: Linting
run: |
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:
runs-on: ubuntu-latest

View File

@@ -1,28 +1,22 @@
FROM debian:buster-slim AS build
FROM debian:bookworm-slim AS build
RUN set -eu; \
export DEBIAN_FRONTEND=noninteractive ; \
apt-get update ; \
apt-get install -y --no-install-recommends \
python3 python3-pip python3-setuptools python3-wheel \
libpython3-dev \
make build-essential \
netcat;
python3 python3-mypy python3-dotenv python3-toml python3-babel python3-distutils \
sassc make;
COPY requirements.txt /opt/snikket-web-portal/requirements.txt
COPY build-requirements.txt /opt/snikket-web-portal/build-requirements.txt
COPY Makefile /opt/snikket-web-portal/Makefile
COPY snikket_web/ /opt/snikket-web-portal/snikket_web
COPY babel.cfg /opt/snikket-web-portal/babel.cfg
WORKDIR /opt/snikket-web-portal
RUN pip3 install -r requirements.txt; \
pip3 install -r build-requirements.txt; \
make;
RUN make
FROM debian:buster-slim
FROM debian:bookworm-slim
ARG BUILD_SERIES=dev
ARG BUILD_ID=0
@@ -33,21 +27,22 @@ ENV SNIKKET_WEB_PYENV=/etc/snikket-web-portal/env.py
ENV SNIKKET_WEB_PROSODY_ENDPOINT=http://127.0.0.1:5280/
HEALTHCHECK CMD nc -zv ${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE:-127.0.0.1} ${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT:-5765}
WORKDIR /opt/snikket-web-portal
RUN set -eu; \
export DEBIAN_FRONTEND=noninteractive ; \
apt-get update ; \
apt-get install -y --no-install-recommends \
python3 python3-pip python3-setuptools python3-wheel; \
netcat-traditional python3 python3-setuptools python3-pip \
python3-aiohttp python3-email-validator python3-flask-babel \
python3-flaskext.wtf python3-hsluv python3-hypercorn \
python3-quart python3-typing-extensions python3-wtforms ; \
pip3 install --break-system-packages environ-config ; \
apt-get remove -y --purge python3-pip python3-setuptools; \
apt-get clean ; rm -rf /var/lib/apt/lists; \
pip3 install hypercorn; \
rm -rf /root/.cache;
WORKDIR /opt/snikket-web-portal
COPY requirements.txt /opt/snikket-web-portal/requirements.txt
RUN pip3 install -r requirements.txt; rm -rf /root/.cache;
HEALTHCHECK CMD nc -zv ${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE:-127.0.0.1} ${SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_PORT:-5765}
COPY --from=build /opt/snikket-web-portal/snikket_web/ /opt/snikket-web-portal/snikket_web
COPY babel.cfg /opt/snikket-web-portal/babel.cfg

View File

@@ -6,7 +6,7 @@ translation_basepath = snikket_web/translations
pot_file = $(translation_basepath)/messages.pot
PYTHON3 ?= python3
SCSSC ?= $(PYTHON3) -m scss --load-path snikket_web/scss/
SCSSC ?= sassc --load-path snikket_web/scss/
all: build_css compile_translations
@@ -14,7 +14,7 @@ build_css: $(generated_css_files)
$(generated_css_files): snikket_web/static/css/%.css: snikket_web/scss/%.scss $(scss_files) $(scss_includes)
mkdir -p snikket_web/static/css/
$(SCSSC) -o "$@" "$<"
$(SCSSC) "$<" "$@"
clean:
rm -f $(generated_css_files)

View File

@@ -1,4 +1,3 @@
[python: snikket_web/**.py]
[jinja2: snikket_web/templates/**.html]
[jinja2: snikket_web/templates/**.j2]
extensions=jinja2.ext.autoescape,jinja2.ext.with_

View File

@@ -1,4 +1,3 @@
pyscss~=1.3
mypy
python-dotenv~=0.15
types-toml

View File

@@ -1,8 +1,16 @@
#!/bin/sh
export SNIKKET_WEB_DOMAIN="$SNIKKET_DOMAIN"
if [ -n "${SNIKKET_SITE_NAME:-}" ]; then
export SNIKKET_WEB_SITE_NAME="$SNIKKET_SITE_NAME"
fi
export SNIKKET_WEB_TOS_URI="${SNIKKET_TOS_URI}"
export SNIKKET_WEB_PRIVACY_URI="${SNIKKET_PRIVACY_URI}"
export SNIKKET_WEB_ABUSE_EMAIL="${SNIKKET_ABUSE_EMAIL}"
export SNIKKET_WEB_SECURITY_EMAIL="${SNIKKET_SECURITY_EMAIL}"
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}"
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()'

View File

@@ -1,9 +1,9 @@
aiohttp~=3.6
quart~=0.11,<0.15
flask-wtf~=0.14
hsluv~=0.0.2
quart~=0.17,<0.18
flask-wtf~=1.0
hsluv~=5.0
flask-babel~=1.0
email-validator~=1.1
environ-config~=20.0
wtforms~=2.3
wtforms~=3.0
typing-extensions

View File

@@ -18,6 +18,8 @@ from quart import (
jsonify,
)
import werkzeug.exceptions
import environ
from . import colour, infra
@@ -40,7 +42,7 @@ async def proc() -> typing.Dict[str, typing.Any]:
try:
user_info = await infra.client.get_user_info()
except (aiohttp.ClientError, quart.exceptions.HTTPException):
except (aiohttp.ClientError, werkzeug.exceptions.HTTPException):
user_info = {}
return {
@@ -105,16 +107,16 @@ async def backend_error_handler(exc: Exception) -> quart.Response:
async def generic_http_error(
exc: quart.exceptions.HTTPException,
exc: werkzeug.exceptions.HTTPException,
) -> quart.Response:
return quart.Response(
await render_template(
"generic_http_error.html",
status=exc.status_code,
status=exc.code,
description=exc.description,
name=exc.name,
),
status=exc.status_code,
status=exc.code,
)
@@ -145,14 +147,19 @@ class AppConfig:
site_name = environ.var("")
avatar_cache_ttl = environ.var(1800, converter=int)
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",
"de",
"en",
"fr",
"id",
"it",
"pl",
"sv",
"zh_Hans_CN",
], converter=autosplit)
apple_store_url = environ.var(
"https://apps.apple.com/us/app/snikket/id1545164189",
@@ -163,6 +170,10 @@ class AppConfig:
# tools may also very well override it.
max_avatar_size = environ.var(1024*1024, converter=int)
show_metrics = environ.bool_var(True)
tos_uri = environ.var("")
privacy_uri = environ.var("")
abuse_email = environ.var("")
security_email = environ.var("")
_UPPER_CASE = "".join(map(chr, range(ord("A"), ord("Z")+1)))
@@ -195,23 +206,27 @@ def create_app() -> quart.Quart:
app.config["APPLE_STORE_URL"] = config.apple_store_url
app.config["MAX_AVATAR_SIZE"] = config.max_avatar_size
app.config["SHOW_METRICS"] = config.show_metrics
app.config["TOS_URI"] = config.tos_uri
app.config["PRIVACY_URI"] = config.privacy_uri
app.config["ABUSE_EMAIL"] = config.abuse_email
app.config["SECURITY_EMAIL"] = config.security_email
app.context_processor(proc)
app.register_error_handler(
aiohttp.ClientConnectorError,
backend_error_handler, # type:ignore
backend_error_handler,
)
app.register_error_handler(
quart.exceptions.HTTPException,
werkzeug.exceptions.HTTPException,
generic_http_error, # type:ignore
)
app.register_error_handler(
Exception,
generic_error_handler, # type:ignore
generic_error_handler,
)
@app.route("/")
async def index() -> quart.Response:
async def index() -> werkzeug.Response:
if infra.client.has_session:
return redirect(url_for('user.index'))

View File

@@ -7,10 +7,11 @@ from datetime import datetime
import aiohttp
import werkzeug.exceptions
import quart.flask_patch
import wtforms
import wtforms.fields.html5
from quart import (
Blueprint,
@@ -76,7 +77,7 @@ class EditUserForm(BaseForm):
_l("Access Level"),
choices=[
("prosody:restricted", _("Limited")),
("prosody:normal", _l("Normal user")),
("prosody:registered", _l("Normal user")),
("prosody:admin", _l("Administrator")),
],
)
@@ -85,6 +86,14 @@ class EditUserForm(BaseForm):
_l("Update user"),
)
action_restore = wtforms.SubmitField(
_l("Restore account"),
)
action_enable = wtforms.SubmitField(
_l("Unlock account"),
)
action_create_reset = wtforms.SubmitField(
_l("Create password reset link"),
)
@@ -92,7 +101,7 @@ class EditUserForm(BaseForm):
@bp.route("/user/<localpart>/", methods=["GET", "POST"])
@client.require_admin_session()
async def edit_user(localpart: str) -> typing.Union[quart.Response, str]:
async def edit_user(localpart: str) -> typing.Union[werkzeug.Response, str]:
target_user_info = await client.get_user_by_localpart(localpart)
form = EditUserForm()
@@ -111,18 +120,44 @@ async def edit_user(localpart: str) -> typing.Union[quart.Response, str]:
".user_password_reset_link",
id_=reset_link.id_,
))
elif form.action_restore.data or form.action_enable.data:
await client.enable_user_account(localpart)
try:
if form.action_restore.data:
await flash(
_("User account restored"),
"success",
)
else:
await flash(
_("User account unlocked"),
"success",
)
return redirect(url_for(".users"))
except aiohttp.ClientResponseError:
if form.action_restore.data:
await flash(
_("Could not restore user account"),
"alert",
)
else:
await flash(
_("Could not unlock user account"),
"alert",
)
return redirect(url_for(".edit_user", localpart=localpart))
await client.update_user(
localpart,
display_name=form.display_name.data,
roles=[form.role.data],
role=form.role.data,
)
await flash(
_("User information updated."),
"success",
)
return redirect(url_for(".edit_user", localpart=localpart))
return redirect(url_for(".users"))
elif request.method == "GET":
form.localpart.data = target_user_info.localpart
@@ -130,7 +165,7 @@ async def edit_user(localpart: str) -> typing.Union[quart.Response, str]:
if target_user_info.roles:
form.role.data = target_user_info.roles[0]
else:
form.role.data = "prosody:normal"
form.role.data = "prosody:registered"
return await render_template(
"admin_edit_user.html",
@@ -147,7 +182,7 @@ class DeleteUserForm(BaseForm):
@bp.route("/user/<localpart>/delete", methods=["GET", "POST"])
@client.require_admin_session()
async def delete_user(localpart: str) -> typing.Union[str, quart.Response]:
async def delete_user(localpart: str) -> typing.Union[str, werkzeug.Response]:
target_user_info = await client.get_user_by_localpart(localpart)
form = DeleteUserForm()
if form.validate_on_submit():
@@ -186,7 +221,7 @@ async def debug_user(localpart: str) -> typing.Union[str, quart.Response]:
@client.require_admin_session()
async def user_password_reset_link(
id_: str,
) -> typing.Union[str, quart.Response]:
) -> typing.Union[str, werkzeug.Response]:
invite_info = await client.get_invite_by_id(
id_,
)
@@ -278,7 +313,7 @@ class InvitePost(BaseForm):
@bp.route("/invitations", methods=["GET", "POST"])
@client.require_admin_session()
async def invitations() -> typing.Union[str, quart.Response]:
async def invitations() -> typing.Union[str, werkzeug.Response]:
invites = sorted(
(
invite
@@ -324,7 +359,7 @@ class InviteForm(BaseForm):
@bp.route("/invitation/-/new", methods=["POST"])
@client.require_admin_session()
async def create_invite() -> typing.Union[str, quart.Response]:
async def create_invite() -> typing.Union[str, werkzeug.Response]:
form = InvitePost()
circles = await client.list_groups()
form.circles.choices = [
@@ -352,7 +387,7 @@ async def create_invite() -> typing.Union[str, quart.Response]:
@bp.route("/invitation/<id_>", methods=["GET", "POST"])
@client.require_admin_session()
async def edit_invite(id_: str) -> typing.Union[str, quart.Response]:
async def edit_invite(id_: str) -> typing.Union[str, werkzeug.Response]:
try:
invite_info = await client.get_invite_by_id(id_)
except aiohttp.ClientResponseError as exc:
@@ -418,7 +453,7 @@ async def circles() -> str:
@bp.route("/circle/-/new", methods=["POST"])
@client.require_admin_session()
async def create_circle() -> typing.Union[str, quart.Response]:
async def create_circle() -> typing.Union[str, werkzeug.Response]:
create_form = CirclePost()
if create_form.validate_on_submit():
circle = await client.create_group(
@@ -451,20 +486,18 @@ class EditCircleForm(BaseForm):
_l("Update circle")
)
action_delete = wtforms.SubmitField(
_l("Delete circle permanently")
)
action_remove_user = wtforms.StringField()
action_add_user = wtforms.SubmitField(
_l("Add user")
)
action_remove_group_chat = wtforms.StringField()
@bp.route("/circle/<id_>", methods=["GET", "POST"])
@client.require_admin_session()
async def edit_circle(id_: str) -> typing.Union[str, quart.Response]:
async def edit_circle(id_: str) -> typing.Union[str, werkzeug.Response]:
async with client.authenticated_session() as session:
try:
circle = await client.get_group_by_id(
@@ -514,13 +547,6 @@ async def edit_circle(id_: str) -> typing.Union[str, quart.Response]:
_("Circle data updated"),
"success",
)
elif form.action_delete.data:
await client.delete_group(id_)
await flash(
_("Circle deleted"),
"success",
)
return redirect(url_for(".circles"))
elif form.action_add_user.data:
if form.user_to_add.data in valid_users:
await client.add_group_member(
@@ -540,20 +566,119 @@ async def edit_circle(id_: str) -> typing.Union[str, quart.Response]:
_("User removed from circle"),
"success",
)
elif form.action_remove_group_chat.data:
await client.remove_group_chat(
id_,
form.action_remove_group_chat.data,
)
await flash(
_("Chat removed from circle"),
"success",
)
return redirect(url_for(".edit_circle", id_=id_))
else:
print(form.errors)
return await render_template(
"admin_edit_circle.html",
target_circle=circle,
form=form,
circle_chats=circle.chats,
circle_members=circle_members,
invite_form=invite_form,
)
class DeleteCircleForm(BaseForm):
action_delete = wtforms.SubmitField(
_l("Delete circle permanently")
)
@bp.route("/circle/<id_>/delete", methods=["GET", "POST"])
@client.require_admin_session()
async def delete_circle(id_: str) -> typing.Union[str, werkzeug.Response]:
async with client.authenticated_session() as session:
try:
circle = await client.get_group_by_id(
id_,
session=session,
)
except aiohttp.ClientResponseError as exc:
if exc.status == 404:
await flash(
_("No such circle exists"),
"alert",
)
return redirect(url_for(".circles"))
raise
form = DeleteCircleForm()
if form.validate_on_submit():
if form.action_delete.data:
await client.delete_group(id_)
await flash(
_("Circle deleted"),
"success",
)
return redirect(url_for(".circles"))
return await render_template(
"admin_delete_circle.html",
target_circle=circle,
form=form,
)
class AddCircleChatForm(BaseForm):
name = wtforms.StringField(
_l("Group chat name"),
validators=[wtforms.validators.InputRequired()],
)
action_save = wtforms.SubmitField(
_l("Create group chat")
)
@bp.route("/circle/<id_>/add_chat", methods=["GET", "POST"])
@client.require_admin_session()
async def edit_circle_add_chat(
id_: str
) -> typing.Union[str, werkzeug.Response]:
async with client.authenticated_session() as session:
try:
circle = await client.get_group_by_id(
id_,
session=session,
)
except aiohttp.ClientResponseError as exc:
if exc.status == 404:
await flash(
_("No such circle exists"),
"alert",
)
return redirect(url_for(".circles"))
raise
form = AddCircleChatForm()
if form.validate_on_submit():
if form.action_save.data:
await client.add_group_chat(id_, form.name.data)
await flash(
_("New group chat added to circle"),
"success",
)
return redirect(url_for(".edit_circle", id_=id_))
return await render_template(
"admin_create_circle_chat.html",
target_circle=circle,
group_chat_form=form,
)
_CPU_EPOCH = time.process_time()
_MONOTONIC_EPOCH = time.monotonic()
@@ -628,7 +753,7 @@ class AnnouncementForm(BaseForm):
@bp.route("/system/", methods=["GET", "POST"])
@client.require_admin_session()
async def system() -> typing.Union[str, quart.Response]:
async def system() -> typing.Union[str, werkzeug.Response]:
form = AnnouncementForm()
if form.validate_on_submit():
@@ -659,7 +784,7 @@ async def system() -> typing.Union[str, quart.Response]:
now = time.time()
try:
prosody_metrics = await client.get_system_metrics()
except quart.exceptions.NotFound:
except werkzeug.exceptions.NotFound:
# server does not offer the endpoint for whatever reason -- ignore
prosody_metrics = {}
@@ -682,6 +807,11 @@ async def system() -> typing.Union[str, quart.Response]:
except KeyError:
pass
try:
metrics["prosody_uploads"] = prosody_metrics["uploads"]
except KeyError:
pass
for k in list(metrics.keys()):
if metrics[k] is None:
# so that defaulting in jinja works

View File

@@ -4,15 +4,19 @@ import math
import secrets
import typing
from datetime import datetime, timedelta, timezone
import quart.flask_patch # noqa:F401
from quart import (
current_app,
request,
g,
)
import flask_babel
import flask_wtf
from flask_babel import _
from flask_babel import lazy_gettext as _l
import flask_babel as _
from . import prosodyclient
@@ -34,6 +38,7 @@ BYTE_UNIT_SCALE_MAP = [
@babel.localeselector # type:ignore
def selected_locale() -> str:
g.language_header_accessed = True
selected = request.accept_languages.best_match(
current_app.config['LANGUAGES']
) or current_app.config['LANGUAGES'][0]
@@ -53,11 +58,14 @@ def circle_name(c: typing.Any) -> str:
def format_bytes(n: float) -> str:
scale = math.floor(math.log(n, 1024))
try:
scale = max(math.floor(math.log(n, 1024)), 0)
except ValueError:
scale = 0
try:
unit = BYTE_UNIT_SCALE_MAP[scale]
factor = 1024**scale
except ValueError:
except IndexError:
unit = "TiB"
factor = 1024**4
if factor > 1:
@@ -65,6 +73,49 @@ def format_bytes(n: float) -> str:
return "{}{}".format(n, unit)
def format_last_activity(timestamp: typing.Optional[int]) -> str:
if timestamp is None:
return _l("Never")
last_active = datetime.fromtimestamp(timestamp, tz=timezone.utc)
# TODO: This 'now' should use the user's local time zone, but we
# don't have that information. Thus 'today'/'yesterday' may be
# slightly inaccurate, but compared to alternative solutions it
# should hopefully be "good enough".
now = datetime.now(tz=timezone.utc)
time_ago = now - last_active
yesterday = now - timedelta(days=1)
if (
last_active.year == now.year
and last_active.month == now.month
and last_active.day == now.day
):
return _l("Today")
elif (
last_active.year == yesterday.year
and last_active.month == yesterday.month
and last_active.day == yesterday.day
):
return _l("Yesterday")
return _.gettext(
"%(time)s ago",
time=flask_babel.format_timedelta(time_ago, granularity="day"),
)
def template_now() -> typing.Dict[str, typing.Any]:
return dict(now=lambda: datetime.now(timezone.utc))
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:
app.template_filter("repr")(repr)
app.template_filter("format_datetime")(flask_babel.format_datetime)
@@ -75,6 +126,9 @@ def init_templating(app: quart.Quart) -> None:
app.template_filter("format_bytes")(format_bytes)
app.template_filter("flatten")(flatten)
app.template_filter("circle_name")(circle_name)
app.template_filter("format_last_activity")(format_last_activity)
app.context_processor(template_now)
app.after_request(add_vary_language_header)
def generate_error_id() -> str:

View File

@@ -10,13 +10,16 @@ from quart import (
current_app,
render_template,
redirect,
request,
url_for,
session as http_session,
)
import werkzeug
import wtforms
from flask_babel import lazy_gettext as _l
from flask_babel import lazy_gettext as _l, gettext
from .infra import client, selected_locale, BaseForm
@@ -26,6 +29,11 @@ bp = Blueprint("invite", __name__)
INVITE_SESSION_JID = "invite-session-jid"
MAX_IMPORT_DATA_SIZE = 5*1024*1024 # 5MB
SUPPORTED_IMPORT_TYPES = ["application/xml", "text/xml"]
EIMPORTTOOBIG = _l("The account data you tried to import is too large to"
" upload. Please contact your Snikket operator.")
# https://play.google.com/store/apps/details?id=org.snikket.android&referrer={uri|urlescape}&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1
@@ -40,14 +48,14 @@ def apple_store_badge() -> str:
@bp.context_processor
def context() -> typing.Mapping[str, typing.Any]:
def context() -> typing.Dict[str, typing.Any]:
return {
"apple_store_badge": apple_store_badge,
}
@bp.route("/<id_>")
async def view_old(id_: str) -> quart.Response:
async def view_old(id_: str) -> werkzeug.Response:
return redirect(url_for(".view", id_=id_))
@@ -96,7 +104,7 @@ async def view(id_: str) -> typing.Union[quart.Response,
return quart.Response(
body,
headers={
"Link": "<{}> rel=\"alternate\"".format(invite.xmpp_uri),
"Link": "<{}>; rel=\"alternate\"".format(invite.xmpp_uri),
}
)
@@ -125,7 +133,7 @@ class RegisterForm(BaseForm):
@bp.route("/<id_>/register", methods=["GET", "POST"])
async def register(id_: str) -> typing.Union[str, quart.Response]:
async def register(id_: str) -> typing.Union[str, werkzeug.Response]:
try:
invite = await client.get_public_invite_by_id(id_)
except aiohttp.ClientResponseError as exc:
@@ -163,6 +171,7 @@ async def register(id_: str) -> typing.Union[str, quart.Response]:
raise
else:
http_session[INVITE_SESSION_JID] = jid
await client.login(jid, form.password.data)
return redirect(url_for(".success"))
return await render_template(
@@ -192,7 +201,7 @@ class ResetForm(BaseForm):
@bp.route("/<id_>/reset", methods=["GET", "POST"])
async def reset(id_: str) -> typing.Union[str, quart.Response]:
async def reset(id_: str) -> typing.Union[str, werkzeug.Response]:
try:
invite = await client.get_public_invite_by_id(id_)
except aiohttp.ClientResponseError as exc:
@@ -232,11 +241,55 @@ async def reset(id_: str) -> typing.Union[str, quart.Response]:
)
class DataImportForm(BaseForm):
account_data_file = wtforms.FileField(
_l("Account data file")
)
action_import = wtforms.SubmitField(
_l("Import data")
)
@bp.route("/success", methods=["GET", "POST"])
@client.require_session()
async def success() -> str:
form = DataImportForm()
if form.validate_on_submit():
ok = True
file_info = (await request.files).get(form.account_data_file.name)
if file_info is not None:
mimetype = file_info.mimetype
data = file_info.stream.read()
if len(data) > MAX_IMPORT_DATA_SIZE:
form.account_data_file.errors.append(EIMPORTTOOBIG)
ok = False
elif mimetype not in SUPPORTED_IMPORT_TYPES:
form.account_data_file.errors.append(
# not breaking the line here to avoid extract
# translations failing (defensive)
gettext("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).", mimetype=mimetype), # noqa:E501
)
ok = False
elif len(data) > 0:
await client.import_account_data(data)
if ok:
# Re-render success page, this time with no import option
return await render_template(
"invite_success.html",
jid=http_session.get(INVITE_SESSION_JID, ""),
migration_success=True,
)
return await render_template(
"invite_success.html",
jid=http_session.get(INVITE_SESSION_JID, ""),
migration_success=False,
form=form,
max_import_size=MAX_IMPORT_DATA_SIZE,
import_too_big_warning_header=_l("Error"),
import_too_big_warning=EIMPORTTOOBIG,
)
@@ -249,5 +302,5 @@ async def reset_success() -> str:
@bp.route("/-")
async def index() -> quart.Response:
async def index() -> werkzeug.Response:
return redirect(url_for("index"))

View File

@@ -18,6 +18,8 @@ from quart import (
flash,
)
import werkzeug.exceptions
import babel
import wtforms
@@ -32,7 +34,7 @@ bp = quart.Blueprint("main", __name__)
class LoginForm(BaseForm):
address = wtforms.TextField(
address = wtforms.StringField(
_l("Address"),
validators=[wtforms.validators.InputRequired()],
)
@@ -48,7 +50,7 @@ class LoginForm(BaseForm):
@bp.route("/-")
async def index() -> quart.Response:
async def index() -> werkzeug.Response:
return redirect(url_for("index"))
@@ -56,7 +58,7 @@ ERR_CREDENTIALS_INVALID = _l("Invalid username or password.")
@bp.route("/login", methods=["GET", "POST"])
async def login() -> typing.Union[str, quart.Response]:
async def login() -> typing.Union[str, werkzeug.Response]:
if client.has_session and (await client.test_session()):
return redirect(url_for('user.index'))
@@ -76,7 +78,7 @@ async def login() -> typing.Union[str, quart.Response]:
password = form.password.data
try:
await client.login(jid, password)
except quart.exceptions.Unauthorized:
except werkzeug.exceptions.Unauthorized:
form.password.errors.append(ERR_CREDENTIALS_INVALID)
else:
await flash(
@@ -91,24 +93,30 @@ async def login() -> typing.Union[str, quart.Response]:
@bp.route("/meta/about.html")
async def about() -> str:
version = None
core_versions = {}
extra_versions = {}
if current_app.debug or client.is_admin_session:
version = _version.version
extra_versions["Quart"] = quart.__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["babel"] = babel.__version__
extra_versions["wtforms"] = wtforms.__version__
extra_versions["flask-wtf"] = flask_wtf.__version__
try:
extra_versions["Prosody"] = await client.get_server_version()
except quart.exceptions.Unauthorized:
except werkzeug.exceptions.Unauthorized:
extra_versions["Prosody"] = "unknown"
return await render_template(
"about.html",
version=version,
extra_versions=extra_versions,
core_versions=core_versions,
)
@@ -165,6 +173,42 @@ async def avatar(from_: str, code: str) -> quart.Response:
return response
@bp.route("/terms")
async def terms() -> Response:
if not current_app.config["TOS_URI"]:
return Response("", 404)
return Response("", status=303, headers={
"Location": current_app.config["TOS_URI"],
})
@bp.route("/privacy")
async def privacy() -> Response:
if not current_app.config["PRIVACY_URI"]:
return Response("", 404)
return Response("", status=303, headers={
"Location": current_app.config["PRIVACY_URI"],
})
# This is linked from the iOS app and about page
@bp.route("/policies/")
async def policies() -> str:
return await render_template(
"policies.html",
)
@bp.route("/.well-known/security.txt")
async def securitytxt() -> Response:
return Response(
await render_template("security.txt"),
mimetype="text/plain;charset=UTF-8",
)
@bp.route("/_health")
async def health() -> Response:
return Response("STATUS OK", content_type="text/plain")

View File

@@ -9,24 +9,28 @@ import types
import typing
import typing_extensions
from datetime import datetime
from datetime import datetime, timezone
import aiohttp
import xml.etree.ElementTree as ET
from quart import (
current_app, _app_ctx_stack, session as http_session, abort, redirect,
current_app, session as http_session, abort, redirect,
url_for,
)
import quart.exceptions
import quart
from flask import g as _app_ctx_stack
import werkzeug.exceptions
from . import xmpputil
from .xmpputil import split_jid
SCOPE_DEFAULT = "prosody:scope:default"
SCOPE_ADMIN = "prosody:scope:admin"
SCOPE_DEFAULT = "prosody:registered"
SCOPE_ADMIN = "prosody:admin"
T = typing.TypeVar("T")
@@ -38,6 +42,52 @@ class TokenInfo:
scopes: typing.Collection[str]
@dataclasses.dataclass(frozen=True)
class UserDeletionRequestInfo:
deleted_at: datetime
pending_until: datetime
@classmethod
def from_api_response(
cls,
data: typing.Optional[typing.Mapping[str, typing.Any]],
) -> typing.Optional["UserDeletionRequestInfo"]:
if data is None:
return None
return cls(
deleted_at=datetime.fromtimestamp(
data["deleted_at"],
tz=timezone.utc
),
pending_until=datetime.fromtimestamp(
data["pending_until"],
tz=timezone.utc
)
)
@dataclasses.dataclass(frozen=True)
class AvatarMetadata:
bytes: int
hash: str
type: str
width: typing.Optional[int]
height: typing.Optional[int]
@classmethod
def from_api_response(
cls,
data: typing.Mapping[str, typing.Any],
) -> "AvatarMetadata":
return cls(
hash=data["hash"],
bytes=data["bytes"],
type=data["type"],
width=data.get("width") or None,
height=data.get("height") or None,
)
@dataclasses.dataclass(frozen=True)
class AdminUserInfo:
localpart: str
@@ -45,6 +95,10 @@ class AdminUserInfo:
email: typing.Optional[str]
phone: typing.Optional[str]
roles: typing.Optional[typing.List[str]]
enabled: bool
last_active: typing.Optional[int]
deletion_request: typing.Optional[UserDeletionRequestInfo]
avatar_info: typing.List[AvatarMetadata]
@property
def has_admin_role(self) -> bool:
@@ -59,12 +113,27 @@ class AdminUserInfo:
cls,
data: typing.Mapping[str, typing.Any],
) -> "AdminUserInfo":
try:
roles: typing.Optional[typing.List[str]] = [data["role"]]
assert roles is not None # make mypy happy
roles.extend(data.get("secondary_roles", []))
except KeyError:
roles = data.get("roles")
return cls(
localpart=data["username"],
display_name=data.get("display_name") or None,
email=data.get("email") or None,
phone=data.get("phone") or None,
roles=data.get("roles"),
roles=roles,
enabled=data.get("enabled", True),
last_active=data.get("last_active") or None,
deletion_request=UserDeletionRequestInfo.from_api_response(
data.get("deletion_request")
),
avatar_info=[
AvatarMetadata.from_api_response(avatar_info)
for avatar_info in data.get("avatar_info", [])
],
)
@@ -107,12 +176,30 @@ class AdminInviteInfo:
)
@dataclasses.dataclass(frozen=True)
class AdminGroupChatInfo:
id_: str
jid: str
name: str
@classmethod
def from_api_response(
cls,
data: typing.Mapping[str, typing.Any],
) -> "AdminGroupChatInfo":
return cls(
id_=data["id"],
jid=data["jid"],
name=data["name"],
)
@dataclasses.dataclass(frozen=True)
class AdminGroupInfo:
id_: str
name: str
muc_jid: typing.Optional[str]
members: typing.Collection[str]
chats: typing.Collection[AdminGroupChatInfo]
@classmethod
def from_api_response(
@@ -122,8 +209,11 @@ class AdminGroupInfo:
return cls(
id_=data["id"],
name=data["name"],
muc_jid=data.get("muc_jid") or None,
members=data.get("members", []),
chats=[
AdminGroupChatInfo.from_api_response(x)
for x in data.get("chats", [])
]
)
@@ -158,7 +248,7 @@ class HTTPSessionManager:
})
async def teardown(self, exc: typing.Optional[BaseException]) -> None:
app_ctx = _app_ctx_stack.top
app_ctx = _app_ctx_stack
try:
session = getattr(app_ctx, self._app_context_attribute)
except AttributeError:
@@ -175,7 +265,7 @@ class HTTPSessionManager:
await session.__aexit__(exc_type, exc, traceback)
async def __aenter__(self) -> aiohttp.ClientSession:
app_ctx = _app_ctx_stack.top
app_ctx = _app_ctx_stack
try:
return getattr(app_ctx, self._app_context_attribute)
except AttributeError:
@@ -296,6 +386,9 @@ class ProsodyClient:
def _public_v1_endpoint(self, subpath: str) -> str:
return "{}/register_api{}".format(self._endpoint_base, subpath)
def _xep227_endpoint(self, subpath: str) -> str:
return "{}/xep227{}".format(self._endpoint_base, subpath)
async def _oauth2_bearer_token(self,
session: aiohttp.ClientSession,
jid: str,
@@ -383,16 +476,16 @@ class ProsodyClient:
) -> typing.Callable[
[typing.Callable[..., typing.Awaitable[T]]],
typing.Callable[..., typing.Awaitable[
typing.Union[T, quart.Response]]]]:
typing.Union[T, quart.Response, werkzeug.Response]]]]:
def decorator(
f: typing.Callable[..., typing.Awaitable[T]],
) -> typing.Callable[..., typing.Awaitable[
typing.Union[T, quart.Response]]]:
typing.Union[T, quart.Response, werkzeug.Response]]]:
@functools.wraps(f)
async def wrapped(
*args: typing.Any,
**kwargs: typing.Any,
) -> typing.Union[T, quart.Response]:
) -> typing.Union[T, quart.Response, werkzeug.Response]:
if not self.has_session or not (await self.test_session()):
redirect_to_value = redirect_to
if redirect_to_value is not False:
@@ -412,17 +505,17 @@ class ProsodyClient:
) -> typing.Callable[
[typing.Callable[..., typing.Awaitable[T]]],
typing.Callable[..., typing.Awaitable[
typing.Union[T, quart.Response]]]]:
typing.Union[T, quart.Response, werkzeug.Response]]]]:
def decorator(
f: typing.Callable[..., typing.Awaitable[T]],
) -> typing.Callable[..., typing.Awaitable[
typing.Union[T, quart.Response]]]:
typing.Union[T, quart.Response, werkzeug.Response]]]:
@functools.wraps(f)
@self.require_session(redirect_to=redirect_to)
async def wrapped(
*args: typing.Any,
**kwargs: typing.Any,
) -> typing.Union[T, quart.Response]:
) -> typing.Union[T, quart.Response, werkzeug.Response]:
if not self.is_admin_session:
raise abort(403, "This is not for you.")
@@ -489,7 +582,7 @@ class ProsodyClient:
session=session,
)
avatar_hash = avatar_info["sha1"]
except quart.exceptions.HTTPException:
except werkzeug.exceptions.HTTPException:
avatar_hash = None
return {
@@ -641,7 +734,7 @@ class ProsodyClient:
new_access_model,
)
))
except quart.exceptions.NotFound:
except werkzeug.exceptions.NotFound:
if ignore_not_found:
return
raise
@@ -771,7 +864,7 @@ class ProsodyClient:
session: aiohttp.ClientSession,
) -> str:
access_models = filter(
lambda x: not isinstance(x, quart.exceptions.NotFound),
lambda x: not isinstance(x, werkzeug.exceptions.NotFound),
await asyncio.gather(
self.get_avatar_access_model(session=session),
self.get_nickname_access_model(session=session),
@@ -874,7 +967,7 @@ class ProsodyClient:
localpart: str,
*,
display_name: typing.Optional[str],
roles: typing.Optional[typing.Collection[str]],
role: typing.Optional[str],
session: aiohttp.ClientSession,
) -> None:
payload: typing.Dict[str, typing.Any] = {
@@ -882,8 +975,8 @@ class ProsodyClient:
}
if display_name is not None:
payload["display_name"] = display_name
if roles is not None:
payload["roles"] = list(roles)
if role is not None:
payload["role"] = role
async with session.put(
self._admin_v1_endpoint("/users/{}".format(localpart)),
@@ -891,6 +984,36 @@ class ProsodyClient:
) as resp:
self._raise_error_from_response(resp)
@autosession
async def enable_user_account(
self,
localpart: str,
*,
session: aiohttp.ClientSession,
) -> None:
async with session.patch(
self._admin_v1_endpoint("/users/{}".format(localpart)),
json={
"enabled": True,
},
) as resp:
self._raise_error_from_response(resp)
@autosession
async def disable_user_account(
self,
localpart: str,
*,
session: aiohttp.ClientSession,
) -> None:
async with session.patch(
self._admin_v1_endpoint("/users/{}".format(localpart)),
json={
"enabled": False,
},
) as resp:
self._raise_error_from_response(resp)
@autosession
async def get_user_debug_info(
self,
@@ -1019,7 +1142,7 @@ class ProsodyClient:
self,
name: str,
*,
create_muc: bool = True,
create_muc: bool = False,
session: aiohttp.ClientSession,
) -> AdminGroupInfo:
payload = {
@@ -1094,6 +1217,27 @@ class ProsodyClient:
) as resp:
self._raise_error_from_response(resp)
@autosession
async def add_group_chat(
self,
id_: str,
name: str,
*,
session: aiohttp.ClientSession,
) -> None:
payload: typing.Dict[str, typing.Any] = {
"name": name,
}
async with session.post(
self._admin_v1_endpoint(
"/groups/{}/chats".format(id_)
),
json=payload,
) as resp:
self._raise_error_from_response(resp)
@autosession
async def remove_group_member(
self,
@@ -1109,6 +1253,21 @@ class ProsodyClient:
) as resp:
self._raise_error_from_response(resp)
@autosession
async def remove_group_chat(
self,
group_id: str,
chat_id: str,
*,
session: aiohttp.ClientSession,
) -> None:
async with session.delete(
self._admin_v1_endpoint(
"/groups/{}/chats/{}".format(group_id, chat_id)
),
) as resp:
self._raise_error_from_response(resp)
@autosession
async def delete_group(
self,
@@ -1122,6 +1281,33 @@ class ProsodyClient:
self._raise_error_from_response(resp)
@autosession
async def export_account_data(
self,
*,
session: aiohttp.ClientSession,
) -> typing.Optional[str]:
async with session.get(
self._xep227_endpoint("/export?stores=roster,vcard,pep,pep_data"), # noqa:E501
) as resp:
self._raise_error_from_response(resp)
if resp.status == 204:
return None
return await resp.text()
@autosession
async def import_account_data(
self,
user_xml: str,
*,
session: aiohttp.ClientSession,
) -> bool:
async with session.put(
self._xep227_endpoint("/import?stores=roster,vcard,pep,pep_data"), # noqa:E501
data=user_xml,
) as resp:
self._raise_error_from_response(resp)
return True
async def revoke_token(
self,
*,
@@ -1135,7 +1321,8 @@ class ProsodyClient:
async def logout(self) -> None:
try:
await self.revoke_token()
async with self._plain_session as session:
await self.revoke_token(session=session)
except aiohttp.ClientError:
self.logger.warn("failed to revoke token!",
exc_info=True)

View File

@@ -275,22 +275,22 @@ div.form.layout-expanded {
}
@each $type in $text-entry-inputs {
input[type=$type] {
input[type=#{$type}] {
width: 100%;
border: none;
border-bottom: $w-s4 solid $primary-500;
margin-bottom: -$w-s4;
}
input[type=$type].has-error {
input[type=#{$type}].has-error {
border-right: $w-s4 solid $alert-500;
}
input[type=$type]:hover {
input[type=#{$type}]:hover {
border-bottom-color: $primary-700;
}
input[type=$type]:focus {
input[type=#{$type}]:focus {
border-bottom-color: $primary-800;
}
}
@@ -646,69 +646,6 @@ input[type="submit"], button, .button {
/* button, .button {
margin: 0 $w-s2;
}
button.lv-primary, .button.lv-primary {
background-color: $gray-500;
color: $gray-900;
border-radius: $w-s4;
border: $w-s4 solid $gray-400;
@each $type, $values in $colours {
&.c-#{$type} {
border-color: nth($values, 4);
background-color: nth($values, 5);
color: nth($values, 9);
}
&.c-#{$type}:hover {
background-color: nth($values, 4);
}
}
}
button.lv-secondary, .button.lv-secondary {
background-color: $gray-700;
color: $gray-100;
border-radius: $w-s4;
@each $type, $values in $colours {
&.c-#{$type} {
background-color: nth($values, 7);
color: nth($values, 1);
}
}
}
button.lv-tertiary, .button.lv-tertiary {
background-color: inherit;
color: $gray-300;
border-radius: $w-s4;
text-decoration: underline;
@each $type, $values in $colours {
&.c-#{$type} {
color: nth($values, 3);
}
}
}
*/
/*
button.lv-secondary.c-#{$type}, .button.lv-secondary.c-#{$type} {
background-color: nth($values, 7);
color: nth($values, 1);
}
button.lv-tertiary.c-#{$type}, .button.lv-tertiary.c-#{$type} {
color: nth($values, 3);
text-decoration: underline;
background-color: transparent;
}
}*/
/* boxes */
.box {
@@ -771,8 +708,7 @@ button.lv-tertiary, .button.lv-tertiary {
height: 1.5em;
vertical-align: middle;
background-size: cover;
box-shadow: inset 0px 0px 0px 2px rgba(0, 0, 0, 0.2);
border-radius: $w-s4;
border-radius: 10%;
margin: 0 0.25em;
@@ -1121,7 +1057,7 @@ pre.guru-meditation {
}
@each $type in $text-entry-inputs {
input[type=$type] {
input[type=#{$type}] {
background-color: black;
}
@@ -1131,6 +1067,10 @@ pre.guru-meditation {
}
}
label, legend {
color: $gray-800 !important;
}
.box {
background-color: black;
border-color: $gray-800;
@@ -1265,6 +1205,13 @@ pre.guru-meditation {
p.form-desc.weak, p.field-desc.weak {
color: $gray-700;
}
.user-badge-icon {
color: $gray-900 !important;
background-color: $gray-100 !important;
border-color: $gray-300 !important;
box-shadow: black 0 0 2px !important;
}
}
/* tooltip magic */
@@ -1315,3 +1262,46 @@ pre.guru-meditation {
.with-tooltip:hover:before, .with-tooltip:hover:after {
display: block;
}
.username-with-avatar {
display: flex;
align-items: center;
.avatar-container {
position: relative;
.avatar {
margin-left: 0;
}
}
.user-badge-icon {
position: absolute;
bottom: -10px;
right: 0px;
background: white;
border-radius: 50%;
width: 1.2em;
height: 1.2em;
border-color: $gray-500;
border-width: 1px;
border-style: solid;
text-align: center;
margin: 0;
padding: 0;
margin: 0;
padding: 0;
box-shadow: $gray-500 0px 0px 2px;
line-height: 1;
.icon {
/* vertical-align: text-bottom; */
padding: 0.1em;
}
}
.user-info-container {
margin-left: 0.5em;
}
}

View File

@@ -80,60 +80,6 @@ img.fdroid {
height: $w-l3;
}
.tabbox {
display: flex;
flex-direction: column;
margin: $w-l1 0;
> nav.tabs {
display: flex;
flex-direction: row;
> a {
display: inline-block;
padding: $w-s2;
border-top-left-radius: $w-s4;
border-top-right-radius: $w-s4;
&, &:visited {
color: inherit;
text-decoration: underline;
text-decoration-color: $accent-500;
}
&:hover {
background: $accent-900;
border-color: $accent-800;
color: black;
}
&.active {
text-decoration: none;
background: linear-gradient(0deg, $accent-600, $accent-700);
color: $accent-200;
&:hover, &:focus {
background: linear-gradient(0deg, $accent-700, $accent-800);
}
&:active {
background: $accent-600;
}
}
}
}
> .tab-pane {
display: none;
padding: 0 $w-0;
background: $accent-900;
&.active {
display: block;
}
}
}
.qr {
margin: $w-l1 0;
display: flex;

View File

@@ -42,6 +42,21 @@ licensed under the terms of the Apache 2.0 License -->
<g fill="none"><path d="M0 0h24v24H0V0z" /><path d="M0 0h24v24H0V0z" opacity=".87" /></g>
<path d="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM9 8V6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9z" />
</symbol>
<!-- from: action/lock_open/materialiconsround/24px.svg -->
<symbol id="icon-lock_open" viewBox="0 0 24 24">
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M12 13c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6-5h-1V6c0-2.76-2.24-5-5-5-2.28 0-4.27 1.54-4.84 3.75-.14.54.18 1.08.72 1.22.53.14 1.08-.18 1.22-.72C9.44 3.93 10.63 3 12 3c1.65 0 3 1.35 3 3v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 11c0 .55-.45 1-1 1H7c-.55 0-1-.45-1-1v-8c0-.55.45-1 1-1h10c.55 0 1 .45 1 1v8z" />
</symbol>
<!-- from: action/restore_from_trash/materialiconsround/24px.svg -->
<symbol id="icon-restore_from_trash" viewBox="0 0 24 24">
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v10zm5.65-8.65c.2-.2.51-.2.71 0L16 14h-2v4h-4v-4H8l3.65-3.65zM15.5 4l-.71-.71c-.18-.18-.44-.29-.7-.29H9.91c-.26 0-.52.11-.7.29L8.5 4H6c-.55 0-1 .45-1 1s.45 1 1 1h12c.55 0 1-.45 1-1s-.45-1-1-1h-2.5z" />
</symbol>
<!-- from: communication/import_export/materialiconsround/24px.svg -->
<symbol id="icon-import_export" viewBox="0 0 24 24">
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M8.65 3.35L5.86 6.14c-.32.31-.1.85.35.85H8V13c0 .55.45 1 1 1s1-.45 1-1V6.99h1.79c.45 0 .67-.54.35-.85L9.35 3.35c-.19-.19-.51-.19-.7 0zM16 17.01V11c0-.55-.45-1-1-1s-1 .45-1 1v6.01h-1.79c-.45 0-.67.54-.35.85l2.79 2.78c.2.19.51.19.71 0l2.79-2.78c.32-.31.09-.85-.35-.85H16z" />
</symbol>
<!-- from: communication/qr_code/materialiconsround/24px.svg -->
<symbol id="icon-qrcode" viewBox="0 0 24 24">
<g><rect fill="none" height="24" width="24" /><rect fill="none" height="24" width="24" /></g>
@@ -88,6 +103,21 @@ licensed under the terms of the Apache 2.0 License -->
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M3.4 20.4l17.45-7.48c.81-.35.81-1.49 0-1.84L3.4 3.6c-.66-.29-1.39.2-1.39.91L2 9.12c0 .5.37.93.87.99L17 12 2.87 13.88c-.5.07-.87.5-.87 1l.01 4.61c0 .71.73 1.2 1.39.91z" />
</symbol>
<!-- from: file/file_download/materialicons/24px.svg -->
<symbol id="icon-download" viewBox="0 0 24 24">
<path d="M0 0h24v24H0z" fill="none" />
<path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z" />
</symbol>
<!-- from: file/file_upload/materialicons/24px.svg -->
<symbol id="icon-upload" viewBox="0 0 24 24">
<path d="M0 0h24v24H0z" fill="none" />
<path d="M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z" />
</symbol>
<!-- from: file/folder/materialiconsround/24px.svg -->
<symbol id="icon-folder" viewBox="0 0 24 24">
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M10.59 4.59C10.21 4.21 9.7 4 9.17 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-1.41-1.41z" />
</symbol>
<!-- from: navigation/arrow_back/materialiconsround/24px.svg -->
<symbol id="icon-back" viewBox="0 0 24 24">
<path d="M0 0h24v24H0V0z" fill="none" />

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -6,24 +6,32 @@
{% block body %}
<main>
<div class="box el-2">
<h1>{% trans %}About Snikket{% endtrans %}</h1>
<p>{% trans snikket_url="https://snikket.org" %}To learn more about Snikket, visit the <a href="{{ snikket_url}}">Snikket website</a>.{% endtrans %}</p>
<h2>{% trans %}About this Service{% endtrans %}</h2>
<p>{% trans site_name=config["SITE_NAME"] %}This is the Snikket service <em>{{ site_name }}</em>.{% endtrans %}</p>
<p>{% trans site_name=config["SITE_NAME"] %}This is the Snikket service <em>{{ site_name }}</em>, running open-source software from the Snikket project.{% endtrans %}</p>
<p>{% trans snikket_url="https://snikket.org" %}To learn more about Snikket, visit the <a href="{{ snikket_url}}">Snikket website</a>.{% endtrans %}</p>
<p><a href="/policies/">{% trans %}View service policies{% endtrans %}</a>
<h3>{% trans %}Licenses{% endtrans %}</h3>
<p>{% trans agpl_url="https://www.gnu.org/licenses/agpl.html" %}The web portal software is licensed under the terms of the <a href="{{ agpl_url }}">Affero GNU General Public License, version 3.0 or later</a>. The full terms of the license can be reviewed using the aforementioned link.{% endtrans %}</p>
<p>{% trans source_url="https://github.com/snikket-im/snikket-web-portal/" %}The source code of the web portal can be downloaded and viewed in <a href="{{ source_url }}">its GitHub repository</a>.{% endtrans %}</p>
<p>{% trans source_url="https://material.io/resources/icons/", apache20_url="https://www.apache.org/licenses/LICENSE-2.0.txt" %}The icons used in the web portal are <a href="{{ source_url }}">Googles Material Icons</a>, made available by Google under the terms of the <a href="{{ apache20_url }}">Apache 2.0 License</a>.{% endtrans %}</p>
<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 %}
<h3>{% trans %}Software Versions{% endtrans %}</h3>
<pre>Snikket Server
Domain: {{ config["SNIKKET_DOMAIN"] }}
Snikket Web Portal{% if version %} ({{ version }}){% endif %}
<pre>Domain: {{ config["SNIKKET_DOMAIN"] }}
Web Portal{% if version %} ({{ version }}){% endif %}
{%- if core_versions -%}
{% for name, version in core_versions.items() %}
{{ name }} ({{ version }}){% endfor %}
{%- endif -%}
{%- if extra_versions -%}
{% for name, version in extra_versions.items() %}
{{ name }} ({{ version }}){% endfor %}
{%- endif -%}</pre>
<p>
{%- call standard_button("back", url_for("index"), class="primary") -%}
{% trans %}Back to the main page{% endtrans %}

View File

@@ -3,7 +3,7 @@
{% block content %}
<h1>{% trans %}Manage circles{% endtrans %}</h1>
<p>{% trans %}<em>Circles</em> aim to help people who are in the same social circle find each other on your service.{% endtrans %}</p>
<p>{% trans %}Users who are in the same circle will see each other in their contact list. In addition, each circle has a group chat where the circle members are included.{% endtrans %}</p>
<p>{% trans %}Users who are in the same circle will see each other in their contact list. In addition, each circle may have group chats where the circle members are included.{% endtrans %}</p>
{%- if circles -%}
<form method="POST" action="{{ url_for(".create_invite") }}">
{{- invite_form.csrf_token -}}

View File

@@ -0,0 +1,5 @@
{% extends "admin_app.html" %}
{% block content %}
<h1>{{ target_circle.name }}</h1>
{%- include "admin_create_circle_group_chat_form.html" -%}
{% endblock %}

View File

@@ -0,0 +1,15 @@
{% from "library.j2" import form_button, render_errors %}
<form method="POST" action="{{ url_for(".edit_circle_add_chat", id_=target_circle.id_) }}">
{{- group_chat_form.csrf_token -}}
<div class="form layout-expanded">
<h2 class="form-title">{% trans %}Create new circle group chat{% endtrans %}</h2>
<p class="form-descr weak">{% trans %}Add a chat to your circle so its members can hold group discussions.{% endtrans %}</p>
<p class="form-descr weak"><strong>{% trans %}Tip:{% endtrans %}</strong> {% trans %}This is only for creating group chats that automatically include <em>all</em> members of the circle. If you want a normal group chat, create it in the Snikket app instead.{% endtrans %}</p>
<div class="f-ebox">
{{ group_chat_form.name.label }}
{{ group_chat_form.name }}
</div>
<div class="f-bbox">
{%- call form_button("add", group_chat_form.action_save, class="primary") %}{% endcall -%}
</div>
</div></form>

View File

@@ -0,0 +1,21 @@
{% extends "admin_app.html" %}
{% from "library.j2" import box, form_button, standard_button %}
{% block content %}
<h1>{% trans circle_name=target_circle.name %}Delete circle {{ circle_name }}{% endtrans %}</h1>
<div class="form layout-expanded"><form method="POST">
<h2 class="form-title">{% trans %}Delete circle{% endtrans %}</h2>
{{ form.csrf_token }}
<p class="form-descr">{% trans %}Are you sure you want to delete the following circle?{% endtrans %}</p>
<dl>
<dt>{% trans %}Name{% endtrans %}</dt>
<dd>{{ target_circle.name }}</dd>
</dl>
{% call box("alert", _("Danger")) %}
<p>{% trans %}The circle and the corresponding chat will be deleted, permanently and immediately upon pushing the below button. <strong>There is no way back!</strong>{% endtrans %}</p>
{% endcall %}
<div class="f-bbox">
{%- call standard_button("back", url_for(".edit_circle", id_=target_circle.id_), class="tertiary") %}{% trans %}Back{% endtrans %}{% endcall -%}
{%- call form_button("delete", form.action_delete, class="primary danger") %}{% endcall -%}
</div>
</form></div>
{% endblock %}

View File

@@ -13,13 +13,6 @@
<div class="box hint form layout-expanded">
<header>{% trans %}This is your main circle{% endtrans %}</header>
<p>{% trans %}This circle is managed automatically and cannot be removed or renamed.{% endtrans %}</p>
{%- if target_circle.muc_jid -%}
<div><label for="circle-muc-jid">{% trans %}Group chat address{% endtrans %}</label></div>
<div><input type="text" readonly="readonly" id="circle-muc-jid" value="{{ target_circle.muc_jid }}"></div>
{%- call clipboard_button(target_circle.muc_jid, show_label=True) -%}
{%- trans -%}Copy address{%- endtrans -%}
{%- endcall -%}
{%- endif -%}
</div>
{%- else -%}
<div class="form layout-expanded">
@@ -28,17 +21,6 @@
{{ form.name.label }}
{{ form.name }}
</div>
<div class="f-ebox">
{%- if target_circle.muc_jid -%}
<label for="circle-muc-jid">{% trans %}Group chat address{% endtrans %}</label>
<input type="text" readonly="readonly" id="circle-muc-jid" value="{{ target_circle.muc_jid }}">
{%- call clipboard_button(target_circle.muc_jid, show_label=True) -%}
{%- trans -%}Copy address{%- endtrans -%}
{%- endcall -%}
{%- else -%}
<p>{% trans %}This circle has no group chat associated.{% endtrans %}<p>
{%- endif -%}
</div>
<div class="f-bbox">
{%- call standard_button("back", url_for(".circles"), class="tertiary") -%}
{% trans %}Return to circle list{% endtrans %}
@@ -48,11 +30,43 @@
<h3 class="form-title">{% trans %}Delete circle{% endtrans %}</h3>
<p class="form-desc">{% trans %}Deleting a circle does not delete any users in the circle.{% endtrans %}</p>
<div class="f-bbox">
{%- call form_button("delete", form.action_delete, class="secondary danger") %}{% endcall -%}
{%- call standard_button("delete", url_for(".delete_circle", id_=target_circle.id_), class="secondary danger") %}{% trans %}Delete circle{% endtrans %}{% endcall -%}
</div>
</div>
{%- endif -%}
<h2 id="chats">{% trans %}Group chats{% endtrans %}</h2>
<p>{% trans %}These group chats will be available to all members of the circle.{% endtrans %}</p>
{%- if circle_chats -%}
<div class="el-2 elevated"><table>
<thead>
<th>{% trans %}Name{% endtrans %}</th>
<th>{% trans %}Actions{% endtrans %}</th>
</thead>
<tbody>
{%- for chat in circle_chats -%}
<tr>
<td class="collapsible">{% call value_or_hint(chat.name) %}{% endcall %}</td>
<td class="nowrap">
{%- call custom_form_button("delete", form.action_remove_group_chat.name, chat.id_, class="primary danger", slim=True) -%}
{% trans name=chat.name %}Delete group chat '{{ name }}'{% endtrans %}
{%- endcall -%}
</td>
</tr>
{%- endfor -%}
</tbody>
</table></div>
{%- else -%}
<p>{% trans %}This circle currently has no group chats.{% endtrans %}</p>
{%- endif -%}
{%- call standard_button("add", url_for(".edit_circle_add_chat", id_=target_circle.id_), class="secondary") -%}
{% trans %}Add group chat{% endtrans %}
{%- endcall -%}
<h2 id="members">{% trans %}Circle members{% endtrans %}</h2>
<p>{% trans %}All members of the circle will see each other in their contact list.{% endtrans %}</p>
{%- if circle_members -%}
<div class="el-2 elevated"><table>
<thead>

View File

@@ -3,7 +3,7 @@
{% macro access_level_description(role, caller=None) %}
{%- if role == "prosody:restricted" -%}
{% trans %}Limited users can interact with users on the same Snikket service and be members of circles.{% endtrans %}
{%- elif role == "prosody:normal" -%}
{%- elif role == "prosody:registered" -%}
{% trans %}Like limited users and can also interact with users on other Snikket services.{% endtrans %}
{%- elif role == "prosody:admin" -%}
{% trans %}Like normal users and can access the admin panel in the web portal.{% endtrans %}
@@ -19,12 +19,33 @@
{% block content %}
<h1>{% trans user_name=target_user.localpart %}Edit user {{ user_name }}{% endtrans %}</h1>
<form method="POST">{{ form.csrf_token }}<div class="form layout-expanded">
{% if target_user.deletion_request %}
<div class="box alert">
<header>{% trans %}This user account is pending deletion{% endtrans %}</header>
<p>{% trans date=target_user.deletion_request.deleted_at | format_datetime %}The owner of the account sent a deletion request on {{ date }} using their app.{% endtrans %}
<p>{% trans time=(target_user.deletion_request.pending_until - now())|format_timedelta %}The account has been locked, and will be automatically deleted permanently in {{ time }}.{% endtrans %}</p>
<p>{% trans %}If this was a mistake, you can cancel the deletion and restore the account.{% endtrans %}</p>
{%- call form_button("restore_from_trash", form.action_restore, class="secondary") %}{% endcall %}
</div>
{% elif not target_user.enabled %}
<div class="box alert">
<header>{% trans %}This user account is locked{% endtrans %}</header>
<p>{% trans %}The user will not be able to log in to their account until it is unlocked again.{% endtrans %}</p>
{%- call form_button("lock_open", form.action_enable, class="secondary") %}{% endcall %}
</div>
{% endif %}
<h2 class="form-title">{% trans %}Edit user{% endtrans %}</h2>
<div class="f-ebox">
{{ form.localpart.label }}
{{ form.localpart(readonly="readonly") }}
<p class="form-desc weak">{% trans %}The login name cannot be changed.{% endtrans %}</p>
</div>
<div class="f-ebox">
{{ form.display_name.label }}
{{ form.display_name }}
@@ -63,14 +84,14 @@
{% trans %}If the user has lost their password, you can use the button below to create a special link which allows to change the password of the account, once.{% endtrans %}
</p>
<div class="f-bbox">
{%- call form_button("passwd", form.action_create_reset, class="primary") -%}{%- endcall -%}
{%- call form_button("passwd", form.action_create_reset, class="secondary") -%}{%- endcall -%}
</div>
<h2 class="form-title">{% trans %}Debug information{% endtrans %}</h2>
<p class="form-desc">
{% trans %}In some cases, extended information about the user account and the connected devices is necessary to troubleshoot issues. The button below reveals this (sensitive) information.{% endtrans %}
</p>
<div class="f-bbox">
{%- call standard_button("bug_report", url_for(".debug_user", localpart=target_user.localpart), class="primary") -%}
{%- call standard_button("bug_report", url_for(".debug_user", localpart=target_user.localpart), class="secondary") -%}
{%- trans -%}Show debug information{%- endtrans -%}
{%- endcall -%}
</div>

View File

@@ -68,6 +68,14 @@
<em>{% trans %}unknown{% endtrans %}</em>
{%- endif -%}
</dd>
<dt>{% trans %}Storage used by shared files{% endtrans %}</dt>
<dd>
{%- if metrics.prosody_uploads | default(None) is not none -%}
{{ metrics.prosody_uploads | format_bytes }}
{%- else -%}
<em>{% trans %}unknown{% endtrans %}</em>
{%- endif -%}
</dd>
<dt>{% trans %}Connected devices{% endtrans %}</dt>
<dd>
{%- if metrics.prosody_devices | default(None) is not none -%}

View File

@@ -1,12 +1,12 @@
{% extends "admin_app.html" %}
{% from "library.j2" import action_button, icon, value_or_hint, custom_form_button %}
{% from "library.j2" import action_button, avatar, icon, render_user, value_or_hint, custom_form_button with context %}
{% block content %}
<h1>{% trans %}Manage users{% endtrans %}</h1>
<div class="elevated el-2"><table>
<thead>
<tr>
<th>{% trans %}Login name{% endtrans %}</th>
<th>{% trans %}Display name{% endtrans %}</th>
<th>{% trans %}User{% endtrans %}</th>
<th>{% trans %}Last active{% endtrans %}</th>
<th>{% trans %}Actions{% endtrans %}</th>
</tr>
</thead>
@@ -14,15 +14,15 @@
{% for user in users %}
<tr>
<td>
{{- user.localpart -}}
{%- if user.has_admin_role -%}
<span class="with-tooltip above" data-tooltip="{% trans %}The user is an administrator.{% endtrans %}">{% call icon("admin") %}{% trans %} (Administrator){% endtrans %}{% endcall %}</span>
{%- endif -%}
{%- if user.has_restricted_role -%}
<span class="with-tooltip above" data-tooltip="{% trans %}The user is restricted.{% endtrans %}">{% call icon("lock") %}{% trans %} (Restricted){% endtrans %}{% endcall %}</span>
{%- endif -%}
{%- call render_user(user) -%}{%- endcall -%}
</td>
<td>{% call value_or_hint(user.display_name) %}{% endcall %}</td>
{% if user.enabled %}
<td>{{ user.last_active | format_last_activity }}</td>
{% elif user.deletion_request %}
<td>{% trans %}Deleted{% endtrans %}</td>
{% else %}
<td>{% trans %}Locked{% endtrans %}</td>
{% endif %}
<td class="nowrap">
{%- call action_button("edit", url_for(".edit_user", localpart=user.localpart), class="primary") -%}
{% trans user_name=user.localpart %}Edit user {{ user_name }}{% endtrans %}

View File

@@ -28,12 +28,12 @@
</div>
<div class="f-ebox">
{{ form.password.label }}
{{ form.password }}
{{ form.password(autocomplete="new-password") }}
<p class="field-desc weak">{% trans %}Enter a secure password that you do not use anywhere else.{% endtrans %}</p>
</div>
<div class="f-ebox">
{{ form.password_confirm.label }}
{{ form.password_confirm }}
{{ form.password_confirm(autocomplete="new-password") }}
</div>
<div class="f-bbox">
{%- call form_button("done", form.action_register, class="primary") -%}{%- endcall -%}

View File

@@ -17,11 +17,11 @@
{%- call render_errors(form) %}{% endcall -%}
<div class="f-ebox">
{{ form.password.label }}
{{ form.password }}
{{ form.password(autocomplete="new-password") }}
</div>
<div class="f-ebox">
{{ form.password_confirm.label }}
{{ form.password_confirm }}
{{ form.password_confirm(autocomplete="new-password") }}
</div>
<div class="f-bbox">
{%- call form_button("passwd", form.action_reset, class="primary") -%}{%- endcall -%}

View File

@@ -1,6 +1,6 @@
{% extends "invite.html" %}
{% set body_id = "invite" %}
{% from "library.j2" import form_button, clipboard_button %}
{% from "library.j2" import form_button, clipboard_button, render_errors %}
{% block head_lead %}
<title>{% trans site_name=config["SITE_NAME"] %}Successfully registered on {{ site_name }} | Snikket{% endtrans %}</title>
{%- include "copy-snippet.html" -%}
@@ -16,5 +16,46 @@
{%- endcall -%}
<p>{% trans %}You can now set up your legacy XMPP client with the above address and the password you chose during registration.{% endtrans %}</p>
<p>{% trans login_url=url_for('main.login') %}You can now safely close this page, or log in to the web portal to <a href="{{ login_url }}">manage your account</a>.{% endtrans %}</p>
{% if migration_success %}
<h2>{% trans %}Import successful{% endtrans %}</h2>
<p>{% trans %}Congratulations! Your account data has been successfully imported.{% endtrans %}</p>
{% endif %}
{% if form %}
<h2>{% trans %}Moving to Snikket?{% endtrans %}</h2>
<p>{% trans %}If you are moving from a different Snikket instance or another XMPP-compatible service, you may optionally import the data (contacts, profile information, etc.) from your previous account. When you have exported the data from your previous account, upload it using the form below.{% endtrans %}</p>
<div class="form layout-expanded"><form method="POST" enctype="multipart/form-data">
<h3 class="form-title">{% trans %}Upload account data{% endtrans %}</h3>
{{ form.csrf_token }}
{% call render_errors(form) %}{% endcall %}
<div class="f-ebox">
{{ form.account_data_file.label }}
{{ form.account_data_file(accept="application/xml",
data_maxsize=max_import_size,
data_warning_header=import_too_big_warning_header,
data_maxsize_warning=import_too_big_warning) }}
</div>
<div class="f-bbox">
{%- call form_button("upload", form.action_import, class="secondary") %}{% endcall -%}
</div>
<script type="text/javascript">
document.getElementById("{{ form.account_data_file.id }}").onchange = function() {
var maxsize_s = this.dataset.maxsize;
var maxsize = parseInt(maxsize_s);
if (this.files[0].size > maxsize) {
var warning_header = this.dataset.warningHeader;
var warning_text = this.dataset.maxsizeWarning;
this.setCustomValidity(warning_text);
this.reportValidity();
this.value = null;
} else {
this.setCustomValidity("");
}
};
</script>
</form></div>
{% endif %}
</div>
{% endblock %}

View File

@@ -17,6 +17,13 @@
{%- else -%}
<p>{% trans site_name=config["SITE_NAME"] %}You have been invited to chat on {{ site_name }} using Snikket, a secure, privacy-friendly chat app.{% endtrans %}</p>
{%- endif -%}
{%- if config["TOS_URI"] and config["PRIVACY_URI"] -%}
<p>
{% trans site_name=config["SITE_NAME"], tos_uri=config["TOS_URI"], privacy_uri=config["PRIVACY_URI"] %}By continuing, you agree to the <a href="{{tos_uri}}">Terms of Service</a> and <a href="{{privacy_uri}}">Privacy Policy</a>.{% endtrans %}
</p>
{%- endif -%}
<h2>{% trans %}Get started{% endtrans %}</h2>
{%- if apple_store_url -%}
<p>{% trans %}Install the Snikket App on your Android or iOS device.{% endtrans %}</p>
@@ -56,29 +63,7 @@
{%- endcall -%}
</header>
<p>{% trans %}You can transfer this invite to your mobile device by scanning a code with your camera. You can use either a QR scanner app or the Snikket app itself.{% endtrans %}</p>
<div class="tabbox">
{#- -#}
<nav class="tabs" role="tablist">
{#- -#}
<a href="#qr-info-url" class="active" role="tab" aria-controls="qr-info-url" aria-selected="true" onclick="select_tab(this); return false;">{% trans %}Using a QR code scanner{% endtrans %}</a>
{#- -#}
<a href="#qr-info-uri" role="tab" aria-controls="qr-info-uri" aria-selected="false" onclick="select_tab(this); return false;">{% trans %}Using the Snikket app{% endtrans %}</a>
{#- -#}
</nav>
{#- -#}
<div id="qr-info-url" class="tab-pane active">
<p>{% trans %}Use a <em>QR code</em> scanner on your mobile device to scan the code below:{% endtrans %}</p>
<div id="qr-invite-page" data-qrdata="{{ url_for(".view", id_=invite_id, _external=True, _scheme="https") }}" class="qr"></div>
</div>
{#- -#}
<div id="qr-info-uri" class="tab-pane">
<img class="float-right" id="tutorial-scan" aria-hidden="true" alt="" src="{{ url_for("static", filename="img/tutorial-scan.png") }}">
<p>{% trans %}Install the Snikket app on your mobile device, open it, and tap the 'Scan' button at the top.{% endtrans %}</p>
<p>{% trans %}Your camera will turn on. Point it at the square code below until it is within the highlighted square on your screen, and wait until the app recognises it.{% endtrans %}</p>
<div id="qr-uri" data-qrdata="{{ invite.xmpp_uri }}" class="qr"></div>
</div>
{#- -#}
</div>
<div id="qr-invite-page" data-qrdata="{{ url_for(".view", id_=invite_id, _external=True, _scheme="https") }}" class="qr"></div>
{#- -#}
{%- call standard_button("close", "#", onclick="close_modal(this.parentNode.parentNode); return false;", class="primary") -%}
{% trans %}Close{% endtrans %}

View File

@@ -10,6 +10,29 @@
{%- endif -%}
{%- endmacro %}
{% macro render_user(user, caller=None) -%}
<div class="username-with-avatar">
<div class="avatar-container">
{%- call avatar(user.localpart+"@"+config["SNIKKET_DOMAIN"], user.avatar_info[0].hash if user.avatar_info | length > 0 else None ) %}{% endcall -%}
{%- if user.has_admin_role -%}
<div class="user-badge-icon">
<span class="with-tooltip above" data-tooltip="{% trans %}The user is an administrator.{% endtrans %}">{% call icon("admin") %}{% trans %} (Administrator){% endtrans %}{% endcall %}</span>
</div>
{%- elif user.has_restricted_role -%}
<div class="user-badge-icon">
<span class="with-tooltip above" data-tooltip="{% trans %}The user is restricted.{% endtrans %}">{% call icon("lock") %}{% trans %} (Restricted){% endtrans %}{% endcall %}</span>
</div>
{%- endif -%}
</div>
<div class="user-info-container">
<div class="user-localpart">{{- user.localpart -}}</div>
{%- if user.display_name %}
<div class="user-display-name">{{- user.display_name -}}</div>
{%- endif %}
</div>
</div>
{%- endmacro -%}
{% macro showuri(uri, caller=None, id_=None) %}
{%- if uri is none -%}
<em>—</em>

View File

@@ -0,0 +1,39 @@
{% extends "base.html" %}
{% from "library.j2" import standard_button %}
{% block head_lead %}
<title>{% trans %}Policies{% endtrans %} - {{ config["SITE_NAME"] }}</title>
{% endblock %}
{% block body %}
<main>
<div class="box el-2">
<h1>{{ config["SITE_NAME"] }}</h1>
<h2>{% trans %}Policies{% endtrans %}</h2>
{% if config["TOS_URI"] or config["PRIVACY_URI"] -%}
<p>{% trans %}Use of this service is subject to the following policies:{% endtrans %}</p>
<ul>
{%- if config["TOS_URI"] %}
<li><a href="{{ config["TOS_URI"] }}">{% trans %}Terms of Service{% endtrans %}</a></li>
{%- endif %}
{%- if config["PRIVACY_URI"] %}
<li><a href="{{ config["PRIVACY_URI"] }}">{% trans %}Privacy Policy{% endtrans %}</a></li>
{%- endif %}
</ul>
{%- else -%}
<p>{% trans %}Please contact the administrator of this instance if you have questions about policies.{% endtrans %}</p>
{% endif -%}
<p>{% trans url="https://snikket.org/app/privacy/" %}Use of the Snikket apps is subject to the <a href="{{url}}">Snikket Apps Privacy Policy</a>.{% endtrans %}</p>
{%- if config["ABUSE_EMAIL"] %}
<p>{% trans email=config["ABUSE_EMAIL"], domain=config["SNIKKET_DOMAIN"] %}To report policy violations or other abuse from this service, please send an email to {{email}}. Specify the domain name of this instance ({{domain}}) and include details of the incident(s).{% endtrans %}</p>
{%- endif %}
<p>
{%- call standard_button("back", url_for("index"), class="primary") -%}
{% trans %}Back to the main page{% endtrans %}
{%- endcall -%}
</p>
</div>
</main>
{% endblock %}

View File

@@ -0,0 +1,16 @@
# {{ config["SNIKKET_DOMAIN"] }} is running open-source software
# from the Snikket project: https://snikket.org/
{% if config["SECURITY_EMAIL"] -%}
# Security issues related to this service should be addressed to the
# following security contact:
Contact: mailto:{{ config["SECURITY_EMAIL"] }}
{% else -%}
# This service does not have a public security contact. You might find
# more information about the service at the following link:
Contact: https://{{ config["SNIKKET_DOMAIN"] }}/policies/
{%- endif %}
# Please report software defects to the project developers, per the
# instructions at the following link:
Contact: https://snikket.org/security/

View File

@@ -30,6 +30,7 @@
<div>
<div>{% call standard_button("edit", url_for(".profile"), class="primary") %}{% trans %}Edit profile{% endtrans %}{% endcall %}</div>
<div>{% call standard_button("passwd", url_for(".change_pw"), class="secondary") %}{% trans %}Change password{% endtrans %}{% endcall %}</div>
<div>{% call standard_button("folder", url_for(".manage_data"), class="secondary") %}{% trans %}Manage your data{% endtrans %}{% endcall %}</div>
</div>
{#- -#}
</li>

View File

@@ -0,0 +1,24 @@
{% extends "app.html" %}
{% from "library.j2" import standard_button, form_button, render_errors, avatar with context %}
{% block content %}
<h1>{% trans %}Manage your data{% endtrans %}</h1>
<nav class="welcome">
<ul>
<li>
<h2>{% trans %}Export account{% endtrans %}</h2>
<p>{% trans %}Download your account data as a file for backup purposes or to move your account to another service.{% endtrans %}</p>
{% call render_errors(form) %}{% endcall %}
<div class="f-bbox">
{%- call standard_button("back", url_for('.index'), class="tertiary") %}{% trans %}Back{% endtrans %}{% endcall -%}
<form method="POST">
{{ form.csrf_token }}
{%- call form_button("download", form.action_export, class="primary") %}{% endcall -%}
</form>
</div>
</li>
</ul>
</nav>
{% endblock %}

View File

@@ -9,15 +9,15 @@
{%- endcall -%}
<div class="f-ebox">
{{ form.current_password.label(class="required") }}
{{ form.current_password(class=("has-error" if form.current_password.name in form.errors else "")) }}
{{ form.current_password(class=("has-error" if form.current_password.name in form.errors else ""), autocomplete="current-password") }}
</div>
<div class="f-ebox">
{{ form.new_password.label(class="required") }}
{{ form.new_password }}
{{ form.new_password(autocomplete="new-password") }}
</div>
<div class="f-ebox">
{{ form.new_password_confirm.label(class="required") }}
{{ form.new_password_confirm(class=("has-error" if form.new_password_confirm.name in form.errors else "")) }}
{{ form.new_password_confirm(class=("has-error" if form.new_password_confirm.name in form.errors else ""), autocomplete="new-password") }}
</div>
<div class="box warning">
<header>{% trans %}Warning{% endtrans %}</header>

View File

@@ -7,321 +7,360 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"PO-Revision-Date: 2021-04-02 19:01+0000\n"
"Last-Translator: Daniel Holmgaard <annoncer@protonmail.com>\n"
"Language-Team: Danish <https://i18n.sotecware.net/projects/snikket/web-"
"portal/da/>\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2022-05-30 14:01+0000\n"
"Last-Translator: Daniel Holmgaard <fovatis@tutanota.com>\n"
"Language-Team: Danish <http://i18n.sotecware.net/projects/snikket/web-portal/"
"da/>\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.5.1\n"
"X-Generator: Weblate 4.8.1\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr "Begrænset"
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "Login-navn"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "Kaldenavn"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr "Adgangsniveau"
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr "Begrænset"
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr "Normal bruger"
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
msgid "Administrator"
msgstr "Administrator"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
msgid "Update user"
msgstr "Opdater bruger"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
msgid "Create password reset link"
msgstr "Opret link til nulstilling af adgangskode"
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
msgid "Password reset link created"
msgstr "Link til nulstilling af adgangskode oprettet"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
msgid "User information updated."
msgstr "Brugerinformation opdateret."
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "Slet bruger permanent"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
msgid "User deleted"
msgstr "Bruger slettet"
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
msgid "Password reset link not found"
msgstr "Link til nulstilling af adgangskode ikke fundet"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
msgid "Password reset link deleted"
msgstr "Link til nulstilling af adgangskode slettet"
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "Inviter til cirkel"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "Mindst en cirkel skal vælges"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "Gyldig for"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "En time"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "Tolv timer"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "En dag"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "En uge"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "Fire uger"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "Invitationstype"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr "Individuel"
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr "Gruppe"
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "Ny invitationslink"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "Tilbagekald"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
msgid "Invitation created"
msgstr "Invitation oprettet"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
msgid "No such invitation exists"
msgstr "Denne invitation findes ikke"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
msgid "Invitation revoked"
msgstr "Invitation tilbagekaldt"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "Navn"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "Opret cirkel"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
msgid "Circle created"
msgstr "Cirkel oprettet"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "Vælg bruger"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
msgid "Update circle"
msgstr "Opdater cirkel"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "Slet cirkel permanent"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "Tilføj bruger"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
msgid "No such circle exists"
msgstr "Denne cirkel findes ikke"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
msgid "Circle data updated"
msgstr "Cirkel-data opdateret"
#: snikket_web/admin.py:525
msgid "Circle deleted"
msgstr "Cirkel slettet"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
msgid "User added to circle"
msgstr "Bruger tilføjet til cirkel"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
msgid "User removed from circle"
msgstr "Bruger fjernet fra cirkel"
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "Slet cirkel permanent"
#: snikket_web/admin.py:574
msgid "Circle deleted"
msgstr "Cirkel slettet"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr ""
msgstr "Meddelelsens indhold"
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr ""
msgstr "Send kun til online brugere"
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr ""
msgstr "Send til alle brugere"
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr ""
msgstr "Send forhåndsvisning til dig selv"
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr ""
msgstr "Bekendgørelse sendt!"
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "Hoved"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
"De kontodata, du forsøgte at importere, er for store til at uploade. Kontakt "
"din Snikket-operatør."
#: snikket_web/invite.py:114
msgid "Username"
msgstr "Brugernavn"
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "Adgangskode"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
msgid "Confirm password"
msgstr "Bekræft adgangskode"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
msgid "The passwords must match."
msgstr "Adgangskoderne skal matche."
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
msgid "Create account"
msgstr "Opret konto"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
msgid "That username is already taken."
msgstr "Det brugernavn er allerede taget."
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
msgid "Registration was declined for unknown reasons."
msgstr "Registrering blev afvist af ukendte årsager."
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
msgid "The username is not valid."
msgstr "Brugernavnet er ikke gyldigt."
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "Ændr adgangskode"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr "Kontodatafil"
#: snikket_web/invite.py:250
msgid "Import data"
msgstr "Importer data"
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
"De kontodata, du forsøgte at importere, er i et ukendt format. Upload en XML-"
"fil i XEP-0227-format (forudsat format: %(mimetype)s)."
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr "Fejl"
#: snikket_web/main.py:38
msgid "Address"
msgstr "Adresse"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "Log ind"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
msgid "Invalid username or password."
msgstr "Ugyldigt brugernavn eller adgangskode."
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr "Login lykkedes!"
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "Nuværende adgangskode"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "Ny adgangskode"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "Bekræft ny adgangskode"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
msgid "The new passwords must match."
msgstr "Den nye adgangskode skal matche."
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr "Log ud"
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr "Ingen"
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "Kun venner"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "Alle"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "Avatar"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr "Profilsynlighed"
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "Opdater profil"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr "Kontodata"
#: snikket_web/user.py:86
msgid "Upload"
msgstr "Upload"
#: snikket_web/user.py:111
msgid "Incorrect password."
msgstr "Forkert adgangskode."
#: snikket_web/user.py:103
#: snikket_web/user.py:115
msgid "Password changed"
msgstr "Adgangskode ændret"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
@@ -329,13 +368,17 @@ msgstr ""
"Den valgte avatar er for stor. For at kunne uploade større avatarer skal du "
"bruge appen."
#: snikket_web/user.py:159
#: snikket_web/user.py:170
msgid "Profile updated"
msgstr "Profil opdateret"
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
msgstr "Fejl"
#: snikket_web/user.py:184
msgid "Export"
msgstr "Exporter"
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr "Du har i øjeblikket ingen kontodata at eksportere."
#: snikket_web/templates/_footer.html:4
#, python-format
@@ -427,7 +470,7 @@ msgstr ""
msgid "Software Versions"
msgstr "Software versioner"
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "Tilbage til hovedsiden"
@@ -543,6 +586,53 @@ msgstr "Rå fejlretningsdump"
msgid "Copy complete output"
msgstr "Kopier komplet output"
#: snikket_web/templates/admin_delete_circle.html:4
#, fuzzy, python-format
#| msgid "Edit circle %(circle_name)s"
msgid "Delete circle %(circle_name)s"
msgstr "Rediger cirkel %(circle_name)s"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "Slet cirkel"
#: snikket_web/templates/admin_delete_circle.html:8
#, fuzzy
#| msgid "Are you sure you want to delete the following user?"
msgid "Are you sure you want to delete the following circle?"
msgstr "Er du sikker på, at du vil slette følgende bruger?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Fare"
#: snikket_web/templates/admin_delete_circle.html:14
#, fuzzy
#| msgid ""
#| "The user and their data will be deleted irrevocably, permanently and "
#| "immediately upon pushing the below button. <strong>There is no way back!</"
#| "strong>"
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
"Brugeren og deres data slettes uigenkaldeligt, permanent og straks efter "
"tryk på nedenstående knap. <strong>Der er ingen vej tilbage!</strong>"
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "Tilbage"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -557,10 +647,6 @@ msgstr "Slet bruger"
msgid "Are you sure you want to delete the following user?"
msgstr "Er du sikker på, at du vil slette følgende bruger?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Fare"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -570,14 +656,6 @@ msgstr ""
"Brugeren og deres data slettes uigenkaldeligt, permanent og straks efter "
"tryk på nedenstående knap. <strong>Der er ingen vej tilbage!</strong>"
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "Tilbage"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr "Dette er din hovedcirkel"
@@ -610,10 +688,6 @@ msgstr "Denne cirkel er ikke tilknyttet nogen gruppechat."
msgid "Return to circle list"
msgstr "Retur til cirkeliste"
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "Slet cirkel"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr "Sletning af en cirkel vil ikke slette brugere i cirklen."
@@ -624,7 +698,7 @@ msgstr "Cirkel medlemmer"
#: snikket_web/templates/admin_edit_circle.html:71
msgid "The user has been deleted from the server."
msgstr ""
msgstr "Brugeren er blevet slettet fra serveren."
#: snikket_web/templates/admin_edit_circle.html:71
#: snikket_web/templates/library.j2:108
@@ -838,22 +912,21 @@ msgstr "Håndter invitationer"
#: snikket_web/templates/admin_home.html:35
msgid "System health"
msgstr ""
msgstr "Systemets sundhed"
#: snikket_web/templates/admin_home.html:38
msgid "View the server status or send a broadcast message to all users."
msgstr ""
"Vis serverstatus, eller send en udsendelsesmeddelelse til alle brugere."
#: snikket_web/templates/admin_home.html:40
msgid "Send a broadcast message to all users."
msgstr ""
msgstr "Send en udsendelsesmeddelelse til alle brugere."
#: snikket_web/templates/admin_home.html:43
#: snikket_web/templates/admin_system.html:4
#, fuzzy
#| msgid "Manage users"
msgid "Manage system"
msgstr "Håndter brugere"
msgstr "Håndter system"
#: snikket_web/templates/admin_home.html:48
msgid "Go back to your user's web portal page."
@@ -914,11 +987,11 @@ msgstr "Ødelæg link"
#: snikket_web/templates/admin_system.html:6
msgid "Overall system status"
msgstr ""
msgstr "Samlet systemstatus"
#: snikket_web/templates/admin_system.html:9
msgid "System load (5 minute average)"
msgstr ""
msgstr "Systembelastning (5 minutters gennemsnit)"
#: snikket_web/templates/admin_system.html:14
#: snikket_web/templates/admin_system.html:22
@@ -927,12 +1000,13 @@ msgstr ""
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr ""
msgstr "ukendt"
#: snikket_web/templates/admin_system.html:17
msgid "Memory use"
msgstr ""
msgstr "Forbrug af hukommelse"
#: snikket_web/templates/admin_system.html:20
#, python-format
@@ -940,50 +1014,56 @@ msgid ""
"%(percentage_global)s of %(mem_available)s. Of that, Snikket uses "
"%(percentage_snikket)s."
msgstr ""
"%(percentage_global)s af %(mem_available)s. Der af bruger Snikket "
"%(percentage_snikket)s."
#: snikket_web/templates/admin_system.html:27
msgid "Web portal status"
msgstr ""
msgstr "Webportalens status"
#: snikket_web/templates/admin_system.html:30
#: snikket_web/templates/admin_system.html:53
msgid "Version"
msgstr ""
msgstr "Version"
#: snikket_web/templates/admin_system.html:31
#: snikket_web/templates/admin_system.html:54
msgid "View all versions"
msgstr ""
msgstr "Vis alle versioner"
#: snikket_web/templates/admin_system.html:32
#: snikket_web/templates/admin_system.html:55
msgid "Average CPU use"
msgstr ""
msgstr "Gennemsnitlig CPU-forbrug"
#: snikket_web/templates/admin_system.html:40
#: snikket_web/templates/admin_system.html:63
msgid "Current memory use"
msgstr ""
msgstr "Nuværende hukommelsesbrug"
#: snikket_web/templates/admin_system.html:50
#, fuzzy
#| msgid "Snikket Web Portal"
msgid "Snikket server status"
msgstr "Snikket Webportal"
msgstr "Snikket server status"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr "Lagerplads, der bruges af delte filer"
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr ""
msgstr "Forbundet enheder"
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr ""
msgstr "Send besked"
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
msgstr ""
"Denne formular giver dig mulighed for at sende en besked til alle brugere, "
"der i øjeblikket er online på din Snikket-server. Brug den med omtanke."
#: snikket_web/templates/admin_users.html:19
msgid "The user is an administrator."
@@ -1093,8 +1173,8 @@ msgstr "App allerede installeret?"
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr "Åben appen"
@@ -1160,7 +1240,6 @@ msgid "You can now log in using your new password."
msgstr "Du kan nu logge ind med din nye adgangskode."
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr "Du kan sikkert lukke denne side."
@@ -1196,7 +1275,6 @@ msgstr ""
"Skan-knappen øverst."
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1252,6 +1330,43 @@ msgstr ""
"Du kan nu konfigurere din ældre XMPP-klient med ovenstående adresse og den "
"adgangskode, du valgte under registreringen."
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
"Du kan nu trygt lukke denne side eller logge ind på webportalen for at <a "
"href=\"%(login_url)s\">administrere din konto</a>."
#: snikket_web/templates/invite_success.html:21
msgid "Import successful"
msgstr "Importering lykkes"
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr "Tillykke! Dine kontodata er blevet importeret."
#: snikket_web/templates/invite_success.html:26
msgid "Moving to Snikket?"
msgstr "Flytte til Snikket?"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
"Hvis du flytter fra en anden Snikket-platform eller en anden XMPP-kompatibel "
"tjeneste, kan du eventuelt importere dataene (kontakter, profiloplysninger "
"osv.) fra din tidligere konto. Når du har eksporteret dataene fra din "
"tidligere konto, skal du uploade dem ved hjælp af nedenstående formular."
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr "Upload kontodata"
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1297,7 +1412,7 @@ msgid "Get it on Google Play"
msgstr "Få den i Google Play"
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr "Download i App Store"
@@ -1333,11 +1448,11 @@ msgid "Scan invite code"
msgstr "Skan invitationskode"
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr "Luk"
@@ -1350,34 +1465,11 @@ msgstr ""
"med dit kamera. Du kan bruge enten en QR-skanner-app eller selve Snikket-"
"appen."
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr "Bruger en QR kode skanner"
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr "Bruger Snikket appen"
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
"Brug en <em>QR code</em> skanner på din mobilenhed for at skanne "
"nedenstående kode:"
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
"Installer Snikket-appen på din mobilenhed, åbn den, og tryk på knappen "
"'Skan' øverst."
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr "Installer på iOS"
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
@@ -1385,12 +1477,12 @@ msgstr ""
"Efter download af Snikket fra App Store, skal du vende tilbage til dette "
"invitationslink og trykke på \"Åbn appen\" for at fortsætte."
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr "Download først Snikket fra App Store ved hjælp af nedenstående knap:"
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
@@ -1398,12 +1490,12 @@ msgstr ""
"Når installationen er afsluttet, kan du vende tilbage til denne side og "
"trykke på knappen \"Åbn appen\" for at fortsætte med opsætningen:"
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr "Installer via F-droid"
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
@@ -1411,7 +1503,7 @@ msgstr ""
"Efter installation af Snikket via F-Droid, skal du vende tilbage til dette "
"invitationslink og trykke på \"Åbn appen\" for at fortsætte."
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr "Installer først Snikket fra F-Droid ved hjælp af knappen nedenfor:"
@@ -1479,15 +1571,20 @@ msgstr "Din XMPP adresse"
msgid "Edit profile"
msgstr "Rediger profil"
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
msgid "Manage your data"
msgstr "Håndter dine data"
#: snikket_web/templates/user_home.html:39
msgid "Your Snikket"
msgstr "Din Snikket"
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
msgid "Manage users, invitations and circles of your Snikket service."
msgstr "Håndter brugere, invitationer og cirkler på din Snikket tjeneste."
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
msgid "Admin panel"
msgstr "Administrator panel"
@@ -1503,6 +1600,18 @@ msgstr ""
"Klik herunder for at logge dig selv ud af webportalen. Dette på virkeringen "
"af de forbundne enheder."
#: snikket_web/templates/user_manage_data.html:8
msgid "Export account"
msgstr "Eksporter konto"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr ""
"Download dine kontodata som en fil til sikkerhedskopieringsformål eller for "
"at flytte din konto til en anden tjeneste."
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr "Ændr din adgangskode"
@@ -1545,6 +1654,26 @@ msgstr ""
"Denne sektion tillader dig at kontrollere, hvem der kan se din profil "
"informationer, så som avatar og kaldenavn."
#~ msgid "Using a QR code scanner"
#~ msgstr "Bruger en QR kode skanner"
#~ msgid "Using the Snikket app"
#~ msgstr "Bruger Snikket appen"
#~ msgid ""
#~ "Use a <em>QR code</em> scanner on your mobile device to scan the code "
#~ "below:"
#~ msgstr ""
#~ "Brug en <em>QR code</em> skanner på din mobilenhed for at skanne "
#~ "nedenstående kode:"
#~ msgid ""
#~ "Install the Snikket app on your mobile device, open it, and tap the "
#~ "'Scan' button at the top."
#~ msgstr ""
#~ "Installer Snikket-appen på din mobilenhed, åbn den, og tryk på knappen "
#~ "'Skan' øverst."
#~ msgid "Create password reset link for %(user_name)s"
#~ msgstr "Opret link til nulstilling af adgangskode til %(user_name)s"

View File

@@ -6,322 +6,360 @@
msgid ""
msgstr ""
"Project-Id-Version: SnikketWeb 0.1.0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"PO-Revision-Date: 2021-06-19 15:01+0000\n"
"Report-Msgid-Bugs-To: translations@snikket.org\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2023-04-01 11:13+0000\n"
"Last-Translator: Jonas Schäfer <jonas@zombofant.net>\n"
"Language-Team: German <https://i18n.sotecware.net/projects/snikket/"
"web-portal/de/>\n"
"Language-Team: German <http://i18n.sotecware.net/projects/snikket/web-portal/"
"de/>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.5.1\n"
"X-Generator: Weblate 4.14.1\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr "Eingeschränkt"
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "Anmeldename"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "Anzeigename"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr "Berechtigungen"
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr "Eingeschränkt"
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr "Normaler Benutzer"
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
msgid "Administrator"
msgstr "Administrator"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
msgid "Update user"
msgstr "Benutzer ändern"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
msgid "Create password reset link"
msgstr "Passwort-Link erzeugen"
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
msgid "Password reset link created"
msgstr "Link zum Zurücksetzen des Passwortes erzeugt"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
msgid "User information updated."
msgstr "Benutzerinformationen gespeichert."
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "Benutzer endgültig löschen"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
msgid "User deleted"
msgstr "Benutzer gelöscht"
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
msgid "Password reset link not found"
msgstr "Link zum Zurücksetzen des Passwortes nicht gefunden"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
msgid "Password reset link deleted"
msgstr "Link gelöscht"
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "In Gemeinschaft einladen"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "Mindestens eine Gemeinschaft muss ausgewählt sein"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "Gültig für"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "Eine Stunde"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "Zwölf Stunden"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "Ein Tag"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "Eine Woche"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "Vier Wochen"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "Art der Einladung"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr "Einzelperson"
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr "Gruppe"
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "Neuer Einladungslink"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "Löschen"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
msgid "Invitation created"
msgstr "Einladung angelegt"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
msgid "No such invitation exists"
msgstr "Diese Einladung existiert nicht"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
msgid "Invitation revoked"
msgstr "Einladung gelöscht"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "Name"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "Gemeinschaft gründen"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
msgid "Circle created"
msgstr "Gemeinschaft gegründet"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "Benutzer auswählen"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
msgid "Update circle"
msgstr "Gemeinschaft ändern"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "Gemeinschaft endgültig löschen"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "Benutzer hinzufügen"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
msgid "No such circle exists"
msgstr "Diese Gemeinschaft existiert nicht"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
msgid "Circle data updated"
msgstr "Gemeinschaftsdaten aktualisiert"
#: snikket_web/admin.py:525
msgid "Circle deleted"
msgstr "Gemeinschaft gelöscht"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
msgid "User added to circle"
msgstr "Benutzer zur Gemeinschaft hinzugefügt"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
msgid "User removed from circle"
msgstr "Benutzer aus der Gemeinschaft entfernt"
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "Gemeinschaft endgültig löschen"
#: snikket_web/admin.py:574
msgid "Circle deleted"
msgstr "Gemeinschaft gelöscht"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr "Nachrichteninhalt"
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr "Nur an verbundene Benutzer senden"
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr "An alle Benutzer senden"
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr "Vorschau an dich selbst senden"
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr "Ankündigung verschickt!"
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "Kern"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
"Der Kontoexport ist zu groß. Bitte kontaktiere deinen Snikket-Betreiber."
#: snikket_web/invite.py:114
msgid "Username"
msgstr "Benutzername"
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "Passwort"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
msgid "Confirm password"
msgstr "Passwort (Bestätigung)"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
msgid "The passwords must match."
msgstr "Die Passwörter müssen übereinstimmen."
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
msgid "Create account"
msgstr "Konto anlegen"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
msgid "That username is already taken."
msgstr "Dieser Benutzername ist bereits belegt."
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
msgid "Registration was declined for unknown reasons."
msgstr "Die Registrierung wurde aus unbekannten Gründen abgelehnt."
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
msgid "The username is not valid."
msgstr "Der Benutzername ist ungültig."
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "Passwort ändern"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr "Kontoexportdatei"
#: snikket_web/invite.py:250
msgid "Import data"
msgstr "Daten importieren"
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
"Der Kontoexport ist in einem unbekannten Format. Es können nur XML-Dateien "
"im XEP-0227-Format verarbeitet werden (erhaltenes Format: %(mimetype)s)."
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr "Fehler"
#: snikket_web/main.py:38
msgid "Address"
msgstr "Adresse"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "Anmelden"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
msgid "Invalid username or password."
msgstr "Benutzername oder Passwort falsch."
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr "Anmeldung erfolgreich!"
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "Aktuelles Passwort"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "Neues Passwort"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "Neues Passwort (Bestätigung)"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
msgid "The new passwords must match."
msgstr "Die neuen Passwörter müssen übereinstimmen."
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr "Abmelden"
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr "Niemand"
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "Nur Freunde"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "Jeder"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "Bild"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr "Profilsichtbarkeit"
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "Profil bearbeiten"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr "Kontodaten"
#: snikket_web/user.py:86
msgid "Upload"
msgstr "Hochladen"
#: snikket_web/user.py:111
msgid "Incorrect password."
msgstr "Ungültiges Passwort."
#: snikket_web/user.py:103
#: snikket_web/user.py:115
msgid "Password changed"
msgstr "Passwort geändert"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
@@ -329,13 +367,17 @@ msgstr ""
"Das gewählte Profilbild ist zu groß. Benutze die App um größere Bilder "
"hochladen zu können."
#: snikket_web/user.py:159
#: snikket_web/user.py:170
msgid "Profile updated"
msgstr "Profil gespeichert"
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
msgstr "Fehler"
#: snikket_web/user.py:184
msgid "Export"
msgstr "Exportieren"
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr "Du hast derzeit keine Kontodaten, die exportiert werden können."
#: snikket_web/templates/_footer.html:4
#, python-format
@@ -428,7 +470,7 @@ msgstr ""
msgid "Software Versions"
msgstr "Softwareversionen"
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "Zurück zur Hauptseite"
@@ -544,6 +586,46 @@ msgstr "Rohe Debug-Ausgabe"
msgid "Copy complete output"
msgstr "Komplette Ausgabe kopieren"
#: snikket_web/templates/admin_delete_circle.html:4
#, python-format
msgid "Delete circle %(circle_name)s"
msgstr "Gemeinschaft %(circle_name)s löschen"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "Gemeinschaft löschen"
#: snikket_web/templates/admin_delete_circle.html:8
msgid "Are you sure you want to delete the following circle?"
msgstr "Bist du sicher dass du die folgende Gemeinschaft löschen willst?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Gefahr"
#: snikket_web/templates/admin_delete_circle.html:14
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
"Die Gemeinschaft und die zugehörigen Daten werden beim Betätigen des Buttons "
"unwiderruflich, permanent und sofortig gelöscht. <strong>Es gibt keinen Weg "
"zurück!</strong>"
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "Zurück"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -558,10 +640,6 @@ msgstr "Benutzer löschen"
msgid "Are you sure you want to delete the following user?"
msgstr "Bist du sicher dass du den folgenden Benutzer löschen willst?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Gefahr"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -572,14 +650,6 @@ msgstr ""
"Buttons unwiderruflich, permanent und sofortig gelöscht. <strong>Es gibt "
"keinen Weg zurück!</strong>"
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "Zurück"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr "Dies ist die Hauptgemeinschaft"
@@ -614,10 +684,6 @@ msgstr "Diese Gemeinschaft hat keinen zugehörigen Gruppenchat."
msgid "Return to circle list"
msgstr "Zurück zur Gemeinschaftsliste"
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "Gemeinschaft löschen"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr ""
@@ -935,6 +1001,7 @@ msgstr "Systemlast (5-Minuten-Durchschnitt)"
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr "unbekannt"
@@ -980,14 +1047,18 @@ msgid "Snikket server status"
msgstr "Status des Snikket-Servers"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr "Durch geteilte Dateien belegter Speicherplatz"
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr "Verbundene Geräte"
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr "Nachricht an alle senden"
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
@@ -1107,8 +1178,8 @@ msgstr "App schon installiert?"
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr "App öffnen"
@@ -1175,7 +1246,6 @@ msgid "You can now log in using your new password."
msgstr "Du kannst dich nun mit deinem neuen Passwort anmelden."
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr "Du kannst diese Seite nun schließen."
@@ -1211,7 +1281,6 @@ msgstr ""
"Das geht mit Hilfe des Scan-Knopfes in der oberen Leiste."
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1270,6 +1339,44 @@ msgstr ""
"Du kannst nun deinen normalen XMPP-Clienten mit der obenstehenden Adresse "
"und deinem gewählten Passwort einrichten."
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
"Du kannst diese Seite nun schließen oder dich im Webportal anmelden um dein "
"<a href=\"%(login_url)s\">Konto zu bearbeiten</a>."
#: snikket_web/templates/invite_success.html:21
msgid "Import successful"
msgstr "Import erfolgreich"
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr "Gratulation! Deine Kontodaten wurden erfolgreich importiert."
#: snikket_web/templates/invite_success.html:26
msgid "Moving to Snikket?"
msgstr "Am Umziehen zu Snikket?"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
"Wenn du dabei bist, dein Konto von einer anderen Snikket-Instanz oder XMPP-"
"kompatiblen Dienst umzuziehen, kannst du optional deine Kontodaten "
"(Kontakte, Profilinformationen etc.) von deinem vorherigen Konto "
"importieren. Wenn du die Daten von deinem alten Konto exportiert hast, lade "
"sie mit dem untenstehenden Formular hoch."
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr "Kontodaten hochladen"
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1316,7 +1423,7 @@ msgid "Get it on Google Play"
msgstr "Von Google Play installieren"
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr "Laden im App Store"
@@ -1354,11 +1461,11 @@ msgid "Scan invite code"
msgstr "Einladungscode scannen"
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr "Schließen"
@@ -1371,34 +1478,11 @@ msgstr ""
"untenstehenden Code mit deiner Kamera scannst. Dafür kannst du entweder "
"einen normalen QR-Scanner nehmen oder die Snikket-App selbst."
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr "Mit einem QR-Code-Scanner"
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr "Mit der Snikket-App"
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
"Benutze einen <em>QR-Code</em>-Scanner auf deinem mobilen Gerät um den "
"untenstehenden Code zu scannen:"
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
"Installiere die Snikket-App auf deinem mobilen Gerät, öffne sie und tippe "
"dann auf den 'Scan'-Knopf in der oberen Leiste."
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr "Installation auf iOS"
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
@@ -1406,14 +1490,14 @@ msgstr ""
"Nachdem du Snikket vom App Store heruntergeladen hast musst du zu diesem "
"Einladungslink zurückkehren und \"App öffnen\" antippen um fortzufahren."
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr ""
"Lade zunächst Snikket aus dem App Store herunter indem du den folgenden "
"Button benutzt:"
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
@@ -1422,12 +1506,12 @@ msgstr ""
"zurückkehren und unten auf \"App öffnen\" tippen um die Einrichtung "
"abzuschließen:"
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr "Installation über F-Droid"
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
@@ -1435,7 +1519,7 @@ msgstr ""
"Nachdem du Snikket über F-Droid installiert hast, musst du auf diese Seite "
"zurückkehren und \"App öffnen\" antippen um fortzufahren."
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr "Installiere Snikket zunächst aus F-Droid mit dem folgenden Button:"
@@ -1506,16 +1590,21 @@ msgstr "Deine XMPP-Adresse"
msgid "Edit profile"
msgstr "Profil bearbeiten"
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
msgid "Manage your data"
msgstr "Daten verwalten"
#: snikket_web/templates/user_home.html:39
msgid "Your Snikket"
msgstr "Dein Snikket"
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
msgid "Manage users, invitations and circles of your Snikket service."
msgstr ""
"Benutzer, Einladungen und Gemeinschaften dieses Snikket-Dienstes verwalten."
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
msgid "Admin panel"
msgstr "Adminbereich"
@@ -1531,6 +1620,16 @@ msgstr ""
"Klicke unten um dich aus dem Webportal abzumelden. Dies betrifft keine "
"anderen Geräte von dir."
#: snikket_web/templates/user_manage_data.html:8
msgid "Export account"
msgstr "Konto exportieren"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr "Lade deine Kontodaten als Backup oder zum Umziehen herunter."
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr "Ändere dein Passwort"
@@ -1573,6 +1672,26 @@ msgstr ""
"Hier kannst du einstellen, wer deine Profilinformationen, wie Bild oder "
"Anzeigename einsehen kann."
#~ msgid "Using a QR code scanner"
#~ msgstr "Mit einem QR-Code-Scanner"
#~ msgid "Using the Snikket app"
#~ msgstr "Mit der Snikket-App"
#~ msgid ""
#~ "Use a <em>QR code</em> scanner on your mobile device to scan the code "
#~ "below:"
#~ msgstr ""
#~ "Benutze einen <em>QR-Code</em>-Scanner auf deinem mobilen Gerät um den "
#~ "untenstehenden Code zu scannen:"
#~ msgid ""
#~ "Install the Snikket app on your mobile device, open it, and tap the "
#~ "'Scan' button at the top."
#~ msgstr ""
#~ "Installiere die Snikket-App auf deinem mobilen Gerät, öffne sie und tippe "
#~ "dann auf den 'Scan'-Knopf in der oberen Leiste."
#~ msgid "Create password reset link for %(user_name)s"
#~ msgstr "Link zum Zurücksetzen des Passwortes von %(user_name)s erzeugen"

View File

@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2021-06-19 15:01+0000\n"
"Last-Translator: Jonas Schäfer <jonas@zombofant.net>\n"
"Language-Team: English <https://i18n.sotecware.net/projects/snikket/"
"web-portal/en/>\n"
"Language-Team: English <https://i18n.sotecware.net/projects/snikket/web-"
"portal/en/>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,369 +20,408 @@ msgstr ""
"X-Generator: Weblate 4.5.1\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr ""
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "Login name"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "Display name"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr ""
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr ""
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr ""
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
#, fuzzy
#| msgid "Admin area"
msgid "Administrator"
msgstr "Admin area"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
#, fuzzy
#| msgid "Update circle"
msgid "Update user"
msgstr "Update circle"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
#, fuzzy
#| msgid "Create password reset links or delete users."
msgid "Create password reset link"
msgstr "Create password reset links or delete users."
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
#, fuzzy
#| msgid "Password reset link for %(user_name)s"
msgid "Password reset link created"
msgstr "Password reset link for %(user_name)s"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
#, fuzzy
#| msgid "User information"
msgid "User information updated."
msgstr "User information"
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "Delete user permanently"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
#, fuzzy
#| msgid "deleted"
msgid "User deleted"
msgstr "deleted"
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
#, fuzzy
#| msgid "Password reset link for %(user_name)s"
msgid "Password reset link not found"
msgstr "Password reset link for %(user_name)s"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
#, fuzzy
#| msgid "Create password reset links or delete users."
msgid "Password reset link deleted"
msgstr "Create password reset links or delete users."
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "Invite to circle"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "At least one circle must be selected"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "Valid for"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "One hour"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "Twelve hours"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "One day"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "One week"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "Four weeks"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "Invitation type"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr "Individual"
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr "Group"
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "New invitation link"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "Revoke"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
#, fuzzy
#| msgid "Invitation type"
msgid "Invitation created"
msgstr "Invitation type"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
#, fuzzy
#| msgid "New invitation link"
msgid "No such invitation exists"
msgstr "New invitation link"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
#, fuzzy
#| msgid "Invitation type"
msgid "Invitation revoked"
msgstr "Invitation type"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "Name"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "Create circle"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
#, fuzzy
#| msgid "Circle name"
msgid "Circle created"
msgstr "Circle name"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "Select user"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
msgid "Update circle"
msgstr "Update circle"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "Delete circle permanently"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "Add user"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
#, fuzzy
#| msgid "No circles"
msgid "No such circle exists"
msgstr "No circles"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
#, fuzzy
#| msgid "Circle name"
msgid "Circle data updated"
msgstr "Circle name"
#: snikket_web/admin.py:525
#, fuzzy
#| msgid "deleted"
msgid "Circle deleted"
msgstr "deleted"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
#, fuzzy
#| msgid "Invite to circle"
msgid "User added to circle"
msgstr "Invite to circle"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
#, fuzzy
#| msgid "Remove user %(username)s from circle"
msgid "User removed from circle"
msgstr "Remove user %(username)s from circle"
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "Delete circle permanently"
#: snikket_web/admin.py:574
#, fuzzy
#| msgid "deleted"
msgid "Circle deleted"
msgstr "deleted"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr ""
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr ""
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr ""
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr ""
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr ""
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "Main"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
#: snikket_web/invite.py:114
msgid "Username"
msgstr "Username"
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "Password"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
msgid "Confirm password"
msgstr "Confirm password"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
#, fuzzy
#| msgid "The passwords must match"
msgid "The passwords must match."
msgstr "The passwords must match"
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
msgid "Create account"
msgstr "Create account"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
#, fuzzy
#| msgid "That username is already taken"
msgid "That username is already taken."
msgstr "That username is already taken"
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
#, fuzzy
#| msgid "Registration was declined for unknown reasons"
msgid "Registration was declined for unknown reasons."
msgstr "Registration was declined for unknown reasons"
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
#, fuzzy
#| msgid "The username is not valid"
msgid "The username is not valid."
msgstr "The username is not valid"
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "Change password"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr ""
#: snikket_web/invite.py:250
msgid "Import data"
msgstr ""
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr ""
#: snikket_web/main.py:38
msgid "Address"
msgstr "Address"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "Sign in"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
msgid "Invalid username or password."
msgstr "Invalid username or password."
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr ""
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "Current password"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "New password"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "Confirm new password"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
#, fuzzy
#| msgid "The new passwords must match"
msgid "The new passwords must match."
msgstr "The new passwords must match"
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr "Sign out"
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr "Nobody"
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "Friends only"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "Everyone"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "Avatar"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr "Profile visibility"
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "Update profile"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr ""
#: snikket_web/user.py:86
msgid "Upload"
msgstr ""
#: snikket_web/user.py:111
#, fuzzy
#| msgid "Incorrect password"
msgid "Incorrect password."
msgstr "Incorrect password"
#: snikket_web/user.py:103
#: snikket_web/user.py:115
#, fuzzy
#| msgid "Password change failed"
msgid "Password changed"
msgstr "Password change failed"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
msgstr ""
#: snikket_web/user.py:159
#: snikket_web/user.py:170
#, fuzzy
#| msgid "Profile"
msgid "Profile updated"
msgstr "Profile"
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
#: snikket_web/user.py:184
msgid "Export"
msgstr ""
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr ""
#: snikket_web/templates/_footer.html:4
@@ -471,7 +510,7 @@ msgstr ""
msgid "Software Versions"
msgstr "Software Versions"
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "Back to the main page"
@@ -587,6 +626,54 @@ msgstr "Raw debug dump"
msgid "Copy complete output"
msgstr "Copy complete output"
#: snikket_web/templates/admin_delete_circle.html:4
#, fuzzy, python-format
#| msgid "Edit circle %(circle_name)s"
msgid "Delete circle %(circle_name)s"
msgstr "Edit circle %(circle_name)s"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "Delete circle"
#: snikket_web/templates/admin_delete_circle.html:8
#, fuzzy
#| msgid "Are you sure you want to delete the following user?"
msgid "Are you sure you want to delete the following circle?"
msgstr "Are you sure you want to delete the following user?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Danger"
#: snikket_web/templates/admin_delete_circle.html:14
#, fuzzy
#| msgid ""
#| "The user and their data will be deleted irrevocably, permanently and "
#| "immediately upon pushing the below button. <strong>There is no way back!</"
#| "strong>"
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
"The user and their data will be deleted irrevocably, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "Back"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -601,10 +688,6 @@ msgstr "Delete user"
msgid "Are you sure you want to delete the following user?"
msgstr "Are you sure you want to delete the following user?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Danger"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -615,14 +698,6 @@ msgstr ""
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "Back"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr "This is your main circle"
@@ -655,10 +730,6 @@ msgstr "This circle has no group chat associated."
msgid "Return to circle list"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "Delete circle"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr "Deleting a circle does not delete any users in the circle."
@@ -977,6 +1048,7 @@ msgstr "System load (5-minute average)"
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr ""
@@ -1022,14 +1094,18 @@ msgid "Snikket server status"
msgstr "Snikket Web Portal"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr ""
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr ""
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr ""
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
@@ -1147,8 +1223,8 @@ msgstr "App already installed?"
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr "Open the app"
@@ -1213,7 +1289,6 @@ msgid "You can now log in using your new password."
msgstr "You can now log in using your new password."
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr "You can now safely close this page."
@@ -1247,7 +1322,6 @@ msgstr ""
"Scan button at the top."
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1304,6 +1378,41 @@ msgstr ""
"You can now set up your legacy XMPP client with the above address and the "
"password you chose during registration."
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
#: snikket_web/templates/invite_success.html:21
#, fuzzy
#| msgid "Password reset successful"
msgid "Import successful"
msgstr "Password reset successful"
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr ""
#: snikket_web/templates/invite_success.html:26
#, fuzzy
#| msgid "Using the Snikket app"
msgid "Moving to Snikket?"
msgstr "Using the Snikket app"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr ""
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1349,7 +1458,7 @@ msgid "Get it on Google Play"
msgstr "Get it on Google Play"
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr "Download on the App Store"
@@ -1385,11 +1494,11 @@ msgid "Scan invite code"
msgstr "Scan invite code"
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr "Close"
@@ -1401,61 +1510,39 @@ msgstr ""
"You can transfer this invite to your mobile device by scanning a code with "
"your camera. You can use either a QR scanner app or the Snikket app itself."
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr "Using a QR code scanner"
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr "Using the Snikket app"
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr ""
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
msgstr ""
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr ""
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
msgstr ""
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr ""
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
msgstr ""
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr ""
@@ -1521,15 +1608,22 @@ msgstr "Your XMPP address"
msgid "Edit profile"
msgstr "Edit profile"
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
#, fuzzy
#| msgid "Manage users"
msgid "Manage your data"
msgstr "Manage users"
#: snikket_web/templates/user_home.html:39
msgid "Your Snikket"
msgstr "Your Snikket"
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
msgid "Manage users, invitations and circles of your Snikket service."
msgstr "Manage users, invitations and circles of your Snikket service."
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
msgid "Admin panel"
msgstr "Admin panel"
@@ -1545,6 +1639,18 @@ msgstr ""
"Click below to log yourself out of the web portal. This does not affect any "
"other connected devices."
#: snikket_web/templates/user_manage_data.html:8
#, fuzzy
#| msgid "Your account"
msgid "Export account"
msgstr "Your account"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr ""
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr "Change your password"
@@ -1587,6 +1693,26 @@ msgstr ""
"This section allows you to control who can see your profile information, "
"like avatar and nickname."
#~ msgid "Using a QR code scanner"
#~ msgstr "Using a QR code scanner"
#~ msgid "Using the Snikket app"
#~ msgstr "Using the Snikket app"
#~ msgid ""
#~ "Use a <em>QR code</em> scanner on your mobile device to scan the code "
#~ "below:"
#~ msgstr ""
#~ "Use a <em>QR code</em> scanner on your mobile device to scan the code "
#~ "below:"
#~ msgid ""
#~ "Install the Snikket app on your mobile device, open it, and tap the "
#~ "'Scan' button at the top."
#~ msgstr ""
#~ "Install the Snikket app on your mobile device, open it, and tap the "
#~ "'Scan' button at the top."
#~ msgid "Create password reset link for %(user_name)s"
#~ msgstr "Create password reset link for %(user_name)s"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2021-06-19 15:01+0000\n"
"Last-Translator: Jonas Schäfer <jonas@zombofant.net>\n"
"Language-Team: English (United Kingdom) <https://i18n.sotecware.net/projects/"
@@ -20,371 +20,410 @@ msgstr ""
"X-Generator: Weblate 4.5.1\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr ""
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "Login name"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "Display name"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr ""
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr ""
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr ""
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
#, fuzzy
#| msgid "Admin dashboard"
msgid "Administrator"
msgstr "Admin dashboard"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
#, fuzzy
#| msgid "Create circle"
msgid "Update user"
msgstr "Create circle"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
#, fuzzy
#| msgid "Create password reset links or delete users."
msgid "Create password reset link"
msgstr "Create password reset links or delete users."
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
#, fuzzy
#| msgid "Password reset link for %(user_name)s"
msgid "Password reset link created"
msgstr "Password reset link for %(user_name)s"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
#, fuzzy
#| msgid "User information"
msgid "User information updated."
msgstr "User information"
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "Delete user permanently"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
#, fuzzy
#| msgid "deleted"
msgid "User deleted"
msgstr "deleted"
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
#, fuzzy
#| msgid "Password reset link for %(user_name)s"
msgid "Password reset link not found"
msgstr "Password reset link for %(user_name)s"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
#, fuzzy
#| msgid "Create password reset links or delete users."
msgid "Password reset link deleted"
msgstr "Create password reset links or delete users."
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "Invite to circle"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "At least one circle must be selected"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "Valid for"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "One hour"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "Twelve hours"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "One day"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "One week"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "Four weeks"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "Invitation type"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr ""
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr ""
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "New invitation link"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "Revoke"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
#, fuzzy
#| msgid "Invitation type"
msgid "Invitation created"
msgstr "Invitation type"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
#, fuzzy
#| msgid "New invitation link"
msgid "No such invitation exists"
msgstr "New invitation link"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
#, fuzzy
#| msgid "Invitation type"
msgid "Invitation revoked"
msgstr "Invitation type"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "Name"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "Create circle"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
#, fuzzy
#| msgid "Circle name"
msgid "Circle created"
msgstr "Circle name"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "Select user"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
#, fuzzy
#| msgid "Create circle"
msgid "Update circle"
msgstr "Create circle"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "Delete circle permanently"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "Add user"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
#, fuzzy
#| msgid "No circles"
msgid "No such circle exists"
msgstr "No circles"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
#, fuzzy
#| msgid "Circle name"
msgid "Circle data updated"
msgstr "Circle name"
#: snikket_web/admin.py:525
#, fuzzy
#| msgid "deleted"
msgid "Circle deleted"
msgstr "deleted"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
#, fuzzy
#| msgid "Invite to circle"
msgid "User added to circle"
msgstr "Invite to circle"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
#, fuzzy
#| msgid "Remove user %(username)s from circle"
msgid "User removed from circle"
msgstr "Remove user %(username)s from circle"
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "Delete circle permanently"
#: snikket_web/admin.py:574
#, fuzzy
#| msgid "deleted"
msgid "Circle deleted"
msgstr "deleted"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr ""
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr ""
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr ""
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr ""
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr ""
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "Main"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
#: snikket_web/invite.py:114
msgid "Username"
msgstr ""
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "Password"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
#, fuzzy
#| msgid "Confirm new password"
msgid "Confirm password"
msgstr "Confirm new password"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
#, fuzzy
#| msgid "The passwords must match"
msgid "The passwords must match."
msgstr "The passwords must match"
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
#, fuzzy
#| msgid "Create circle"
msgid "Create account"
msgstr "Create circle"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
msgid "That username is already taken."
msgstr ""
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
msgid "Registration was declined for unknown reasons."
msgstr ""
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
msgid "The username is not valid."
msgstr ""
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "Change password"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr ""
#: snikket_web/invite.py:250
msgid "Import data"
msgstr ""
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr ""
#: snikket_web/main.py:38
msgid "Address"
msgstr "Address"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "Sign in"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
#, fuzzy
#| msgid "Invalid user name or password."
msgid "Invalid username or password."
msgstr "Invalid user name or password."
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr ""
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "Current password"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "New password"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "Confirm new password"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
#, fuzzy
#| msgid "The new passwords must match"
msgid "The new passwords must match."
msgstr "The new passwords must match"
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr "Sign out"
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr "Nobody"
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "Friends only"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "Everyone"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "Avatar"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr "Profile visibility"
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "Update profile"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr ""
#: snikket_web/user.py:86
msgid "Upload"
msgstr ""
#: snikket_web/user.py:111
#, fuzzy
#| msgid "Incorrect password"
msgid "Incorrect password."
msgstr "Incorrect password"
#: snikket_web/user.py:103
#: snikket_web/user.py:115
#, fuzzy
#| msgid "Password change failed"
msgid "Password changed"
msgstr "Password change failed"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
msgstr ""
#: snikket_web/user.py:159
#: snikket_web/user.py:170
#, fuzzy
#| msgid "Profile"
msgid "Profile updated"
msgstr "Profile"
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
#: snikket_web/user.py:184
msgid "Export"
msgstr ""
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr ""
#: snikket_web/templates/_footer.html:4
@@ -473,7 +512,7 @@ msgstr ""
msgid "Software Versions"
msgstr "Software Versions"
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "Back to the main page"
@@ -587,6 +626,46 @@ msgstr "Raw debug dump"
msgid "Copy complete output"
msgstr "Copy complete output"
#: snikket_web/templates/admin_delete_circle.html:4
#, fuzzy, python-format
#| msgid "Edit circle %(circle_name)s"
msgid "Delete circle %(circle_name)s"
msgstr "Edit circle %(circle_name)s"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "Delete circle"
#: snikket_web/templates/admin_delete_circle.html:8
#, fuzzy
#| msgid "Are you sure you want to delete the following user?"
msgid "Are you sure you want to delete the following circle?"
msgstr "Are you sure you want to delete the following user?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Danger"
#: snikket_web/templates/admin_delete_circle.html:14
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "Back"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -601,10 +680,6 @@ msgstr "Delete user"
msgid "Are you sure you want to delete the following user?"
msgstr "Are you sure you want to delete the following user?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Danger"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -612,14 +687,6 @@ msgid ""
"strong>"
msgstr ""
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "Back"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr ""
@@ -656,10 +723,6 @@ msgstr ""
msgid "Return to circle list"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "Delete circle"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr "Deleting a circle does not delete any users in the circle."
@@ -986,6 +1049,7 @@ msgstr "System load (5-minute average)"
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr ""
@@ -1031,14 +1095,18 @@ msgid "Snikket server status"
msgstr "Snikket Web Portal"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr ""
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr ""
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr ""
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
@@ -1152,8 +1220,8 @@ msgstr ""
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr ""
@@ -1219,7 +1287,6 @@ msgid "You can now log in using your new password."
msgstr ""
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr ""
@@ -1251,7 +1318,6 @@ msgid ""
msgstr ""
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1302,6 +1368,41 @@ msgid ""
"password you chose during registration."
msgstr ""
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
#: snikket_web/templates/invite_success.html:21
#, fuzzy
#| msgid "Password reset"
msgid "Import successful"
msgstr "Password reset"
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr ""
#: snikket_web/templates/invite_success.html:26
#, fuzzy
#| msgid "About Snikket"
msgid "Moving to Snikket?"
msgstr "About Snikket"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr ""
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1341,7 +1442,7 @@ msgid "Get it on Google Play"
msgstr ""
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr ""
@@ -1374,11 +1475,11 @@ msgid "Scan invite code"
msgstr "Show invite details"
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr ""
@@ -1388,58 +1489,39 @@ msgid ""
"your camera. You can use either a QR scanner app or the Snikket app itself."
msgstr ""
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr ""
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr ""
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr ""
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
msgstr ""
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr ""
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
msgstr ""
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr ""
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
msgstr ""
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr ""
@@ -1515,19 +1597,26 @@ msgstr "Email address"
msgid "Edit profile"
msgstr "Update profile"
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
#, fuzzy
#| msgid "Manage users"
msgid "Manage your data"
msgstr "Manage users"
#: snikket_web/templates/user_home.html:39
#, fuzzy
#| msgid "About Snikket"
msgid "Your Snikket"
msgstr "About Snikket"
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
#, fuzzy
#| msgid "Manage users and invitations of this Snikket service."
msgid "Manage users, invitations and circles of your Snikket service."
msgstr "Manage users and invitations of this Snikket service."
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
#, fuzzy
#| msgid "Admin dashboard"
msgid "Admin panel"
@@ -1545,6 +1634,18 @@ msgstr ""
"Click below to log yourself out of the web portal. This does not affect any "
"other connected devices."
#: snikket_web/templates/user_manage_data.html:8
#, fuzzy
#| msgid "Create circle"
msgid "Export account"
msgstr "Create circle"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr ""
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr "Change your password"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2021-03-31 13:00+0000\n"
"Last-Translator: Tilman Jiménez <tilman.jimenez@tu-dortmund.de>\n"
"Language-Team: Spanish (Mexico) <https://i18n.sotecware.net/projects/snikket/"
@@ -20,355 +20,394 @@ msgstr ""
"X-Generator: Weblate 4.5.1\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr "Limitado"
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "Nombre de ingreso del usuario"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "Nombre mostrado"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr "Nivel de acceso"
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr "Limitado"
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr "Usuario normal"
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
#, fuzzy
#| msgid "Admin area"
msgid "Administrator"
msgstr "Administración"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
msgid "Update user"
msgstr "Actualizar usuario"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
#, fuzzy
#| msgid "Current password"
msgid "Create password reset link"
msgstr "Contraseña actual"
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
msgid "Password reset link created"
msgstr "Un enlace para restablecer la contraseña ha sido creado"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
#, fuzzy
#| msgid "Circle information"
msgid "User information updated."
msgstr "Información del círculo"
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "Eliminar usuario permanentemente"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
msgid "User deleted"
msgstr "Usuario eliminado"
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
msgid "Password reset link not found"
msgstr "No hemos encontrado un enlace para restablecer la contraseña"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
msgid "Password reset link deleted"
msgstr "Enlace para restablecer la contraseña eliminado"
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "Invitar al círculo"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "Seleccione al menos un círculo"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "Válido por"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "Una hora"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "Doce horas"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "Un día"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "Una semana"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "Cuatro semanas"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "Tipo de invitación"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr "Individual"
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr "Grupo"
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "Nuevo enlace de invitación"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "Revocar/Eliminar"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
#, fuzzy
#| msgid "Invitation type"
msgid "Invitation created"
msgstr "Tipo de invitación"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
#, fuzzy
#| msgid "New invitation link"
msgid "No such invitation exists"
msgstr "Nuevo enlace de invitación"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
#, fuzzy
#| msgid "Invitation type"
msgid "Invitation revoked"
msgstr "Tipo de invitación"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "Nombre"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "Crear círculo"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
#, fuzzy
#| msgid "Circle name"
msgid "Circle created"
msgstr "Nombre del círculo"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "Seleccionar usuario"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
msgid "Update circle"
msgstr "Actualizar círculo"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "Eliminar círculo permanentemente"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "Añadir usuario"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
#, fuzzy
#| msgid "No circles"
msgid "No such circle exists"
msgstr "No hay círculos"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
#, fuzzy
#| msgid "Circle name"
msgid "Circle data updated"
msgstr "Nombre del círculo"
#: snikket_web/admin.py:525
#, fuzzy
#| msgid "Circle members"
msgid "Circle deleted"
msgstr "Miembros del círculo"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
#, fuzzy
#| msgid "Invite to circle"
msgid "User added to circle"
msgstr "Invitar al círculo"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
msgid "User removed from circle"
msgstr ""
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "Eliminar círculo permanentemente"
#: snikket_web/admin.py:574
#, fuzzy
#| msgid "Circle members"
msgid "Circle deleted"
msgstr "Miembros del círculo"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr ""
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr ""
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr ""
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr ""
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr ""
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "Principal"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
#: snikket_web/invite.py:114
msgid "Username"
msgstr "Usuario"
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "Contraseña"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
msgid "Confirm password"
msgstr "Confirmar contraseña"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
#, fuzzy
#| msgid "The passwords must match"
msgid "The passwords must match."
msgstr "Las contraseñas deben ser las mismas"
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
msgid "Create account"
msgstr "Crear cuenta"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
#, fuzzy
#| msgid "That username is already taken"
msgid "That username is already taken."
msgstr "Ese nombre de usuario ya está siendo utilizado"
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
#, fuzzy
#| msgid "Registration was declined for unknown reasons"
msgid "Registration was declined for unknown reasons."
msgstr "El registro ha sido declinado por razones no identificadas"
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
#, fuzzy
#| msgid "The username is not valid"
msgid "The username is not valid."
msgstr "El nombre de usuario no es válido"
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "Cambiar contraseña"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr ""
#: snikket_web/invite.py:250
msgid "Import data"
msgstr ""
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr ""
#: snikket_web/main.py:38
msgid "Address"
msgstr "Dirección"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "Ingresar"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
msgid "Invalid username or password."
msgstr "Nombre de usuario o contraseña no válidos."
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr ""
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "Contraseña actual"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "Nueva contraseña"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "Confirmar nueva contraseña"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
#, fuzzy
#| msgid "The new passwords must match"
msgid "The new passwords must match."
msgstr "Las nuevas contraseñas deben ser iguales"
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr ""
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr "Nadie"
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "Únicamente amigos"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "Todos"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "Imagen de perfil"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr "Visibilidad de perfil"
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "Actualizar perfil"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr ""
#: snikket_web/user.py:86
msgid "Upload"
msgstr ""
#: snikket_web/user.py:111
#, fuzzy
#| msgid "Incorrect password"
msgid "Incorrect password."
msgstr "Contraseña incorrecta"
#: snikket_web/user.py:103
#: snikket_web/user.py:115
#, fuzzy
#| msgid "Password"
msgid "Password changed"
msgstr "Contraseña"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
msgstr ""
#: snikket_web/user.py:159
#: snikket_web/user.py:170
msgid "Profile updated"
msgstr ""
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
#: snikket_web/user.py:184
msgid "Export"
msgstr ""
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr ""
#: snikket_web/templates/_footer.html:4
@@ -450,7 +489,7 @@ msgstr ""
msgid "Software Versions"
msgstr ""
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "Regresar a la página principal"
@@ -566,6 +605,54 @@ msgstr ""
msgid "Copy complete output"
msgstr "Copiar el todo el output"
#: snikket_web/templates/admin_delete_circle.html:4
#, fuzzy, python-format
#| msgid "Edit circle %(circle_name)s"
msgid "Delete circle %(circle_name)s"
msgstr "Editar el círculo %(circle_name)s"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "Eliminar círculo"
#: snikket_web/templates/admin_delete_circle.html:8
#, fuzzy
#| msgid "Are you sure you want to delete the following user?"
msgid "Are you sure you want to delete the following circle?"
msgstr "¿Seguro que quieres eliminar al siguiente usuario?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Peligro"
#: snikket_web/templates/admin_delete_circle.html:14
#, fuzzy
#| msgid ""
#| "The user and their data will be deleted irrevocably, permanently and "
#| "immediately upon pushing the below button. <strong>There is no way back!</"
#| "strong>"
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
"Este usuario y sus datos va a ser eliminados de manera irreversible, "
"permanente e inmediatamente al presionar el botón. <strong>¡No hay forma de "
"deshacer esto!</strong>"
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "Regresar"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -580,10 +667,6 @@ msgstr "Eliminar usuario"
msgid "Are you sure you want to delete the following user?"
msgstr "¿Seguro que quieres eliminar al siguiente usuario?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Peligro"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -594,14 +677,6 @@ msgstr ""
"permanente e inmediatamente al presionar el botón. <strong>¡No hay forma de "
"deshacer esto!</strong>"
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "Regresar"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr "Este es el círculo principal"
@@ -636,10 +711,6 @@ msgstr "Este círculo no está asociado con una conversación de grupo."
msgid "Return to circle list"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "Eliminar círculo"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr "Eliminar un círculo no elimina a los usuarios que le pertenecen."
@@ -951,6 +1022,7 @@ msgstr ""
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr ""
@@ -996,14 +1068,18 @@ msgid "Snikket server status"
msgstr "Portal web de Snikket"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr ""
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr ""
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr ""
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
@@ -1119,8 +1195,8 @@ msgstr ""
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr ""
@@ -1180,7 +1256,6 @@ msgid "You can now log in using your new password."
msgstr ""
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr ""
@@ -1210,7 +1285,6 @@ msgid ""
msgstr ""
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1259,6 +1333,39 @@ msgid ""
"password you chose during registration."
msgstr ""
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
#: snikket_web/templates/invite_success.html:21
msgid "Import successful"
msgstr ""
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr ""
#: snikket_web/templates/invite_success.html:26
#, fuzzy
#| msgid "About Snikket"
msgid "Moving to Snikket?"
msgstr "Acerca de Snikket"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr ""
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1298,7 +1405,7 @@ msgid "Get it on Google Play"
msgstr ""
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr ""
@@ -1329,11 +1436,11 @@ msgid "Scan invite code"
msgstr ""
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr ""
@@ -1343,58 +1450,39 @@ msgid ""
"your camera. You can use either a QR scanner app or the Snikket app itself."
msgstr ""
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr ""
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr ""
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr ""
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
msgstr ""
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr ""
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
msgstr ""
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr ""
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
msgstr ""
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr ""
@@ -1460,15 +1548,22 @@ msgstr ""
msgid "Edit profile"
msgstr ""
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
#, fuzzy
#| msgid "Manage users"
msgid "Manage your data"
msgstr "Administrar usuarios"
#: snikket_web/templates/user_home.html:39
msgid "Your Snikket"
msgstr ""
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
msgid "Manage users, invitations and circles of your Snikket service."
msgstr ""
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
msgid "Admin panel"
msgstr ""
@@ -1482,6 +1577,18 @@ msgid ""
"other connected devices."
msgstr ""
#: snikket_web/templates/user_manage_data.html:8
#, fuzzy
#| msgid "Create account"
msgid "Export account"
msgstr "Crear cuenta"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr ""
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr ""

View File

@@ -7,321 +7,361 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"PO-Revision-Date: 2021-06-19 15:01+0000\n"
"Last-Translator: Link Mauve <linkmauve@linkmauve.fr>\n"
"Language-Team: French <https://i18n.sotecware.net/projects/snikket/"
"web-portal/fr/>\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2022-04-11 13:00+0000\n"
"Last-Translator: David Baraniak <admin@chipmnk.dev>\n"
"Language-Team: French <http://i18n.sotecware.net/projects/snikket/web-portal/"
"fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.5.1\n"
"X-Generator: Weblate 4.8.1\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr "Limité"
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "Identifiant"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "Nom à afficher"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr "Niveau daccès"
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr "Limité"
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr "Utilisateur normal"
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
msgid "Administrator"
msgstr "Administrateur"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
msgid "Update user"
msgstr "Modifier lutilisateur"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
msgid "Create password reset link"
msgstr "Créer le lien de réinitialisation de mot de passe"
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
msgid "Password reset link created"
msgstr "Lien de réinitialisation du mot de passe créé"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
msgid "User information updated."
msgstr "Informations de lutilisateur mises à jour."
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "Désinscrire définitivement lutilisateur"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
msgid "User deleted"
msgstr "Utilisateur supprimé"
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
msgid "Password reset link not found"
msgstr "Lien de réinitialisation du mot de passe introuvable"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
msgid "Password reset link deleted"
msgstr "Liens de réinitialisation de mot de passe supprimé"
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "Inviter dans le cercle"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "Au moins un cercle doit être sélectionné"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "Valide pour"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "Une heure"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "Douze heures"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "Une journée"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "Une semaine"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "Quatre semaines"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "Type dinvitation"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr "Individuelle"
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr "Groupe"
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "Nouveau lien dinvitation"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "Révoquer"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
msgid "Invitation created"
msgstr "Invitation créée"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
msgid "No such invitation exists"
msgstr "Cette invitation nexiste pas"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
msgid "Invitation revoked"
msgstr "Invitation révoquée"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "Nom"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "Créer un cercle"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
msgid "Circle created"
msgstr "Cercle créé"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "Sélectionner un utilisateur"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
msgid "Update circle"
msgstr "Mettre à jour le cercle"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "Supprimer le cercle définitivement"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "Ajouter un utilisateur"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
msgid "No such circle exists"
msgstr "Ce cercle nexiste pas"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
msgid "Circle data updated"
msgstr "Données du cercle mises à jour"
#: snikket_web/admin.py:525
msgid "Circle deleted"
msgstr "Cercle supprimé"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
msgid "User added to circle"
msgstr "Utilisateur ajouté à ce cercle"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
msgid "User removed from circle"
msgstr "Utilisateur retiré du cercle"
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "Supprimer le cercle définitivement"
#: snikket_web/admin.py:574
msgid "Circle deleted"
msgstr "Cercle supprimé"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr "Contenu du message"
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr "Envoyer uniquement aux utilisateurs connectés"
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr "Envoyer aux utilisateurs"
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr "Envoyer une prévisualisation à vous-mêmes"
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr "Annonce envoyée!"
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "Principal"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
"Les données du compte que vous avez essayé d'importer sont trop volumineuses "
"pour être téléchargées. Veuillez contacter votre opérateur Snikket."
#: snikket_web/invite.py:114
msgid "Username"
msgstr "Nom dutilisateur"
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "Mot de passe"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
msgid "Confirm password"
msgstr "Confirmer le mot de passe"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
msgid "The passwords must match."
msgstr "Les mots de passe doivent être identiques."
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
msgid "Create account"
msgstr "Créer un compte"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
msgid "That username is already taken."
msgstr "Ce nom dutilisateur est déjà utilisé."
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
msgid "Registration was declined for unknown reasons."
msgstr "Lenregistrement a été refusé pour des raisons inconnues."
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
msgid "The username is not valid."
msgstr "Le nom dutilisateur nest pas valide."
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "Changer de mot de passe"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr "Fichier de données du compte"
#: snikket_web/invite.py:250
msgid "Import data"
msgstr "Importer les données"
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
"Les données du compte que vous avez essayé d'importer sont dans un format "
"inconnu. Veuillez télécharger un fichier XML au format XEP-0227 (format "
"fourni : %(mimetype)s)."
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr "Erreur"
#: snikket_web/main.py:38
msgid "Address"
msgstr "Adresse"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "Sidentifier"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
msgid "Invalid username or password."
msgstr "Nom dutilisateur ou mot de passe incorrect."
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr "Connexion réussie!"
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "Mot de passe actuel"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "Nouveau mot de passe"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "Confirmer le nouveau mot de passe"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
msgid "The new passwords must match."
msgstr "Les nouveaux mots de passe doivent être identiques."
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr "Se déconnecter"
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr "Personne"
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "Amis seulement"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "Tout le monde"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "Avatar"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr "Visibilité du profil"
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "Mettre à jour le profil"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr "Données du compte"
#: snikket_web/user.py:86
msgid "Upload"
msgstr "Télécharger"
#: snikket_web/user.py:111
msgid "Incorrect password."
msgstr "Mot de passe incorrect."
#: snikket_web/user.py:103
#: snikket_web/user.py:115
msgid "Password changed"
msgstr "Mot de passe changé"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
@@ -329,13 +369,17 @@ msgstr ""
"Lavatar choisi est trop gros. Pour utiliser un avatar aussi large, veuillez "
"utiliser lapplication."
#: snikket_web/user.py:159
#: snikket_web/user.py:170
msgid "Profile updated"
msgstr "Profil mis à jour"
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
msgstr "Erreur"
#: snikket_web/user.py:184
msgid "Export"
msgstr "Exporter"
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr "Vous n'avez actuellement aucune donnée de compte à exporter."
#: snikket_web/templates/_footer.html:4
#, python-format
@@ -427,7 +471,7 @@ msgstr ""
msgid "Software Versions"
msgstr "Version des logiciels"
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "Retour à la page principale"
@@ -543,6 +587,54 @@ msgstr "Journal de débogage brut"
msgid "Copy complete output"
msgstr "Copier le journal entier"
#: snikket_web/templates/admin_delete_circle.html:4
#, fuzzy, python-format
#| msgid "Edit circle %(circle_name)s"
msgid "Delete circle %(circle_name)s"
msgstr "Éditer le cercle %(circle_name)s"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "Supprimer le cercle"
#: snikket_web/templates/admin_delete_circle.html:8
#, fuzzy
#| msgid "Are you sure you want to delete the following user?"
msgid "Are you sure you want to delete the following circle?"
msgstr "Êtes-vous certain(e) de vouloir désinscrire lutilisateur suivant?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Danger"
#: snikket_web/templates/admin_delete_circle.html:14
#, fuzzy
#| msgid ""
#| "The user and their data will be deleted irrevocably, permanently and "
#| "immediately upon pushing the below button. <strong>There is no way back!</"
#| "strong>"
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
"Lutilisateur et ses données vont être irrévocablement supprimées, "
"immédiatement après avoir pressé le bouton ci-dessous. <strong>Il est "
"impossible de revenir en arrière!</strong>"
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "Retour"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -557,10 +649,6 @@ msgstr "Désinscrire un utilisateur"
msgid "Are you sure you want to delete the following user?"
msgstr "Êtes-vous certain(e) de vouloir désinscrire lutilisateur suivant?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Danger"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -571,14 +659,6 @@ msgstr ""
"immédiatement après avoir pressé le bouton ci-dessous. <strong>Il est "
"impossible de revenir en arrière!</strong>"
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "Retour"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr "Ceci est votre cercle principal"
@@ -612,10 +692,6 @@ msgstr "Ce cercle na pas de conversation de groupe associée."
msgid "Return to circle list"
msgstr "Revenir à la liste des cercles"
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "Supprimer le cercle"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr "Supprimer un cercle ne supprime aucun utilisateur dans le cercle."
@@ -929,6 +1005,7 @@ msgstr "Charge système (moyenne sur 5 minutes)"
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr "inconnu(e)"
@@ -974,14 +1051,18 @@ msgid "Snikket server status"
msgstr "Statut du serveur Snikket"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr "Stockage utilisé par les fichiers partagés"
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr "Clients connectés"
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr "Diffusion de message"
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
@@ -1100,8 +1181,8 @@ msgstr "Lapplication est déjà installée?"
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr "Ouvrir lapplication"
@@ -1169,7 +1250,6 @@ msgstr ""
"Vous pouvez désormais vous connecter en utilisant votre nouveau mot de passe."
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr "Vous pouvez maintenant fermer cette page en toute sécurité."
@@ -1205,7 +1285,6 @@ msgstr ""
"utilisant le bouton Scan tout en haut."
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1266,6 +1345,46 @@ msgstr ""
"Vous pouvez maintenant configurer votre client XMPP avec ladresse ci-dessus "
"et le mot de passe que vous avez choisi lors de lenregistrement."
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
"Vous pouvez maintenant fermer cette page en toute sécurité, ou vous "
"connecter au portail web pour <a href=\"%(login_url)s\">gérer votre compte</"
"a>."
#: snikket_web/templates/invite_success.html:21
msgid "Import successful"
msgstr "Importation réussie"
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr ""
"Félicitations ! Les données de votre compte ont été importées avec succès."
#: snikket_web/templates/invite_success.html:26
msgid "Moving to Snikket?"
msgstr "Nouveau utilisateur Snikket ?"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
"Si vous passez d'une autre instance de Snikket ou d'un autre service "
"compatible XMPP, vous pouvez éventuellement importer les données (contacts, "
"informations de profil, etc.) de votre ancien compte. Lorsque vous avez "
"exporté les données de votre ancien compte, téléchargez-les en utilisant le "
"formulaire ci-dessous."
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr "Télécharger les données du compte"
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1313,16 +1432,15 @@ msgid "Get it on Google Play"
msgstr "Obtenez-la sur Google Play"
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr "Télécharger sur lApp Store"
#: snikket_web/templates/invite_view.html:32
msgid "Get it on F-Droid"
msgstr ""
msgstr "Obtenez-le sur F-Droid"
#: snikket_web/templates/invite_view.html:35
#, fuzzy
msgid "Send to mobile device"
msgstr "Envoyer vers l'appareil"
@@ -1352,11 +1470,11 @@ msgid "Scan invite code"
msgstr "Scanner le code dinvitation"
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr "Fermer"
@@ -1369,64 +1487,51 @@ msgstr ""
"scannant un code avec votre appareil photo. Vous pouvez utiliser soit une "
"application de scanner de QR code, soit lapplication Snikket elle-même."
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr "En utilisant un scanner de QR code"
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr "En utilisant lapplication Snikket"
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
"Utilisez un scanner de <em>QR code</em> sur votre appareil mobile pour "
"scanner le code ci-dessous:"
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
"Installez lapplication Snikket sur votre appareil mobile, ouvrez-la et "
"appuyez sur le bouton «Scan» en haut."
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr "Installer sur iOS"
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
msgstr ""
"Après avoir téléchargé Snikket depuis l'App Store, vous devez revenir à ce "
"lien d'invitation et cliquer sur \"Ouvrir l'application\" pour continuer."
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr ""
"Téléchargez d'abord Snikket depuis l'App Store en utilisant le bouton ci-"
"dessous :"
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
msgstr ""
"Une fois l'installation terminée, vous pouvez revenir à cette page et "
"appuyer sur le bouton \"Ouvrir l'application\" pour poursuivre la "
"configuration :"
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr "Installer via F-Droid"
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
msgstr ""
"Après avoir installé Snikket via F-Droid, vous devez revenir à ce lien "
"d'invitation et appuyer sur \"Ouvrir l'application\" pour continuer."
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr ""
"Installez d'abord Snikket depuis F-Droid en utilisant le bouton ci-dessous :"
#: snikket_web/templates/library.j2:18
msgid "Copy link"
@@ -1491,16 +1596,21 @@ msgstr "Votre adresse XMPP"
msgid "Edit profile"
msgstr "Éditer votre profil"
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
msgid "Manage your data"
msgstr "Gérer vos données"
#: snikket_web/templates/user_home.html:39
msgid "Your Snikket"
msgstr "Votre Snikket"
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
msgid "Manage users, invitations and circles of your Snikket service."
msgstr ""
"Gérer les utilisateurs, invitations et cercles de votre service Snikket."
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
msgid "Admin panel"
msgstr "Panneau dadministration"
@@ -1516,6 +1626,18 @@ msgstr ""
"Cliquez ci-dessous pour vous déconnecter du portail. Ceci naffecte pas vos "
"autres appareils connectés."
#: snikket_web/templates/user_manage_data.html:8
msgid "Export account"
msgstr "Exportation du compte"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr ""
"Téléchargez les données de votre compte sous forme d'un fichier à des fins "
"de sauvegarde ou pour transférer votre compte vers un autre service."
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr "Changer votre mot de passe"
@@ -1558,6 +1680,26 @@ msgstr ""
"Cette section permet de configurer qui peut voir votre profil, comme par "
"exemple votre avatar et votre pseudonyme."
#~ msgid "Using a QR code scanner"
#~ msgstr "En utilisant un scanner de QR code"
#~ msgid "Using the Snikket app"
#~ msgstr "En utilisant lapplication Snikket"
#~ msgid ""
#~ "Use a <em>QR code</em> scanner on your mobile device to scan the code "
#~ "below:"
#~ msgstr ""
#~ "Utilisez un scanner de <em>QR code</em> sur votre appareil mobile pour "
#~ "scanner le code ci-dessous:"
#~ msgid ""
#~ "Install the Snikket app on your mobile device, open it, and tap the "
#~ "'Scan' button at the top."
#~ msgstr ""
#~ "Installez lapplication Snikket sur votre appareil mobile, ouvrez-la et "
#~ "appuyez sur le bouton «Scan» en haut."
#~ msgid "Create password reset link for %(user_name)s"
#~ msgstr "Crée un lien de réinitialisation de mot de passe pour %(user_name)s"

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: translations@snikket.org\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"PO-Revision-Date: 2021-12-12 07:00+0000\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2023-04-02 15:17+0000\n"
"Last-Translator: uira <inboxriau@andriana.id>\n"
"Language-Team: Indonesian <http://i18n.sotecware.net/projects/snikket/"
"web-portal/id/>\n"
@@ -17,311 +17,350 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.8.1\n"
"X-Generator: Weblate 4.14.1\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr "Terbatas"
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "Nama login"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "Nama tampilan"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr "Level akses"
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr "Terbatas"
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr "Pengguna normal"
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
msgid "Administrator"
msgstr "Administrator"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
msgid "Update user"
msgstr "Memperbarui pengguna"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
msgid "Create password reset link"
msgstr "Buat tautan setel ulang kata sandi"
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
msgid "Password reset link created"
msgstr "Tautan setel ulang kata sandi dibuat"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
msgid "User information updated."
msgstr "Informasi pengguna diperbarui."
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "Hapus permanen pengguna"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
msgid "User deleted"
msgstr "Pengguna dihapus"
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
msgid "Password reset link not found"
msgstr "Tautan setel ulang kata sandi tidak ditemukan"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
msgid "Password reset link deleted"
msgstr "Tautan setel ulang kata sandi dihapus"
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "Undang masuk kelompok"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "Minimal satu kelompok harus dipilih"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "Valid selama"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "Satu jam"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "Dua belas jam"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "Satu hari"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "Satu minggu"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "Empat minggu"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "Jenis undangan"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr "Individu"
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr "Grup"
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "Tautan undangan baru"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "Batalkan"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
msgid "Invitation created"
msgstr "Undangan dibuat"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
msgid "No such invitation exists"
msgstr "Undangan tidak tersedia"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
msgid "Invitation revoked"
msgstr "Undangan dibatalkan"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "Nama"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "Buat kelompok"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
msgid "Circle created"
msgstr "Kelompok dibuat"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "Pilih pengguna"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
msgid "Update circle"
msgstr "Memperbarui kelompok"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "Hapus kelompok secara permanen"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "Tambah pengguna"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
msgid "No such circle exists"
msgstr "Kelompok tersebut tidak ada"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
msgid "Circle data updated"
msgstr "Data kelompok diperbarui"
#: snikket_web/admin.py:525
msgid "Circle deleted"
msgstr "Kelompok dihapus"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
msgid "User added to circle"
msgstr "Pengguna ditambahkan ke kelompok"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
msgid "User removed from circle"
msgstr "Pengguna dihapus dari kelompok"
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "Hapus kelompok secara permanen"
#: snikket_web/admin.py:574
msgid "Circle deleted"
msgstr "Kelompok dihapus"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr "Isi pesan"
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr "Hanya kirim ke pengguna online"
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr "Kirim ke semua pengguna"
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr "Kirim pratinjau ke diri sendiri"
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr "Pengumuman terkirim!"
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "Utama"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
"Data akun yang coba diimpor terlalu besar untuk diunggah. Silakan hubungi "
"operator Snikket Anda."
#: snikket_web/invite.py:114
msgid "Username"
msgstr "Nama pengguna"
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "Kata sandi"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
msgid "Confirm password"
msgstr "Konfirmasi kata sandi"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
msgid "The passwords must match."
msgstr "Kata sandi harus cocok."
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
msgid "Create account"
msgstr "Buat akun"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
msgid "That username is already taken."
msgstr "Nama pengguna itu sudah dipakai."
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
msgid "Registration was declined for unknown reasons."
msgstr "Pendaftaran ditolak karena alasan yang tidak diketahui."
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
msgid "The username is not valid."
msgstr "Nama pengguna tidak valid."
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "Ganti kata sandi"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr "File data akun"
#: snikket_web/invite.py:250
msgid "Import data"
msgstr "Impor data"
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
"Data akun yang coba diimpor dalam format yang tidak dikenal. Harap unggah "
"file XML dalam format XEP-0227 (format yang disediakan: %(mimetype)s)."
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr "Kesalahan"
#: snikket_web/main.py:38
msgid "Address"
msgstr "Alamat"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "Masuk"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
msgid "Invalid username or password."
msgstr "Nama pengguna atau kata sandi salah."
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr "Login berhasil!"
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "Kata sandi sekarang"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "Kata sandi baru"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "Konfirmasi kata sandi"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
msgid "The new passwords must match."
msgstr "Kata sandi baru harus cocok."
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr "Keluar"
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr "Tak seorangpun"
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "Hanya teman"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "Semua orang"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "Gambar profil"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr "Visibilitas profil"
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "Perbarui profil"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr "Data akun"
#: snikket_web/user.py:86
msgid "Upload"
msgstr "Unggah"
#: snikket_web/user.py:111
msgid "Incorrect password."
msgstr "Kata sandi salah."
#: snikket_web/user.py:103
#: snikket_web/user.py:115
msgid "Password changed"
msgstr "Kata sandi diganti"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
@@ -329,13 +368,17 @@ msgstr ""
"Avatar yang dipilih terlalu besar. Untuk dapat mengunggah avatar yang lebih "
"besar, sila gunakan aplikasi."
#: snikket_web/user.py:159
#: snikket_web/user.py:170
msgid "Profile updated"
msgstr "Profil diperbarui"
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
msgstr "Kesalahan"
#: snikket_web/user.py:184
msgid "Export"
msgstr "Ekspor"
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr "Anda tidak memiliki data akun untuk diekspor."
#: snikket_web/templates/_footer.html:4
#, python-format
@@ -429,7 +472,7 @@ msgstr ""
msgid "Software Versions"
msgstr "Versi perangkat lunak"
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "Kembali ke halaman depan"
@@ -545,6 +588,46 @@ msgstr "Kumpulan data debug mentah"
msgid "Copy complete output"
msgstr "Salin keluaran lengkap"
#: snikket_web/templates/admin_delete_circle.html:4
#, python-format
msgid "Delete circle %(circle_name)s"
msgstr "Hapus kelompok %(circle_name)s"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "Hapus kelompok"
#: snikket_web/templates/admin_delete_circle.html:8
msgid "Are you sure you want to delete the following circle?"
msgstr "Apakah anda yakin mau menghapus circle tersebut?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Berbahaya"
#: snikket_web/templates/admin_delete_circle.html:14
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
"Circle dan datanya akan dihapus secara permanen, tidak bisa dibatalkan, "
"segera setelah menekan tombol di bawah. <strong>Tidak ada jalan "
"kembali!</strong>"
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "Kembali"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -559,10 +642,6 @@ msgstr "Hapus pengguna"
msgid "Are you sure you want to delete the following user?"
msgstr "Apakah anda yakin mau menghapus pengguna tersebut?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Berbahaya"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -573,14 +652,6 @@ msgstr ""
"segera setelah menekan tombol di bawah. <strong>Tidak ada jalan kembali!</"
"strong>"
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "Kembali"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr "Ini kelompok utama anda"
@@ -614,10 +685,6 @@ msgstr "Kelompok ini tidak memiliki percakapan grup."
msgid "Return to circle list"
msgstr "Kembali ke daftar circle"
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "Hapus kelompok"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr ""
@@ -930,6 +997,7 @@ msgstr "Beban sistem (rata-rata 5 menit)"
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr "Tidak diketahui"
@@ -975,14 +1043,18 @@ msgid "Snikket server status"
msgstr "Status server Snikket"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr "Penyimpanan yang digunakan oleh file bersama"
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr "Perangkat terhubung"
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr "Sebarkan pesan"
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
@@ -1100,8 +1172,8 @@ msgstr "Aplikasi sudah dipasang?"
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr "Buka aplikasi"
@@ -1168,7 +1240,6 @@ msgid "You can now log in using your new password."
msgstr "Anda dapat masuk menggunakan kata sandi baru Anda."
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr "Sekarang Anda dapat menutup halaman ini."
@@ -1204,7 +1275,6 @@ msgstr ""
"tombol Pindai di bagian atas."
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1260,6 +1330,44 @@ msgstr ""
"Sekarang anda dapat mempersiapkan aplikasi XMPP lawas Anda dengan alamat di "
"atas dan kata sandi yang dipilih saat pendaftaran."
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
"Anda dapat menutup halaman ini dengan aman, atau masuk ke portal web untuk "
"<a href=\"%(login_url)s\">mengelola akun anda</a>."
#: snikket_web/templates/invite_success.html:21
msgid "Import successful"
msgstr "Impor berhasil"
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr "Selamat! Data akun Anda telah berhasil diimpor."
#: snikket_web/templates/invite_success.html:26
msgid "Moving to Snikket?"
msgstr "Pindahkan ke Snikket?"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
"Jika Anda berpindah dari instans Snikket yang berbeda atau layanan lain yang "
"kompatibel dengan XMPP, Anda memiliki pilihan mengimpor data (kontak, "
"informasi profil, dll.) dari akun Anda sebelumnya. Ketika Anda telah "
"mengekspor data dari akun Anda sebelumnya, unggah menggunakan form di bawah "
"ini."
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr "Unggah data akun"
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1305,7 +1413,7 @@ msgid "Get it on Google Play"
msgstr "Dapatkan di Google Play"
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr "Unduh di App Store"
@@ -1341,11 +1449,11 @@ msgid "Scan invite code"
msgstr "Pindai kode undangan"
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr "Tutup"
@@ -1358,34 +1466,11 @@ msgstr ""
"kode dengan kamera. Anda dapat menggunakan aplikasi pemindai QR atau "
"aplikasi Snikket."
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr "Menggunakan pemindai kode QR"
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr "Menggunakan Snikket"
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
"Gunakan pemindai <em>kode QR</em> di perangkat seluler Anda untuk memindai "
"kode di bawah:"
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
"Instal aplikasi Snikket di perangkat seluler Anda, buka, dan ketuk tombol "
"'Pindai'."
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr "Pasang di iOS"
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
@@ -1393,12 +1478,12 @@ msgstr ""
"Setelah mengunduh Snikket dari App Store, Anda harus kembali ke tautan "
"undangan ini dan klik \"Buka aplikasi\" untuk melanjutkan."
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr "Pertama, unduh Snikket dari App Store menggunakan tombol di bawah ini:"
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
@@ -1406,12 +1491,12 @@ msgstr ""
"Setelah instalasi selesai, Anda dapat kembali ke halaman ini dan mengetuk "
"tombol \"Buka aplikasi\" untuk melanjutkan pemasangan:"
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr "Install melalui F-Droid"
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
@@ -1419,7 +1504,7 @@ msgstr ""
"Setelah menginstal Snikket melalui F-Droid, Anda harus kembali ke tautan "
"undangan ini dan ketuk \"Buka aplikasi\" untuk melanjutkan."
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr "Pertama install Snikket dari F-Droid menggunakan tombol di bawah ini:"
@@ -1486,15 +1571,20 @@ msgstr "Alamat XMPP anda"
msgid "Edit profile"
msgstr "Edit profil"
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
msgid "Manage your data"
msgstr "Kelola data anda"
#: snikket_web/templates/user_home.html:39
msgid "Your Snikket"
msgstr "Snikket anda"
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
msgid "Manage users, invitations and circles of your Snikket service."
msgstr "Kelola pengguna, undangan dan kelompok pengguna layanan Snikket."
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
msgid "Admin panel"
msgstr "Panel Administrator"
@@ -1510,6 +1600,18 @@ msgstr ""
"Klik tombol untuk keluar dari portal web. Ini tidak mempengaruhi perangkat "
"lain yang terhubung."
#: snikket_web/templates/user_manage_data.html:8
msgid "Export account"
msgstr "Ekspor akun"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr ""
"Unduh data akun sebagai file untuk backup atau untuk memindahkan akun Anda "
"ke layanan lain."
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr "Ganti kata sandi anda"
@@ -1552,6 +1654,26 @@ msgstr ""
"Bagian ini memungkinkan Anda untuk mengontrol siapa yang bisa melihat profil "
"Anda, seperti avatar dan nama panggilan."
#~ msgid "Using a QR code scanner"
#~ msgstr "Menggunakan pemindai kode QR"
#~ msgid "Using the Snikket app"
#~ msgstr "Menggunakan Snikket"
#~ msgid ""
#~ "Use a <em>QR code</em> scanner on your mobile device to scan the code "
#~ "below:"
#~ msgstr ""
#~ "Gunakan pemindai <em>kode QR</em> di perangkat seluler Anda untuk "
#~ "memindai kode di bawah:"
#~ msgid ""
#~ "Install the Snikket app on your mobile device, open it, and tap the "
#~ "'Scan' button at the top."
#~ msgstr ""
#~ "Instal aplikasi Snikket di perangkat seluler Anda, buka, dan ketuk tombol "
#~ "'Pindai'."
#~ msgid "Create password reset link for %(user_name)s"
#~ msgstr "Buat tautan setel ulang kata sandi untuk %(user_name)s"

View File

@@ -6,322 +6,362 @@
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"PO-Revision-Date: 2021-05-19 15:12+0000\n"
"Report-Msgid-Bugs-To: translations@snikket.org\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2023-07-13 11:17+0000\n"
"Last-Translator: Roberto Resoli <roberto@resolutions.it>\n"
"Language-Team: Italian <https://i18n.sotecware.net/projects/snikket/web-"
"portal/it/>\n"
"Language-Team: Italian <http://i18n.sotecware.net/projects/snikket/"
"web-portal/it/>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.5.1\n"
"X-Generator: Weblate 4.14.1\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr "Limitato"
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "Nome utente"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "Nome visualizzato"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr "Livello di accesso"
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr "Limitato"
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr "Utente normale"
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
msgid "Administrator"
msgstr "Amministratore"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
msgid "Update user"
msgstr "Aggiorna utente"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
msgid "Create password reset link"
msgstr "Crea collegamento per reimpostare la password"
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
msgid "Password reset link created"
msgstr "Creato collegamento per reimpostare la password"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
msgid "User information updated."
msgstr "Informazioni utente aggiornate."
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "Elimina definitivamente l'utente"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
msgid "User deleted"
msgstr "Utente rimosso"
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
msgid "Password reset link not found"
msgstr "Collegamento per reimpostare la password non trovato"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
msgid "Password reset link deleted"
msgstr "Eliminato collegamento per reimpostare la password"
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "Invita nella cerchia"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "Devi selezionare almeno una cerchia"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "Valido per"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "Un'ora"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "Dodici ore"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "Un giorno"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "Una settimana"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "Quattro settimane"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "Tipo di invito"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr "Individuale"
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr "Gruppo"
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "Nuovo collegamento di invito"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "Revoca"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
msgid "Invitation created"
msgstr "Invito creato"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
msgid "No such invitation exists"
msgstr "Questo invito non esiste"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
msgid "Invitation revoked"
msgstr "Invito revocato"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "Nome"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "Crea cerchia"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
msgid "Circle created"
msgstr "Cerchia creata"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "Seleziona utente"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
msgid "Update circle"
msgstr "Modifica cerchia"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "Elimina cerchia definitivamente"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "Aggiungi utente"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
msgid "No such circle exists"
msgstr "Questa cerchia non esiste"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
msgid "Circle data updated"
msgstr "Dati della cerchia aggiornati"
#: snikket_web/admin.py:525
msgid "Circle deleted"
msgstr "Cerchia eliminata"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
msgid "User added to circle"
msgstr "Utente aggiunto alla cerchia"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
msgid "User removed from circle"
msgstr "Utente rimosso dalla cerchia"
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "Elimina cerchia definitivamente"
#: snikket_web/admin.py:574
msgid "Circle deleted"
msgstr "Cerchia eliminata"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr ""
msgstr "Contenuto dei messaggi"
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr ""
msgstr "Inviare solo agli utenti online"
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr ""
msgstr "Inviare a tutti gli utenti"
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr ""
msgstr "Inviare una anteprima a te stesso"
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr ""
msgstr "Annuncio inviato!"
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "Principale"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
"I dati dell'utenza che hai provato ad importare sono troppo grandi per "
"essere caricati. Contatta il tuo operatore Snikket."
#: snikket_web/invite.py:114
msgid "Username"
msgstr "Nome utente"
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "Password"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
msgid "Confirm password"
msgstr "Conferma password"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
msgid "The passwords must match."
msgstr "Le password devono essere identiche."
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
msgid "Create account"
msgstr "Crea utenza"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
msgid "That username is already taken."
msgstr "Nome utente già in uso."
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
msgid "Registration was declined for unknown reasons."
msgstr "Registrazione rifiutata per motivi sconosciuti."
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
msgid "The username is not valid."
msgstr "Nome utente non valido."
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "Cambia password"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr "File con i dati dell'utenza"
#: snikket_web/invite.py:250
msgid "Import data"
msgstr "Importa i dati"
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
"I dati dell'utenza che stai cercando di importare sono in un formato "
"sconosciuto. Per favore, carica un file XML in formato XEP-0227 (formato "
"fornito: %(mimetype)s)."
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr "Errore"
#: snikket_web/main.py:38
msgid "Address"
msgstr "Indirizzo"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "Accedi"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
msgid "Invalid username or password."
msgstr "Nome utente o password non validi."
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr "Accesso riuscito!"
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "Password attuale"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "Nuova password"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "Conferma nuova password"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
msgid "The new passwords must match."
msgstr "Le nuove password devono essere identiche."
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr "Esci"
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr "Nessuno"
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "Solo amici"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "Chiunque"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "Avatar"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr "Visibilità del profilo"
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "Modifica profilo"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr "Dati dell'utenza"
#: snikket_web/user.py:86
msgid "Upload"
msgstr "Caricare"
#: snikket_web/user.py:111
msgid "Incorrect password."
msgstr "Password errata."
#: snikket_web/user.py:103
#: snikket_web/user.py:115
msgid "Password changed"
msgstr "Password cambiata"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
@@ -329,13 +369,17 @@ msgstr ""
"L'avatar scelto è troppo grande. Per utilizzare un avatar così grande, "
"utilizzate l'app."
#: snikket_web/user.py:159
#: snikket_web/user.py:170
msgid "Profile updated"
msgstr "Profilo aggiornato"
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
msgstr "Errore"
#: snikket_web/user.py:184
msgid "Export"
msgstr "Esportare"
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr "Al momento non hai dati utente da esportare."
#: snikket_web/templates/_footer.html:4
#, python-format
@@ -428,7 +472,7 @@ msgstr ""
msgid "Software Versions"
msgstr "Versioni dei programmi"
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "Torna alla pagina principale"
@@ -544,6 +588,46 @@ msgstr "Dati diagnostici grezzi"
msgid "Copy complete output"
msgstr "Copia l'intero output"
#: snikket_web/templates/admin_delete_circle.html:4
#, python-format
msgid "Delete circle %(circle_name)s"
msgstr "Elimina la cerchia %(circle_name)s"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "Elimina cerchia"
#: snikket_web/templates/admin_delete_circle.html:8
msgid "Are you sure you want to delete the following circle?"
msgstr "Vuoi veramente eliminare la seguente cerchia?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Pericolo"
#: snikket_web/templates/admin_delete_circle.html:14
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
"La cerchia e la relativa chat verranno eliminate in modo permanente ed "
"irreversibile non appena verrà premuto il pulsante sottostante. <strong>Non "
"sarà possibile tornare indietro!</strong>"
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "Indietro"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -558,10 +642,6 @@ msgstr "Elimina utente"
msgid "Are you sure you want to delete the following user?"
msgstr "Sei sicura/o di volere eliminare il seguente utente?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Pericolo"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -572,14 +652,6 @@ msgstr ""
"irreversibile non appena verrà premuto il pulsante sottostante. <strong>Non "
"sarà possibile tornare sui propri passi!</strong>"
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "Indietro"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr "Questa è la vostra cerchia principale"
@@ -614,10 +686,6 @@ msgstr "Questa cerchia non è collegata ad una chat di gruppo."
msgid "Return to circle list"
msgstr "Ritorna alle lista delle cerchie"
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "Elimina cerchia"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr "Eliminare una cerchia non elimina nessuno dei suoi utenti."
@@ -628,7 +696,7 @@ msgstr "Membri della cerchia"
#: snikket_web/templates/admin_edit_circle.html:71
msgid "The user has been deleted from the server."
msgstr ""
msgstr "L'utenza è stata eliminata dal server."
#: snikket_web/templates/admin_edit_circle.html:71
#: snikket_web/templates/library.j2:108
@@ -842,11 +910,12 @@ msgstr "Gestisci inviti"
#: snikket_web/templates/admin_home.html:35
msgid "System health"
msgstr ""
msgstr "Stato di salute del sistema"
#: snikket_web/templates/admin_home.html:38
msgid "View the server status or send a broadcast message to all users."
msgstr ""
"Veder e lo stato del server e trasmettere un messaggio a tutti gli utenti."
#: snikket_web/templates/admin_home.html:40
msgid "Send a broadcast message to all users."
@@ -931,6 +1000,7 @@ msgstr ""
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr ""
@@ -976,14 +1046,18 @@ msgid "Snikket server status"
msgstr "Portale Web di Snikket"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr ""
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr ""
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr ""
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
@@ -1099,8 +1173,8 @@ msgstr "Applicazione già installata?"
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr "Apri l'applicazione"
@@ -1167,7 +1241,6 @@ msgid "You can now log in using your new password."
msgstr "Ora puoi collegarti utilizzando la nuova password."
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr "Puoi chiudere questa pagina in tutta sicurezza."
@@ -1203,7 +1276,6 @@ msgstr ""
"Snikket utilizzando il pulsante di scansione in alto."
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1261,6 +1333,41 @@ msgstr ""
"Ora puoi impostare il tuo client XMPP con l'indirizzo mostrato sopra e la "
"password che hai impostato durante la registrazione."
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
#: snikket_web/templates/invite_success.html:21
#, fuzzy
#| msgid "Operation successful"
msgid "Import successful"
msgstr "Operazione completata"
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr ""
#: snikket_web/templates/invite_success.html:26
#, fuzzy
#| msgid "Using the Snikket app"
msgid "Moving to Snikket?"
msgstr "Usa l'applicazione Snikket"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr ""
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1308,7 +1415,7 @@ msgid "Get it on Google Play"
msgstr "Scarica da Google Play"
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr "Scarica dall'App Store"
@@ -1345,11 +1452,11 @@ msgid "Scan invite code"
msgstr "Scansiona il codice di invito"
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr "Chiudi"
@@ -1362,34 +1469,11 @@ msgstr ""
"con la fotocamera. Puoi usare un lettore di codici QR o l'applicazione "
"Snikket stessa."
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr "Usa un lettore di codici QR"
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr "Usa l'applicazione Snikket"
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
"Usa un lettore di <em>codici QR</em> sul tuo dispositivo mobile per "
"scansionare il seguente codice:"
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
"Installa l'applicazione Snikket sul tuo dispositivo mobile, aprila e poi "
"premi il pulsante di scansione in alto."
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr "Installa su iOS"
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
@@ -1397,14 +1481,14 @@ msgstr ""
"Dopo aver scaricato Snikket dall'App Store, devi tornare a questo link di "
"invito e toccare \"Apri nell'app\" per procedere."
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr ""
"Per prima cosa, scarica Snikket dall'App Store utilizzando il pulsante qui "
"sotto:"
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
@@ -1412,12 +1496,12 @@ msgstr ""
"Dopo che l'installazione è completa, puoi tornare a questa pagina e toccare "
"il pulsante \"Apri nell'app\" per continuare con la configurazione:"
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr "Installa da F-Droid"
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
@@ -1425,7 +1509,7 @@ msgstr ""
"Dopo aver installato Snikket da F-Droid, devi tornare a questo link di "
"invito e toccare su \"Apri nell'app\" per procedere."
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr ""
"Per prima cosa installa Snikket da F-Droid utilizzando il pulsante qui sotto:"
@@ -1496,15 +1580,22 @@ msgstr "Il tuo indirizzo XMPP"
msgid "Edit profile"
msgstr "Modifica profilo"
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
#, fuzzy
#| msgid "Manage users"
msgid "Manage your data"
msgstr "Gestisci utenti"
#: snikket_web/templates/user_home.html:39
msgid "Your Snikket"
msgstr "Il tuo Snikket"
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
msgid "Manage users, invitations and circles of your Snikket service."
msgstr "Gestisci utenti, inviti e cerchie del tuo servizio Snikket."
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
msgid "Admin panel"
msgstr "Pannello amministrativo"
@@ -1520,6 +1611,18 @@ msgstr ""
"Premi il pulsante sottostante per uscire dal portale web. Non ha effetto "
"sugli altri dispositivi collegati."
#: snikket_web/templates/user_manage_data.html:8
#, fuzzy
#| msgid "Your account"
msgid "Export account"
msgstr "La tua utenza"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr ""
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr "Modifica la tua password"
@@ -1562,6 +1665,26 @@ msgstr ""
"Questa sezione ti permette di controllare chi può visualizzare i dettagli "
"del tuo profilo, come ad esempio l'avatar o il soprannome."
#~ msgid "Using a QR code scanner"
#~ msgstr "Usa un lettore di codici QR"
#~ msgid "Using the Snikket app"
#~ msgstr "Usa l'applicazione Snikket"
#~ msgid ""
#~ "Use a <em>QR code</em> scanner on your mobile device to scan the code "
#~ "below:"
#~ msgstr ""
#~ "Usa un lettore di <em>codici QR</em> sul tuo dispositivo mobile per "
#~ "scansionare il seguente codice:"
#~ msgid ""
#~ "Install the Snikket app on your mobile device, open it, and tap the "
#~ "'Scan' button at the top."
#~ msgstr ""
#~ "Installa l'applicazione Snikket sul tuo dispositivo mobile, aprila e poi "
#~ "premi il pulsante di scansione in alto."
#~ msgid "Create password reset link for %(user_name)s"
#~ msgstr "Crea collegamento per reimpostare la password di %(user_name)s"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2021-01-28 17:55+0000\n"
"Last-Translator: pep <pep@bouah.net>\n"
"Language-Team: Japanese <https://i18n.sotecware.net/projects/snikket/web-"
@@ -20,367 +20,406 @@ msgstr ""
"X-Generator: Weblate 4.4.2\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr ""
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "ロゲイン名"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "表示名"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr ""
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr ""
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr ""
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
#, fuzzy
#| msgid "Admin area"
msgid "Administrator"
msgstr "管理"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
#, fuzzy
#| msgid "Update circle"
msgid "Update user"
msgstr "サークルを更新"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
#, fuzzy
#| msgid "Password reset link for %(user_name)s"
msgid "Create password reset link"
msgstr "%(user_name)s のパスワード再設定リンク"
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
#, fuzzy
#| msgid "Password reset link for %(user_name)s"
msgid "Password reset link created"
msgstr "%(user_name)s のパスワード再設定リンク"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
#, fuzzy
#| msgid "User information"
msgid "User information updated."
msgstr "ユーザー詳細"
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "ユーザーを削除する"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
msgid "User deleted"
msgstr ""
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
#, fuzzy
#| msgid "Password reset link for %(user_name)s"
msgid "Password reset link not found"
msgstr "%(user_name)s のパスワード再設定リンク"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
#, fuzzy
#| msgid "Password reset link for %(user_name)s"
msgid "Password reset link deleted"
msgstr "%(user_name)s のパスワード再設定リンク"
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "サークルに紹介する"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "サークルを選択してください"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "有効期限"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "一時間"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "12時間"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "一日"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "一週間"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "4週間"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "紹介の種類"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr "一回"
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr "複数回"
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "新しい紹介状"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "取り消す"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
#, fuzzy
#| msgid "Invitation type"
msgid "Invitation created"
msgstr "紹介の種類"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
#, fuzzy
#| msgid "New invitation link"
msgid "No such invitation exists"
msgstr "新しい紹介状"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
#, fuzzy
#| msgid "Invitation type"
msgid "Invitation revoked"
msgstr "紹介の種類"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "名"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "サークルを作成"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
#, fuzzy
#| msgid "Circle name"
msgid "Circle created"
msgstr "サークル名"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "ユーザー選択"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
msgid "Update circle"
msgstr "サークルを更新"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "サークルを削除"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "ユーザーを追加する"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
#, fuzzy
#| msgid "No circles"
msgid "No such circle exists"
msgstr "なし"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
#, fuzzy
#| msgid "Circle name"
msgid "Circle data updated"
msgstr "サークル名"
#: snikket_web/admin.py:525
#, fuzzy
#| msgid "Circle members"
msgid "Circle deleted"
msgstr "サークル会員"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
#, fuzzy
#| msgid "Invite to circle"
msgid "User added to circle"
msgstr "サークルに紹介する"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
#, fuzzy
#| msgid "Remove user %(username)s from circle"
msgid "User removed from circle"
msgstr "%(username)s をサークルから外す"
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "サークルを削除"
#: snikket_web/admin.py:574
#, fuzzy
#| msgid "Circle members"
msgid "Circle deleted"
msgstr "サークル会員"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr ""
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr ""
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr ""
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr ""
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr ""
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "第一サークル"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
#: snikket_web/invite.py:114
msgid "Username"
msgstr "ユーザー名"
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "パスワード"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
msgid "Confirm password"
msgstr "確認用パスワード"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
#, fuzzy
#| msgid "The passwords must match"
msgid "The passwords must match."
msgstr "確認用パスワードが一致しません"
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
msgid "Create account"
msgstr "アカウント作成"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
#, fuzzy
#| msgid "That username is already taken"
msgid "That username is already taken."
msgstr "このユーザー名は存在しています"
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
#, fuzzy
#| msgid "Registration was declined for unknown reasons"
msgid "Registration was declined for unknown reasons."
msgstr "理由不明の登録エラー"
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
#, fuzzy
#| msgid "The username is not valid"
msgid "The username is not valid."
msgstr "ユーザー名が不正"
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "パスワード変更"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr ""
#: snikket_web/invite.py:250
msgid "Import data"
msgstr ""
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr ""
#: snikket_web/main.py:38
msgid "Address"
msgstr "アドレス"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "サインイン"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
msgid "Invalid username or password."
msgstr "ユーザー名またはパスワードが不正。"
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr ""
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "現在のパスワード"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "新しいパスワード"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "新しいパスワードの確認"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
#, fuzzy
#| msgid "The new passwords must match"
msgid "The new passwords must match."
msgstr "新しいパスワードが不一致"
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr "サインアウト"
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr ""
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "コンタクト限定"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "全員"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "アバター"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr ""
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "プロファイル管理"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr ""
#: snikket_web/user.py:86
msgid "Upload"
msgstr ""
#: snikket_web/user.py:111
#, fuzzy
#| msgid "Incorrect password"
msgid "Incorrect password."
msgstr "パスワード不正"
#: snikket_web/user.py:103
#: snikket_web/user.py:115
#, fuzzy
#| msgid "Password reset"
msgid "Password changed"
msgstr "パスワード再設定"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
msgstr ""
#: snikket_web/user.py:159
#: snikket_web/user.py:170
#, fuzzy
#| msgid "Profile"
msgid "Profile updated"
msgstr "プロファイル"
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
#: snikket_web/user.py:184
msgid "Export"
msgstr ""
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr ""
#: snikket_web/templates/_footer.html:4
@@ -460,7 +499,7 @@ msgstr ""
msgid "Software Versions"
msgstr "ソフトウェアバーション"
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "戻る"
@@ -567,6 +606,53 @@ msgstr ""
msgid "Copy complete output"
msgstr ""
#: snikket_web/templates/admin_delete_circle.html:4
#, fuzzy, python-format
#| msgid "Edit circle %(circle_name)s"
msgid "Delete circle %(circle_name)s"
msgstr "%(circle_name)s を管理"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "サークル削除"
#: snikket_web/templates/admin_delete_circle.html:8
#, fuzzy
#| msgid "Are you sure you want to delete the following user?"
msgid "Are you sure you want to delete the following circle?"
msgstr "本当にこのユーザーを削除していいですか?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "警告"
#: snikket_web/templates/admin_delete_circle.html:14
#, fuzzy
#| msgid ""
#| "The user and their data will be deleted irrevocably, permanently and "
#| "immediately upon pushing the below button. <strong>There is no way back!</"
#| "strong>"
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
"ユーザーとそのユーザーのデータが削除されます。<strong>戻ることができません</"
"strong>"
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "戻る"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -581,10 +667,6 @@ msgstr "ユーザー削除"
msgid "Are you sure you want to delete the following user?"
msgstr "本当にこのユーザーを削除していいですか?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "警告"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -594,14 +676,6 @@ msgstr ""
"ユーザーとそのユーザーのデータが削除されます。<strong>戻ることができません</"
"strong>"
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "戻る"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr ""
@@ -634,10 +708,6 @@ msgstr ""
msgid "Return to circle list"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "サークル削除"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr "サークルを削除しても会員は削除されまんせん。"
@@ -956,6 +1026,7 @@ msgstr ""
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr ""
@@ -1001,14 +1072,18 @@ msgid "Snikket server status"
msgstr "Snikket ホームページ"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr ""
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr ""
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr ""
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
@@ -1124,8 +1199,8 @@ msgstr ""
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr ""
@@ -1191,7 +1266,6 @@ msgid "You can now log in using your new password."
msgstr ""
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr ""
@@ -1223,7 +1297,6 @@ msgid ""
msgstr ""
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1275,6 +1348,41 @@ msgid ""
"password you chose during registration."
msgstr ""
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
#: snikket_web/templates/invite_success.html:21
#, fuzzy
#| msgid "Password reset"
msgid "Import successful"
msgstr "パスワード再設定"
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr ""
#: snikket_web/templates/invite_success.html:26
#, fuzzy
#| msgid "About Snikket"
msgid "Moving to Snikket?"
msgstr "Snikketについて"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr ""
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1314,7 +1422,7 @@ msgid "Get it on Google Play"
msgstr ""
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr ""
@@ -1345,11 +1453,11 @@ msgid "Scan invite code"
msgstr "紹介状をスキャン"
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr "閉める"
@@ -1359,58 +1467,39 @@ msgid ""
"your camera. You can use either a QR scanner app or the Snikket app itself."
msgstr ""
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr ""
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr ""
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr ""
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
msgstr ""
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr ""
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
msgstr ""
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr ""
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
msgstr ""
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr ""
@@ -1482,17 +1571,24 @@ msgstr "談話室アドレス"
msgid "Edit profile"
msgstr "プロファイル管理"
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
#, fuzzy
#| msgid "Manage users"
msgid "Manage your data"
msgstr "ユーザー管理"
#: snikket_web/templates/user_home.html:39
#, fuzzy
#| msgid "About Snikket"
msgid "Your Snikket"
msgstr "Snikketについて"
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
msgid "Manage users, invitations and circles of your Snikket service."
msgstr ""
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
#, fuzzy
#| msgid "Admin area"
msgid "Admin panel"
@@ -1508,6 +1604,18 @@ msgid ""
"other connected devices."
msgstr ""
#: snikket_web/templates/user_manage_data.html:8
#, fuzzy
#| msgid "Create account"
msgid "Export account"
msgstr "アカウント作成"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr ""
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr "パスワード変更"

File diff suppressed because it is too large Load Diff

View File

@@ -6,9 +6,9 @@
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"PO-Revision-Date: 2021-09-03 15:00+0000\n"
"Report-Msgid-Bugs-To: translations@snikket.org\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2023-04-04 14:11+0000\n"
"Last-Translator: misiek <migelazur@mailbox.org>\n"
"Language-Team: Polish <http://i18n.sotecware.net/projects/snikket/web-portal/"
"pl/>\n"
@@ -18,311 +18,350 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.7.2\n"
"X-Generator: Weblate 4.14.1\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr "Ograniczony"
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "Login"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "Nazwa wyświetlana"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr "Poziom dostępu"
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr "Ograniczony"
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr "Zwykły użytkownik"
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
msgid "Administrator"
msgstr "Administrator"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
msgid "Update user"
msgstr "Zapisz ustawienia użytkownika"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
msgid "Create password reset link"
msgstr "Stwórz link do zresetowania hasła"
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
msgid "Password reset link created"
msgstr "Utworzono link resetowania hasła"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
msgid "User information updated."
msgstr "Zaktualizowano informacje o użytkowniku."
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "Usuń użytkownika bezpowrotnie"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
msgid "User deleted"
msgstr "Użytkownik został usunięty"
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
msgid "Password reset link not found"
msgstr "Nie znaleziono linku do zresetowania hasła"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
msgid "Password reset link deleted"
msgstr "Usunięto link resetowania hasła"
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "Zaproś do kręgu"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "Należy wybrać przynajmniej jeden krąg"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "Ważne przez"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "Godzinę"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "Dwanaście godzin"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "Dzień"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "Tydzień"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "Cztery tygodnie"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "Typ zaproszenia"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr "Indywidualne"
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr "Grupowe"
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "Nowy link z zaproszeniem"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "Unieważnij"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
msgid "Invitation created"
msgstr "Utworzono zaproszenie"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
msgid "No such invitation exists"
msgstr "Takie zaproszenie nie istnieje"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
msgid "Invitation revoked"
msgstr "Unieważniono zaproszenie"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "Nazwa"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "Utwórz krąg"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
msgid "Circle created"
msgstr "Utworzono krąg"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "Wybierz użytkownika"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
msgid "Update circle"
msgstr "Zaktualizuj ustawienia kręgu"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "Usuń krąg bezpowrotnie"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "Dodaj użytkownika"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
msgid "No such circle exists"
msgstr "Taki krąg nie istnieje"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
msgid "Circle data updated"
msgstr "Zaktualizowano dane kręgu"
#: snikket_web/admin.py:525
msgid "Circle deleted"
msgstr "Krąg został usunięty"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
msgid "User added to circle"
msgstr "Dodano użytkownika do kręgu"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
msgid "User removed from circle"
msgstr "Usunięto użytkownika z kręgu"
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "Usuń krąg bezpowrotnie"
#: snikket_web/admin.py:574
msgid "Circle deleted"
msgstr "Krąg został usunięty"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr "Treść wiadomości"
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr "Wyślij jedynie do użytkowników online"
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr "Wyślij do wszystkich użytkowników"
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr "Prześlij do siebie podgląd wiadomości"
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr "Komunikat wysłany!"
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "Główny"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
"Plik z danymi konta, które próbujesz zaimportować, jest zbyt duży. "
"Skontaktuj się z administratorem twojego serwera Snikket."
#: snikket_web/invite.py:114
msgid "Username"
msgstr "Nazwa użytkownika"
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "Hasło"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
msgid "Confirm password"
msgstr "Potwierdź hasło"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
msgid "The passwords must match."
msgstr "Hasła muszą się zgadzać."
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
msgid "Create account"
msgstr "Utwórz konto"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
msgid "That username is already taken."
msgstr "Ta nazwa użytkownika jest już zajęta."
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
msgid "Registration was declined for unknown reasons."
msgstr "Z nieznanych przyczyn rejestracja została odrzucona."
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
msgid "The username is not valid."
msgstr "Ta nazwa użytkownika jest nieprawidłowa."
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "Zmień hasło"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr "Plik z danymi konta"
#: snikket_web/invite.py:250
msgid "Import data"
msgstr "Importuj dane"
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
"Dane konta, które próbujesz zaimportować, mają nieznany format. Proszę "
"wybrać plik w formacie XML zgodnym z XEP-0227 (podany format: %(mimetype)s)."
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr "Błąd"
#: snikket_web/main.py:38
msgid "Address"
msgstr "Adres"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "Zaloguj się"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
msgid "Invalid username or password."
msgstr "Nieprawidłowa nazwa użytkownika lub hasło."
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr "Zalogowano się pomyślnie!"
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "Obecne hasło"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "Nowe hasło"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "Potwierdź nowe hasło"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
msgid "The new passwords must match."
msgstr "Nowe hasła muszą się zgadzać."
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr "Wyloguj się"
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr "Nikt"
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "Tylko znajomi"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "Wszyscy"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "Awatar"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr "Widoczność profilu"
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "Zaktualizuj profil"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr "Dane konta"
#: snikket_web/user.py:86
msgid "Upload"
msgstr "Prześlij"
#: snikket_web/user.py:111
msgid "Incorrect password."
msgstr "Nieprawidłowe hasło."
#: snikket_web/user.py:103
#: snikket_web/user.py:115
msgid "Password changed"
msgstr "Hasło zostało zmienione"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
@@ -330,13 +369,17 @@ msgstr ""
"Wybrany awatar jest zbyt duży. Awatary o większych rozmiarach możesz ustawić "
"korzystając z aplikacji."
#: snikket_web/user.py:159
#: snikket_web/user.py:170
msgid "Profile updated"
msgstr "Zaktualizowano profil"
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
msgstr "Błąd"
#: snikket_web/user.py:184
msgid "Export"
msgstr "Eksportuj"
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr "Obecnie nie masz danych konta, które można wyeksportować."
#: snikket_web/templates/_footer.html:4
#, python-format
@@ -429,7 +472,7 @@ msgstr ""
msgid "Software Versions"
msgstr "Wersje oprogramowania"
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "Wróć do strony głównej"
@@ -545,6 +588,45 @@ msgstr "Surowy zrzut debugowania"
msgid "Copy complete output"
msgstr "Skopiuj całą zawartość"
#: snikket_web/templates/admin_delete_circle.html:4
#, python-format
msgid "Delete circle %(circle_name)s"
msgstr "Usuń krąg %(circle_name)s"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "Usuń krąg"
#: snikket_web/templates/admin_delete_circle.html:8
msgid "Are you sure you want to delete the following circle?"
msgstr "Czy na pewno chcesz usunąć ten krąg?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Uwaga"
#: snikket_web/templates/admin_delete_circle.html:14
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
"Krąg oraz jego dane zostaną trwale i natychmiastowo usunięte po naciśnięciu "
"poniższego przycisku. <strong>Nie będzie można tego cofnąć!</strong>"
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "Wstecz"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -559,10 +641,6 @@ msgstr "Usuń użytkownika"
msgid "Are you sure you want to delete the following user?"
msgstr "Czy na pewno chcesz usunąć tego użytkownika?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Uwaga"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -573,14 +651,6 @@ msgstr ""
"usunięte po naciśnięciu poniższego przycisku. <strong>Nie będzie można tego "
"cofnąć!</strong>"
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "Wstecz"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr "To twój główny krąg"
@@ -615,10 +685,6 @@ msgstr "Ten krąg nie jest powiązany z żadnym czatem grupowym."
msgid "Return to circle list"
msgstr "Wróć do listy kręgów"
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "Usuń krąg"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr "Usunięcie kręgu nie usunie z serwera jego użytkowników."
@@ -932,6 +998,7 @@ msgstr "Obciążenie systemu (dla ostatnich 5 minut)"
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr "nieznane"
@@ -977,14 +1044,18 @@ msgid "Snikket server status"
msgstr "Status serwera Snikket"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr "Miejsce wykorzystane przez przesłane pliki"
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr "Podłączone urządzenia"
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr "Wiadomość globalna"
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
@@ -1104,8 +1175,8 @@ msgstr "Aplikacja jest już zainstalowana?"
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr "Otwórz aplikację"
@@ -1172,7 +1243,6 @@ msgid "You can now log in using your new password."
msgstr "Możesz się zalogować z wykorzystaniem twojego nowego hasła."
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr "Możesz teraz bezpiecznie zamknąć tę stronę."
@@ -1208,7 +1278,6 @@ msgstr ""
"przycisku Skanowania, który znajduje się u góry."
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1266,6 +1335,44 @@ msgstr ""
"Możesz teraz skonfigurować swojego starszego klienta XMPP za pomocą "
"powyższego adresu i hasła, które podałeś podczas rejestracji."
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
"Możesz bezpiecznie zamknąć tę stronę lub zalogować się do Portalu "
"Użytkownika Snikket, aby <a href=\"%(login_url)s\">zarządzać swoim kontem</"
"a>."
#: snikket_web/templates/invite_success.html:21
msgid "Import successful"
msgstr "Import zakończony sukcesem"
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr "Gratulacje! Dane twojego konta zostały prawidłowo zaimportowane."
#: snikket_web/templates/invite_success.html:26
msgid "Moving to Snikket?"
msgstr "Przenosisz się na Snikket?"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
"Jeśli przenosisz się z innego serwera Snikket lub kompatybilnej usługi XMPP, "
"możesz opcjonalnie zaimportować dane (kontakty, informacje o profilu, itp.) "
"ze swojego poprzedniego konta. Gdy wyeksportujesz dane z poprzedniej usługi, "
"możesz je przesłać za pomocą poniższego formularza."
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr "Prześlij dane konta"
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1314,7 +1421,7 @@ msgid "Get it on Google Play"
msgstr "Pobierz w Google Play"
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr "Pobierz w App Store"
@@ -1351,11 +1458,11 @@ msgid "Scan invite code"
msgstr "Zeskanuj kod zaproszenia"
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr "Zamknij"
@@ -1368,34 +1475,11 @@ msgstr ""
"poniższy kod aparatem. Możesz również skorzystać ze skanera kodów QR lub "
"samej aplikacji Snikket."
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr "Używając skanera kodów QR"
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr "Używając aplikacji Snikket"
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
"Użyj skanera <em>kodów QR</em> na swoim urządzeniu mobilnym, by zeskanować "
"poniższy kod:"
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
"Zainstaluj aplikację Snikket na swoim urządzeniu mobilnym, otwórz ją, "
"następnie wciśnij przycisk \"Skanuj\" u góry."
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr "Zainstaluj na iOS"
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
@@ -1403,14 +1487,14 @@ msgstr ""
"Po pobraniu aplikacji Snikket z App Store musisz wrócić do tego linku z "
"zaproszeniem, następnie kliknąć \"Otwórz aplikację\", aby kontynuować."
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr ""
"Najpierw pobierz aplikację Snikket z App Store za pomocą poniższego "
"przycisku:"
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
@@ -1418,12 +1502,12 @@ msgstr ""
"Po zakończeniu instalacji możesz wrócić do tej strony i kliknąć przycisk "
"\"Otwórz aplikację\", aby kontynuować:"
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr "Zainstaluj przez F-Droid"
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
@@ -1432,7 +1516,7 @@ msgstr ""
"linku z zaproszeniem, następnie kliknąć \"Otwórz aplikację\", aby "
"kontynuować."
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr ""
"Najpierw zainstaluj aplikację Snikket z F-Droid, korzystając z poniższego "
@@ -1503,16 +1587,21 @@ msgstr "Twój adres XMPP"
msgid "Edit profile"
msgstr "Edytuj profil"
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
msgid "Manage your data"
msgstr "Zarządzaj danymi konta"
#: snikket_web/templates/user_home.html:39
msgid "Your Snikket"
msgstr "Twój Snikket"
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
msgid "Manage users, invitations and circles of your Snikket service."
msgstr ""
"Zarządzaj użytkownikami, zaproszeniami oraz kręgami na tym serwerze Snikket."
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
msgid "Admin panel"
msgstr "Panel administracyjny"
@@ -1528,6 +1617,18 @@ msgstr ""
"Kliknij poniżej, aby wylogować się z portalu. Nie wpłynie to na pozostałe "
"podłączone urządzenia."
#: snikket_web/templates/user_manage_data.html:8
msgid "Export account"
msgstr "Wyeksportuj swoje dane"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr ""
"Pobierz dane swojego konta jako plik w celu backupu lub przeniesienia konta "
"na inną usługę."
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr "Zmień swoje hasło"
@@ -1568,6 +1669,26 @@ msgstr ""
"Ta sekcja pozwoli ci na zarządzenie widocznością informacji o twoim profilu "
"przez innych, jak awatar lub pseudonim."
#~ msgid "Using a QR code scanner"
#~ msgstr "Używając skanera kodów QR"
#~ msgid "Using the Snikket app"
#~ msgstr "Używając aplikacji Snikket"
#~ msgid ""
#~ "Use a <em>QR code</em> scanner on your mobile device to scan the code "
#~ "below:"
#~ msgstr ""
#~ "Użyj skanera <em>kodów QR</em> na swoim urządzeniu mobilnym, by "
#~ "zeskanować poniższy kod:"
#~ msgid ""
#~ "Install the Snikket app on your mobile device, open it, and tap the "
#~ "'Scan' button at the top."
#~ msgstr ""
#~ "Zainstaluj aplikację Snikket na swoim urządzeniu mobilnym, otwórz ją, "
#~ "następnie wciśnij przycisk \"Skanuj\" u góry."
#~ msgid "Create password reset link for %(user_name)s"
#~ msgstr "Utwórz link resetowania hasła dla %(user_name)s"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2021-03-12 23:04+0000\n"
"Last-Translator: GodGoldfish <godgoldfish@pm.me>\n"
"Language-Team: Russian <https://i18n.sotecware.net/projects/snikket/web-"
@@ -21,342 +21,381 @@ msgstr ""
"X-Generator: Weblate 4.5.1\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr ""
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "Логин"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "Отображаемое имя"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr ""
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr ""
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr ""
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
#, fuzzy
#| msgid "Admin area"
msgid "Administrator"
msgstr "Административная зона"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
#, fuzzy
#| msgid "Update circle"
msgid "Update user"
msgstr "Обновить крук"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
#, fuzzy
#| msgid "Create password reset links or delete users."
msgid "Create password reset link"
msgstr "Создайте ссылки для сброса пароля или удалите пользователей."
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
msgid "Password reset link created"
msgstr "Ссылка на сброс пароля для %(user_name)s"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
#, fuzzy
#| msgid "Circle information"
msgid "User information updated."
msgstr "Информация о круге"
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "Удалить пользователя навсегда"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
msgid "User deleted"
msgstr "удалённый"
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
#, fuzzy
#| msgid "Password reset link created"
msgid "Password reset link not found"
msgstr "Ссылка на сброс пароля для %(user_name)s"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
msgid "Password reset link deleted"
msgstr "Создайте ссылки для сброса пароля или удалите пользователей"
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "Пригласить в круг"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "Необходимо выбрать хотя бы один круг"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "Действителен в течении"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "Один час"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "Двенадцать часов"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "Один день"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "Одна неделя"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "Четыре недели"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "Вид приглашения"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr "Индивидуальный"
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr "Группа"
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "Новая ссылка на приглашение"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "Aннулировать"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
msgid "Invitation created"
msgstr "Вид приглашения"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
msgid "No such invitation exists"
msgstr "Новая ссылка на приглашение"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
msgid "Invitation revoked"
msgstr "Вид приглашения"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "Имя"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "Создать крук"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
msgid "Circle created"
msgstr "Имя круга"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "Выврать пользователя"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
msgid "Update circle"
msgstr "Обновить крук"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "Удалить круг навсегда"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "Добавить пользователя"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
msgid "No such circle exists"
msgstr "Нет кругов"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
msgid "Circle data updated"
msgstr "Имя круга"
#: snikket_web/admin.py:525
msgid "Circle deleted"
msgstr "удалённый"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
msgid "User added to circle"
msgstr "Пригласить в круг"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
msgid "User removed from circle"
msgstr "Удалить пользователя %(username)s из круга"
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "Удалить круг навсегда"
#: snikket_web/admin.py:574
msgid "Circle deleted"
msgstr "удалённый"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr ""
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr ""
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr ""
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr ""
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr ""
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "Основное"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
#: snikket_web/invite.py:114
msgid "Username"
msgstr "Имя пользователя"
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "Пароль"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
msgid "Confirm password"
msgstr "Повторите пароль"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
#, fuzzy
#| msgid "The passwords must match"
msgid "The passwords must match."
msgstr "Паролт должны совпадать"
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
msgid "Create account"
msgstr "Создать аккунт"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
#, fuzzy
#| msgid "That username is already taken"
msgid "That username is already taken."
msgstr "Это имя пользователя уже используется"
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
#, fuzzy
#| msgid "Registration was declined for unknown reasons"
msgid "Registration was declined for unknown reasons."
msgstr "Регистрация была отклонена по неизвестным причинам"
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
#, fuzzy
#| msgid "The username is not valid"
msgid "The username is not valid."
msgstr "Имя пользователя недействительно"
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "Изменить пароль"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr ""
#: snikket_web/invite.py:250
msgid "Import data"
msgstr ""
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr "Ошибка"
#: snikket_web/main.py:38
msgid "Address"
msgstr "Адрес"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "Войти"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
msgid "Invalid username or password."
msgstr "Неверное имя пользователя или пароль."
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr "Войти успешно!"
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "Текущий пароль"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "Новый пароль"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "Подтвердить новый пароль"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
#, fuzzy
#| msgid "The new passwords must match"
msgid "The new passwords must match."
msgstr "Новые пароли должны совпадать"
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr "Выйти"
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr "Никто"
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "Только друзья"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "Все"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "Аватар"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr "Видимость профиля"
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "Обновить профиль"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr ""
#: snikket_web/user.py:86
msgid "Upload"
msgstr ""
#: snikket_web/user.py:111
#, fuzzy
#| msgid "Incorrect password"
msgid "Incorrect password."
msgstr "Неправильный пароль"
#: snikket_web/user.py:103
#: snikket_web/user.py:115
msgid "Password changed"
msgstr "Смена пароля"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
msgstr ""
#: snikket_web/user.py:159
#: snikket_web/user.py:170
msgid "Profile updated"
msgstr "Профиль"
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
msgstr "Ошибка"
#: snikket_web/user.py:184
msgid "Export"
msgstr ""
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr ""
#: snikket_web/templates/_footer.html:4
#, python-format
@@ -450,7 +489,7 @@ msgstr ""
msgid "Software Versions"
msgstr "Версии программного обеспечения"
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "Назад на главную страницу"
@@ -567,6 +606,53 @@ msgstr "Исходная отладка переполнения"
msgid "Copy complete output"
msgstr "Копировать полный вывод"
#: snikket_web/templates/admin_delete_circle.html:4
#, fuzzy, python-format
#| msgid "Edit circle %(circle_name)s"
msgid "Delete circle %(circle_name)s"
msgstr "Редактировать круг %(circle_name)s"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "Удалить круг"
#: snikket_web/templates/admin_delete_circle.html:8
#, fuzzy
#| msgid "Are you sure you want to delete the following user?"
msgid "Are you sure you want to delete the following circle?"
msgstr "Вы уверены, что хотите удалить следующего пользователя?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Опасность"
#: snikket_web/templates/admin_delete_circle.html:14
#, fuzzy
#| msgid ""
#| "The user and their data will be deleted irrevocably, permanently and "
#| "immediately upon pushing the below button. <strong>There is no way back!</"
#| "strong>"
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
"Пользователь и его данные будут удалены безвозвратно, навсегда и сразу же "
"после нажатия нижней кнопки. <strong>Назад дороги нет!</strong>"
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "Вернуть"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -581,10 +667,6 @@ msgstr "Удалить пользователя"
msgid "Are you sure you want to delete the following user?"
msgstr "Вы уверены, что хотите удалить следующего пользователя?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Опасность"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -594,14 +676,6 @@ msgstr ""
"Пользователь и его данные будут удалены безвозвратно, навсегда и сразу же "
"после нажатия нижней кнопки. <strong>Назад дороги нет!</strong>"
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "Вернуть"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr "Это ваш основной круг"
@@ -635,10 +709,6 @@ msgstr "С этим кругом не связан ни один группов
msgid "Return to circle list"
msgstr ""
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "Удалить круг"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr "Удаление круга не приводит к удалению пользователей из круга."
@@ -954,6 +1024,7 @@ msgstr ""
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr ""
@@ -999,14 +1070,18 @@ msgid "Snikket server status"
msgstr "Сниккет веб-портал"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr ""
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr ""
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr ""
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
@@ -1128,8 +1203,8 @@ msgstr "Приложение уже установлено?"
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr "Откройте приложение"
@@ -1198,7 +1273,6 @@ msgid "You can now log in using your new password."
msgstr "Теперь вы можете войти в систему, используя новый пароль."
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr "Теперь вы можете безопасно закрыть эту страницу."
@@ -1233,7 +1307,6 @@ msgstr ""
"помощью приложения Snikket App, используя кнопку Сканировать в верхней части."
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1291,6 +1364,41 @@ msgstr ""
"Теперь вы можете настроить ваш старый XMPP клиент с указанным выше адресом и "
"паролем, который вы выбрали при регистрации."
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
#: snikket_web/templates/invite_success.html:21
#, fuzzy
#| msgid "Operation successful"
msgid "Import successful"
msgstr "Операция прошла успешно"
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr ""
#: snikket_web/templates/invite_success.html:26
#, fuzzy
#| msgid "Using the Snikket app"
msgid "Moving to Snikket?"
msgstr "Использование приложения Сниккет"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr ""
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1337,7 +1445,7 @@ msgid "Get it on Google Play"
msgstr "Получить его в Гугл Игры"
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr "Скачать в Магазин Приложений"
@@ -1374,11 +1482,11 @@ msgid "Scan invite code"
msgstr "Сканировать код приглашения"
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr "близко"
@@ -1391,62 +1499,39 @@ msgstr ""
"отсканировав код с помощью камеры. Вы можете использовать как приложение QR-"
"сканера, так и само приложение Сниккет."
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr "Используя сканер QR-кода"
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr "Использование приложения Сниккет"
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
"Используйте сканер <em>QR-кода</em> на вашем мобильном устройстве для "
"сканирования кода, приведенного ниже:"
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
"Установите приложение Сниккет на мобильное устройство, откройте его и "
"нажмите кнопку 'Сканировать' сверху."
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr ""
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
msgstr ""
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr ""
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
msgstr ""
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr ""
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
msgstr ""
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr ""
@@ -1516,16 +1601,23 @@ msgstr "Ваш адрес XMPP"
msgid "Edit profile"
msgstr "реадктировать профиль"
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
#, fuzzy
#| msgid "Manage users"
msgid "Manage your data"
msgstr "Управлять пользователями"
#: snikket_web/templates/user_home.html:39
msgid "Your Snikket"
msgstr "Ваш Сниккет"
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
msgid "Manage users, invitations and circles of your Snikket service."
msgstr ""
"Управляйте пользователями, приглашениями и кругами вашего сервиса Сниккет."
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
msgid "Admin panel"
msgstr "Административная панель"
@@ -1541,6 +1633,18 @@ msgstr ""
"Нажмите ниже, чтобы выйти из веб-портала. Это не влияет на другие "
"подключенные устройства."
#: snikket_web/templates/user_manage_data.html:8
#, fuzzy
#| msgid "Your account"
msgid "Export account"
msgstr "Ваш аккаунт"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr ""
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr "Изменить пароль"
@@ -1583,6 +1687,26 @@ msgstr ""
"Этот раздел позволяет вам контролировать, кто может видеть информацию вашего "
"профиля, например, аватар и ник."
#~ msgid "Using a QR code scanner"
#~ msgstr "Используя сканер QR-кода"
#~ msgid "Using the Snikket app"
#~ msgstr "Использование приложения Сниккет"
#~ msgid ""
#~ "Use a <em>QR code</em> scanner on your mobile device to scan the code "
#~ "below:"
#~ msgstr ""
#~ "Используйте сканер <em>QR-кода</em> на вашем мобильном устройстве для "
#~ "сканирования кода, приведенного ниже:"
#~ msgid ""
#~ "Install the Snikket app on your mobile device, open it, and tap the "
#~ "'Scan' button at the top."
#~ msgstr ""
#~ "Установите приложение Сниккет на мобильное устройство, откройте его и "
#~ "нажмите кнопку 'Сканировать' сверху."
#~ msgid "Create password reset link for %(user_name)s"
#~ msgstr "Создать ссылку сброса пароля для %(user_name)s"

View File

@@ -6,9 +6,9 @@
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-18 16:05+0200\n"
"PO-Revision-Date: 2021-08-01 14:00+0000\n"
"Report-Msgid-Bugs-To: translations@snikket.org\n"
"POT-Creation-Date: 2023-04-01 10:07+0200\n"
"PO-Revision-Date: 2023-04-02 15:17+0000\n"
"Last-Translator: Kim Alvefur <zash@zash.se>\n"
"Language-Team: Swedish <http://i18n.sotecware.net/projects/snikket/"
"web-portal/sv/>\n"
@@ -17,311 +17,350 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.7.2\n"
"X-Generator: Weblate 4.14.1\n"
"Generated-By: Babel 2.9.0\n"
#: snikket_web/admin.py:66
msgid "Limited"
msgstr "Begränsad"
#: snikket_web/admin.py:71 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_users.html:8
msgid "Login name"
msgstr "Inloggningsnamn"
#: snikket_web/admin.py:75 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_users.html:9 snikket_web/user.py:61
#: snikket_web/templates/admin_users.html:9 snikket_web/user.py:63
msgid "Display name"
msgstr "Visningsnamn"
#: snikket_web/admin.py:79 snikket_web/templates/admin_edit_user.html:32
#: snikket_web/admin.py:77 snikket_web/templates/admin_edit_user.html:32
msgid "Access Level"
msgstr "Användarnivåer"
#: snikket_web/admin.py:84
#: snikket_web/admin.py:79
msgid "Limited"
msgstr "Begränsad"
#: snikket_web/admin.py:80
msgid "Normal user"
msgstr "Vanlig användare"
#: snikket_web/admin.py:85
#: snikket_web/admin.py:81
msgid "Administrator"
msgstr "Administratör"
#: snikket_web/admin.py:90
#: snikket_web/admin.py:86
msgid "Update user"
msgstr "Uppdatera användare"
#: snikket_web/admin.py:94
#: snikket_web/admin.py:90
msgid "Create password reset link"
msgstr "Skapa länk för återställning av lösenord"
#: snikket_web/admin.py:112
#: snikket_web/admin.py:108
msgid "Password reset link created"
msgstr "Skapade länk för att återställa lösenord"
#: snikket_web/admin.py:127
#: snikket_web/admin.py:123
msgid "User information updated."
msgstr "Användarinformation uppdaterad."
#: snikket_web/admin.py:149
#: snikket_web/admin.py:145
msgid "Delete user permanently"
msgstr "Radera användare permanent"
#: snikket_web/admin.py:162
#: snikket_web/admin.py:158
msgid "User deleted"
msgstr "Användare raderad"
#: snikket_web/admin.py:200
#: snikket_web/admin.py:196
msgid "Password reset link not found"
msgstr "Länk för återställning av lösenord hittades inte"
#: snikket_web/admin.py:212
#: snikket_web/admin.py:208
msgid "Password reset link deleted"
msgstr "Länk för återställning av lösenord raderad"
#: snikket_web/admin.py:232
#: snikket_web/admin.py:228
msgid "Invite to circle"
msgstr "Bjud in till krets"
#: snikket_web/admin.py:238
#: snikket_web/admin.py:234
msgid "At least one circle must be selected"
msgstr "Minst en krets behöver väljas"
#: snikket_web/admin.py:243
#: snikket_web/admin.py:239
msgid "Valid for"
msgstr "Giltig i"
#: snikket_web/admin.py:245
#: snikket_web/admin.py:241
msgid "One hour"
msgstr "En timme"
#: snikket_web/admin.py:246
#: snikket_web/admin.py:242
msgid "Twelve hours"
msgstr "Tolv timmar"
#: snikket_web/admin.py:247
#: snikket_web/admin.py:243
msgid "One day"
msgstr "En dag"
#: snikket_web/admin.py:248
#: snikket_web/admin.py:244
msgid "One week"
msgstr "En vecka"
#: snikket_web/admin.py:249
#: snikket_web/admin.py:245
msgid "Four weeks"
msgstr "Fyra veckor"
#: snikket_web/admin.py:255 snikket_web/templates/admin_edit_invite.html:17
#: snikket_web/admin.py:251 snikket_web/templates/admin_edit_invite.html:17
msgid "Invitation type"
msgstr "Typ av inbjudan"
#: snikket_web/admin.py:257 snikket_web/templates/library.j2:116
#: snikket_web/admin.py:253 snikket_web/templates/library.j2:116
msgid "Individual"
msgstr "Individuell"
#: snikket_web/admin.py:258 snikket_web/templates/library.j2:114
#: snikket_web/admin.py:254 snikket_web/templates/library.j2:114
msgid "Group"
msgstr "Grupp"
#: snikket_web/admin.py:264
#: snikket_web/admin.py:260
msgid "New invitation link"
msgstr "Ny inbjudanslänk"
#: snikket_web/admin.py:326
#: snikket_web/admin.py:322
msgid "Revoke"
msgstr "Återkalla"
#: snikket_web/admin.py:350
#: snikket_web/admin.py:346
msgid "Invitation created"
msgstr "Inbjudan skapad"
#: snikket_web/admin.py:366
#: snikket_web/admin.py:362
msgid "No such invitation exists"
msgstr "Inbjudanslänken finns inte"
#: snikket_web/admin.py:381
#: snikket_web/admin.py:377
msgid "Invitation revoked"
msgstr "Inbjudan återkallad"
#: snikket_web/admin.py:398 snikket_web/admin.py:446
#: snikket_web/admin.py:394 snikket_web/admin.py:442
#: snikket_web/templates/admin_delete_circle.html:10
msgid "Name"
msgstr "Namn"
#: snikket_web/admin.py:403 snikket_web/templates/admin_circles.html:47
#: snikket_web/admin.py:399 snikket_web/templates/admin_circles.html:47
msgid "Create circle"
msgstr "Skapa krets"
#: snikket_web/admin.py:433
#: snikket_web/admin.py:429
msgid "Circle created"
msgstr "Krets skapad"
#: snikket_web/admin.py:451
#: snikket_web/admin.py:447
msgid "Select user"
msgstr "Välj användare"
#: snikket_web/admin.py:456
#: snikket_web/admin.py:452
msgid "Update circle"
msgstr "Uppdatera krets"
#: snikket_web/admin.py:460
msgid "Delete circle permanently"
msgstr "Radera krets permanent"
#: snikket_web/admin.py:466
#: snikket_web/admin.py:458
msgid "Add user"
msgstr "Lägg till användare"
#: snikket_web/admin.py:482
#: snikket_web/admin.py:474 snikket_web/admin.py:563
msgid "No such circle exists"
msgstr "Kretsen finns inte"
#: snikket_web/admin.py:519
#: snikket_web/admin.py:511
msgid "Circle data updated"
msgstr "Kretsen uppdaterades"
#: snikket_web/admin.py:525
msgid "Circle deleted"
msgstr "Krets raderad"
#: snikket_web/admin.py:536
#: snikket_web/admin.py:521
msgid "User added to circle"
msgstr "Användare tillagd i krets"
#: snikket_web/admin.py:545
#: snikket_web/admin.py:530
msgid "User removed from circle"
msgstr "Användaren %(username)s borttagen från krets"
#: snikket_web/admin.py:616
#: snikket_web/admin.py:547
msgid "Delete circle permanently"
msgstr "Radera krets permanent"
#: snikket_web/admin.py:574
msgid "Circle deleted"
msgstr "Krets raderad"
#: snikket_web/admin.py:640
msgid "Message contents"
msgstr "Meddelandeinnehåll"
#: snikket_web/admin.py:622
#: snikket_web/admin.py:646
msgid "Only send to online users"
msgstr "Skicka bara till användare som är online"
#: snikket_web/admin.py:626
#: snikket_web/admin.py:650
msgid "Post to all users"
msgstr "Skicka till alla användare"
#: snikket_web/admin.py:630
#: snikket_web/admin.py:654
msgid "Send preview to yourself"
msgstr "Skicka förhandsvisning till dig själv"
#: snikket_web/admin.py:652
#: snikket_web/admin.py:676
msgid "Announcement sent!"
msgstr "Tillkännagivande skickat!"
#: snikket_web/infra.py:51
#: snikket_web/infra.py:53
msgid "Main"
msgstr "Allmän"
#: snikket_web/invite.py:106
#: snikket_web/invite.py:35
msgid ""
"The account data you tried to import is too large to upload. Please contact "
"your Snikket operator."
msgstr ""
"Kontot du försökte importera är för stort för att ladda upp. Vänligen "
"kontakta din Snikket-operatör."
#: snikket_web/invite.py:114
msgid "Username"
msgstr "Användarnamn"
#: snikket_web/invite.py:110 snikket_web/invite.py:177 snikket_web/main.py:41
#: snikket_web/invite.py:118 snikket_web/invite.py:186 snikket_web/main.py:43
msgid "Password"
msgstr "Lösenord"
#: snikket_web/invite.py:114 snikket_web/invite.py:181
#: snikket_web/invite.py:122 snikket_web/invite.py:190
msgid "Confirm password"
msgstr "Bekräfta lösenord"
#: snikket_web/invite.py:118 snikket_web/invite.py:185
#: snikket_web/invite.py:126 snikket_web/invite.py:194
msgid "The passwords must match."
msgstr "Lösenorden måste vara identiska."
#: snikket_web/invite.py:123
#: snikket_web/invite.py:131
msgid "Create account"
msgstr "Skapa konto"
#: snikket_web/invite.py:150
#: snikket_web/invite.py:158
msgid "That username is already taken."
msgstr "Det användarnamnet är redan taget."
#: snikket_web/invite.py:154 snikket_web/invite.py:218
#: snikket_web/invite.py:162 snikket_web/invite.py:227
msgid "Registration was declined for unknown reasons."
msgstr "Registreringen nekades av okänd anledning."
#: snikket_web/invite.py:158
#: snikket_web/invite.py:166
msgid "The username is not valid."
msgstr "Användarnamnet är ogiltigt."
#: snikket_web/invite.py:190 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
msgid "Change password"
msgstr "Ändra lösenord"
#: snikket_web/main.py:36
#: snikket_web/invite.py:246
msgid "Account data file"
msgstr "Kontodatafil"
#: snikket_web/invite.py:250
msgid "Import data"
msgstr "Importera data"
#: snikket_web/invite.py:271
#, python-format
msgid ""
"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)."
msgstr ""
"Kontot du försökte importera är i ett okänt format. Vänligen ladda upp en "
"XML-fil i XEP-0227-format (angivet format: %(mimetype)s)."
#: snikket_web/invite.py:291 snikket_web/templates/unauth.html:18
#: snikket_web/user.py:178
msgid "Error"
msgstr "Fel"
#: snikket_web/main.py:38
msgid "Address"
msgstr "Adress"
#: snikket_web/main.py:46
#: snikket_web/main.py:48
msgid "Sign in"
msgstr "Logga in"
#: snikket_web/main.py:55
#: snikket_web/main.py:57
msgid "Invalid username or password."
msgstr "Ogiltigt användarnamn eller lösenord."
#: snikket_web/main.py:83
#: snikket_web/main.py:85
msgid "Login successful!"
msgstr "Inloggning lyckades!"
#: snikket_web/user.py:27
#: snikket_web/user.py:29
msgid "Current password"
msgstr "Nuvarande lösenord"
#: snikket_web/user.py:32
#: snikket_web/user.py:34
msgid "New password"
msgstr "Nytt lösenord"
#: snikket_web/user.py:37
#: snikket_web/user.py:39
msgid "Confirm new password"
msgstr "Bekräfta nytt lösenord"
#: snikket_web/user.py:41
#: snikket_web/user.py:43
msgid "The new passwords must match."
msgstr "De nya lösenorden måste vara identiska."
#: snikket_web/user.py:48
#: snikket_web/user.py:50
msgid "Sign out"
msgstr "Logga ut"
#: snikket_web/user.py:53
#: snikket_web/user.py:55
msgid "Nobody"
msgstr "Ingen"
#: snikket_web/user.py:54
#: snikket_web/user.py:56
msgid "Friends only"
msgstr "Endast vänner"
#: snikket_web/user.py:55
#: snikket_web/user.py:57
msgid "Everyone"
msgstr "Alla"
#: snikket_web/user.py:65
#: snikket_web/user.py:67
msgid "Avatar"
msgstr "Profilbild"
#: snikket_web/user.py:69
#: snikket_web/user.py:71
msgid "Profile visibility"
msgstr "Synlighet av profil"
#: snikket_web/user.py:74
#: snikket_web/user.py:76
msgid "Update profile"
msgstr "Uppdatera profil"
#: snikket_web/user.py:99
#: snikket_web/user.py:82
msgid "Account data"
msgstr "Kontodata"
#: snikket_web/user.py:86
msgid "Upload"
msgstr "Ladda upp"
#: snikket_web/user.py:111
msgid "Incorrect password."
msgstr "Fel lösenord."
#: snikket_web/user.py:103
#: snikket_web/user.py:115
msgid "Password changed"
msgstr "Lösenord ändrat"
#: snikket_web/user.py:111
#: snikket_web/user.py:123
msgid ""
"The chosen avatar is too big. To be able to upload larger avatars, please "
"use the app."
@@ -329,13 +368,17 @@ msgstr ""
"Den valda profilbilden är för stor. Vänligen använd appen för att kunna "
"välja större bilder."
#: snikket_web/user.py:159
#: snikket_web/user.py:170
msgid "Profile updated"
msgstr "Profilen uppdaterad"
#: snikket_web/templates/unauth.html:18 snikket_web/user.py:167
msgid "Error"
msgstr "Fel"
#: snikket_web/user.py:184
msgid "Export"
msgstr "Exportera"
#: snikket_web/user.py:202
msgid "You currently have no account data to export."
msgstr "Du har för närvarande inget data att exportera."
#: snikket_web/templates/_footer.html:4
#, python-format
@@ -427,7 +470,7 @@ msgstr ""
msgid "Software Versions"
msgstr "Mjukvaruversioner"
#: snikket_web/templates/about.html:29
#: snikket_web/templates/about.html:32
msgid "Back to the main page"
msgstr "Tillbaka till huvudsidan"
@@ -542,6 +585,46 @@ msgstr "Felsökningsdata"
msgid "Copy complete output"
msgstr "Kopiera allt"
#: snikket_web/templates/admin_delete_circle.html:4
#, python-format
msgid "Delete circle %(circle_name)s"
msgstr "Radera krets %(circle_name)s"
#: snikket_web/templates/admin_delete_circle.html:6
#: snikket_web/templates/admin_edit_circle.html:48
#: snikket_web/templates/admin_edit_circle.html:51
msgid "Delete circle"
msgstr "Radera krets"
#: snikket_web/templates/admin_delete_circle.html:8
msgid "Are you sure you want to delete the following circle?"
msgstr "Är du säker på att du vill radera denna krets?"
#: snikket_web/templates/admin_delete_circle.html:13
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Fara"
#: snikket_web/templates/admin_delete_circle.html:14
msgid ""
"The circle and the corresponding chat will be deleted, permanently and "
"immediately upon pushing the below button. <strong>There is no way back!</"
"strong>"
msgstr ""
"Om du trycker på knappen nedanför kommer kretsen och dess data raderas "
"direkt, permanent och skoningslöst. <strong>Därefter finns ingen "
"återvändo!</strong>"
#: snikket_web/templates/admin_delete_circle.html:17
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: 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_profile.html:32
msgid "Back"
msgstr "Tillbaka"
#: snikket_web/templates/admin_delete_user.html:4
#, python-format
msgid "Delete user %(user_name)s"
@@ -556,10 +639,6 @@ msgstr "Radera användare"
msgid "Are you sure you want to delete the following user?"
msgstr "Är du säker på att du vill radera denna användare?"
#: snikket_web/templates/admin_delete_user.html:15
msgid "Danger"
msgstr "Fara"
#: snikket_web/templates/admin_delete_user.html:16
msgid ""
"The user and their data will be deleted irrevocably, permanently and "
@@ -570,14 +649,6 @@ msgstr ""
"direkt, permanent och skoningslöst. <strong>Därefter finns ingen återvändo!</"
"strong>"
#: snikket_web/templates/admin_delete_user.html:19
#: snikket_web/templates/admin_reset_user_password.html:25
#: snikket_web/templates/user_logout.html:10
#: snikket_web/templates/user_passwd.html:27
#: snikket_web/templates/user_profile.html:32
msgid "Back"
msgstr "Tillbaka"
#: snikket_web/templates/admin_edit_circle.html:14
msgid "This is your main circle"
msgstr "Detta är din primära krets"
@@ -610,10 +681,6 @@ msgstr "Denna krets har ingen tillhörande gruppchatt."
msgid "Return to circle list"
msgstr "Tillbaka till cirkellistan"
#: snikket_web/templates/admin_edit_circle.html:48
msgid "Delete circle"
msgstr "Radera krets"
#: snikket_web/templates/admin_edit_circle.html:49
msgid "Deleting a circle does not delete any users in the circle."
msgstr "Användare i en krets raderas inte när kretsen raderas."
@@ -922,6 +989,7 @@ msgstr "Systemlast (5 minuters medelvärde)"
#: snikket_web/templates/admin_system.html:60
#: snikket_web/templates/admin_system.html:68
#: snikket_web/templates/admin_system.html:76
#: snikket_web/templates/admin_system.html:84
msgid "unknown"
msgstr "okänd"
@@ -967,14 +1035,18 @@ msgid "Snikket server status"
msgstr "Snikket-serverstatus"
#: snikket_web/templates/admin_system.html:71
msgid "Storage used by shared files"
msgstr "Utrymme används av delade filer"
#: snikket_web/templates/admin_system.html:79
msgid "Connected devices"
msgstr "Anslutna enheter"
#: snikket_web/templates/admin_system.html:82
#: snikket_web/templates/admin_system.html:90
msgid "Broadcast message"
msgstr "Tillkännagivande"
#: snikket_web/templates/admin_system.html:84
#: snikket_web/templates/admin_system.html:92
msgid ""
"This form allows you to send a message to all users currently online on your "
"Snikket server. Use it wisely."
@@ -1093,8 +1165,8 @@ msgstr "Appen redan installerad?"
#: snikket_web/templates/invite_register.html:16
#: snikket_web/templates/invite_reset_view.html:21
#: snikket_web/templates/invite_view.html:41
#: snikket_web/templates/invite_view.html:106
#: snikket_web/templates/invite_view.html:134
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:112
msgid "Open the app"
msgstr "Öppna appen"
@@ -1159,7 +1231,6 @@ msgid "You can now log in using your new password."
msgstr "Nu kan du logga in med ditt nya lösenord."
#: snikket_web/templates/invite_reset_success.html:12
#: snikket_web/templates/invite_success.html:18
msgid "You can now safely close this page."
msgstr "Du kan nu stänga den här sidan utan risk."
@@ -1194,7 +1265,6 @@ msgstr ""
"Scanna-knappen överst."
#: snikket_web/templates/invite_reset_view.html:26
#: snikket_web/templates/invite_view.html:77
msgid ""
"Your camera will turn on. Point it at the square code below until it is "
"within the highlighted square on your screen, and wait until the app "
@@ -1249,6 +1319,43 @@ msgstr ""
"Nu kan du sätta upp din generiska XMPP-klient med ovanstående adress och "
"lösenordet du angav vid registrering."
#: snikket_web/templates/invite_success.html:18
#, python-format
msgid ""
"You can now safely close this page, or log in to the web portal to <a href="
"\"%(login_url)s\">manage your account</a>."
msgstr ""
"Du kan nu stänga den här sidan utan risk, eller logga in till webbportalen "
"för att <a href=\"%(login_url)s\">hantera ditt konto</a>."
#: snikket_web/templates/invite_success.html:21
msgid "Import successful"
msgstr "Importen lyckades"
#: snikket_web/templates/invite_success.html:22
msgid "Congratulations! Your account data has been successfully imported."
msgstr "Grattulerar! Importen av ditt kontodata lyckades."
#: snikket_web/templates/invite_success.html:26
msgid "Moving to Snikket?"
msgstr "Flyttar till Snikket?"
#: snikket_web/templates/invite_success.html:27
msgid ""
"If you are moving from a different Snikket instance or another XMPP-"
"compatible service, you may optionally import the data (contacts, profile "
"information, etc.) from your previous account. When you have exported the "
"data from your previous account, upload it using the form below."
msgstr ""
"Om du flyttar från en annan Snikket-instans eller annan XMPP-kompatibel "
"tjänst så kan du om du vill importera data (kontakter, profilinformation, "
"etc.) från ditt förra konto. När du exporterat data från förra kontot, ladda "
"upp det med formuläret nedan."
#: snikket_web/templates/invite_success.html:30
msgid "Upload account data"
msgstr "Ladda upp kontodata"
#: snikket_web/templates/invite_view.html:6
#, python-format
msgid "Invite to %(site_name)s | Snikket"
@@ -1294,7 +1401,7 @@ msgid "Get it on Google Play"
msgstr "Hämta den på Google Play"
#: snikket_web/templates/invite_view.html:30
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:80
msgid "Download on the App Store"
msgstr "Hämta på App Store"
@@ -1330,11 +1437,11 @@ msgid "Scan invite code"
msgstr "Scanna inbjudningskoden"
#: snikket_web/templates/invite_view.html:55
#: snikket_web/templates/invite_view.html:84
#: snikket_web/templates/invite_view.html:96
#: snikket_web/templates/invite_view.html:112
#: snikket_web/templates/invite_view.html:124
#: snikket_web/templates/invite_view.html:140
#: snikket_web/templates/invite_view.html:62
#: snikket_web/templates/invite_view.html:74
#: snikket_web/templates/invite_view.html:90
#: snikket_web/templates/invite_view.html:102
#: snikket_web/templates/invite_view.html:118
msgid "Close"
msgstr "Stäng"
@@ -1347,33 +1454,11 @@ msgstr ""
"koden med din kamera. Du kan antingen använda en app för att scanna QR-koder "
"eller Snikket-appen själv."
#: snikket_web/templates/invite_view.html:63
msgid "Using a QR code scanner"
msgstr "Med en QR-kodsläsare"
#: snikket_web/templates/invite_view.html:65
msgid "Using the Snikket app"
msgstr "Med Snikket-appen"
#: snikket_web/templates/invite_view.html:70
msgid ""
"Use a <em>QR code</em> scanner on your mobile device to scan the code below:"
msgstr ""
"Scanna koden nedan med en <em>QR-kods</em> scanner på din mobila enhet:"
#: snikket_web/templates/invite_view.html:76
msgid ""
"Install the Snikket app on your mobile device, open it, and tap the 'Scan' "
"button at the top."
msgstr ""
"Installera Snikket-appen på din mobila enhet, öppna den, och tryck på "
"'Scanna'-knappen överst."
#: snikket_web/templates/invite_view.html:93
#: snikket_web/templates/invite_view.html:71
msgid "Install on iOS"
msgstr "Installera på iOS"
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:77
msgid ""
"After downloading Snikket from the App Store, you have to return to this "
"invite link and tap on \"Open the app\" to proceed."
@@ -1381,12 +1466,12 @@ msgstr ""
"Efter att ha laddat ner Snikket från App Store behöver du komma tillbaka "
"till den här inbjudan och klicka på \"Öppna appen\" för att fortsätta."
#: snikket_web/templates/invite_view.html:101
#: snikket_web/templates/invite_view.html:79
msgid "First download Snikket from the App Store using the button below:"
msgstr "Ladda först ner Snikket från App Store med knappen nedan:"
#: snikket_web/templates/invite_view.html:103
#: snikket_web/templates/invite_view.html:131
#: snikket_web/templates/invite_view.html:81
#: snikket_web/templates/invite_view.html:109
msgid ""
"After the installation is complete, you can return to this page and tap the "
"\"Open the app\" button to continue with the setup:"
@@ -1394,12 +1479,12 @@ msgstr ""
"Efter att installationen är färdig behöver du komma tillbaka till den här "
"inbjudan och klicka på \"Öppna appen\" för att fortsätta:"
#: snikket_web/templates/invite_view.html:121
#: snikket_web/templates/invite_view.html:130
#: snikket_web/templates/invite_view.html:99
#: snikket_web/templates/invite_view.html:108
msgid "Install via F-Droid"
msgstr "Installera via F-Droid"
#: snikket_web/templates/invite_view.html:127
#: snikket_web/templates/invite_view.html:105
msgid ""
"After installing Snikket via F-Droid, you have to return to this invite link "
"and tap on \"Open the app\" to proceed."
@@ -1407,7 +1492,7 @@ msgstr ""
"Efter att ha installerat Snikket via F-Droid behöver du komma tillbaka till "
"den här inbjudan och klicka på \"Öppna appen\" för att fortsätta."
#: snikket_web/templates/invite_view.html:129
#: snikket_web/templates/invite_view.html:107
msgid "First install Snikket from F-Droid using the button below:"
msgstr "Installera först Snikket från F-Droid med knappen nedan:"
@@ -1475,15 +1560,20 @@ msgstr "Din XMPP-adress"
msgid "Edit profile"
msgstr "Redigera profil"
#: snikket_web/templates/user_home.html:38
#: snikket_web/templates/user_home.html:33
#: snikket_web/templates/user_manage_data.html:4
msgid "Manage your data"
msgstr "Hantera ditt data"
#: snikket_web/templates/user_home.html:39
msgid "Your Snikket"
msgstr "Ditt Snikket"
#: snikket_web/templates/user_home.html:40
#: snikket_web/templates/user_home.html:41
msgid "Manage users, invitations and circles of your Snikket service."
msgstr "Hantera användare, inbjudningar och kretsar i din Snikket-tjänst."
#: snikket_web/templates/user_home.html:42
#: snikket_web/templates/user_home.html:43
msgid "Admin panel"
msgstr "Administrationspanel"
@@ -1499,6 +1589,18 @@ msgstr ""
"Klicka nedanför för att logga ut dig ur webbportalen. Detta påverkar inte "
"några av dina anslutna enheter."
#: snikket_web/templates/user_manage_data.html:8
msgid "Export account"
msgstr "Exportera konto"
#: snikket_web/templates/user_manage_data.html:9
msgid ""
"Download your account data as a file for backup purposes or to move your "
"account to another service."
msgstr ""
"Ladda ner ditt kontodata som en fil att ha som säkerhetskopia eller om du "
"vill flytta ditt konto till en annan tjänst."
#: snikket_web/templates/user_passwd.html:5
msgid "Change your password"
msgstr "Ändra ditt lösenord"
@@ -1541,6 +1643,25 @@ msgstr ""
"Den här avdelningen låter dig hantera vilka som kan se din profil, såsom din "
"profilbild och visningsnamn."
#~ msgid "Using a QR code scanner"
#~ msgstr "Med en QR-kodsläsare"
#~ msgid "Using the Snikket app"
#~ msgstr "Med Snikket-appen"
#~ msgid ""
#~ "Use a <em>QR code</em> scanner on your mobile device to scan the code "
#~ "below:"
#~ msgstr ""
#~ "Scanna koden nedan med en <em>QR-kods</em> scanner på din mobila enhet:"
#~ msgid ""
#~ "Install the Snikket app on your mobile device, open it, and tap the "
#~ "'Scan' button at the top."
#~ msgstr ""
#~ "Installera Snikket-appen på din mobila enhet, öppna den, och tryck på "
#~ "'Scanna'-knappen överst."
#~ msgid "Create password reset link for %(user_name)s"
#~ msgstr "Skapa länk för att återställa lösenord för %(user_name)s"

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,11 @@
import asyncio
import typing
import urllib
import quart.flask_patch
from quart import (
Blueprint,
Response,
render_template,
request,
redirect,
@@ -11,7 +13,7 @@ from quart import (
flash,
current_app,
)
import quart.exceptions
import werkzeug.exceptions
import wtforms
@@ -57,7 +59,7 @@ _ACCESS_MODEL_CHOICES = [
class ProfileForm(BaseForm):
nickname = wtforms.TextField(
nickname = wtforms.StringField(
_l("Display name"),
)
@@ -75,6 +77,16 @@ class ProfileForm(BaseForm):
)
class ImportAccountDataForm(BaseForm):
account_data_file = wtforms.FileField(
_l("Account data")
)
action_upload = wtforms.SubmitField(
_l("Upload"),
)
@bp.route("/")
@client.require_session()
async def index() -> str:
@@ -84,7 +96,7 @@ async def index() -> str:
@bp.route('/passwd', methods=["GET", "POST"])
@client.require_session()
async def change_pw() -> typing.Union[str, quart.Response]:
async def change_pw() -> typing.Union[str, werkzeug.Response]:
form = ChangePasswordForm()
if form.validate_on_submit():
try:
@@ -92,8 +104,8 @@ async def change_pw() -> typing.Union[str, quart.Response]:
form.current_password.data,
form.new_password.data,
)
except (quart.exceptions.Unauthorized,
quart.exceptions.Forbidden):
except (werkzeug.exceptions.Unauthorized,
werkzeug.exceptions.Forbidden):
# server refused current password, set an appropriate error
form.current_password.errors.append(
_("Incorrect password."),
@@ -116,7 +128,7 @@ EAVATARTOOBIG = _l(
@bp.route("/profile", methods=["GET", "POST"])
@client.require_session()
async def profile() -> typing.Union[str, quart.Response]:
async def profile() -> typing.Union[str, werkzeug.Response]:
max_avatar_size = current_app.config["MAX_AVATAR_SIZE"]
form = ProfileForm()
@@ -138,7 +150,6 @@ async def profile() -> typing.Union[str, quart.Response]:
mimetype = file_info.mimetype
data = file_info.stream.read()
if len(data) > max_avatar_size:
print(len(data), max_avatar_size)
form.avatar.errors.append(EAVATARTOOBIG)
ok = False
elif len(data) > 0:
@@ -168,9 +179,49 @@ async def profile() -> typing.Union[str, quart.Response]:
avatar_too_big_warning=EAVATARTOOBIG)
class DataExportForm(BaseForm):
action_export = wtforms.SubmitField(
_l("Export")
)
@bp.route("/manage_data", methods=["GET", "POST"])
@client.require_session()
async def manage_data() -> typing.Union[str, quart.Response]:
form = DataExportForm()
if form.validate_on_submit():
user_info = await client.get_user_info()
# The UTF-8 version of the filename needs to be percent-encoded
encoded_address = urllib.parse.quote(
user_info["address"].encode(encoding='utf-8', errors='strict')
)
account_data = await client.export_account_data()
if account_data is None:
await flash(
_("You currently have no account data to export."),
"alert"
)
else:
return Response(account_data,
mimetype="application/xml",
headers={
# We provide the UTF-8 filename, but the ASCII
# one will be used as a fallback for legacy
# browsers (RFC 5987)
"Content-Disposition": (
'attachment; filename="account-data.xml"; '
'filename*="UTF-8\'\'account-data-{}.xml"'
).format(encoded_address)
})
return await render_template("user_manage_data.html",
form=form,
)
@bp.route("/logout", methods=["GET", "POST"])
@client.require_session()
async def logout() -> typing.Union[quart.Response, str]:
async def logout() -> typing.Union[werkzeug.Response, str]:
form = LogoutForm()
if form.validate_on_submit():
await client.logout()

View File

@@ -4,7 +4,7 @@ import typing
import xml.etree.ElementTree as ET
from quart import abort
import quart.exceptions
import werkzeug.exceptions
TAG_XMPP_ERROR = "error"
@@ -239,7 +239,7 @@ def extract_pubsub_item_get_reply(
) -> typing.Optional[ET.Element]:
try:
pubsub = extract_iq_reply(iq_tree, TAG_PUBSUB)
except quart.exceptions.NotFound:
except werkzeug.exceptions.NotFound:
return None
if pubsub is None:

View File

@@ -6,6 +6,9 @@ action/logout:logout
action/login:login
action/exit_to_app:exit_to_app
action/lock:lock
action/lock_open:lock_open
action/restore_from_trash:restore_from_trash
communication/import_export:import_export
communication/qr_code:qrcode
communication/vpn_key:passwd
communication/rss_feed:broadcast
@@ -15,6 +18,9 @@ content/remove_circle_outline:remove
content/content_copy:copy
content/link_off:remove_link
content/send:send
file/file_download:download
file/file_upload:upload
file/folder:folder
navigation/arrow_back:back
navigation/arrow_forward:forward
navigation/cancel:cancel

6
tools/import-icons.sh Normal file → Executable file
View File

@@ -9,9 +9,9 @@ set -euo pipefail
# FLAVOR one of '', 'round', 'sharp', 'outlined', 'twoshade'
# SVGOUT path to the newly created SVG file
root="$1/src"
iconlist_file="$2"
flavor="$3"
output_file="$4"
iconlist_file="${2-tools/icons.list}"
flavor="${3-round}"
output_file="${4-snikket_web/static/img/icons.svg}"
printf '<svg aria-hidden="true" style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">\n<defs>\n' > "$output_file"
printf '<!-- These icons are sourced from Googles Material Icons set,\nlicensed under the terms of the Apache 2.0 License -->\n' >> "$output_file"