diff --git a/data/usr/lib/systemd/system/plinth.service b/data/usr/lib/systemd/system/plinth.service index 85a6abda7..3133e2c61 100644 --- a/data/usr/lib/systemd/system/plinth.service +++ b/data/usr/lib/systemd/system/plinth.service @@ -17,8 +17,6 @@ RestartSec=5 ExecReload=/bin/kill -HUP $MAINPID User=plinth Group=plinth -StandardOutput=null -StandardError=null NotifyAccess=main # Uploaded files in /var/tmp/ are shared with FreedomBox privileged service by # joining namespaces. diff --git a/debian/changelog b/debian/changelog index a737aa44a..5cc17a013 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,32 @@ +freedombox (26.6) unstable; urgency=medium + + [ Coucouf ] + * Translated using Weblate (French) + + [ Dietmar ] + * Translated using Weblate (Italian) + * Translated using Weblate (German) + + [ Pierfrancesco Passerini ] + * Translated using Weblate (Italian) + + [ bsurajpatra ] + * Translated using Weblate (Hindi) + + [ Sunil Mohan Adapa ] + * service: Capture stdout/stderr when running as systemd unit + * views: Add a decorator to handle exceptions in JSON views + * d/control: Add fido2 library as dependency + * users: Add support for registering, editing, and deleting passkeys + * users: Add support for logging in with passkeys + * users: Add link to guide on passkeys + + [ James Valleroy ] + * locale: Update translation strings + * doc: Fetch latest manual + + -- James Valleroy Mon, 06 Apr 2026 20:41:35 -0400 + freedombox (26.5.1~bpo13+1) trixie-backports; urgency=medium * Rebuild for trixie-backports. diff --git a/debian/control b/debian/control index 7ddf1a167..2ca205254 100644 --- a/debian/control +++ b/debian/control @@ -37,6 +37,7 @@ Build-Depends: python3-django-ipware , python3-django-oauth-toolkit , python3-django-stronghold , + python3-fido2 , python3-gi, python3-markupsafe, python3-mypy , @@ -110,6 +111,7 @@ Depends: python3-django-ipware, python3-django-oauth-toolkit, python3-django-stronghold, + python3-fido2, python3-gi, python3-markupsafe, python3-pampy, diff --git a/doc/manual/en/Passkeys.raw.wiki b/doc/manual/en/Passkeys.raw.wiki new file mode 100644 index 000000000..ecc6f1612 --- /dev/null +++ b/doc/manual/en/Passkeys.raw.wiki @@ -0,0 +1,117 @@ +#language en + +##TAG:TRANSLATION-HEADER-START +~- [[FreedomBox/Guide/Passkeys|English]] - [[DebianWiki/EditorGuide#translation|(+)]] -~ +##TAG:TRANSLATION-HEADER-END + +<> + +## BEGIN_INCLUDE + +== Use Passkeys to Improve Login Security == + +{{{#!wiki tip +Passkeys are strongly recommended over passwords. +}}} + +'''Available since''': !FreedomBox 26.6 + +!FreedomBox allows users to login to their account with passkeys. Passkeys are way to verify user's identity using digital signatures. They are a more secure alternative to passwords. Secret information is kept with the user on their phone, laptop, or a hardware token and unlocked using a PIN, fingerprint, or face ID. No secrets are stored on the server. The server knows only the public information that can be used to verify user's signatures. + +=== How do passkeys work? === + +After the user logs into their account, one or more passkeys can be added to the account from the 'Manage Passkeys' page. At the time of adding passkeys, the passkey hardware (or authenticator), will generate a public and private key pair that is tied to the domain and user account. The private key is kept in the hardware and public key is provided to the server. The server stores the public key along with user account. Later when a user is trying to log in to their account, the server sends a long randomly generated string to the authenticator called the challenge. The hardware digitally signs the challenge using the private key and sends it to the server. The server is able to verify that the signature is made by the holder of private key by just using the public key that it has (this is a feature of public/private key pairs). Once verified, the server logs into the user account associated with that public key. + +During this process, the browser acts as a trusted intermediary between the passkey hardware and the server. It ensures that the user is verified by providing PIN, fingerprint, face ID, etc. It also ensures that a passkey is only used with the domain it is meant for. + +=== Better security === + +Passkeys provide better security than passwords: + + * '''Multi-factor authentication''': During registration of a passkey and during login, !FreedomBox requests that the browser verify the user. This means the user will need to unlock the authenticator device by providing a PIN, fingerprint, face ID, etc. This acts as one of the authentication factors: "something you know" or "something your are". Another authentication factor is "something that you have": the hardware that stores your passkey (such as Solokey, Nitrokey, or Yubikey) or a phone. Together, this is similar to using a password along with a second factor authentication. So, passkeys can replace two-factor authentication while being much more convenient and easier to use. + + * '''No reuse''': Passkeys are never reused. For each domain a separate passkey is generated and used. Browsers ensure that passkey for a domain is never used with another domain. Unlike reused passwords, when a website or a service is compromised, adversaries can't use that to gain access to your account in different website or service. This also prevents phishing attacks were adversarial websites pretend to be legitimate ones. + + * '''No secrets on the server''': The website allowing use of passkeys for login does not store any secret information. It only stores the public key part of the passkey. If this information is obtained by an adversary, they will not be able to login to the website. Only the private key stored on the authenticator device can be used to login to the website (since only a private key can create signatures needed for login process). + + * '''No guessing''': The secret part of a passkey is much more impractical to guess compared to a password. There is no risk that someone will be able to guess your password and access your account. There is no risk that you might accidentally set a predictable password. + + * '''Convenience''': Users don't need to remember username, email, or a secret to login to a website. They don't need to receive OTP via text or email, use TOTP app, or confirm login using a mobile app. After clicking on the 'Login with passkey' button, they unlock their authenticator using a PIN, fingerprint, or face ID. Then they physically tap on the authenticator (if necessary). The user is then logged in. There are fewer things to remember. Even the PIN for a hardware authenticator is typically easier to remember than a password. This convenience encourages users to use this mechanism, ultimately leading to better security. + +=== Hardware Needed for Passkeys === + +{{{#!wiki tip +'''[[https://solokeys.com/|Solokeys]]''' are recommend for passkey storage by the !FreedomBox project. + + * The [[https://github.com/solokeys/solo2|firmware]] (the OS for the hardware) is free software. + * The [[https://github.com/solokeys/solo2-hw|hardware]] designs are free too. + * The Solokeys team and the !FreedomBox team collaborate. +}}} + +There are many ways to get started with passkeys: + + * '''Separate passkey hardware''': The recommended way to store passkeys is on a specific hardware key. In this setup, the private key part of the passkey never leaves the hardware device. They are also typically built such that it is hard for an adversary with physical access the device to extract passkey from it. Another advantage of these devices is that the hardware can be used with all your existing devices such as phones, laptops, and desktops. These devices interact with phones and desktops using USB, Bluetooth, or NFC tap. In case of NFC, the device works with proximity from the phone without additional power. When using a separate hardware, however, you must have a backup way of logging into your account in the event that you loose the hardware device. This could be an additional passkey hardware or a password. See the section on backup below. + + * '''Builtin passkey hardware''': When a separate hardware device is not available, specialized hardware, such as a TPM, built into the computer is preferable. This setup will still ensure that passkeys do not leave the hardware. One disadvantage of this approach is that the passkey only works with that device and you will need register each device you use separately. + + * '''Password managers''': As a last resort, one could use password managers that support passkeys and work with your browser or OS. Android, iOS, and Windows offer such password managers. Passkeys stored in password managers are typically synchronized to the cloud and a breach of that service/account could result in compromise of all your accounts. However, they work across multiple devices and you typically don't have to worry about loosing a single hardware device. + +=== Naming Your Passkey === + +In !FreedomBox, when a passkey is added to your account, it by default named as 'Key 1'. The next one will be named 'Key 2' and so on. However, it is good practice to name them such that you know which device they are stored on. For example, you can name them 'Key on Primary Solokey', 'Key on Android Phone', etc. If a device is lost, you can login to your account and remove that key from the list of passkeys associated with your account. + +=== Multiple Domains === + +Each passkey is strictly tied to a domain and never used for another domain. This necessary to ensure that a malicious domain does not impersonate a legitimate domain. Hence, if your !FreedomBox is configured with multiple domains, then the browser and hardware authenticator device will treat them as separate accounts for the purpose of authentication with passkeys. This means you need to register separate passkeys for each of your domains. + +For example, assume your !FreedomBox has two domains configured mydomain1.fbx.one and mydomain2.example. Visit mydomain1.fbx.one, log in to your account, and add a passkey. This passkey will be tied to this domain. When you are trying to log in, the passkey will work if you are accessing mydomain1.fbx.one but it won't work when accessing mydomain2.example. To make the second domain work, you need to add a second passkey while accessing your !FreedomBox with the domain name mydomain2.example. Two passkeys are then stored in your hardware token. First one will be tied to mydomain1.fbx.one and will only be used when accessing that domain. Second one will be tied to mydomain2.example and will only be used when accessing that domain. + +=== Multiple User Accounts === + +When you use a passkey hardware for multiple user accounts on the same !FreedomBox, separate passkeys will be created for each of the accounts. Each passkey will be assigned the username of the account it is tied to. This information is stored in the passkey as well as the server. During login, the browser will prompt to select the user account you want to log into. If only a single passkey exists for a given domain name, then the selection dialog is not shown and user will login to the account corresponding to the passkey. + +=== Backup for Passkey === + +In case the device storing your passkey is lost, you need alternate ways to login to you account: + + 1. You can register and maintain two passkeys on two separate devices. For example, your primary passkey could be on a Solokey hardware token and the second passkey could be on an Android phone or another Solokey hardware token. If one is lost, you can login with the other. This is the recommended approach. + + 1. !FreedomBox continues to support passwords even after passkeys are registered. So, if a passkey device is lost, you can login with a password. + + 1. If you forget your password and if your user account is not the only administrator account on the !FreedomBox, you can ask an administrator to reset your password. After that you can register a new passkey stored on a new device. + +=== Supported Platforms === + +Passkeys are based on WebAuthn, a standard published by World Wide Web Consortium. So, !FreedomBox's implementation is expected to work wherever passkeys work. It has been tested as follows: + +|| '''OS/Device''' || '''Browser''' || '''Authenticator''' || '''Result''' || +|| GNU/Linux || Firefox || Solokeys || Pass || +|| GNU/Linux || Firefox || Yubikey || Pass || +|| GNU/Linux || Chromium || Solokeys || Pass || +|| GNU/Linux || GNOME Web || - || Fail (Browser does not support Webauthn) || +|| Windows || Firefox || Windows Hello || Pass || +|| Windows || Firefox || Solokeys || Pass || +|| Windows || Firefox || Android Phone || Pass || +|| Windows || Chrome || Windows Hello || Pass || +|| Windows || Chrome || Solokeys || Pass || +|| Windows || Chrome || Android Phone || Pass || +|| Windows || Edge || Windows Hello || Pass || +|| Windows || Edge || Solokeys || Pass || +|| Windows || Edge || Android Phone || Pass || +|| Android || Firefox || Google Password Manager || Pass || +|| Android || Firefox || Solokeys USB || Fail (Touch is not detected after PIN entry) || +|| Android || Firefox || Solokeys NFC || Fail (Need to understand NFC setup) || +|| Android || Firefox || Another device || Untested || +|| Android || Chrome || Google Password Manager || Pass || +|| Android || Chrome || Solokeys USB || Fail (Touch is not detected after PIN entry) || +|| Android || Chrome || Solokeys NFC || Fail (Need to understand NFC setup) || +|| Android || Chrome || Another device || Untested || + +## END_INCLUDE + +Back to [[FreedomBox/Features|Features introduction]] or [[FreedomBox/Manual|manual]] pages. + +<> + +---- +CategoryFreedomBox diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index 9b7d8adfa..2f39cd261 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -8,6 +8,28 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 26.6 (2026-04-06) == + +=== Highlights === + + * users: Add support for logging in with passkeys + +=== Other Changes === + + * d/control: Add fido2 library as dependency + * locale: Update translations for French, German, Hindi, Italian + * service: Capture stdout/stderr when running as systemd unit + * users: Add link to guide on passkeys + * users: Add support for registering, editing, and deleting passkeys + * views: Add a decorator to handle exceptions in JSON views + +== FreedomBox 26.5.1 (2026-03-26) == + + * debian/control: Fix building with nocheck profile + * debian/copyright: Drop a removed file, correct path for another + * locale: Update translations for Albanian, Turkish + * web_server: Fix locating SVG icons on production setup + == FreedomBox 26.5 (2026-03-23) == === Highlights === diff --git a/doc/manual/en/Users.raw.wiki b/doc/manual/en/Users.raw.wiki index 37ff440ac..c29276ff1 100644 --- a/doc/manual/en/Users.raw.wiki +++ b/doc/manual/en/Users.raw.wiki @@ -8,25 +8,25 @@ == Users and Groups == -You can grant access to your !FreedomBox for other users. Provide the Username with a password and assign a group to it. Currently the groups +This app can be used to create, edit, and remove user accounts on !FreedomBox. Many apps with web interface in !FreedomBox support single sign-on using OpenID Connect. This means that if you are logged into !FreedomBox web interface, there is no need to login to the app separately. Other apps support using the !FreedomBox user accounts via LDAP. Finally, there are some apps that manage their own user accounts separate from the accounts you have in !FreedomBox. + +Access to an app is allowed if the user accessing the app is part of the app's group. You can grant access to apps in !FreedomBox for specific users by adding them to the following groups: * admin * bit-torrent * calibre - * ed2k * feed-reader * freedombox-share + * freedombox-ssh * git-access - * minidlna - * syncthing + * kiwix + * syncthing-access + * vpn * web-search * wiki -are supported. -The user will be able to log in to services that support single sign-on through LDAP, if they are in the appropriate group. +Users in the admin group will be able to log in to all services. They can also log in to the system through SSH and have administrative privileges (sudo). A user's groups can also be changed later. -Users in the admin group will be able to log in to all services. They can also log in to the system through SSH and have administrative privileges (sudo). - -A user's groups can also be changed later. +!FreedomBox supports logging in with passkeys. Passkeys are a secure alternative to passwords and are the recommended way of authenticating to !FreedomBox. Read more in the [[FreedomBox/Guide/Passkeys|FreedomBox's guide to passkeys]]. It is also possible to set an SSH public key which will allow this user to securely log in to the system without using a password. You may enter multiple keys, one on each line. Blank lines and lines starting with # will be ignored. diff --git a/doc/manual/en/freedombox-manual.raw.wiki b/doc/manual/en/freedombox-manual.raw.wiki index 3f00174dd..5d5306305 100644 --- a/doc/manual/en/freedombox-manual.raw.wiki +++ b/doc/manual/en/freedombox-manual.raw.wiki @@ -83,6 +83,7 @@ <> = Guides = +<> <> = Hardware = diff --git a/doc/manual/es/Manual.raw.wiki b/doc/manual/es/Manual.raw.wiki index 3f00174dd..5d5306305 100644 --- a/doc/manual/es/Manual.raw.wiki +++ b/doc/manual/es/Manual.raw.wiki @@ -83,6 +83,7 @@ <> = Guides = +<> <> = Hardware = diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index 9b7d8adfa..2f39cd261 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -8,6 +8,28 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 26.6 (2026-04-06) == + +=== Highlights === + + * users: Add support for logging in with passkeys + +=== Other Changes === + + * d/control: Add fido2 library as dependency + * locale: Update translations for French, German, Hindi, Italian + * service: Capture stdout/stderr when running as systemd unit + * users: Add link to guide on passkeys + * users: Add support for registering, editing, and deleting passkeys + * views: Add a decorator to handle exceptions in JSON views + +== FreedomBox 26.5.1 (2026-03-26) == + + * debian/control: Fix building with nocheck profile + * debian/copyright: Drop a removed file, correct path for another + * locale: Update translations for Albanian, Turkish + * web_server: Fix locating SVG icons on production setup + == FreedomBox 26.5 (2026-03-23) == === Highlights === diff --git a/plinth/__init__.py b/plinth/__init__.py index 6e2c1869a..0fd413a2e 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '26.5.1' +__version__ = '26.6' diff --git a/plinth/locale/ar/LC_MESSAGES/django.po b/plinth/locale/ar/LC_MESSAGES/django.po index 5d286ecf9..efc1b0bcd 100644 --- a/plinth/locale/ar/LC_MESSAGES/django.po +++ b/plinth/locale/ar/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2025-04-16 02:28+0000\n" "Last-Translator: MohammedSaalif <2300031323@kluniversity.in>\n" "Language-Team: Arabic ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +msgid "Delete passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9417,22 +9522,26 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +msgid "Manage passkeys" +msgstr "" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9667,15 +9776,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/ar_SA/LC_MESSAGES/django.po b/plinth/locale/ar_SA/LC_MESSAGES/django.po index e07e5b396..75dcefa44 100644 --- a/plinth/locale/ar_SA/LC_MESSAGES/django.po +++ b/plinth/locale/ar_SA/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2020-06-10 15:41+0000\n" "Last-Translator: aiman an \n" "Language-Team: Arabic (Saudi Arabia) ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +msgid "Delete passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9423,22 +9528,26 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +msgid "Manage passkeys" +msgstr "" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9673,15 +9782,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/be/LC_MESSAGES/django.po b/plinth/locale/be/LC_MESSAGES/django.po index da69bc311..fed71d905 100644 --- a/plinth/locale/be/LC_MESSAGES/django.po +++ b/plinth/locale/be/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -26,7 +26,7 @@ msgstr "" msgid "Container {container_name} is running" msgstr "" -#: plinth/context_processors.py:21 plinth/views.py:175 +#: plinth/context_processors.py:21 plinth/views.py:180 msgid "FreedomBox" msgstr "" @@ -317,6 +317,7 @@ msgstr "" #: plinth/modules/networks/templates/connection_show.html:76 #: plinth/modules/samba/templates/samba.html:66 #: plinth/modules/sharing/templates/sharing.html:33 +#: plinth/modules/users/templates/users_passkeys.html:92 msgid "Name" msgstr "" @@ -1949,6 +1950,7 @@ msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:27 #: plinth/modules/storage/templates/storage.html:29 +#: plinth/modules/users/templates/users_passkeys.html:96 msgid "Actions" msgstr "" @@ -3032,8 +3034,8 @@ msgstr "" msgid "Contribute" msgstr "" -#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:222 -#: plinth/templates/base.html:225 plinth/templates/help-menu.html:47 +#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:229 +#: plinth/templates/base.html:232 plinth/templates/help-menu.html:47 #: plinth/templates/help-menu.html:48 plinth/templates/index.html:96 msgid "About" msgstr "" @@ -3171,6 +3173,7 @@ msgstr "" #: plinth/modules/help/templates/help_contribute.html:43 #: plinth/modules/power/templates/power_restart.html:27 #: plinth/modules/power/templates/power_shutdown.html:26 +#: plinth/modules/users/templates/users_passkeys.html:77 #: plinth/templates/app-header.html:67 msgid "Learn more..." msgstr "" @@ -3575,7 +3578,7 @@ msgstr "" #: plinth/modules/janus/templates/janus_video_room.html:192 #: plinth/modules/jsxc/templates/jsxc_launch.html:117 -#: plinth/templates/base.html:282 +#: plinth/templates/base.html:289 msgid "JavaScript license information" msgstr "" @@ -5289,12 +5292,18 @@ msgstr "" #: plinth/modules/networks/templates/connections_fields.html:14 #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:64 +#: plinth/modules/users/templates/users_login.html:26 +#: plinth/modules/users/templates/users_passkeys.html:26 +#: plinth/modules/users/templates/users_passkeys.html:54 #: plinth/templates/messages.html:15 msgid "Error:" msgstr "" #: plinth/modules/networks/templates/connections_fields.html:21 -#: plinth/modules/users/templates/users_update.html:50 +#: plinth/modules/users/templates/users_login.html:33 +#: plinth/modules/users/templates/users_passkeys.html:33 +#: plinth/modules/users/templates/users_passkeys.html:140 +#: plinth/modules/users/templates/users_update.html:55 #: plinth/templates/messages.html:31 msgid "Close" msgstr "" @@ -6161,8 +6170,8 @@ msgstr "" msgid "Shutdown" msgstr "" -#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:187 -#: plinth/templates/base.html:188 +#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:194 +#: plinth/templates/base.html:195 msgid "Restart" msgstr "" @@ -8533,7 +8542,7 @@ msgstr "" #: plinth/modules/users/templates/users_create.html:19 #: plinth/modules/users/templates/users_list.html:16 #: plinth/modules/users/templates/users_list.html:18 -#: plinth/modules/users/views.py:109 +#: plinth/modules/users/views.py:134 msgid "Create User" msgstr "" @@ -8575,7 +8584,7 @@ msgid "Skip this step" msgstr "" #: plinth/modules/users/templates/users_list.html:12 -#: plinth/modules/users/views.py:127 +#: plinth/modules/users/views.py:152 msgid "Users" msgstr "" @@ -8584,77 +8593,171 @@ msgstr "" msgid "Edit user %(username)s" msgstr "" -#: plinth/modules/users/templates/users_login.html:23 +#: plinth/modules/users/templates/users_login.html:30 +msgid "Logging in with passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_login.html:41 +#: plinth/modules/users/templates/users_passkeys.html:41 +msgid "Browser does not support passkeys." +msgstr "" + +#: plinth/modules/users/templates/users_login.html:57 msgid "Login" msgstr "" +#: plinth/modules/users/templates/users_login.html:70 +#: plinth/modules/users/templates/users_login.html:72 +msgid "Log in with passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkey_edit.html:19 +msgid "Update Passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:30 +msgid "Adding passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:48 +#: plinth/modules/users/views.py:314 +msgid "Passkeys" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:57 +msgid "" +"Working with passkeys requires using browser's Javascript API. Please enable " +"Javascript support in your browser to continue." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:66 +msgid "" +"Passkeys are way to verify user's identity using digital signatures. They " +"are a more secure alternative to passwords. Secret information is kept with " +"the user on their phone, laptop, or a hardware token and unlocked using a " +"PIN, fingerprint, or face ID. No secrets are stored on the server. The " +"server knows only the public information that can used to verify user's " +"signatures." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:83 +#: plinth/modules/users/templates/users_passkeys.html:85 +msgid "Add passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:93 +msgid "For Domain" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:94 +msgid "Added" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:95 +msgid "Last Used" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:126 +msgid "No passkeys added to user account." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:135 +msgid "Delete passkey ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +msgid "Delete passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9356,22 +9459,26 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +msgid "Manage passkeys" +msgstr "" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9604,15 +9711,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index fbfef94a1..0fd98e575 100644 --- a/plinth/locale/bg/LC_MESSAGES/django.po +++ b/plinth/locale/bg/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2025-12-17 07:00+0000\n" "Last-Translator: 109247019824 " "<109247019824@users.noreply.hosted.weblate.org>\n" @@ -30,7 +30,7 @@ msgstr "Статичните настройки {etc_path} са правилно msgid "Container {container_name} is running" msgstr "Контейнерът {container_name} работи" -#: plinth/context_processors.py:21 plinth/views.py:175 +#: plinth/context_processors.py:21 plinth/views.py:180 msgid "FreedomBox" msgstr "FreedomBox" @@ -349,6 +349,7 @@ msgstr "Хранилище" #: plinth/modules/networks/templates/connection_show.html:76 #: plinth/modules/samba/templates/samba.html:66 #: plinth/modules/sharing/templates/sharing.html:33 +#: plinth/modules/users/templates/users_passkeys.html:92 msgid "Name" msgstr "Наименование" @@ -2077,6 +2078,7 @@ msgstr "Адрес по IP" #: plinth/modules/dynamicdns/templates/dynamicdns.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:27 #: plinth/modules/storage/templates/storage.html:29 +#: plinth/modules/users/templates/users_passkeys.html:96 msgid "Actions" msgstr "Действия" @@ -3209,8 +3211,8 @@ msgstr "Обратна връзка" msgid "Contribute" msgstr "Допринасяне" -#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:222 -#: plinth/templates/base.html:225 plinth/templates/help-menu.html:47 +#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:229 +#: plinth/templates/base.html:232 plinth/templates/help-menu.html:47 #: plinth/templates/help-menu.html:48 plinth/templates/index.html:96 msgid "About" msgstr "За проекта" @@ -3349,6 +3351,7 @@ msgstr "" #: plinth/modules/help/templates/help_contribute.html:43 #: plinth/modules/power/templates/power_restart.html:27 #: plinth/modules/power/templates/power_shutdown.html:26 +#: plinth/modules/users/templates/users_passkeys.html:77 #: plinth/templates/app-header.html:67 msgid "Learn more..." msgstr "Научете повече…" @@ -3758,7 +3761,7 @@ msgstr "" #: plinth/modules/janus/templates/janus_video_room.html:192 #: plinth/modules/jsxc/templates/jsxc_launch.html:117 -#: plinth/templates/base.html:282 +#: plinth/templates/base.html:289 msgid "JavaScript license information" msgstr "" @@ -5605,12 +5608,18 @@ msgstr "Редактиране на връзката" #: plinth/modules/networks/templates/connections_fields.html:14 #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:64 +#: plinth/modules/users/templates/users_login.html:26 +#: plinth/modules/users/templates/users_passkeys.html:26 +#: plinth/modules/users/templates/users_passkeys.html:54 #: plinth/templates/messages.html:15 msgid "Error:" msgstr "Грешка:" #: plinth/modules/networks/templates/connections_fields.html:21 -#: plinth/modules/users/templates/users_update.html:50 +#: plinth/modules/users/templates/users_login.html:33 +#: plinth/modules/users/templates/users_passkeys.html:33 +#: plinth/modules/users/templates/users_passkeys.html:140 +#: plinth/modules/users/templates/users_update.html:55 #: plinth/templates/messages.html:31 msgid "Close" msgstr "Затваряне" @@ -6491,8 +6500,8 @@ msgstr "Рестартиране" msgid "Shutdown" msgstr "Изключване" -#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:187 -#: plinth/templates/base.html:188 +#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:194 +#: plinth/templates/base.html:195 msgid "Restart" msgstr "Рестартиране" @@ -9096,7 +9105,7 @@ msgstr "Запазване на парола" #: plinth/modules/users/templates/users_create.html:19 #: plinth/modules/users/templates/users_list.html:16 #: plinth/modules/users/templates/users_list.html:18 -#: plinth/modules/users/views.py:109 +#: plinth/modules/users/views.py:134 msgid "Create User" msgstr "Създаване на потребител" @@ -9147,7 +9156,7 @@ msgid "Skip this step" msgstr "Пропускане на стъпката" #: plinth/modules/users/templates/users_list.html:12 -#: plinth/modules/users/views.py:127 +#: plinth/modules/users/views.py:152 msgid "Users" msgstr "Поребители" @@ -9156,16 +9165,114 @@ msgstr "Поребители" msgid "Edit user %(username)s" msgstr "Промяна на потребителя %(username)s" -#: plinth/modules/users/templates/users_login.html:23 +#: plinth/modules/users/templates/users_login.html:30 +msgid "Logging in with passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_login.html:41 +#: plinth/modules/users/templates/users_passkeys.html:41 +#, fuzzy +#| msgid "This app does not support diagnostics" +msgid "Browser does not support passkeys." +msgstr "Приложението не поддържа дисгностика" + +#: plinth/modules/users/templates/users_login.html:57 msgid "Login" msgstr "Вход" +#: plinth/modules/users/templates/users_login.html:70 +#: plinth/modules/users/templates/users_login.html:72 +msgid "Log in with passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkey_edit.html:19 +#, fuzzy +#| msgid "Update setup" +msgid "Update Passkey" +msgstr "Обновяване на настройки" + +#: plinth/modules/users/templates/users_passkeys.html:30 +msgid "Adding passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:48 +#: plinth/modules/users/views.py:314 +msgid "Passkeys" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:57 +msgid "" +"Working with passkeys requires using browser's Javascript API. Please enable " +"Javascript support in your browser to continue." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:66 +msgid "" +"Passkeys are way to verify user's identity using digital signatures. They " +"are a more secure alternative to passwords. Secret information is kept with " +"the user on their phone, laptop, or a hardware token and unlocked using a " +"PIN, fingerprint, or face ID. No secrets are stored on the server. The " +"server knows only the public information that can used to verify user's " +"signatures." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:83 +#: plinth/modules/users/templates/users_passkeys.html:85 +#, fuzzy +#| msgid "Add Package" +msgid "Add passkey" +msgstr "Добавяне на пакет" + +#: plinth/modules/users/templates/users_passkeys.html:93 +#, fuzzy +#| msgid "Domain" +msgid "For Domain" +msgstr "Домейн" + +#: plinth/modules/users/templates/users_passkeys.html:94 +msgid "Added" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:95 +#, fuzzy +#| msgid "Last scanned: " +msgid "Last Used" +msgstr "Последна проверка: " + +#: plinth/modules/users/templates/users_passkeys.html:126 +msgid "No passkeys added to user account." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:135 +msgid "Delete passkey ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Премахване на потребител" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Отказ" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Променяне на потребителя %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9174,19 +9281,19 @@ msgstr "" "За да промените паролата, използвайте формуляра за промяна на парола." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Запазване на промените" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" "Потвърждавате ли премахването на потребителя %(username)s и всички " "негови файлове?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -9195,45 +9302,57 @@ msgstr "" "домашната му папка. Ако желаете тези файлове да бъдат запазени, вместо да " "премахвате профила го изключете." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Премахване на файловете на %(username)s" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Отказ" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Изходът е успешен." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Потребителят %(username)s е създаден." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Потребителят %(username)s е променен." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Промяна на потребител" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "Потребителят %(username)s е премахнат." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Промяна на парола" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Паролата е променена." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A wiki file with the given name already exists." +msgid "Passkey with that identifier already exists." +msgstr "В енциклопедията съществува файл с такова име." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Промяна на потребител" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9952,22 +10071,28 @@ msgid " System" msgstr " Системни" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Управление на псевдоними" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Промяна на парола" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Изключване" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Изход" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Избор на език" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Вход" @@ -10206,15 +10331,15 @@ msgstr "" "Всички данни и настройки на приложението ще бъдат загубени. Приложението " "може да бъде инсталирано отново." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "Тук" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Настройките не са променени" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "преди премахване на {app_id}" diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index b293f3c79..b91298a59 100644 --- a/plinth/locale/bn/LC_MESSAGES/django.po +++ b/plinth/locale/bn/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2025-04-01 03:02+0000\n" "Last-Translator: MURALA SAI GANESH \n" "Language-Team: Bengali ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete" +msgid "Delete passkey" +msgstr "মুছো" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "বাতিল" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "বাতিল" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9438,22 +9545,28 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Enabled" +msgid "Manage passkeys" +msgstr "সক্রিয়" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9688,15 +9801,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "এখানে" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/ca/LC_MESSAGES/django.po b/plinth/locale/ca/LC_MESSAGES/django.po index 0f2f21280..be3e5b46b 100644 --- a/plinth/locale/ca/LC_MESSAGES/django.po +++ b/plinth/locale/ca/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2026-02-06 23:02+0000\n" "Last-Translator: kosagi \n" "Language-Team: Catalan ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete %(name)s" +msgid "Delete passkey" +msgstr "Esborrar %(name)s" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A library with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Ja existeix una biblioteca amb aquest nom." + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -10187,22 +10304,28 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Gestiona els alias" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -10437,15 +10560,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/cs/LC_MESSAGES/django.po b/plinth/locale/cs/LC_MESSAGES/django.po index b939af5d3..27caad3bc 100644 --- a/plinth/locale/cs/LC_MESSAGES/django.po +++ b/plinth/locale/cs/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2026-03-08 18:48+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Smazat uživatele" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Storno" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Upravit uživatele %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9789,17 +9896,17 @@ msgstr "" "Pro změnu hesla použijte formulář změna " "hesla ." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Uložit změny" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "Smazat uživatele %(username)s a všechny jeho soubory?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -9808,45 +9915,57 @@ msgstr "" "adresáře uživatele. Pokud si přejete tyto soubory zachovat, zakažte raději " "uživatelský účet." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Odstranit uživatele a soubory" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Storno" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Odhlášení proběhlo úspěšně." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Uživatel %(username)s vytvořen." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Uživatel %(username)s aktualizován." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Upravit uživatele" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "Uživatel %(username)s smazán." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Změnit heslo" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Heslo úspěšně změněno." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Sdílení s tímto názvem už existuje." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Upravit uživatele" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard je rychlý, moderní a bezpečný tunel VPN." @@ -10626,22 +10745,28 @@ msgid " System" msgstr " Systém" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Správa aliasů" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Změnit heslo" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Vypnout" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Odhlásit" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Vyberte jazyk" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Přihlásit" @@ -10895,15 +11020,15 @@ msgstr "" "Všechna data a konfigurace aplikace budou trvale ztraceny. Aplikaci lze " "nainstalovat znovu." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "Zde" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Nastavení se nezměnila" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "před odinstalací {app_id}" diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index 40d430b13..a39efea59 100644 --- a/plinth/locale/da/LC_MESSAGES/django.po +++ b/plinth/locale/da/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Danish ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete User" +msgid "Delete passkey" +msgstr "Slet Bruger" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Annuller" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Rediger Bruger %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9993,67 +10100,79 @@ msgstr "" "Brug siden til kodeordsændring for at " "ændre kodeord." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Gem Ændringer" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, fuzzy, python-format #| msgid "Delete user %(username)s permanently?" msgid "Delete user %(username)s and all the user's files?" msgstr "Slet bruger %(username)s permanent?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete files" msgid "Delete user and files" msgstr "Slet filer" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Annuller" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 #, fuzzy #| msgid "Password changed successfully." msgid "Logged out successfully." msgstr "Kodeord blev ændret." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Bruger %(username)s oprettet." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Bruger %(username)s opdateret." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Rediger Bruger" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "User %(username)s created." msgid "User %(username)s deleted." msgstr "Bruger %(username)s oprettet." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Ændr kodeord" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Kodeord blev ændret." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "This service already exists" +msgid "Passkey with that identifier already exists." +msgstr "Denne tjeneste eksisterer allerede" + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Rediger Bruger" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -10874,26 +10993,32 @@ msgid " System" msgstr " System" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Libraries" +msgid "Manage passkeys" +msgstr "Håndter samlinger" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Ændr kodeord" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 #, fuzzy #| msgid "Shut Down Now" msgid "Shut down" msgstr "Sluk Nu" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Log ud" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 #, fuzzy #| msgid "Language" msgid "Select language" msgstr "Sprog" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Log ind" @@ -11155,15 +11280,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Indstilling uændret" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index 08e801030..cbbf4b5a8 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" -"PO-Revision-Date: 2026-03-22 23:09+0000\n" -"Last-Translator: Ettore Atalan \n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" +"PO-Revision-Date: 2026-03-29 11:09+0000\n" +"Last-Translator: Dietmar \n" "Language-Team: German \n" "Language: de\n" @@ -31,7 +31,7 @@ msgstr "Statische Konfiguration {etc_path} ist richtig eingerichtet" msgid "Container {container_name} is running" msgstr "Container {container_name} wird ausgeführt" -#: plinth/context_processors.py:21 plinth/views.py:175 +#: plinth/context_processors.py:21 plinth/views.py:180 msgid "FreedomBox" msgstr "FreedomBox" @@ -172,7 +172,7 @@ msgstr "{box_name} Weboberfläche (Plinth)" #: plinth/modules/apache/__init__.py:129 msgid "Web app protected by FreedomBox" -msgstr "" +msgstr "Web-App geschützt durch FreedomBox" #: plinth/modules/apache/components.py:234 #, python-brace-format @@ -352,6 +352,7 @@ msgstr "Paketquelle" #: plinth/modules/networks/templates/connection_show.html:76 #: plinth/modules/samba/templates/samba.html:66 #: plinth/modules/sharing/templates/sharing.html:33 +#: plinth/modules/users/templates/users_passkeys.html:92 msgid "Name" msgstr "Name" @@ -415,10 +416,8 @@ msgid "Passphrase" msgstr "Passwort" #: plinth/modules/backups/forms.py:187 -#, fuzzy -#| msgid "Passphrase; Only needed when using encryption." msgid "Only needed when using encryption." -msgstr "Passphrase; Nur notwendig, wenn Verschlüsselung genutzt wird." +msgstr "Nur notwendig, wenn Verschlüsselung genutzt wird." #: plinth/modules/backups/forms.py:190 msgid "Confirm Passphrase" @@ -461,38 +460,31 @@ msgid "SSH Authentication Type" msgstr "SSH-Authentifizierungstyp" #: plinth/modules/backups/forms.py:256 -#, fuzzy -#| msgid "Authentication to remote server failed." msgid "Choose how to authenticate to the remote SSH server." -msgstr "Authentifizierung am Server fehlgeschlagen." +msgstr "" +"Wählen Sie aus, wie Sie sich beim entfernten SSH-Server authentifizieren " +"möchten." #: plinth/modules/backups/forms.py:258 -#, fuzzy -#| msgid "needs authentication" msgid "Key-based Authentication" -msgstr "benötigt Authentifizierung" +msgstr "Schlüsselbasierte Authentifizierung" #: plinth/modules/backups/forms.py:259 -#, fuzzy -#| msgid "Disable password authentication" msgid "Password-based Authentication" -msgstr "Passwortauthentifizierung deaktivieren" +msgstr "Passwortbasierte Authentifizierung" #: plinth/modules/backups/forms.py:261 msgid "SSH server password" msgstr "SSH-Server-Passwort" #: plinth/modules/backups/forms.py:262 -#, fuzzy -#| msgid "Disable password authentication" msgid "Required for password-based authentication." -msgstr "Passwortauthentifizierung deaktivieren" +msgstr "Erforderlich für die passwortbasierte Authentifizierung." #: plinth/modules/backups/forms.py:275 -#, fuzzy -#| msgid "Disable password authentication" msgid "SSH password is needed for password-based authentication." -msgstr "Passwortauthentifizierung deaktivieren" +msgstr "" +"Für die passwortbasierte Authentifizierung ist ein SSH-Passwort erforderlich." #: plinth/modules/backups/forms.py:292 msgid "Remote backup repository already exists." @@ -641,6 +633,9 @@ msgid "" "list on the remote machine for %(box_name)s to be able to connect to the " "remote machine:" msgstr "" +"Der folgende öffentliche Schlüssel des SSH-Clients muss zur Liste der " +"autorisierten Schlüssel auf dem Remote-Rechner hinzugefügt werden, damit " +"%(box_name)s eine Verbindung zum Remote-Rechner herstellen kann:" #: plinth/modules/backups/templates/backups_add_remote_repository.html:87 #, python-format @@ -649,6 +644,10 @@ msgid "" "successful, then the public key will be automatically added to the " "authorized keys list, so that future connections do not need the password." msgstr "" +"Der Dienst von %(box_name)s versucht, sich mit dem angegebenen Passwort " +"anzumelden. Gelingt dies, wird der öffentliche Schlüssel automatisch zur " +"Liste der autorisierten Schlüssel hinzugefügt, sodass für zukünftige " +"Verbindungen kein Passwort mehr erforderlich ist." #: plinth/modules/backups/templates/backups_add_remote_repository.html:132 #: plinth/modules/backups/templates/backups_upload.html:29 @@ -832,10 +831,8 @@ msgid "Authentication to remote server failed." msgstr "Authentifizierung am Server fehlgeschlagen." #: plinth/modules/backups/views.py:50 -#, fuzzy -#| msgid "Error establishing connection to server: {}" msgid "Error establishing connection to server: {} {} {}" -msgstr "Fehler beim Verbinden mit Server: {}" +msgstr "Fehler beim Verbinden mit Server: {} {} {}" #: plinth/modules/backups/views.py:82 msgid "Backup schedule updated." @@ -1485,14 +1482,7 @@ msgid "Webserver Home Page" msgstr "Webserver-Startseite" #: plinth/modules/config/forms.py:37 -#, fuzzy, python-brace-format -#| msgid "" -#| "Choose the default page that must be served when someone visits your " -#| "{box_name} on the web. A typical use case is to set your blog or wiki as " -#| "the home page when someone visits the domain name. Note that once the " -#| "home page is set to something other than {box_name} Service (Plinth), " -#| "your users must explicitly type /plinth or /freedombox to reach " -#| "{box_name} Service (Plinth)." +#, python-brace-format msgid "" "Choose the default page that must be served when someone visits your " "{box_name} on the web. A typical use case is to set your blog or wiki as the " @@ -1504,8 +1494,8 @@ msgstr "" "{box_name} im Web aufruft. Ein typischer Anwendungsfall ist ihren Blog oder " "Wiki als die Einstiegsseite einzustellen wenn jemand die Domain besucht. " "Beachten Sie, dass, wenn die Startseite auf etwas anderes als {box_name}-" -"Dienst (Plinth) eingestellt ist, die Benutzer explizit /plinth oder /" -"freedombox eingeben müssen um den {box_name}-Dienst (Plinth) zu erreichen." +"Dienst (Plinth) eingestellt ist, die Benutzer explizit /freedombox eingeben " +"müssen um den {box_name}-Dienst (Plinth) zu erreichen." #: plinth/modules/config/forms.py:48 msgid "Show advanced apps and features" @@ -2176,6 +2166,7 @@ msgstr "IP-Adresse" #: plinth/modules/dynamicdns/templates/dynamicdns.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:27 #: plinth/modules/storage/templates/storage.html:29 +#: plinth/modules/users/templates/users_passkeys.html:96 msgid "Actions" msgstr "Aktionen" @@ -2471,15 +2462,11 @@ msgstr "" "werden automatisch erstellt und verweisen auf den ersten Admin-Benutzer." #: plinth/modules/email/__init__.py:41 -#, fuzzy -#| msgid "" -#| "Roundcube app provides web " -#| "interface for users to access email." msgid "" "Roundcube app provides web " "interface for users to access email." msgstr "" -"Roundcube App bietet eine " +"Roundcube App bietet eine " "Weboberfläche für den Zugriff auf E-Mails." #: plinth/modules/email/__init__.py:43 @@ -3404,8 +3391,8 @@ msgstr "Feedback geben" msgid "Contribute" msgstr "Mitwirken" -#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:222 -#: plinth/templates/base.html:225 plinth/templates/help-menu.html:47 +#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:229 +#: plinth/templates/base.html:232 plinth/templates/help-menu.html:47 #: plinth/templates/help-menu.html:48 plinth/templates/index.html:96 msgid "About" msgstr "Info" @@ -3585,6 +3572,7 @@ msgstr "" #: plinth/modules/help/templates/help_contribute.html:43 #: plinth/modules/power/templates/power_restart.html:27 #: plinth/modules/power/templates/power_shutdown.html:26 +#: plinth/modules/users/templates/users_passkeys.html:77 #: plinth/templates/app-header.html:67 msgid "Learn more..." msgstr "Mehr erfahren …" @@ -4073,7 +4061,7 @@ msgstr "Web-Konferenz" #: plinth/modules/janus/templates/janus_video_room.html:192 #: plinth/modules/jsxc/templates/jsxc_launch.html:117 -#: plinth/templates/base.html:282 +#: plinth/templates/base.html:289 msgid "JavaScript license information" msgstr "JavaScript-Lizenzinformation" @@ -6098,12 +6086,18 @@ msgstr "Verbindung bearbeiten" #: plinth/modules/networks/templates/connections_fields.html:14 #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:64 +#: plinth/modules/users/templates/users_login.html:26 +#: plinth/modules/users/templates/users_passkeys.html:26 +#: plinth/modules/users/templates/users_passkeys.html:54 #: plinth/templates/messages.html:15 msgid "Error:" msgstr "Fehler:" #: plinth/modules/networks/templates/connections_fields.html:21 -#: plinth/modules/users/templates/users_update.html:50 +#: plinth/modules/users/templates/users_login.html:33 +#: plinth/modules/users/templates/users_passkeys.html:33 +#: plinth/modules/users/templates/users_passkeys.html:140 +#: plinth/modules/users/templates/users_update.html:55 #: plinth/templates/messages.html:31 msgid "Close" msgstr "Schließen" @@ -6308,12 +6302,6 @@ msgstr "" "weiterleitet, damit %(box_name)s die Dienste bereitstellt." #: plinth/modules/networks/templates/router_configuration_content.html:32 -#, fuzzy -#| msgid "" -#| "If you don't have control over your router, choose not to configure it. " -#| "To see options to overcome this limitation, choose 'I dont have a public " -#| "IP address' option in Internet connection type selection." msgid "" "If you don't have control over your router, choose not to configure it. To " "see options to overcome this limitation, choose 'I dont have a public IP " @@ -6323,7 +6311,7 @@ msgstr "" "Wenn Sie keine Kontrolle über Ihren Router haben, können Sie ihn nicht " "konfigurieren. Um Optionen zur Überwindung dieser Einschränkung zu sehen, " "wählen Sie die Option 'Ich habe keine öffentliche IP-Adresse' in Auswahl des " +"freedombox/sys/networks/internet-connection-type/\">Auswahl des " "Internetverbindungstyps." #: plinth/modules/networks/templates/router_configuration_content.html:39 @@ -6737,16 +6725,12 @@ msgid "OpenID Connect Provider" msgstr "" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:14 -#, fuzzy -#| msgid "Applications" msgid "Application" -msgstr "Anwendungen" +msgstr "Anwendung" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:22 -#, fuzzy -#| msgid "Authorized SSH Keys" msgid "Authorize App" -msgstr "Autorisierte SSH-Schlüssel" +msgstr "App autorisieren" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:37 #, python-format @@ -6754,17 +6738,18 @@ msgid "" "%(app)s wants to access your account %(username)s" msgstr "" +" %(app)s möchte auf Ihr Konto zugreifen " +"%(username)s" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:52 -#, fuzzy, python-format -#| msgid "Authorized SSH Keys" +#, python-format msgid "Authorize %(app)s" -msgstr "Autorisierte SSH-Schlüssel" +msgstr "%(app)s autorisieren" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:59 #, python-format msgid "Authorizing will redirect to %(url)s" -msgstr "" +msgstr "Die Autorisierung führt zu einer Weiterleitung zu %(url)s" #: plinth/modules/openvpn/__init__.py:20 #, python-brace-format @@ -7101,8 +7086,8 @@ msgstr "Neustart" msgid "Shutdown" msgstr "Herunterfahren" -#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:187 -#: plinth/templates/base.html:188 +#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:194 +#: plinth/templates/base.html:195 msgid "Restart" msgstr "Neu starten" @@ -8207,12 +8192,6 @@ msgstr "" "automatisch bereinigt." #: plinth/modules/snapshot/__init__.py:25 -#, fuzzy -#| msgid "" -#| "Snapshots currently work on btrfs file systems only and on the root " -#| "partition only. Snapshots are not a replacement for backups since they can only be stored on the same " -#| "partition. " msgid "" "Snapshots currently work on btrfs file systems only and on the root " "partition only. Snapshots are not a replacement for Datensicherungen, da sie nur auf derselben " -"Partition gespeichert werden können. " +"href=\"/freedombox/sys/backups\">Datensicherungen, da sie nur auf " +"derselben Partition gespeichert werden können. " #: plinth/modules/snapshot/__init__.py:50 msgid "Storage Snapshots" @@ -9955,7 +9934,7 @@ msgstr "Passwort speichern" #: plinth/modules/users/templates/users_create.html:19 #: plinth/modules/users/templates/users_list.html:16 #: plinth/modules/users/templates/users_list.html:18 -#: plinth/modules/users/views.py:109 +#: plinth/modules/users/views.py:134 msgid "Create User" msgstr "Benutzer anlegen" @@ -10006,7 +9985,7 @@ msgid "Skip this step" msgstr "Überspringen Sie diesen Schritt" #: plinth/modules/users/templates/users_list.html:12 -#: plinth/modules/users/views.py:127 +#: plinth/modules/users/views.py:152 msgid "Users" msgstr "Benutzer" @@ -10015,16 +9994,114 @@ msgstr "Benutzer" msgid "Edit user %(username)s" msgstr "Benutzer %(username)s bearbeiten" -#: plinth/modules/users/templates/users_login.html:23 +#: plinth/modules/users/templates/users_login.html:30 +msgid "Logging in with passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_login.html:41 +#: plinth/modules/users/templates/users_passkeys.html:41 +#, fuzzy +#| msgid "This app does not support diagnostics" +msgid "Browser does not support passkeys." +msgstr "Diese App unterstützt keine Diagnose" + +#: plinth/modules/users/templates/users_login.html:57 msgid "Login" msgstr "Anmelden" +#: plinth/modules/users/templates/users_login.html:70 +#: plinth/modules/users/templates/users_login.html:72 +msgid "Log in with passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkey_edit.html:19 +#, fuzzy +#| msgid "Update setup" +msgid "Update Passkey" +msgstr "Übernehmen der Änderungen" + +#: plinth/modules/users/templates/users_passkeys.html:30 +msgid "Adding passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:48 +#: plinth/modules/users/views.py:314 +msgid "Passkeys" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:57 +msgid "" +"Working with passkeys requires using browser's Javascript API. Please enable " +"Javascript support in your browser to continue." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:66 +msgid "" +"Passkeys are way to verify user's identity using digital signatures. They " +"are a more secure alternative to passwords. Secret information is kept with " +"the user on their phone, laptop, or a hardware token and unlocked using a " +"PIN, fingerprint, or face ID. No secrets are stored on the server. The " +"server knows only the public information that can used to verify user's " +"signatures." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:83 +#: plinth/modules/users/templates/users_passkeys.html:85 +#, fuzzy +#| msgid "Add password" +msgid "Add passkey" +msgstr "Kennwort hinzufügen" + +#: plinth/modules/users/templates/users_passkeys.html:93 +#, fuzzy +#| msgid "Domain" +msgid "For Domain" +msgstr "Domain" + +#: plinth/modules/users/templates/users_passkeys.html:94 +msgid "Added" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:95 +#, fuzzy +#| msgid "Last scanned: " +msgid "Last Used" +msgstr "Zuletzt gescannt: " + +#: plinth/modules/users/templates/users_passkeys.html:126 +msgid "No passkeys added to user account." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:135 +msgid "Delete passkey ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Benutzer löschen" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Abbrechen" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Benutzer %(username)s bearbeiten" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -10034,17 +10111,17 @@ msgstr "" "href='%(change_password_url)s'>Passwortänderungsformular, um das " "Passwort zu ändern." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Änderungen speichern" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "Benutzer %(username)s und alle Dateien des Benutzers löschen?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -10053,45 +10130,57 @@ msgstr "" "Verzeichnis des Benutzers entfernt. Wenn Sie diese Dateien behalten möchten, " "deaktivieren Sie stattdessen das Benutzerkonto." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Benutzer und Dateien löschen" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Abbrechen" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Erfolgreich abgemeldet." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Benutzer %(username)s angelegt." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Benutzer %(username)s geändert." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Benutzer bearbeiten" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "Benutzer %(username)s gelöscht." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Passwort ändern" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Passwort erfolgreich geändert." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Eine Freigabe mit diesem Namen existiert bereits." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Benutzer bearbeiten" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard ist ein schneller, moderner, sicherer VPN-Tunnel." @@ -10123,14 +10212,12 @@ msgid "Invalid key." msgstr "Ungültiger Schlüssel." #: plinth/modules/wireguard/forms.py:63 -#, fuzzy -#| msgid "Enter a valid username." msgid "Enter a valid IPv4 address." -msgstr "Einen gültigen Benutzernamen eingeben." +msgstr "Eine gültige IPv4-Adresse eingeben." #: plinth/modules/wireguard/forms.py:65 msgid "Enter a valid network prefix or net mask." -msgstr "" +msgstr "Geben Sie ein gültiges Netzwerkpräfix oder eine gültige Netzmaske ein." #: plinth/modules/wireguard/forms.py:71 #: plinth/modules/wireguard/templates/wireguard.html:29 @@ -10177,11 +10264,6 @@ msgid "Client IP address provided by server" msgstr "Vom Server bereitgestellte Client-IP-Adresse" #: plinth/modules/wireguard/forms.py:94 -#, fuzzy -#| msgid "" -#| "IP address assigned to this machine on the VPN after connecting to the " -#| "endpoint. This value is usually provided by the server operator. Example: " -#| "192.168.0.10." msgid "" "IP address assigned to this machine on the VPN after connecting to the " "endpoint. This value is usually provided by the server operator. Example: " @@ -10191,7 +10273,9 @@ msgid "" msgstr "" "IP-Adresse, die diesem Computer auf dem VPN zugewiesen ist, nachdem eine " "Verbindung mit dem Endpunkt hergestellt wurde. Dieser Wert wird in der Regel " -"vom Serverbetreiber bereitgestellt. Beispiel: 192.168.0.10." +"vom Serverbetreiber bereitgestellt. Beispiel: 192.168.0.10. Sie können auch " +"das Netzwerk angeben. Dadurch können Sie auf Rechner im Netzwerk zugreifen. " +"Beispiele: 10.68.12.43/24 oder 10.68.12.43/255.255.255.0." #: plinth/modules/wireguard/forms.py:102 msgid "Private key of this machine" @@ -10245,10 +10329,9 @@ msgid "As a Server" msgstr "Als Server" #: plinth/modules/wireguard/templates/wireguard.html:17 -#, fuzzy, python-format -#| msgid "Endpoints for this %(box_name)s:" +#, python-format msgid "Information for this %(box_name)s:" -msgstr "Endpunkte für diese %(box_name)s:" +msgstr "Informationen zu dieser %(box_name)s:" #: plinth/modules/wireguard/templates/wireguard.html:25 msgid "Property" @@ -10265,10 +10348,9 @@ msgid "Endpoint(s)" msgstr "Endpunkt" #: plinth/modules/wireguard/templates/wireguard.html:41 -#, fuzzy, python-format -#| msgid "To %(box_name)s Ports" +#, python-format msgid "%(box_name)s VPN IP for services" -msgstr "Zu %(box_name)s Ports" +msgstr "VPN-IP von %(box_name)s für Dienste" #: plinth/modules/wireguard/templates/wireguard.html:50 msgid "Peers" @@ -10304,10 +10386,8 @@ msgid "Add Allowed Client" msgstr "Zulässige Clients hinzufügen" #: plinth/modules/wireguard/templates/wireguard.html:97 -#, fuzzy -#| msgid "WireGuard server started successfully." msgid "WireGuard server not started yet." -msgstr "Der WireGuard-Server wurde erfolgreich gestartet." +msgstr "WireGuard-Server wurde noch nicht gestartet." #: plinth/modules/wireguard/templates/wireguard.html:101 #: plinth/modules/wireguard/templates/wireguard.html:103 @@ -10398,7 +10478,7 @@ msgstr "Öffentlicher Schlüssel des Servers:" #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 msgid "Server VPN IP address for services:" -msgstr "" +msgstr "VPN-IP-Adresse des Servers für Dienste:" #: plinth/modules/wireguard/templates/wireguard_show_client.html:58 #: plinth/modules/wireguard/templates/wireguard_show_server.html:64 @@ -10442,6 +10522,7 @@ msgstr "IP-Adresse dieses Rechners:" #: plinth/modules/wireguard/templates/wireguard_show_server.html:46 msgid "All outgoing traffic is sent using this connection:" msgstr "" +"Der gesamte ausgehende Datenverkehr wird über diese Verbindung gesendet:" #: plinth/modules/wireguard/views.py:54 msgid "Added new client." @@ -10708,20 +10789,20 @@ msgstr "Zeitüberschreitung beim Warten auf den Paket-Manager" #: plinth/settings.py:181 msgid "Uniquely identify your user account with username" msgstr "" +"Identifizieren Sie Ihr Benutzerkonto eindeutig anhand des Benutzernamens" #: plinth/settings.py:183 -#, fuzzy -#| msgid "requesting address" msgid "View email address" -msgstr "Adresse anfordern" +msgstr "E-Mail-Adresse anzeigen" #: plinth/settings.py:185 msgid "View basic profile information (such as name and email)" msgstr "" +"Grundlegende Profilinformationen anzeigen (z. B. Name und E-Mail-Adresse)" #: plinth/settings.py:187 msgid "View permissions that account has" -msgstr "" +msgstr "Die Berechtigungen dieses Kontos anzeigen" #: plinth/setup.py:44 msgid "Installing app" @@ -10907,22 +10988,28 @@ msgid " System" msgstr " System" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Aliase verwalten" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Passwort ändern" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Herunterfahren" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Abmelden" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Sprache wählen" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Anmelden" @@ -11129,11 +11216,11 @@ msgstr "Alle Schlagwörter löschen" #: plinth/templates/theme-menu.html:9 msgid "Toggle theme (auto)" -msgstr "" +msgstr "Thema umschalten (automatisch)" #: plinth/templates/theme-menu.html:17 msgid "Toggle theme" -msgstr "" +msgstr "Thema umschalten" #: plinth/templates/theme-menu.html:25 msgid "Light" @@ -11177,15 +11264,15 @@ msgstr "" "Alle App-Daten und -Konfigurationen gehen dauerhaft verloren. App kann " "wieder frisch installiert werden." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "Hier" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Einstellung unverändert" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "vor der Deinstallation von {app_id}" diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 7218171ed..3cdbb2f56 100644 --- a/plinth/locale/django.pot +++ b/plinth/locale/django.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -27,7 +27,7 @@ msgstr "" msgid "Container {container_name} is running" msgstr "" -#: plinth/context_processors.py:21 plinth/views.py:175 +#: plinth/context_processors.py:21 plinth/views.py:180 msgid "FreedomBox" msgstr "" @@ -318,6 +318,7 @@ msgstr "" #: plinth/modules/networks/templates/connection_show.html:76 #: plinth/modules/samba/templates/samba.html:66 #: plinth/modules/sharing/templates/sharing.html:33 +#: plinth/modules/users/templates/users_passkeys.html:92 msgid "Name" msgstr "" @@ -1950,6 +1951,7 @@ msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:27 #: plinth/modules/storage/templates/storage.html:29 +#: plinth/modules/users/templates/users_passkeys.html:96 msgid "Actions" msgstr "" @@ -3033,8 +3035,8 @@ msgstr "" msgid "Contribute" msgstr "" -#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:222 -#: plinth/templates/base.html:225 plinth/templates/help-menu.html:47 +#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:229 +#: plinth/templates/base.html:232 plinth/templates/help-menu.html:47 #: plinth/templates/help-menu.html:48 plinth/templates/index.html:96 msgid "About" msgstr "" @@ -3172,6 +3174,7 @@ msgstr "" #: plinth/modules/help/templates/help_contribute.html:43 #: plinth/modules/power/templates/power_restart.html:27 #: plinth/modules/power/templates/power_shutdown.html:26 +#: plinth/modules/users/templates/users_passkeys.html:77 #: plinth/templates/app-header.html:67 msgid "Learn more..." msgstr "" @@ -3576,7 +3579,7 @@ msgstr "" #: plinth/modules/janus/templates/janus_video_room.html:192 #: plinth/modules/jsxc/templates/jsxc_launch.html:117 -#: plinth/templates/base.html:282 +#: plinth/templates/base.html:289 msgid "JavaScript license information" msgstr "" @@ -5290,12 +5293,18 @@ msgstr "" #: plinth/modules/networks/templates/connections_fields.html:14 #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:64 +#: plinth/modules/users/templates/users_login.html:26 +#: plinth/modules/users/templates/users_passkeys.html:26 +#: plinth/modules/users/templates/users_passkeys.html:54 #: plinth/templates/messages.html:15 msgid "Error:" msgstr "" #: plinth/modules/networks/templates/connections_fields.html:21 -#: plinth/modules/users/templates/users_update.html:50 +#: plinth/modules/users/templates/users_login.html:33 +#: plinth/modules/users/templates/users_passkeys.html:33 +#: plinth/modules/users/templates/users_passkeys.html:140 +#: plinth/modules/users/templates/users_update.html:55 #: plinth/templates/messages.html:31 msgid "Close" msgstr "" @@ -6162,8 +6171,8 @@ msgstr "" msgid "Shutdown" msgstr "" -#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:187 -#: plinth/templates/base.html:188 +#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:194 +#: plinth/templates/base.html:195 msgid "Restart" msgstr "" @@ -8534,7 +8543,7 @@ msgstr "" #: plinth/modules/users/templates/users_create.html:19 #: plinth/modules/users/templates/users_list.html:16 #: plinth/modules/users/templates/users_list.html:18 -#: plinth/modules/users/views.py:109 +#: plinth/modules/users/views.py:134 msgid "Create User" msgstr "" @@ -8576,7 +8585,7 @@ msgid "Skip this step" msgstr "" #: plinth/modules/users/templates/users_list.html:12 -#: plinth/modules/users/views.py:127 +#: plinth/modules/users/views.py:152 msgid "Users" msgstr "" @@ -8585,77 +8594,171 @@ msgstr "" msgid "Edit user %(username)s" msgstr "" -#: plinth/modules/users/templates/users_login.html:23 +#: plinth/modules/users/templates/users_login.html:30 +msgid "Logging in with passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_login.html:41 +#: plinth/modules/users/templates/users_passkeys.html:41 +msgid "Browser does not support passkeys." +msgstr "" + +#: plinth/modules/users/templates/users_login.html:57 msgid "Login" msgstr "" +#: plinth/modules/users/templates/users_login.html:70 +#: plinth/modules/users/templates/users_login.html:72 +msgid "Log in with passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkey_edit.html:19 +msgid "Update Passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:30 +msgid "Adding passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:48 +#: plinth/modules/users/views.py:314 +msgid "Passkeys" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:57 +msgid "" +"Working with passkeys requires using browser's Javascript API. Please enable " +"Javascript support in your browser to continue." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:66 +msgid "" +"Passkeys are way to verify user's identity using digital signatures. They " +"are a more secure alternative to passwords. Secret information is kept with " +"the user on their phone, laptop, or a hardware token and unlocked using a " +"PIN, fingerprint, or face ID. No secrets are stored on the server. The " +"server knows only the public information that can used to verify user's " +"signatures." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:83 +#: plinth/modules/users/templates/users_passkeys.html:85 +msgid "Add passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:93 +msgid "For Domain" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:94 +msgid "Added" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:95 +msgid "Last Used" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:126 +msgid "No passkeys added to user account." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:135 +msgid "Delete passkey ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +msgid "Delete passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9357,22 +9460,26 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +msgid "Manage passkeys" +msgstr "" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9605,15 +9712,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index 358253b6a..f452d9dd2 100644 --- a/plinth/locale/el/LC_MESSAGES/django.po +++ b/plinth/locale/el/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2026-02-22 13:17+0000\n" "Last-Translator: James Valleroy \n" "Language-Team: Greek ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete User" +msgid "Delete passkey" +msgstr "Διαγραφή χρήστη" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Άκυρο" + #: plinth/modules/users/templates/users_update.html:16 #, fuzzy, python-format #| msgid "Edit user %(username)s" msgid "Edit User %(username)s" msgstr "Επεξεργασία χρήστη %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -10194,67 +10301,79 @@ msgstr "" "Χρησιμοποιήστε τη φόρμα αλλαγής κωδικού " "πρόσβασης για να αλλάξετε τον κωδικό πρόσβασης." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Αποθήκευση αλλαγών" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, fuzzy, python-format #| msgid "Delete user %(username)s permanently?" msgid "Delete user %(username)s and all the user's files?" msgstr "Να διαγραφεί οριστικά ο χρήστης %(username)s ;" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete User" msgid "Delete user and files" msgstr "Διαγραφή χρήστη" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Άκυρο" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 #, fuzzy #| msgid "Password changed successfully." msgid "Logged out successfully." msgstr "Ο κωδικός πρόσβασης άλλαξε με επιτυχία." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Ο χρήστης %(username)s δημιουργήθηκε." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "O χρήστης %(username)s ενημερώθηκε." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Επεξεργασία χρήστη" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "User %(username)s created." msgid "User %(username)s deleted." msgstr "Ο χρήστης %(username)s δημιουργήθηκε." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Αλλαγή κωδικού πρόσβασης" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Ο κωδικός πρόσβασης άλλαξε με επιτυχία." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Υπάρχει ήδη ένα μέρισμα με αυτό το όνομα." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Επεξεργασία χρήστη" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -11095,22 +11214,28 @@ msgid " System" msgstr " Σύστημα" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Repositories" +msgid "Manage passkeys" +msgstr "Διαχείριση αποθετηρίων" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Αλλαγή κωδικού πρόσβασης" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "ΤΕΡΜΑΤΙΣΜΟΣ ΛΕΙΤΟΥΡΓΙΑΣ" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Αποσύνδεση" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Επιλογή γλώσσας" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Σύνδεση" @@ -11387,15 +11512,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Οι ρυθμίσεις δεν άλλαξαν" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index 9e46cfe18..41c4ed620 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2024-11-01 17:00+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete User" +msgid "Delete passkey" +msgstr "Eliminar usuaria/o" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Cancelar" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Editar el usuario %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -10102,65 +10209,77 @@ msgstr "" "Use el formulario para cambio de clave " "de acceso para cambiarla." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Guardar cambios" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, fuzzy, python-format #| msgid "Delete user %(username)s permanently?" msgid "Delete user %(username)s and all the user's files?" msgstr "¿Eliminar usuaria/o %(username)s definitivamente?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete files" msgid "Delete user and files" msgstr "Eliminar archivos" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Cancelar" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Desconectado con éxito." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Se ha creado el o la usuaria %(username)s." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "El o la usuaria %(username)s se ha actualizado." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Editar usuario" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "User %(username)s created." msgid "User %(username)s deleted." msgstr "Se ha creado el o la usuaria %(username)s." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Cambiar clave de acceso" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Clave de acceso cambiada con éxito." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Ya existe una compartición con este nombre." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Editar usuario" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WirGuard es un túnel VPN rápido, moderno y seguro." @@ -10986,22 +11105,28 @@ msgid " System" msgstr " Sistema" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Administrar Alias" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Cambiar clave de acceso" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Apagar" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Cerrar sesión" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Seleccionar idioma" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Iniciar sesión" @@ -11263,15 +11388,15 @@ msgstr "" "Todos los datos de la aplicación y la configuración se perderán " "permanentemente. La aplicación se puede instalar de nuevo." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Configuración sin cambio" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "antes de desinstalar {app_id}" diff --git a/plinth/locale/et/LC_MESSAGES/django.po b/plinth/locale/et/LC_MESSAGES/django.po index b6a11928a..3a5598326 100644 --- a/plinth/locale/et/LC_MESSAGES/django.po +++ b/plinth/locale/et/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2026-01-09 20:01+0000\n" "Last-Translator: Priit Jõerüüt \n" "Language-Team: Estonian ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Kustuta kasutaja" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Muuda kasutajat %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Väljalogimine õnnestus." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Muuda salasõna" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Salasõna muutmine õnnestus." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A library with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Sellise nimega raamatukogu on juba olemas." + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard on kiire, moodne ja turvaline VPN-tunnel." @@ -9421,22 +9536,28 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Passwords" +msgid "Manage passkeys" +msgstr "Halda salasõnu" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9672,15 +9793,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index f551b5d45..9d0f063fc 100644 --- a/plinth/locale/fa/LC_MESSAGES/django.po +++ b/plinth/locale/fa/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Persian ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete" +msgid "Delete passkey" +msgstr "پاک‌کردن" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "انصراف" + #: plinth/modules/users/templates/users_update.html:16 #, fuzzy, python-format #| msgid "Delete Wiki or Blog %(name)s" msgid "Edit User %(username)s" msgstr "پاک‌کردن ویکی یا وبلاگ %(name)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, fuzzy, python-format #| msgid "Delete Wiki or Blog %(name)s" msgid "Delete user %(username)s and all the user's files?" msgstr "پاک‌کردن ویکی یا وبلاگ %(name)s" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete" msgid "Delete user and files" msgstr "پاک‌کردن" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "انصراف" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 #, fuzzy #| msgid "Partition expanded successfully." msgid "Logged out successfully." msgstr "پارتیشن با موفقیت بزرگ شد." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "{name} deleted." msgid "User %(username)s deleted." msgstr "{name} پاک شد." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Shared" +msgid "Edit Passkey" +msgstr "مشترک" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -10357,24 +10474,30 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Create Connection" +msgid "Manage passkeys" +msgstr "ساختن اتصال" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 #, fuzzy #| msgid "Language" msgid "Select language" msgstr "زبان" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -10622,15 +10745,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index 9a18585c1..c08cef332 100644 --- a/plinth/locale/fake/LC_MESSAGES/django.po +++ b/plinth/locale/fake/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth 0.6\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete User" +msgid "Delete passkey" +msgstr "DELETE USER" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "CANCEL" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "EDIT USER %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -10005,67 +10112,79 @@ msgstr "" "USE THE CHANGE PASSWORD FORM TO " "CHANGE THE PASSWORD." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "SAVE CHANGES" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, fuzzy, python-format #| msgid "Delete user %(username)s permanently?" msgid "Delete user %(username)s and all the user's files?" msgstr "DELETE USER %(username)s PERMANENTLY?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete User" msgid "Delete user and files" msgstr "DELETE USER" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "CANCEL" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 #, fuzzy #| msgid "Password changed successfully." msgid "Logged out successfully." msgstr "PASSWORD CHANGED SUCCESSFULLY." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "USER %(username)s CREATED." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "USER %(username)s UPDATED." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "EDIT USER" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "User %(username)s created." msgid "User %(username)s deleted." msgstr "USER %(username)s CREATED." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "CHANGE PASSWORD" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "PASSWORD CHANGED SUCCESSFULLY." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "This service already exists" +msgid "Passkey with that identifier already exists." +msgstr "THIS SERVICE ALREADY EXISTS" + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "EDIT USER" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -10893,26 +11012,32 @@ msgid " System" msgstr "SYSTEM" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Create User" +msgid "Manage passkeys" +msgstr "CREATE USER" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "CHANGE PASSWORD" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 #, fuzzy #| msgid "Shut Down Now" msgid "Shut down" msgstr "SHUT DOWN NOW" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "LOG OUT" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 #, fuzzy #| msgid "Language" msgid "Select language" msgstr "LANGUAGE" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "LOG IN" @@ -11178,15 +11303,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "SETTING UNCHANGED" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index 1b4295c9c..0612e308e 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" -"PO-Revision-Date: 2026-02-18 15:09+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" +"PO-Revision-Date: 2026-03-29 11:09+0000\n" "Last-Translator: Coucouf \n" "Language-Team: French \n" @@ -17,7 +17,7 @@ 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 5.16.1-dev\n" +"X-Generator: Weblate 5.17-dev\n" #: plinth/config.py:103 #, python-brace-format @@ -29,7 +29,7 @@ msgstr "La configuration statique {etc_path} est correctement configurée" msgid "Container {container_name} is running" msgstr "Le conteneur {container_name} est actif" -#: plinth/context_processors.py:21 plinth/views.py:175 +#: plinth/context_processors.py:21 plinth/views.py:180 msgid "FreedomBox" msgstr "FreedomBox" @@ -169,7 +169,7 @@ msgstr "Interface web de la {box_name} (Plinth)" #: plinth/modules/apache/__init__.py:129 msgid "Web app protected by FreedomBox" -msgstr "" +msgstr "Appli Web protégée par la FreedomBox" #: plinth/modules/apache/components.py:234 #, python-brace-format @@ -350,6 +350,7 @@ msgstr "Dépôt" #: plinth/modules/networks/templates/connection_show.html:76 #: plinth/modules/samba/templates/samba.html:66 #: plinth/modules/sharing/templates/sharing.html:33 +#: plinth/modules/users/templates/users_passkeys.html:92 msgid "Name" msgstr "Nom" @@ -395,12 +396,12 @@ msgid "" "\"Key in Repository\" means that a password-protected key is stored with the " "backup." msgstr "" -"« Clef dans le dépôt » signifie que la clef de chiffrement de la sauvegarde, " +"« Clé dans le dépôt » signifie que la clé de chiffrement de la sauvegarde, " "protégée par un mot de passe, sera stockée à côté de la sauvegarde elle-même." #: plinth/modules/backups/forms.py:184 msgid "Key in Repository" -msgstr "Clef dans le dépôt" +msgstr "Clé dans le dépôt" #: plinth/modules/backups/forms.py:184 #: plinth/modules/matrixsynapse/templates/matrix-synapse.html:68 @@ -413,12 +414,8 @@ msgid "Passphrase" msgstr "Phrase secrète" #: plinth/modules/backups/forms.py:187 -#, fuzzy -#| msgid "Passphrase; Only needed when using encryption." msgid "Only needed when using encryption." -msgstr "" -"Phrase secrète ; nécessaire uniquement dans le cas où le chiffrement est " -"utilisé." +msgstr "Nécessaire uniquement dans le cas où le chiffrement est utilisé." #: plinth/modules/backups/forms.py:190 msgid "Confirm Passphrase" @@ -457,44 +454,33 @@ msgstr "" "chemin/vers/le/dépôt/" #: plinth/modules/backups/forms.py:255 -#, fuzzy -#| msgid "Authentication Mode" msgid "SSH Authentication Type" -msgstr "Mode Authentification" +msgstr "Mode d’Auhentification SSH" #: plinth/modules/backups/forms.py:256 -#, fuzzy -#| msgid "Authentication to remote server failed." msgid "Choose how to authenticate to the remote SSH server." -msgstr "L’authentification sur le serveur distant a échoué." +msgstr "Choisissez le mode d’authentification au serveur SSH distant." #: plinth/modules/backups/forms.py:258 -#, fuzzy -#| msgid "needs authentication" msgid "Key-based Authentication" -msgstr "nécessite une authentification" +msgstr "Authentification à base de clés" #: plinth/modules/backups/forms.py:259 -#, fuzzy -#| msgid "Disable password authentication" msgid "Password-based Authentication" -msgstr "Désactiver l’authentification par mot de passe" +msgstr "Authentification par mot de passe" #: plinth/modules/backups/forms.py:261 msgid "SSH server password" msgstr "Mot de passe du serveur SSH" #: plinth/modules/backups/forms.py:262 -#, fuzzy -#| msgid "Disable password authentication" msgid "Required for password-based authentication." -msgstr "Désactiver l’authentification par mot de passe" +msgstr "Requis pour l’authentification par mot de passe." #: plinth/modules/backups/forms.py:275 -#, fuzzy -#| msgid "Disable password authentication" msgid "SSH password is needed for password-based authentication." -msgstr "Désactiver l’authentification par mot de passe" +msgstr "" +"Le mot de passe SSH est requis pour l’authentification par mot de passe." #: plinth/modules/backups/forms.py:292 msgid "Remote backup repository already exists." @@ -641,6 +627,9 @@ msgid "" "list on the remote machine for %(box_name)s to be able to connect to the " "remote machine:" msgstr "" +"La clé publique de client SSH qui suit doit être ajoutée à la liste des clés " +"autorisées sur la machine distante pour que la %(box_name)s puisse s’y " +"connecter :" #: plinth/modules/backups/templates/backups_add_remote_repository.html:87 #, python-format @@ -649,6 +638,10 @@ msgid "" "successful, then the public key will be automatically added to the " "authorized keys list, so that future connections do not need the password." msgstr "" +"Le service %(box_name)s va maintenant tenter d’établir une connexion en " +"utilisant le mot de passe fourni. En cas de succès, la clé publique sera " +"automatiquement ajoutée à la liste des clés autorisées pour que les " +"connexions ultérieures puissent se faire sans redemander le mot de passe." #: plinth/modules/backups/templates/backups_add_remote_repository.html:132 #: plinth/modules/backups/templates/backups_upload.html:29 @@ -830,10 +823,8 @@ msgid "Authentication to remote server failed." msgstr "L’authentification sur le serveur distant a échoué." #: plinth/modules/backups/views.py:50 -#, fuzzy -#| msgid "Error establishing connection to server: {}" msgid "Error establishing connection to server: {} {} {}" -msgstr "Erreur lors de la connexion au serveur : {}" +msgstr "Erreur lors de la connexion au serveur : {} {} {}" #: plinth/modules/backups/views.py:82 msgid "Backup schedule updated." @@ -1487,14 +1478,7 @@ msgid "Webserver Home Page" msgstr "Page d’accueil du serveur web" #: plinth/modules/config/forms.py:37 -#, fuzzy, python-brace-format -#| msgid "" -#| "Choose the default page that must be served when someone visits your " -#| "{box_name} on the web. A typical use case is to set your blog or wiki as " -#| "the home page when someone visits the domain name. Note that once the " -#| "home page is set to something other than {box_name} Service (Plinth), " -#| "your users must explicitly type /plinth or /freedombox to reach " -#| "{box_name} Service (Plinth)." +#, python-brace-format msgid "" "Choose the default page that must be served when someone visits your " "{box_name} on the web. A typical use case is to set your blog or wiki as the " @@ -1507,8 +1491,8 @@ msgstr "" "mettre votre blogue ou votre wiki en page d’accueil lorsqu’on se rend sur " "votre nom de domaine. Veuillez noter qu’avec une page d’accueil autre que " "« Gestion de la {box_name} (Plinth) », vos utilisateurs devront " -"explicitement ajouter le chemin /plinth ou /freedombox à l’adresse de la " -"{box_name} pour accéder à la présente interface." +"explicitement ajouter le chemin /freedombox pour accéder à l’interface " +"{box_name} (Plinth)." #: plinth/modules/config/forms.py:48 msgid "Show advanced apps and features" @@ -2186,6 +2170,7 @@ msgstr "Adresse IP" #: plinth/modules/dynamicdns/templates/dynamicdns.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:27 #: plinth/modules/storage/templates/storage.html:29 +#: plinth/modules/users/templates/users_passkeys.html:96 msgid "Actions" msgstr "Actions" @@ -2480,15 +2465,11 @@ msgstr "" "automatiquement, pointant vers le premier compte administrateur." #: plinth/modules/email/__init__.py:41 -#, fuzzy -#| msgid "" -#| "Roundcube app provides web " -#| "interface for users to access email." msgid "" "Roundcube app provides web " "interface for users to access email." msgstr "" -"L’appli Roundcube propose une " +"L’appli Roundcube propose une " "interface Web pour accéder à vos courriels." #: plinth/modules/email/__init__.py:43 @@ -3412,8 +3393,8 @@ msgstr "Partager vos impressions" msgid "Contribute" msgstr "Participer" -#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:222 -#: plinth/templates/base.html:225 plinth/templates/help-menu.html:47 +#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:229 +#: plinth/templates/base.html:232 plinth/templates/help-menu.html:47 #: plinth/templates/help-menu.html:48 plinth/templates/index.html:96 msgid "About" msgstr "À propos" @@ -3597,6 +3578,7 @@ msgstr "" #: plinth/modules/help/templates/help_contribute.html:43 #: plinth/modules/power/templates/power_restart.html:27 #: plinth/modules/power/templates/power_shutdown.html:26 +#: plinth/modules/users/templates/users_passkeys.html:77 #: plinth/templates/app-header.html:67 msgid "Learn more..." msgstr "En savoir plus…" @@ -4087,7 +4069,7 @@ msgstr "Conférence Web" #: plinth/modules/janus/templates/janus_video_room.html:192 #: plinth/modules/jsxc/templates/jsxc_launch.html:117 -#: plinth/templates/base.html:282 +#: plinth/templates/base.html:289 msgid "JavaScript license information" msgstr "Information de licence JavaScript" @@ -4809,7 +4791,7 @@ msgid "" "instance of time." msgstr "" "Vous permet de modifier le nombre maximum de joueurs autorisés à se " -"connecter à minetest à un instant donné." +"connecter à minetest en même temps." #: plinth/modules/minetest/forms.py:19 msgid "Enable creative mode" @@ -6122,12 +6104,18 @@ msgstr "Modifier la connexion" #: plinth/modules/networks/templates/connections_fields.html:14 #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:64 +#: plinth/modules/users/templates/users_login.html:26 +#: plinth/modules/users/templates/users_passkeys.html:26 +#: plinth/modules/users/templates/users_passkeys.html:54 #: plinth/templates/messages.html:15 msgid "Error:" msgstr "Erreur :" #: plinth/modules/networks/templates/connections_fields.html:21 -#: plinth/modules/users/templates/users_update.html:50 +#: plinth/modules/users/templates/users_login.html:33 +#: plinth/modules/users/templates/users_passkeys.html:33 +#: plinth/modules/users/templates/users_passkeys.html:140 +#: plinth/modules/users/templates/users_update.html:55 #: plinth/templates/messages.html:31 msgid "Close" msgstr "Fermer" @@ -6335,12 +6323,6 @@ msgstr "" "%(box_name)s puisse fournir ses services." #: plinth/modules/networks/templates/router_configuration_content.html:32 -#, fuzzy -#| msgid "" -#| "If you don't have control over your router, choose not to configure it. " -#| "To see options to overcome this limitation, choose 'I dont have a public " -#| "IP address' option in Internet connection type selection." msgid "" "If you don't have control over your router, choose not to configure it. To " "see options to overcome this limitation, choose 'I dont have a public IP " @@ -6350,7 +6332,7 @@ msgstr "" "Si vous n’avez pas le contrôle de votre routeur, choisissez l’option de ne " "pas le configurer. Pour plus d’informations sur les manières de contourner " "cette limitation, choisissez l’option « Je n’ai d’adresse IP publique » dans " -"la sélection du type de connexion à Internet." #: plinth/modules/networks/templates/router_configuration_content.html:39 @@ -6761,19 +6743,15 @@ msgstr "" #: plinth/modules/oidc/__init__.py:56 msgid "OpenID Connect Provider" -msgstr "" +msgstr "Fournisseur OpenID Connect" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:14 -#, fuzzy -#| msgid "Applications" msgid "Application" -msgstr "Applications" +msgstr "Application" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:22 -#, fuzzy -#| msgid "Authorized SSH Keys" msgid "Authorize App" -msgstr "Clés SSH autorisées" +msgstr "Autoriser cette appli" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:37 #, python-format @@ -6781,17 +6759,18 @@ msgid "" "%(app)s wants to access your account %(username)s" msgstr "" +"%(app)s veut accéder à votre compte %(username)s" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:52 -#, fuzzy, python-format -#| msgid "Authorized SSH Keys" +#, python-format msgid "Authorize %(app)s" -msgstr "Clés SSH autorisées" +msgstr "Autoriser %(app)s" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:59 #, python-format msgid "Authorizing will redirect to %(url)s" -msgstr "" +msgstr "L’autorisation entraînera une redirection vers %(url)s" #: plinth/modules/openvpn/__init__.py:20 #, python-brace-format @@ -7130,8 +7109,8 @@ msgstr "Redémarrer" msgid "Shutdown" msgstr "Éteindre" -#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:187 -#: plinth/templates/base.html:188 +#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:194 +#: plinth/templates/base.html:195 msgid "Restart" msgstr "Redémarrer" @@ -7937,7 +7916,7 @@ msgstr "" #: plinth/modules/security/templates/security_report.html:45 msgid "App Name" -msgstr "Application" +msgstr "Nom d’Appli" #: plinth/modules/security/templates/security_report.html:46 msgid "Current Vulnerabilities" @@ -8253,12 +8232,6 @@ msgstr "" "paramétrage qui suit." #: plinth/modules/snapshot/__init__.py:25 -#, fuzzy -#| msgid "" -#| "Snapshots currently work on btrfs file systems only and on the root " -#| "partition only. Snapshots are not a replacement for backups since they can only be stored on the same " -#| "partition. " msgid "" "Snapshots currently work on btrfs file systems only and on the root " "partition only. Snapshots are not a replacement for sauvegardes car ils sont forcément conservés sur la même partition. " +"fichiers btrfs et uniquement pour la partition racine. Les instantanés ne " +"peuvent pas remplacer une vraie sauvegarde car ils sont forcément conservés sur la même " +"partition. " #: plinth/modules/snapshot/__init__.py:50 msgid "Storage Snapshots" @@ -9931,10 +9905,10 @@ msgid "" "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -"L’ajout d’une clef publique SSH permettra à cet utilisateur d’ouvrir une " +"L’ajout d’une clé publique SSH permettra à cet utilisateur d’ouvrir une " "session sécurisée sans utiliser de mot de passe. Vous pouvez ajouter " -"plusieurs clefs, une sur chaque ligne. Les lignes vides et celles commençant " -"par # sont ignorées." +"plusieurs clés, une par ligne. Les lignes vides et celles commençant par # " +"sont ignorées." #: plinth/modules/users/forms.py:273 msgid "Delete user" @@ -9967,7 +9941,7 @@ msgstr "Échec de l’ajout de l’utilisateur au groupe." #: plinth/modules/users/forms.py:369 msgid "Unable to set SSH keys." -msgstr "Échec du paramétrage des clefs SSH." +msgstr "Échec du paramétrage des clés SSH." #: plinth/modules/users/forms.py:382 msgid "Failed to change user status." @@ -10011,7 +9985,7 @@ msgstr "Sauvegarder le mot de passe" #: plinth/modules/users/templates/users_create.html:19 #: plinth/modules/users/templates/users_list.html:16 #: plinth/modules/users/templates/users_list.html:18 -#: plinth/modules/users/views.py:109 +#: plinth/modules/users/views.py:134 msgid "Create User" msgstr "Créer un utilisateur" @@ -10064,7 +10038,7 @@ msgid "Skip this step" msgstr "Passer cette étape" #: plinth/modules/users/templates/users_list.html:12 -#: plinth/modules/users/views.py:127 +#: plinth/modules/users/views.py:152 msgid "Users" msgstr "Utilisateurs" @@ -10073,16 +10047,114 @@ msgstr "Utilisateurs" msgid "Edit user %(username)s" msgstr "Paramètres du compte %(username)s" -#: plinth/modules/users/templates/users_login.html:23 +#: plinth/modules/users/templates/users_login.html:30 +msgid "Logging in with passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_login.html:41 +#: plinth/modules/users/templates/users_passkeys.html:41 +#, fuzzy +#| msgid "This app does not support diagnostics" +msgid "Browser does not support passkeys." +msgstr "Cette application n’est pas compatible avec les tests de diagnostic" + +#: plinth/modules/users/templates/users_login.html:57 msgid "Login" msgstr "S’identifier" +#: plinth/modules/users/templates/users_login.html:70 +#: plinth/modules/users/templates/users_login.html:72 +msgid "Log in with passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkey_edit.html:19 +#, fuzzy +#| msgid "Update setup" +msgid "Update Passkey" +msgstr "Appliquer les changements" + +#: plinth/modules/users/templates/users_passkeys.html:30 +msgid "Adding passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:48 +#: plinth/modules/users/views.py:314 +msgid "Passkeys" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:57 +msgid "" +"Working with passkeys requires using browser's Javascript API. Please enable " +"Javascript support in your browser to continue." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:66 +msgid "" +"Passkeys are way to verify user's identity using digital signatures. They " +"are a more secure alternative to passwords. Secret information is kept with " +"the user on their phone, laptop, or a hardware token and unlocked using a " +"PIN, fingerprint, or face ID. No secrets are stored on the server. The " +"server knows only the public information that can used to verify user's " +"signatures." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:83 +#: plinth/modules/users/templates/users_passkeys.html:85 +#, fuzzy +#| msgid "Add password" +msgid "Add passkey" +msgstr "Ajouter un mot de passe" + +#: plinth/modules/users/templates/users_passkeys.html:93 +#, fuzzy +#| msgid "Domain" +msgid "For Domain" +msgstr "Domaine" + +#: plinth/modules/users/templates/users_passkeys.html:94 +msgid "Added" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:95 +#, fuzzy +#| msgid "Last scanned: " +msgid "Last Used" +msgstr "Dernière analyse : " + +#: plinth/modules/users/templates/users_passkeys.html:126 +msgid "No passkeys added to user account." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:135 +msgid "Delete passkey ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Supprimer l'utilisateur" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Annuler" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Modifier l’utilisateur %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -10091,19 +10163,19 @@ msgstr "" "Utiliser le formulaire de changement de " "mot de passe pour changer votre mot de passe." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Appliquer les changements" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" "Supprimer l’utilisateur %(username)s et tous les fichiers de " "l'utilisateur ?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -10112,45 +10184,57 @@ msgstr "" "répertoire personnel de l'utilisateur. Si vous voulez conserver ces " "fichiers, désactivez plutôt le compte de l'utilisateur." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Supprimer l'utilisateur et les fichiers" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Annuler" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Déconnecté avec succès." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Utilisateur %(username)s créé." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Utilisateur %(username)s mis à jour." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Modification de l’utilisateur" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "L'utilisateur %(username)s supprimé." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Changer Mot de Passe" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Le mot de passe a été changé." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Un partage existe déjà avec ce nom." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Modification de l’utilisateur" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard est un tunnel VPN rapide, moderne et sécurisé." @@ -10161,9 +10245,9 @@ msgid "" "It can be used to connect to a VPN provider which supports WireGuard, and to " "route all outgoing traffic from {box_name} through the VPN." msgstr "" -"Il peut être utilisé pour se connecter à un fournisseur de réseau privé " -"virtuel VPN proposant un service WireGuard et router tout le trafic sortant " -"de la {box_name} à travers ce VPN." +"Vous pouvez l’utiliser avec un fournisseur de réseau privé virtuel VPN " +"proposant un service WireGuard pour router tout le trafic sortant de la " +"{box_name} à travers ce VPN." #: plinth/modules/wireguard/__init__.py:26 #, python-brace-format @@ -10172,7 +10256,7 @@ msgid "" "travelling. While connected to a public Wi-Fi network, all traffic can be " "securely relayed through {box_name}." msgstr "" -"Une autre usage possible est de connecter un appareil mobile à votre " +"Vous pouvez également l’utiliser pour connecter un appareil mobile à votre " "{box_name} pendant un déplacement. Même si votre appareil est connecté à un " "réseau Wi-Fi public, tout votre trafic sera alors relayé via votre " "{box_name} de manière sécurisée." @@ -10182,14 +10266,12 @@ msgid "Invalid key." msgstr "Clé invalide." #: plinth/modules/wireguard/forms.py:63 -#, fuzzy -#| msgid "Enter a valid username." msgid "Enter a valid IPv4 address." -msgstr "Entrez un nom d’utilisateur valide." +msgstr "Veuillez saisir une adresse IPv4 valide." #: plinth/modules/wireguard/forms.py:65 msgid "Enter a valid network prefix or net mask." -msgstr "" +msgstr "Veuillez saisir un préfixe réseau ou un masque de sous-réseau valide." #: plinth/modules/wireguard/forms.py:71 #: plinth/modules/wireguard/templates/wireguard.html:29 @@ -10236,11 +10318,6 @@ msgid "Client IP address provided by server" msgstr "Adresse IP du client fournie par le serveur" #: plinth/modules/wireguard/forms.py:94 -#, fuzzy -#| msgid "" -#| "IP address assigned to this machine on the VPN after connecting to the " -#| "endpoint. This value is usually provided by the server operator. Example: " -#| "192.168.0.10." msgid "" "IP address assigned to this machine on the VPN after connecting to the " "endpoint. This value is usually provided by the server operator. Example: " @@ -10250,7 +10327,9 @@ msgid "" msgstr "" "Adresse IP attribuée à cette machine sur le réseau privé virtuel VPN une " "fois connectée au serveur distant. Cette valeur est généralement fournie par " -"l’opérateur du serveur. Par exemple : 192.18.0.10." +"l’opérateur du serveur. Par exemple : 192.18.0.10. Vous pouvez également " +"spécifier le réseau. Cela vous permettra d’atteindre les machines de ce " +"réseau. Par exemple : 10.68.12.43/24 ou 10.68.12.43/255.255.255.0." #: plinth/modules/wireguard/forms.py:102 msgid "Private key of this machine" @@ -10303,34 +10382,30 @@ msgid "As a Server" msgstr "En tant que serveur" #: plinth/modules/wireguard/templates/wireguard.html:17 -#, fuzzy, python-format -#| msgid "Endpoints for this %(box_name)s:" +#, python-format msgid "Information for this %(box_name)s:" -msgstr "Points de terminaison de cette %(box_name)s :" +msgstr "Informations de cette %(box_name)s :" #: plinth/modules/wireguard/templates/wireguard.html:25 msgid "Property" -msgstr "" +msgstr "Propriété" #: plinth/modules/wireguard/templates/wireguard.html:26 msgid "Value" -msgstr "" +msgstr "Valeur" #: plinth/modules/wireguard/templates/wireguard.html:33 -#, fuzzy -#| msgid "Endpoint" msgid "Endpoint(s)" -msgstr "Serveur distant" +msgstr "Terminaison(s)" #: plinth/modules/wireguard/templates/wireguard.html:41 -#, fuzzy, python-format -#| msgid "To %(box_name)s Ports" +#, python-format msgid "%(box_name)s VPN IP for services" -msgstr "Vers les ports %(box_name)s" +msgstr "IP VPN de la %(box_name)s pour les services" #: plinth/modules/wireguard/templates/wireguard.html:50 msgid "Peers" -msgstr "" +msgstr "Pairs" #: plinth/modules/wireguard/templates/wireguard.html:52 msgid "Peers allowed to connect to this server:" @@ -10362,10 +10437,8 @@ msgid "Add Allowed Client" msgstr "Ajouter un client autorisé" #: plinth/modules/wireguard/templates/wireguard.html:97 -#, fuzzy -#| msgid "WireGuard server started successfully." msgid "WireGuard server not started yet." -msgstr "Le serveur WireGuard a été démarré." +msgstr "Le serveur WireGuard n’a pas encore démarré." #: plinth/modules/wireguard/templates/wireguard.html:101 #: plinth/modules/wireguard/templates/wireguard.html:103 @@ -10456,7 +10529,7 @@ msgstr "Clé publique du serveur :" #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 msgid "Server VPN IP address for services:" -msgstr "" +msgstr "Adresse IP VPN du serveur pour les services :" #: plinth/modules/wireguard/templates/wireguard_show_client.html:58 #: plinth/modules/wireguard/templates/wireguard_show_server.html:64 @@ -10498,7 +10571,7 @@ msgstr "Adresse IP de cette machine :" #: plinth/modules/wireguard/templates/wireguard_show_server.html:46 msgid "All outgoing traffic is sent using this connection:" -msgstr "" +msgstr "L’ensemble du trafic sortant est envoyé à travers cette connexion :" #: plinth/modules/wireguard/views.py:54 msgid "Added new client." @@ -10765,20 +10838,21 @@ msgstr "Aucune réponse du gestionnaire de paquets" #: plinth/settings.py:181 msgid "Uniquely identify your user account with username" msgstr "" +"Identifiez votre compte utilisateur de manière unique par un nom " +"d’utilisateur" #: plinth/settings.py:183 -#, fuzzy -#| msgid "requesting address" msgid "View email address" -msgstr "demande d’adresse en cours" +msgstr "Voir l’adresse de courriel" #: plinth/settings.py:185 msgid "View basic profile information (such as name and email)" msgstr "" +"Voir les informations de base du profil (telles que le nom et le courriel)" #: plinth/settings.py:187 msgid "View permissions that account has" -msgstr "" +msgstr "Voir les permissions attribuées à ce compte" #: plinth/setup.py:44 msgid "Installing app" @@ -10962,22 +11036,28 @@ msgid " System" msgstr " Système" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Configurer des alias" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Changer le mot de passe" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Éteindre" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Se déconnecter" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Choisir la langue" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "S’identifier" @@ -11015,7 +11095,7 @@ msgstr "Mobile" #: plinth/templates/clients.html:82 msgid "Android APK" -msgstr "" +msgstr "APK pour Android" #: plinth/templates/clients.html:91 msgid "Play Store" @@ -11236,15 +11316,15 @@ msgstr "" "L’ensemble données de l’appli et sa configuration seront définitivement " "perdus. Un appli peut toujours être réinstallée de zéro." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "Ici" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Paramètre inchangé" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "avant la désinstallation de {app_id}" diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index 11171677d..06e6d02d5 100644 --- a/plinth/locale/gl/LC_MESSAGES/django.po +++ b/plinth/locale/gl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2022-12-30 10:51+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Galician ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +msgid "Delete passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9433,22 +9538,26 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +msgid "Manage passkeys" +msgstr "" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9685,15 +9794,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -9734,11 +9843,6 @@ msgstr "" #~ msgid "Server URL" #~ msgstr "Servidor web" -#, fuzzy -#~| msgid "Manual" -#~ msgid "Updates" -#~ msgstr "Manual" - #, fuzzy #~| msgid "Manual" #~ msgctxt "Not automatically" diff --git a/plinth/locale/gu/LC_MESSAGES/django.po b/plinth/locale/gu/LC_MESSAGES/django.po index a1dae81a9..a929e7ce6 100644 --- a/plinth/locale/gu/LC_MESSAGES/django.po +++ b/plinth/locale/gu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Gujarati ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +msgid "Delete passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9928,24 +10041,30 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Documentation" +msgid "Manage passkeys" +msgstr "દસ્તાવેજીકરણ" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 #, fuzzy #| msgid "Language" msgid "Select language" msgstr "ભાષા" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -10193,15 +10312,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "સેટિંગ યથાવત" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/hi/LC_MESSAGES/django.po b/plinth/locale/hi/LC_MESSAGES/django.po index 3cdbfd4f1..aadef7d20 100644 --- a/plinth/locale/hi/LC_MESSAGES/django.po +++ b/plinth/locale/hi/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" -"PO-Revision-Date: 2025-12-16 01:15+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" +"PO-Revision-Date: 2026-03-31 06:09+0000\n" "Last-Translator: bsurajpatra \n" "Language-Team: Hindi \n" @@ -17,7 +17,7 @@ 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 5.15.1-dev\n" +"X-Generator: Weblate 5.17-dev\n" #: plinth/config.py:103 #, python-brace-format @@ -30,7 +30,7 @@ msgstr "स्थैतिक कॉन्फ़िगरेशन {etc_path} msgid "Container {container_name} is running" msgstr "सेवा {service_name} चल रहा है" -#: plinth/context_processors.py:21 plinth/views.py:175 +#: plinth/context_processors.py:21 plinth/views.py:180 msgid "FreedomBox" msgstr "स्वतंत्रता बॉक्स" @@ -345,6 +345,7 @@ msgstr "यूसर बनाये" #: plinth/modules/networks/templates/connection_show.html:76 #: plinth/modules/samba/templates/samba.html:66 #: plinth/modules/sharing/templates/sharing.html:33 +#: plinth/modules/users/templates/users_passkeys.html:92 msgid "Name" msgstr "नाम" @@ -2256,6 +2257,7 @@ msgstr "आइपी एेड्रैस" #: plinth/modules/dynamicdns/templates/dynamicdns.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:27 #: plinth/modules/storage/templates/storage.html:29 +#: plinth/modules/users/templates/users_passkeys.html:96 msgid "Actions" msgstr "एक्सआयन" @@ -3536,8 +3538,8 @@ msgstr "" msgid "Contribute" msgstr "" -#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:222 -#: plinth/templates/base.html:225 plinth/templates/help-menu.html:47 +#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:229 +#: plinth/templates/base.html:232 plinth/templates/help-menu.html:47 #: plinth/templates/help-menu.html:48 plinth/templates/index.html:96 #, fuzzy msgid "About" @@ -3692,6 +3694,7 @@ msgstr "" #: plinth/modules/help/templates/help_contribute.html:43 #: plinth/modules/power/templates/power_restart.html:27 #: plinth/modules/power/templates/power_shutdown.html:26 +#: plinth/modules/users/templates/users_passkeys.html:77 #: plinth/templates/app-header.html:67 msgid "Learn more..." msgstr "और सीखिये..." @@ -4134,7 +4137,7 @@ msgstr "" #: plinth/modules/janus/templates/janus_video_room.html:192 #: plinth/modules/jsxc/templates/jsxc_launch.html:117 -#: plinth/templates/base.html:282 +#: plinth/templates/base.html:289 msgid "JavaScript license information" msgstr "जावास्क्रिप्ट लाइसेंस जानकारी" @@ -6077,12 +6080,18 @@ msgstr "कनेक्शन संपादित करें" #: plinth/modules/networks/templates/connections_fields.html:14 #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:64 +#: plinth/modules/users/templates/users_login.html:26 +#: plinth/modules/users/templates/users_passkeys.html:26 +#: plinth/modules/users/templates/users_passkeys.html:54 #: plinth/templates/messages.html:15 msgid "Error:" msgstr "" #: plinth/modules/networks/templates/connections_fields.html:21 -#: plinth/modules/users/templates/users_update.html:50 +#: plinth/modules/users/templates/users_login.html:33 +#: plinth/modules/users/templates/users_passkeys.html:33 +#: plinth/modules/users/templates/users_passkeys.html:140 +#: plinth/modules/users/templates/users_update.html:55 #: plinth/templates/messages.html:31 msgid "Close" msgstr "" @@ -7112,8 +7121,8 @@ msgstr "" msgid "Shutdown" msgstr "शट डाउन" -#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:187 -#: plinth/templates/base.html:188 +#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:194 +#: plinth/templates/base.html:195 msgid "Restart" msgstr "रीस्टार्ट" @@ -9935,7 +9944,7 @@ msgstr "पासवर्ड सहेजें" #: plinth/modules/users/templates/users_create.html:19 #: plinth/modules/users/templates/users_list.html:16 #: plinth/modules/users/templates/users_list.html:18 -#: plinth/modules/users/views.py:109 +#: plinth/modules/users/views.py:134 msgid "Create User" msgstr "यूसर बनाये" @@ -9984,7 +9993,7 @@ msgid "Skip this step" msgstr "" #: plinth/modules/users/templates/users_list.html:12 -#: plinth/modules/users/views.py:127 +#: plinth/modules/users/views.py:152 msgid "Users" msgstr "यूसरस" @@ -9993,17 +10002,115 @@ msgstr "यूसरस" msgid "Edit user %(username)s" msgstr "यूसर संपादित करें %(username)s" -#: plinth/modules/users/templates/users_login.html:23 +#: plinth/modules/users/templates/users_login.html:30 +msgid "Logging in with passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_login.html:41 +#: plinth/modules/users/templates/users_passkeys.html:41 +#, fuzzy +#| msgid "This module does not support diagnostics" +msgid "Browser does not support passkeys." +msgstr "यह मॉड्यूल निदानिकी कि नहीं समर्थन करता है" + +#: plinth/modules/users/templates/users_login.html:57 msgid "Login" msgstr "लॉगिन" +#: plinth/modules/users/templates/users_login.html:70 +#: plinth/modules/users/templates/users_login.html:72 +msgid "Log in with passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkey_edit.html:19 +#, fuzzy +#| msgid "Update setup" +msgid "Update Passkey" +msgstr "सेटअप अपडेट" + +#: plinth/modules/users/templates/users_passkeys.html:30 +msgid "Adding passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:48 +#: plinth/modules/users/views.py:314 +msgid "Passkeys" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:57 +msgid "" +"Working with passkeys requires using browser's Javascript API. Please enable " +"Javascript support in your browser to continue." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:66 +msgid "" +"Passkeys are way to verify user's identity using digital signatures. They " +"are a more secure alternative to passwords. Secret information is kept with " +"the user on their phone, laptop, or a hardware token and unlocked using a " +"PIN, fingerprint, or face ID. No secrets are stored on the server. The " +"server knows only the public information that can used to verify user's " +"signatures." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:83 +#: plinth/modules/users/templates/users_passkeys.html:85 +#, fuzzy +#| msgid "Add password" +msgid "Add passkey" +msgstr "पासवर्ड जोड़ें" + +#: plinth/modules/users/templates/users_passkeys.html:93 +#, fuzzy +#| msgid "Domain" +msgid "For Domain" +msgstr "डोमेन" + +#: plinth/modules/users/templates/users_passkeys.html:94 +msgid "Added" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:95 +#, fuzzy +#| msgid "Last scanned: " +msgid "Last Used" +msgstr "कनेक्शन बनाएँ: " + +#: plinth/modules/users/templates/users_passkeys.html:126 +msgid "No passkeys added to user account." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:135 +msgid "Delete passkey ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete User" +msgid "Delete passkey" +msgstr "यूसर हटाइये" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "कैंसिल" + #: plinth/modules/users/templates/users_update.html:16 #, fuzzy, python-format #| msgid "Edit user %(username)s" msgid "Edit User %(username)s" msgstr "यूसर संपादित करें %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -10012,67 +10119,79 @@ msgstr "" "पासवर्ड बदलने के लिये यइ पासवर्ड बदलना फोम्र का उपयोग करें." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "बदलाव संचयित कीजिये" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, fuzzy, python-format #| msgid "Delete user %(username)s permanently?" msgid "Delete user %(username)s and all the user's files?" msgstr "यूसर %(username)s स्थाई रूप से हटाइये?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete User" msgid "Delete user and files" msgstr "यूसर हटाइये" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "कैंसिल" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 #, fuzzy #| msgid "Password changed successfully." msgid "Logged out successfully." msgstr "पासवर्ड सफलतापूर्वक बदल गया." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "युसर %(username)s बनाया." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "युसर %(username)s अपडेट किया." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "यूसर संपादित करें" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "User %(username)s created." msgid "User %(username)s deleted." msgstr "युसर %(username)s बनाया." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "पासवर्ड बदलिये" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "पासवर्ड सफलतापूर्वक बदल गया." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "इस नाम का एक शयर पहले से मौजूद है." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "यूसर संपादित करें" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -10917,22 +11036,28 @@ msgid " System" msgstr " सिस्टम" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Create User" +msgid "Manage passkeys" +msgstr "यूसर बनाये" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "पासवर्ड बदलें" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "शट डाउन" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "लॉग आउट" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "भाषा चुनें" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "लॉग इन" @@ -10970,7 +11095,7 @@ msgstr "मोबाइल" #: plinth/templates/clients.html:82 msgid "Android APK" -msgstr "" +msgstr "एंड्रॉइड एपीके" #: plinth/templates/clients.html:91 msgid "Play Store" @@ -11201,15 +11326,15 @@ msgstr "" "सभी ऐप डेटा और कॉन्फ़िगरेशन हमेशा के लिए खो जाएंगे। ऐप को फिर से नए सिरे से इंस्टॉल किया " "जा सकता है।" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "यहाँ" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "सेटिंग स्थिर है" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "{app_id} को अनइंस्टॉल करने से पहले" diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index 6ce35d546..371992e0b 100644 --- a/plinth/locale/hu/LC_MESSAGES/django.po +++ b/plinth/locale/hu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2025-06-04 15:01+0000\n" "Last-Translator: András Szűcs " "\n" @@ -31,7 +31,7 @@ msgstr "A statikus konfiguráció {etc_path} megfelelően van beállítva" msgid "Container {container_name} is running" msgstr "A szolgáltatás fut: {service_name}" -#: plinth/context_processors.py:21 plinth/views.py:175 +#: plinth/context_processors.py:21 plinth/views.py:180 msgid "FreedomBox" msgstr "FreedomBox" @@ -355,6 +355,7 @@ msgstr "Tároló" #: plinth/modules/networks/templates/connection_show.html:76 #: plinth/modules/samba/templates/samba.html:66 #: plinth/modules/sharing/templates/sharing.html:33 +#: plinth/modules/users/templates/users_passkeys.html:92 msgid "Name" msgstr "Név" @@ -2259,6 +2260,7 @@ msgstr "IP-cím" #: plinth/modules/dynamicdns/templates/dynamicdns.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:27 #: plinth/modules/storage/templates/storage.html:29 +#: plinth/modules/users/templates/users_passkeys.html:96 msgid "Actions" msgstr "Műveletek" @@ -3511,8 +3513,8 @@ msgstr "Visszajelzés küldése" msgid "Contribute" msgstr "Hozzájárulás" -#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:222 -#: plinth/templates/base.html:225 plinth/templates/help-menu.html:47 +#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:229 +#: plinth/templates/base.html:232 plinth/templates/help-menu.html:47 #: plinth/templates/help-menu.html:48 plinth/templates/index.html:96 msgid "About" msgstr "Névjegy" @@ -3688,6 +3690,7 @@ msgstr "" #: plinth/modules/help/templates/help_contribute.html:43 #: plinth/modules/power/templates/power_restart.html:27 #: plinth/modules/power/templates/power_shutdown.html:26 +#: plinth/modules/users/templates/users_passkeys.html:77 #: plinth/templates/app-header.html:67 msgid "Learn more..." msgstr "Bővebben..." @@ -4152,7 +4155,7 @@ msgstr "" #: plinth/modules/janus/templates/janus_video_room.html:192 #: plinth/modules/jsxc/templates/jsxc_launch.html:117 -#: plinth/templates/base.html:282 +#: plinth/templates/base.html:289 msgid "JavaScript license information" msgstr "JavaScript licencinformáció" @@ -6234,6 +6237,9 @@ msgstr "Kapcsolat szerkesztése" #: plinth/modules/networks/templates/connections_fields.html:14 #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:64 +#: plinth/modules/users/templates/users_login.html:26 +#: plinth/modules/users/templates/users_passkeys.html:26 +#: plinth/modules/users/templates/users_passkeys.html:54 #: plinth/templates/messages.html:15 #, fuzzy #| msgid "error" @@ -6241,7 +6247,10 @@ msgid "Error:" msgstr "hiba" #: plinth/modules/networks/templates/connections_fields.html:21 -#: plinth/modules/users/templates/users_update.html:50 +#: plinth/modules/users/templates/users_login.html:33 +#: plinth/modules/users/templates/users_passkeys.html:33 +#: plinth/modules/users/templates/users_passkeys.html:140 +#: plinth/modules/users/templates/users_update.html:55 #: plinth/templates/messages.html:31 msgid "Close" msgstr "Bezárás" @@ -7275,8 +7284,8 @@ msgstr "" msgid "Shutdown" msgstr "Leállítás" -#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:187 -#: plinth/templates/base.html:188 +#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:194 +#: plinth/templates/base.html:195 msgid "Restart" msgstr "Újraindítás" @@ -10125,7 +10134,7 @@ msgstr "Jelszó mentése" #: plinth/modules/users/templates/users_create.html:19 #: plinth/modules/users/templates/users_list.html:16 #: plinth/modules/users/templates/users_list.html:18 -#: plinth/modules/users/views.py:109 +#: plinth/modules/users/views.py:134 msgid "Create User" msgstr "Felhasználó létrehozása" @@ -10182,7 +10191,7 @@ msgid "Skip this step" msgstr "Lépés kihagyása" #: plinth/modules/users/templates/users_list.html:12 -#: plinth/modules/users/views.py:127 +#: plinth/modules/users/views.py:152 msgid "Users" msgstr "Felhasználók" @@ -10191,16 +10200,114 @@ msgstr "Felhasználók" msgid "Edit user %(username)s" msgstr "%(username)s felhasználó szerkesztése" -#: plinth/modules/users/templates/users_login.html:23 +#: plinth/modules/users/templates/users_login.html:30 +msgid "Logging in with passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_login.html:41 +#: plinth/modules/users/templates/users_passkeys.html:41 +#, fuzzy +#| msgid "This app does not support diagnostics" +msgid "Browser does not support passkeys." +msgstr "Ez az alkalmazás nem támogatja a hibaellenőrzést" + +#: plinth/modules/users/templates/users_login.html:57 msgid "Login" msgstr "Bejelentkezés" +#: plinth/modules/users/templates/users_login.html:70 +#: plinth/modules/users/templates/users_login.html:72 +msgid "Log in with passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkey_edit.html:19 +#, fuzzy +#| msgid "Update setup" +msgid "Update Passkey" +msgstr "Beállítások frissítése" + +#: plinth/modules/users/templates/users_passkeys.html:30 +msgid "Adding passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:48 +#: plinth/modules/users/views.py:314 +msgid "Passkeys" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:57 +msgid "" +"Working with passkeys requires using browser's Javascript API. Please enable " +"Javascript support in your browser to continue." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:66 +msgid "" +"Passkeys are way to verify user's identity using digital signatures. They " +"are a more secure alternative to passwords. Secret information is kept with " +"the user on their phone, laptop, or a hardware token and unlocked using a " +"PIN, fingerprint, or face ID. No secrets are stored on the server. The " +"server knows only the public information that can used to verify user's " +"signatures." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:83 +#: plinth/modules/users/templates/users_passkeys.html:85 +#, fuzzy +#| msgid "Add password" +msgid "Add passkey" +msgstr "Jelszó hozzáadása" + +#: plinth/modules/users/templates/users_passkeys.html:93 +#, fuzzy +#| msgid "Domain" +msgid "For Domain" +msgstr "Domain" + +#: plinth/modules/users/templates/users_passkeys.html:94 +msgid "Added" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:95 +#, fuzzy +#| msgid "Last Connected Time" +msgid "Last Used" +msgstr "Utolsó csatlakozási idő" + +#: plinth/modules/users/templates/users_passkeys.html:126 +msgid "No passkeys added to user account." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:135 +msgid "Delete passkey ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete User" +msgid "Delete passkey" +msgstr "Felhasználó törlése" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Mégse" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "%(username)s felhasználó szerkesztése" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -10209,65 +10316,77 @@ msgstr "" "A jelszó a jelszómódosítási űrlap " "kitöltésével változtatható meg." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Változtatások mentése" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, fuzzy, python-format #| msgid "Delete user %(username)s permanently?" msgid "Delete user %(username)s and all the user's files?" msgstr "%(username)s nevű felhasználó végleges törlése?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete files" msgid "Delete user and files" msgstr "Fájlok törlése" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Mégse" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Sikeres kijelentkezés." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "%(username)s nevű felhasználó létrehozva." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "%(username)s nevű felhasználó frissítve." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Felhasználó szerkesztése" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "User %(username)s created." msgid "User %(username)s deleted." msgstr "%(username)s nevű felhasználó létrehozva." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Jelszómódosítás" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "A jelszó módosítása sikeres." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Egy megosztás ezzel a névvel már létezik." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Felhasználó szerkesztése" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "A WireGuard egy gyors, modern, biztonságos VPN-alagút." @@ -11114,22 +11233,28 @@ msgid " System" msgstr " Rendszer" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Álnevek kezelése" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Jelszómódosítás" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Leállítás" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Kijelentkezés" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Válassz nyelvet" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Bejelentkezés" @@ -11401,15 +11526,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "A beállítás változatlan" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index 74be59b7f..74b13df6b 100644 --- a/plinth/locale/id/LC_MESSAGES/django.po +++ b/plinth/locale/id/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Indonesian (FreedomBox)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Indonesian ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete %(username)s" +msgid "Delete passkey" +msgstr "Pangkar %(username)s" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Batal" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Hapus Wiki atau Blog %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, fuzzy, python-format #| msgid "Edit User %(username)s" msgid "Delete user %(username)s and all the user's files?" msgstr "Hapus Wiki atau Blog %(username)s" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete files" msgid "Delete user and files" msgstr "Hapus file" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Batal" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "User {user} deleted." msgid "User %(username)s deleted." msgstr "Insan {user} dipangkar." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A library with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Perpustakaan dengan nama ini sudah ada." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit Share" +msgid "Edit Passkey" +msgstr "Sunting Bagikan" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -10312,22 +10431,28 @@ msgid " System" msgstr " sistem" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Libraries" +msgid "Manage passkeys" +msgstr "Kelola Perpustakaan" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Ganti kata sandi" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Matikan" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Keluar" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Pilih bahasa" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Masuk" @@ -10583,15 +10708,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index 72dd8dff4..58fae58ac 100644 --- a/plinth/locale/it/LC_MESSAGES/django.po +++ b/plinth/locale/it/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" -"PO-Revision-Date: 2026-02-06 23:01+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" +"PO-Revision-Date: 2026-03-31 06:09+0000\n" "Last-Translator: Pierfrancesco Passerini \n" "Language-Team: Italian \n" @@ -17,7 +17,7 @@ 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 5.16-dev\n" +"X-Generator: Weblate 5.17-dev\n" #: plinth/config.py:103 #, python-brace-format @@ -29,7 +29,7 @@ msgstr "La configurazione statica {etc_path} è impostata correttamente" msgid "Container {container_name} is running" msgstr "Il contenitore {container_name} è in esecuzione" -#: plinth/context_processors.py:21 plinth/views.py:175 +#: plinth/context_processors.py:21 plinth/views.py:180 msgid "FreedomBox" msgstr "FreedomBox" @@ -167,7 +167,7 @@ msgstr "{box_name} Interfaccia Web (Plinth)" #: plinth/modules/apache/__init__.py:129 msgid "Web app protected by FreedomBox" -msgstr "" +msgstr "Web app protetta da FreedomBox" #: plinth/modules/apache/components.py:234 #, python-brace-format @@ -345,6 +345,7 @@ msgstr "Deposito" #: plinth/modules/networks/templates/connection_show.html:76 #: plinth/modules/samba/templates/samba.html:66 #: plinth/modules/sharing/templates/sharing.html:33 +#: plinth/modules/users/templates/users_passkeys.html:92 msgid "Name" msgstr "Nome" @@ -406,10 +407,8 @@ msgid "Passphrase" msgstr "Passphrase" #: plinth/modules/backups/forms.py:187 -#, fuzzy -#| msgid "Passphrase; Only needed when using encryption." msgid "Only needed when using encryption." -msgstr "Passphrase; Necessaria solo quando si utilizza la crittografia." +msgstr "Necessaria solo quando si utilizza la crittografia." #: plinth/modules/backups/forms.py:190 msgid "Confirm Passphrase" @@ -448,44 +447,32 @@ msgstr "" "repo/" #: plinth/modules/backups/forms.py:255 -#, fuzzy -#| msgid "Authentication Mode" msgid "SSH Authentication Type" -msgstr "Modalità Autenticazione" +msgstr "Tipo di autenticazione SSH" #: plinth/modules/backups/forms.py:256 -#, fuzzy -#| msgid "Authentication to remote server failed." msgid "Choose how to authenticate to the remote SSH server." -msgstr "Autenticazione al server remoto fallita." +msgstr "Scegliere la modalità di autenticazione sul server SSH remoto." #: plinth/modules/backups/forms.py:258 -#, fuzzy -#| msgid "needs authentication" msgid "Key-based Authentication" -msgstr "richiede autenticazione" +msgstr "Autenticazione basata su chiave" #: plinth/modules/backups/forms.py:259 -#, fuzzy -#| msgid "Disable password authentication" msgid "Password-based Authentication" -msgstr "Disabilita l'autenticazione con password" +msgstr "Autenticazione basata su password" #: plinth/modules/backups/forms.py:261 msgid "SSH server password" msgstr "Password server SSH" #: plinth/modules/backups/forms.py:262 -#, fuzzy -#| msgid "Disable password authentication" msgid "Required for password-based authentication." -msgstr "Disabilita l'autenticazione con password" +msgstr "Richiesto per l'autenticazione basata su password." #: plinth/modules/backups/forms.py:275 -#, fuzzy -#| msgid "Disable password authentication" msgid "SSH password is needed for password-based authentication." -msgstr "Disabilita l'autenticazione con password" +msgstr "La password SSH è necessaria per l'autenticazione basata su password." #: plinth/modules/backups/forms.py:292 msgid "Remote backup repository already exists." @@ -631,6 +618,9 @@ msgid "" "list on the remote machine for %(box_name)s to be able to connect to the " "remote machine:" msgstr "" +"Per consentire a %(box_name)s di connettersi al computer remoto, è " +"necessario aggiungere la seguente chiave pubblica SSH all'elenco delle " +"chiavi autorizzate sul computer remoto:" #: plinth/modules/backups/templates/backups_add_remote_repository.html:87 #, python-format @@ -639,6 +629,10 @@ msgid "" "successful, then the public key will be automatically added to the " "authorized keys list, so that future connections do not need the password." msgstr "" +"Il servizio %(box_name)s tenterà di connettersi utilizzando la password " +"fornita. In caso di esito positivo, la chiave pubblica verrà automaticamente " +"aggiunta all'elenco delle chiavi autorizzate, in modo che per le connessioni " +"future non sia più necessaria la password." #: plinth/modules/backups/templates/backups_add_remote_repository.html:132 #: plinth/modules/backups/templates/backups_upload.html:29 @@ -817,10 +811,8 @@ msgid "Authentication to remote server failed." msgstr "Autenticazione al server remoto fallita." #: plinth/modules/backups/views.py:50 -#, fuzzy -#| msgid "Error establishing connection to server: {}" msgid "Error establishing connection to server: {} {} {}" -msgstr "Errore di connessione al server: {}" +msgstr "Errore di connessione al server: {} {} {}" #: plinth/modules/backups/views.py:82 msgid "Backup schedule updated." @@ -1464,14 +1456,7 @@ msgid "Webserver Home Page" msgstr "Pagina iniziale del server web" #: plinth/modules/config/forms.py:37 -#, fuzzy, python-brace-format -#| msgid "" -#| "Choose the default page that must be served when someone visits your " -#| "{box_name} on the web. A typical use case is to set your blog or wiki as " -#| "the home page when someone visits the domain name. Note that once the " -#| "home page is set to something other than {box_name} Service (Plinth), " -#| "your users must explicitly type /plinth or /freedombox to reach " -#| "{box_name} Service (Plinth)." +#, python-brace-format msgid "" "Choose the default page that must be served when someone visits your " "{box_name} on the web. A typical use case is to set your blog or wiki as the " @@ -1484,7 +1469,7 @@ msgstr "" "il tuo blog o wiki come pagina iniziale quando qualcuno visita il nome del " "dominio. Si noti che una volta che la home page è impostata su qualcosa di " "diverso da {box_name} Service (Plinth), i tuoi utenti devono esplicitamente " -"digitare /plinth o /freedombox per raggiungere {box_name} Service (Plinth)." +"digitare /freedombox per raggiungere {box_name} Service (Plinth)." #: plinth/modules/config/forms.py:48 msgid "Show advanced apps and features" @@ -2145,6 +2130,7 @@ msgstr "Indirizzo IP" #: plinth/modules/dynamicdns/templates/dynamicdns.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:27 #: plinth/modules/storage/templates/storage.html:29 +#: plinth/modules/users/templates/users_passkeys.html:96 msgid "Actions" msgstr "Azioni" @@ -2435,15 +2421,11 @@ msgstr "" "creati automaticamente e puntano al primo utente amministratore." #: plinth/modules/email/__init__.py:41 -#, fuzzy -#| msgid "" -#| "Roundcube app provides web " -#| "interface for users to access email." msgid "" "Roundcube app provides web " "interface for users to access email." msgstr "" -"Roundcube app fornisce " +"Roundcube app fornisce " "un'interfaccia web per l'accesso degli utenti all'email." #: plinth/modules/email/__init__.py:43 @@ -3361,8 +3343,8 @@ msgstr "Invia feedback" msgid "Contribute" msgstr "Collabora" -#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:222 -#: plinth/templates/base.html:225 plinth/templates/help-menu.html:47 +#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:229 +#: plinth/templates/base.html:232 plinth/templates/help-menu.html:47 #: plinth/templates/help-menu.html:48 plinth/templates/index.html:96 msgid "About" msgstr "Informazioni" @@ -3540,6 +3522,7 @@ msgstr "" #: plinth/modules/help/templates/help_contribute.html:43 #: plinth/modules/power/templates/power_restart.html:27 #: plinth/modules/power/templates/power_shutdown.html:26 +#: plinth/modules/users/templates/users_passkeys.html:77 #: plinth/templates/app-header.html:67 msgid "Learn more..." msgstr "Approfondisci..." @@ -4019,7 +4002,7 @@ msgstr "Conferenza Web" #: plinth/modules/janus/templates/janus_video_room.html:192 #: plinth/modules/jsxc/templates/jsxc_launch.html:117 -#: plinth/templates/base.html:282 +#: plinth/templates/base.html:289 msgid "JavaScript license information" msgstr "Informazioni sulla licenza JavaScript" @@ -6036,12 +6019,18 @@ msgstr "Modifica Concessione" #: plinth/modules/networks/templates/connections_fields.html:14 #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:64 +#: plinth/modules/users/templates/users_login.html:26 +#: plinth/modules/users/templates/users_passkeys.html:26 +#: plinth/modules/users/templates/users_passkeys.html:54 #: plinth/templates/messages.html:15 msgid "Error:" msgstr "Errore:" #: plinth/modules/networks/templates/connections_fields.html:21 -#: plinth/modules/users/templates/users_update.html:50 +#: plinth/modules/users/templates/users_login.html:33 +#: plinth/modules/users/templates/users_passkeys.html:33 +#: plinth/modules/users/templates/users_passkeys.html:140 +#: plinth/modules/users/templates/users_update.html:55 #: plinth/templates/messages.html:31 msgid "Close" msgstr "Chiudi" @@ -6242,12 +6231,6 @@ msgstr "" "permettendogli di fornire i servizi." #: plinth/modules/networks/templates/router_configuration_content.html:32 -#, fuzzy -#| msgid "" -#| "If you don't have control over your router, choose not to configure it. " -#| "To see options to overcome this limitation, choose 'I dont have a public " -#| "IP address' option in Internet connection type selection." msgid "" "If you don't have control over your router, choose not to configure it. To " "see options to overcome this limitation, choose 'I dont have a public IP " @@ -6256,9 +6239,9 @@ msgid "" msgstr "" "Se non hai il controllo del tuo router, scegli di non configurarlo. Per " "visualizzare le opzioni capaci di superare questa limitazione, seleziona " -"l’opzione “Non dispongo di un indirizzo IP pubblico” in selezione del tipo di connessione " -"Internet." +"l’opzione “Non dispongo di un indirizzo IP pubblico” in selezione del tipo di " +"connessione Internet." #: plinth/modules/networks/templates/router_configuration_content.html:39 msgid "Choose How You Wish to Configure Your Router" @@ -6664,19 +6647,15 @@ msgstr "" #: plinth/modules/oidc/__init__.py:56 msgid "OpenID Connect Provider" -msgstr "" +msgstr "Fornitore OpenID Connect" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:14 -#, fuzzy -#| msgid "Application enabled" msgid "Application" -msgstr "Applicazione abilitata" +msgstr "Applicazione" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:22 -#, fuzzy -#| msgid "Authorized SSH Keys" msgid "Authorize App" -msgstr "Chiavi SSH autorizzate" +msgstr "Autorizza App" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:37 #, python-format @@ -6684,17 +6663,18 @@ msgid "" "%(app)s wants to access your account %(username)s" msgstr "" +"%(app)s vuole accedere al tuo account " +"%(username)s" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:52 -#, fuzzy, python-format -#| msgid "Authorized SSH Keys" +#, python-format msgid "Authorize %(app)s" -msgstr "Chiavi SSH autorizzate" +msgstr "Autorizza %(app)s" #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:59 #, python-format msgid "Authorizing will redirect to %(url)s" -msgstr "" +msgstr "Autorizzando sarai reindirizzato su %(url)s" #: plinth/modules/openvpn/__init__.py:20 #, python-brace-format @@ -7025,8 +7005,8 @@ msgstr "Riavvia" msgid "Shutdown" msgstr "Spegni" -#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:187 -#: plinth/templates/base.html:188 +#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:194 +#: plinth/templates/base.html:195 msgid "Restart" msgstr "Riavvio" @@ -8121,12 +8101,6 @@ msgstr "" "indicate." #: plinth/modules/snapshot/__init__.py:25 -#, fuzzy -#| msgid "" -#| "Snapshots currently work on btrfs file systems only and on the root " -#| "partition only. Snapshots are not a replacement for backups since they can only be stored on the same " -#| "partition. " msgid "" "Snapshots currently work on btrfs file systems only and on the root " "partition only. Snapshots are not a replacement for backup poiché possono essere salvate solo sulla stessa " "partizione. " @@ -9837,7 +9811,7 @@ msgstr "Salva password" #: plinth/modules/users/templates/users_create.html:19 #: plinth/modules/users/templates/users_list.html:16 #: plinth/modules/users/templates/users_list.html:18 -#: plinth/modules/users/views.py:109 +#: plinth/modules/users/views.py:134 msgid "Create User" msgstr "Crea utente" @@ -9887,7 +9861,7 @@ msgid "Skip this step" msgstr "Salta questo passaggio" #: plinth/modules/users/templates/users_list.html:12 -#: plinth/modules/users/views.py:127 +#: plinth/modules/users/views.py:152 msgid "Users" msgstr "Utenti" @@ -9896,16 +9870,114 @@ msgstr "Utenti" msgid "Edit user %(username)s" msgstr "Modifica l'utente %(username)s" -#: plinth/modules/users/templates/users_login.html:23 +#: plinth/modules/users/templates/users_login.html:30 +msgid "Logging in with passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_login.html:41 +#: plinth/modules/users/templates/users_passkeys.html:41 +#, fuzzy +#| msgid "This app does not support diagnostics" +msgid "Browser does not support passkeys." +msgstr "Questa applicazione non supporta la diagnostica" + +#: plinth/modules/users/templates/users_login.html:57 msgid "Login" msgstr "Login" +#: plinth/modules/users/templates/users_login.html:70 +#: plinth/modules/users/templates/users_login.html:72 +msgid "Log in with passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkey_edit.html:19 +#, fuzzy +#| msgid "Update setup" +msgid "Update Passkey" +msgstr "Aggiorna impostazioni" + +#: plinth/modules/users/templates/users_passkeys.html:30 +msgid "Adding passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:48 +#: plinth/modules/users/views.py:314 +msgid "Passkeys" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:57 +msgid "" +"Working with passkeys requires using browser's Javascript API. Please enable " +"Javascript support in your browser to continue." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:66 +msgid "" +"Passkeys are way to verify user's identity using digital signatures. They " +"are a more secure alternative to passwords. Secret information is kept with " +"the user on their phone, laptop, or a hardware token and unlocked using a " +"PIN, fingerprint, or face ID. No secrets are stored on the server. The " +"server knows only the public information that can used to verify user's " +"signatures." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:83 +#: plinth/modules/users/templates/users_passkeys.html:85 +#, fuzzy +#| msgid "Add password" +msgid "Add passkey" +msgstr "Aggiungi la password" + +#: plinth/modules/users/templates/users_passkeys.html:93 +#, fuzzy +#| msgid "Domain" +msgid "For Domain" +msgstr "Dominio" + +#: plinth/modules/users/templates/users_passkeys.html:94 +msgid "Added" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:95 +#, fuzzy +#| msgid "Last scanned: " +msgid "Last Used" +msgstr "Ultima scansione: " + +#: plinth/modules/users/templates/users_passkeys.html:126 +msgid "No passkeys added to user account." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:135 +msgid "Delete passkey ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Cancella l'utente" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Cancella" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Modifica utente %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9914,17 +9986,17 @@ msgstr "" "Utilizzare il form cambio password " "per modificare la password." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Applica cambiamenti" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "Cancellare l'utente %(username)s e tutti i suoi file?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -9932,45 +10004,57 @@ msgstr "" "L'eliminazione di un account utente rimuove anche la sua home directory. Se " "desideri conservare i suoi file, disabilita l'account anziché eliminarlo." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Cancellare utente e file" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Cancella" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Disconnesso correttamente." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Utente %(username)s creato." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Utente %(username)s aggiornato." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Modifica utente" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "Utente %(username)s cancellato." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Cambia password" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "La password è stata aggiornata." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Una condivisione con questo nome esiste già." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Modifica utente" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard è un tunnel VPN veloce, moderno e sicuro." @@ -10001,14 +10085,12 @@ msgid "Invalid key." msgstr "Chiave non valida." #: plinth/modules/wireguard/forms.py:63 -#, fuzzy -#| msgid "Enter a valid username." msgid "Enter a valid IPv4 address." -msgstr "Inserisci un nome utente valido." +msgstr "Inserisci un indirizzo IPv4 valido." #: plinth/modules/wireguard/forms.py:65 msgid "Enter a valid network prefix or net mask." -msgstr "" +msgstr "Inserisci un prefisso di rete od una netmask validi." #: plinth/modules/wireguard/forms.py:71 #: plinth/modules/wireguard/templates/wireguard.html:29 @@ -10055,11 +10137,6 @@ msgid "Client IP address provided by server" msgstr "Indirizzo IP client fornito dal server" #: plinth/modules/wireguard/forms.py:94 -#, fuzzy -#| msgid "" -#| "IP address assigned to this machine on the VPN after connecting to the " -#| "endpoint. This value is usually provided by the server operator. Example: " -#| "192.168.0.10." msgid "" "IP address assigned to this machine on the VPN after connecting to the " "endpoint. This value is usually provided by the server operator. Example: " @@ -10069,7 +10146,9 @@ msgid "" msgstr "" "Indirizzo IP assegnato a questa macchina sulla VPN dopo la connessione " "all'endpoint. Questo valore è generalmente fornito dal gestore del server. " -"Esempio: 192.168.0.10" +"Esempio: 192.168.0.10. È inoltre possibile specificare la rete. Ciò " +"consentirà di raggiungere le macchine nella rete. Esempi: 10.68.12.43/24 o " +"10.68.12.43/255.255.255.0." #: plinth/modules/wireguard/forms.py:102 msgid "Private key of this machine" @@ -10120,34 +10199,30 @@ msgid "As a Server" msgstr "Come server" #: plinth/modules/wireguard/templates/wireguard.html:17 -#, fuzzy, python-format -#| msgid "Endpoints for this %(box_name)s:" +#, python-format msgid "Information for this %(box_name)s:" -msgstr "Punti di accesso per %(box_name)s:" +msgstr "Informazioni su %(box_name)s:" #: plinth/modules/wireguard/templates/wireguard.html:25 msgid "Property" -msgstr "" +msgstr "Proprietà" #: plinth/modules/wireguard/templates/wireguard.html:26 msgid "Value" -msgstr "" +msgstr "Valore" #: plinth/modules/wireguard/templates/wireguard.html:33 -#, fuzzy -#| msgid "Endpoint" msgid "Endpoint(s)" msgstr "Endpoint" #: plinth/modules/wireguard/templates/wireguard.html:41 -#, fuzzy, python-format -#| msgid "To %(box_name)s Ports" +#, python-format msgid "%(box_name)s VPN IP for services" -msgstr "Alla porta %(box_name)s" +msgstr "VPN IP per i servizi %(box_name)s" #: plinth/modules/wireguard/templates/wireguard.html:50 msgid "Peers" -msgstr "" +msgstr "Nodi" #: plinth/modules/wireguard/templates/wireguard.html:52 msgid "Peers allowed to connect to this server:" @@ -10177,10 +10252,8 @@ msgid "Add Allowed Client" msgstr "Aggiungi client autorizzato" #: plinth/modules/wireguard/templates/wireguard.html:97 -#, fuzzy -#| msgid "WireGuard server started successfully." msgid "WireGuard server not started yet." -msgstr "Il server WireGuard è stato correttamente avviato." +msgstr "Il server WireGuard non è stato ancora avviato." #: plinth/modules/wireguard/templates/wireguard.html:101 #: plinth/modules/wireguard/templates/wireguard.html:103 @@ -10271,7 +10344,7 @@ msgstr "Chiave pubblica del server:" #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 msgid "Server VPN IP address for services:" -msgstr "" +msgstr "Indirizzo IP VPN server per i servizi:" #: plinth/modules/wireguard/templates/wireguard_show_client.html:58 #: plinth/modules/wireguard/templates/wireguard_show_server.html:64 @@ -10313,7 +10386,7 @@ msgstr "Indirizzo IP di questa macchina:" #: plinth/modules/wireguard/templates/wireguard_show_server.html:46 msgid "All outgoing traffic is sent using this connection:" -msgstr "" +msgstr "Tutto il traffico in uscita utilizza questo collegamento:" #: plinth/modules/wireguard/views.py:54 msgid "Added new client." @@ -10575,21 +10648,19 @@ msgstr "Timeout in attesa del gestore di pacchetti" #: plinth/settings.py:181 msgid "Uniquely identify your user account with username" -msgstr "" +msgstr "Identifica univocamente il tuo account con il nome utente" #: plinth/settings.py:183 -#, fuzzy -#| msgid "requesting address" msgid "View email address" -msgstr "acquisizione indirizzo in corso" +msgstr "Visualizza indirizzo email" #: plinth/settings.py:185 msgid "View basic profile information (such as name and email)" -msgstr "" +msgstr "Visualizza le informazioni base del profilo (come nome ed email)" #: plinth/settings.py:187 msgid "View permissions that account has" -msgstr "" +msgstr "Visualizza le autorizzazioni dell'account" #: plinth/setup.py:44 msgid "Installing app" @@ -10771,22 +10842,28 @@ msgid " System" msgstr " Sistema" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Gestire gli alias" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Cambia password" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Spegni" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Esci" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Seleziona la lingua" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Accedi" @@ -10824,7 +10901,7 @@ msgstr "Mobile" #: plinth/templates/clients.html:82 msgid "Android APK" -msgstr "" +msgstr "Android APK" #: plinth/templates/clients.html:91 msgid "Play Store" @@ -11040,15 +11117,15 @@ msgstr "" "Tutti i dati e le configurazioni dell'app verranno rimossi definitivamente. " "L'app potrà essere reinstallata da zero." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "Qui" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Impostazioni invariate" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "Prima della disinstallazione di {app_id}" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index 03b04c427..389b80828 100644 --- a/plinth/locale/ja/LC_MESSAGES/django.po +++ b/plinth/locale/ja/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2025-10-24 16:02+0000\n" "Last-Translator: Jun Nogata \n" "Language-Team: Japanese ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +msgid "Delete passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "キャンセル" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "変更を保存" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "キャンセル" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "ユーザーを編集" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "パスワードを変更" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "ユーザーを編集" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9364,22 +9473,28 @@ msgid " System" msgstr " システム" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Change password" +msgid "Manage passkeys" +msgstr "パスワードを変更" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "パスワードを変更" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "シャットダウン" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "ログアウト" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9612,15 +9727,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/kn/LC_MESSAGES/django.po b/plinth/locale/kn/LC_MESSAGES/django.po index dcc8ae620..d9b9b65c2 100644 --- a/plinth/locale/kn/LC_MESSAGES/django.po +++ b/plinth/locale/kn/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2020-07-16 16:41+0000\n" "Last-Translator: Yogesh \n" "Language-Team: Kannada ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +msgid "Delete passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9361,22 +9464,26 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +msgid "Manage passkeys" +msgstr "" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9609,15 +9716,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/lt/LC_MESSAGES/django.po b/plinth/locale/lt/LC_MESSAGES/django.po index dcb42bf42..a2c786cfc 100644 --- a/plinth/locale/lt/LC_MESSAGES/django.po +++ b/plinth/locale/lt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Lithuanian ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +msgid "Delete passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9385,22 +9488,26 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +msgid "Manage passkeys" +msgstr "" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9633,15 +9740,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/lv/LC_MESSAGES/django.po b/plinth/locale/lv/LC_MESSAGES/django.po index 95b7a57a4..1fd66c799 100644 --- a/plinth/locale/lv/LC_MESSAGES/django.po +++ b/plinth/locale/lv/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Latvian ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +msgid "Delete passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9384,22 +9487,26 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +msgid "Manage passkeys" +msgstr "" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9632,15 +9739,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index 6ee4ad83f..029022e49 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2024-10-27 23:30+0000\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Norwegian Bokmål ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete User" +msgid "Delete passkey" +msgstr "Slett bruker" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Kanseller" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Rediger bruker %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -10095,67 +10202,79 @@ msgstr "" "Bruk passordsendringsskjemaet for å " "endre passordet." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Lagre endringer" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, fuzzy, python-format #| msgid "Delete user %(username)s permanently?" msgid "Delete user %(username)s and all the user's files?" msgstr "Slett bruker %(username)s for godt?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete files" msgid "Delete user and files" msgstr "Slett filer" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Kanseller" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 #, fuzzy #| msgid "Password changed successfully." msgid "Logged out successfully." msgstr "Vellykket passordbytte." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Bruker %(username)s opprettet." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Oppdaterte bruker %(username)s." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Rediger bruker" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "User %(username)s created." msgid "User %(username)s deleted." msgstr "Bruker %(username)s opprettet." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Endre passord" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Vellykket passordbytte." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "En deling ved dette navnet finnes allerede." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Rediger bruker" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard er en rask, moderne og sikker VPN-tunnel." @@ -10992,22 +11111,28 @@ msgid " System" msgstr " System" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Libraries" +msgid "Manage passkeys" +msgstr "Håndter biblioteker" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Endre passord" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Slå av" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Logg ut" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Velg språk" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Logg inn" @@ -11274,15 +11399,15 @@ msgstr "" "All programdata og oppsett blir permanent borte. Programmet kan installeres " "på nytt igjen." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Oppsett uendret" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "før avinstallering av {app_id}" diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index dabdf22d1..e77275d99 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2025-09-17 09:01+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Gebruiker verwijderen" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Annuleer" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Gebruiker %(username)s wijzigen" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9774,61 +9881,73 @@ msgstr "" "Gebruik het wachtwoord wijzigingsformulier " " om het wachtwoord te veranderen." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Wijzigingen opslaan" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "Gebruiker %(username)s en al diens bestanden verwijderen?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Gebruikers en bestanden verwijderen" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Annuleer" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Succesvol uitgelogd." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Gebruiker %(username)s aangemaakt." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Gebruiker %(username)s bijgewerkt." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Gebruiker wijzigen" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "Gebruiker %(username)s verwijderd." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Wijzig wachtwoord" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Wachtwoord succesvol gewijzigd." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Er bestaat al een gedeelde map met deze naam." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Gebruiker wijzigen" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard is een snelle, moderne en veilige VPN-tunnel." @@ -10649,22 +10768,28 @@ msgid " System" msgstr " Systeem" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Aliassen beheren" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Wijzig wachtwoord" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Uitschakelen" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Afmelden" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Selecteer taal" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Aanmelden" @@ -10923,15 +11048,15 @@ msgstr "" "Alle toepassings-gegevens en configuratie gaan permanent verloren. de " "toepassing kan opnieuw vers worden geïnstalleerd." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "Hier" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Instelling onveranderd" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "voor het verwijderen van {app_id}" diff --git a/plinth/locale/pl/LC_MESSAGES/django.po b/plinth/locale/pl/LC_MESSAGES/django.po index 191862d0c..26f9da000 100644 --- a/plinth/locale/pl/LC_MESSAGES/django.po +++ b/plinth/locale/pl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2024-07-13 12:09+0000\n" "Last-Translator: Monika \n" "Language-Team: Polish ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete" +msgid "Delete passkey" +msgstr "Usuń" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Anuluj" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Edytuj Użytkownika %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, fuzzy, python-format #| msgid "Edit User %(username)s" msgid "Delete user %(username)s and all the user's files?" msgstr "Edytuj Użytkownika %(username)s" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete files" msgid "Delete user and files" msgstr "Usuń pliki" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Anuluj" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 #, fuzzy #| msgid "Partition expanded successfully." msgid "Logged out successfully." msgstr "Partycja rozszerzona." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "{name} deleted." msgid "User %(username)s deleted." msgstr "Usunięto {name}." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "Remote backup repository already exists." +msgid "Passkey with that identifier already exists." +msgstr "Zdalne repozytorium już istnieje." + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -10327,24 +10444,30 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Create Repository" +msgid "Manage passkeys" +msgstr "Utwórz repozytorium" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Zmień hasło" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Wyłącz" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Wyloguj się" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 #, fuzzy #| msgid "Language" msgid "Select language" msgstr "Język" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Zaloguj się" @@ -10603,15 +10726,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Ustawienie bez zmian" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index 4735a7e85..c7bfe5ded 100644 --- a/plinth/locale/pt/LC_MESSAGES/django.po +++ b/plinth/locale/pt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2025-04-09 22:41+0000\n" "Last-Translator: tuliogit \n" "Language-Team: Portuguese ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Excluir usuário" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Cancelar" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Editar utilizador %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9957,19 +10064,19 @@ msgstr "" "Use o formulário de alteração de senha para alterar a senha." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Salvar alterações" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" "Excluir o usuário <em>%(username)s</em> e todos os arquivos do " "usuário?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -9978,45 +10085,57 @@ msgstr "" "inicial do usuário. Se desejar manter esses arquivos, desative a conta de " "usuário." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Excluir usuário e arquivos" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Cancelar" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Sessão terminada com sucesso." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Usuário %(username)s criado." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Usuário %(username)s atualizado." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Editar usuário" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "Usuário %(username)s excluído." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Alterar a senha" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Senha alterada com sucesso." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Já existe um compartilhamento com esse nome." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Editar usuário" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "O WireGuard é um túnel VPN rápido, moderno e seguro." @@ -10829,22 +10948,28 @@ msgid " System" msgstr " Sistema" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Gerenciar aliases" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Alterar palavra-passe" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Desligar" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Terminar sessão" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Selecionar idioma" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Iniciar sessão" @@ -11103,15 +11228,15 @@ msgstr "" "Todos os dados e configurações do aplicativo serão perdidos permanentemente. " "O aplicativo poderá ser instalado novamente." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "Aqui" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Definição inalterada" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "antes da desinstalação do {app_id}" diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index 68f29623e..2b41c94df 100644 --- a/plinth/locale/ru/LC_MESSAGES/django.po +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2026-03-15 18:09+0000\n" "Last-Translator: OwlGale \n" "Language-Team: Russian ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Удалить пользователя" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Отмена" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Редактировать пользователя %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9889,17 +9996,17 @@ msgstr "" "Для смены пароля используйте форму Изменить пароль." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Сохранить изменения" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "Удалить пользователя %(username)s и все его файлы?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -9908,45 +10015,57 @@ msgstr "" "домашнего каталога. Если вы хотите сохранить эти файлы, отключите учетную " "запись пользователя." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Удаление пользователя и файлов" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Отмена" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Выход выполнен успешно." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Пользователь %(username)s создан." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Пользователь %(username)s обновлен." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Редактирование пользователя" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "Пользователь %(username)s удален." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Изменить пароль" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Пароль успешно изменён." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Общий ресурс с таким именем уже существует." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Редактирование пользователя" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard - это быстрый, современный и безопасный VPN-туннель." @@ -10751,22 +10870,28 @@ msgid " System" msgstr " Система" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Управление псевдонимами" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Изменить пароль" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Завершить работу" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Выход" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Выбрать язык" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Войти" @@ -11020,15 +11145,15 @@ msgstr "" "Все данные и настройки приложения будут безвозвратно утеряны. Приложение " "можно установить заново." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "Здесь" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Настройки без изменений" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "перед удалением {app_id}" diff --git a/plinth/locale/si/LC_MESSAGES/django.po b/plinth/locale/si/LC_MESSAGES/django.po index 1d277bef5..1db9a3d73 100644 --- a/plinth/locale/si/LC_MESSAGES/django.po +++ b/plinth/locale/si/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2021-04-27 13:32+0000\n" "Last-Translator: HelaBasa \n" "Language-Team: Sinhala ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +msgid "Delete passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9359,22 +9462,26 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +msgid "Manage passkeys" +msgstr "" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9607,15 +9714,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/sl/LC_MESSAGES/django.po b/plinth/locale/sl/LC_MESSAGES/django.po index 3e3659e99..017dab92a 100644 --- a/plinth/locale/sl/LC_MESSAGES/django.po +++ b/plinth/locale/sl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Slovenian ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete Archive" +msgid "Delete passkey" +msgstr "Izbriši arhiv" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Prekliči" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete Archive" msgid "Delete user and files" msgstr "Izbriši arhiv" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Prekliči" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "Archive deleted." msgid "User %(username)s deleted." msgstr "Arhiv je izbrisan." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "Create remote backup repository" +msgid "Passkey with that identifier already exists." +msgstr "Ustvari oddaljeno skladišče za rezervne kopije" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9853,22 +9962,28 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Create new repository" +msgid "Manage passkeys" +msgstr "Ustvari novo skladišče" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -10108,15 +10223,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/sq/LC_MESSAGES/django.po b/plinth/locale/sq/LC_MESSAGES/django.po index 4fb023ed9..4a3293286 100644 --- a/plinth/locale/sq/LC_MESSAGES/django.po +++ b/plinth/locale/sq/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2026-03-26 09:09+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Fshi përdorues" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Anuloje" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Përpunoni Përdoruesin %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9907,17 +10014,17 @@ msgstr "" "href=\"%(change_password_url)s\">formularin e ndryshimit të fjalëkalimeve." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Ruaji Ndryshimet" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "Të fshihet përdoruesi %(username)s dhe krejt kartelat e përdoruesit?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -9926,45 +10033,57 @@ msgstr "" "të përdoruesit. Nëse dëshironi t’i mbani këto kartela, më mirë çaktivizoni " "llogarinë e përdoruesit." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Fshini përdorues dhe kartela" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Anuloje" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "U dol me sukses." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Përdoruesi %(username)s u krijua." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Përdoruesi %(username)s u përditësua." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Përpunoni Përdorues" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "Përdoruesi %(username)s u fshi." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Ndryshoni Fjalëkalimin" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Fjalëkalimi u ndryshua me sukses." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Ka tashmë një pjesë me këtë emër." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Përpunoni Përdorues" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard-i është një tunel VPN i shpejtë, modern, i sigurt." @@ -10754,22 +10873,28 @@ msgid " System" msgstr " Sistem" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Administroni Aliase" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Ndryshoni fjalëkalimin" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Fike" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Dil" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Përzgjidhni gjuhën" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Hyni" @@ -11022,15 +11147,15 @@ msgstr "" "Krejt të dhënat dhe formësimi i aplikacionit do të humbin përgjithnjë. " "Aplikacioni mund të instalohet sërish nga e para." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "Këtu" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Rregullim i pandryshuar" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "para çinstalimit të {app_id}" diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index 38bd1cfa3..e3b02b284 100644 --- a/plinth/locale/sr/LC_MESSAGES/django.po +++ b/plinth/locale/sr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Serbian ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete Archive" +msgid "Delete passkey" +msgstr "Izbriši arhivu" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete Archive" msgid "Delete user and files" msgstr "Izbriši arhivu" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +msgid "Passkey with that identifier already exists." +msgstr "" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9684,22 +9791,26 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +msgid "Manage passkeys" +msgstr "" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -9938,15 +10049,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index a75192d59..a8dedde3f 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2026-03-11 22:09+0000\n" "Last-Translator: Daniel Wiik \n" "Language-Team: Swedish ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Radera användare" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Avbryt" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Redigera användare %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9815,17 +9922,17 @@ msgstr "" "Använd ändra lösenord för att ändra " "lösenordet." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Spara ändringar" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "Ta bort användaren %(username)s och alla användarens filer?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -9834,45 +9941,57 @@ msgstr "" "hemkatalog. Om du vill behålla dessa filer, inaktivera användarkontot " "istället." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Ta bort användare och filer" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Avbryt" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Du har loggat ut framgångsrikt." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Användaren %(username)s skapades." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Användaren %(username)s har uppdaterats." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Redigera användar" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "Användare %(username)s raderades." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Ändra lösenord" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Lösenordet har ändrats." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Det finns redan en share med det här namnet." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Redigera användar" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard är en snabb, modern, säker VPN-tunnel." @@ -10658,22 +10777,28 @@ msgid " System" msgstr " System" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Hantera alias" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Ändra lösenord" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Stänga ner" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Logga ut" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Välj språk" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Logga in" @@ -10928,15 +11053,15 @@ msgstr "" "All appdata och konfiguration kommer att gå förlorad permanent. Appen kan " "installeras på nytt igen." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "Här" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Instänllningar oförändrade" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "innan du avinstallerar {app_id}" diff --git a/plinth/locale/ta/LC_MESSAGES/django.po b/plinth/locale/ta/LC_MESSAGES/django.po index 51943b9cd..b48f2ec58 100644 --- a/plinth/locale/ta/LC_MESSAGES/django.po +++ b/plinth/locale/ta/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2026-03-02 19:53+0000\n" "Last-Translator: James Valleroy \n" "Language-Team: Tamil ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "பயனரை நீக்கு" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "ரத்துசெய்" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "பயனர் %(username)s ஐத் திருத்தவும்" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9761,17 +9868,17 @@ msgstr "" "கடவுச்சொல்லை மாற்ற கடவுச்சொல் படிவத்தை " "மாற்றவும் ஐப் பயன்படுத்தவும்." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "மாற்றங்களைச் சேமிக்கவும்" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "பயனர் %(username)s மற்றும் பயனரின் அனைத்து கோப்புகளையும் நீக்கு?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -9779,45 +9886,57 @@ msgstr "" "ஒரு பயனர் கணக்கை நீக்குவது பயனரின் வீட்டு அடைவு அனைத்து கோப்புகளையும் நீக்குகிறது. இந்த " "கோப்புகளை வைத்திருக்க விரும்பினால், அதற்கு பதிலாக பயனர் கணக்கை முடக்கவும்." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "பயனர் மற்றும் கோப்புகளை நீக்கவும்" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "ரத்துசெய்" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "வெற்றிகரமாக உள்நுழைந்தது." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "பயனர் %(username)s உருவாக்கப்பட்டது." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "பயனர் %(username)s புதுப்பிக்கப்பட்டன." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "பயனரைத் திருத்து" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "பயனர் %(username)s நீக்கப்பட்டன." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "கடவுச்சொல்லை மாற்றவும்" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "கடவுச்சொல் வெற்றிகரமாக மாற்றப்பட்டது." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "இந்த பெயருடன் ஒரு பங்கு ஏற்கனவே உள்ளது." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "பயனரைத் திருத்து" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "வயர்கார்ட் ஒரு வேகமான, நவீன, பாதுகாப்பான விபிஎன் சுரங்கப்பாதை." @@ -10607,22 +10726,28 @@ msgid " System" msgstr " அமைப்பு" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "மாற்றுப்பெயர்களை நிர்வகிக்கவும்" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "கடவுச்சொல்லை மாற்றவும்" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "மூடு" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "விடுபதிகை" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "மொழியைத் தேர்ந்தெடுக்கவும்" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "புகுபதிகை" @@ -10872,15 +10997,15 @@ msgstr "" "அனைத்து பயன்பாட்டு தரவு மற்றும் உள்ளமைவும் நிரந்தரமாக இழக்கப்படும். பயன்பாடு மீண்டும் " "புதிதாக நிறுவப்படலாம்." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "இங்கே" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "மாறாமல் அமைத்தல்" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "{app_id} ஐ நிறுவல் நீக்குவதற்கு முன்" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index 96f1f6b70..06b8edc64 100644 --- a/plinth/locale/te/LC_MESSAGES/django.po +++ b/plinth/locale/te/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2025-05-14 17:03+0000\n" "Last-Translator: Sripath Roy Koganti \n" "Language-Team: Telugu ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "వినియోగదారుని తొలగించు" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "రద్దుచేయి" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "వినియోగదారు%(username)sని సవరించండి" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9580,17 +9687,17 @@ msgstr "" "పాస్వర్డ్ను మార్చడానికి పాస్వర్డ్ మాచ్రు ఫారంని " "ఉపయోగించండి." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "మార్పులను భద్రపరుచు" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "%(username)s వినియోగదారుని శాశ్వతంగా తొలగించు?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -9598,45 +9705,57 @@ msgstr "" "వినియోగదారు ఖాతాను తొలగించడం వలన వినియోగదారు హోమ్ డైరెక్టరీలోని అన్ని ఫైల్‌లు కూడా తొలగించబడతాయి. మీరు ఈ " "ఫైల్‌లను ఉంచాలనుకుంటే, బదులుగా వినియోగదారు ఖాతాను నిలిపివేయండి." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "వినియోగదారు మరియు ఫైల్‌లను తొలగించండి" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "రద్దుచేయి" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "విజయవంతంగా లాగ్ అవుట్ చేయబడింది." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "వినియోగదారి %(username)s సృష్టించబడ్డారు." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "వినియోగదారి %(username)s నావీకరించబడ్డాడు." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "వినియోగదారి మార్పు" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "వినియోగదారు %(username)s తొలగించబడ్డారు." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "పాస్‌వర్డ్ మార్చు" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "పాస్‌వర్డ్ విజయవంతంగా మార్చబడినది." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "ఈ పేరుతో ఒక వాటా ఇప్పటికే ఉంది." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "వినియోగదారి మార్పు" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "వైర్‌గార్డ్ వేగవంతమైన, ఆధునిక, సురక్షితమైన వపన్ సొరంగం." @@ -10427,22 +10546,28 @@ msgid " System" msgstr " కార్యవ్యవస్థ" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "మారుపేర్లను నిర్వహించండి" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "పాస్స్ వర్ద మార్చుము" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "మూసివేయి" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "నిష్క్రమించు" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "బాషను ఎంచుకోండి" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "లోనికి ప్రవేశించండి" @@ -10696,15 +10821,15 @@ msgid "" "installed freshly again." msgstr "మొత్తం యాప్ డేటా మరియు కాన్ఫిగరేషన్ శాశ్వతంగా పోతాయి. యాప్ను మళ్లీ తాజాగా ఇన్‌స్టాల్ చేయవచ్చు." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "ఇక్కడ" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "మారకుండా అమర్చుతోంది" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "{app_id} ని అన్ఇన్‌స్టాల్ చేయడానికి ముందు" diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index d86062a46..79ad526ed 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2026-03-25 07:09+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Kullanıcıyı sil" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "İptal" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "%(username)s Kullanıcısını Düzenleyin" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9842,18 +9949,18 @@ msgstr "" "Parolayı değiştirmek için parola " "değiştirme formunu kullanın." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Değişiklikleri Kaydet" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" "%(username)s kullanıcısı ve kullanıcının tüm dosyaları silinsin mi?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -9862,45 +9969,57 @@ msgstr "" "tüm dosyaları da kaldırır. Eğer bu dosyaları saklamak istiyorsanız, bunun " "yerine kullanıcı hesabını etkisizleştirin." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Kullanıcı ve dosyaları sil" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "İptal" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Başarılı olarak oturumu kapatıldı." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "%(username)s kullanıcısı oluşturuldu." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "%(username)s kullanıcısı güncellendi." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Kullanıcıyı Düzenle" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "%(username)s kullanıcısı silindi." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Parolayı Değiştir" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Parola başarılı olarak değiştirildi." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Bu ada sahip bir paylaşım zaten var." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Kullanıcıyı Düzenle" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard hızlı, modern ve güvenli bir VPN tünelidir." @@ -10683,22 +10802,28 @@ msgid " System" msgstr " Sistem" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Kod Adlarını Yönet" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Parolayı değiştir" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Kapat" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Oturumu kapat" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Dil seçin" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Oturum aç" @@ -10952,15 +11077,15 @@ msgstr "" "Tüm uygulama verileri ve yapılandırması kalıcı olarak kaybolacaktır. " "Uygulama tekrar yeni olarak yüklenebilir." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "Burada" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Ayar değişmedi" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "{app_id} kaldırılmadan önce" diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index 5cdc86abb..e8337d0f8 100644 --- a/plinth/locale/uk/LC_MESSAGES/django.po +++ b/plinth/locale/uk/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2025-12-17 07:00+0000\n" "Last-Translator: Максим Горпиніч \n" "Language-Team: Ukrainian ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "Видалити користувача" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "Скасувати" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "Зміни користувача %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " @@ -9870,17 +9977,17 @@ msgstr "" "Щоб змінити пароль використовуйте форму " "зміни пароля." -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "Зберегти зміни" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "Видалити користувача %(username)s і всі файли користувача?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." @@ -9889,45 +9996,57 @@ msgstr "" "каталогу користувача. Якщо ви хочете зберегти ці файли, замість цього " "вимкніть обліковий запис користувача." -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "Видалити користувача та файли" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "Скасувати" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "Вийшли успішно." -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "Створено користувача %(username)s." -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "Користувача %(username)s оновлено." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "Зміни користувача" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "Користувача %(username)s видалено." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "Зберегти пароль" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "Пароль змінено успішно." +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Ділянка з такою назвою вже існує." + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "Зміни користувача" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "WireGuard — це швидкий, сучасний, безпечний тунель VPN." @@ -10725,22 +10844,28 @@ msgid " System" msgstr " Система" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "Керування псевдонімами" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "Змінити пароль" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "Вимкнути" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "Вийти" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "Вибрати мову" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "Увійти" @@ -10993,15 +11118,15 @@ msgstr "" "Усі дані програми та налаштування буде втрачено назавжди. Застосунок можна " "встановити начисто ще раз." -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "тут" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "Налаштування не змінено" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "перед видаленням {app_id}" diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po index 86d70aea7..ee329fbed 100644 --- a/plinth/locale/vi/LC_MESSAGES/django.po +++ b/plinth/locale/vi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2021-07-28 08:34+0000\n" "Last-Translator: bruh \n" "Language-Team: Vietnamese ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete" +msgid "Delete passkey" +msgstr "Xoá" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete files" msgid "Delete user and files" msgstr "Xoá tệp" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "{name} deleted." msgid "User %(username)s deleted." msgstr "Đã xoá {name}." -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A library with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "Một thư viện có tên này đã tồn tại." + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9856,22 +9971,28 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Libraries" +msgid "Manage passkeys" +msgstr "Quản lý thư viện" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -10113,15 +10234,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index b80ab0aa1..57c30d2b4 100644 --- a/plinth/locale/zh_Hans/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hans/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2026-03-04 05:09+0000\n" "Last-Translator: 大王叫我来巡山 " "\n" @@ -30,7 +30,7 @@ msgstr "" msgid "Container {container_name} is running" msgstr "{container_name} 容器正在运行" -#: plinth/context_processors.py:21 plinth/views.py:175 +#: plinth/context_processors.py:21 plinth/views.py:180 msgid "FreedomBox" msgstr "FreedomBox" @@ -332,6 +332,7 @@ msgstr "存储库" #: plinth/modules/networks/templates/connection_show.html:76 #: plinth/modules/samba/templates/samba.html:66 #: plinth/modules/sharing/templates/sharing.html:33 +#: plinth/modules/users/templates/users_passkeys.html:92 msgid "Name" msgstr "名称" @@ -2031,6 +2032,7 @@ msgstr "IP 地址" #: plinth/modules/dynamicdns/templates/dynamicdns.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:27 #: plinth/modules/storage/templates/storage.html:29 +#: plinth/modules/users/templates/users_passkeys.html:96 msgid "Actions" msgstr "行动" @@ -3136,8 +3138,8 @@ msgstr "" msgid "Contribute" msgstr "贡献" -#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:222 -#: plinth/templates/base.html:225 plinth/templates/help-menu.html:47 +#: plinth/modules/help/__init__.py:53 plinth/templates/base.html:229 +#: plinth/templates/base.html:232 plinth/templates/help-menu.html:47 #: plinth/templates/help-menu.html:48 plinth/templates/index.html:96 msgid "About" msgstr "关于" @@ -3286,6 +3288,7 @@ msgstr "" #: plinth/modules/help/templates/help_contribute.html:43 #: plinth/modules/power/templates/power_restart.html:27 #: plinth/modules/power/templates/power_shutdown.html:26 +#: plinth/modules/users/templates/users_passkeys.html:77 #: plinth/templates/app-header.html:67 msgid "Learn more..." msgstr "了解更多……" @@ -3706,7 +3709,7 @@ msgstr "" #: plinth/modules/janus/templates/janus_video_room.html:192 #: plinth/modules/jsxc/templates/jsxc_launch.html:117 -#: plinth/templates/base.html:282 +#: plinth/templates/base.html:289 msgid "JavaScript license information" msgstr "" @@ -5457,12 +5460,18 @@ msgstr "编辑连接" #: plinth/modules/networks/templates/connections_fields.html:14 #: plinth/modules/oidc/templates/oauth2_provider/authorize.html:64 +#: plinth/modules/users/templates/users_login.html:26 +#: plinth/modules/users/templates/users_passkeys.html:26 +#: plinth/modules/users/templates/users_passkeys.html:54 #: plinth/templates/messages.html:15 msgid "Error:" msgstr "错误:" #: plinth/modules/networks/templates/connections_fields.html:21 -#: plinth/modules/users/templates/users_update.html:50 +#: plinth/modules/users/templates/users_login.html:33 +#: plinth/modules/users/templates/users_passkeys.html:33 +#: plinth/modules/users/templates/users_passkeys.html:140 +#: plinth/modules/users/templates/users_update.html:55 #: plinth/templates/messages.html:31 msgid "Close" msgstr "" @@ -6349,8 +6358,8 @@ msgstr "" msgid "Shutdown" msgstr "关闭" -#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:187 -#: plinth/templates/base.html:188 +#: plinth/modules/power/templates/power.html:15 plinth/templates/base.html:194 +#: plinth/templates/base.html:195 msgid "Restart" msgstr "重新启动" @@ -8783,7 +8792,7 @@ msgstr "保存密码" #: plinth/modules/users/templates/users_create.html:19 #: plinth/modules/users/templates/users_list.html:16 #: plinth/modules/users/templates/users_list.html:18 -#: plinth/modules/users/views.py:109 +#: plinth/modules/users/views.py:134 msgid "Create User" msgstr "创建用户" @@ -8827,7 +8836,7 @@ msgid "Skip this step" msgstr "" #: plinth/modules/users/templates/users_list.html:12 -#: plinth/modules/users/views.py:127 +#: plinth/modules/users/views.py:152 msgid "Users" msgstr "用户" @@ -8836,77 +8845,187 @@ msgstr "用户" msgid "Edit user %(username)s" msgstr "编辑用户 %(username)s" -#: plinth/modules/users/templates/users_login.html:23 +#: plinth/modules/users/templates/users_login.html:30 +msgid "Logging in with passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_login.html:41 +#: plinth/modules/users/templates/users_passkeys.html:41 +#, fuzzy +#| msgid "This app does not support diagnostics" +msgid "Browser does not support passkeys." +msgstr "此应用程序不支持诊断" + +#: plinth/modules/users/templates/users_login.html:57 msgid "Login" msgstr "登录" +#: plinth/modules/users/templates/users_login.html:70 +#: plinth/modules/users/templates/users_login.html:72 +msgid "Log in with passkey" +msgstr "" + +#: plinth/modules/users/templates/users_passkey_edit.html:19 +#, fuzzy +#| msgid "Update setup" +msgid "Update Passkey" +msgstr "更新安装程序" + +#: plinth/modules/users/templates/users_passkeys.html:30 +msgid "Adding passkey failed: " +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:48 +#: plinth/modules/users/views.py:314 +msgid "Passkeys" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:57 +msgid "" +"Working with passkeys requires using browser's Javascript API. Please enable " +"Javascript support in your browser to continue." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:66 +msgid "" +"Passkeys are way to verify user's identity using digital signatures. They " +"are a more secure alternative to passwords. Secret information is kept with " +"the user on their phone, laptop, or a hardware token and unlocked using a " +"PIN, fingerprint, or face ID. No secrets are stored on the server. The " +"server knows only the public information that can used to verify user's " +"signatures." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:83 +#: plinth/modules/users/templates/users_passkeys.html:85 +#, fuzzy +#| msgid "Add password" +msgid "Add passkey" +msgstr "添加密码" + +#: plinth/modules/users/templates/users_passkeys.html:93 +#, fuzzy +#| msgid "Domain" +msgid "For Domain" +msgstr "域名" + +#: plinth/modules/users/templates/users_passkeys.html:94 +msgid "Added" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:95 +#, fuzzy +#| msgid "Last scanned: " +msgid "Last Used" +msgstr "上次扫描: " + +#: plinth/modules/users/templates/users_passkeys.html:126 +msgid "No passkeys added to user account." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:135 +msgid "Delete passkey ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete user" +msgid "Delete passkey" +msgstr "删除用户" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "取消" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "编辑用户 %(username)s" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "使用 更改密码表单 更改密码。" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "保存更改" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "删除用户 %(username)s 及该用户所有文件?" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 msgid "Delete user and files" msgstr "删除用户和文件" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "取消" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "已成功退出登录。" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "用户 %(username)s 已创建。" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "用户 %(username)s 已更新。" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "编辑用户" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, python-format msgid "User %(username)s deleted." msgstr "用户 %(username)s 已被删除。" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "更改密码" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "已成功更改密码。" +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A share with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "已存在同名共享。" + +#: plinth/modules/users/views.py:431 +#, fuzzy +#| msgid "Edit User" +msgid "Edit Passkey" +msgstr "编辑用户" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9617,22 +9736,28 @@ msgid " System" msgstr " 系统" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "管理别名" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "更改密码" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "关闭" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "登出" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "选择语言" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "登录" @@ -9868,15 +9993,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "设置未改变" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index 3e48f7e26..b98cf07ee 100644 --- a/plinth/locale/zh_Hant/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-24 00:03+0000\n" +"POT-Creation-Date: 2026-04-07 00:12+0000\n" "PO-Revision-Date: 2025-02-07 12:01+0000\n" "Last-Translator: pesder \n" "Language-Team: Chinese (Traditional Han script) ?" +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:145 +msgid "You will need this passkey's device to add it back again." +msgstr "" + +#: plinth/modules/users/templates/users_passkeys.html:152 +#, fuzzy +#| msgid "Delete" +msgid "Delete passkey" +msgstr "刪除" + +#: plinth/modules/users/templates/users_passkeys.html:155 +#: plinth/modules/users/templates/users_update.html:72 +msgid "Cancel" +msgstr "" + #: plinth/modules/users/templates/users_update.html:16 #, python-format msgid "Edit User %(username)s" msgstr "" -#: plinth/modules/users/templates/users_update.html:24 +#: plinth/modules/users/templates/users_update.html:23 +#, python-format +msgid "Use passkeys for better security." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:29 #, python-format msgid "" "Use the change password form to " "change the password." msgstr "" -#: plinth/modules/users/templates/users_update.html:36 +#: plinth/modules/users/templates/users_update.html:41 #: plinth/templates/language-selection.html:17 msgid "Save Changes" msgstr "" -#: plinth/modules/users/templates/users_update.html:45 +#: plinth/modules/users/templates/users_update.html:50 #, python-format msgid "Delete user %(username)s and all the user's files?" msgstr "" -#: plinth/modules/users/templates/users_update.html:55 +#: plinth/modules/users/templates/users_update.html:60 msgid "" "Deleting a user account also removes all the files user's home directory. If " "you wish to keep these files, disable the user account instead." msgstr "" -#: plinth/modules/users/templates/users_update.html:64 +#: plinth/modules/users/templates/users_update.html:69 #, fuzzy #| msgid "Delete files" msgid "Delete user and files" msgstr "刪除檔案" -#: plinth/modules/users/templates/users_update.html:67 -msgid "Cancel" -msgstr "" - -#: plinth/modules/users/views.py:87 +#: plinth/modules/users/views.py:112 msgid "Logged out successfully." msgstr "" -#: plinth/modules/users/views.py:107 +#: plinth/modules/users/views.py:132 #, python-format msgid "User %(username)s created." msgstr "" -#: plinth/modules/users/views.py:138 +#: plinth/modules/users/views.py:163 #, python-format msgid "User %(username)s updated." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:164 msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:177 +#: plinth/modules/users/views.py:202 #, fuzzy, python-format #| msgid "{name} deleted." msgid "User %(username)s deleted." msgstr "{name} 已刪除。" -#: plinth/modules/users/views.py:196 +#: plinth/modules/users/views.py:221 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:197 +#: plinth/modules/users/views.py:222 msgid "Password changed successfully." msgstr "" +#: plinth/modules/users/views.py:420 +#, fuzzy +#| msgid "A library with this name already exists." +msgid "Passkey with that identifier already exists." +msgstr "已存在同樣名稱的圖書館。" + +#: plinth/modules/users/views.py:431 +msgid "Edit Passkey" +msgstr "" + +#: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 +msgid "Passkey used is not known." +msgstr "" + #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." msgstr "" @@ -9755,22 +9870,28 @@ msgid " System" msgstr "" #: plinth/templates/base.html:179 plinth/templates/base.html:180 +#, fuzzy +#| msgid "Manage Aliases" +msgid "Manage passkeys" +msgstr "別名" + +#: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" msgstr "" -#: plinth/templates/base.html:193 plinth/templates/base.html:194 +#: plinth/templates/base.html:200 plinth/templates/base.html:201 msgid "Shut down" msgstr "" -#: plinth/templates/base.html:204 plinth/templates/base.html:242 +#: plinth/templates/base.html:211 plinth/templates/base.html:249 msgid "Log out" msgstr "" -#: plinth/templates/base.html:213 plinth/templates/base.html:216 +#: plinth/templates/base.html:220 plinth/templates/base.html:223 msgid "Select language" msgstr "" -#: plinth/templates/base.html:231 plinth/templates/base.html:233 +#: plinth/templates/base.html:238 plinth/templates/base.html:240 msgid "Log in" msgstr "" @@ -10013,15 +10134,15 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:89 +#: plinth/views.py:94 msgid "Here" msgstr "" -#: plinth/views.py:431 +#: plinth/views.py:436 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:654 +#: plinth/views.py:659 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/log.py b/plinth/log.py index d77a66d5d..02d23c917 100644 --- a/plinth/log.py +++ b/plinth/log.py @@ -5,6 +5,7 @@ Setup logging for the application. import logging import logging.config +import sys import typing import warnings @@ -158,5 +159,11 @@ def get_configuration(): } } } + if not sys.stdin.isatty(): + # If running on a console, say due to user manually starting it, then + # log everything to console. However, if we are running as a systemd + # unit then no need to log to console. This allows us to capture + # stdout/stderr in systemd unit without repeating the log messages. + configuration['root']['handlers'].remove('console') return configuration diff --git a/plinth/migrations/0006_userpasskey.py b/plinth/migrations/0006_userpasskey.py new file mode 100644 index 000000000..b32b228bb --- /dev/null +++ b/plinth/migrations/0006_userpasskey.py @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later + +# +# Generated by Django 4.2.28 on 2026-03-19 23:52 +# +""" +Django migration for adding the user's passkey model. +""" + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('plinth', '0005_storednotification'), + ] + + operations = [ + migrations.CreateModel( + name='UserPasskey', + fields=[ + ('id', + models.AutoField(auto_created=True, primary_key=True, + serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=256, null=True, + blank=True)), + ('domain', models.CharField(max_length=256)), + ('created_time', models.DateTimeField(auto_now_add=True)), + ('last_used_time', models.DateTimeField(auto_now=True)), + ('signature_counter', models.IntegerField(default=0)), + ('registration_flags', models.IntegerField()), + ('extensions', models.JSONField(null=True, blank=True)), + ('aaguid', models.UUIDField(null=True, blank=True)), + ('credential_id', models.BinaryField(unique=True)), + ('public_key', models.BinaryField()), + ('user', + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, + related_name='passkeys', + to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/plinth/models.py b/plinth/models.py index ad0c7c91a..37d24ed4c 100644 --- a/plinth/models.py +++ b/plinth/models.py @@ -44,6 +44,28 @@ class UserProfile(models.Model): language = models.CharField(max_length=32, null=True, default=None) +class UserPasskey(models.Model): + """Model to store passkeys for a user account.""" + user = models.ForeignKey(settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, related_name='passkeys') + + # Relying Party information + name = models.CharField(max_length=256, null=True, blank=True) + domain = models.CharField(max_length=256) + created_time = models.DateTimeField(auto_now_add=True) + last_used_time = models.DateTimeField(auto_now=True) + + # Authenticator data + signature_counter = models.IntegerField(default=0) + registration_flags = models.IntegerField() + extensions = models.JSONField(null=True, blank=True) + + # Credential data + aaguid = models.UUIDField(null=True, blank=True) + credential_id = models.BinaryField(unique=True) + public_key = models.BinaryField() + + @receiver(models.signals.post_save, sender=User) def _on_user_post_save(sender, instance, **kwargs): """When the user model is saved, user profile too.""" diff --git a/plinth/modules/users/forms.py b/plinth/modules/users/forms.py index 7ac9e8d03..5dab50054 100644 --- a/plinth/modules/users/forms.py +++ b/plinth/modules/users/forms.py @@ -36,7 +36,7 @@ class AuthenticationForm(DjangoAuthenticationForm): self.fields['username'].widget.attrs.update({ 'autofocus': 'autofocus', 'autocapitalize': 'none', - 'autocomplete': 'username' + 'autocomplete': 'username webauthn' }) diff --git a/plinth/modules/users/static/passkeys.js b/plinth/modules/users/static/passkeys.js new file mode 100644 index 000000000..36528cc7c --- /dev/null +++ b/plinth/modules/users/static/passkeys.js @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +/** + * @licstart The following is the entire license notice for the JavaScript + * code in this page. + * + * This file is part of FreedomBox. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * @licend The above is the entire license notice for the JavaScript code + * in this page. + */ + +/* + * Decode a given base64 encoded (in web-mode) string to a binary array. + */ +function base64WebDecode(base64WebString) { + let base64String = base64WebString + .replaceAll('-', '+') + .replaceAll('_', '/'); + const padding = base64String.length % 4; + if (padding != 0) { + base64String += '='.repeat(4 - padding); + } + + const binaryString = atob(base64String); + const binaryArray = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + binaryArray[i] = binaryString.charCodeAt(i); + } + + return binaryArray; +} + +/* + * Show an error as an bootstrap alert message and print to browser debug + * console. + */ +function handleError(error_string, exception) { + console.log(error_string, exception); + const template = document.getElementById('passkey-message-template'); + template.querySelector('.message').innerText = exception.toString(); + const messages = document.getElementById('passkey-messages'); + messages.insertAdjacentHTML('beforeEnd', template.innerHTML); +} + +/* + * Make a window.fetch() request and handle some common errors. + */ +async function jsonFetch(relative_url, options, operation) { + let response, json = null; + const consoleError = 'Could not perform operation: ' + operation; + try { + const url = new URL(relative_url, window.location.href); + response = await window.fetch(url, options); + json = await response.json(); + } catch (error) { + handleError(consoleError, error); + return null; + } + + if (response.ok && json) { + return json; + } + + if (json && json['error_string']) { + handleError(consoleError, json['error_string']); + } else { + handleError(consoleError, `${response.status}: ${response.statusText}`); + } + + return null; +} + +/* + * Add a passkey. First send a request to the server to begin passkey creation + * and get challenge and creation options. Then request the browser to talk to + * the authenticator to create a passkey. Finally, pass the public key of the + * newly create passkey along with creation results to the server. + */ +async function addPasskey(csrfToken) { + console.log('Adding passkey'); + + if (!window.PublicKeyCredential) { + const message = document.getElementById( + 'browser-does-not-support-passkeys').innerText.trim(); + handleError('Browser does not support passkeys', message); + return; + } + + // + // Request challenge and options from server. + // + let options = await jsonFetch('add-begin/', { + 'method': 'POST', + body: new URLSearchParams({'csrfmiddlewaretoken': csrfToken}) + }, 'initiate passkey registration'); + if (!options) { + return; + } + + options['publicKey']['user']['id'] = base64WebDecode( + options['publicKey']['user']['id']); + options['publicKey']['challenge'] = base64WebDecode( + options['publicKey']['challenge']); + + // + // Create new key pair on the authenticator (via the browser). + // + let credential; + try { + credential = await navigator.credentials.create( + {'publicKey': options['publicKey']}); + } catch (error) { + handleError('Passkey registration failed.', error); + return; + } + + // + // Send the public key and authenticator response to the server for + // verification and storage. + // + let completeResponse = await jsonFetch('add-complete/', { + 'method': 'POST', + 'headers': { + 'Content-Type': 'application/json', + 'X-CSRFToken': csrfToken + }, + 'body': JSON.stringify(credential), + }, 'passkey registration'); + if (!completeResponse) { + return; + } + + console.log('Passkey registration succeeded.'); + window.location.reload(); +}; + +/* + * Show a confirmation dialog to the user to delete a passkey. + */ +function onPasskeyDeleteClicked(event) { + const modalElement = document.getElementById('passkey-delete-confirm-dialog'); + const modal = new bootstrap.Modal(modalElement); + + const passkeyElement = event.target.closest('.passkey'); + const nameElements = modalElement.querySelectorAll('.passkey-name'); + nameElements.forEach((element) => { + element.innerText = passkeyElement.dataset.passkeyName; + }); + modalElement.dataset.passkeyId = passkeyElement.dataset.passkeyId; + + event.preventDefault(); + modal.show(); +} + +/* + * Send request to the server to delete a passkey by submitting a form (and + * refreshing the page). + */ +function onPasskeyDeleteConfirmed(event) { + const modelElement = document.getElementById('passkey-delete-confirm-dialog'); + const passkeyId = modelElement.dataset.passkeyId; + const form = document.querySelector( + `[data-passkey-id="${passkeyId}"] .form-passkey-delete`); + form.submit(); +} + +/* + * Attach event handler to 'Add Passkey', 'Delete Passkey', and 'Confirm Delete' + * buttons. Retrieve CSRF token and pass it along. + */ +document.addEventListener('DOMContentLoaded', () => { + const addPasskeyButton = document.getElementById('add-passkey'); + if (!addPasskeyButton) { + // Not part of the Manage Passkeys page. + return; + } + + const csrfToken = document.getElementsByName('csrfmiddlewaretoken')[0].value; + + addPasskeyButton.addEventListener('click', async (event) => { + event.preventDefault(); + await addPasskey(csrfToken); + }); + + const deleteButtons = document.querySelectorAll( + '.passkey-delete-button'); + deleteButtons.forEach((element) => { + element.addEventListener('click', onPasskeyDeleteClicked); + }); + + const confirmDeleteButton = document.querySelector( + '#passkey-delete-confirm-dialog .confirm'); + confirmDeleteButton.addEventListener('click', onPasskeyDeleteConfirmed); +}); + + +let passkeyLoginAbortController = null; + +/* + * Login with a passkey. First send a request to the server to begin logging in + * with passkey and get challenge and login operation options. Then request the + * browser to talk to the authenticator to sign the challenge with a passkey. + * Finally, pass the challenge signed with a known passkey along with other + * results to the server. + */ +async function loginWithPasskey(conditionalMediation, csrfToken, next) { + console.log('Signing in with a passkey. Conditional mediation: ', + conditionalMediation); + + if (!window.PublicKeyCredential) { + if (!conditionalMediation) { + const message = document.getElementById( + 'browser-does-not-support-passkeys').innerText.trim(); + handleError('Browser does not support passkeys', message); + } + return; + } + + // + // Request challenge and options from server. + // + const options = await jsonFetch('passkey-begin/', { + 'method': 'POST', + body: new URLSearchParams({'csrfmiddlewaretoken': csrfToken}) + }, 'initiate passkey login'); + if (!options) { + return; + } + + options['publicKey']['challenge'] = base64WebDecode( + options['publicKey']['challenge']); + + // Abort a previous login operation (such as conditional mediation operation + // if it is running). Firefox automatically does this but Chrome does not. + if (passkeyLoginAbortController) { + console.log('Explicitly aborting previous passkey login operation.'); + passkeyLoginAbortController.abort(); + } + + passkeyLoginAbortController = new AbortController(); + + // + // Sign the server challenge with passkey stored in authenticator (via the + // browser). + // + let credential; + try { + const getOptions = { + 'publicKey': options['publicKey'], + 'signal': passkeyLoginAbortController.signal + }; + if (conditionalMediation) { + getOptions['mediation'] = 'conditional'; + } + credential = await navigator.credentials.get(getOptions); + } catch (error) { + if (conditionalMediation && error.name == 'AbortError') { + // When user clicks on 'Log in with passkey', the process initiated + // with conditional mediation will be aborted. + console.log('Log in initiated with button, ' + + 'conditional mediation aborted.'); + return; + } + if (!conditionalMediation) { + // Don't show error message or retry. + handleError('Login with passkey failed.', error); + } + return; + } + + // Send the signature and the authenticator response to the server to + // complete the login process. + let completeResponse = await jsonFetch('passkey-complete/', { + 'method': 'POST', + 'headers': { + 'Content-Type': 'application/json', + 'X-CSRFToken': csrfToken + }, + 'body': JSON.stringify(credential), + }, 'login with passkey'); + if (!completeResponse) { + return; + } + + console.log('Login with passkey succeeded.'); + window.location.href = next; +} + +/* + * Attach an click event listener to 'Log in with passkey' button. + */ +document.addEventListener('DOMContentLoaded', async () => { + const loginWithPasskeyButton = document.getElementById('login-with-passkey'); + if (!loginWithPasskeyButton) { + // Not part of login page. + return; + } + + const csrfToken = document.getElementsByName('csrfmiddlewaretoken')[0].value; + const next = document.getElementsByName('next')[0].value; + loginWithPasskeyButton.addEventListener('click', async (event) => { + event.preventDefault(); + await loginWithPasskey(false, csrfToken, next); + }); + + // Login with conditional mediation. This means that user will see a + // 'passkey' option with autofill in the username field. The login method + // will be wait in the navigator.credentials.get() call until user selects + // that option. Don't await. + loginWithPasskey(true, csrfToken, next); +}); diff --git a/plinth/modules/users/static/users.css b/plinth/modules/users/static/users.css new file mode 100644 index 000000000..21501a5f2 --- /dev/null +++ b/plinth/modules/users/static/users.css @@ -0,0 +1,7 @@ +/* +# SPDX-License-Identifier: AGPL-3.0-or-later +*/ + +.operations form { + display: inline; +} diff --git a/plinth/modules/users/templates/users_login.html b/plinth/modules/users/templates/users_login.html index e1774b884..91bc9068a 100644 --- a/plinth/modules/users/templates/users_login.html +++ b/plinth/modules/users/templates/users_login.html @@ -5,12 +5,46 @@ {% load bootstrap %} {% load i18n %} +{% load static %} +{% load extras %} {% block breadcrumbs %} {% endblock %} +{% block page_js %} + +{% endblock %} + {% block content %} +
+ +
+ +
+
+ {% trans "Browser does not support passkeys." %} +
+
+ +
+
+