diff --git a/debian/changelog b/debian/changelog index eedadf9b5..a3b624c3c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,52 @@ +freedombox (26.7.1) unstable; urgency=medium + + [ Frederico Gomes ] + * radicale: Enable lc_username for case-insensitive auth + + [ Sunil Mohan Adapa ] + * radicale, bepasty: Fix issue with failed diagnostic test + * radicale: Fix issue with parsing new configuration file + * radicale: tests: functional: Better checking for well-known URLs + + [ James Valleroy ] + * locale: Update translation strings + * doc: Fetch latest manual + + -- James Valleroy Tue, 28 Apr 2026 18:26:38 -0400 + +freedombox (26.7) unstable; urgency=medium + + [ Burak Yavuz ] + * Translated using Weblate (Turkish) + + [ Besnik Bleta ] + * Translated using Weblate (Albanian) + + [ 大王叫我来巡山 ] + * Translated using Weblate (Chinese (Simplified Han script)) + + [ Dietmar ] + * Translated using Weblate (German) + * Translated using Weblate (Italian) + + [ Jiří Podhorecký ] + * Translated using Weblate (Czech) + + [ bittin1ddc447d824349b2 ] + * Translated using Weblate (Swedish) + + [ Coucouf ] + * Translated using Weblate (French) + + [ Pierfrancesco Passerini ] + * Translated using Weblate (Italian) + + [ James Valleroy ] + * debian: tests: Add test to access interface status + * doc: Fetch latest manual + + -- James Valleroy Mon, 20 Apr 2026 20:25:51 -0400 + freedombox (26.6~bpo13+1) trixie-backports; urgency=medium * Rebuild for trixie-backports. diff --git a/debian/tests/access-web-interface b/debian/tests/access-web-interface new file mode 100644 index 000000000..34e70530a --- /dev/null +++ b/debian/tests/access-web-interface @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e + +# Wait for FreedomBox setup to complete. +sleep 30 + +journalctl --unit=plinth --unit=freedombox-privileged + +# Get FreedomBox status +curl --location --cookie "" --fail --write-out "%{response_code}" --insecure \ + --stderr - https://localhost/freedombox/status/ + +# Access FreedomBox interface +curl --location --cookie "" --fail --write-out "%{response_code}" --insecure \ + --stderr - https://localhost/freedombox/ diff --git a/debian/tests/control b/debian/tests/control index 87e9e7256..c36b03ecd 100644 --- a/debian/tests/control +++ b/debian/tests/control @@ -16,3 +16,13 @@ Restrictions: needs-root, breaks-testbed Test-Command: PYTHONPATH='/usr/lib/python3/dist-packages/' py.test-3 -p no:cacheprovider --cov=plinth --cov-report=html:debci/htmlcov --cov-report=term Depends: e2fsprogs, git, python3-pytest, python3-pytest-cov, python3-pytest-django, @ Restrictions: breaks-testbed + +# +# Try to access the FreedomBox web interface. +# +# iptables package installs alternatives files, with iptables-nft as default alternative. +# Without it, firewalld has this error: INVALID_IPV: 'ipv4' is not a valid backend or is unavailable +# +Tests: access-web-interface +Depends: iptables, @ +Restrictions: needs-root, isolation-machine, breaks-testbed diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index 2f39cd261..637aec8ab 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -8,6 +8,18 @@ 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.7.1 (2026-04-28) == + + * radicale, bepasty: Fix issue with failed diagnostic test + * radicale: Enable lc_username for case-insensitive auth + * radicale: Fix issue with parsing new configuration file + * radicale: tests: functional: Better checking for well-known URLs + +== FreedomBox 26.7 (2026-04-20) == + + * debian: tests: Add test to access interface status + * locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, French, German, Italian, Swedish, Turkish + == FreedomBox 26.6 (2026-04-06) == === Highlights === diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index 2f39cd261..637aec8ab 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -8,6 +8,18 @@ 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.7.1 (2026-04-28) == + + * radicale, bepasty: Fix issue with failed diagnostic test + * radicale: Enable lc_username for case-insensitive auth + * radicale: Fix issue with parsing new configuration file + * radicale: tests: functional: Better checking for well-known URLs + +== FreedomBox 26.7 (2026-04-20) == + + * debian: tests: Add test to access interface status + * locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, French, German, Italian, Swedish, Turkish + == FreedomBox 26.6 (2026-04-06) == === Highlights === diff --git a/plinth/__init__.py b/plinth/__init__.py index 0fd413a2e..95c2335af 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '26.6' +__version__ = '26.7.1' diff --git a/plinth/action_utils.py b/plinth/action_utils.py index 8d50836dc..8d9c91196 100644 --- a/plinth/action_utils.py +++ b/plinth/action_utils.py @@ -120,14 +120,6 @@ def service_disable(service_name: str, check: bool = False): except subprocess.CalledProcessError: pass - if service_name.endswith('.socket'): - # Instead, may need to query the unit for associated .service file. - base_name = service_name.rpartition('.')[0] - try: - service_stop(f'{base_name}.service', check=check) - except subprocess.CalledProcessError: - pass - def service_mask(service_name: str, check: bool = False): """Mask a service""" @@ -143,25 +135,62 @@ def service_start(service_name: str, check: bool = False): """Start a service with systemd.""" service_action(service_name, 'start', check=check) + # When starting a .socket unit, there is not need to start the .service + # unit as it will be automatically started when a request is received on + # the socket. + + +def _get_service_unit(socket_name: str) -> str: + """Return the .service unit name for a .socket unit.""" + # Instead, may need to query the unit for associated .service file. + base_name = socket_name.rpartition('.')[0] + return f'{base_name}.service' + def service_stop(service_name: str, check: bool = False): """Stop a service with systemd.""" service_action(service_name, 'stop', check=check) + # When stopping a .socket unit, most of the time, we must also stop + # .service unit. This frees up resources when disabling the app. It also + # stops using resources that are being backed up. + if service_name.endswith('.socket'): + service_action(_get_service_unit(service_name), 'stop', check=check) + def service_restart(service_name: str, check: bool = False): """Restart a service with systemd.""" - service_action(service_name, 'restart', check=check) + if not service_name.endswith('.socket'): + service_action(service_name, 'restart', check=check) + else: + # When restarting a .socket unit, most of the time, we actually want to + # restart the corresponding .service unit. This reloads the + # configuration changes as needed. To restart, all we need to do stop + # the service. It will be automatically started again by .socket unit. + service_action(_get_service_unit(service_name), 'stop', check=check) def service_try_restart(service_name: str, check: bool = False): """Try to restart a service with systemd.""" - service_action(service_name, 'try-restart', check=check) + if not service_name.endswith('.socket'): + service_action(service_name, 'try-restart', check=check) + else: + # When try-restarting a .socket unit, most of the time, we actually + # want to restart the corresponding .service unit. This reloads the + # configuration changes as needed. To restart, all we need to do stop + # the service. It will be automatically started again by .socket unit. + service_action(_get_service_unit(service_name), 'stop', check=check) def service_reload(service_name: str, check: bool = False): """Reload a service with systemd.""" - service_action(service_name, 'reload', check=check) + if not service_name.endswith('.socket'): + service_action(service_name, 'reload', check=check) + else: + # When reloading a .socket unit, most of the time, we actually want to + # reload the corresponding .service unit. This reloads the + # configuration changes as needed. + service_action(_get_service_unit(service_name), 'reload', check=check) def service_try_reload_or_restart(service_name: str, check: bool = False): @@ -169,7 +198,14 @@ def service_try_reload_or_restart(service_name: str, check: bool = False): Do nothing if service is not running. """ - service_action(service_name, 'try-reload-or-restart', check=check) + if not service_name.endswith('.socket'): + service_action(service_name, 'try-reload-or-restart', check=check) + else: + # When reloading a .socket unit, most of the time, we actually want to + # reload the corresponding .service unit. This reloads the + # configuration changes as needed. + service_action(_get_service_unit(service_name), + 'try-reload-or-restart', check=check) def service_reset_failed(service_name: str, check: bool = False): diff --git a/plinth/locale/ar/LC_MESSAGES/django.po b/plinth/locale/ar/LC_MESSAGES/django.po index efc1b0bcd..931f236d5 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2025-04-16 02:28+0000\n" "Last-Translator: MohammedSaalif <2300031323@kluniversity.in>\n" "Language-Team: Arabic is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/ar_SA/LC_MESSAGES/django.po b/plinth/locale/ar_SA/LC_MESSAGES/django.po index 75dcefa44..650fabffe 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2020-06-10 15:41+0000\n" "Last-Translator: aiman an \n" "Language-Team: Arabic (Saudi Arabia) is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/be/LC_MESSAGES/django.po b/plinth/locale/be/LC_MESSAGES/django.po index fed71d905..a8f82ad43 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -6340,7 +6340,7 @@ msgstr "" msgid "IRC" msgstr "" -#: plinth/modules/radicale/__init__.py:27 +#: plinth/modules/radicale/__init__.py:26 #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " @@ -6349,14 +6349,14 @@ msgid "" "a> is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index 0fd98e575..c2c134b20 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2025-12-17 07:00+0000\n" "Last-Translator: 109247019824 " "<109247019824@users.noreply.hosted.weblate.org>\n" @@ -6686,7 +6686,7 @@ msgstr "Quasseldroid" msgid "IRC" msgstr "" -#: plinth/modules/radicale/__init__.py:27 +#: plinth/modules/radicale/__init__.py:26 #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " @@ -6695,14 +6695,14 @@ msgid "" "a> is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index b91298a59..485da99df 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2025-04-01 03:02+0000\n" "Last-Translator: MURALA SAI GANESH \n" "Language-Team: Bengali is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/ca/LC_MESSAGES/django.po b/plinth/locale/ca/LC_MESSAGES/django.po index be3e5b46b..25d46fcb2 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2026-02-06 23:02+0000\n" "Last-Translator: kosagi \n" "Language-Team: Catalan is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/cs/LC_MESSAGES/django.po b/plinth/locale/cs/LC_MESSAGES/django.po index 27caad3bc..82c505640 100644 --- a/plinth/locale/cs/LC_MESSAGES/django.po +++ b/plinth/locale/cs/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-04-07 00:12+0000\n" -"PO-Revision-Date: 2026-03-08 18:48+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"PO-Revision-Date: 2026-04-09 10:09+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech \n" @@ -7160,7 +7160,7 @@ msgstr "Quasseldroid" msgid "IRC" msgstr "IRC" -#: plinth/modules/radicale/__init__.py:27 +#: plinth/modules/radicale/__init__.py:26 #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " @@ -7174,7 +7174,7 @@ msgstr "" "klientská aplikace. K Radicale má přístup každý uživatel s přihlašovacím " "jménem {box_name}." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7184,7 +7184,7 @@ msgstr "" "nových kalendářů a adresářů kontaktů. Nepodporuje přidávání událostí či " "kontaktů, to je třeba dělat v tomu určeném klientovi." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" @@ -9782,14 +9782,12 @@ msgstr "Upravit uživatele %(username)s" #: plinth/modules/users/templates/users_login.html:30 msgid "Logging in with passkey failed: " -msgstr "" +msgstr "Přihlášení pomocí passkey se nezdařilo: " #: 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 "Tato aplikace nepodporuje diagnostiku" +msgstr "Prohlížeč nepodporuje přístupové klíče." #: plinth/modules/users/templates/users_login.html:57 msgid "Login" @@ -9798,28 +9796,29 @@ msgstr "Přihlášení" #: plinth/modules/users/templates/users_login.html:70 #: plinth/modules/users/templates/users_login.html:72 msgid "Log in with passkey" -msgstr "" +msgstr "Přihlásit se pomocí přístupového klíče" #: plinth/modules/users/templates/users_passkey_edit.html:19 -#, fuzzy -#| msgid "Update setup" msgid "Update Passkey" -msgstr "Aktualizovat nastavení" +msgstr "Aktualizovat přístupový klíč" #: plinth/modules/users/templates/users_passkeys.html:30 msgid "Adding passkey failed: " -msgstr "" +msgstr "Přidání přístupového klíče selhalo: " #: plinth/modules/users/templates/users_passkeys.html:48 #: plinth/modules/users/views.py:314 msgid "Passkeys" -msgstr "" +msgstr "Přístupové klíče" #: 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 "" +"Práce s přístupovými klíči vyžaduje použití rozhraní JavaScript API " +"prohlížeče. Chcete-li pokračovat, povolte ve svém prohlížeči podporu jazyka " +"JavaScript." #: plinth/modules/users/templates/users_passkeys.html:66 msgid "" @@ -9830,47 +9829,46 @@ msgid "" "server knows only the public information that can used to verify user's " "signatures." msgstr "" +"Přístupové klíče jsou způsob, jak ověřit identitu uživatele pomocí " +"digitálních podpisů. Jsou bezpečnější alternativou k heslům. Tajné informace " +"jsou uchovávány u uživatele v jeho telefonu, notebooku nebo hardwarovém " +"tokenu a odemykají se pomocí PINu, otisku prstu nebo identifikace obličeje. " +"Na serveru nejsou uloženy žádné tajné informace. Server zná pouze veřejné " +"informace, které lze použít k ověření podpisů uživatele." #: plinth/modules/users/templates/users_passkeys.html:83 #: plinth/modules/users/templates/users_passkeys.html:85 -#, fuzzy -#| msgid "Add password" msgid "Add passkey" -msgstr "Přidat heslo" +msgstr "Přidat přístupový klíč" #: plinth/modules/users/templates/users_passkeys.html:93 -#, fuzzy -#| msgid "Domain" msgid "For Domain" -msgstr "Doména" +msgstr "Pro doménu" #: plinth/modules/users/templates/users_passkeys.html:94 msgid "Added" -msgstr "" +msgstr "Přidáno" #: plinth/modules/users/templates/users_passkeys.html:95 -#, fuzzy -#| msgid "Last scanned: " msgid "Last Used" -msgstr "Naposledy skenováno: " +msgstr "Naposledy použito" #: plinth/modules/users/templates/users_passkeys.html:126 msgid "No passkeys added to user account." -msgstr "" +msgstr "K uživatelskému účtu nebyly přidány žádné přístupové klíče." #: plinth/modules/users/templates/users_passkeys.html:135 msgid "Delete passkey ?" -msgstr "" +msgstr "Smazat přístupový klíč ?" #: plinth/modules/users/templates/users_passkeys.html:145 msgid "You will need this passkey's device to add it back again." msgstr "" +"K opětovnému přidání tohoto přístupového klíče budete potřebovat zařízení." #: plinth/modules/users/templates/users_passkeys.html:152 -#, fuzzy -#| msgid "Delete user" msgid "Delete passkey" -msgstr "Smazat uživatele" +msgstr "Smazat přístupový klíč" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 @@ -9886,6 +9884,8 @@ msgstr "Upravit uživatele %(username)s" #, python-format msgid "Use passkeys for better security." msgstr "" +"Pro lepší zabezpečení použijte přístupové " +"klíče." #: plinth/modules/users/templates/users_update.html:29 #, python-format @@ -9951,20 +9951,16 @@ 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." +msgstr "Přístupový klíč s tímto identifikátorem již existuje." #: plinth/modules/users/views.py:431 -#, fuzzy -#| msgid "Edit User" msgid "Edit Passkey" -msgstr "Upravit uživatele" +msgstr "Upravit přístupový klíč" #: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 msgid "Passkey used is not known." -msgstr "" +msgstr "Použitý přístupový klíč není znám." #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." @@ -10745,10 +10741,8 @@ 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ů" +msgstr "Správa přístupových klíčů" #: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" @@ -10804,7 +10798,7 @@ msgstr "Mobilní" #: plinth/templates/clients.html:82 msgid "Android APK" -msgstr "" +msgstr "Android APK" #: plinth/templates/clients.html:91 msgid "Play Store" diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index a39efea59..72fcd5771 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Danish understøttet klient-applikation. Radicale kan tilgås " "af enhver bruger der har et log ind til {box_name}." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index cbbf4b5a8..77765ec11 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-07 00:12+0000\n" -"PO-Revision-Date: 2026-03-29 11:09+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"PO-Revision-Date: 2026-04-09 10:09+0000\n" "Last-Translator: Dietmar \n" "Language-Team: German \n" @@ -7303,7 +7303,7 @@ msgstr "Quasseldroid" msgid "IRC" msgstr "IRC" -#: plinth/modules/radicale/__init__.py:27 +#: plinth/modules/radicale/__init__.py:26 #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " @@ -7317,7 +7317,7 @@ msgstr "" "clients\">unterstützte Client Software notwendig. Radicale kann von " "jedem Benutzer mit einem {box_name}-Konto verwendet werden." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7328,7 +7328,7 @@ msgstr "" "Kontaktdaten wird nicht unterstützt; dies muss über einen separaten Client " "erfolgen." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" @@ -9996,14 +9996,12 @@ msgstr "Benutzer %(username)s bearbeiten" #: plinth/modules/users/templates/users_login.html:30 msgid "Logging in with passkey failed: " -msgstr "" +msgstr "Die Anmeldung mit dem Passkey ist fehlgeschlagen: " #: 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" +msgstr "Der Browser unterstützt keine Passkeys." #: plinth/modules/users/templates/users_login.html:57 msgid "Login" @@ -10012,28 +10010,29 @@ msgstr "Anmelden" #: plinth/modules/users/templates/users_login.html:70 #: plinth/modules/users/templates/users_login.html:72 msgid "Log in with passkey" -msgstr "" +msgstr "Mit Passkey anmelden" #: plinth/modules/users/templates/users_passkey_edit.html:19 -#, fuzzy -#| msgid "Update setup" msgid "Update Passkey" -msgstr "Übernehmen der Änderungen" +msgstr "Passkey aktualisieren" #: plinth/modules/users/templates/users_passkeys.html:30 msgid "Adding passkey failed: " -msgstr "" +msgstr "Hinzufügen des Passkeys ist fehlgeschlagen: " #: plinth/modules/users/templates/users_passkeys.html:48 #: plinth/modules/users/views.py:314 msgid "Passkeys" -msgstr "" +msgstr "Passkeys" #: 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 "" +"Für die Verwendung von Passkeys ist die JavaScript-API des Browsers " +"erforderlich. Bitte aktivieren Sie JavaScript in Ihrem Browser, um " +"fortzufahren." #: plinth/modules/users/templates/users_passkeys.html:66 msgid "" @@ -10044,47 +10043,47 @@ msgid "" "server knows only the public information that can used to verify user's " "signatures." msgstr "" +"Passkeys sind eine Methode zur Überprüfung der Benutzeridentität mithilfe " +"digitaler Signaturen. Sie stellen eine sicherere Alternative zu Passwörtern " +"dar. Die geheimen Informationen werden beim Benutzer auf seinem Smartphone, " +"Laptop oder einem Hardware-Token gespeichert und mittels PIN, Fingerabdruck " +"oder Gesichtserkennung entsperrt. Auf dem Server werden keine geheimen " +"Informationen gespeichert. Der Server kennt lediglich die öffentlichen " +"Informationen, die zur Überprüfung der Signaturen des Benutzers verwendet " +"werden können." #: 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" +msgstr "Passkey hinzufügen" #: plinth/modules/users/templates/users_passkeys.html:93 -#, fuzzy -#| msgid "Domain" msgid "For Domain" -msgstr "Domain" +msgstr "Für Domäne" #: plinth/modules/users/templates/users_passkeys.html:94 msgid "Added" -msgstr "" +msgstr "Hinzugefügt" #: plinth/modules/users/templates/users_passkeys.html:95 -#, fuzzy -#| msgid "Last scanned: " msgid "Last Used" -msgstr "Zuletzt gescannt: " +msgstr "Zuletzt verwendet" #: plinth/modules/users/templates/users_passkeys.html:126 msgid "No passkeys added to user account." -msgstr "" +msgstr "Dem Benutzerkonto wurden keine Passkeys hinzugefügt." #: plinth/modules/users/templates/users_passkeys.html:135 msgid "Delete passkey ?" -msgstr "" +msgstr "Passkey löschen?" #: 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" +msgstr "Passkey löschen" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 @@ -10100,6 +10099,7 @@ msgstr "Benutzer %(username)s bearbeiten" #, python-format msgid "Use passkeys for better security." msgstr "" +"Verwenden Sie Passkeys für mehr Sicherheit." #: plinth/modules/users/templates/users_update.html:29 #, python-format @@ -10166,20 +10166,16 @@ 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." +msgstr "Ein Passkey mit dieser Kennung existiert bereits." #: plinth/modules/users/views.py:431 -#, fuzzy -#| msgid "Edit User" msgid "Edit Passkey" -msgstr "Benutzer bearbeiten" +msgstr "Passkey bearbeiten" #: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 msgid "Passkey used is not known." -msgstr "" +msgstr "Der verwendete Passkey ist nicht bekannt." #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." @@ -10342,10 +10338,8 @@ msgid "Value" msgstr "" #: plinth/modules/wireguard/templates/wireguard.html:33 -#, fuzzy -#| msgid "Endpoint" msgid "Endpoint(s)" -msgstr "Endpunkt" +msgstr "Endpunkt(e)" #: plinth/modules/wireguard/templates/wireguard.html:41 #, python-format @@ -10988,10 +10982,8 @@ msgid " System" msgstr " System" #: plinth/templates/base.html:179 plinth/templates/base.html:180 -#, fuzzy -#| msgid "Manage Aliases" msgid "Manage passkeys" -msgstr "Aliase verwalten" +msgstr "Passkeys verwalten" #: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 3cdbb2f56..de73e6428 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -6341,7 +6341,7 @@ msgstr "" msgid "IRC" msgstr "" -#: plinth/modules/radicale/__init__.py:27 +#: plinth/modules/radicale/__init__.py:26 #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " @@ -6350,14 +6350,14 @@ msgid "" "a> is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index f452d9dd2..39260fb47 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2026-02-22 13:17+0000\n" "Last-Translator: James Valleroy \n" "Language-Team: Greek πελάτη . Το Radicale μπορεί να προσεγγιστεί από οποιονδήποτε " "χρήστη με {box_name} πιστοποιητικά." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7471,7 +7471,7 @@ msgstr "" "γεγονότων ή επαφών, το οποίο πρέπει να γίνει χρησιμοποιώντας ένα ξεχωριστό " "πελάτη." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index 41c4ed620..4fe54cc07 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2024-11-01 17:00+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish aplicación cliente soportada. Cualquier persona " "autenticada en {box_name} puede acceder a Radicale." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7411,7 +7411,7 @@ msgstr "" "de nuevos calendarios y agendas. No soporta añadir eventos o contactos, que " "debe hacerse usando un cliente separado." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/et/LC_MESSAGES/django.po b/plinth/locale/et/LC_MESSAGES/django.po index 3a5598326..a8288e186 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2026-01-09 20:01+0000\n" "Last-Translator: Priit Jõerüüt \n" "Language-Team: Estonian is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index 9d0f063fc..73833c9e0 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Persian is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index c08cef332..75d7bf687 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index 0612e308e..d58e746f0 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-04-07 00:12+0000\n" -"PO-Revision-Date: 2026-03-29 11:09+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"PO-Revision-Date: 2026-04-16 15: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.17-dev\n" +"X-Generator: Weblate 5.17.1-dev\n" #: plinth/config.py:103 #, python-brace-format @@ -7326,7 +7326,7 @@ msgstr "Quasseldroid" msgid "IRC" msgstr "IRC" -#: plinth/modules/radicale/__init__.py:27 +#: plinth/modules/radicale/__init__.py:26 #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " @@ -7342,7 +7342,7 @@ msgstr "" "a>. Tous les utilisateur disposant d’un compte sur la {box_name} ont accès à " "Radicale." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7353,7 +7353,7 @@ msgstr "" "charge l’ajout d’événements ou de contacts, opérations qui doivent être " "réalisées avec un client dédié." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" @@ -10049,14 +10049,12 @@ msgstr "Paramètres du compte %(username)s" #: plinth/modules/users/templates/users_login.html:30 msgid "Logging in with passkey failed: " -msgstr "" +msgstr "Échec de la connexion par clé d’accès : " #: 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" +msgstr "Le navigateur n’est pas compatible avec les clés d’accès." #: plinth/modules/users/templates/users_login.html:57 msgid "Login" @@ -10065,28 +10063,28 @@ 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 "" +msgstr "Connexion avec une clé d’accès" #: plinth/modules/users/templates/users_passkey_edit.html:19 -#, fuzzy -#| msgid "Update setup" msgid "Update Passkey" -msgstr "Appliquer les changements" +msgstr "Mettre à jour la clé d’accès" #: plinth/modules/users/templates/users_passkeys.html:30 msgid "Adding passkey failed: " -msgstr "" +msgstr "Échec d’ajout d’une clé d’accès : " #: plinth/modules/users/templates/users_passkeys.html:48 #: plinth/modules/users/views.py:314 msgid "Passkeys" -msgstr "" +msgstr "Clés d’accès" #: 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 "" +"L’utilisation de clés d’accès nécessite l’utilisation de l’API Javascript du " +"navigateur. Veuillez activer Javascript dans votre navigateur pour continuer." #: plinth/modules/users/templates/users_passkeys.html:66 msgid "" @@ -10097,47 +10095,48 @@ msgid "" "server knows only the public information that can used to verify user's " "signatures." msgstr "" +"Les clés d’accès sont un moyen de vérifier l’identité de l’utilisateur au " +"travers de signatures numériques. Elles présentent un alternative plus sure " +"à l’usage des mots de passe. Les secrets sont conservés sur le téléphone, " +"l’ordinateur ou le jeton d’authentification matériel et protégés par un code " +"ou une empreinte biométrique. Aucun secret n’est conservé sur les serveur. " +"Le serveur n’a besoin de connaître que les informations publiques permettant " +"de vérifier la signature de l’utilisateurice." #: 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" +msgstr "Ajouter une clé d’accès" #: plinth/modules/users/templates/users_passkeys.html:93 -#, fuzzy -#| msgid "Domain" msgid "For Domain" -msgstr "Domaine" +msgstr "Pour le domaine" #: plinth/modules/users/templates/users_passkeys.html:94 msgid "Added" -msgstr "" +msgstr "Ajoutée" #: plinth/modules/users/templates/users_passkeys.html:95 -#, fuzzy -#| msgid "Last scanned: " msgid "Last Used" -msgstr "Dernière analyse : " +msgstr "Dernière utilisation" #: plinth/modules/users/templates/users_passkeys.html:126 msgid "No passkeys added to user account." -msgstr "" +msgstr "Aucune clé d’accès pour ce compte." #: plinth/modules/users/templates/users_passkeys.html:135 msgid "Delete passkey ?" -msgstr "" +msgstr "Supprimer la clé d’accès  ?" #: plinth/modules/users/templates/users_passkeys.html:145 msgid "You will need this passkey's device to add it back again." msgstr "" +"Vous aurez besoin de l’appareil contenant cette clé d’accès pour pouvoir " +"l’ajouter à nouveau." #: plinth/modules/users/templates/users_passkeys.html:152 -#, fuzzy -#| msgid "Delete user" msgid "Delete passkey" -msgstr "Supprimer l'utilisateur" +msgstr "Supprimer la clé d’accès" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 @@ -10153,6 +10152,8 @@ msgstr "Modifier l’utilisateur %(username)s" #, python-format msgid "Use passkeys for better security." msgstr "" +"Utilisez une clé d’accès pour une meilleure " +"sécurité." #: plinth/modules/users/templates/users_update.html:29 #, python-format @@ -10220,20 +10221,16 @@ 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." +msgstr "Il y a déjà un clé d’accès avec cet identifiant." #: plinth/modules/users/views.py:431 -#, fuzzy -#| msgid "Edit User" msgid "Edit Passkey" -msgstr "Modification de l’utilisateur" +msgstr "Modifier la clé d’accès" #: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 msgid "Passkey used is not known." -msgstr "" +msgstr "La clé d’accès utilisée est inconnue." #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." @@ -11036,10 +11033,8 @@ 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" +msgstr "Gérer les clés d’accès" #: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index 06e6d02d5..c00e61158 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2022-12-30 10:51+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Galician is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/gu/LC_MESSAGES/django.po b/plinth/locale/gu/LC_MESSAGES/django.po index a929e7ce6..adaf901d4 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Gujarati is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/hi/LC_MESSAGES/django.po b/plinth/locale/hi/LC_MESSAGES/django.po index aadef7d20..563ff1579 100644 --- a/plinth/locale/hi/LC_MESSAGES/django.po +++ b/plinth/locale/hi/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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2026-03-31 06:09+0000\n" "Last-Translator: bsurajpatra \n" "Language-Team: Hindi समर्थित क्लाइंट एप्लिकेशन कि जरुरत है. राडिकैल किसी " "{box_name} यूसर पहुंचा जा सकता है एक लॉगिन के साथ." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "राडिकैल" diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index 371992e0b..34231e33c 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2025-06-04 15:01+0000\n" "Last-Translator: András Szűcs " "\n" @@ -7496,7 +7496,7 @@ msgstr "Quasseldroid" msgid "IRC" msgstr "" -#: plinth/modules/radicale/__init__.py:27 +#: plinth/modules/radicale/__init__.py:26 #, fuzzy, python-brace-format #| msgid "" #| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " @@ -7517,7 +7517,7 @@ msgstr "" "alkalmazásra is. A Radicale elérhető bármely felhasználó számára a " "{box_name} eszközön." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7527,7 +7527,7 @@ msgstr "" "címjegyzékek létrehozását támogatja. Nem támogatja az események vagy " "kapcsolatok hozzáadását, ezeket külön kliens segítségével kell elvégezni." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index 74b13df6b..c4378eb8e 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Indonesian is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index 58fae58ac..46f463efa 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-04-07 00:12+0000\n" -"PO-Revision-Date: 2026-03-31 06:09+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"PO-Revision-Date: 2026-04-18 21: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.17-dev\n" +"X-Generator: Weblate 5.17.1-dev\n" #: plinth/config.py:103 #, python-brace-format @@ -7219,7 +7219,7 @@ msgstr "Quasseldroid" msgid "IRC" msgstr "IRC" -#: plinth/modules/radicale/__init__.py:27 +#: plinth/modules/radicale/__init__.py:26 #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " @@ -7233,7 +7233,7 @@ msgstr "" "client supportata. Ogni utente con un profilo {box_name} può accedere a " "Radicale." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7243,7 +7243,7 @@ msgstr "" "nuovi calendari e rubriche. Non supporta l'aggiunta di eventi o contatti, " "che dovranno essere gestiti tramite un client separato." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" @@ -9876,10 +9876,8 @@ 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" +msgstr "Il browser non supporta le passkey." #: plinth/modules/users/templates/users_login.html:57 msgid "Login" @@ -9891,10 +9889,8 @@ 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" +msgstr "Aggiorna Passkey" #: plinth/modules/users/templates/users_passkeys.html:30 msgid "Adding passkey failed: " @@ -9923,26 +9919,20 @@ 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" +msgstr "Aggiungi Passkey" #: plinth/modules/users/templates/users_passkeys.html:93 -#, fuzzy -#| msgid "Domain" msgid "For Domain" -msgstr "Dominio" +msgstr "Per Dominio" #: plinth/modules/users/templates/users_passkeys.html:94 msgid "Added" -msgstr "" +msgstr "Aggiunto" #: plinth/modules/users/templates/users_passkeys.html:95 -#, fuzzy -#| msgid "Last scanned: " msgid "Last Used" -msgstr "Ultima scansione: " +msgstr "Ultimo utilizzo" #: plinth/modules/users/templates/users_passkeys.html:126 msgid "No passkeys added to user account." @@ -9957,10 +9947,8 @@ 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" +msgstr "Cancella Passkey" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 @@ -10040,16 +10028,12 @@ 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à." +msgstr "Esiste già un Passkey con quell'identificatore." #: plinth/modules/users/views.py:431 -#, fuzzy -#| msgid "Edit User" msgid "Edit Passkey" -msgstr "Modifica utente" +msgstr "Modifica Passkey" #: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 msgid "Passkey used is not known." @@ -10842,10 +10826,8 @@ 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" +msgstr "Gestire le Passkey" #: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index 389b80828..b9d00a971 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2025-10-24 16:02+0000\n" "Last-Translator: Jun Nogata \n" "Language-Team: Japanese is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/kn/LC_MESSAGES/django.po b/plinth/locale/kn/LC_MESSAGES/django.po index d9b9b65c2..a38fcd069 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2020-07-16 16:41+0000\n" "Last-Translator: Yogesh \n" "Language-Team: Kannada is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/lt/LC_MESSAGES/django.po b/plinth/locale/lt/LC_MESSAGES/django.po index a2c786cfc..0d438815f 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Lithuanian is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/lv/LC_MESSAGES/django.po b/plinth/locale/lv/LC_MESSAGES/django.po index 1fd66c799..22ea4f9ba 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Latvian is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index 029022e49..153a62384 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2024-10-27 23:30+0000\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Norwegian Bokmål støttet klientprogram . Radicale " "kan nås av alle brukere med {box_name}-innlogging." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7461,7 +7461,7 @@ msgstr "" "kalendre og adressebøker. Den tilbyr ikke å legge inn nye hendelser eller " "kontakter, det må gjøres med en egen klient." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index e77275d99..b28a14496 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2025-09-17 09:01+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch nodig. Radicale kan worden benaderd door elke " "{box_name} gebruiker." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7197,7 +7197,7 @@ msgstr "" "gebeurtenissen of contactpersonen, die moeten worden gedaan met behulp van " "een aparte client." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/pl/LC_MESSAGES/django.po b/plinth/locale/pl/LC_MESSAGES/django.po index 26f9da000..6bd4e1f8a 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2024-07-13 12:09+0000\n" "Last-Translator: Monika \n" "Language-Team: Polish is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index c7bfe5ded..8f0a5a1fa 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2025-04-09 22:41+0000\n" "Last-Translator: tuliogit \n" "Language-Team: Portuguese \n" "Language-Team: Russian поддерживаемое клиентское приложение. Доступ к Radicale может " "получить любой пользователь с логином {box_name}." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7248,7 +7248,7 @@ msgstr "" "создание новых календарей и адресных книг. Он не поддерживает добавление " "событий или контактов, для этого требуется отдельный клиент." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/si/LC_MESSAGES/django.po b/plinth/locale/si/LC_MESSAGES/django.po index 1db9a3d73..00114266a 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2021-04-27 13:32+0000\n" "Last-Translator: HelaBasa \n" "Language-Team: Sinhala is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/sl/LC_MESSAGES/django.po b/plinth/locale/sl/LC_MESSAGES/django.po index 017dab92a..8913196a5 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Slovenian is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/sq/LC_MESSAGES/django.po b/plinth/locale/sq/LC_MESSAGES/django.po index 4a3293286..f45d357a2 100644 --- a/plinth/locale/sq/LC_MESSAGES/django.po +++ b/plinth/locale/sq/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-04-07 00:12+0000\n" -"PO-Revision-Date: 2026-03-26 09:09+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"PO-Revision-Date: 2026-04-08 07:09+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -7237,7 +7237,7 @@ msgstr "Quasseldroid" msgid "IRC" msgstr "IRC" -#: plinth/modules/radicale/__init__.py:27 +#: plinth/modules/radicale/__init__.py:26 #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " @@ -7252,7 +7252,7 @@ msgstr "" "Radicale mund të hyhet nga cilido përdorues me kredenciale hyrjeje në " "{box_name}." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7262,7 +7262,7 @@ msgstr "" "të ri dhe librash adresash. S’mbulon shtim veprimtarish ose kontaktesh, çka " "duhen bërë duke përdorur një tjetër klient." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" @@ -9899,14 +9899,12 @@ msgstr "Përpunoni përdoruesin %(username)s" #: plinth/modules/users/templates/users_login.html:30 msgid "Logging in with passkey failed: " -msgstr "" +msgstr "Hyrja me kyçkalim dështoi: " #: 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 "Ky aplikacion s’mbulon diagnostikime" +msgstr "Shfletuesi s’mbulon kyçkalime." #: plinth/modules/users/templates/users_login.html:57 msgid "Login" @@ -9915,28 +9913,28 @@ msgstr "Hyrje" #: plinth/modules/users/templates/users_login.html:70 #: plinth/modules/users/templates/users_login.html:72 msgid "Log in with passkey" -msgstr "" +msgstr "Hyni me kyçkalim" #: plinth/modules/users/templates/users_passkey_edit.html:19 -#, fuzzy -#| msgid "Update setup" msgid "Update Passkey" -msgstr "Përditësoni ujdisjen" +msgstr "Përditësoni Kyçkalimin" #: plinth/modules/users/templates/users_passkeys.html:30 msgid "Adding passkey failed: " -msgstr "" +msgstr "Shtimi i kyçkalimit dështoi: " #: plinth/modules/users/templates/users_passkeys.html:48 #: plinth/modules/users/views.py:314 msgid "Passkeys" -msgstr "" +msgstr "Kyçkalime" #: 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 "" +"Puna me kyçkalime lyp përdorim të API-t Javascript të shfletuesit. Ju " +"lutemi, që të vazhdohet, aktivizoni mbulim Javascript-i në shfletuesin tuaj." #: plinth/modules/users/templates/users_passkeys.html:66 msgid "" @@ -9947,47 +9945,46 @@ msgid "" "server knows only the public information that can used to verify user's " "signatures." msgstr "" +"Kyçkalimet janë një mënyrë verifikimi identiteti përdoruesit duke përdorur " +"nënshkrime dixhitale. Janë një alternativë më e siguruar se fjalëkalimet. " +"Informacioni i fshehtë mbahet nga përdoruesi në telefonin e tij, portativin, " +"ose token-in hardware dhe shkyçet duke përdorur një PIN, shenja gishtash ose " +"“face ID”. S’ruhet të fshehta te shërbyesi. Shërbyesi njeh vetëm " +"informacionin publik që mund të përdoret për të verifikuar nënshkrime të " +"përdoruesit." #: plinth/modules/users/templates/users_passkeys.html:83 #: plinth/modules/users/templates/users_passkeys.html:85 -#, fuzzy -#| msgid "Add password" msgid "Add passkey" -msgstr "Shtoni fjalëkalim" +msgstr "Shtoni kyçkalim" #: plinth/modules/users/templates/users_passkeys.html:93 -#, fuzzy -#| msgid "Domain" msgid "For Domain" -msgstr "Përkatësi" +msgstr "Për Përkatësi" #: plinth/modules/users/templates/users_passkeys.html:94 msgid "Added" -msgstr "" +msgstr "U shtua" #: plinth/modules/users/templates/users_passkeys.html:95 -#, fuzzy -#| msgid "Last scanned: " msgid "Last Used" -msgstr "Skanuar së fundi më: " +msgstr "Përdorur Së Fundi Më" #: plinth/modules/users/templates/users_passkeys.html:126 msgid "No passkeys added to user account." -msgstr "" +msgstr "Te llogari përdoruesi, s’u shtuan kyçkalime." #: plinth/modules/users/templates/users_passkeys.html:135 msgid "Delete passkey ?" -msgstr "" +msgstr "Të fshihet kyçkalimi ?" #: plinth/modules/users/templates/users_passkeys.html:145 msgid "You will need this passkey's device to add it back again." -msgstr "" +msgstr "Që ta rishtoni, do t’ju duhet pajisja e këtij kyçkalimi." #: plinth/modules/users/templates/users_passkeys.html:152 -#, fuzzy -#| msgid "Delete user" msgid "Delete passkey" -msgstr "Fshi përdorues" +msgstr "Fshije kyçkalimin" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 @@ -10003,6 +10000,7 @@ msgstr "Përpunoni Përdoruesin %(username)s" #, python-format msgid "Use passkeys for better security." msgstr "" +"Për siguri më të mirë, përdorni kyçkalime." #: plinth/modules/users/templates/users_update.html:29 #, python-format @@ -10069,20 +10067,16 @@ 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." +msgstr "Ka tashmë një kyçkalim me atë identifikues." #: plinth/modules/users/views.py:431 -#, fuzzy -#| msgid "Edit User" msgid "Edit Passkey" -msgstr "Përpunoni Përdorues" +msgstr "Përpunoni Kyçkalim" #: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 msgid "Passkey used is not known." -msgstr "" +msgstr "Kyçkalimi i përdorur s’njihet." #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." @@ -10251,7 +10245,7 @@ msgstr "IP VPN-je %(box_name)s për shërbime" #: plinth/modules/wireguard/templates/wireguard.html:50 msgid "Peers" -msgstr "" +msgstr "Ortakë" #: plinth/modules/wireguard/templates/wireguard.html:52 msgid "Peers allowed to connect to this server:" @@ -10873,10 +10867,8 @@ msgid " System" msgstr " Sistem" #: plinth/templates/base.html:179 plinth/templates/base.html:180 -#, fuzzy -#| msgid "Manage Aliases" msgid "Manage passkeys" -msgstr "Administroni Aliase" +msgstr "Administroni kyçkalime" #: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index e3b02b284..dc51982cd 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Serbian is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index a8dedde3f..f32e8224a 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \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" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"PO-Revision-Date: 2026-04-15 10:10+0000\n" +"Last-Translator: bittin1ddc447d824349b2 \n" "Language-Team: Swedish \n" "Language: sv\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.17-dev\n" +"X-Generator: Weblate 5.17.1-dev\n" #: plinth/config.py:103 #, python-brace-format @@ -7176,7 +7176,7 @@ msgstr "Quasseldroid" msgid "IRC" msgstr "IRC" -#: plinth/modules/radicale/__init__.py:27 +#: plinth/modules/radicale/__init__.py:26 #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " @@ -7190,7 +7190,7 @@ msgstr "" "användarklient. Radikal kan nås av alla användare med en {box_name} " "inloggning." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7200,7 +7200,7 @@ msgstr "" "skapandet av nya kalendrar och adressböcker. Det stöder inte att lägga till " "händelser eller kontakter, som måste göras med hjälp av en separat klient." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" @@ -9808,14 +9808,12 @@ msgstr "Redigera användare %(username)s" #: plinth/modules/users/templates/users_login.html:30 msgid "Logging in with passkey failed: " -msgstr "" +msgstr "Inloggning med lösennyckel misslyckades: " #: 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 "Den här appen stöder inte diagnostik" +msgstr "Webbläsaren stöder inte lösennycklar." #: plinth/modules/users/templates/users_login.html:57 msgid "Login" @@ -9824,28 +9822,28 @@ msgstr "Logga in" #: plinth/modules/users/templates/users_login.html:70 #: plinth/modules/users/templates/users_login.html:72 msgid "Log in with passkey" -msgstr "" +msgstr "Logga in med lösennyckel" #: plinth/modules/users/templates/users_passkey_edit.html:19 -#, fuzzy -#| msgid "Update setup" msgid "Update Passkey" -msgstr "Uppdatera inställningar" +msgstr "Uppdatera lösennyckel" #: plinth/modules/users/templates/users_passkeys.html:30 msgid "Adding passkey failed: " -msgstr "" +msgstr "Att lägga till lösennyckel misslyckades: " #: plinth/modules/users/templates/users_passkeys.html:48 #: plinth/modules/users/views.py:314 msgid "Passkeys" -msgstr "" +msgstr "Lösennycklar" #: 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 "" +"Att arbeta med lösennycklar kräver att du använder webbläsarens Javascript " +"API. Vänligen aktivera Javascript stöd i din webbläsare för att fortsätta." #: plinth/modules/users/templates/users_passkeys.html:66 msgid "" @@ -9856,47 +9854,45 @@ msgid "" "server knows only the public information that can used to verify user's " "signatures." msgstr "" +"Lösennycklar är sätt att verifiera användarens identitet med hjälp av " +"digitala signaturer. De är ett säkrare alternativ till lösenord. Hemlig " +"information hålls med användaren på sin telefon, bärbar dator eller en " +"hårdvaru token och låst med en PIN, fingeravtryck eller ansikte ID. Inga " +"hemligheter lagras på servern. Servern vet bara den offentliga informationen " +"som kan användas för att verifiera användarens signaturer." #: plinth/modules/users/templates/users_passkeys.html:83 #: plinth/modules/users/templates/users_passkeys.html:85 -#, fuzzy -#| msgid "Add password" msgid "Add passkey" -msgstr "Lägg till lösenord" +msgstr "Lägg till lösennyckel" #: plinth/modules/users/templates/users_passkeys.html:93 -#, fuzzy -#| msgid "Domain" msgid "For Domain" -msgstr "Domän" +msgstr "För domän" #: plinth/modules/users/templates/users_passkeys.html:94 msgid "Added" -msgstr "" +msgstr "Tillagd" #: plinth/modules/users/templates/users_passkeys.html:95 -#, fuzzy -#| msgid "Last scanned: " msgid "Last Used" -msgstr "Senast skannad: " +msgstr "Senast använd" #: plinth/modules/users/templates/users_passkeys.html:126 msgid "No passkeys added to user account." -msgstr "" +msgstr "Inga lösennycklar har lagts till på användarkontot." #: plinth/modules/users/templates/users_passkeys.html:135 msgid "Delete passkey ?" -msgstr "" +msgstr "Radera lösennyckel ?" #: plinth/modules/users/templates/users_passkeys.html:145 msgid "You will need this passkey's device to add it back again." -msgstr "" +msgstr "Du behöver denna lösennyckels enhet för att lägga till den igen." #: plinth/modules/users/templates/users_passkeys.html:152 -#, fuzzy -#| msgid "Delete user" msgid "Delete passkey" -msgstr "Radera användare" +msgstr "Radera lösennyckel" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 @@ -9912,6 +9908,7 @@ msgstr "Redigera användare %(username)s" #, python-format msgid "Use passkeys for better security." msgstr "" +"Använd lösennycklar för bättre säkerhet." #: plinth/modules/users/templates/users_update.html:29 #, python-format @@ -9977,20 +9974,16 @@ 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." +msgstr "Lösennyckel med den identifieraren finns redan." #: plinth/modules/users/views.py:431 -#, fuzzy -#| msgid "Edit User" msgid "Edit Passkey" -msgstr "Redigera användar" +msgstr "Redigera Lösennyckel" #: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 msgid "Passkey used is not known." -msgstr "" +msgstr "Lösennyckel som används är inte känd." #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." @@ -10777,10 +10770,8 @@ msgid " System" msgstr " System" #: plinth/templates/base.html:179 plinth/templates/base.html:180 -#, fuzzy -#| msgid "Manage Aliases" msgid "Manage passkeys" -msgstr "Hantera alias" +msgstr "Hantera lösennycklar" #: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" @@ -10836,7 +10827,7 @@ msgstr "Mobil" #: plinth/templates/clients.html:82 msgid "Android APK" -msgstr "" +msgstr "Android APK" #: plinth/templates/clients.html:91 msgid "Play Store" diff --git a/plinth/locale/ta/LC_MESSAGES/django.po b/plinth/locale/ta/LC_MESSAGES/django.po index b48f2ec58..b0a75b355 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2026-03-02 19:53+0000\n" "Last-Translator: James Valleroy \n" "Language-Team: Tamil ஆதரிக்கப்பட்ட கிளையன்ட் பயன்பாடு தேவை. {box_name} உள்நுழைவுடன் எந்த பயனரும் ராடிகலை அணுகலாம்." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7163,7 +7163,7 @@ msgstr "" "முகவரி புத்தகங்களை உருவாக்குவதை மட்டுமே ஆதரிக்கிறது. இது நிகழ்வுகள் அல்லது " "தொடர்புகளைச் சேர்ப்பதை ஆதரிக்காது, இது ஒரு தனி கிளையண்டைப் பயன்படுத்தி செய்யப்பட வேண்டும்." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "தீவிரமான" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index 06b8edc64..451a605a8 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2025-05-14 17:03+0000\n" "Last-Translator: Sripath Roy Koganti \n" "Language-Team: Telugu మద్దతు ఉన్న క్లయింట్ " "అప్లికేషన్ అవసరం. {box_name} లాగిన్ ఉన్న ఏ యూజర్ అయినా Radicaleని యాక్సెస్ చేయవచ్చు." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7034,7 +7034,7 @@ msgstr "" "రూపొందించడానికి మాత్రమే మద్దతు ఇస్తుంది. ఈవెంట్‌లు లేదా పరిచయాలను జోడించడానికి ఇది మద్దతు ఇవ్వదు, ఇది " "ప్రత్యేక క్లయింట్‌ని ఉపయోగించి చేయాలి." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "రాడికేల్" diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index 79ad526ed..9c38d3fea 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-07 00:12+0000\n" -"PO-Revision-Date: 2026-03-25 07:09+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"PO-Revision-Date: 2026-04-09 10:09+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish \n" @@ -7191,7 +7191,7 @@ msgstr "Quasseldroid" msgid "IRC" msgstr "IRC" -#: plinth/modules/radicale/__init__.py:27 +#: plinth/modules/radicale/__init__.py:26 #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " @@ -7205,7 +7205,7 @@ msgstr "" "istemci uygulaması gereklidir. Radicale'ye {box_name} oturum açma adı " "ile herhangi bir kullanıcı tarafından erişilebilir." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7215,7 +7215,7 @@ msgstr "" "temel bir web arayüzü sağlar. Ayrı bir istemci kullanılarak yapılması " "zorunlu olan olayların veya kişilerin eklenmesini desteklemez." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" @@ -9835,14 +9835,12 @@ msgstr "%(username)s kullanıcısını düzenle" #: plinth/modules/users/templates/users_login.html:30 msgid "Logging in with passkey failed: " -msgstr "" +msgstr "Geçiş anahtarıyla oturum açma başarısız oldu: " #: 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 "Bu uygulama tanılamayı desteklemiyor" +msgstr "Tarayıcı geçiş anahtarlarını desteklemiyor." #: plinth/modules/users/templates/users_login.html:57 msgid "Login" @@ -9851,28 +9849,29 @@ msgstr "Oturum aç" #: plinth/modules/users/templates/users_login.html:70 #: plinth/modules/users/templates/users_login.html:72 msgid "Log in with passkey" -msgstr "" +msgstr "Geçiş anahtarıyla oturum aç" #: plinth/modules/users/templates/users_passkey_edit.html:19 -#, fuzzy -#| msgid "Update setup" msgid "Update Passkey" -msgstr "Ayarlamayı güncelle" +msgstr "Geçiş Anahtarını Güncelle" #: plinth/modules/users/templates/users_passkeys.html:30 msgid "Adding passkey failed: " -msgstr "" +msgstr "Geçiş anahtarını ekleme başarısız oldu: " #: plinth/modules/users/templates/users_passkeys.html:48 #: plinth/modules/users/views.py:314 msgid "Passkeys" -msgstr "" +msgstr "Geçiş anahtarları" #: 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 "" +"Geçiş anahtarlarıyla çalışmak, tarayıcının Javascript API'sinin " +"kullanılmasını gerektirir. Devam etmek için lütfen tarayıcınızda Javascript " +"desteğini etkinleştirin." #: plinth/modules/users/templates/users_passkeys.html:66 msgid "" @@ -9883,47 +9882,46 @@ msgid "" "server knows only the public information that can used to verify user's " "signatures." msgstr "" +"Geçiş anahtarları, dijital imzaları kullanarak kullanıcının kimliğini " +"doğrulamasının bir yoludur. Parolalara göre daha güvenli bir " +"alternatiftirdir. Gizli bilgiler kullanıcının telefonunda, dizüstü " +"bilgisayarında veya donanım belirtecinde saklanır ve PIN, parmak izi veya " +"yüz kimliği kullanılarak kilidi açılır. Sunucuda hiçbir gizli anahtar " +"saklanmaz. Sunucu sadece kullanıcının imzalarını doğrulamak için " +"kullanılabilecek genel bilgileri bilir." #: plinth/modules/users/templates/users_passkeys.html:83 #: plinth/modules/users/templates/users_passkeys.html:85 -#, fuzzy -#| msgid "Add password" msgid "Add passkey" -msgstr "Parola ekle" +msgstr "Geçiş anahtarı ekle" #: plinth/modules/users/templates/users_passkeys.html:93 -#, fuzzy -#| msgid "Domain" msgid "For Domain" -msgstr "Etki alanı" +msgstr "Etki Alanı İçin" #: plinth/modules/users/templates/users_passkeys.html:94 msgid "Added" -msgstr "" +msgstr "Eklenen" #: plinth/modules/users/templates/users_passkeys.html:95 -#, fuzzy -#| msgid "Last scanned: " msgid "Last Used" -msgstr "Son taranan: " +msgstr "Son Kullanılan" #: plinth/modules/users/templates/users_passkeys.html:126 msgid "No passkeys added to user account." -msgstr "" +msgstr "Kullanıcı hesabına eklenen geçiş anahtarları yok." #: plinth/modules/users/templates/users_passkeys.html:135 msgid "Delete passkey ?" -msgstr "" +msgstr " geçiş anahtarı silinsin mi?" #: plinth/modules/users/templates/users_passkeys.html:145 msgid "You will need this passkey's device to add it back again." -msgstr "" +msgstr "Tekrar eklemek için bu geçiş anahtarının cihazına ihtiyacınız olacak." #: plinth/modules/users/templates/users_passkeys.html:152 -#, fuzzy -#| msgid "Delete user" msgid "Delete passkey" -msgstr "Kullanıcıyı sil" +msgstr "Geçiş anahtarını sil" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 @@ -9939,6 +9937,8 @@ msgstr "%(username)s Kullanıcısını Düzenleyin" #, python-format msgid "Use passkeys for better security." msgstr "" +"Daha iyi güvenlik için geçiş anahtarlarını " +"kullanın." #: plinth/modules/users/templates/users_update.html:29 #, python-format @@ -10005,20 +10005,16 @@ 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." +msgstr "Bu tanımlayıcıya sahip geçiş anahtarı zaten var." #: plinth/modules/users/views.py:431 -#, fuzzy -#| msgid "Edit User" msgid "Edit Passkey" -msgstr "Kullanıcıyı Düzenle" +msgstr "Geçiş Anahtarını Düzenle" #: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 msgid "Passkey used is not known." -msgstr "" +msgstr "Kullanılan geçiş anahtarı bilinmiyor." #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." @@ -10802,10 +10798,8 @@ 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" +msgstr "Geçiş anahtarlarını yönet" #: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index e8337d0f8..a592d54e5 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2025-12-17 07:00+0000\n" "Last-Translator: Максим Горпиніч \n" "Language-Team: Ukrainian підтримувана клієнтська програма. Radicale може отримати " "доступ будь-який користувач із логіном {box_name}." -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -7248,7 +7248,7 @@ msgstr "" "календарів та адресних книг. Він не підтримує додавання подій або контактів, " "для цього необхідно використовувати окремий клієнт." -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "Radicale" diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po index ee329fbed..9b807601d 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2021-07-28 08:34+0000\n" "Last-Translator: bruh \n" "Language-Team: Vietnamese is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index 57c30d2b4..091120bbf 100644 --- a/plinth/locale/zh_Hans/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hans/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Plinth\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-07 00:12+0000\n" -"PO-Revision-Date: 2026-03-04 05:09+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" +"PO-Revision-Date: 2026-04-08 07:09+0000\n" "Last-Translator: 大王叫我来巡山 " "\n" "Language-Team: Chinese (Simplified Han script) 支持的客户端应用程序。任何拥有 " "{box_name} 登录名的用户都可以访问 Radicale。" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" @@ -8851,10 +8851,8 @@ 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 "此应用程序不支持诊断" +msgstr "浏览器不支持 passkeys。" #: plinth/modules/users/templates/users_login.html:57 msgid "Login" @@ -8866,10 +8864,8 @@ msgid "Log in with passkey" msgstr "" #: plinth/modules/users/templates/users_passkey_edit.html:19 -#, fuzzy -#| msgid "Update setup" msgid "Update Passkey" -msgstr "更新安装程序" +msgstr "更新 Passkey" #: plinth/modules/users/templates/users_passkeys.html:30 msgid "Adding passkey failed: " @@ -8898,26 +8894,20 @@ 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 "添加密码" +msgstr "添加 passkey" #: plinth/modules/users/templates/users_passkeys.html:93 -#, fuzzy -#| msgid "Domain" msgid "For Domain" -msgstr "域名" +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 "上次扫描: " +msgstr "上次使用" #: plinth/modules/users/templates/users_passkeys.html:126 msgid "No passkeys added to user account." @@ -8932,10 +8922,8 @@ 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 "删除用户" +msgstr "删除 passkey" #: plinth/modules/users/templates/users_passkeys.html:155 #: plinth/modules/users/templates/users_update.html:72 @@ -9011,16 +8999,12 @@ 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 "已存在同名共享。" +msgstr "已存在该标识符的 Passkey。" #: plinth/modules/users/views.py:431 -#, fuzzy -#| msgid "Edit User" msgid "Edit Passkey" -msgstr "编辑用户" +msgstr "编辑 Passkey" #: plinth/modules/users/views.py:518 plinth/modules/users/views.py:542 msgid "Passkey used is not known." @@ -9736,10 +9720,8 @@ msgid " System" msgstr " 系统" #: plinth/templates/base.html:179 plinth/templates/base.html:180 -#, fuzzy -#| msgid "Manage Aliases" msgid "Manage passkeys" -msgstr "管理别名" +msgstr "管理 passkeys" #: plinth/templates/base.html:186 plinth/templates/base.html:187 msgid "Change password" diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index b98cf07ee..c1c38042b 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-04-07 00:12+0000\n" +"POT-Creation-Date: 2026-04-28 22:01+0000\n" "PO-Revision-Date: 2025-02-07 12:01+0000\n" "Last-Translator: pesder \n" "Language-Team: Chinese (Traditional Han script) is needed. Radicale can be accessed by any user with a {box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:33 +#: plinth/modules/radicale/__init__.py:32 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:55 +#: plinth/modules/radicale/__init__.py:52 #: plinth/modules/radicale/manifest.py:74 msgid "Radicale" msgstr "" diff --git a/plinth/modules/radicale/__init__.py b/plinth/modules/radicale/__init__.py index f8b355615..7eab78db5 100644 --- a/plinth/modules/radicale/__init__.py +++ b/plinth/modules/radicale/__init__.py @@ -5,7 +5,6 @@ FreedomBox app for radicale. import logging -import augeas from django.utils.translation import gettext_lazy as _ from plinth import app as app_module @@ -37,15 +36,13 @@ _description = [ logger = logging.getLogger(__name__) -CONFIG_FILE = '/etc/radicale/config' - class RadicaleApp(app_module.App): """FreedomBox app for Radicale.""" app_id = 'radicale' - _version = 5 + _version = 6 def __init__(self) -> None: """Create components for the app.""" @@ -129,7 +126,7 @@ class RadicaleApp(app_module.App): if Version(package['new_version']) > Version('4~'): return False - rights = get_rights_value() + rights = privileged.get_rights_value() install(['radicale'], force_configuration='new') privileged.setup() privileged.configure(rights) @@ -140,28 +137,3 @@ class RadicaleApp(app_module.App): """De-configure and uninstall the app.""" super().uninstall() privileged.uninstall() - - -def load_augeas(): - """Prepares the augeas.""" - aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + - augeas.Augeas.NO_MODL_AUTOLOAD) - - # INI file lens - aug.set('/augeas/load/Puppet/lens', 'Puppet.lns') - aug.set('/augeas/load/Puppet/incl[last() + 1]', CONFIG_FILE) - - aug.load() - return aug - - -def get_rights_value(): - """Returns the current Rights value.""" - aug = load_augeas() - value = aug.get('/files' + CONFIG_FILE + '/rights/type') - - if value == 'from_file': - # Default rights file is equivalent to owner_only. - value = 'owner_only' - - return value diff --git a/plinth/modules/radicale/data/usr/share/augeas/lenses/radicale.aug b/plinth/modules/radicale/data/usr/share/augeas/lenses/radicale.aug new file mode 100644 index 000000000..cad3e6f4d --- /dev/null +++ b/plinth/modules/radicale/data/usr/share/augeas/lenses/radicale.aug @@ -0,0 +1,45 @@ +(* Radicale module for Augeas + Based on Puppet lens. + + Manage config file for http://radicale.org/ + /etc/radicale/config is a standard INI File. +*) + + +module Radicale = + autoload xfm + +(************************************************************************ + * INI File settings + * + * /etc/radicale/config only supports "#" as commentary and "=" as separator + *************************************************************************) +let comment = IniFile.comment "#" "#" +let comment_re = /[#]/ +let sep = IniFile.sep "=" "=" + + +(************************************************************************ + * ENTRY + * /etc/radicale/config uses standard INI File entries + *************************************************************************) +let entry = IniFile.entry_generic (Util.indent . key IniFile.entry_re) sep comment_re comment + + +(************************************************************************ + * RECORD + * /etc/radicale/config uses standard INI File records + *************************************************************************) +let title = IniFile.indented_title IniFile.record_re +let record = IniFile.record title entry + + +(************************************************************************ + * LENS & FILTER + * /etc/radicale/config uses standard INI File records + *************************************************************************) +let lns = IniFile.lns record comment + +let filter = (incl "/etc/radicale/config") + +let xfm = transform lns filter diff --git a/plinth/modules/radicale/data/usr/share/augeas/lenses/tests/test_radicale.aug b/plinth/modules/radicale/data/usr/share/augeas/lenses/tests/test_radicale.aug new file mode 100644 index 000000000..085c60152 --- /dev/null +++ b/plinth/modules/radicale/data/usr/share/augeas/lenses/tests/test_radicale.aug @@ -0,0 +1,81 @@ +module Test_radicale = + + let conf = " +[server] + +[encoding] + +[well-known] + +[auth] + +[git] + +[rights] + +[storage] + +[logging] + +[headers] +Content-Security-Policy = default-src 'self'; object-src 'none' + +" + + test Radicale.lns get conf = + {} + { "server" + {} } + { "encoding" + {} } + { "well-known" + {} } + { "auth" + {} } + { "git" + {} } + { "rights" + {} } + { "storage" + {} } + { "logging" + {} } + { "headers" + { "Content-Security-Policy" = "default-src 'self'; object-src 'none'" } + {} } + + test Radicale.lns put conf after + set "server/hosts" "127.0.0.1:5232, [::1]:5232"; + set "server/base_prefix" "/radicale/"; + set "well-known/caldav" "/radicale/%(user)s/caldav/"; + set "well-known/cardav" "/radicale/%(user)s/carddav/"; + set "auth/type" "remote_user"; + set "rights/type" "owner_only"; + set "headers/Content-Security-Policy" "default-src 'self'; object-src 'none'" + = " +[server] + +hosts=127.0.0.1:5232, [::1]:5232 +base_prefix=/radicale/ +[encoding] + +[well-known] + +caldav=/radicale/%(user)s/caldav/ +cardav=/radicale/%(user)s/carddav/ +[auth] + +type=remote_user +[git] + +[rights] + +type=owner_only +[storage] + +[logging] + +[headers] +Content-Security-Policy = default-src 'self'; object-src 'none' + +" diff --git a/plinth/modules/radicale/privileged.py b/plinth/modules/radicale/privileged.py index 75e9bfe17..5799bac67 100644 --- a/plinth/modules/radicale/privileged.py +++ b/plinth/modules/radicale/privileged.py @@ -24,6 +24,7 @@ def setup(): """ aug = load_augeas() aug.set('auth/type', 'remote_user') + aug.set('auth/lc_username', 'True') aug.save() # Service is started again by socket. action_utils.service_stop(SERVICE_NAME) @@ -55,12 +56,24 @@ def load_augeas(): aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + augeas.Augeas.NO_MODL_AUTOLOAD) # INI file lens - aug.transform('Puppet', CONFIG_FILE) + aug.transform('Radicale', CONFIG_FILE) aug.set('/augeas/context', '/files' + CONFIG_FILE) aug.load() return aug +def get_rights_value(): + """Returns the current Rights value.""" + aug = load_augeas() + value = aug.get('rights/type') + + if value == 'from_file': + # Default rights file is equivalent to owner_only. + value = 'owner_only' + + return value + + @privileged def uninstall(): """Remove all radicale collections.""" diff --git a/plinth/modules/radicale/tests/test_functional.py b/plinth/modules/radicale/tests/test_functional.py index e1db34592..a35dde93e 100644 --- a/plinth/modules/radicale/tests/test_functional.py +++ b/plinth/modules/radicale/tests/test_functional.py @@ -83,21 +83,21 @@ def _set_access_rights(browser, access_rights_type): def _calendar_is_available(browser): """Return whether calendar is available at well-known URL.""" - conf = functional.config['DEFAULT'] - url = functional.base_url + '/.well-known/caldav' - logging.captureWarnings(True) - request = requests.get(url, auth=(conf['username'], conf['password']), - verify=False) - logging.captureWarnings(False) - return request.status_code != 404 + return _well_known_available(browser, '/.well-known/caldav') def _addressbook_is_available(browser): """Return whether addressbook is available at well-known URL.""" + return _well_known_available(browser, '/.well-known/carddav') + + +def _well_known_available(browser, wellknown_url: str): + """Return whether a well-known URL redirects to radicale.""" conf = functional.config['DEFAULT'] - url = functional.base_url + '/.well-known/carddav' + url = functional.base_url + wellknown_url logging.captureWarnings(True) request = requests.get(url, auth=(conf['username'], conf['password']), - verify=False) + verify=False, allow_redirects=False) logging.captureWarnings(False) - return request.status_code != 404 + return (request.status_code == 301 + and request.headers['Location'].endswith('/radicale/')) diff --git a/plinth/modules/radicale/views.py b/plinth/modules/radicale/views.py index e7d73b7a6..2aa36cedc 100644 --- a/plinth/modules/radicale/views.py +++ b/plinth/modules/radicale/views.py @@ -8,7 +8,7 @@ from django.utils.translation import gettext_lazy as _ from plinth.views import AppView -from . import get_rights_value, privileged +from . import privileged from .forms import RadicaleForm @@ -20,13 +20,13 @@ class RadicaleAppView(AppView): def get_initial(self): """Return the values to fill in the form.""" initial = super().get_initial() - initial['access_rights'] = get_rights_value() + initial['access_rights'] = privileged.get_rights_value() return initial def form_valid(self, form): """Change the access control of Radicale service.""" data = form.cleaned_data - if get_rights_value() != data['access_rights']: + if privileged.get_rights_value() != data['access_rights']: privileged.configure(data['access_rights']) messages.success(self.request, _('Access rights configuration updated')) diff --git a/plinth/tests/test_action_utils.py b/plinth/tests/test_action_utils.py index 7e6a13c9d..e190a19ba 100644 --- a/plinth/tests/test_action_utils.py +++ b/plinth/tests/test_action_utils.py @@ -20,7 +20,8 @@ from plinth.action_utils import (get_addresses, get_hostname, service_try_reload_or_restart, service_try_restart, service_unmask, umask) -UNKNOWN = 'unknowndeamon' +UNKNOWN = 'unknowndeamon.service' +UNKNOWN_SOCKET = 'unknowndeamon.socket' systemctl_path = pathlib.Path('/usr/bin/systemctl') systemd_installed = pytest.mark.skipif(not systemctl_path.exists(), @@ -76,20 +77,101 @@ def test_service_enable_and_disable(): @patch('plinth.action_utils.service_action') @systemd_installed -def test_service_actions(mock): - """Trivial white box test for trivial implementations.""" +def test_service_start(mock): + """Test staring a service.""" service_start(UNKNOWN) - mock.assert_called_with(UNKNOWN, 'start', check=False) + mock.mock_calls = [call(UNKNOWN, 'start', check=False)] + + mock.reset_mock() + service_start(UNKNOWN, check=True) + mock.mock_calls = [call(UNKNOWN, 'start', check=True)] + + +@patch('plinth.action_utils.service_action') +@systemd_installed +def test_service_stop(mock): + """Test stopping a service.""" service_stop(UNKNOWN) - mock.assert_called_with(UNKNOWN, 'stop', check=False) + assert mock.mock_calls == [call(UNKNOWN, 'stop', check=False)] + + mock.reset_mock() + service_stop(UNKNOWN, check=True) + mock.mock_calls = [call(UNKNOWN, 'stop', check=True)] + + mock.reset_mock() + service_stop(UNKNOWN_SOCKET) + assert mock.mock_calls == [ + call(UNKNOWN_SOCKET, 'stop', check=False), + call(UNKNOWN, 'stop', check=False) + ] + + +@patch('plinth.action_utils.service_action') +@systemd_installed +def test_service_restart(mock): + """Test restaring a service.""" service_restart(UNKNOWN) - mock.assert_called_with(UNKNOWN, 'restart', check=False) + assert mock.mock_calls == [call(UNKNOWN, 'restart', check=False)] + + mock.reset_mock() + service_restart(UNKNOWN, check=True) + mock.mock_calls = [call(UNKNOWN, 'restart', check=True)] + + mock.reset_mock() + service_restart(UNKNOWN_SOCKET) + assert mock.mock_calls == [call(UNKNOWN, 'stop', check=False)] + + +@patch('plinth.action_utils.service_action') +@systemd_installed +def test_service_try_restart(mock): + """Test try-restaring a service.""" service_try_restart(UNKNOWN) - mock.assert_called_with(UNKNOWN, 'try-restart', check=False) + assert mock.mock_calls == [call(UNKNOWN, 'try-restart', check=False)] + + mock.reset_mock() + service_try_restart(UNKNOWN, check=True) + mock.mock_calls = [call(UNKNOWN, 'try-restart', check=True)] + + mock.reset_mock() + service_restart(UNKNOWN_SOCKET) + assert mock.mock_calls == [call(UNKNOWN, 'stop', check=False)] + + +@patch('plinth.action_utils.service_action') +@systemd_installed +def test_service_reload(mock): + """Test reloading a service.""" service_reload(UNKNOWN) - mock.assert_called_with(UNKNOWN, 'reload', check=False) + assert mock.mock_calls == [call(UNKNOWN, 'reload', check=False)] + + mock.reset_mock() + service_reload(UNKNOWN, check=True) + mock.mock_calls = [call(UNKNOWN, 'reload', check=True)] + + mock.reset_mock() + service_reload(UNKNOWN_SOCKET) + assert mock.mock_calls == [call(UNKNOWN, 'reload', check=False)] + + +@patch('plinth.action_utils.service_action') +@systemd_installed +def test_service_try_reload_or_restart(mock): + """Test try-reload-or-restart on a service.""" service_try_reload_or_restart(UNKNOWN) - mock.assert_called_with(UNKNOWN, 'try-reload-or-restart', check=False) + assert mock.mock_calls == [ + call(UNKNOWN, 'try-reload-or-restart', check=False) + ] + + mock.reset_mock() + service_try_reload_or_restart(UNKNOWN, check=True) + mock.mock_calls = [call(UNKNOWN, 'try-reload-or-restart', check=True)] + + mock.reset_mock() + service_try_reload_or_restart(UNKNOWN_SOCKET) + assert mock.mock_calls == [ + call(UNKNOWN, 'try-reload-or-restart', check=False) + ] @pytest.mark.usefixtures('needs_root')