Compare commits

...

7 Commits

Author SHA1 Message Date
James Valleroy
5c42e04813
Release v26.7.1 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-04-28 18:26:58 -04:00
James Valleroy
91296b6e81
doc: Fetch latest manual
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-04-28 18:26:20 -04:00
James Valleroy
449b78ae81
locale: Update translation strings
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-04-28 18:01:49 -04:00
Sunil Mohan Adapa
495f5f8a0d
radicale: tests: functional: Better checking for well-known URLs
- When SOGO app is enabled, radicale functional tests fail.

Tests:

- Enable SOGO app and run radicale functional tests. They fail without patch and
pass with the patch.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-04-27 19:19:53 -04:00
Sunil Mohan Adapa
2bd33ed428
radicale: Fix issue with parsing new configuration file
The latest version of radicale calendar server's configuration file does not
parse with augeas. This is because it contains the following entry in [headers]
section:

Content-Security-Policy = default-src 'self'; object-src 'none'

The semicolon is treated as comment by the lens which is not correct. Fix this
by overriding comment_re in the lens.

Tests:

- Updated test case works when using augparse.

- With the patch, latest upstream configuration file parses without errors.

- Functional tests work for radicale in testing distribution. Without patch
radicale fails to install.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-04-27 19:19:47 -04:00
Sunil Mohan Adapa
ae50ceaeb0
radicale, bepasty: Fix issue with failed diagnostic test
Fixes: #2571.

- During backup, a service related to backup is stopped and then started back
again after the backup. In case of .socket unit, the .service unit is not being
stopped and it continues to listen on the socket path. When the .socket unit is
started back again, it tries to listen on the socket path and fails.

- To fix the issue, when running stop, restart, etc. operations on a .socket
file, try to perform that operations that we actually intend.

Tests:

- Unit tests pass

- Functional tests for bepasty and radicale work.

- After taking a radicale backup uwsgi-app@radicale.socket does not become
inactive (works when service is running or stopped). uwsgi-app@radicale.service
stops if it is running, backup doesn't fail if service is not running.

- After taking a radicale backup uwsgi-app@bepasty-freedombox.socket does not
become inactive (works when service is running or stopped).
uwsgi-app@bepasty-freedombox.service stops if it is running, backup doesn't fail
if service is not running.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-04-27 19:13:14 -04:00
Frederico Gomes
dc3439fd70
radicale: Enable lc_username for case-insensitive auth
Enable lc_username = True in [auth] section during setup.

Bump version.

Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-04-25 13:25:49 -04:00
55 changed files with 497 additions and 238 deletions

16
debian/changelog vendored
View File

@ -1,3 +1,19 @@
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 <jvalleroy@mailbox.org> Tue, 28 Apr 2026 18:26:38 -0400
freedombox (26.7) unstable; urgency=medium
[ Burak Yavuz ]

View File

@ -8,6 +8,13 @@ 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

View File

@ -8,6 +8,13 @@ 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

View File

@ -3,4 +3,4 @@
Package init file.
"""
__version__ = '26.7'
__version__ = '26.7.1'

View File

@ -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):

View File

@ -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 <https://hosted.weblate.org/projects/freedombox/"
@ -6386,7 +6386,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 "
@ -6395,14 +6395,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 ""

View File

@ -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 <an1f3@hotmail.com>\n"
"Language-Team: Arabic (Saudi Arabia) <https://hosted.weblate.org/projects/"
@ -6390,7 +6390,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 "
@ -6399,14 +6399,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 ""

View File

@ -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 ""

View File

@ -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"

View File

@ -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 <saiganeshmurala@gmail.com>\n"
"Language-Team: Bengali <https://hosted.weblate.org/projects/freedombox/"
@ -6409,7 +6409,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 "
@ -6418,14 +6418,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 ""

View File

@ -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 <marti.torra@natana.cat>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/freedombox/"
@ -7170,7 +7170,7 @@ msgstr ""
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 "
@ -7179,14 +7179,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"

View File

@ -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-04-09 10:09+0000\n"
"Last-Translator: Jiří Podhorecký <j.podhorecky@volny.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/freedombox/"
@ -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</a>. 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"

View File

@ -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 <info@ikmaak.nl>\n"
"Language-Team: Danish <https://hosted.weblate.org/projects/freedombox/"
@ -7365,7 +7365,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 "
@ -7385,14 +7385,14 @@ msgstr ""
"carddav-clients\">understøttet klient-applikation</a>. 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 ""

View File

@ -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: 2026-04-09 10:09+0000\n"
"Last-Translator: Dietmar <sagen@permondes.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/freedombox/"
@ -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</a> 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"

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""

View File

@ -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 <jvalleroy@mailbox.org>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/freedombox/"
@ -7441,7 +7441,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 "
@ -7460,7 +7460,7 @@ msgstr ""
"clients/\">πελάτη</a> . Το 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"

View File

@ -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 <fran-carro@hotmail.es>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/freedombox/"
@ -7381,7 +7381,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 "
@ -7401,7 +7401,7 @@ msgstr ""
"supported-clients\">aplicación cliente soportada</a>. 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"

View File

@ -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 <jrthwlate@users.noreply.hosted.weblate.org>\n"
"Language-Team: Estonian <https://hosted.weblate.org/projects/freedombox/"
@ -6384,7 +6384,7 @@ msgstr ""
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 "
@ -6393,14 +6393,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"

View File

@ -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 <info@ikmaak.nl>\n"
"Language-Team: Persian <https://hosted.weblate.org/projects/freedombox/"
@ -7062,7 +7062,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 "
@ -7071,14 +7071,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 ""

View File

@ -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 <sunil@medhas.org>\n"
"Language-Team: Plinth Developers <freedombox-"
@ -7390,7 +7390,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 "
@ -7399,14 +7399,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 ""

View File

@ -7,7 +7,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: 2026-04-16 15:09+0000\n"
"Last-Translator: Coucouf <coucouf@coucouf.fr>\n"
"Language-Team: French <https://hosted.weblate.org/projects/freedombox/"
@ -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 dun 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 lajout 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"

View File

@ -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 <fran-carro@hotmail.es>\n"
"Language-Team: Galician <https://hosted.weblate.org/projects/freedombox/"
@ -6385,7 +6385,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 "
@ -6394,14 +6394,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 ""

View File

@ -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 <info@ikmaak.nl>\n"
"Language-Team: Gujarati <https://hosted.weblate.org/projects/freedombox/"
@ -6776,7 +6776,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 "
@ -6785,14 +6785,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 ""

View File

@ -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 <ankitsuraj1111@gmail.com>\n"
"Language-Team: Hindi <https://hosted.weblate.org/projects/freedombox/"
@ -7329,7 +7329,7 @@ msgstr "क्वासेलड्रोइड"
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 "
@ -7347,14 +7347,14 @@ msgstr ""
"radicale.org/clients/\">समर्थित क्लाइंट एप्लिकेशन</a> कि जरुरत है. राडिकैल किसी "
"{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 "राडिकैल"

View File

@ -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 "
"<andrascc86288f63c44cb5@users.noreply.hosted.weblate.org>\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</a> 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"

View File

@ -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 <info@ikmaak.nl>\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/freedombox/"
@ -7047,7 +7047,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 "
@ -7056,14 +7056,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"

View File

@ -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-04-18 21:09+0000\n"
"Last-Translator: Pierfrancesco Passerini <p.passerini@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/freedombox/"
@ -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</a>. 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"

View File

@ -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 <nogajun@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/freedombox/"
@ -6348,7 +6348,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 "
@ -6357,14 +6357,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 ""

View File

@ -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 <yogesh@karnatakaeducation.org.in>\n"
"Language-Team: Kannada <https://hosted.weblate.org/projects/freedombox/"
@ -6343,7 +6343,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 "
@ -6352,14 +6352,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 ""

View File

@ -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 <info@ikmaak.nl>\n"
"Language-Team: Lithuanian <https://hosted.weblate.org/projects/freedombox/"
@ -6363,7 +6363,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 "
@ -6372,14 +6372,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 ""

View File

@ -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 <info@ikmaak.nl>\n"
"Language-Team: Latvian <https://hosted.weblate.org/projects/freedombox/"
@ -6362,7 +6362,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 "
@ -6371,14 +6371,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 ""

View File

@ -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 <sunil@medhas.org>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
@ -7433,7 +7433,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 "
@ -7451,7 +7451,7 @@ msgstr ""
"href=\"http://radicale.org/clients/\">støttet klientprogram </a>. 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"

View File

@ -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 <info@ikmaak.nl>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/freedombox/"
@ -7172,7 +7172,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 "
@ -7186,7 +7186,7 @@ msgstr ""
"clienttoepassing</a> 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"

View File

@ -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 <adamdomenek@protonmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/freedombox/"
@ -7012,7 +7012,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 "
@ -7021,14 +7021,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"

View File

@ -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 <wikigeolog@gmx.com>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/freedombox/"
@ -7266,7 +7266,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 "
@ -7280,7 +7280,7 @@ msgstr ""
"radicale.org/master.html#supported-clients\"&gt;&lt;/a&gt; . O Radicale pode "
"ser acessado por qualquer usuário com um login {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, "
@ -7290,7 +7290,7 @@ msgstr ""
"novos calendários e catálogos de endereços. Não permite adicionar eventos ou "
"contatos, o que deve ser feito usando um cliente separado."
#: plinth/modules/radicale/__init__.py:55
#: plinth/modules/radicale/__init__.py:52
#: plinth/modules/radicale/manifest.py:74
msgid "Radicale"
msgstr "Radical"

View File

@ -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-15 18:09+0000\n"
"Last-Translator: OwlGale <owlgale@users.noreply.hosted.weblate.org>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/freedombox/"
@ -7224,7 +7224,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 "
@ -7238,7 +7238,7 @@ msgstr ""
"clients\">поддерживаемое клиентское приложение</a>. Доступ к 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"

View File

@ -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 <R45XvezA@protonmail.ch>\n"
"Language-Team: Sinhala <https://hosted.weblate.org/projects/freedombox/"
@ -6343,7 +6343,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 "
@ -6352,14 +6352,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 ""

View File

@ -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 <info@ikmaak.nl>\n"
"Language-Team: Slovenian <https://hosted.weblate.org/projects/freedombox/"
@ -6698,7 +6698,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 "
@ -6707,14 +6707,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 ""

View File

@ -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-04-08 07:09+0000\n"
"Last-Translator: Besnik Bleta <besnik@programeshqip.org>\n"
"Language-Team: Albanian <https://hosted.weblate.org/projects/freedombox/"
@ -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. Smbulon 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"

View File

@ -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 <info@ikmaak.nl>\n"
"Language-Team: Serbian <https://hosted.weblate.org/projects/freedombox/"
@ -6597,7 +6597,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 "
@ -6606,14 +6606,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 ""

View File

@ -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-04-15 10:10+0000\n"
"Last-Translator: bittin1ddc447d824349b2 <bittin@reimu.nl>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/freedombox/"
@ -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</a>. 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"

View File

@ -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 <jvalleroy@mailbox.org>\n"
"Language-Team: Tamil <https://hosted.weblate.org/projects/freedombox/"
@ -7140,7 +7140,7 @@ msgstr "குவாசெல்ட்ராய்டு"
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 "
@ -7153,7 +7153,7 @@ msgstr ""
"radicale.org/master.html#supported-comients\"> ஆதரிக்கப்பட்ட கிளையன்ட் பயன்பாடு </"
"a> தேவை. {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 "தீவிரமான"

View File

@ -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 <sripathroy@swecha.net>\n"
"Language-Team: Telugu <https://hosted.weblate.org/projects/freedombox/"
@ -7011,7 +7011,7 @@ msgstr "క్వాసెల్ డ్రొఇడ్"
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 "
@ -7024,7 +7024,7 @@ msgstr ""
"href=\"https://radicale.org/master.html#supported-clients\">మద్దతు ఉన్న క్లయింట్ "
"అప్లికేషన్</a> అవసరం. {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 "రాడికేల్"

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-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-04-09 10:09+0000\n"
"Last-Translator: Burak Yavuz <hitowerdigit@hotmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/freedombox/"
@ -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ı</a> 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"

View File

@ -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: Максим Горпиніч <gorpinicmaksim0@gmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/freedombox/"
@ -7224,7 +7224,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 "
@ -7238,7 +7238,7 @@ msgstr ""
"clients\">підтримувана клієнтська програма</a>. 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"

View File

@ -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 <quangtrung02hn16@gmail.com>\n"
"Language-Team: Vietnamese <https://hosted.weblate.org/projects/freedombox/"
@ -6774,7 +6774,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 "
@ -6783,14 +6783,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 ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Plinth\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-04-08 07:09+0000\n"
"Last-Translator: 大王叫我来巡山 "
"<hamburger2048@users.noreply.hosted.weblate.org>\n"
@ -6542,7 +6542,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 "
@ -6555,14 +6555,14 @@ msgstr ""
"master.html#supported-clients\">支持的客户端应用程序</a>。任何拥有 "
"{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 ""

View File

@ -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 <j_h_liau@yahoo.com.tw>\n"
"Language-Team: Chinese (Traditional Han script) <https://hosted.weblate.org/"
@ -6674,7 +6674,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 "
@ -6683,14 +6683,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 ""

View File

@ -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

View File

@ -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

View File

@ -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'
"

View File

@ -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."""

View File

@ -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/'))

View File

@ -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'))

View File

@ -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')