freedombox Debian release 25.5

-----BEGIN PGP SIGNATURE-----
 
 iQJKBAABCgA0FiEEfWrbdQ+RCFWJSEvmd8DHXntlCAgFAmfPmDgWHGp2YWxsZXJv
 eUBtYWlsYm94Lm9yZwAKCRB3wMdee2UICNszD/9ZLWgnz7NAnYa3HQaF/x0sdqjG
 okAcqub+VW2RDJMA5pGUM8yYK/vpPehlqFOijq/AVwWIfFEa4YEItrlIRpSAk0B6
 QNFIpSNoNInjBXO8aYa8vZwS2J36I1z5jvERGYkO2DGiAyyrNoWZXMnT62MOZgY3
 85aJGaMAY3aP65YYw0QBdN5PGH9HkEqghP5aI7+KU3MSx1vLya9CjPSe37IfuVFj
 eVWSjc5N19kml7ZxS67MmYYYdPCoh4tABzfkGNaev/UmkcjVMtiKmMFbME2pynMx
 fR8/EpqffsKlnCNnlb1fYCp6JiEH9uQ6DY7O591Fthd0Y+9wCBmu2DaG7AtgP4FW
 j26cfqcpF/d2ME9ELqbkodEno3Bj6jz43yeY1ZgejxeOqlvbBEuVIv3LJ99tsOT0
 wpQ6HZ148xJOJj29uA6JAz0w/eBEX5S6LZDKOOJHrCaZ0Gq+zcQYMGXkEywuG86m
 fKIlR2pgDX1w4LT+mTipTun4tzvncekNknoCQ+/+B5P/7kdjSv+hPdU+6LZlrGRM
 EuZ4Wtb26qjZF10Kl9VPcSuxfbcF6A/ZLsDzlte+3/axxn9p5oNv05ZvGVb7fiqj
 Ok1tNnBsM4v+DcVaDK2tP9/n7DtSLan0cIK4vxUnwUmgJ6pytVzlLXyFxo47bJJ1
 DDOI44V2ZRmT9hc9tg==
 =WFpX
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQJKBAABCgA0FiEEfWrbdQ+RCFWJSEvmd8DHXntlCAgFAmfUEo0WHGp2YWxsZXJv
 eUBtYWlsYm94Lm9yZwAKCRB3wMdee2UICPtzD/9aCRzcdOJmnSfT7FsGB74JLBPN
 UIzKBx3TiITaDYCrffOnkiSSaBUHGvHlsw5Okk0WnK9nc23kS/uVnBP37aLCPXrB
 kzMv+2QzkvS8k42VQ/G84m2kbroDH80rs/QJqe4Hw0qfLc4Cv3QwE5Bz6U1I8ok0
 8oT0ciUlM+0QYKvffEe+LmZJcG/NCuQYWqxU5umPWFNWh3AE3dnJ2FzdbGHZF4ui
 4SbtO7gAjJeZAizLciFeMXJIH3CETPZzpNenXQnIjJTQXiCK1fj9ZshUXn9hxocg
 9/lDb6qv9gL/cHGZsQCsXs81HyaJ3XOOWL1sFzDOmRDTCY30NUTrZ1LQsQzvFbqt
 p7CPwTXD4JnS7tPoB8TqiaK98xqHBS1KDvlImzN2/t8cENPEcsLE4yG4TWGvPxjG
 riOB9oXlaImnBSYKzVhGs7OYnivFpbb3WgZoXFD1Vk8o8el5QvG5/zUDVYnSr4Xa
 wjR2d1fO4zDsO6r1pioMllC0Cnzl6tZqsHMSAyJjwBllluFCGsWNE3H4FkQeoJT4
 s/VBMdMfwKCnnmDONvHHG2f6/QoP8bpdBZqhgWO7OY9BDe/P0LDv4bPOjd/LyofC
 CtGTWKhyB7N3acyikB7etOgLMoHjxFtM9K7urEitPW0Adbv/jEAvugft1wqMa0RZ
 qe5bAKtoMA1U5sOboA==
 =wwy4
 -----END PGP SIGNATURE-----

Merge tag 'v25.5' into debian/bookworm-backports

freedombox Debian release 25.5

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
James Valleroy 2025-03-14 07:27:06 -04:00
commit ce4c9e58a9
70 changed files with 2772 additions and 2483 deletions

41
debian/changelog vendored
View File

@ -1,3 +1,44 @@
freedombox (25.5) unstable; urgency=medium
[ Sunil Mohan Adapa ]
* sogo: Fix a typo in tags
* ui: tags: Show tags on all cards pages if present
* ui: tags: Minor refactoring in menu filtering and sorting
* ui: tags: Add tag search/filter for system page
* ui: tags: Redirect to apps or system page appropriately
* ui: Minor change with renaming a variable
* ui: system: When canceling search stay on current page
* upgrades: Split dist upgrade into a separate module
* upgrades: Drop special handling for searx
* upgrades: Refactor code to disable snapshots
* upgrades: Refactor code for disabling Quassel during dist-upgrade
* upgrades: Use systemd-run to create transient service
* upgrades: Refactor code to hold packages
* upgrades: Split the main dist upgrade code
* upgrades: Relax list of packages to hold during dist upgrade
* upgrades: Perform sources file update more reliably
* upgrades: Refactor code to retrieve the new codename
* upgrades: Use systemd service status instead of flag file
* upgrades: Simplify dist upgrades checks using exceptions
* upgrades: Log apt output to journal during dist upgrade
* upgrades: Log messages using python logging framework
* upgrades: Simplify some global names
* action_utils: Ensure that package are unheld if dist upgrade fails
* upgrades: Perform easier checks first during dist upgrade
* upgrades: tests: Add unit tests for dist upgrade methods
* upgrades: Minor refactor to pre-dist upgrade checks
* upgrades: Use bind mounts to edit sources file only upon completion
* setup: Fix issue with pending app update and force upgrade
[ Максим Горпиніч ]
* Translated using Weblate (Ukrainian)
[ James Valleroy ]
* locale: Update translation strings
* doc: Fetch latest manual
-- James Valleroy <jvalleroy@mailbox.org> Mon, 10 Mar 2025 20:52:29 -0400
freedombox (25.4.1~bpo12+1) bookworm-backports; urgency=medium
* Rebuild for bookworm-backports.

View File

@ -0,0 +1,26 @@
<<TableOfContents(3)>>
## BEGIN_INCLUDE
!FreedomBox is built on the Debian operating system. Approximately every two years, there is a new stable Debian release. !FreedomBox provides the option of [[FreedomBox/Manual/Upgrades#Auto-Update_to_Next_Stable_Release|automatically handling the upgrade]] to the new version of Debian after it is released.
The current stable release is Debian 12 "bookworm". Below are additional considerations to have in mind when upgrading to a new release of Debian.
== Debian 13 "trixie" ==
=== TT-RSS no longer supported ===
The [[DebianPts:tt-rss]] package has been removed from the next Debian release. It is recommended to move to one of the following options as a replacement:
* [[FreedomBox/Manual/Miniflux|Miniflux]]
* [[FreedomBox/Manual/Nextcloud|Nextcloud News]]
=== Searx app no longer supported ===
The [[DebianPts:searx]] package has been removed from the next Debian release. There is currently no replacement for Searx app in !FreedomBox. Searx app will no longer received security updates, so it is recommended to stop using the app, and to uninstall it.
## END_INCLUDE
<<Include(FreedomBox/Portal)>>
----
CategoryFreedomBox

View File

@ -8,6 +8,43 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version.
== FreedomBox 25.5 (2025-03-10) ==
=== Highlights ===
* ui: tags: Add tag search/filter for system page
=== Other Changes ===
* action_utils: Ensure that package are unheld if dist upgrade fails
* locale: Update translations for Ukrainian
* setup: Fix issue with pending app update and force upgrade
* sogo: Fix a typo in tags
* ui: Minor change with renaming a variable
* ui: system: When canceling search stay on current page
* ui: tags: Minor refactoring in menu filtering and sorting
* ui: tags: Redirect to apps or system page appropriately
* ui: tags: Show tags on all cards pages if present
* upgrades: Drop special handling for searx
* upgrades: Log apt output to journal during dist upgrade
* upgrades: Log messages using python logging framework
* upgrades: Minor refactor to pre-dist upgrade checks
* upgrades: Perform easier checks first during dist upgrade
* upgrades: Perform sources file update more reliably
* upgrades: Refactor code for disabling Quassel during dist-upgrade
* upgrades: Refactor code to disable snapshots
* upgrades: Refactor code to hold packages
* upgrades: Refactor code to retrieve the new codename
* upgrades: Relax list of packages to hold during dist upgrade
* upgrades: Simplify dist upgrades checks using exceptions
* upgrades: Simplify some global names
* upgrades: Split dist upgrade into a separate module
* upgrades: Split the main dist upgrade code
* upgrades: Use bind mounts to edit sources file only upon completion
* upgrades: Use systemd service status instead of flag file
* upgrades: Use systemd-run to create transient service
* upgrades: tests: Add unit tests for dist upgrade methods
== FreedomBox 25.4.1 (2025-03-02) ==
* debian: Move e2fsprogs to Recommends

View File

@ -78,16 +78,10 @@ Auto-update is recommended for most users. However if you want to do the update
* Take backups of your apps' data before performing the update.
* Create a system snapshot before you begin.
* General [[DebianUpgrade|instructions]] for upgrading Debian distribution are available.
* Some packages are known to have prompts during upgrade, due to modified conffiles. It is recommended not to upgrade these packages manually, but rather to allow !FreedomBox to handle their upgrade automatically. This applies to the following packages:
* bind9
* Some packages are known to have prompts during upgrade, due to modified conffiles. It is recommended not to upgrade these packages manually, but rather to allow !FreedomBox to handle their upgrade automatically. For upgrade to Debian 13 "trixie", this applies to the following packages:
* firewalld
* janus
* minetest-server
* minidlna
* mumble-server
* radicale
* roundcube-core
* tt-rss
## END_INCLUDE

View File

@ -103,6 +103,10 @@
<<Include(FreedomBox/Hardware/RaspberryPi4B, , to="## END_INCLUDE")>>
<<Include(FreedomBox/Hardware/USBWiFi, , to="## END_INCLUDE")>>
= Debian Upgrade Notes =
<<Include(FreedomBox/DebianUpgradeNotes, , from="## BEGIN_INCLUDE", to="## END_INCLUDE")>>
= Release Notes =
<<Include(FreedomBox/ReleaseNotes, , from="## BEGIN_INCLUDE", to="## END_INCLUDE")>>

View File

@ -103,6 +103,10 @@
<<Include(FreedomBox/Hardware/RaspberryPi4B, , to="## END_INCLUDE")>>
<<Include(FreedomBox/Hardware/USBWiFi, , to="## END_INCLUDE")>>
= Debian Upgrade Notes =
<<Include(FreedomBox/DebianUpgradeNotes, , from="## BEGIN_INCLUDE", to="## END_INCLUDE")>>
= Release Notes =
<<Include(FreedomBox/ReleaseNotes, , from="## BEGIN_INCLUDE", to="## END_INCLUDE")>>

View File

@ -8,6 +8,43 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version.
== FreedomBox 25.5 (2025-03-10) ==
=== Highlights ===
* ui: tags: Add tag search/filter for system page
=== Other Changes ===
* action_utils: Ensure that package are unheld if dist upgrade fails
* locale: Update translations for Ukrainian
* setup: Fix issue with pending app update and force upgrade
* sogo: Fix a typo in tags
* ui: Minor change with renaming a variable
* ui: system: When canceling search stay on current page
* ui: tags: Minor refactoring in menu filtering and sorting
* ui: tags: Redirect to apps or system page appropriately
* ui: tags: Show tags on all cards pages if present
* upgrades: Drop special handling for searx
* upgrades: Log apt output to journal during dist upgrade
* upgrades: Log messages using python logging framework
* upgrades: Minor refactor to pre-dist upgrade checks
* upgrades: Perform easier checks first during dist upgrade
* upgrades: Perform sources file update more reliably
* upgrades: Refactor code for disabling Quassel during dist-upgrade
* upgrades: Refactor code to disable snapshots
* upgrades: Refactor code to hold packages
* upgrades: Refactor code to retrieve the new codename
* upgrades: Relax list of packages to hold during dist upgrade
* upgrades: Simplify dist upgrades checks using exceptions
* upgrades: Simplify some global names
* upgrades: Split dist upgrade into a separate module
* upgrades: Split the main dist upgrade code
* upgrades: Use bind mounts to edit sources file only upon completion
* upgrades: Use systemd service status instead of flag file
* upgrades: Use systemd-run to create transient service
* upgrades: tests: Add unit tests for dist upgrade methods
== FreedomBox 25.4.1 (2025-03-02) ==
* debian: Move e2fsprogs to Recommends

View File

@ -3,4 +3,4 @@
Package init file.
"""
__version__ = '25.4.1'
__version__ = '25.5'

View File

@ -449,14 +449,14 @@ def is_disk_image():
return os.path.exists('/var/lib/freedombox/is-freedombox-disk-image')
def run_apt_command(arguments):
def run_apt_command(arguments, stdout=subprocess.DEVNULL):
"""Run apt-get with provided arguments."""
command = ['apt-get', '--assume-yes', '--quiet=2'] + arguments
env = os.environ.copy()
env['DEBIAN_FRONTEND'] = 'noninteractive'
process = subprocess.run(command, stdin=subprocess.DEVNULL,
stdout=subprocess.DEVNULL, env=env, check=False)
process = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=stdout,
env=env, check=False)
return process.returncode
@ -475,19 +475,20 @@ def apt_hold(packages):
"""
held_packages = []
for package in packages:
current_hold = subprocess.check_output(
['apt-mark', 'showhold', package])
if not current_hold:
process = subprocess.run(['apt-mark', 'hold', package],
check=False)
if process.returncode == 0: # success
held_packages.append(package)
try:
for package in packages:
current_hold = subprocess.check_output(
['apt-mark', 'showhold', package])
if not current_hold:
process = subprocess.run(['apt-mark', 'hold', package],
check=False)
if process.returncode == 0: # success
held_packages.append(package)
yield held_packages
for package in held_packages:
subprocess.check_call(['apt-mark', 'unhold', package])
yield held_packages
finally:
for package in held_packages:
subprocess.check_call(['apt-mark', 'unhold', package])
@contextmanager

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2023-10-19 06:18+0000\n"
"Last-Translator: Shaik <arifashaik807@gmail.com>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/freedombox/"
@ -2555,7 +2555,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4208,7 +4208,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6142,7 +6142,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7050,10 +7050,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -7797,27 +7793,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -8851,14 +8847,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9065,6 +9053,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9095,11 +9091,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2568,7 +2568,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4229,7 +4229,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6167,7 +6167,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7077,10 +7077,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -7824,27 +7820,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -8878,14 +8874,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9092,6 +9080,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9122,11 +9118,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@ -2548,7 +2548,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4191,7 +4191,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6121,7 +6121,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7027,10 +7027,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -7773,27 +7769,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -8815,14 +8811,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9029,6 +9017,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9057,11 +9053,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,10 +7,10 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2025-02-25 21:04+0000\n"
"Last-Translator: 109247019824 <109247019824@users.noreply.hosted.weblate.org>"
"\n"
"Last-Translator: 109247019824 <109247019824@users.noreply.hosted.weblate."
"org>\n"
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/freedombox/"
"freedombox/bg/>\n"
"Language: bg\n"
@ -2670,7 +2670,7 @@ msgstr "Включено"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Изключено"
@ -4391,7 +4391,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr "Сървърът на Mumble е настроен"
@ -6430,7 +6430,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7366,10 +7366,6 @@ msgstr ""
msgid "Webmail"
msgstr "Webmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr "Календар"
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr "Адресна книга"
@ -8201,11 +8197,22 @@ msgstr ""
"Автоматичното обновяване, по подразбиране, се извършва всеки ден. Извършете "
"го за първи път ръчно сега."
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "Започнато е обновяване на дистрибуцията"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Започнато е обновяване до следващото стабилно издание. То може да отнеме "
"дълго време."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "Обновяването на дистрибуцията не може да бъде стартирано"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -8216,18 +8223,7 @@ msgstr ""
"включено нов опит за обновяване на дистрибуцията ще бъде направен отново "
"след 24 часа."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "Започнато е обновяване на дистрибуцията"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Започнато е обновяване до следващото стабилно издание. То може да отнеме "
"дълго време."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr "Проверка за задържани от обновяване пакети"
@ -9312,14 +9308,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Услугата <em>%(service_name)s</em> не работи."
#: templates/apps.html:33
msgid "Search with tags"
msgstr "Търсене по етикети"
#: templates/apps.html:46
msgid "Clear all tags"
msgstr "Изчистване на всички етикети"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9532,6 +9520,14 @@ msgstr ""
msgid "Update"
msgstr "Обновяване"
#: templates/tags.html:24
msgid "Search with tags"
msgstr "Търсене по етикети"
#: templates/tags.html:37
msgid "Clear all tags"
msgstr "Изчистване на всички етикети"
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "Резервно копие"
@ -9562,11 +9558,11 @@ msgstr ""
msgid "Here"
msgstr "Тук"
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Настройките не са променени"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "преди премахване на {app_id}"
@ -9575,6 +9571,9 @@ msgstr "преди премахване на {app_id}"
msgid "Gujarati"
msgstr "Гуджарати"
#~ msgid "Calender"
#~ msgstr "Календар"
#~ msgid "Set Domain Name"
#~ msgstr "Име на домейн"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2021-06-16 07:33+0000\n"
"Last-Translator: Oymate <dhruboadittya96@gmail.com>\n"
"Language-Team: Bengali <https://hosted.weblate.org/projects/freedombox/"
@ -2594,7 +2594,7 @@ msgstr "সক্রিয়"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "নিষ্ক্রিয়"
@ -4245,7 +4245,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6183,7 +6183,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7093,10 +7093,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -7841,27 +7837,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -8888,14 +8884,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9104,6 +9092,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9132,11 +9128,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2025-02-27 05:06+0000\n"
"Last-Translator: Jiří Podhorecký <j.podhorecky@volny.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/freedombox/"
@ -2793,7 +2793,7 @@ msgstr "Zapnuto"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Vypnuto"
@ -4703,7 +4703,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr "Server Mumble je nakonfigurován"
@ -6923,7 +6923,7 @@ msgstr ""
"své uživatelské jméno. Po kliknutí na tlačítko vyhledávání se zobrazí seznam "
"existujících kalendářů a adresářů."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr "Kalendář"
@ -7966,10 +7966,6 @@ msgstr "Thunderbird + SOGo konektor"
msgid "Webmail"
msgstr "Webmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr "Kalendář"
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr "Záznamník adres"
@ -8829,11 +8825,21 @@ msgstr ""
"Automatická aktualizace softwaru probíhá ve výchozím nastavení denně. Poprvé "
"ji nyní spusťte ručně."
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "Zahájena aktualizace distribuce"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Zahájena aktualizace na další stabilní verzi. Dokončení může trvat dlouho."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "Nelze spustit aktualizaci distribuce"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -8843,17 +8849,7 @@ msgstr ""
"distribuce. Zajistěte, aby bylo volných alespoň 5 GB. Aktualizace distribuce "
"se bude opakovat po 24 hodinách, pokud je povolena."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "Zahájena aktualizace distribuce"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Zahájena aktualizace na další stabilní verzi. Dokončení může trvat dlouho."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr "Kontrola zadržení balíčku"
@ -9996,14 +9992,6 @@ msgstr "Instalace"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Služba <em>%(service_name)s</em> není spuštěná."
#: templates/apps.html:33
msgid "Search with tags"
msgstr "Hledání pomocí štítků"
#: templates/apps.html:46
msgid "Clear all tags"
msgstr "Vymazat všechny štítky"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10232,6 +10220,14 @@ msgstr ""
msgid "Update"
msgstr "Aktualizovat"
#: templates/tags.html:24
msgid "Search with tags"
msgstr "Hledání pomocí štítků"
#: templates/tags.html:37
msgid "Clear all tags"
msgstr "Vymazat všechny štítky"
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "Záloha"
@ -10262,11 +10258,11 @@ msgstr ""
msgid "Here"
msgstr "Zde"
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Nastavení se nezměnila"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "před odinstalací {app_id}"
@ -10275,6 +10271,9 @@ msgstr "před odinstalací {app_id}"
msgid "Gujarati"
msgstr "gudžarátština"
#~ msgid "Calender"
#~ msgstr "Kalendář"
#~ msgid "No status available."
#~ msgstr "Stav není k dispozici."

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2935,7 +2935,7 @@ msgstr "Aktiveret"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Deaktiveret"
@ -4871,7 +4871,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "Mumble server is running"
msgid "Mumble server is configured"
@ -7112,7 +7112,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -8172,10 +8172,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -9034,29 +9030,29 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
#, fuzzy
#| msgid "Automatic upgrades disabled"
msgid "Distribution update started"
msgstr "Automatisk opdatering deaktiveret"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
#, fuzzy
#| msgid "Automatic upgrades disabled"
msgid "Distribution update started"
msgstr "Automatisk opdatering deaktiveret"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -10255,14 +10251,6 @@ msgstr "Installation"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Tjenestesøgningstjenesten er ikke aktiv"
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10491,6 +10479,14 @@ msgstr ""
msgid "Update"
msgstr "Opdater"
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -10526,11 +10522,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Indstilling uændret"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2025-02-27 05:06+0000\n"
"Last-Translator: Dietmar <sagen@permondes.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/freedombox/"
@ -2856,7 +2856,7 @@ msgstr "Aktiviert"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Deaktiviert"
@ -4819,7 +4819,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr "Mumble-Server ist konfiguriert"
@ -7077,7 +7077,7 @@ msgstr ""
"freedombox.adresse>) und ihren Benutzernamen. Wenn Sie auf den Suchen-Knopf "
"drücken, werden die bestehenden Kalender und Adressbücher aufgelistet."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr "Kalender"
@ -8138,10 +8138,6 @@ msgstr ""
msgid "Webmail"
msgstr "Webmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr "Kalender"
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr "Adressbuch"
@ -9026,11 +9022,22 @@ msgstr ""
"Die automatische Software-Aktualisierung wird standardmäßig täglich "
"ausgeführt. Führen Sie es jetzt zum ersten Mal manuell aus."
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "Distributions-Upgrade gestartet"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Das Update auf die nächste stabile Version wurde gestartet. Dies kann eine "
"lange Zeit in Anspruch nehmen."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "Distributions-Update konnte nicht gestartet werden"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -9041,18 +9048,7 @@ msgstr ""
"mindestens 5 GB frei sind. Das Distributions-Update wird nach 24 Stunden "
"erneut versucht, falls aktiviert."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "Distributions-Upgrade gestartet"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Das Update auf die nächste stabile Version wurde gestartet. Dies kann eine "
"lange Zeit in Anspruch nehmen."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr "Auf Paket-Sperren überprüfen"
@ -10230,14 +10226,6 @@ msgstr "Installation"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Dienst <em>%(service_name)s</em> läuft nicht."
#: templates/apps.html:33
msgid "Search with tags"
msgstr "Suche mit Schlagwörtern"
#: templates/apps.html:46
msgid "Clear all tags"
msgstr "Alle Schlagwörter löschen"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10465,6 +10453,14 @@ msgstr ""
msgid "Update"
msgstr "Aktualisieren"
#: templates/tags.html:24
msgid "Search with tags"
msgstr "Suche mit Schlagwörtern"
#: templates/tags.html:37
msgid "Clear all tags"
msgstr "Alle Schlagwörter löschen"
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "Sicherungskopie"
@ -10495,11 +10491,11 @@ msgstr ""
msgid "Here"
msgstr "Hier"
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Einstellung unverändert"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "vor der Deinstallation von {app_id}"
@ -10508,6 +10504,9 @@ msgstr "vor der Deinstallation von {app_id}"
msgid "Gujarati"
msgstr "Gujarati"
#~ msgid "Calender"
#~ msgstr "Kalender"
#~ msgid "No status available."
#~ msgstr "Kein Status verfügbar."

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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"
@ -2549,7 +2549,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4192,7 +4192,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6122,7 +6122,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7028,10 +7028,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -7774,27 +7770,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -8816,14 +8812,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9030,6 +9018,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9058,11 +9054,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2022-09-14 17:20+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/freedombox/"
@ -2979,7 +2979,7 @@ msgstr "Ενεργοποιήθηκε"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Απενεργοποιήθηκε"
@ -4989,7 +4989,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -7259,7 +7259,7 @@ msgstr ""
"κλικ στο κουμπί αναζήτηση σε λίστα με υπάρχοντα ημερολόγια και βιβλία "
"διευθύνσεων."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calendar"
@ -8388,12 +8388,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calender"
msgstr "GNOME Calendar"
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -9281,29 +9275,29 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
#, fuzzy
#| msgid "Automatic upgrades disabled"
msgid "Distribution update started"
msgstr "Oι αυτόματες ενημερώσεις απενεργοποιήθηκαν"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
#, fuzzy
#| msgid "Automatic upgrades disabled"
msgid "Distribution update started"
msgstr "Oι αυτόματες ενημερώσεις απενεργοποιήθηκαν"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -10534,18 +10528,6 @@ msgstr "Εγκατάσταση"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Η υπηρεσία <em>%(service_name)s </em> δεν εκτελείται."
#: templates/apps.html:33
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Αναζήτηση στο διαδίκτυο"
#: templates/apps.html:46
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Αναζήτηση στο διαδίκτυο"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10781,6 +10763,18 @@ msgstr ""
msgid "Update"
msgstr "Ενημερωμένη έκδοση"
#: templates/tags.html:24
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Αναζήτηση στο διαδίκτυο"
#: templates/tags.html:37
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Αναζήτηση στο διαδίκτυο"
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -10816,11 +10810,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Οι ρυθμίσεις δεν άλλαξαν"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""
@ -10829,6 +10823,11 @@ msgstr ""
msgid "Gujarati"
msgstr "Gujarati"
#, fuzzy
#~| msgid "GNOME Calendar"
#~ msgid "Calender"
#~ msgstr "GNOME Calendar"
#, fuzzy
#~| msgid "No repositories available."
#~ msgid "No status available."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2886,7 +2886,7 @@ msgstr "Activado"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Desactivado"
@ -4849,7 +4849,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "Mumble server is running"
msgid "Mumble server is configured"
@ -7110,7 +7110,7 @@ msgstr ""
"freedombox&gt;) y su nombre de usuario. Pulsando en el botón de búsqueda le "
"mostrará un listado de los calendarios y agendas existentes."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calendar"
@ -8189,12 +8189,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calender"
msgstr "Calendario GNOME"
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -9083,11 +9077,22 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "Iniciada la actualización de la distribución"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Se inició la actualización a la nueva publicación estable. Podría llevar "
"mucho tiempo completarla."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "No se pudo iniciar la actualización de la distribución"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -9098,18 +9103,7 @@ msgstr ""
"libres. Si está habilitada, la actualización de la distribución se "
"reintentará tras 24h ."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "Iniciada la actualización de la distribución"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Se inició la actualización a la nueva publicación estable. Podría llevar "
"mucho tiempo completarla."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr "Comprobar si hay paquetes retenidos"
@ -10280,18 +10274,6 @@ msgstr "Instalación"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "El servidor <em>%(service_name)s</em> no se está ejecutando."
#: templates/apps.html:33
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Buscar en la web"
#: templates/apps.html:46
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Buscar en la web"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10518,6 +10500,18 @@ msgstr ""
msgid "Update"
msgstr "Actualización"
#: templates/tags.html:24
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Buscar en la web"
#: templates/tags.html:37
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Buscar en la web"
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "Copia de seguridad"
@ -10548,11 +10542,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Configuración sin cambio"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "antes de desinstalar {app_id}"
@ -10561,6 +10555,11 @@ msgstr "antes de desinstalar {app_id}"
msgid "Gujarati"
msgstr "Gujarati"
#, fuzzy
#~| msgid "GNOME Calendar"
#~ msgid "Calender"
#~ msgstr "Calendario GNOME"
#~ msgid "No status available."
#~ msgstr "Estado de actualización No disponible."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2870,7 +2870,7 @@ msgstr "فعال"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "غیرفعال"
@ -4727,7 +4727,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "Configuration updated"
msgid "Mumble server is configured"
@ -6818,7 +6818,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7817,10 +7817,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -8622,28 +8618,28 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
#, fuzzy
msgid "Distribution update started"
msgstr "برنامه نصب شد."
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
#, fuzzy
msgid "Distribution update started"
msgstr "برنامه نصب شد."
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -9767,14 +9763,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9991,6 +9979,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Create Connection"
@ -10023,11 +10019,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Plinth 0.6\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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-discuss@lists.alioth.debian."
@ -3013,7 +3013,7 @@ msgstr "ENABLED"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "DISABLED"
@ -4911,7 +4911,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "Mumble server is running"
msgid "Mumble server is configured"
@ -7151,7 +7151,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -8216,10 +8216,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -9076,29 +9072,29 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
#, fuzzy
#| msgid "Automatic upgrades disabled"
msgid "Distribution update started"
msgstr "AUTOMATIC UPGRADES DISABLED"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
#, fuzzy
#| msgid "Automatic upgrades disabled"
msgid "Distribution update started"
msgstr "AUTOMATIC UPGRADES DISABLED"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -10299,14 +10295,6 @@ msgstr "INSTALLATION"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "SERVICE DISCOVERY SERVER IS NOT RUNNING"
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10543,6 +10531,14 @@ msgstr ""
msgid "Update"
msgstr "UPDATE URL"
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "PageKite Account"
@ -10578,11 +10574,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "SETTING UNCHANGED"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2025-01-05 16:52+0000\n"
"Last-Translator: Coucouf <coucouf@coucouf.fr>\n"
"Language-Team: French <https://hosted.weblate.org/projects/freedombox/"
@ -2867,7 +2867,7 @@ msgstr "Activé"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Désactivé"
@ -4822,7 +4822,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "Mumble server is running"
msgid "Mumble server is configured"
@ -7095,7 +7095,7 @@ msgstr ""
"recherche pour afficher la liste de vos agendas et carnets dadresses "
"existants."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr "Calendrier"
@ -8159,12 +8159,6 @@ msgstr ""
msgid "Webmail"
msgstr "Courriel"
#: modules/sogo/manifest.py:73
#, fuzzy
#| msgid "Calendar"
msgid "Calender"
msgstr "Calendrier"
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -9054,11 +9048,22 @@ msgstr ""
"La mise à jour des logiciels s'exécute par défaut quotidiennement. Pour la "
"première fois, exécutez-la manuellement maintenant."
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "Mise à niveau de la distribution démarrée"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"La mise à niveau vers la nouvelle version stable a été lancée. Cette "
"opération peut prendre beaucoup de temps."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "Impossible de lancer la mise à niveau de la distribution"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -9069,18 +9074,7 @@ msgstr ""
"sont disponibles. Si la mise à niveau automatique de la distribution est "
"activée, elle sera retentée dans 24H."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "Mise à niveau de la distribution démarrée"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"La mise à niveau vers la nouvelle version stable a été lancée. Cette "
"opération peut prendre beaucoup de temps."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr "Vérifier la mise en attente des paquets"
@ -10260,14 +10254,6 @@ msgstr "Installation"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Le service <em>%(service_name)s</em> nest pas actif."
#: templates/apps.html:33
msgid "Search with tags"
msgstr "Recherches avec des étiquettes"
#: templates/apps.html:46
msgid "Clear all tags"
msgstr "Supprimer toutes les étiquettes"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10499,6 +10485,14 @@ msgstr ""
msgid "Update"
msgstr "Mettre à jour"
#: templates/tags.html:24
msgid "Search with tags"
msgstr "Recherches avec des étiquettes"
#: templates/tags.html:37
msgid "Clear all tags"
msgstr "Supprimer toutes les étiquettes"
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "Sauvegarder"
@ -10529,11 +10523,11 @@ msgstr ""
msgid "Here"
msgstr "Ici"
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Paramètre inchangé"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "avant la désinstallation de {app_id}"
@ -10542,6 +10536,11 @@ msgstr "avant la désinstallation de {app_id}"
msgid "Gujarati"
msgstr "Gujarati"
#, fuzzy
#~| msgid "Calendar"
#~ msgid "Calender"
#~ msgstr "Calendrier"
#~ msgid "No status available."
#~ msgstr "Aucun statut disponible."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2565,7 +2565,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4224,7 +4224,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6164,7 +6164,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7078,10 +7078,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -7829,27 +7825,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -8890,14 +8886,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9106,6 +9094,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9136,11 +9132,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2800,7 +2800,7 @@ msgstr "સક્ષમ કરેલું"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "અક્ષમ કરેલું"
@ -4531,7 +4531,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6524,7 +6524,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7448,10 +7448,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "GnuDIP Server Address"
@ -8229,29 +8225,29 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
#, fuzzy
#| msgid "User registrations disabled"
msgid "Distribution update started"
msgstr "વપરાશકર્તા રજીસ્ટ્રેશન અક્ષમ છે"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
#, fuzzy
#| msgid "User registrations disabled"
msgid "Distribution update started"
msgstr "વપરાશકર્તા રજીસ્ટ્રેશન અક્ષમ છે"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -9338,14 +9334,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9569,6 +9557,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9599,11 +9595,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "સેટિંગ યથાવત"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2023-10-19 06:30+0000\n"
"Last-Translator: Shaik <arifashaik807@gmail.com>\n"
"Language-Team: Hindi <https://hosted.weblate.org/projects/freedombox/"
@ -2966,7 +2966,7 @@ msgstr "सक्षम किया गया है"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "अक्षम किया गया है"
@ -4895,7 +4895,7 @@ msgstr ""
msgid "Mumble"
msgstr "ममबल"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -7131,7 +7131,7 @@ msgstr ""
"(जैसे http://localhost:5232) और अपने यूसरनाम दर्ज करें. खोज बटन पर क्लिक करने से मौजूदा "
"कैलेंडर और पता पुस्तिकाएं सूचीबद्ध होंगी."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calendar"
@ -8206,12 +8206,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calender"
msgstr "गनोम कैलेंडर"
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -9107,29 +9101,29 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
#, fuzzy
#| msgid "Automatic upgrades disabled"
msgid "Distribution update started"
msgstr "ऑटोमेटिक अपग्रेडस अक्षम किया गया"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
#, fuzzy
#| msgid "Automatic upgrades disabled"
msgid "Distribution update started"
msgstr "ऑटोमेटिक अपग्रेडस अक्षम किया गया"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -10336,18 +10330,6 @@ msgstr "इंस्टालेशन"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "सर्विस <em>%(service_name)s</em> नहीं चल रहा है."
#: templates/apps.html:33
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "वेब सरच किजिये"
#: templates/apps.html:46
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "वेब सरच किजिये"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10568,6 +10550,18 @@ msgstr ""
msgid "Update"
msgstr "अपडेट"
#: templates/tags.html:24
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "वेब सरच किजिये"
#: templates/tags.html:37
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "वेब सरच किजिये"
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -10603,11 +10597,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "सेटिंग स्थिर है"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""
@ -10616,6 +10610,11 @@ msgstr ""
msgid "Gujarati"
msgstr ""
#, fuzzy
#~| msgid "GNOME Calendar"
#~ msgid "Calender"
#~ msgstr "गनोम कैलेंडर"
#, fuzzy
#~| msgid "Tor relay port available"
#~ msgid "No status available."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2022-10-24 18:39+0000\n"
"Last-Translator: Sunil Mohan Adapa <sunil@medhas.org>\n"
"Language-Team: Hungarian <https://hosted.weblate.org/projects/freedombox/"
@ -2941,7 +2941,7 @@ msgstr "Engedélyezve"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Letiltva"
@ -4927,7 +4927,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -7240,7 +7240,7 @@ msgstr ""
"és a felhasználónevet. A keresés gombra kattintva ki lesz listázva az összes "
"elérhető naptár és címjegyzék."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calendar"
@ -8325,12 +8325,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calender"
msgstr "GNOME Calendar"
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -9210,11 +9204,22 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "A disztribúció frissítése elindult"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Elkezdődött a frissítés a következő stabil kiadásra. Ez hosszú időt vehet "
"igénybe."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "A disztribúció frissítése nem tudott elindulni"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -9225,18 +9230,7 @@ msgstr ""
"disztribúció frissítését a rendszer 24 óra múlva újrapróbálja, ha "
"engedélyezve van."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "A disztribúció frissítése elindult"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Elkezdődött a frissítés a következő stabil kiadásra. Ez hosszú időt vehet "
"igénybe."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -10443,18 +10437,6 @@ msgstr "Telepítés"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "A szolgáltatás nem fut (<em>%(service_name)s</em>)."
#: templates/apps.html:33
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Keresés a weben"
#: templates/apps.html:46
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Keresés a weben"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10683,6 +10665,18 @@ msgstr ""
msgid "Update"
msgstr "Frissítés"
#: templates/tags.html:24
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Keresés a weben"
#: templates/tags.html:37
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Keresés a weben"
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -10718,11 +10712,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "A beállítás változatlan"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""
@ -10731,6 +10725,11 @@ msgstr ""
msgid "Gujarati"
msgstr "Gudzsaráti"
#, fuzzy
#~| msgid "GNOME Calendar"
#~ msgid "Calender"
#~ msgstr "GNOME Calendar"
#~ msgid "No status available."
#~ msgstr "Nincs elérhető állapot."

View File

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Indonesian (FreedomBox)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2919,7 +2919,7 @@ msgstr "Aktifkan"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Non-Aktifkan"
@ -4793,7 +4793,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6791,7 +6791,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calendar"
@ -7768,12 +7768,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calender"
msgstr "Kalender GNOME"
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -8569,27 +8563,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "Pembaruan distribusi dimulai"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "Pembaruan distribusi dimulai"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -9688,18 +9682,6 @@ msgstr "Pemasangan"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Layanan <em>%(service_name)s</em> tidak berjalan."
#: templates/apps.html:33
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Jelajahi web"
#: templates/apps.html:46
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Jelajahi web"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9914,6 +9896,18 @@ msgstr ""
msgid "Update"
msgstr "Memperbarui"
#: templates/tags.html:24
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Jelajahi web"
#: templates/tags.html:37
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Jelajahi web"
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -9949,11 +9943,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""
@ -9962,6 +9956,11 @@ msgstr ""
msgid "Gujarati"
msgstr "Bahasa Gujarat"
#, fuzzy
#~| msgid "GNOME Calendar"
#~ msgid "Calender"
#~ msgstr "Kalender GNOME"
#, fuzzy
#~| msgid "No libraries available."
#~ msgid "No status available."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2022-09-14 17:19+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/freedombox/"
@ -2870,7 +2870,7 @@ msgstr "Abilitato"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Disabilitato"
@ -4808,7 +4808,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6953,7 +6953,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7893,10 +7893,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -8678,27 +8674,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -9759,14 +9755,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9977,6 +9965,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -10010,11 +10006,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Impostazioni invariate"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2023-05-07 23:50+0000\n"
"Last-Translator: Nobuhiro Iwamatsu <iwamatsu@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/freedombox/"
@ -2553,7 +2553,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4196,7 +4196,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6126,7 +6126,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7032,10 +7032,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -7778,27 +7774,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -8820,14 +8816,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9034,6 +9022,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9062,11 +9058,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2551,7 +2551,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4194,7 +4194,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6124,7 +6124,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7032,10 +7032,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -7778,27 +7774,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -8820,14 +8816,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9034,6 +9022,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9062,11 +9058,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2563,7 +2563,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4212,7 +4212,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6144,7 +6144,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7054,10 +7054,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -7802,27 +7798,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -8844,14 +8840,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9058,6 +9046,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9086,11 +9082,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2562,7 +2562,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4211,7 +4211,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6143,7 +6143,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7053,10 +7053,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -7801,27 +7797,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -8843,14 +8839,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9057,6 +9045,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9085,11 +9081,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2933,7 +2933,7 @@ msgstr "Aktivert"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Deaktivert"
@ -4915,7 +4915,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "Mumble server is running"
msgid "Mumble server is configured"
@ -7199,7 +7199,7 @@ msgstr ""
"freedombox.adresse&gt;) og ditt brukernavn. Å klikke på søkeknappen vil "
"liste opp eksisterende kalendre og adressebøker."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calendar"
@ -8272,12 +8272,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calender"
msgstr "GNOME-kalender"
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -9155,29 +9149,29 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
#, fuzzy
#| msgid "Automatic upgrades disabled"
msgid "Distribution update started"
msgstr "Automatiske oppgraderinger avslått (deaktivert)"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
#, fuzzy
#| msgid "Automatic upgrades disabled"
msgid "Distribution update started"
msgstr "Automatiske oppgraderinger avslått (deaktivert)"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -10357,18 +10351,6 @@ msgstr "Installasjon"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Tjenesten <em>%(service_name)s</em> kjører ikke."
#: templates/apps.html:33
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Søk på nettet"
#: templates/apps.html:46
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Søk på nettet"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10595,6 +10577,18 @@ msgstr ""
msgid "Update"
msgstr "Oppdater"
#: templates/tags.html:24
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Søk på nettet"
#: templates/tags.html:37
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Søk på nettet"
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -10629,11 +10623,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Oppsett uendret"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "før avinstallering av {app_id}"
@ -10642,6 +10636,11 @@ msgstr "før avinstallering av {app_id}"
msgid "Gujarati"
msgstr "Gujarati"
#, fuzzy
#~| msgid "GNOME Calendar"
#~ msgid "Calender"
#~ msgstr "GNOME-kalender"
#, fuzzy
#~| msgid "No libraries available."
#~ msgid "No status available."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2025-02-07 12:01+0000\n"
"Last-Translator: ikmaak <info@ikmaak.nl>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/freedombox/"
@ -2816,7 +2816,7 @@ msgstr "Ingeschakeld"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Uitgeschakeld"
@ -4715,7 +4715,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr "Mumble server is ingesteld"
@ -6941,7 +6941,7 @@ msgstr ""
"freedombox.address>) en je gebruikersnaam. Klikken op de zoekknop zal de "
"bestaande kalenders en adresboeken weergeven."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr "Kalender"
@ -7989,10 +7989,6 @@ msgstr "Thunderbird + SOGo verbinder"
msgid "Webmail"
msgstr "Webmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr "Kalender"
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr "Adresboek"
@ -8857,11 +8853,20 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "Distributie-update gestart"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr "Update naar volgende stabiele release gestart. Dit kan lang duren."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "Kan distributie-update niet starten"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -8871,16 +8876,7 @@ msgstr ""
"te starten. Zorg ervoor dat ten minste 5 GB ruimte vrij is. Als "
"ingeschakeld, wordt de distributie-update na 24 uur opnieuw geprobeerd."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "Distributie-update gestart"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr "Update naar volgende stabiele release gestart. Dit kan lang duren."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr "Controleer op blokkerende pakketten"
@ -10037,14 +10033,6 @@ msgstr "Installatie"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Service <em>%(service_name)s</em> is niet actief."
#: templates/apps.html:33
msgid "Search with tags"
msgstr "Zoeken op labels"
#: templates/apps.html:46
msgid "Clear all tags"
msgstr "Verwijder alle labels"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10272,6 +10260,14 @@ msgstr ""
msgid "Update"
msgstr "Update"
#: templates/tags.html:24
msgid "Search with tags"
msgstr "Zoeken op labels"
#: templates/tags.html:37
msgid "Clear all tags"
msgstr "Verwijder alle labels"
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "Back-up"
@ -10302,11 +10298,11 @@ msgstr ""
msgid "Here"
msgstr "Hier"
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Instelling onveranderd"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "voor het verwijderen van {app_id}"
@ -10315,6 +10311,9 @@ msgstr "voor het verwijderen van {app_id}"
msgid "Gujarati"
msgstr "Gujarati"
#~ msgid "Calender"
#~ msgstr "Kalender"
#~ msgid "No status available."
#~ msgstr "Geen status beschikbaar."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2904,7 +2904,7 @@ msgstr "Włączony"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Wyłączony"
@ -4716,7 +4716,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "DNS server configuration updated"
msgid "Mumble server is configured"
@ -6747,7 +6747,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7724,10 +7724,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "IP addresses"
@ -8533,29 +8529,29 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
#, fuzzy
#| msgid "User registrations disabled"
msgid "Distribution update started"
msgstr "Rejestracja użytkowników wyłączona"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
#, fuzzy
#| msgid "User registrations disabled"
msgid "Distribution update started"
msgstr "Rejestracja użytkowników wyłączona"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -9702,14 +9698,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Usługa <em>%(service_name)s</em> nie jest uruchomiona."
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9939,6 +9927,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -9972,11 +9968,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Ustawienie bez zmian"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2023-05-22 15:50+0000\n"
"Last-Translator: Frederico Gomes <fefekrzr@gmail.com>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/freedombox/"
@ -2811,7 +2811,7 @@ msgstr "Ativado"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Desativado"
@ -4582,7 +4582,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "Configuration updated"
msgid "Mumble server is configured"
@ -6619,7 +6619,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7561,10 +7561,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -8341,29 +8337,29 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
#, fuzzy
#| msgid "Applications"
msgid "Distribution update started"
msgstr "Aplicações"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
#, fuzzy
#| msgid "Applications"
msgid "Distribution update started"
msgstr "Aplicações"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -9454,14 +9450,6 @@ msgstr "Instalação"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "O serviço <em>%(service_name)s</em> não está em execução."
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9674,6 +9662,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -9706,11 +9702,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Definição inalterada"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2025-01-14 01:32+0000\n"
"Last-Translator: gfbdrgng <hnaofegnp@hldrive.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/freedombox/"
@ -2844,7 +2844,7 @@ msgstr "Включено"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Выключено"
@ -4777,7 +4777,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "Mumble server is running"
msgid "Mumble server is configured"
@ -7022,7 +7022,7 @@ msgstr ""
"получите список существующих календарей и адресных книг.</your.freedombox."
"address>."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr "Календарь"
@ -8066,12 +8066,6 @@ msgstr ""
msgid "Webmail"
msgstr "Email"
#: modules/sogo/manifest.py:73
#, fuzzy
#| msgid "Calendar"
msgid "Calender"
msgstr "Календарь"
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -8949,11 +8943,22 @@ msgstr ""
"По умолчанию автоматическое обновление программного обеспечения выполняется "
"ежедневно. В первый раз запустите его вручную."
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "Началось обновление дистрибутива"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Начато обновление до следующего стабильного выпуска. Это может занять много "
"времени."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "Не удалось запустить обновление дистрибутива"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -8963,18 +8968,7 @@ msgstr ""
"дистрибутива. Пожалуйста, убедитесь, что свободно не менее 5 ГБ. Обновление "
"дистрибутива будет повторно запущено через 24 часа, если это включено."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "Началось обновление дистрибутива"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Начато обновление до следующего стабильного выпуска. Это может занять много "
"времени."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr "Проверьте, не задерживается ли посылка"
@ -10132,14 +10126,6 @@ msgstr "Установка"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Служба <em>%(service_name)s</em> не запущена."
#: templates/apps.html:33
msgid "Search with tags"
msgstr "Поиск по тегам"
#: templates/apps.html:46
msgid "Clear all tags"
msgstr "Очистить все теги"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10369,6 +10355,14 @@ msgstr ""
msgid "Update"
msgstr "Обновление"
#: templates/tags.html:24
msgid "Search with tags"
msgstr "Поиск по тегам"
#: templates/tags.html:37
msgid "Clear all tags"
msgstr "Очистить все теги"
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "Резервное копирование"
@ -10399,11 +10393,11 @@ msgstr ""
msgid "Here"
msgstr "Вот здесь"
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Настройки без изменений"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "перед удалением {app_id}"
@ -10412,6 +10406,11 @@ msgstr "перед удалением {app_id}"
msgid "Gujarati"
msgstr "Гуджарати"
#, fuzzy
#~| msgid "Calendar"
#~ msgid "Calender"
#~ msgstr "Календарь"
#~ msgid "No status available."
#~ msgstr "Статус недоступен."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2551,7 +2551,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4194,7 +4194,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6124,7 +6124,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7030,10 +7030,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -7776,27 +7772,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -8818,14 +8814,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9032,6 +9020,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr ""
@ -9060,11 +9056,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2782,7 +2782,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4495,7 +4495,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6475,7 +6475,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7416,10 +7416,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr ""
@ -8201,27 +8197,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -9305,14 +9301,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9521,6 +9509,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -9554,11 +9550,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2025-02-25 09:20+0000\n"
"Last-Translator: Besnik Bleta <besnik@programeshqip.org>\n"
"Language-Team: Albanian <https://hosted.weblate.org/projects/freedombox/"
@ -2819,7 +2819,7 @@ msgstr "E aktivizuar"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "E çaktivizuar"
@ -4758,7 +4758,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr "Shërbyesi Mumble është formësuar"
@ -6996,7 +6996,7 @@ msgstr ""
"e_freedombox-it.tuaj&gt;) dhe emrin tuaj të përdoruesit. Klikimi mbi butonin "
"e kërkimit do të shfaqë kalendarët dhe librat ekzistues të adresave."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr "Kalendar"
@ -8049,10 +8049,6 @@ msgstr "Lidhës Thunderbird + SOGo"
msgid "Webmail"
msgstr "Webmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr "Libër adresash"
@ -8923,11 +8919,22 @@ msgstr ""
"Përditësimi i automatizuar i software-it, si parazgjedhje, kryhet një herë "
"në ditë. Për herën e parë, kryejeni dorazi tani."
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "Përditësimi i shpërndarjes filloi"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Filloi përditësimi me hedhjen e re të qëndrueshme në qarkullim. Ky mund të "
"dojë një kohë të gjatë për tu plotësuar."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "Su fillua dot përditësim shpërndarjeje"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -8938,18 +8945,7 @@ msgstr ""
"Përditësimi i shpërndarjes do të riprovohet pas 24 orësh, nëse kjo është "
"aktivizuar."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "Përditësimi i shpërndarjes filloi"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Filloi përditësimi me hedhjen e re të qëndrueshme në qarkullim. Ky mund të "
"dojë një kohë të gjatë për tu plotësuar."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr "Kontrolloni për mbajtje paketash"
@ -10112,14 +10108,6 @@ msgstr "Instalim"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Shërbimi <em>%(service_name)s</em> spo xhiron."
#: templates/apps.html:33
msgid "Search with tags"
msgstr "Kërkoni me etiketa"
#: templates/apps.html:46
msgid "Clear all tags"
msgstr "Spastroji krejt etiketat"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10347,6 +10335,14 @@ msgstr ""
msgid "Update"
msgstr "Përditësoje"
#: templates/tags.html:24
msgid "Search with tags"
msgstr "Kërkoni me etiketa"
#: templates/tags.html:37
msgid "Clear all tags"
msgstr "Spastroji krejt etiketat"
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "Kopjeruajtje"
@ -10377,11 +10373,11 @@ msgstr ""
msgid "Here"
msgstr "Këtu"
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Rregullim i pandryshuar"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "para çinstalimit të {app_id}"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2709,7 +2709,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4398,7 +4398,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6362,7 +6362,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7295,10 +7295,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "IP addresses"
@ -8062,27 +8058,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -9120,14 +9116,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9336,6 +9324,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -9368,11 +9364,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2024-07-30 01:31+0000\n"
"Last-Translator: bittin1ddc447d824349b2 <bittin@reimu.nl>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/freedombox/"
@ -2898,7 +2898,7 @@ msgstr "Aktiverad"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Inaktiverad"
@ -4868,7 +4868,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "Mumble server is running"
msgid "Mumble server is configured"
@ -7154,7 +7154,7 @@ msgstr ""
"address>) och ditt användarnamn. Om du klickar på sökknappen visas en lista "
"över befintliga kalendrar och adressböcker."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calendar"
@ -8218,12 +8218,6 @@ msgstr ""
msgid "Webmail"
msgstr "FairEmail"
#: modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calender"
msgstr "GNOME-kalender"
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -9093,11 +9087,22 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "Distributionsuppdateringen har startats"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Startade uppdateringen till nästa stabila utgåva. Det kan ta lång tid att "
"slutföra."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "Det gick inte att starta distributionsuppdatering"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -9108,18 +9113,7 @@ msgstr ""
"Distributionsuppdateringen kommer att göras ett nytt behov efter 24 timmar, "
"om det är aktiverat."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "Distributionsuppdateringen har startats"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Startade uppdateringen till nästa stabila utgåva. Det kan ta lång tid att "
"slutföra."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -10288,18 +10282,6 @@ msgstr "Installation"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "Tjänsten <em> %(service_name)s </em> körs inte."
#: templates/apps.html:33
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Sök på webben"
#: templates/apps.html:46
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Sök på webben"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10529,6 +10511,18 @@ msgstr ""
msgid "Update"
msgstr "Uppdatera"
#: templates/tags.html:24
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "Sök på webben"
#: templates/tags.html:37
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "Sök på webben"
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "Säkerhetskopia"
@ -10559,11 +10553,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Instänllningar oförändrade"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "innan du avinstallerar {app_id}"
@ -10572,6 +10566,11 @@ msgstr "innan du avinstallerar {app_id}"
msgid "Gujarati"
msgstr "Gujarati"
#, fuzzy
#~| msgid "GNOME Calendar"
#~ msgid "Calender"
#~ msgstr "GNOME-kalender"
#~ msgid "No status available."
#~ msgstr "Ingen status tillgänglig."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2024-12-27 01:03+0000\n"
"Last-Translator: James Valleroy <jvalleroy@mailbox.org>\n"
"Language-Team: Tamil <https://hosted.weblate.org/projects/freedombox/"
@ -2836,7 +2836,7 @@ msgstr "இயக்கப்பட்டது"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "முடக்கப்பட்டது"
@ -4725,7 +4725,7 @@ msgstr ""
msgid "Mumble"
msgstr "முணுமுணுப்பு"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "grub package is configured"
msgid "Mumble server is configured"
@ -6935,7 +6935,7 @@ msgstr ""
"புத்தகத்தைச் சேர்க்கவும். ரேடிகல் சேவையகத்தின் முகவரி ஐ உள்ளிடவும் (எ.கா. தேடல் பொத்தானைக் "
"சொடுக்கு செய்தால், தற்போதுள்ள காலெண்டர்கள் மற்றும் முகவரி புத்தகங்களை பட்டியலிடும்."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr "நாட்காட்டி"
@ -7965,12 +7965,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
#, fuzzy
#| msgid "Calendar"
msgid "Calender"
msgstr "நாட்காட்டி"
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -8842,11 +8836,21 @@ msgstr ""
"தானியங்கி மென்பொருள் புதுப்பிப்பு முன்னிருப்பாக தினமும் இயங்குகிறது. முதல் முறையாக, "
"இப்போது அதை கைமுறையாக இயக்கவும்."
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "விநியோக புதுப்பிப்பு தொடங்கியது"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"அடுத்த நிலையான வெளியீட்டிற்கு புதுப்பிப்பு தொடங்கியது. இது முடிக்க நீண்ட நேரம் ஆகலாம்."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "விநியோக புதுப்பிப்பை தொடங்க முடியவில்லை"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -8856,17 +8860,7 @@ msgstr ""
"இலவசம் என்பதை உறுதிப்படுத்தவும். இயக்கப்பட்டால், 24 மணி நேரத்திற்குப் பிறகு விநியோக "
"புதுப்பிப்பு மீண்டும் முயற்சிக்கப்படும்."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "விநியோக புதுப்பிப்பு தொடங்கியது"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"அடுத்த நிலையான வெளியீட்டிற்கு புதுப்பிப்பு தொடங்கியது. இது முடிக்க நீண்ட நேரம் ஆகலாம்."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr "தொகுப்பு வைத்திருக்கும் சரிபார்க்கவும்"
@ -10008,16 +10002,6 @@ msgstr "நிறுவல்"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "பணி <em>%(service_name)s </em> இயங்கவில்லை."
#: templates/apps.html:33
msgid "Search with tags"
msgstr "குறிச்சொற்களுடன் தேடுங்கள்"
#: templates/apps.html:46
#, fuzzy
#| msgid "Search with tags"
msgid "Clear all tags"
msgstr "குறிச்சொற்களுடன் தேடுங்கள்"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10242,6 +10226,16 @@ msgstr ""
msgid "Update"
msgstr "புதுப்பிப்பு"
#: templates/tags.html:24
msgid "Search with tags"
msgstr "குறிச்சொற்களுடன் தேடுங்கள்"
#: templates/tags.html:37
#, fuzzy
#| msgid "Search with tags"
msgid "Clear all tags"
msgstr "குறிச்சொற்களுடன் தேடுங்கள்"
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "காப்புப்பிரதி"
@ -10272,11 +10266,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "மாறாமல் அமைத்தல்"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "{app_id} ஐ நிறுவல் நீக்குவதற்கு முன்"
@ -10285,6 +10279,11 @@ msgstr "{app_id} ஐ நிறுவல் நீக்குவதற்கு
msgid "Gujarati"
msgstr "குசராத்தி"
#, fuzzy
#~| msgid "Calendar"
#~ msgid "Calender"
#~ msgstr "நாட்காட்டி"
#~ msgid "No status available."
#~ msgstr "நிலை எதுவும் கிடைக்கவில்லை."

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2025-02-22 10:04+0000\n"
"Last-Translator: sai <phanindragvs2002@gmail.com>\n"
"Language-Team: Telugu <https://hosted.weblate.org/projects/freedombox/"
@ -2844,7 +2844,7 @@ msgstr "క్రియాశీలం"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "నిలిపివేయబడింది"
@ -4758,7 +4758,7 @@ msgstr ""
msgid "Mumble"
msgstr "మంబుల్"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
#, fuzzy
#| msgid "Mumble server is running"
msgid "Mumble server is configured"
@ -6985,7 +6985,7 @@ msgstr ""
"శోధన బటన్‌పై క్లిక్ చేయడం ద్వారా ఇప్పటికే ఉన్న క్యాలెండర్‌లు మరియు చిరునామా పుస్తకాలు జాబితా చేయబడతాయి </"
"your.freedombox.address>."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calendar"
@ -8039,12 +8039,6 @@ msgstr ""
msgid "Webmail"
msgstr "ఫెయిర్ఇమెయిల్"
#: modules/sogo/manifest.py:73
#, fuzzy
#| msgid "GNOME Calendar"
msgid "Calender"
msgstr "కేలండర్"
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "Address"
@ -8892,11 +8886,20 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "పంపిణీ నవీకరణ ప్రారంభమైంది"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr "తదుపరి స్థిరమైన విడుదలకు నవీకరణ ప్రారంభించబడింది. ఇది పూర్తి కావడానికి చాలా సమయం పట్టవచ్చు."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "పంపిణీ నవీకరణను ప్రారంభించడం సాధ్యపడలేదు"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -8905,16 +8908,7 @@ msgstr ""
"పంపిణీ నవీకరణను ప్రారంభించడానికి రూట్ విభజనలో తగినంత ఖాళీ స్థలం లేదు. దయచేసి కనీసం 5 GB ఉచితంగా "
"ఉండేలా చూసుకోండి. ప్రారంభించబడితే, పంపిణీ నవీకరణ 24 గంటల తర్వాత మళ్లీ ప్రయత్నించబడుతుంది."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "పంపిణీ నవీకరణ ప్రారంభమైంది"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr "తదుపరి స్థిరమైన విడుదలకు నవీకరణ ప్రారంభించబడింది. ఇది పూర్తి కావడానికి చాలా సమయం పట్టవచ్చు."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -10077,18 +10071,6 @@ msgstr "నిక్షిప్తం"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "<em>%(service_name)s</em> సేవ నడవడం లేదు."
#: templates/apps.html:33
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "అంతర్జాలమును శోధింపుము"
#: templates/apps.html:46
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "అంతర్జాలమును శోధింపుము"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10315,6 +10297,18 @@ msgstr ""
msgid "Update"
msgstr "నవీకరణ"
#: templates/tags.html:24
#, fuzzy
#| msgid "Search the web"
msgid "Search with tags"
msgstr "అంతర్జాలమును శోధింపుము"
#: templates/tags.html:37
#, fuzzy
#| msgid "Search the web"
msgid "Clear all tags"
msgstr "అంతర్జాలమును శోధింపుము"
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -10347,11 +10341,11 @@ msgstr "మొత్తం యాప్ డేటా మరియు కాన
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "మారకుండా అమర్చుతోంది"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "{app_id} ని అన్ఇన్‌స్టాల్ చేయడానికి ముందు"
@ -10361,6 +10355,11 @@ msgstr "{app_id} ని అన్ఇన్‌స్టాల్ చేయడా
msgid "Gujarati"
msgstr "గుజరాతీ"
#, fuzzy
#~| msgid "GNOME Calendar"
#~ msgid "Calender"
#~ msgstr "కేలండర్"
#~ msgid "No status available."
#~ msgstr "స్థితి అందుబాటులో లేదు."

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2025-02-25 06:15+0000\n"
"Last-Translator: Burak Yavuz <hitowerdigit@hotmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/freedombox/"
@ -2800,7 +2800,7 @@ msgstr "Etkinleştirildi"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "Etkisizleştirildi"
@ -4727,7 +4727,7 @@ msgstr ""
msgid "Mumble"
msgstr "Mumble"
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr "Mumble sunucusu yapılandırıldı"
@ -6952,7 +6952,7 @@ msgstr ""
"kullanıcı adınızı girin. Ara düğmesine tıklamak, varolan takvimleri ve adres "
"defterlerini listeleyecektir."
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr "Takvim"
@ -8001,10 +8001,6 @@ msgstr "Thunderbird + SOGo bağlayıcı"
msgid "Webmail"
msgstr "Web posta"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr "Takvim"
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr "Adres defteri"
@ -8872,11 +8868,22 @@ msgstr ""
"Otomatik yazılım güncellemesi varsayılan olarak günlük çalışır. Şimdi ilk "
"kez el ile çalıştırın."
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "Dağıtım güncellemesi başlatıldı"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Bir sonraki kararlı yayıma güncelleme başlatıldı. Bunun tamamlanması uzun "
"zaman alabilir."
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr "Dağıtım güncellemesi başlatılamadı"
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
@ -8886,18 +8893,7 @@ msgstr ""
"Lütfen en az 5 GB boş alan olduğundan emin olun. Dağıtım güncellemesi, "
"etkinleştirildiyse 24 saat sonra yeniden denenecektir."
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "Dağıtım güncellemesi başlatıldı"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
"Bir sonraki kararlı yayıma güncelleme başlatıldı. Bunun tamamlanması uzun "
"zaman alabilir."
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr "Paket bekletmelerini denetle"
@ -10052,14 +10048,6 @@ msgstr "Kurulum"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "<em>%(service_name)s</em> hizmeti çalışmıyor."
#: templates/apps.html:33
msgid "Search with tags"
msgstr "Etiketler ile ara"
#: templates/apps.html:46
msgid "Clear all tags"
msgstr "Tüm etiketleri temizle"
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -10286,6 +10274,14 @@ msgstr ""
msgid "Update"
msgstr "Güncelle"
#: templates/tags.html:24
msgid "Search with tags"
msgstr "Etiketler ile ara"
#: templates/tags.html:37
msgid "Clear all tags"
msgstr "Tüm etiketleri temizle"
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "Yedekle"
@ -10316,11 +10312,11 @@ msgstr ""
msgid "Here"
msgstr "Burada"
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "Ayar değişmedi"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr "{app_id} kaldırılmadan önce"
@ -10329,6 +10325,9 @@ msgstr "{app_id} kaldırılmadan önce"
msgid "Gujarati"
msgstr "Gujarati"
#~ msgid "Calender"
#~ msgstr "Takvim"
#~ msgid "No status available."
#~ msgstr "Mevcut durum yok."

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2851,7 +2851,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4546,7 +4546,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6516,7 +6516,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7439,10 +7439,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "IP addresses"
@ -8205,27 +8201,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -9269,14 +9265,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9487,6 +9475,14 @@ msgstr ""
msgid "Update"
msgstr "Cập nhật"
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -9520,11 +9516,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,10 +7,10 @@ msgid ""
msgstr ""
"Project-Id-Version: Plinth\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\n"
"PO-Revision-Date: 2025-02-25 09:20+0000\n"
"Last-Translator: 大王叫我来巡山 "
"<hamburger2048@users.noreply.hosted.weblate.org>\n"
"Last-Translator: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate."
"org>\n"
"Language-Team: Chinese (Simplified Han script) <https://hosted.weblate.org/"
"projects/freedombox/freedombox/zh_Hans/>\n"
"Language: zh_Hans\n"
@ -2651,7 +2651,7 @@ msgstr "启用"
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr "已禁用"
@ -4340,7 +4340,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr "Mumble 服务器已配置"
@ -6330,7 +6330,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7252,10 +7252,6 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
msgid "Address book"
msgstr "地址簿"
@ -8020,27 +8016,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr "已启动分发更新"
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr "已启动分发更新"
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -9078,14 +9074,6 @@ msgstr "安装"
msgid "Service <em>%(service_name)s</em> is not running."
msgstr "服务 <em>%(service_name)s</em> 未在运行。"
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9295,6 +9283,14 @@ msgstr ""
msgid "Update"
msgstr "更新"
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
msgid "Backup"
msgstr "备份"
@ -9323,11 +9319,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr "设置未改变"
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-24 20:13-0500\n"
"POT-Creation-Date: 2025-03-10 20:08-0400\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/"
@ -2741,7 +2741,7 @@ msgstr ""
#: modules/firewall/templates/firewall.html:43
#: modules/letsencrypt/templates/letsencrypt.html:71
#: modules/snapshot/forms.py:23 modules/snapshot/forms.py:29
#: templates/cards.html:36
#: templates/cards.html:38
msgid "Disabled"
msgstr ""
@ -4434,7 +4434,7 @@ msgstr ""
msgid "Mumble"
msgstr ""
#: modules/mumble/__init__.py:157
#: modules/mumble/__init__.py:158
msgid "Mumble server is configured"
msgstr ""
@ -6403,7 +6403,7 @@ msgid ""
"existing calendars and address books."
msgstr ""
#: modules/radicale/manifest.py:91
#: modules/radicale/manifest.py:91 modules/sogo/manifest.py:73
msgid "Calendar"
msgstr ""
@ -7328,10 +7328,6 @@ msgstr ""
msgid "Webmail"
msgstr "公平電子郵件"
#: modules/sogo/manifest.py:73
msgid "Calender"
msgstr ""
#: modules/sogo/manifest.py:74
#, fuzzy
#| msgid "IP addresses"
@ -8093,27 +8089,27 @@ msgid ""
"manually run it now."
msgstr ""
#: modules/upgrades/__init__.py:242
#: modules/upgrades/__init__.py:230
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:232
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:256
msgid "Could not start distribution update"
msgstr ""
#: modules/upgrades/__init__.py:244
#: modules/upgrades/__init__.py:258
msgid ""
"There is not enough free space in the root partition to start the "
"distribution update. Please ensure at least 5 GB is free. Distribution "
"update will be retried after 24 hours, if enabled."
msgstr ""
#: modules/upgrades/__init__.py:255
msgid "Distribution update started"
msgstr ""
#: modules/upgrades/__init__.py:257
msgid ""
"Started update to next stable release. This may take a long time to complete."
msgstr ""
#: modules/upgrades/__init__.py:350
#: modules/upgrades/__init__.py:352
msgid "Check for package holds"
msgstr ""
@ -9157,14 +9153,6 @@ msgstr ""
msgid "Service <em>%(service_name)s</em> is not running."
msgstr ""
#: templates/apps.html:33
msgid "Search with tags"
msgstr ""
#: templates/apps.html:46
msgid "Clear all tags"
msgstr ""
#: templates/base.html:31
msgid ""
"FreedomBox is a personal server designed for privacy and data ownership. It "
@ -9373,6 +9361,14 @@ msgstr ""
msgid "Update"
msgstr ""
#: templates/tags.html:24
msgid "Search with tags"
msgstr ""
#: templates/tags.html:37
msgid "Clear all tags"
msgstr ""
#: templates/toolbar.html:39 templates/toolbar.html:40
#, fuzzy
#| msgid "Backups"
@ -9405,11 +9401,11 @@ msgstr ""
msgid "Here"
msgstr ""
#: views.py:376
#: views.py:414
msgid "Setting unchanged"
msgstr ""
#: views.py:610
#: views.py:647
#, python-brace-format
msgid "before uninstall of {app_id}"
msgstr ""

View File

@ -72,5 +72,6 @@ class BindApp(app_module.App):
def force_upgrade(self, _packages):
"""Force upgrade the managed packages to resolve conffile prompt."""
# Allow upgrades nay new version by keeping old configuration files
install(['bind9'], force_configuration='old')
return True

View File

@ -88,7 +88,7 @@ class FirewallApp(app_module.App):
if 'firewalld' not in packages:
return False
# Allow upgrade from any version to any version below 3.0
# Allow upgrade from 1.3.3 (bookworm) to 2.3.0 (trixie) and beyond 2.x.
package = packages['firewalld']
if Version(package['new_version']) > Version('3~'):
return False

View File

@ -109,7 +109,8 @@ class MiniDLNAApp(app_module.App):
if 'minidlna' not in packages:
return False
# Allow upgrade from 1.2.1+dfsg-1+b1 to 1.3.x
# Allow upgrade from 1.3.0 (bookworm) to 1.3.3 (trixie) and beyond
# 1.3.x.
package = packages['minidlna']
if Version(package['new_version']) > Version('1.4~'):
return False

View File

@ -106,7 +106,8 @@ class MumbleApp(app_module.App):
if 'mumble-server' not in packages:
return False
# Allow upgrades within 1.3.*
# Allow upgrades from 1.3.4-1 (bullseye) to 1.3.4-4 (bookworm) but not
# to 1.5.735 (trixie) and beyond.
package = packages['mumble-server']
if Version(package['new_version']) > Version('1.4~'):
return False

View File

@ -110,7 +110,7 @@ class RadicaleApp(app_module.App):
if 'radicale' not in packages:
return False
# Allow upgrade from 2.* to newer 2.* and 3.*
# Allow upgrade from 3.1.8 (bookworm) to 3.4.1 (trixie) and beyond 3.x.
package = packages['radicale']
if Version(package['new_version']) > Version('4~'):
return False

View File

@ -111,7 +111,8 @@ class RoundcubeApp(app_module.App):
return False
# Allow roundcube any version to upgrade to any version. This is okay
# because there will no longer be conflicting file changes.
# because there will no longer be conflicting file changes after
# upgrade from bullseye to bookworm.
install(['roundcube-core'], force_configuration='new')
if self.get_component('webserver-roundcube').is_enabled():
self.get_component('webserver-roundcube-freedombox').enable()

View File

@ -70,7 +70,7 @@ backup = {
tags = [
_('Webmail'),
_('Groupware'),
_('Calender'),
_('Calendar'),
_('Address book'),
_('CalDAV'),
_('CardDAV')

View File

@ -221,9 +221,23 @@ def try_start_dist_upgrade(test=False):
"""Try to start dist upgrade."""
from plinth.notification import Notification
result = privileged.start_dist_upgrade(test)
dist_upgrade_started = result['dist_upgrade_started']
reason = result['reason']
try:
privileged.start_dist_upgrade(test, _log_error=False)
except RuntimeError as exception:
reason = exception.args[0]
else:
logger.info('Started dist upgrade.')
title = gettext_noop('Distribution update started')
message = gettext_noop(
'Started update to next stable release. This may take a long '
'time to complete.')
Notification.update_or_create(id='upgrades-dist-upgrade-started',
app_id='upgrades', severity='info',
title=title, message=message, actions=[{
'type': 'dismiss'
}], group='admin')
return
if 'found-previous' in reason:
logger.info(
'Found previous dist-upgrade. If it was interrupted, it will '
@ -250,20 +264,8 @@ def try_start_dist_upgrade(test=False):
title=title, message=message, actions=[{
'type': 'dismiss'
}], group='admin')
elif 'started-dist-upgrade' in reason:
logger.info('Started dist upgrade.')
title = gettext_noop('Distribution update started')
message = gettext_noop(
'Started update to next stable release. This may take a long '
'time to complete.')
Notification.update_or_create(id='upgrades-dist-upgrade-started',
app_id='upgrades', severity='info',
title=title, message=message, actions=[{
'type': 'dismiss'
}], group='admin')
else:
logger.warning('Unhandled result of start-dist-upgrade: %s, %s',
dist_upgrade_started, reason)
logger.warning('Unhandled result of start-dist-upgrade: %s', reason)
def is_backports_requested():

View File

@ -0,0 +1,343 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Perform distribution upgrade."""
import contextlib
import logging
import pathlib
import subprocess
import time
from typing import Generator
import augeas
from plinth import action_utils
from plinth.modules import snapshot as snapshot_module
from . import utils
logger = logging.getLogger(__name__)
OBSOLETE_PACKAGES: list[str] = []
PACKAGES_WITH_PROMPTS = ['firewalld', 'minidlna', 'radicale']
PRE_DEBCONF_SELECTIONS: list[str] = [
# Tell grub-pc to continue without installing grub again.
'grub-pc grub-pc/install_devices_empty boolean true'
]
sources_list = pathlib.Path('/etc/apt/sources.list')
temp_sources_list = pathlib.Path('/etc/apt/sources.list.fbx-dist-upgrade')
def _apt_run(arguments):
"""Run an apt command and ensure that output is written to stdout."""
return action_utils.run_apt_command(arguments, stdout=None)
def _sources_list_update(old_codename: str, new_codename: str):
"""Change the distribution in /etc/apt/sources.list."""
logger.info('Upgrading from %s to %s...', old_codename, new_codename)
aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD +
augeas.Augeas.NO_MODL_AUTOLOAD)
aug.transform('aptsources', str(sources_list))
aug.set('/augeas/context', '/files' + str(sources_list))
aug.set('/augeas/save', 'newfile') # Save to a new file
aug.load()
for match_ in aug.match('*'):
dist_path = match_ + '/distribution'
dist = aug.get(dist_path)
if dist in (old_codename, 'stable'):
aug.set(dist_path, new_codename)
elif dist and (dist.startswith(old_codename + '-')
or dist.startswith('stable' + '-')):
new_value = new_codename + '-' + dist.partition('-')[2]
aug.set(dist_path, new_value)
aug.save()
aug_path = sources_list.with_suffix('.list.augnew')
aug_path.rename(temp_sources_list)
def _get_new_codename(test_upgrade: bool) -> str | None:
"""Return the codename for the next release."""
release_file_dist = 'stable'
if test_upgrade:
release_file_dist = 'testing'
url = utils.RELEASE_FILE_URL.format(release_file_dist)
command = ['curl', '--silent', '--location', '--fail', url]
protocol = utils.get_http_protocol()
if protocol == 'tor+http':
command.insert(0, 'torsocks')
logging.info('Package download over Tor is enabled.')
try:
output = subprocess.check_output(command).decode()
except (subprocess.CalledProcessError, FileNotFoundError):
logging.warning('Error while checking for new %s release',
release_file_dist)
else:
for line in output.split('\n'):
if line.startswith('Codename:'):
return line.split()[1]
return None
def _check(test_upgrade: bool = False) -> tuple[str, str]:
"""Check if a distribution upgrade be performed.
Check for new stable release, if updates are enabled, and if there is
enough free space for the dist upgrade.
If test_upgrade is True, also check for upgrade to testing.
Return (boolean, string) indicating if the upgrade is ready, and a reason
if not.
"""
if not utils.check_auto():
raise RuntimeError('upgrades-not-enabled')
if not utils.is_sufficient_free_space():
raise RuntimeError('not-enough-free-space')
if action_utils.service_is_running('freedombox-dist-upgrade'):
raise RuntimeError('found-previous')
from plinth.modules.upgrades import get_current_release
release, old_codename = get_current_release()
if release in ['unstable', 'testing', 'n/a']:
raise RuntimeError(f'already-{release}')
new_codename = _get_new_codename(test_upgrade)
if not new_codename:
raise RuntimeError('codename-not-found')
if new_codename == old_codename:
raise RuntimeError(f'already-{old_codename}')
return old_codename, new_codename
@contextlib.contextmanager
def _snapshot_run_and_disable() -> Generator[None, None, None]:
"""Take a snapshot if supported and enabled, then disable snapshots.
Snapshots shall be re-enabled, if originally enabled, on exiting this
context manager..
"""
if not snapshot_module.is_supported():
logger.info('Snapshots are not supported, skipping taking a snapshot.')
yield
return
reenable = False
try:
logger.info('Taking a snapshot before dist upgrade...')
subprocess.run([
'/usr/share/plinth/actions/actions', 'snapshot', 'create',
'--no-args'
], check=True)
aug = snapshot_module.load_augeas()
if snapshot_module.is_apt_snapshots_enabled(aug):
logger.info('Disabling apt snapshots during dist upgrade...')
subprocess.run([
'/usr/share/plinth/actions/actions',
'snapshot',
'disable_apt_snapshot',
], input='{"args": ["yes"], "kwargs": {}}'.encode(), check=True)
reenable = True
else:
logger.info('Apt snapshots already disabled.')
yield
finally:
if reenable:
logger.info('Re-enabling apt snapshots...')
subprocess.run([
'/usr/share/plinth/actions/actions', 'snapshot',
'disable_apt_snapshot'
], input='{"args": ["no"], "kwargs": {}}'.encode(), check=True)
else:
logger.info('Not re-enabling apt snapshots, as they were disabled '
'before dist upgrade.')
@contextlib.contextmanager
def _services_disable():
"""Disable services that are seriously impacted by the upgrade."""
# If quassel is running during dist upgrade, it may be restarted
# several times. This causes IRC users to rapidly leave/join
# channels. Stop quassel for the duration of the dist upgrade.
logger.info('Stopping quassel service during dist upgrade...')
with action_utils.service_ensure_stopped('quasselcore'):
yield
logger.info('Re-enabling quassel service if previously enabled...')
@contextlib.contextmanager
def _apt_hold_packages():
"""Apt hold some packages during dist upgrade."""
packages = PACKAGES_WITH_PROMPTS
packages_string = ', '.join(packages)
# Hold freedombox package during entire dist upgrade.
logger.info('Holding freedombox package...')
with action_utils.apt_hold_freedombox():
# Hold packages known to have conffile prompts. FreedomBox service
# will handle their upgrade later.
logger.info('Holding packages with conffile prompts: %s...',
packages_string)
with action_utils.apt_hold(packages):
yield
logger.info(
'Releasing holds on packages with conffile prompts: %s...',
packages_string)
logger.info('Releasing hold on freedombox package...')
def _debconf_set_selections() -> None:
"""Pre-set debconf selections if they are needed for dist upgrade."""
if PRE_DEBCONF_SELECTIONS:
logger.info('Setting debconf selections: %s', PRE_DEBCONF_SELECTIONS)
action_utils.debconf_set_selections(PRE_DEBCONF_SELECTIONS)
def _packages_remove_obsolete() -> None:
"""Remove obsolete packages.
These may prevent other packages from upgrading.
"""
if OBSOLETE_PACKAGES:
logger.info('Removing packages: %s...', OBSOLETE_PACKAGES)
_apt_run(['remove'] + OBSOLETE_PACKAGES)
def _apt_update():
"""Run 'apt update'."""
logger.info('Updating Apt cache...')
_apt_run(['update'])
def _apt_autoremove():
"""Run 'apt autoremove'."""
logger.info('Running apt autoremove...')
_apt_run(['autoremove'])
def _apt_full_upgrade():
"""Run and check if apt upgrade was successful."""
logger.info('Running apt full-upgrade...')
returncode = _apt_run(['full-upgrade'])
if returncode:
raise RuntimeError(
'Apt full-upgrade was not successful. Distribution upgrade '
'will be retried at a later time.')
def _unattended_upgrades_run():
"""Run unattended-upgrade once more.
To handle upgrading the freedombox package.
"""
logger.info('Running unattended-upgrade...')
subprocess.run(['unattended-upgrade', '--verbose'], check=False)
def _freedombox_restart():
"""Restart FreedomBox service.
To ensure it is using the latest dependencies.
"""
logger.info('Restarting FreedomBox service...')
action_utils.service_restart('plinth')
def _wait():
"""Wait for 10 minutes before performing remaining actions."""
logger.info('Waiting for 10 minutes...')
time.sleep(10 * 60)
def _trigger_on_complete():
"""Trigger the on complete step in a separate service."""
# The dist-upgrade process will be run /etc/apt/sources.list file bind
# mounted on with a modified file. So, moving modified file to the original
# file will not be possible. For that, we need to launch a new process with
# a different systemd service (which does not have the bind mounts).
logger.info('Triggering on-complete to commit sources.lists')
subprocess.run([
'systemd-run', '--unit=freedombox-dist-upgrade-on-complete',
'--description=Finish up upgrade to new stable Debian release',
'/usr/share/plinth/actions/actions', 'upgrades',
'dist_upgrade_on_complete', '--no-args'
], check=True)
def _logging_setup():
"""Log to journal via console logging.
We need to capture all console logs created by apt and other commands and
redirect them to journal. This is the default behavior when launching a
service with systemd-run.
Avoid double logging to the journal by removing the systemd journal as a
log handler..
"""
logging.getLogger(None).removeHandler('journal')
def perform():
"""Perform upgrade to next release of Debian."""
_logging_setup()
with _snapshot_run_and_disable(), \
_services_disable(), \
_apt_hold_packages():
_apt_update()
_debconf_set_selections()
_packages_remove_obsolete()
_apt_full_upgrade()
_apt_autoremove()
_unattended_upgrades_run()
_freedombox_restart()
_wait()
_apt_update()
_trigger_on_complete()
def start_service(test_upgrade: bool):
"""Create dist upgrade service and start it."""
# Cleanup old service
old_service_path = pathlib.Path(
'/run/systemd/system/freedombox-dist-upgrade.service')
if old_service_path.exists():
old_service_path.unlink(missing_ok=True)
action_utils.service_daemon_reload()
old_codename, new_codename = _check(test_upgrade)
_sources_list_update(old_codename, new_codename)
args = [
'--unit=freedombox-dist-upgrade',
'--description=Upgrade to new stable Debian release',
'--property=KillMode=process', '--property=TimeoutSec=12hr',
f'--property=BindPaths={temp_sources_list}:{sources_list}'
]
subprocess.run(['systemd-run'] + args + [
'systemd-inhibit', '/usr/share/plinth/actions/actions', 'upgrades',
'dist_upgrade', '--no-args'
], check=True)
def on_complete():
"""Perform cleanup operations."""
_logging_setup()
logger.info('Dist upgrade complete.')
logger.info('Committing changes to /etc/apt/sources.list')
temp_sources_list.rename(sources_list)

View File

@ -6,29 +6,21 @@ import os
import pathlib
import re
import subprocess
import time
from plinth.action_utils import (apt_hold, apt_hold_flag, apt_hold_freedombox,
apt_unhold_freedombox, debconf_set_selections,
from plinth.action_utils import (apt_hold_flag, apt_unhold_freedombox,
is_package_manager_busy, run_apt_command,
service_daemon_reload, service_is_running,
service_restart, service_start, service_stop)
service_is_running)
from plinth.actions import privileged
from plinth.modules.apache.components import check_url
from plinth.modules.snapshot import is_apt_snapshots_enabled
from plinth.modules.snapshot import is_supported as snapshot_is_supported
from plinth.modules.snapshot import load_augeas as snapshot_load_augeas
from . import distupgrade, utils
logger = logging.getLogger(__name__)
SOURCES_LIST = '/etc/apt/sources.list'
BACKPORTS_SOURCES_LIST = '/etc/apt/sources.list.d/freedombox2.list'
AUTO_CONF_FILE = '/etc/apt/apt.conf.d/20auto-upgrades'
LOG_FILE = '/var/log/unattended-upgrades/unattended-upgrades.log'
DPKG_LOG_FILE = '/var/log/unattended-upgrades/unattended-upgrades-dpkg.log'
RELEASE_FILE_URL = \
'https://deb.debian.org/debian/dists/{}/Release'
APT_PREFERENCES_FREEDOMBOX = \
'''Explanation: This file is managed by FreedomBox, do not edit.
@ -53,38 +45,6 @@ Pin: release n=bookworm-backports
Pin-Priority: 500
'''
DIST_UPGRADE_OBSOLETE_PACKAGES: list[str] = []
DIST_UPGRADE_PACKAGES_WITH_PROMPTS = [
'bind9', 'firewalld', 'janus', 'minetest-server', 'minidlna',
'mumble-server', 'radicale', 'roundcube-core', 'tt-rss'
]
DIST_UPGRADE_PRE_DEBCONF_SELECTIONS: list[str] = [
# Tell grub-pc to continue without installing grub again.
'grub-pc grub-pc/install_devices_empty boolean true'
]
DIST_UPGRADE_REQUIRED_FREE_SPACE = 5000000
DIST_UPGRADE_SERVICE = '''
[Unit]
Description=Upgrade to new stable Debian release
[Service]
Type=oneshot
ExecStart=systemd-inhibit /usr/share/plinth/actions/actions \
upgrades dist_upgrade --no-args
KillMode=process
TimeoutSec=12hr
'''
DIST_UPGRADE_SERVICE_PATH = \
'/run/systemd/system/freedombox-dist-upgrade.service'
dist_upgrade_flag = pathlib.Path(
'/var/lib/freedombox/dist-upgrade-in-progress')
def _release_held_freedombox():
"""If freedombox package was left in held state, release it.
@ -127,25 +87,10 @@ def run():
start_new_session=True)
def _check_auto() -> bool:
"""Check if automatic upgrades are enabled."""
arguments = [
'apt-config', 'shell', 'UpdateInterval',
'APT::Periodic::Update-Package-Lists'
]
output = subprocess.check_output(arguments).decode()
update_interval = 0
match = re.match(r"UpdateInterval='(.*)'", output)
if match:
update_interval = int(match.group(1))
return bool(update_interval)
@privileged
def check_auto() -> bool:
"""Check if automatic upgrades are enabled."""
return _check_auto()
return utils.check_auto()
@privileged
@ -185,34 +130,6 @@ def get_log() -> str:
return '\n'.join(log_lines)
def _get_protocol() -> str:
"""Return the protocol to use for newly added repository sources."""
try:
from plinth.modules.torproxy import utils
if utils.is_apt_transport_tor_enabled():
return 'tor+http'
except Exception:
pass
return 'http'
def _is_release_file_available(protocol: str, dist: str,
backports=False) -> bool:
"""Return whether the release for dist[-backports] is available."""
wrapper = None
if protocol == 'tor+http':
wrapper = 'torsocks'
if backports:
dist += '-backports'
try:
return check_url(RELEASE_FILE_URL.format(dist), wrapper=wrapper)
except FileNotFoundError:
return False
def _add_backports_sources(sources_list: str, protocol: str, dist: str):
"""Add backports sources to freedombox repositories list."""
sources = '''# This file is managed by FreedomBox, do not edit.
@ -260,11 +177,11 @@ def _check_and_backports_sources(develop=False):
logging.info(f'System release is {release}. Skip enabling backports.')
return
protocol = _get_protocol()
protocol = utils.get_http_protocol()
if protocol == 'tor+http':
logging.info('Package download over Tor is enabled.')
if not _is_release_file_available(protocol, dist, backports=True):
if not utils.is_release_file_available(protocol, dist, backports=True):
logging.info(
f'Release file for {dist}-backports is not available yet.')
return
@ -302,244 +219,6 @@ def _add_apt_preferences():
file_handle.write(APT_PREFERENCES_APPS)
def _is_sufficient_free_space() -> bool:
"""Return whether there is sufficient free space for dist upgrade."""
output = subprocess.check_output(['df', '--output=avail', '/'])
free_space = int(output.decode().split('\n')[1])
return free_space >= DIST_UPGRADE_REQUIRED_FREE_SPACE
def _check_dist_upgrade(test_upgrade=False) -> tuple[bool, str]:
"""Check if a distribution upgrade be performed.
Check for new stable release, if updates are enabled, and if there is
enough free space for the dist upgrade.
If test_upgrade is True, also check for upgrade to testing.
Return (boolean, string) indicating if the upgrade is ready, and a reason
if not.
"""
if dist_upgrade_flag.exists():
return (True, 'found-previous')
from plinth.modules.upgrades import get_current_release
release, dist = get_current_release()
if release in ['unstable', 'testing', 'n/a']:
return (False, f'already-{release}')
check_dists = ['stable']
if test_upgrade:
check_dists.append('testing')
codename = None
for check_dist in check_dists:
url = RELEASE_FILE_URL.format(check_dist)
command = ['curl', '--silent', '--location', '--fail', url]
protocol = _get_protocol()
if protocol == 'tor+http':
command.insert(0, 'torsocks')
logging.info('Package download over Tor is enabled.')
try:
output = subprocess.check_output(command).decode()
except (subprocess.CalledProcessError, FileNotFoundError):
logging.warning('Error while checking for new %s release',
check_dist)
else:
for line in output.split('\n'):
if line.startswith('Codename:'):
codename = line.split()[1]
if not codename:
return (False, 'codename-not-found')
if codename == dist:
return (False, f'already-{dist}')
if not _check_auto():
return (False, 'upgrades-not-enabled')
if check_dist == 'testing' and not test_upgrade:
return (False, 'test-not-set')
if not _is_sufficient_free_space():
return (False, 'not-enough-free-space')
logging.info('Upgrading from %s to %s...', dist, codename)
with open(SOURCES_LIST, 'r', encoding='utf-8') as sources_list:
lines = sources_list.readlines()
with open(SOURCES_LIST, 'w', encoding='utf-8') as sources_list:
for line in lines:
# E.g. replace 'bullseye' with 'bookworm'.
new_line = line.replace(dist, codename)
if check_dist == 'testing':
# E.g. replace 'stable' with 'bookworm'.
new_line = new_line.replace('stable', codename)
sources_list.write(new_line)
logging.info('Dist upgrade in progress. Setting flag.')
dist_upgrade_flag.touch(mode=0o660)
return (True, 'started-dist-upgrade')
def _take_snapshot_and_disable() -> bool:
"""Take a snapshot if supported and enabled, then disable snapshots.
Return whether snapshots shall be re-enabled at the end.
"""
if snapshot_is_supported():
print('Taking a snapshot before dist upgrade...', flush=True)
subprocess.run([
'/usr/share/plinth/actions/actions', 'snapshot', 'create',
'--no-args'
], check=True)
aug = snapshot_load_augeas()
if is_apt_snapshots_enabled(aug):
print('Disable apt snapshots during dist upgrade...', flush=True)
subprocess.run([
'/usr/share/plinth/actions/actions',
'snapshot',
'disable_apt_snapshot',
], input='{"args": ["yes"], "kwargs": {}}'.encode(), check=True)
return True
else:
print('Apt snapshots already disabled.', flush=True)
else:
print('Snapshots are not supported, skip taking a snapshot.',
flush=True)
return False
def _restore_snapshots_config(reenable=False):
"""Restore original snapshots configuration."""
if reenable:
print('Re-enable apt snapshots...', flush=True)
subprocess.run([
'/usr/share/plinth/actions/actions', 'snapshot',
'disable_apt_snapshot'
], input='{"args": ["no"], "kwargs": {}}'.encode(), check=True)
def _disable_searx() -> bool:
"""If searx is enabled, disable it until we can upgrade it properly.
Return whether searx was originally enabled.
"""
searx_is_enabled = pathlib.Path(
'/etc/uwsgi/apps-enabled/searx.ini').exists()
if searx_is_enabled:
print('Disabling searx...', flush=True)
subprocess.run(
['/usr/share/plinth/actions/actions', 'apache', 'uwsgi_disable'],
input='{"args": ["searx"], "kwargs": {}}'.encode(), check=True)
return searx_is_enabled
def _update_searx(reenable=False):
"""If searx is installed, update search engines list.
Re-enable if previously enabled.
"""
if pathlib.Path('/etc/searx/settings.yml').exists():
print('Updating searx search engines list...', flush=True)
subprocess.run([
'/usr/share/plinth/actions/actions', 'searx', 'setup', '--no-args'
], check=True)
if reenable:
print('Re-enabling searx after upgrade...', flush=True)
subprocess.run([
'/usr/share/plinth/actions/actions', 'apache', 'uwsgi_enable'
], input='{"args": ["searx"], "kwargs": {}}'.encode(), check=True)
def _perform_dist_upgrade():
"""Perform upgrade to next release of Debian."""
reenable_snapshots = _take_snapshot_and_disable()
reenable_searx = _disable_searx()
# If quassel is running during dist upgrade, it may be restarted
# several times. This causes IRC users to rapidly leave/join
# channels. Stop quassel for the duration of the dist upgrade.
quassel_service = 'quasselcore'
quassel_was_running = service_is_running(quassel_service)
if quassel_was_running:
print('Stopping quassel service before dist upgrade...', flush=True)
service_stop(quassel_service)
# Hold freedombox package during entire dist upgrade.
print('Holding freedombox package...', flush=True)
with apt_hold_freedombox():
print('Updating Apt cache...', flush=True)
run_apt_command(['update'])
# Pre-set debconf selections if they are required during the
# dist upgrade.
if DIST_UPGRADE_PRE_DEBCONF_SELECTIONS:
print(
f'Setting debconf selections: '
f'{DIST_UPGRADE_PRE_DEBCONF_SELECTIONS}', flush=True)
debconf_set_selections(DIST_UPGRADE_PRE_DEBCONF_SELECTIONS)
# Remove obsolete packages that may prevent other packages from
# upgrading.
if DIST_UPGRADE_OBSOLETE_PACKAGES:
print(f'Removing packages: {DIST_UPGRADE_OBSOLETE_PACKAGES}...',
flush=True)
run_apt_command(['remove'] + DIST_UPGRADE_OBSOLETE_PACKAGES)
# Hold packages known to have conffile prompts. FreedomBox service
# will handle their upgrade later.
print(
'Holding packages with conffile prompts: ' +
', '.join(DIST_UPGRADE_PACKAGES_WITH_PROMPTS) + '...', flush=True)
with apt_hold(DIST_UPGRADE_PACKAGES_WITH_PROMPTS):
print('Running apt full-upgrade...', flush=True)
returncode = run_apt_command(['full-upgrade'])
# Check if apt upgrade was successful.
if returncode:
raise RuntimeError(
'Apt full-upgrade was not successful. Distribution upgrade '
'will be retried at a later time.')
_update_searx(reenable_searx)
if quassel_was_running:
print('Re-starting quassel service after dist upgrade...',
flush=True)
service_start(quassel_service)
print('Running apt autoremove...', flush=True)
run_apt_command(['autoremove'])
# Run unattended-upgrade once more to handle upgrading the
# freedombox package.
print('Running unattended-upgrade...', flush=True)
subprocess.run(['unattended-upgrade', '--verbose'], check=False)
_restore_snapshots_config(reenable_snapshots)
# Restart FreedomBox service to ensure it is using the latest
# dependencies.
print('Restarting FreedomBox service...', flush=True)
service_restart('plinth')
# After 10 minutes, update apt cache again to trigger force_upgrades.
print('Waiting for 10 minutes...', flush=True)
time.sleep(10 * 60)
print('Updating Apt cache...', flush=True)
run_apt_command(['update'])
print('Dist upgrade complete. Removing flag.', flush=True)
if dist_upgrade_flag.exists():
dist_upgrade_flag.unlink()
@privileged
def setup():
"""Setup apt preferences."""
@ -556,21 +235,8 @@ def activate_backports(develop: bool = False):
_check_and_backports_sources(develop)
def _start_dist_upgrade_service():
"""Create dist upgrade service and start it."""
with open(DIST_UPGRADE_SERVICE_PATH, 'w',
encoding='utf-8') as service_file:
service_file.write(DIST_UPGRADE_SERVICE)
service_daemon_reload()
subprocess.Popen(['systemctl', 'start', 'freedombox-dist-upgrade'],
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL, close_fds=True,
start_new_session=True)
@privileged
def start_dist_upgrade(test: bool = False) -> dict[str, str | bool]:
def start_dist_upgrade(test: bool = False):
"""Start dist upgrade process.
Check if a new stable release is available, and start dist-upgrade process
@ -578,14 +244,16 @@ def start_dist_upgrade(test: bool = False) -> dict[str, str | bool]:
"""
_release_held_freedombox()
upgrade_ready, reason = _check_dist_upgrade(test)
if upgrade_ready:
_start_dist_upgrade_service()
return {'dist_upgrade_started': upgrade_ready, 'reason': reason}
distupgrade.start_service(test)
@privileged
def dist_upgrade():
"""Perform major distribution upgrade."""
_perform_dist_upgrade()
distupgrade.perform()
@privileged
def dist_upgrade_on_complete():
"""Perform cleanup operations after distribution upgrade."""
distupgrade.on_complete()

View File

@ -0,0 +1,350 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Test various part of the dist upgrade process.
"""
import re
import subprocess
from unittest.mock import call, patch
import pytest
from plinth.modules.upgrades import distupgrade
# pylint: disable=protected-access
@patch('subprocess.run')
def test_apt_run(run):
"""Test that running apt command logs properly."""
run.return_value.returncode = 10
args = ['command', 'arg1', 'arg2']
assert distupgrade._apt_run(args) == 10
assert run.call_args.args == \
(['apt-get', '--assume-yes', '--quiet=2'] + args,)
assert not run.call_args.kwargs['stdout']
def test_sources_list_update(tmp_path):
"""Test that updating a sources file works."""
original = '''
# This is a comment with 'bookworm' in it.
deb http://deb.debian.org/debian bookworm main non-free-firmware
deb-src http://deb.debian.org/debian bookworm main non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main non-free-firmware
deb-src http://deb.debian.org/debian bookworm-updates main non-free-firmware
deb http://security.debian.org/debian-security/ bookworm-security main non-free-firmware
deb-src http://security.debian.org/debian-security/ bookworm-security main non-free-firmware
deb https://deb.debian.org/debian other main
deb https://deb.debian.org/debian bookwormish main
''' # noqa: E501
modified = '''
# This is a comment with 'bookworm' in it.
deb http://deb.debian.org/debian trixie main non-free-firmware
deb-src http://deb.debian.org/debian trixie main non-free-firmware
deb http://deb.debian.org/debian trixie-updates main non-free-firmware
deb-src http://deb.debian.org/debian trixie-updates main non-free-firmware
deb http://security.debian.org/debian-security/ trixie-security main non-free-firmware
deb-src http://security.debian.org/debian-security/ trixie-security main non-free-firmware
deb https://deb.debian.org/debian other main
deb https://deb.debian.org/debian bookwormish main
''' # noqa: E501
sources_list = tmp_path / 'sources.list'
temp_sources_list = tmp_path / 'sources.list.fbx-dist-upgrade'
module = 'plinth.modules.upgrades.distupgrade'
with patch(f'{module}.sources_list', sources_list), \
patch(f'{module}.temp_sources_list', temp_sources_list):
sources_list.write_text(original)
distupgrade._sources_list_update('bookworm', 'trixie')
assert temp_sources_list.read_text() == modified
original = re.sub(r'bookworm([ -])', r'stable\1', original)
sources_list.write_text(original)
distupgrade._sources_list_update('bookworm', 'trixie')
assert temp_sources_list.read_text() == modified
@patch('plinth.modules.upgrades.utils.get_http_protocol')
@patch('subprocess.check_output')
def test_get_new_codename(check_output, get_http_protocol):
"""Test that getting a new distro codename works."""
get_http_protocol.return_value = 'http'
check_output.return_value = b'''
Suite: testing
Codename: trixie
Description: Debian Testing distribution
'''
assert distupgrade._get_new_codename(False) == 'trixie'
check_output.assert_called_with([
'curl', '--silent', '--location', '--fail',
'https://deb.debian.org/debian/dists/stable/Release'
])
assert distupgrade._get_new_codename(True) == 'trixie'
check_output.assert_called_with([
'curl', '--silent', '--location', '--fail',
'https://deb.debian.org/debian/dists/testing/Release'
])
check_output.side_effect = FileNotFoundError('curl not found')
assert not distupgrade._get_new_codename(True)
@patch('plinth.modules.upgrades.distupgrade._get_new_codename')
@patch('plinth.modules.upgrades.get_current_release')
@patch('plinth.action_utils.service_is_running')
@patch('plinth.modules.upgrades.utils.is_sufficient_free_space')
@patch('plinth.modules.upgrades.utils.check_auto')
def test_check(check_auto, is_sufficient_free_space, service_is_running,
get_current_release, get_new_codename):
"""Test checking for available dist upgrade."""
check_auto.return_value = False
with pytest.raises(RuntimeError, match='upgrades-not-enabled'):
distupgrade._check()
check_auto.return_value = True
is_sufficient_free_space.return_value = False
with pytest.raises(RuntimeError, match='not-enough-free-space'):
distupgrade._check()
is_sufficient_free_space.return_value = True
service_is_running.return_value = True
with pytest.raises(RuntimeError, match='found-previous'):
distupgrade._check()
service_is_running.return_value = False
for release in ['unstable', 'testing', 'n/a']:
get_current_release.return_value = (release, release)
with pytest.raises(RuntimeError, match=f'already-{release}'):
distupgrade._check()
get_current_release.return_value = ('12', 'bookworm')
get_new_codename.return_value = None
with pytest.raises(RuntimeError, match='codename-not-found'):
distupgrade._check()
get_new_codename.assert_called_with(False)
distupgrade._check(True)
get_new_codename.assert_called_with(True)
get_new_codename.return_value = 'bookworm'
with pytest.raises(RuntimeError, match='already-bookworm'):
distupgrade._check()
get_new_codename.return_value = 'trixie'
assert distupgrade._check() == ('bookworm', 'trixie')
@patch('subprocess.run')
@patch('plinth.modules.snapshot.is_apt_snapshots_enabled')
@patch('plinth.modules.snapshot.is_supported')
def test_snapshot_run_and_disable(is_supported, is_apt_snapshots_enabled, run):
"""Test taking a snapshot."""
is_supported.return_value = False
with distupgrade._snapshot_run_and_disable():
run.assert_not_called()
run.assert_not_called()
is_supported.return_value = True
is_apt_snapshots_enabled.return_value = False
with distupgrade._snapshot_run_and_disable():
assert run.call_args_list == [
call([
'/usr/share/plinth/actions/actions', 'snapshot', 'create',
'--no-args'
], check=True)
]
run.reset_mock()
run.assert_not_called()
is_supported.return_value = True
is_apt_snapshots_enabled.return_value = True
with distupgrade._snapshot_run_and_disable():
assert run.call_args_list == [
call([
'/usr/share/plinth/actions/actions', 'snapshot', 'create',
'--no-args'
], check=True),
call([
'/usr/share/plinth/actions/actions', 'snapshot',
'disable_apt_snapshot'
], input=b'{"args": ["yes"], "kwargs": {}}', check=True)
]
run.reset_mock()
assert run.call_args_list == [
call([
'/usr/share/plinth/actions/actions', 'snapshot',
'disable_apt_snapshot'
], input=b'{"args": ["no"], "kwargs": {}}', check=True)
]
@patch('plinth.action_utils.service_enable')
@patch('plinth.action_utils.service_disable')
@patch('plinth.action_utils.service_is_running')
def test_services_disable(service_is_running, service_disable, service_enable):
"""Test that disabling services works."""
service_is_running.return_value = False
with distupgrade._services_disable():
service_disable.assert_not_called()
service_enable.assert_not_called()
service_is_running.return_value = True
with distupgrade._services_disable():
service_disable.call_args_list = [call('quasselcore')]
service_enable.call_args_list = [call('quasselcore')]
@patch('subprocess.run')
@patch('subprocess.check_call')
@patch('subprocess.check_output')
def test_apt_hold_packages(check_output, check_call, run, tmp_path):
"""Test that holding apt packages works."""
hold_flag = tmp_path / 'flag'
run.return_value.returncode = 0
with patch('plinth.action_utils.apt_hold_flag', hold_flag), \
patch('plinth.modules.upgrades.distupgrade.PACKAGES_WITH_PROMPTS',
['package1', 'package2']):
check_output.return_value = False
with distupgrade._apt_hold_packages():
assert hold_flag.exists()
assert hold_flag.stat().st_mode & 0o117 == 0
expected_call = [call(['apt-mark', 'hold', 'freedombox'])]
assert check_call.call_args_list == expected_call
expected_calls = [
call(['apt-mark', 'hold', 'package1'], check=False),
call(['apt-mark', 'hold', 'package2'], check=False)
]
assert run.call_args_list == expected_calls
check_call.reset_mock()
run.reset_mock()
expected_call = [
call(['apt-mark', 'unhold', 'freedombox'],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
check=False)
]
assert run.call_args_list == expected_call
expected_calls = [
call(['apt-mark', 'unhold', 'package1']),
call(['apt-mark', 'unhold', 'package2'])
]
assert check_call.call_args_list == expected_calls
@patch('plinth.action_utils.debconf_set_selections')
def test_debconf_set_selections(debconf_set_selections):
"""Test that setting debconf selections works."""
selections = 'plinth.modules.upgrades.distupgrade.PRE_DEBCONF_SELECTIONS'
with patch(selections, []):
distupgrade._debconf_set_selections()
debconf_set_selections.assert_not_called()
with patch(selections, ['selection1', 'selection2']):
distupgrade._debconf_set_selections()
debconf_set_selections.assert_called_with(['selection1', 'selection2'])
distupgrade._debconf_set_selections()
debconf_set_selections.assert_called_with(
['grub-pc grub-pc/install_devices_empty boolean true'])
@patch('plinth.modules.upgrades.distupgrade._apt_run')
def test_packages_remove_obsolete(apt_run):
"""Test that obsolete packages are removed."""
distupgrade._packages_remove_obsolete()
apt_run.assert_not_called() # No obsolete package to remove currently.
with patch('plinth.modules.upgrades.distupgrade.OBSOLETE_PACKAGES',
['tt-rss', 'searx']):
distupgrade._packages_remove_obsolete()
apt_run.assert_called_with(['remove', 'tt-rss', 'searx'])
@patch('plinth.modules.upgrades.distupgrade._apt_run')
def test_apt_update(apt_run):
"""Test that apt update works."""
distupgrade._apt_update()
apt_run.assert_called_with(['update'])
@patch('plinth.modules.upgrades.distupgrade._apt_run')
def test_apt_autoremove(apt_run):
"""Test that apt autoremove works."""
distupgrade._apt_autoremove()
apt_run.assert_called_with(['autoremove'])
@patch('plinth.modules.upgrades.distupgrade._apt_run')
def test_apt_full_upgrade(apt_run):
"""Test that apt full upgrade works."""
apt_run.return_value = 0
distupgrade._apt_full_upgrade()
apt_run.assert_called_with(['full-upgrade'])
apt_run.return_value = 1
with pytest.raises(RuntimeError):
distupgrade._apt_full_upgrade()
@patch('subprocess.run')
def test_unatteneded_upgrades_run(run):
"""Test that running unattended upgrades works."""
distupgrade._unattended_upgrades_run()
run.assert_called_with(['unattended-upgrade', '--verbose'], check=False)
@patch('plinth.action_utils.service_restart')
def test_freedombox_restart(service_restart):
"""Test that restarting freedombox service works."""
distupgrade._freedombox_restart()
service_restart.assert_called_with('plinth')
@patch('time.sleep')
def test_wait(sleep):
"""Test that sleeping works."""
distupgrade._wait()
sleep.assert_called_with(600)
@patch('subprocess.run')
def test_trigger_on_complete(run):
"""Test triggering post completion process."""
distupgrade._trigger_on_complete()
run.assert_called_with([
'systemd-run', '--unit=freedombox-dist-upgrade-on-complete',
'--description=Finish up upgrade to new stable Debian release',
'/usr/share/plinth/actions/actions', 'upgrades',
'dist_upgrade_on_complete', '--no-args'
], check=True)
def test_on_complete(tmp_path):
"""Test that /etc/apt/sources.list is committed."""
sources_list = tmp_path / 'sources.list'
sources_list.write_text('before')
temp_sources_list = tmp_path / 'sources.list.fbx-dist-upgrade'
temp_sources_list.write_text('after')
module = 'plinth.modules.upgrades.distupgrade'
with patch(f'{module}.sources_list', sources_list), \
patch(f'{module}.temp_sources_list', temp_sources_list):
distupgrade.on_complete()
assert sources_list.read_text() == 'after'
assert not temp_sources_list.exists()

View File

@ -0,0 +1,62 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Utilities for regular updates and dist-upgrades."""
import re
import subprocess
from plinth.modules.apache.components import check_url
RELEASE_FILE_URL = \
'https://deb.debian.org/debian/dists/{}/Release'
DIST_UPGRADE_REQUIRED_FREE_SPACE = 5000000
def check_auto() -> bool:
"""Return whether automatic updates are enabled."""
arguments = [
'apt-config', 'shell', 'UpdateInterval',
'APT::Periodic::Update-Package-Lists'
]
output = subprocess.check_output(arguments).decode()
update_interval = 0
match = re.match(r"UpdateInterval='(.*)'", output)
if match:
update_interval = int(match.group(1))
return bool(update_interval)
def get_http_protocol() -> str:
"""Return the protocol to use for newly added repository sources."""
try:
from plinth.modules.torproxy import utils
if utils.is_apt_transport_tor_enabled():
return 'tor+http'
except Exception:
pass
return 'http'
def is_release_file_available(protocol: str, dist: str,
backports=False) -> bool:
"""Return whether the release for dist[-backports] is available."""
wrapper = None
if protocol == 'tor+http':
wrapper = 'torsocks'
if backports:
dist += '-backports'
try:
return check_url(RELEASE_FILE_URL.format(dist), wrapper=wrapper)
except FileNotFoundError:
return False
def is_sufficient_free_space() -> bool:
"""Return whether there is sufficient free space for dist upgrade."""
output = subprocess.check_output(['df', '--output=avail', '/'])
free_space = int(output.decode().split('\n')[1])
return free_space >= DIST_UPGRADE_REQUIRED_FREE_SPACE

View File

@ -647,9 +647,13 @@ class ForceUpgrader():
# App does not implement force upgrade
continue
if (app.get_setup_state() != app_module.App.SetupState.UP_TO_DATE):
# App is not installed.
# Or needs an update, let it update first.
if (app.get_setup_state() == app_module.App.SetupState.NEEDS_SETUP
):
# If an app is not installed don't considered it. If an app
# needs an update, it may have to do a force upgrade before
# running app version update. This is because the app version
# update process will include installing packages that will
# fail due to pending configuration file updates.
continue
for component in app.get_components_of_type(Packages):

View File

@ -45,7 +45,7 @@
{% if app_info.tags %}
<div class="app-tags">
{% for tag in app_info.tags %}
<a href="{% url 'apps' %}?tag={{ tag|urlencode }}"
<a href="{{ active_section_url }}?tag={{ tag|urlencode }}"
class="btn btn-light rounded-pill tag">
{% trans tag %}
</a>

View File

@ -11,42 +11,3 @@
{% endblock %}
{% block body_class %}apps-page{% endblock %}
{% block tags %}
{% if tags %}
<div class="container">
<div class="dropdown searchable-dropdown">
<div class="tag-input">
<div id="selected-tags">
{% for tag in tags %}
<span class="btn btn-light rounded-pill tag"
data-tag="{{ tag }}">
{% trans tag %}
<button class="btn btn-sm btn-light remove-tag">
<i class="fa fa-times"></i>
</button>
</span>
{% endfor %}
</div>
<input id="add-tag-input" type="search" class="form-control dropdown-toggle"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"
autocomplete="off" placeholder="{% trans "Search with tags" %}">
<div class="dropdown-menu" aria-labelledby="add-tag-input">
<ul class="dropdown-items">
{% for tag in all_tags %}
{% if tag not in tags %}
<li class="dropdown-item" data-tag="{{ tag }}"
data-tag_l10n="{% trans tag %}">
{% trans tag %}
</li>
{% endif %}
{% endfor %}
</ul>
</div>
<a href="{% url 'apps' %}" aria-label="{% trans 'Clear all tags' %}"
class="btn-close" type="button"></a>
</div>
</div>
</div>
{% endif %}
{% endblock %}

View File

@ -15,7 +15,9 @@
</div>
</div>
{% block tags %}{% endblock %}
{% block tags %}
{% include "tags.html" %}
{% endblock %}
<div class="container card-container">
<div class="row">

View File

@ -6,6 +6,10 @@
{% load static %}
{% load i18n %}
{% block page_js %}
<script type="text/javascript" src="{% static 'tags.js' %}" defer></script>
{% endblock %}
{% block body_class %}system-page{% endblock %}
{% block container %}
@ -17,12 +21,16 @@
</div>
</div>
{% block tags %}
{% include "tags.html" %}
{% endblock %}
<div class="container card-container">
{% for section_item in menu_items %}
<div class="system-section-title">{{ section_item.name }}</div>
<div class="row">
<div class="card-list card-list-primary">
{% for item in section_item.sorted_items %}
{% for item in section_item.items %}
{% if advanced_mode or not item.advanced %}
{% include "card.html" %}
{% endif %}

View File

@ -0,0 +1,42 @@
{% comment %}
# SPDX-License-Identifier: AGPL-3.0-or-later
{% endcomment %}
{% load i18n %}
{% if tags %}
<div class="container">
<div class="dropdown searchable-dropdown">
<div class="tag-input">
<div id="selected-tags">
{% for tag in tags %}
<span class="btn btn-light rounded-pill tag"
data-tag="{{ tag }}">
{% trans tag %}
<button class="btn btn-sm btn-light remove-tag">
<i class="fa fa-times"></i>
</button>
</span>
{% endfor %}
</div>
<input id="add-tag-input" type="search" class="form-control dropdown-toggle"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"
autocomplete="off" placeholder="{% trans "Search with tags" %}">
<div class="dropdown-menu" aria-labelledby="add-tag-input">
<ul class="dropdown-items">
{% for tag in all_tags %}
{% if tag not in tags %}
<li class="dropdown-item" data-tag="{{ tag }}"
data-tag_l10n="{% trans tag %}">
{% trans tag %}
</li>
{% endif %}
{% endfor %}
</ul>
</div>
<a href="{{ active_section_url }}" aria-label="{% trans 'Clear all tags' %}"
class="btn-close" type="button"></a>
</div>
</div>
</div>
{% endif %}

View File

@ -171,6 +171,79 @@ def index(request):
})
def _pick_menu_items(menu_items, selected_tags):
"""Return a sorted list of menu items filtered by tags."""
class MenuProxy:
"""A proxy for the menu item to hold filtered children."""
def __init__(self, menu_item: menu.Menu):
"""Initialize a menu proxy object."""
self.menu_item = menu_item
self.items: list[menu.Menu] = []
tags = menu_item.tags or []
for item in menu_item.items:
tags += item.tags or []
self.tags = list(tags)
def __getattr__(self, name: str):
"""Return attributed from proxied object."""
return getattr(self.menu_item, name)
def _mismatch_map(menu_item) -> list[bool]:
"""Return a list of mismatches for selected tags.
A mismatch is when a selected tag is *not* present in the list of
tags for menu item.
"""
menu_tags = set(menu_item.tags or [])
return [tag not in menu_tags for tag in selected_tags]
def _sort_key(menu_item):
"""Returns a comparable tuple to sort menu items.
Sort items by tag match count first, then by the order of matched
tags in user specified order, then by the order set by menu item,
and then by the name of the menu item in current locale (by
configured collation order).
"""
return (_mismatch_map(menu_item).count(True), _mismatch_map(menu_item),
menu_item.order, menu_item.name.lower())
proxied_menu_items = []
for menu_item in menu_items:
proxied_item = MenuProxy(menu_item)
proxied_item.items = _pick_menu_items(menu_item.items, selected_tags)
proxied_menu_items.append(proxied_item)
# Filter out menu items that don't match any of the selected tags. If
# no tags are selected, return all menu items. Otherwise, return all
# menu items that have at least one matching tag.
filtered_menu_items = [
menu_item for menu_item in proxied_menu_items
if (not selected_tags) or (not all(_mismatch_map(menu_item)))
]
return sorted(filtered_menu_items, key=_sort_key)
def _get_all_tags(menu_items: list[menu.Menu]) -> list[str]:
"""Return a sorted list of all tags present in the given menu items."""
def get_tags(menu_items: list[menu.Menu]) -> set[str]:
"""Return a list of tags, unsorted."""
all_tags = set()
for menu_item in menu_items:
all_tags.update(menu_item.tags or [])
all_tags |= get_tags(menu_item.items)
return all_tags
# Sort tags by localized string
return sorted(get_tags(menu_items), key=_)
class AppsIndexView(TemplateView):
"""View for apps index.
@ -180,41 +253,6 @@ class AppsIndexView(TemplateView):
"""
template_name = 'apps.html'
@staticmethod
def _pick_menu_items(menu_items, selected_tags):
"""Return a sorted list of menu items filtered by tags."""
def _mismatch_map(menu_item) -> list[bool]:
"""Return a list of mismatches for selected tags.
A mismatch is when a selected tag is *not* present in the list of
tags for menu item.
"""
menu_tags = set(menu_item.tags)
return [tag not in menu_tags for tag in selected_tags]
def _sort_key(menu_item):
"""Returns a comparable tuple to sort menu items.
Sort items by tag match count first, then by the order of matched
tags in user specified order, then by the order set by menu item,
and then by the name of the menu item in current locale (by
configured collation order).
"""
return (_mismatch_map(menu_item).count(True),
_mismatch_map(menu_item), menu_item.order,
menu_item.name.lower())
# Filter out menu items that don't match any of the selected tags. If
# no tags are selected, return all menu items. Otherwise, return all
# menu items that have at least one matching tag.
filtered_menu_items = [
menu_item for menu_item in menu_items
if (not selected_tags) or (not all(_mismatch_map(menu_item)))
]
return sorted(filtered_menu_items, key=_sort_key)
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context['show_disabled'] = True
@ -224,24 +262,24 @@ class AppsIndexView(TemplateView):
menu_items = menu.main_menu.active_item(self.request).items
context['tags'] = tags
# Sorted tags by localized string
all_tags = set()
for menu_item in menu_items:
all_tags.update(menu_item.tags or [])
context['all_tags'] = sorted(all_tags, key=lambda tag: _(tag))
context['menu_items'] = self._pick_menu_items(menu_items, tags)
context['all_tags'] = _get_all_tags(menu_items)
context['menu_items'] = _pick_menu_items(menu_items, tags)
return context
def system_index(request):
"""Serve the system index page."""
menu_items = menu.main_menu.active_item(request).sorted_items()
return TemplateResponse(request, 'system.html', {
'advanced_mode': get_advanced_mode(),
'menu_items': menu_items
})
tags = request.GET.getlist('tag', [])
menu_items = menu.main_menu.active_item(request).items
return TemplateResponse(
request, 'system.html', {
'advanced_mode': get_advanced_mode(),
'menu_items': _pick_menu_items(menu_items, tags),
'tags': tags,
'all_tags': _get_all_tags(menu_items)
})
class LanguageSelectionView(FormView):
@ -472,9 +510,8 @@ class SetupView(TemplateView):
context['setup_state'] = setup_state
context['operations'] = operation.manager.filter(app.app_id)
context['show_rerun_setup'] = False
context['show_uninstall'] = (
not app.info.is_essential
and setup_state != app_module.App.SetupState.NEEDS_SETUP)
context['show_uninstall'] = (not app.info.is_essential and setup_state
!= app_module.App.SetupState.NEEDS_SETUP)
# Perform expensive operation only if needed.
if not context['operations']:

View File

@ -26,15 +26,15 @@
/**
* Update the URL path based on the selected tags.
*
* If no tags are selected, redirects to the base apps path. Otherwise,
* If no tags are selected, redirects to the base section path. Otherwise,
* constructs a new URL with query parameters for each tag.
*
* @param {string[]} tags - An array of selected tag names.
*/
function updatePathWithTags(tags) {
const appsPath = window.location.pathname;
const sectionPath = window.location.pathname;
if (tags.length === 0) {
this.location.assign(appsPath);
this.location.assign(sectionPath);
} else {
const urlParams = new URLSearchParams();
tags.forEach(tag => urlParams.append('tag', tag));