diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2a488ce22..64b0dddc5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,13 +20,12 @@ code-quality: static-type-check: stage: test - allow_failure: true needs: [] before_script: - apt-get update - apt-get install -y mypy script: - - mypy --ignore-missing-imports . + - mypy . unit-tests: stage: test @@ -120,7 +119,7 @@ build: build-backports: extends: .build-package variables: - RELEASE: bullseye-backports + RELEASE: bookworm-backports build i386: extends: .build-package-i386 diff --git a/actions/actions b/actions/actions index e012b4b3c..7b7e5459b 100755 --- a/actions/actions +++ b/actions/actions @@ -9,6 +9,7 @@ import logging import os import sys import traceback +import types import typing import plinth.log @@ -166,10 +167,9 @@ def _assert_valid_type(arg_name, value, annotation): return - if not hasattr(annotation, '__origin__'): - raise TypeError('Unsupported annotation type') - - if annotation.__origin__ == typing.Union: + # 'int | str' or 'typing.Union[int, str]' + if (isinstance(annotation, types.UnionType) + or getattr(annotation, '__origin__', None) == typing.Union): for arg in annotation.__args__: try: _assert_valid_type(arg_name, value, arg) @@ -179,7 +179,8 @@ def _assert_valid_type(arg_name, value, annotation): raise TypeError(f'Expected one of unioned types for {arg_name}') - if annotation.__origin__ == list: + # 'list[int]' or 'typing.List[int]' + if getattr(annotation, '__origin__', None) == list: if not isinstance(value, list): raise TypeError(f'Expected type list for {arg_name}') @@ -189,7 +190,8 @@ def _assert_valid_type(arg_name, value, annotation): return - if annotation.__origin__ == dict: + # 'list[dict]' or 'typing.List[dict]' + if getattr(annotation, '__origin__', None) == dict: if not isinstance(value, dict): raise TypeError(f'Expected type dict for {arg_name}') diff --git a/debian/changelog b/debian/changelog index a8affb727..095a0e0eb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,32 @@ +freedombox (23.18) unstable; urgency=medium + + [ 109247019824 ] + * Translated using Weblate (Bulgarian) + * Translated using Weblate (Bulgarian) + + [ Brian Ó Donnell ] + * middleware: Add new middleware to handle common errors like DB busy + + [ James Valleroy ] + * middleware: tests: Add tests for common error middleware + * locale: Update translations strings + * doc: Fetch latest manual + + [ rsquared ] + * ikiwiki: Disable discussion pages by default for new wiki/blog + + [ Sunil Mohan Adapa ] + * wordpress: Use absolute path in service file + * upgrades: Fix detecting apt over tor during upgrade + * gitlab-ci: Perform backports tests on bookworm instead of bullseye + * *: Fix all typing hint related errors + * gitlab-ci: Make passing mypy checks mandatory + * *: Utilize newer 3.10 syntax for type hints + * *: Add some additional type annotations + * pyproject: Add configuration for mypy to ignore some libraries + + -- James Valleroy Mon, 25 Sep 2023 20:47:20 -0400 + freedombox (23.17~bpo12+1) bookworm-backports; urgency=medium * Rebuild for bookworm-backports. diff --git a/doc/dev/conf.py b/doc/dev/conf.py index 42deaba26..27fd9e7d7 100644 --- a/doc/dev/conf.py +++ b/doc/dev/conf.py @@ -111,7 +111,7 @@ htmlhelp_basename = 'FreedomBoxdoc' # -- Options for LaTeX output ------------------------------------------------ -latex_elements = { +latex_elements: dict = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', diff --git a/doc/dev/tutorial/customizing.rst b/doc/dev/tutorial/customizing.rst index 46c2ad867..5b0aadd2c 100644 --- a/doc/dev/tutorial/customizing.rst +++ b/doc/dev/tutorial/customizing.rst @@ -160,7 +160,6 @@ for transmission daemon. We will do this by creating a file ``privileged.py``. import json import pathlib - from typing import Union from plinth import action_utils from plinth.actions import privileged @@ -175,7 +174,7 @@ for transmission daemon. We will do this by creating a file ``privileged.py``. @privileged - def merge_configuration(configuration: dict[str, Union[str, bool]]) -> None: + def merge_configuration(configuration: dict[str, str | bool]) -> None: """Merge given JSON configuration with existing configuration.""" current_configuration = _transmission_config.read_bytes() current_configuration = json.loads(current_configuration) diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index 181c96600..309757907 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -8,6 +8,17 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 23.18 (2023-09-25) == + + * *: Fix all typing hint related errors + * development: Make passing mypy checks mandatory + * development: Perform backports tests on bookworm instead of bullseye + * ikiwiki: Disable discussion pages by default for new wiki/blog + * locale: Update translations for Bulgarian + * middleware: Add new middleware to handle common errors like DB busy + * upgrades: Fix detecting apt over tor during upgrade + * wordpress: Use absolute path in service file + == FreedomBox 23.17 (2023-09-11) == * locale: Update translations for Czech, Dutch, Spanish, Swedish, Turkish, Ukrainian diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index 181c96600..309757907 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -8,6 +8,17 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 23.18 (2023-09-25) == + + * *: Fix all typing hint related errors + * development: Make passing mypy checks mandatory + * development: Perform backports tests on bookworm instead of bullseye + * ikiwiki: Disable discussion pages by default for new wiki/blog + * locale: Update translations for Bulgarian + * middleware: Add new middleware to handle common errors like DB busy + * upgrades: Fix detecting apt over tor during upgrade + * wordpress: Use absolute path in service file + == FreedomBox 23.17 (2023-09-11) == * locale: Update translations for Czech, Dutch, Spanish, Swedish, Turkish, Ukrainian diff --git a/plinth/__init__.py b/plinth/__init__.py index ecce5a33b..d8af71cd8 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '23.17' +__version__ = '23.18' diff --git a/plinth/app.py b/plinth/app.py index 5e294ff06..a7762d2bd 100644 --- a/plinth/app.py +++ b/plinth/app.py @@ -7,6 +7,7 @@ import collections import enum import inspect import logging +from typing import ClassVar from plinth import cfg from plinth.signals import post_app_loading @@ -39,14 +40,15 @@ class App: """ - app_id = None + app_id: str | None = None - can_be_disabled = True + can_be_disabled: bool = True - locked = False # Whether user interaction with the app is allowed. + locked: bool = False # Whether user interaction with the app is allowed. # XXX: Lockdown the application UI by implementing a middleware - _all_apps = collections.OrderedDict() + _all_apps: ClassVar[collections.OrderedDict[ + str, 'App']] = collections.OrderedDict() class SetupState(enum.Enum): """Various states of app being setup.""" diff --git a/plinth/frontpage.py b/plinth/frontpage.py index 012ba3c75..08508b6c7 100644 --- a/plinth/frontpage.py +++ b/plinth/frontpage.py @@ -4,6 +4,7 @@ import json import logging import pathlib +from typing import ClassVar from plinth import app, cfg from plinth.modules.users import privileged as users_privileged @@ -14,7 +15,7 @@ logger = logging.getLogger(__name__) class Shortcut(app.FollowerComponent): """An application component for handling shortcuts.""" - _all_shortcuts = {} + _all_shortcuts: ClassVar[dict[str, 'Shortcut']] = {} def __init__(self, component_id, name, short_description=None, icon=None, url=None, description=None, manual_page=None, diff --git a/plinth/locale/ar/LC_MESSAGES/django.po b/plinth/locale/ar/LC_MESSAGES/django.po index ce8500fdd..cc8900025 100644 --- a/plinth/locale/ar/LC_MESSAGES/django.po +++ b/plinth/locale/ar/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-03-31 09:12+0000\n" "Last-Translator: abidin toumi \n" "Language-Team: Arabic web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -1943,17 +1947,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2868,7 +2872,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2878,14 +2882,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3359,15 +3363,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7231,34 +7235,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7494,6 +7498,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7683,11 +7691,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/ar_SA/LC_MESSAGES/django.po b/plinth/locale/ar_SA/LC_MESSAGES/django.po index ac9ed7034..d9075d777 100644 --- a/plinth/locale/ar_SA/LC_MESSAGES/django.po +++ b/plinth/locale/ar_SA/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2020-06-10 15:41+0000\n" "Last-Translator: aiman an \n" "Language-Team: Arabic (Saudi Arabia) web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -1945,17 +1949,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2870,7 +2874,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2880,14 +2884,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3363,15 +3367,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7235,34 +7239,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7498,6 +7502,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7687,11 +7695,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index abf296885..69bdde6e5 100644 --- a/plinth/locale/bg/LC_MESSAGES/django.po +++ b/plinth/locale/bg/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" -"PO-Revision-Date: 2023-04-19 09:52+0000\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" +"PO-Revision-Date: 2023-09-18 19:00+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.18-dev\n" +"X-Generator: Weblate 5.0.2\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -28,7 +28,7 @@ msgstr "Изходен код на страницата" msgid "Static configuration {etc_path} is setup properly" msgstr "" -#: plinth/context_processors.py:23 plinth/views.py:94 +#: plinth/context_processors.py:23 plinth/views.py:95 msgid "FreedomBox" msgstr "FreedomBox" @@ -59,7 +59,7 @@ msgstr "Не може да се свърже с {host}:{port}" #: plinth/forms.py:36 msgid "Backup app before uninstall" -msgstr "Направете резерено копие преди да премахнете приложението" +msgstr "Резервно копие преди премахване на приложението" #: plinth/forms.py:37 msgid "Restoring from the backup will restore app data." @@ -108,6 +108,10 @@ msgstr "Език на интерфейса" msgid "Use the language preference set in the browser" msgstr "Използване на предпочитания от четеца език" +#: plinth/middleware.py:130 +msgid "System is possibly under heavy load. Please retry later." +msgstr "" + #: plinth/modules/apache/__init__.py:32 msgid "Apache HTTP Server" msgstr "Сървър на Apache HTTP" @@ -1739,13 +1743,13 @@ msgstr "" msgid "Already up-to-date" msgstr "" -#: plinth/modules/ejabberd/__init__.py:30 +#: plinth/modules/ejabberd/__init__.py:29 msgid "" "XMPP is an open and standardized communication protocol. Here you can run " "and configure your XMPP server, called ejabberd." msgstr "" -#: plinth/modules/ejabberd/__init__.py:33 +#: plinth/modules/ejabberd/__init__.py:32 #, python-brace-format msgid "" "To actually communicate, you can use the web client " "потребител с вход в {box_name}." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -2053,17 +2057,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Порт {name} ({details}) достъпен за вътрешните мрежи" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Порт {name} ({details}) достъпен за външните мрежи" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Порт {name} ({details}) недостъпен за външните мрежи" @@ -2999,7 +3003,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3009,14 +3013,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3241,10 +3245,8 @@ msgid "" msgstr "" #: plinth/modules/mediawiki/forms.py:93 -#, fuzzy -#| msgid "Select language" msgid "Default Language" -msgstr "Избор на език" +msgstr "Подразбиран език" #: plinth/modules/mediawiki/forms.py:94 msgid "" @@ -3289,10 +3291,8 @@ msgid "Site name updated" msgstr "Името на страницата е променено" #: plinth/modules/mediawiki/views.py:96 -#, fuzzy -#| msgid "Select language" msgid "Default language changed" -msgstr "Избор на език" +msgstr "Подразбираният език е променен" #: plinth/modules/minetest/__init__.py:33 #, python-brace-format @@ -3508,15 +3508,15 @@ msgstr "" msgid "Name Services" msgstr "Услуги за имена" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Всички" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Всички приложения за уеб" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Secure Shell" @@ -4015,7 +4015,7 @@ msgstr "" #: plinth/modules/snapshot/templates/snapshot_manage.html:29 #: plinth/modules/snapshot/templates/snapshot_rollback.html:27 msgid "Description" -msgstr "" +msgstr "Описание" #: plinth/modules/networks/templates/connection_show.html:109 msgid "Physical Link" @@ -4907,7 +4907,7 @@ msgstr "" #: plinth/modules/power/templates/power.html:22 plinth/templates/base.html:174 #: plinth/templates/base.html:175 msgid "Restart" -msgstr "Рестарт" +msgstr "Рестартиране" #: plinth/modules/power/templates/power.html:25 msgid "Shut Down" @@ -4932,7 +4932,7 @@ msgstr "" #: plinth/modules/power/templates/power_restart.html:48 #: plinth/modules/power/templates/power_restart.html:51 msgid "Restart Now" -msgstr "Рестарт" +msgstr "Рестартиране" #: plinth/modules/power/templates/power_shutdown.html:17 msgid "" @@ -5454,7 +5454,7 @@ msgstr "Често обновяване на възможности" #: plinth/modules/security/templates/security.html:21 #: plinth/modules/upgrades/templates/upgrades_configure.html:52 msgid "Frequent feature updates are activated." -msgstr "Честото обновяване на възможности е включено." +msgstr "Честото обновяване на пакети е включено." #: plinth/modules/security/templates/security.html:26 #: plinth/modules/upgrades/templates/backports-firstboot.html:14 @@ -5957,7 +5957,7 @@ msgstr "Настройките на моментните снимки на хр #: plinth/modules/snapshot/views.py:162 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" -msgstr "" +msgstr "Грешка при действие: {0} [{1}] [{2}]" #: plinth/modules/snapshot/views.py:188 msgid "Deleted selected snapshots" @@ -6380,10 +6380,8 @@ msgid "Obfs4 transport registered" msgstr "Транспортът Obfs4 е регистриран" #: plinth/modules/tor/__init__.py:168 -#, fuzzy -#| msgid "Onion Service" msgid "Onion service is version 3" -msgstr "Услуга на Onion" +msgstr "Услугата на Onion е версия 3" #: plinth/modules/tor/forms.py:33 msgid "" @@ -6442,33 +6440,30 @@ msgid "Enable Tor bridge relay" msgstr "" #: plinth/modules/tor/forms.py:103 -#, fuzzy msgid "" "When enabled, relay information is published in the Tor bridge database " "instead of public Tor relay database making it harder to censor this node. " "This helps others circumvent censorship." -msgstr "Когато е отметнато," +msgstr "" +"Когато е отметнато, информацията за препращанията ще бъде публикувана в " +"базата от данни с мостове на Тор вместо в публичната база от данни с " +"препращания на Тор като по този начин прави възела по-труден за цензуриране. " +"Помага на другите да заобиколят цензурата." #: plinth/modules/tor/forms.py:108 -#, fuzzy -#| msgid "Enable Tor Hidden Service" msgid "Enable Tor Onion Service" -msgstr "Включване на скритата услуга на Тор" +msgstr "Включване на услугата Tor Onion" #: plinth/modules/tor/forms.py:110 -#, fuzzy, python-brace-format -#| msgid "" -#| "A hidden service will allow {box_name} to provide selected services (such " -#| "as wiki or chat) without revealing its location. Do not use this for " -#| "strong anonymity yet." +#, python-brace-format msgid "" "An onion service will allow {box_name} to provide selected services (such as " "wiki or chat) without revealing its location. Do not use this for strong " "anonymity yet." msgstr "" -"Скрита услуга дава възможност на {box_name} да предоставя избрани ислуги " -"(като енциклопедия или бързи съобщения) без да разкрива местоположението си. " -"Не използвайте, за да криете самоличността си, все още." +"Услугата Tor Onion дава възможност на {box_name} да предоставя избрани " +"услуги (като енциклопедия или бързи съобщения) без да разкрива " +"местоположението си. Не използвайте, за да криете самоличността си, все още." #: plinth/modules/tor/forms.py:125 msgid "Specify at least one upstream bridge to use upstream bridges." @@ -6492,7 +6487,7 @@ msgstr "Портове" #: plinth/modules/tor/views.py:53 plinth/modules/torproxy/views.py:51 msgid "Updating configuration" -msgstr "Настройките са променени" +msgstr "Запазване на настройки" #: plinth/modules/tor/views.py:70 plinth/modules/torproxy/views.py:68 #, python-brace-format @@ -6509,10 +6504,8 @@ msgid "" msgstr "" #: plinth/modules/torproxy/__init__.py:54 -#, fuzzy -#| msgid "Tor Socks Proxy" msgid "Tor Proxy" -msgstr "Прокси сървър на Тор за SOCKS" +msgstr "Прокси сървър на Тор" #: plinth/modules/torproxy/__init__.py:79 msgid "Tor Socks Proxy" @@ -6643,10 +6636,8 @@ msgid "News Feed Reader" msgstr "Четец на абонаменти за новини" #: plinth/modules/ttrss/manifest.py:10 -#, fuzzy -#| msgid "Tiny Tiny RSS (Fork)" msgid "Tiny Tiny RSS (TTTRSS)" -msgstr "Tiny Tiny RSS (Fork)" +msgstr "Tiny Tiny RSS (TTTRSS)" #: plinth/modules/ttrss/manifest.py:20 msgid "TTRSS-Reader" @@ -6792,7 +6783,7 @@ msgstr "" #: plinth/templates/notifications.html:50 #: plinth/templates/operation-notification.html:23 msgid "Dismiss" -msgstr "" +msgstr "Затваряне" #: plinth/modules/upgrades/templates/upgrades_configure.html:30 #: plinth/modules/upgrades/templates/upgrades_configure.html:100 @@ -6904,7 +6895,7 @@ msgstr "" #: plinth/modules/upgrades/views.py:138 msgid "Frequent feature updates activated." -msgstr "Честото обновяване на възможности е включено." +msgstr "Честото обновяване на пакети е включено." #: plinth/modules/upgrades/views.py:224 msgid "Starting distribution upgrade test." @@ -7625,34 +7616,34 @@ msgstr "Изчакване да започне: {name}" msgid "Finished: {name}" msgstr "Готово: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "Пакетът „{expression}“ е недостъпен за инсталиране" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "Времето за изчакване на диспечера на пакети е изтекло" @@ -7879,14 +7870,20 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "грешка" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" "Please wait for %(box_name)s to finish installation. You can start using " "your %(box_name)s once it is done." msgstr "" -"Изчакайте да завърши инсталирането на %(box_name)s. След това можете да " -"започнете употреба." +"Изчакайте да завърши инсталирането на %(box_name)s. След това устройството " +"%(box_name)s може да бъде въведено в употреба." #: plinth/templates/index.html:22 #, python-format @@ -8048,10 +8045,8 @@ msgid "Update" msgstr "Обновяване" #: plinth/templates/toolbar.html:39 plinth/templates/toolbar.html:40 -#, fuzzy -#| msgid "Backups" msgid "Backup" -msgstr "Резервни копия" +msgstr "Резервно копие" #: plinth/templates/toolbar.html:53 msgid "Re-run setup" @@ -8075,11 +8070,11 @@ msgstr "" "Всички данни и настройки на приложението ще бъдат загубени. Приложението " "може да бъде инсталирано отново." -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Настройките не са променени" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "преди премахване на {app_id}" diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index bb55c0a9c..137050ee0 100644 --- a/plinth/locale/bn/LC_MESSAGES/django.po +++ b/plinth/locale/bn/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2021-06-16 07:33+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ইজ্যাবার্ড" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -1957,17 +1961,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2882,7 +2886,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2892,14 +2896,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3375,15 +3379,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7250,34 +7254,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7501,6 +7505,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7690,11 +7698,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/cs/LC_MESSAGES/django.po b/plinth/locale/cs/LC_MESSAGES/django.po index b0059dc63..865a558b2 100644 --- a/plinth/locale/cs/LC_MESSAGES/django.po +++ b/plinth/locale/cs/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-08-31 19:50+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech web clientuživatel s " "přihlašovacím jménem {box_name}." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn nebo nakonfigurujte externí " "server." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Chat server" @@ -2161,17 +2165,17 @@ msgstr "Firewall backend je nftables" msgid "Direct passthrough rules exist" msgstr "Existují pravidla přímého prostupu" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port {name} ({details}) dostupný pro interní sítě" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port {name} ({details}) dostupný pro externí sítě" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Port {name} {details} je nedostupný pro externí sítě" @@ -3224,7 +3228,7 @@ msgstr "Certifikát pro doménu {domain} úspěšně smazán" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Nepodařilo se smazat certifikát pro doménu {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3241,7 +3245,7 @@ msgstr "" "čísla. Díky federování mohou uživatelé na daném Matrix serveru komunikovat s " "uživateli všech ostatních Matrix serverů." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3251,7 +3255,7 @@ msgstr "" "Nainstalujte aplikaci Coturn nebo " "nakonfigurujte externí server." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3817,15 +3821,15 @@ msgstr "" msgid "Name Services" msgstr "Jmenné služby" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Vše" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Všechny webové aplikace" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Zabezpečený shell" @@ -8273,34 +8277,34 @@ msgstr "Čeká na spuštění: {name}" msgid "Finished: {name}" msgstr "Dokončeno: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "Balíček {expression} není k dispozici pro instalaci" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Balíček {package_name} je nejnovější verze ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "Instalace" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "stahování" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "změna média" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "soubor s nastaveními: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "Časový limit čekání na správce balíčků" @@ -8534,6 +8538,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "chyba" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8751,11 +8761,11 @@ msgstr "" "Všechna data a konfigurace aplikace budou trvale ztraceny. Aplikaci lze " "nainstalovat znovu." -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Nastavení se nezměnila" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "před odinstalací {app_id}" diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index ce6be8ae3..6c28497e4 100644 --- a/plinth/locale/da/LC_MESSAGES/django.po +++ b/plinth/locale/da/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Danish web client bruger med adgang til {box_name}." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Chatserver" @@ -2193,17 +2197,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port {name} ({details}) er tilgængelig for interne netværk" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port {name} ({details}) er tilgængelig for eksterne netværk" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Port {name} ({details}) er ikke tilgængelig for eksterne netværk" @@ -3288,7 +3292,7 @@ msgstr "Certifikatet for domænet {domain} blev trukket tilbage" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Fejl ved tilbagetrækning af certifikatet for domænet {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3298,14 +3302,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3860,15 +3864,15 @@ msgstr "" msgid "Name Services" msgstr "Navnetjenester" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Secure Shell" @@ -8348,34 +8352,34 @@ msgstr "" msgid "Finished: {name}" msgstr "Tjeneste ikke aktiv: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "Installerer" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "downloader" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "medie-ændring" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurationsfil: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8645,6 +8649,12 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "fejl" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8851,11 +8861,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Indstilling uændret" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index ed97cb569..1c29e8104 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-08-07 12:46+0000\n" "Last-Translator: Ettore Atalan \n" "Language-Team: German web client Benutzer mit " "einem {box_name} Login aufgerufen werden." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn-App oder konfiguriere einen externen " "Server." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Chatserver" @@ -2205,17 +2209,17 @@ msgstr "Firewall-Backend ist nftables" msgid "Direct passthrough rules exist" msgstr "Regeln für direktes Durchleiten existieren" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port -Name {name}({details}) für interne Netzwerke verfügbar" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port -Name {name} ({details}) für externe Netzwerke verfügbar" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Port -Name {name} ({details}) für externe Netzwerke nicht verfügbar" @@ -3288,7 +3292,7 @@ msgstr "Zertifikat erfolgreich widerrufen für Domain {domain}" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Fehler beim Widerrufen des Zertifikats für Domain {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3306,7 +3310,7 @@ msgstr "" "einem bestimmten Matrix Server können dank Föderation zwischen den Servern " "mit Nutzerkonten auf einem beliebigen anderen Server kommunizieren." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3316,7 +3320,7 @@ msgstr "" "Installiere die Coturn-App oder konfiguriere " "einen externen Server." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3897,15 +3901,15 @@ msgstr "" msgid "Name Services" msgstr "Namen-Dienste" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Alle" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Alle Webanwendungen" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Secure Shell" @@ -8444,34 +8448,34 @@ msgstr "Warten auf den Start: {name}" msgid "Finished: {name}" msgstr "Fertig: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "Paket {expression} ist nicht verfügbar" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Paket {package_name} ist die aktuellste Version ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "Installation läuft" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "herunterladen" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "Medienwechsel" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "Konfigurationsdatei: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "Zeitüberschreitung beim Warten auf den Paket-Manager" @@ -8709,6 +8713,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "Fehler" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8926,11 +8936,11 @@ msgstr "" "Alle App-Daten und -Konfigurationen gehen dauerhaft verloren. App kann " "wieder frisch installiert werden." -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Einstellung unverändert" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "vor der Deinstallation von {app_id}" diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index e934b1de7..0fefed95a 100644 --- a/plinth/locale/django.pot +++ b/plinth/locale/django.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -26,7 +26,7 @@ msgstr "" msgid "Static configuration {etc_path} is setup properly" msgstr "" -#: plinth/context_processors.py:23 plinth/views.py:94 +#: plinth/context_processors.py:23 plinth/views.py:95 msgid "FreedomBox" msgstr "" @@ -101,6 +101,10 @@ msgstr "" msgid "Use the language preference set in the browser" msgstr "" +#: plinth/middleware.py:130 +msgid "System is possibly under heavy load. Please retry later." +msgstr "" + #: plinth/modules/apache/__init__.py:32 msgid "Apache HTTP Server" msgstr "" @@ -1636,13 +1640,13 @@ msgstr "" msgid "Already up-to-date" msgstr "" -#: plinth/modules/ejabberd/__init__.py:30 +#: plinth/modules/ejabberd/__init__.py:29 msgid "" "XMPP is an open and standardized communication protocol. Here you can run " "and configure your XMPP server, called ejabberd." msgstr "" -#: plinth/modules/ejabberd/__init__.py:33 +#: plinth/modules/ejabberd/__init__.py:32 #, python-brace-format msgid "" "To actually communicate, you can use the web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -1940,17 +1944,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2865,7 +2869,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2875,14 +2879,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3354,15 +3358,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7225,34 +7229,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7476,6 +7480,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7663,11 +7671,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index 84432e445..3d18268ef 100644 --- a/plinth/locale/el/LC_MESSAGES/django.po +++ b/plinth/locale/el/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Greek web clientπιστοποιητικά για το {box_name}." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Διακομιστής συνομιλίας" @@ -2246,17 +2250,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Θύρα {name} ({details}) διαθέσιμη για εσωτερικά δίκτυα" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Η θύρα {name} ({details}) είναι διαθέσιμη για εξωτερικά δίκτυα" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Η θύρα {name} ({details}) δεν είναι διαθέσιμη για εξωτερικά δίκτυα" @@ -3349,7 +3353,7 @@ msgstr "Το πιστοποιητικό διαγράφηκε επιτυχώς γ msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Αποτυχία διαγραφής πιστοποιητικού για το όνομα {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3367,14 +3371,14 @@ msgstr "" "να συνομιλήσουν με τους χρήστες σε όλες τις άλλες διακομιστές Matrix μέσω " "ομοσπονδίας." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3979,15 +3983,15 @@ msgstr "" msgid "Name Services" msgstr "Υπηρεσίες ονομάτων" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Όλα" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Όλες οι εφαρμογές ιστού" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Secure Shell" @@ -8585,34 +8589,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "Εγκαθίσταται" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "Λήψη" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "Αλλαγή μέσου" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "αρχείο ρυθμίσεων: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8876,6 +8880,10 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -9108,11 +9116,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Οι ρυθμίσεις δεν άλλαξαν" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index e3dbfde79..91edf34d0 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-08-31 19:50+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish web clientusuario con acceso a " "{box_name}." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn o configurar un servidor " "externo." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Servidor de Chat" @@ -2182,17 +2186,17 @@ msgstr "El backend del cortafuegos es nftables" msgid "Direct passthrough rules exist" msgstr "Existen normas de transferencia directa" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Puerto {name} ({details}) disponible para redes internas" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Puerto {name} ({details}) disponible para redes externas" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Puerto {name} ({details}) no disponible para redes externas" @@ -3254,7 +3258,7 @@ msgstr "El certificado para el dominio {domain} ha sido eliminado con éxito" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Falló la eliminación del certificado para el dominio {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3271,7 +3275,7 @@ msgstr "" "funcionar. La federación de los servidores permite que las/os usuarias/os de " "un servidor Matrix contacten con los de otro servidor." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3281,7 +3285,7 @@ msgstr "" "Instalar la app Coturn o configurar un servidor " "externo." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3854,15 +3858,15 @@ msgstr "" msgid "Name Services" msgstr "Servicios de nombres" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Todos" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Todas las apps web" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Intérprete de órdenes seguro" @@ -8330,34 +8334,34 @@ msgstr "Esperando a empezar: {name}" msgid "Finished: {name}" msgstr "Terminó: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "El paquete {expression} no está disponible para instalar" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "El paquete {package_name} es la última versión ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "instalando" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "descargando" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "cambio de medio" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "archivo de configuración: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "Tiempo máximo esperando al administrador de paquetes" @@ -8593,6 +8597,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "error" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8808,11 +8818,11 @@ msgstr "" "Todos los datos de la aplicación y la configuración se perderán " "permanentemente. La aplicación se puede instalar de nuevo." -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Configuración sin cambio" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "antes de desinstalar {app_id}" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index ab3ef5686..bc9627a22 100644 --- a/plinth/locale/fa/LC_MESSAGES/django.po +++ b/plinth/locale/fa/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Persian web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 #, fuzzy #| msgid "Web Server" msgid "Chat Server" @@ -2184,17 +2188,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -3240,7 +3244,7 @@ msgstr "گواهی دامنهٔ {domain} با موفقیت باطل شد" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "باطل‌کردن گواهی دامنهٔ {domain} شکست خورد: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3250,14 +3254,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3781,15 +3785,15 @@ msgstr "" msgid "Name Services" msgstr "سرویس نام‌ها" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "پوستهٔ ایمن" @@ -7959,34 +7963,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8224,6 +8228,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8422,11 +8430,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index 709f12ca3..bf6ae8ee4 100644 --- a/plinth/locale/fake/LC_MESSAGES/django.po +++ b/plinth/locale/fake/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth 0.6\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers web client " @@ -1959,19 +1963,19 @@ msgstr "" "ANY OTHER XMPP CLIENT." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 #, fuzzy #| msgid "Web Server" msgid "Chat Server" @@ -2288,19 +2292,19 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for internal networks" msgstr "SERVICE DISCOVERY SERVER IS NOT RUNNING" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for external networks" msgstr "SERVICE DISCOVERY SERVER IS NOT RUNNING" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -3365,7 +3369,7 @@ msgstr "CERTIFICATE SUCCESSFULLY REVOKED FOR DOMAIN {domain}" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "FAILED TO REVOKE CERTIFICATE FOR DOMAIN {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3375,14 +3379,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 #, fuzzy #| msgid "Chat Server (XMPP)" msgid "Matrix Synapse" @@ -3931,15 +3935,15 @@ msgstr "" msgid "Name Services" msgstr "NAME SERVICES" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 #, fuzzy #| msgid "Secure Shell (SSH)" msgid "Secure Shell" @@ -8432,39 +8436,39 @@ msgstr "" msgid "Finished: {name}" msgstr "SERVICE DISABLED: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 #, fuzzy #| msgid "Installation" msgid "installing" msgstr "INSTALLATION" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 #, fuzzy #| msgid "Setting unchanged" msgid "media change" msgstr "SETTING UNCHANGED" -#: plinth/package.py:379 +#: plinth/package.py:378 #, fuzzy, python-brace-format #| msgid "Configuration" msgid "configuration file: {file}" msgstr "CONFIGURATION" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8738,6 +8742,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8950,11 +8958,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "SETTING UNCHANGED" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index 1bbeac017..751b0aeb8 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-04-07 23:10+0000\n" "Last-Translator: Coucouf \n" "Language-Team: French web clientutilisatrice ou utilisateur " "disposant d’un compte sur la {box_name}." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn ou " "bien configurez un serveur externe." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Serveur de discussion" @@ -2221,17 +2225,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port {name} ({details}) disponible pour les réseaux internes" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port {name} ({details}) disponible pour les réseaux externes" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Port {name} ({details}) non disponible pour les réseaux externes" @@ -3307,7 +3311,7 @@ msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" "La suppression du certificat pour le domaine {domain} a échoué : {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3325,7 +3329,7 @@ msgstr "" "un serveur Matrix donné peuvent converser avec des utilisateurs sur tous les " "autres serveurs Matrix grâce la fédération." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3335,7 +3339,7 @@ msgstr "" "Installez pour cela l’application Coturn ou " "bien configurez un serveur externe." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3924,15 +3928,15 @@ msgstr "" msgid "Name Services" msgstr "Services de nommage" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Tous" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Toutes les applications web" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Secure Shell" @@ -8508,34 +8512,34 @@ msgstr "Attente du démarrage de : {name}" msgid "Finished: {name}" msgstr "Terminé : {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "Le paquet {expression} n’est pas disponible à l’installation" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Le paquet {package_name} est à la dernière version ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "installation en cours" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "téléchargement en cours" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "changement de support" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "fichier de configuration : {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "Aucune réponse du gestionnaire de paquets" @@ -8772,6 +8776,12 @@ msgstr "Homebrew :" msgid "RPM:" msgstr "RPM :" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "erreur" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8994,11 +9004,11 @@ msgstr "" "L’ensemble données de l’appli et sa configuration seront définitivement " "perdus. Un appli peut toujours être réinstallée de zéro." -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Paramètre inchangé" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "avant la désinstallation de {app_id}" diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index 3a8f78cab..feb953b96 100644 --- a/plinth/locale/gl/LC_MESSAGES/django.po +++ b/plinth/locale/gl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-12-30 10:51+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Galician web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -1948,17 +1952,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2875,7 +2879,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2885,14 +2889,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3368,15 +3372,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7259,34 +7263,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7522,6 +7526,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7713,11 +7721,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/gu/LC_MESSAGES/django.po b/plinth/locale/gu/LC_MESSAGES/django.po index 5aaf64411..382f472ec 100644 --- a/plinth/locale/gu/LC_MESSAGES/django.po +++ b/plinth/locale/gu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Gujarati વપરાશકર્તાઓ સાથે{box_name}" "પ્રવેશ." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ઈઝબેબર્ડ" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "ચેટ સર્વર" @@ -2133,17 +2137,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -3084,7 +3088,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3094,14 +3098,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3609,15 +3613,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7597,34 +7601,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7870,6 +7874,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8070,11 +8078,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "સેટિંગ યથાવત" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/hi/LC_MESSAGES/django.po b/plinth/locale/hi/LC_MESSAGES/django.po index ac195f0d5..3d6823ee1 100644 --- a/plinth/locale/hi/LC_MESSAGES/django.po +++ b/plinth/locale/hi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Hindi web " @@ -1912,19 +1916,19 @@ msgstr "" "ग्राहक. सक्षम होने पर एजाबेरड कोई यूसर एक {box_name} " "लोगिन से उपयोग कर सकते हैं." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "एजाबेरड" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "चाट सर्वर" @@ -2236,19 +2240,19 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, fuzzy, python-brace-format #| msgid "%(service_name)s is available only on internal networks." msgid "Port {name} ({details}) available for internal networks" msgstr "%(service_name)s सिर्फ आंतरिक नेटवर्क्स पर उपलब्ध है." -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, fuzzy, python-brace-format #| msgid "%(service_name)s is available only on internal networks." msgid "Port {name} ({details}) available for external networks" msgstr "%(service_name)s सिर्फ आंतरिक नेटवर्क्स पर उपलब्ध है." -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -3293,7 +3297,7 @@ msgstr "डोमेन के लिए प्रमाणपत्र का msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "डोमेन के लिए प्रमाणपत्र नहीं हटाया गया {domain}:{error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3308,14 +3312,14 @@ msgstr "" "मल्टीपल डिवाइस सिंक्रनाइज़इज़ाशिन और काम करने के लिए फोन नंबर की ज़रुरत नहीं है. मैट्रिक्स " "सर्वर पर यूसरसॅ सारे मैट्रिक्स सर्वर के लेग से बात कर सकते है फ़ेडरेशिन उपयोग कर." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "मैट्रिक्स सिनापसॅ" @@ -3869,15 +3873,15 @@ msgstr "" msgid "Name Services" msgstr "नाम सरविस" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "सुरक्षित शेल" @@ -8378,34 +8382,34 @@ msgstr "" msgid "Finished: {name}" msgstr "सर्विस सक्षम किया गया:{name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "इंस्टॉलिंग" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "डाउनलोडिंग" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "मीडिया बदलाव" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "कॉंफ़िगरेशन फ़ाइल: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8666,6 +8670,10 @@ msgstr "होमब्रु:" msgid "RPM:" msgstr "आरपीएम:" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8881,11 +8889,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "सेटिंग स्थिर है" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index f186a0156..f23a00564 100644 --- a/plinth/locale/hu/LC_MESSAGES/django.po +++ b/plinth/locale/hu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-10-24 18:39+0000\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Hungarian web client felhasználó számára {box_name} " "felhasználónéven." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn alkalmazást " "vagy állíts be egy külső szervert." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Chat szerver" @@ -2192,17 +2196,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "{name} port ({details}) elérhető a belső hálózaton" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "{name} port ({details}) elérhető a külső hálózaton" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "{name} port ({details}) nem érhető el külső hálózaton" @@ -3270,7 +3274,7 @@ msgstr "{domain} domain tanúsítványa sikeresen törölve" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "{domain} domain tanúsítványát nem sikerült kitörölni: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3287,7 +3291,7 @@ msgstr "" "adott Matrix-szerveren lévő felhasználók föderáción keresztül " "beszélgethetnek az összes többi Matrix-szerver felhasználóival." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3297,7 +3301,7 @@ msgstr "" "videóhívásokhoz. Telepítsd a Coturn " "alkalmazást, vagy konfigurálj egy külső szervert." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3879,15 +3883,15 @@ msgstr "" msgid "Name Services" msgstr "Névszolgáltatások" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Összes" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Összes webalkalmazás" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Secure Shell (Biztonságos parancsértelmező)" @@ -8411,34 +8415,34 @@ msgstr "" msgid "Finished: {name}" msgstr "Szolgáltatás letiltva: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "A(z) {package_name} a legfrissebb verzió ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "telepítés" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "letöltés" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "adathordozó csere" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurációs fájl: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8691,6 +8695,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "hiba" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8915,11 +8925,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "A beállítás változatlan" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index 765595553..0402ef999 100644 --- a/plinth/locale/id/LC_MESSAGES/django.po +++ b/plinth/locale/id/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Indonesian (FreedomBox)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Indonesian web client pengguna dengan sebuah {box_name} " "login." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn atau konfigurasikan server " "eksternal." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "Ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Server obrolan" @@ -2190,17 +2194,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port {name} ({details}) tersedia untuk jaringan internal" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port {name} ({details}) tersedia untuk jaringan eksternal" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Port {name} ({details}) tidak tersedia untuk jaringan eksternal" @@ -3253,7 +3257,7 @@ msgstr "Sertifikat berhasil dihapus untuk domain {domain}" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Gagal menghapus sertifikat untuk domain {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3270,7 +3274,7 @@ msgstr "" "Pengguna pada server matriks tertentu dapat berkomunikasi dengan pengguna di " "semua server matriks lainnya melalui Federation." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3280,7 +3284,7 @@ msgstr "" "Pasang aplikasi Coturn atau konfigurasikan " "server eksternal." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Sinaps Matrix" @@ -3780,15 +3784,15 @@ msgstr "" msgid "Name Services" msgstr "Nama Layanan" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Semua" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Semua aplikasi web" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Secure Shell" @@ -7779,34 +7783,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "memasang" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "mengunduh" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8047,6 +8051,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "kesalahan" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8249,11 +8259,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index 4bd874008..762bf908b 100644 --- a/plinth/locale/it/LC_MESSAGES/django.po +++ b/plinth/locale/it/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Italian web client da ogni utente con un login " "{box_name} ." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Server Chat" @@ -2152,17 +2156,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Porta {name} ({details}) disponibile per le reti interne" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Porta {name} ({details}) disponibile per reti esterne" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Porta {name} ({details}) non disponibile per reti esterne" @@ -3230,7 +3234,7 @@ msgstr "Certificato cancellato correttamente per il dominio {domain}" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Cancellazione certificato fallita per il dominio {domain}:{error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3247,14 +3251,14 @@ msgstr "" "Gli utenti di un certo server Matrix possono comunicare con gli altri utenti " "attestati su tutti gli altri server Matrix tramite federazione." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3818,15 +3822,15 @@ msgstr "" msgid "Name Services" msgstr "Name Services" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Secure Shell" @@ -7858,34 +7862,34 @@ msgstr "" msgid "Finished: {name}" msgstr "Servizio disabilitato: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8130,6 +8134,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8326,11 +8334,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Impostazioni invariate" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index c0ae0c27a..6160f6f05 100644 --- a/plinth/locale/ja/LC_MESSAGES/django.po +++ b/plinth/locale/ja/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-05-07 23:50+0000\n" "Last-Translator: Nobuhiro Iwamatsu \n" "Language-Team: Japanese web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -1942,17 +1946,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2867,7 +2871,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2877,14 +2881,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3356,15 +3360,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7227,34 +7231,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7478,6 +7482,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7665,11 +7673,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/kn/LC_MESSAGES/django.po b/plinth/locale/kn/LC_MESSAGES/django.po index a981ba208..cb107a629 100644 --- a/plinth/locale/kn/LC_MESSAGES/django.po +++ b/plinth/locale/kn/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2020-07-16 16:41+0000\n" "Last-Translator: Yogesh \n" "Language-Team: Kannada web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -1942,17 +1946,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2867,7 +2871,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2877,14 +2881,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3356,15 +3360,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7229,34 +7233,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7480,6 +7484,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7667,11 +7675,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/lt/LC_MESSAGES/django.po b/plinth/locale/lt/LC_MESSAGES/django.po index b231ec85b..10cb940cc 100644 --- a/plinth/locale/lt/LC_MESSAGES/django.po +++ b/plinth/locale/lt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Lithuanian web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -1944,17 +1948,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2869,7 +2873,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2879,14 +2883,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3358,15 +3362,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7231,34 +7235,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7482,6 +7486,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7669,11 +7677,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/lv/LC_MESSAGES/django.po b/plinth/locale/lv/LC_MESSAGES/django.po index ffdea84af..bf3b79ba5 100644 --- a/plinth/locale/lv/LC_MESSAGES/django.po +++ b/plinth/locale/lv/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Latvian web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -1943,17 +1947,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2868,7 +2872,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2878,14 +2882,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3357,15 +3361,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7230,34 +7234,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7481,6 +7485,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7668,11 +7676,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index b291ff1e5..9557e690b 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-08-16 06:52+0000\n" "Last-Translator: Petter Reinholdtsen \n" "Language-Team: Norwegian Bokmål web clientbruker med innlogging på " "{box_name}." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Nettprat-tjener" @@ -2215,17 +2219,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port {name} ({details}) tilgjengelig på interne nettverk" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port {name} ({details}) tilgjengelig på eksterne nettverk" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Port {name} ({details}) er utilgjengelig for eksterne nettverk" @@ -3299,7 +3303,7 @@ msgstr "Vellykket sletting av sertifikatet for domenet {domain}" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Klarte ikke å slette sertifikatet for domenet {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3315,14 +3319,14 @@ msgstr "" "enheter, og krever ikke telefonnumre for å virke. Brukere på en gitt Matrix-" "tjener kan snakke med brukere på alle andre samvirkende Matrix-tjenere." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3913,15 +3917,15 @@ msgstr "" msgid "Name Services" msgstr "Navnetjenester" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Alle" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Alle nettprogrammer" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Secure Shell (SSH)" @@ -8404,34 +8408,34 @@ msgstr "" msgid "Finished: {name}" msgstr "Tjeneste deaktivert: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "Pakke {expression} er ikke tilgjengelig for installasjon" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Pakke {package_name} er siste versjon ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "installering" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "laster ned" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "mediaendring" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "oppsettsfil: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8681,6 +8685,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "feil" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8903,11 +8913,11 @@ msgstr "" "All programdata og oppsett blir permanent borte. Programmet kan installeres " "på nytt igjen." -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Oppsett uendret" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "før avinstallering av {app_id}" diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index 0a4d8b9c1..b86ae1f01 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-09-05 19:53+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch web clientgebruiker van {box_name} daartoe " "toegang krijgen." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn toepassing of configureer " "een externe server." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Chatserver" @@ -2181,17 +2185,17 @@ msgstr "Firewall backend is nftables" msgid "Direct passthrough rules exist" msgstr "Er zijn directe doorgeefregels ingesteld" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Poort {name} ({details}) is beschikbaar binnen interne netwerken" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Poort {name} ({details})is beschikbaar voor externe netwerken" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Poort {name} ({details}) is niet beschikbaar voor externe netwerken" @@ -3263,7 +3267,7 @@ msgstr "Certificaat met succes verwijderd voor domein {domain}" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Verwijderen certificaat voor domein {domain} mislukt: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3280,7 +3284,7 @@ msgstr "" "Matrix server kunnen gesprekken aangaan met gebruikers op alle andere Matrix " "servers door federatie (gedecentraliseerd netwerk)." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3290,7 +3294,7 @@ msgstr "" "videogesprekken. Installeer de Coturn " "toepassing of configureer een externe server." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3866,15 +3870,15 @@ msgstr "" msgid "Name Services" msgstr "Domeindiensten" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Alle" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Alle webtoepassingen" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Secure Shell" @@ -8362,34 +8366,34 @@ msgstr "Wachten om te starten: {name}" msgid "Finished: {name}" msgstr "Klaar: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "Pakket {expression} is niet beschikbaar voor installatie" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Pakket {package_name} is de nieuwste versie ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "installeren" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "downloaden" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "media wijzigen" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "configuratiebestand: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "Time-out wachtend op pakketbeheerder" @@ -8625,6 +8629,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "fout" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8841,11 +8851,11 @@ msgstr "" "Alle toepassings-gegevens en configuratie gaan permanent verloren. de " "toepassing kan opnieuw vers worden geïnstalleerd." -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Instelling onveranderd" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "voor het verwijderen van {app_id}" diff --git a/plinth/locale/pl/LC_MESSAGES/django.po b/plinth/locale/pl/LC_MESSAGES/django.po index d6079381f..090044835 100644 --- a/plinth/locale/pl/LC_MESSAGES/django.po +++ b/plinth/locale/pl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Polish web clientklienta XMPP. Gdy włączony, ejabberd jest " "dostępny dla każdego użytkownika {box_name}." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Serwer czatu" @@ -2172,17 +2176,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port {name} ({details}) jest dostępny dla sieci wewnętrznych" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port {name} ({details}) jest dostępny dla sieci zewnętrznych" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -3170,7 +3174,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3180,14 +3184,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3707,15 +3711,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7799,34 +7803,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "plik konfiguracyjny: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8090,6 +8094,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "błąd" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8308,11 +8318,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Ustawienie bez zmian" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index a8414f978..7e642dbc7 100644 --- a/plinth/locale/pt/LC_MESSAGES/django.po +++ b/plinth/locale/pt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-05-22 15:50+0000\n" "Last-Translator: Frederico Gomes \n" "Language-Team: Portuguese web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -2097,17 +2101,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Porta {name} ({details}) disponível para redes internas" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Porta {name} ({details}) disponível para redes externas" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -3067,7 +3071,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3077,14 +3081,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3597,15 +3601,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7596,36 +7600,36 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 #, fuzzy #| msgid "Setting unchanged" msgid "media change" msgstr "Definição inalterada" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "ficheiro de configuração: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7865,6 +7869,10 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8071,11 +8079,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Definição inalterada" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index 9ea7f8aeb..bd08deed3 100644 --- a/plinth/locale/ru/LC_MESSAGES/django.po +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-10-10 18:05+0000\n" "Last-Translator: Nikita Epifanov \n" "Language-Team: Russian web client XMPP клиент. Когда включен, ejabberd доступен всем пользователям {box_name}." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn или настройте внешний сервер." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "еjabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Чат-сервер" @@ -2178,17 +2182,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Порт {name} ({details}) доступен для внутренних сетей" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Порт {name} ({details}) доступен для внешних сетей" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Порт {name} ({details}) недоступен для внешних сетей" @@ -3241,7 +3245,7 @@ msgstr "Сертификат успешно удален для домена {do msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Не удалось удалить сертификат для домена {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3258,7 +3262,7 @@ msgstr "" "одном сервере Matrix могут общаться с пользователями на всех остальных " "серверах." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3268,7 +3272,7 @@ msgstr "" "Установите приложение Coturn или настройте " "внешний сервер." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3850,15 +3854,15 @@ msgstr "" msgid "Name Services" msgstr "Службы имён" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Все" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Все веб-приложения" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Sеcure Shell" @@ -8357,34 +8361,34 @@ msgstr "" msgid "Finished: {name}" msgstr "Служба выключена: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "Пакет {expression} недоступен для установки" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Пакет {package_name} последней версией ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "Установка" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "Загрузка" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "изменение медиа" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "Файл настроек: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8638,6 +8642,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "ошибка" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8860,11 +8870,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Настройки без изменений" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/si/LC_MESSAGES/django.po b/plinth/locale/si/LC_MESSAGES/django.po index 4afb8b23c..e37cf72c7 100644 --- a/plinth/locale/si/LC_MESSAGES/django.po +++ b/plinth/locale/si/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2021-04-27 13:32+0000\n" "Last-Translator: HelaBasa \n" "Language-Team: Sinhala web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -1942,17 +1946,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2867,7 +2871,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2877,14 +2881,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3356,15 +3360,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7227,34 +7231,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7478,6 +7482,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7665,11 +7673,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/sl/LC_MESSAGES/django.po b/plinth/locale/sl/LC_MESSAGES/django.po index b6c6d003f..a60fe3d16 100644 --- a/plinth/locale/sl/LC_MESSAGES/django.po +++ b/plinth/locale/sl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Slovenian web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -2115,17 +2119,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -3066,7 +3070,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3076,14 +3080,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3567,15 +3571,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7543,34 +7547,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7808,6 +7812,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8002,11 +8010,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/sq/LC_MESSAGES/django.po b/plinth/locale/sq/LC_MESSAGES/django.po index fffb6030b..779cce022 100644 --- a/plinth/locale/sq/LC_MESSAGES/django.po +++ b/plinth/locale/sq/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-02-25 11:36+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian web client me hyrje {box_name}." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn, ose formësoni një shërbyes " "të jashtëm." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Shërbyes Fjalosjesh" @@ -2186,17 +2190,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Portë {name} ({details}) e përdorshme për rrjete të brendshëm" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Portë {name} ({details}) e përdorshme për rrjete të jashtëm" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Portë {name} ({details}) jo e përdorshme për rrjete të brendshëm" @@ -3257,7 +3261,7 @@ msgstr "Dëshmi e fshirë me sukses për përkatësinë {domain}" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "S’u arrit të fshihet dëshmi për përkatësinë {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3274,7 +3278,7 @@ msgstr "" "funksionojë. Përmes federimi, përdoruesit në një shërbyes të dhënë Matrix " "mund të bisedojnë me përdorues në krejt shërbyesit e tjerë Matrix." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3284,7 +3288,7 @@ msgstr "" "aplikacionin Coturn, ose formësoni një shërbyes " "të jashtëm." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3872,15 +3876,15 @@ msgstr "" msgid "Name Services" msgstr "Shërbime Emrash" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Krejt" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Krejt aplikacionet web" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Shell i Sigurt" @@ -8385,35 +8389,35 @@ msgstr "Po pritet të fillohet: {name}" msgid "Finished: {name}" msgstr "Përfundoi: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "Paketa {expression} s’është e gatshme për instalim" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" "Paketa {package_name} gjendet nën versionin më të ri ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "po instalohet" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "po shkarkohet" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "ndryshim media" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "kartelë formësimi: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "Mbaroi koha teksa pritej për përgjegjës paketash" @@ -8648,6 +8652,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "gabim" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8864,11 +8874,11 @@ msgstr "" "Krejt të dhënat dhe formësimi i aplikacionit do të humbin përgjithnjë. " "Aplikacioni mund të instalohet sërish nga e para." -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Rregullim i pandryshuar" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "para çinstalimit të {app_id}" diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index 8af0abbb0..f0f361490 100644 --- a/plinth/locale/sr/LC_MESSAGES/django.po +++ b/plinth/locale/sr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Serbian web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -2035,17 +2039,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2960,7 +2964,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2970,14 +2974,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3459,15 +3463,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7366,34 +7370,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7629,6 +7633,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7822,11 +7830,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index a0e8c8f71..77786f48d 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-09-08 18:24+0000\n" "Last-Translator: bittin1ddc447d824349b2 \n" "Language-Team: Swedish web client användare med en " "{box_name} inloggning." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn eller konfigurera en extern server." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabbert" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Chat-Server" @@ -2168,17 +2172,17 @@ msgstr "Firewall backend är Nftables" msgid "Direct passthrough rules exist" msgstr "Direkt genomgående regler finns" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port {name} ({details}) tillgängligt för interna nätverk" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port {name} ({details}) tillgängligt för externa nätverk" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Port {name} ({details}) är inte tillgängligt för externa nätverk" @@ -2549,9 +2553,9 @@ msgstr "" "%(box_name)s är fri programvara, licenserad under GNU Affero General Public " "License. Källkoden är tillgänglig online på %(box_name)s arkiv. Dessutom kan " -"källkoden för alla Debianpaket erhållas från webbplatsen Debian Källkod eller genom att köra \"apt " -"source paketnamn\" \" i en terminal (med Cockpit eller SSH)." +"källkoden för alla Debianpaket erhållas från webbplatsen Debian Källkod eller genom att köra \"apt source " +"paketnamn\" \" i en terminal (med Cockpit eller SSH)." #: plinth/modules/help/templates/help_about.html:82 #, python-format @@ -3236,7 +3240,7 @@ msgstr "Certifikatet framgångsrikt återkallat för domänen {domain}" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Det gick inte att ta bort certifikatet för domänen {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3253,7 +3257,7 @@ msgstr "" "fungera. Användare på en given Matrix-server kan samtala med användare på " "alla andra Matrix-servrar via federation." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3262,7 +3266,7 @@ msgstr "" "Matrix Synapse behöver en STUN/TURN-server för ljud-/videosamtal. Installera " "Coturn-appen eller konfigurera en extern server." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3830,15 +3834,15 @@ msgstr "" msgid "Name Services" msgstr "Namntjänster" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Alla" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Alla webbappar" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Secure Shell" @@ -7179,8 +7183,8 @@ msgid "" msgstr "" "Utöver webbgränssnittet kan mobila och stationära appar också användas för " "att fjärrstyra överföring på {box_name}. För att konfigurera " -"fjärrkontrollappar, använd URL:en /transmission-remote/rpc." +"fjärrkontrollappar, använd URL:en /" +"transmission-remote/rpc." #: plinth/modules/transmission/__init__.py:44 #, python-brace-format @@ -8301,34 +8305,34 @@ msgstr "Väntar på att starta: {name}" msgid "Finished: {name}" msgstr "Avslutad: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "Paket {expression} är inte tillgänglig för installation" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Paketet {package_name} är den senaste versionen ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "Installera" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "ladda ner" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "Mediabyte" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurationsfil: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "Timeout väntar på pakethanteraren" @@ -8563,6 +8567,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "Rpm:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "fel" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8781,11 +8791,11 @@ msgstr "" "All appdata och konfiguration kommer att gå förlorad permanent. Appen kan " "installeras på nytt igen." -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Instänllningar oförändrade" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "innan du avinstallerar {app_id}" diff --git a/plinth/locale/ta/LC_MESSAGES/django.po b/plinth/locale/ta/LC_MESSAGES/django.po index 8283dbb85..44ef17fb2 100644 --- a/plinth/locale/ta/LC_MESSAGES/django.po +++ b/plinth/locale/ta/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -27,7 +27,7 @@ msgstr "" msgid "Static configuration {etc_path} is setup properly" msgstr "" -#: plinth/context_processors.py:23 plinth/views.py:94 +#: plinth/context_processors.py:23 plinth/views.py:95 msgid "FreedomBox" msgstr "" @@ -102,6 +102,10 @@ msgstr "" msgid "Use the language preference set in the browser" msgstr "" +#: plinth/middleware.py:130 +msgid "System is possibly under heavy load. Please retry later." +msgstr "" + #: plinth/modules/apache/__init__.py:32 msgid "Apache HTTP Server" msgstr "" @@ -1637,13 +1641,13 @@ msgstr "" msgid "Already up-to-date" msgstr "" -#: plinth/modules/ejabberd/__init__.py:30 +#: plinth/modules/ejabberd/__init__.py:29 msgid "" "XMPP is an open and standardized communication protocol. Here you can run " "and configure your XMPP server, called ejabberd." msgstr "" -#: plinth/modules/ejabberd/__init__.py:33 +#: plinth/modules/ejabberd/__init__.py:32 #, python-brace-format msgid "" "To actually communicate, you can use the web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -1941,17 +1945,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2866,7 +2870,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2876,14 +2880,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3355,15 +3359,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7226,34 +7230,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7477,6 +7481,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7664,11 +7672,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index 5653de1b1..b42310c58 100644 --- a/plinth/locale/te/LC_MESSAGES/django.po +++ b/plinth/locale/te/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-03-02 12:27+0000\n" "Last-Translator: James Valleroy \n" "Language-Team: Telugu web client. ప్రారంభించబడినప్పుడు, ejabberdని ఏ " "వినియోగదారు అయినా {box_name} లాగిన్‌తో యాక్సెస్ చేయవచ్చు." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, fuzzy, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3159,7 +3163,7 @@ msgstr "" "అందిస్తుంది మరియు పని చేయడానికి ఫోన్ నంబర్‌లు అవసరం లేదు. ఇచ్చిన మ్యాట్రిక్స్ సర్వర్‌లోని వినియోగదారులు " "ఫెడరేషన్ ద్వారా అన్ని ఇతర మ్యాట్రిక్స్ సర్వర్‌లలోని వినియోగదారులతో సంభాషించవచ్చు." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3168,7 +3172,7 @@ msgstr "" "Matrix Synapseకి ఆడియో/వీడియో కాల్‌ల కోసం STUN/TURN సర్వర్ అవసరం.Coturn యాప్‌ను ఇన్‌స్టాల్ చేయండి లేదా బాహ్య సర్వర్‌ను కాన్ఫిగర్ చేయండి." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "మ్యాట్రిక్స్ సినాప్స్" @@ -3742,15 +3746,15 @@ msgstr "" msgid "Name Services" msgstr "పేరు సేవలు" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "అన్నీ" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "అన్నీ వెబ్ యాప్‌లు" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "సెక్యూర్ షెల్" @@ -8085,34 +8089,34 @@ msgstr "" msgid "Finished: {name}" msgstr "సేవ నిలిపివేయబడింది: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "ప్యాకేజీ {package_name} తాజా వెర్షన్ ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "వ్యవస్థాపిస్తోంది" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "దిగుమతి అవుతోంది" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "ప్రసార మాధ్యమం మార్పు" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "ఆకృతీకరణ ఫైలు: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -8364,6 +8368,12 @@ msgstr "హోమ్ బ్రూ:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "లోపం" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8581,11 +8591,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "మారకుండా అమర్చుతోంది" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index a2b41b3aa..fc35db05b 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-08-31 19:50+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish web client{box_name} oturum " "açma adı ile herhangi bir kullanıcı tarafından erişilebilir." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn uygulamasını yükleyin veya harici " "bir sunucu yapılandırın." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Sohbet Sunucusu" @@ -2168,17 +2172,17 @@ msgstr "Güvenlik duvarı arka ucu nftables’dır" msgid "Direct passthrough rules exist" msgstr "Doğrudan geçiş kuralları mevcut" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Dahili ağlar için {name} ({details}) bağlantı noktası kullanılabilir" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Harici ağlar için {name} ({details}) bağlantı noktası kullanılabilir" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Harici ağlar için {name} ({details}) bağlantı noktası kullanılamaz" @@ -3239,7 +3243,7 @@ msgstr "{domain} etki alanı için sertifika başarılı olarak silindi" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "{domain} etki alanı için sertifika silme başarısız oldu: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3256,7 +3260,7 @@ msgstr "" "kullanıcılar, federasyon aracılığıyla diğer tüm Matrix sunucularındaki " "kullanıcılarla sohbet edebilir." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3266,7 +3270,7 @@ msgstr "" "ihtiyaç duyar. Coturn uygulamasını yükleyin veya " "harici bir sunucu yapılandırın." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3840,15 +3844,15 @@ msgstr "" msgid "Name Services" msgstr "Ad Hizmetleri" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Tümü" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Tüm web uygulamaları" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Güvenli Kabuk" @@ -8318,34 +8322,34 @@ msgstr "Başlamak için bekleniyor: {name}" msgid "Finished: {name}" msgstr "Tamamlandı: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "{expression} paketi yükleme için mevcut değil" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "{package_name} paketi en son sürümdür ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "yükleniyor" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "indiriliyor" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "ortam değiştirme" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "yapılandırma dosyası: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "Paket yöneticisini beklerken zaman aşımı oldu" @@ -8581,6 +8585,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "hata" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8796,11 +8806,11 @@ msgstr "" "Tüm uygulama verileri ve yapılandırması kalıcı olarak kaybolacaktır. " "Uygulama tekrar yeni olarak yüklenebilir." -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Ayar değişmedi" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "{app_id} kaldırılmadan önce" diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index 689101eec..a5391627b 100644 --- a/plinth/locale/uk/LC_MESSAGES/django.po +++ b/plinth/locale/uk/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2023-08-31 19:50+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian web clientбудь-який користувач із логіном " "{box_name}." -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn або налаштуйте зовнішній " "сервер." -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "Сервер чату" @@ -2176,17 +2180,17 @@ msgstr "Серверна частина брандмауера - nftables" msgid "Direct passthrough rules exist" msgstr "Існують правила прямого переходу" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Порт {name} ({details}) доступний для внутрішніх мереж" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Порт {name} ({details}) доступний для зовнішніх мереж" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Порт {name} ({details}) недоступний для зовнішніх мереж" @@ -3246,7 +3250,7 @@ msgstr "Сертифікат успішно видалено для домену msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "Не вдалося видалити сертифікат для домену {domain}: {error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3263,7 +3267,7 @@ msgstr "" "можуть спілкуватися з користувачами на інших серверах Matrix через " "федеративність." -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " @@ -3273,7 +3277,7 @@ msgstr "" "Встановіть програму Coturn або налаштуйте " "зовнішній сервер." -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3845,15 +3849,15 @@ msgstr "" msgid "Name Services" msgstr "Назва сервісів" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "Усі" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "Усі вебзастосунки" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "Захищена оболонка" @@ -8310,34 +8314,34 @@ msgstr "Очікування запуску: {name}" msgid "Finished: {name}" msgstr "Завершено: {name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "Пакунок {expression} недоступний для встановлення" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Пакунок {package_name} має останню версію ({latest_version})" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "встановлення" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "завантаження" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "зміна медія" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "файл конфіґурації: {file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "Час очікування менеджера пакунків" @@ -8572,6 +8576,12 @@ msgstr "Homebrew:" msgid "RPM:" msgstr "RPM:" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "помилка" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -8788,11 +8798,11 @@ msgstr "" "Усі дані програми та налаштування буде втрачено назавжди. Застосунок можна " "встановити начисто ще раз." -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "Налаштування не змінено" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "перед видаленням {app_id}" diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po index 91984b89a..7a5913eb7 100644 --- a/plinth/locale/vi/LC_MESSAGES/django.po +++ b/plinth/locale/vi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2021-07-28 08:34+0000\n" "Last-Translator: bruh \n" "Language-Team: Vietnamese web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -2166,17 +2170,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -3091,7 +3095,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3101,14 +3105,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3596,15 +3600,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7489,34 +7493,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7752,6 +7756,12 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "lỗi" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7946,11 +7956,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index 8d06d923e..3fb6e54eb 100644 --- a/plinth/locale/zh_Hans/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hans/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2022-12-07 20:48+0000\n" "Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) web client。启用后,任何有 {box_name} 登录的用户均可访" "问 ejabberd。" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn应用程序或配置一个外部服务器。" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "ejabberd" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "聊天服务器" @@ -2054,17 +2058,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "内网端口 {name}({details})可用" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "外网端口 {name}({details})可用" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -3022,7 +3026,7 @@ msgstr "成功删除域名 {domain} 的证书" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "删除 {domain} 域名证书失败:{error}" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -3032,14 +3036,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "Matrix Synapse" @@ -3528,15 +3532,15 @@ msgstr "" msgid "Name Services" msgstr "名称服务" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "安全 Shell" @@ -7518,34 +7522,34 @@ msgstr "" msgid "Finished: {name}" msgstr "已完成:{name}" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "安装" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "下载中" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "媒体改变" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "配置文件:{file}" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7776,6 +7780,12 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +#, fuzzy +#| msgid "error" +msgid "Error" +msgstr "错误" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7974,11 +7984,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "设置未改变" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index 9008c64ea..18c7af255 100644 --- a/plinth/locale/zh_Hant/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 20:05-0400\n" +"POT-Creation-Date: 2023-09-25 20:14-0400\n" "PO-Revision-Date: 2021-12-23 12:50+0000\n" "Last-Translator: pesder \n" "Language-Team: Chinese (Traditional) web client user with a {box_name} login." msgstr "" -#: plinth/modules/ejabberd/__init__.py:41 +#: plinth/modules/ejabberd/__init__.py:40 #, python-brace-format msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/ejabberd/__init__.py:61 msgid "ejabberd" msgstr "" -#: plinth/modules/ejabberd/__init__.py:63 -#: plinth/modules/matrixsynapse/__init__.py:57 +#: plinth/modules/ejabberd/__init__.py:62 +#: plinth/modules/matrixsynapse/__init__.py:56 msgid "Chat Server" msgstr "" @@ -2045,17 +2049,17 @@ msgstr "" msgid "Direct passthrough rules exist" msgstr "" -#: plinth/modules/firewall/components.py:134 +#: plinth/modules/firewall/components.py:135 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:142 +#: plinth/modules/firewall/components.py:143 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:147 +#: plinth/modules/firewall/components.py:148 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2970,7 +2974,7 @@ msgstr "" msgid "Failed to delete certificate for domain {domain}: {error}" msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:27 +#: plinth/modules/matrixsynapse/__init__.py:26 msgid "" "Matrix is an new " "ecosystem for open, federated instant messaging and VoIP. Synapse is a " @@ -2980,14 +2984,14 @@ msgid "" "converse with users on all other Matrix servers via federation." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:35 +#: plinth/modules/matrixsynapse/__init__.py:34 #, python-brace-format msgid "" "Matrix Synapse needs a STUN/TURN server for audio/video calls. Install the " "Coturn app or configure an external server." msgstr "" -#: plinth/modules/matrixsynapse/__init__.py:56 +#: plinth/modules/matrixsynapse/__init__.py:55 msgid "Matrix Synapse" msgstr "" @@ -3471,15 +3475,15 @@ msgstr "" msgid "Name Services" msgstr "" -#: plinth/modules/names/components.py:12 +#: plinth/modules/names/components.py:14 msgid "All" msgstr "" -#: plinth/modules/names/components.py:16 plinth/modules/names/components.py:20 +#: plinth/modules/names/components.py:18 plinth/modules/names/components.py:22 msgid "All web apps" msgstr "" -#: plinth/modules/names/components.py:24 +#: plinth/modules/names/components.py:26 msgid "Secure Shell" msgstr "" @@ -7361,34 +7365,34 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: plinth/package.py:212 +#: plinth/package.py:211 #, python-brace-format msgid "Package {expression} is not available for install" msgstr "" -#: plinth/package.py:225 +#: plinth/package.py:224 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: plinth/package.py:373 +#: plinth/package.py:372 msgid "installing" msgstr "" -#: plinth/package.py:375 +#: plinth/package.py:374 msgid "downloading" msgstr "" -#: plinth/package.py:377 +#: plinth/package.py:376 msgid "media change" msgstr "" -#: plinth/package.py:379 +#: plinth/package.py:378 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: plinth/package.py:407 plinth/package.py:432 +#: plinth/package.py:406 plinth/package.py:431 msgid "Timeout waiting for package manager" msgstr "" @@ -7624,6 +7628,10 @@ msgstr "" msgid "RPM:" msgstr "" +#: plinth/templates/error.html:10 +msgid "Error" +msgstr "" + #: plinth/templates/first_setup.html:18 #, python-format msgid "" @@ -7817,11 +7825,11 @@ msgid "" "installed freshly again." msgstr "" -#: plinth/views.py:241 +#: plinth/views.py:242 msgid "Setting unchanged" msgstr "" -#: plinth/views.py:478 +#: plinth/views.py:479 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" diff --git a/plinth/menu.py b/plinth/menu.py index 114ff9a64..fb1a561fa 100644 --- a/plinth/menu.py +++ b/plinth/menu.py @@ -1,5 +1,7 @@ # SPDX-License-Identifier: AGPL-3.0-or-later +from typing import ClassVar + from django.urls import reverse_lazy from plinth import app @@ -8,7 +10,7 @@ from plinth import app class Menu(app.FollowerComponent): """Component to manage a single menu item.""" - _all_menus = set() + _all_menus: ClassVar[set['Menu']] = set() def __init__(self, component_id, name=None, short_description=None, icon=None, url_name=None, url_args=None, url_kwargs=None, diff --git a/plinth/middleware.py b/plinth/middleware.py index 0dec396ba..5a34798b8 100644 --- a/plinth/middleware.py +++ b/plinth/middleware.py @@ -10,8 +10,11 @@ from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied +from django.db.utils import OperationalError from django.shortcuts import render +from django.template.response import SimpleTemplateResponse from django.utils.deprecation import MiddlewareMixin +from django.utils.translation import gettext as _ from stronghold.utils import is_view_func_public from plinth import app as app_module @@ -114,3 +117,19 @@ class FirstSetupMiddleware(MiddlewareMixin): 'refresh_page_sec': 3 } return render(request, 'first_setup.html', context) + + +class CommonErrorMiddleware(MiddlewareMixin): + """Django middleware to handle common errors.""" + + @staticmethod + def process_exception(request, exception): + """Show a custom error page when OperationalError is raised.""" + if isinstance(exception, OperationalError): + message = _( + 'System is possibly under heavy load. Please retry later.') + return SimpleTemplateResponse('error.html', + context={'message': message}, + status=503) + + return None diff --git a/plinth/migrations/0001_initial.py b/plinth/migrations/0001_initial.py index 88ad4c7b1..e5d1d01ca 100644 --- a/plinth/migrations/0001_initial.py +++ b/plinth/migrations/0001_initial.py @@ -17,7 +17,7 @@ class Migration(migrations.Migration): initial = True - dependencies = [] + dependencies: list = [] operations = [ migrations.CreateModel( diff --git a/plinth/module_loader.py b/plinth/module_loader.py index 4e4992851..cc2a561dd 100644 --- a/plinth/module_loader.py +++ b/plinth/module_loader.py @@ -8,7 +8,6 @@ import importlib import logging import pathlib import re -from typing import Optional import django @@ -142,8 +141,7 @@ def get_module_import_path(module_name: str) -> str: return import_path -def _read_module_import_paths_from_file( - file_path: pathlib.Path) -> Optional[str]: +def _read_module_import_paths_from_file(file_path: pathlib.Path) -> str | None: """Read a module's import path from a file.""" with file_path.open() as file_handle: for line in file_handle: diff --git a/plinth/modules/apache/urls.py b/plinth/modules/apache/urls.py index e018e02b8..5bf690c8c 100644 --- a/plinth/modules/apache/urls.py +++ b/plinth/modules/apache/urls.py @@ -3,4 +3,4 @@ URLs for the Apache module. """ -urlpatterns = [] +urlpatterns: list = [] diff --git a/plinth/modules/avahi/manifest.py b/plinth/modules/avahi/manifest.py index 1a87951f7..71716c490 100644 --- a/plinth/modules/avahi/manifest.py +++ b/plinth/modules/avahi/manifest.py @@ -7,4 +7,4 @@ Application manifest for avahi. # /etc/avahi/services. Currently, we don't intend to make that customizable. # There is no necessity for backup and restore. This manifest will ensure that # avahi enable/disable setting is preserved. -backup = {} +backup: dict = {} diff --git a/plinth/modules/backups/manifest.py b/plinth/modules/backups/manifest.py index f78adbd55..6d15b059b 100644 --- a/plinth/modules/backups/manifest.py +++ b/plinth/modules/backups/manifest.py @@ -6,4 +6,4 @@ Application manifest for backups. # Currently, backup application does not have any settings. However, settings # such as scheduler settings, backup location, secrets to connect to remove # servers need to be backed up. -backup = {} +backup: dict = {} diff --git a/plinth/modules/backups/privileged.py b/plinth/modules/backups/privileged.py index 429eedc75..3ebc65178 100644 --- a/plinth/modules/backups/privileged.py +++ b/plinth/modules/backups/privileged.py @@ -7,7 +7,6 @@ import pathlib import re import subprocess import tarfile -from typing import Optional, Union from plinth.actions import privileged from plinth.utils import Version @@ -22,8 +21,8 @@ class AlreadyMountedError(Exception): @privileged -def mount(mountpoint: str, remote_path: str, ssh_keyfile: Optional[str] = None, - password: Optional[str] = None, +def mount(mountpoint: str, remote_path: str, ssh_keyfile: str | None = None, + password: str | None = None, user_known_hosts_file: str = '/dev/null'): """Mount a remote ssh path via sshfs.""" try: @@ -31,7 +30,7 @@ def mount(mountpoint: str, remote_path: str, ssh_keyfile: Optional[str] = None, except AlreadyMountedError: return - kwargs = {} + input_ = None # the shell would expand ~/ to the local home directory remote_path = remote_path.replace('~/', '').replace('~', '') # 'reconnect', 'ServerAliveInternal' and 'ServerAliveCountMax' allow the @@ -55,9 +54,9 @@ def mount(mountpoint: str, remote_path: str, ssh_keyfile: Optional[str] = None, if not password: raise ValueError('mount requires either a password or ssh_keyfile') cmd += ['-o', 'password_stdin'] - kwargs['input'] = password.encode() + input_ = password.encode() - subprocess.run(cmd, check=True, timeout=TIMEOUT, **kwargs) + subprocess.run(cmd, check=True, timeout=TIMEOUT, input=input_) @privileged @@ -110,7 +109,7 @@ def setup(path: str): def _init_repository(path: str, encryption: str, - encryption_passphrase: Optional[str] = None): + encryption_passphrase: str | None = None): """Initialize a local or remote borg repository.""" if encryption != 'none': if not encryption_passphrase: @@ -121,14 +120,13 @@ def _init_repository(path: str, encryption: str, @privileged -def init(path: str, encryption: str, - encryption_passphrase: Optional[str] = None): +def init(path: str, encryption: str, encryption_passphrase: str | None = None): """Initialize the borg repository.""" _init_repository(path, encryption, encryption_passphrase) @privileged -def info(path: str, encryption_passphrase: Optional[str] = None) -> dict: +def info(path: str, encryption_passphrase: str | None = None) -> dict: """Show repository information.""" process = _run(['borg', 'info', '--json', path], encryption_passphrase, stdout=subprocess.PIPE) @@ -136,7 +134,7 @@ def info(path: str, encryption_passphrase: Optional[str] = None) -> dict: @privileged -def list_repo(path: str, encryption_passphrase: Optional[str] = None) -> dict: +def list_repo(path: str, encryption_passphrase: str | None = None) -> dict: """List repository contents.""" process = _run(['borg', 'list', '--json', '--format="{comment}"', path], encryption_passphrase, stdout=subprocess.PIPE) @@ -150,8 +148,8 @@ def _get_borg_version(): @privileged -def create_archive(path: str, paths: list[str], comment: Optional[str] = None, - encryption_passphrase: Optional[str] = None): +def create_archive(path: str, paths: list[str], comment: str | None = None, + encryption_passphrase: str | None = None): """Create archive.""" existing_paths = filter(os.path.exists, paths) command = ['borg', 'create', '--json'] @@ -169,7 +167,7 @@ def create_archive(path: str, paths: list[str], comment: Optional[str] = None, @privileged -def delete_archive(path: str, encryption_passphrase: Optional[str] = None): +def delete_archive(path: str, encryption_passphrase: str | None = None): """Delete archive.""" _run(['borg', 'delete', path], encryption_passphrase) @@ -199,7 +197,7 @@ def _extract(archive_path, destination, encryption_passphrase, locations=None): @privileged -def export_tar(path: str, encryption_passphrase: Optional[str] = None): +def export_tar(path: str, encryption_passphrase: str | None = None): """Export archive contents as tar stream on stdout.""" _run(['borg', 'export-tar', path, '-', '--tar-filter=gzip'], encryption_passphrase) @@ -214,7 +212,7 @@ def _read_archive_file(archive, filepath, encryption_passphrase): @privileged def get_archive_apps(path: str, - encryption_passphrase: Optional[str] = None) -> list[str]: + encryption_passphrase: str | None = None) -> list[str]: """Get list of apps included in archive.""" manifest_folder = os.path.relpath(MANIFESTS_FOLDER, '/') borg_call = [ @@ -266,7 +264,12 @@ def get_exported_archive_apps(path: str) -> list[str]: for name in filenames: if 'var/lib/plinth/backups-manifests/' in name \ and name.endswith('.json'): - manifest_data = tar_handle.extractfile(name).read() + file_handle = tar_handle.extractfile(name) + if not file_handle: + raise RuntimeError( + 'Unable to extract app manifest from backup file.') + + manifest_data = file_handle.read() manifest = json.loads(manifest_data) break @@ -281,7 +284,7 @@ def get_exported_archive_apps(path: str) -> list[str]: @privileged def restore_archive(archive_path: str, destination: str, directories: list[str], files: list[str], - encryption_passphrase: Optional[str] = None): + encryption_passphrase: str | None = None): """Restore files from an archive.""" locations_all = directories + files locations_all = [ @@ -314,8 +317,7 @@ def _assert_app_id(app_id): @privileged -def dump_settings(app_id: str, settings: dict[str, Union[int, float, bool, - str]]): +def dump_settings(app_id: str, settings: dict[str, int | float | bool | str]): """Dump an app's settings to a JSON file.""" _assert_app_id(app_id) BACKUPS_DATA_PATH.mkdir(exist_ok=True) @@ -324,7 +326,7 @@ def dump_settings(app_id: str, settings: dict[str, Union[int, float, bool, @privileged -def load_settings(app_id: str) -> dict[str, Union[int, float, bool, str]]: +def load_settings(app_id: str) -> dict[str, int | float | bool | str]: """Load an app's settings from a JSON file.""" _assert_app_id(app_id) settings_path = BACKUPS_DATA_PATH / f'{app_id}-settings.json' @@ -334,7 +336,7 @@ def load_settings(app_id: str) -> dict[str, Union[int, float, bool, str]]: return {} -def _get_env(encryption_passphrase: Optional[str] = None): +def _get_env(encryption_passphrase: str | None = None): """Create encryption and ssh kwargs out of given arguments.""" env = dict(os.environ, BORG_RELOCATED_REPO_ACCESS_IS_OK='yes', LANG='C.UTF-8') diff --git a/plinth/modules/backups/repository.py b/plinth/modules/backups/repository.py index 9fc7101f3..026d8f5f7 100644 --- a/plinth/modules/backups/repository.py +++ b/plinth/modules/backups/repository.py @@ -72,9 +72,9 @@ KNOWN_ERRORS = [ class BaseBorgRepository(abc.ABC): """Base class for all kinds of Borg repositories.""" - flags = {} + flags: dict[str, bool] = {} is_mounted = True - known_credentials = [] + known_credentials: list[str] = [] def __init__(self, path, credentials=None, uuid=None, schedule=None, **kwargs): diff --git a/plinth/modules/bepasty/privileged.py b/plinth/modules/bepasty/privileged.py index d0e37bcb8..c9ddd7b63 100644 --- a/plinth/modules/bepasty/privileged.py +++ b/plinth/modules/bepasty/privileged.py @@ -11,7 +11,6 @@ import secrets import shutil import string import subprocess -from typing import Optional import augeas @@ -124,7 +123,7 @@ def get_configuration() -> dict[str, object]: @privileged -def add_password(permissions: list[str], comment: Optional[str] = None): +def add_password(permissions: list[str], comment: str | None = None): """Generate a password with given permissions.""" conf = conf_file_read() permissions = _format_permissions(permissions) diff --git a/plinth/modules/cockpit/manifest.py b/plinth/modules/cockpit/manifest.py index f7bcbeec6..427a0167f 100644 --- a/plinth/modules/cockpit/manifest.py +++ b/plinth/modules/cockpit/manifest.py @@ -17,4 +17,4 @@ clients = [{ # triggered on every Plinth domain change (and cockpit application install) and # will set the value of allowed domains correctly. This is the only key the is # customized in cockpit.conf. -backup = {} +backup: dict = {} diff --git a/plinth/modules/config/privileged.py b/plinth/modules/config/privileged.py index ad5b7f58d..953b8d639 100644 --- a/plinth/modules/config/privileged.py +++ b/plinth/modules/config/privileged.py @@ -4,7 +4,6 @@ import os import pathlib import subprocess -from typing import Optional import augeas @@ -29,7 +28,7 @@ def set_hostname(hostname: str): @privileged -def set_domainname(domainname: Optional[str] = None): +def set_domainname(domainname: str | None = None): """Set system domainname in /etc/hosts.""" hostname = subprocess.check_output(['hostname']).decode().strip() hosts_path = pathlib.Path('/etc/hosts') diff --git a/plinth/modules/coturn/components.py b/plinth/modules/coturn/components.py index 8489a8a63..1e8a83fba 100644 --- a/plinth/modules/coturn/components.py +++ b/plinth/modules/coturn/components.py @@ -2,8 +2,6 @@ """App component for other apps to manage their STUN/TURN server configuration. """ -from __future__ import annotations # Can be removed in Python 3.10 - import base64 import hashlib import hmac @@ -11,6 +9,7 @@ import json import re from dataclasses import dataclass, field from time import time +from typing import ClassVar, Iterable from plinth import app @@ -36,9 +35,9 @@ class TurnConfiguration: that must be used by a STUN/TURN client after advice from the server. """ - domain: str = None + domain: str | None = None uris: list[str] = field(default_factory=list) - shared_secret: str = None + shared_secret: str | None = None def __post_init__(self): """Generate URIs after object initialization if necessary.""" @@ -76,8 +75,8 @@ class UserTurnConfiguration(TurnConfiguration): time. """ - username: str = None - credential: str = None + username: str | None = None + credential: str | None = None def to_json(self) -> str: """Return a JSON representation of the configuration.""" @@ -102,7 +101,7 @@ class TurnConsumer(app.FollowerComponent): """ - _all = {} + _all: ClassVar[dict[str, 'TurnConsumer']] = {} def __init__(self, component_id): """Initialize the component. @@ -115,7 +114,7 @@ class TurnConsumer(app.FollowerComponent): self._all[component_id] = self @classmethod - def list(cls) -> list[TurnConsumer]: # noqa + def list(cls) -> Iterable['TurnConsumer']: """Return a list of all Coturn components.""" return cls._all.values() diff --git a/plinth/modules/diagnostics/manifest.py b/plinth/modules/diagnostics/manifest.py index 5b39e5f2d..a6577788c 100644 --- a/plinth/modules/diagnostics/manifest.py +++ b/plinth/modules/diagnostics/manifest.py @@ -3,4 +3,4 @@ Application manifest for diagnostics. """ -backup = {} +backup: dict = {} diff --git a/plinth/modules/dynamicdns/privileged.py b/plinth/modules/dynamicdns/privileged.py index 79d618a33..f5e8c090f 100644 --- a/plinth/modules/dynamicdns/privileged.py +++ b/plinth/modules/dynamicdns/privileged.py @@ -3,6 +3,7 @@ import pathlib import urllib +from typing import Any from plinth.actions import privileged @@ -30,7 +31,7 @@ def _read_configuration(path, separator='='): @privileged -def export_config() -> dict[str, object]: +def export_config() -> dict[str, bool | dict[str, dict[str, str | None]]]: """Return the old ez-ipupdate configuration in JSON format.""" input_config = {} if _active_config.exists(): @@ -68,12 +69,12 @@ def export_config() -> dict[str, object]: update_url = domain['update_url'] try: server = urllib.parse.urlparse(update_url).netloc - service_types = { + service_types: dict[str, str] = { 'dynupdate.noip.com': 'noip.com', 'dynupdate.no-ip.com': 'noip.com', 'freedns.afraid.org': 'freedns.afraid.org' } - domain['service_type'] = service_types.get(server, 'other') + domain['service_type'] = service_types.get(str(server), 'other') except ValueError: pass @@ -86,7 +87,7 @@ def export_config() -> dict[str, object]: and _active_config.exists()): enabled = True - output_config = {'enabled': enabled, 'domains': {}} + output_config: dict[str, Any] = {'enabled': enabled, 'domains': {}} if domain['domain']: output_config['domains'][domain['domain']] = domain diff --git a/plinth/modules/ejabberd/__init__.py b/plinth/modules/ejabberd/__init__.py index 0dbb12e54..3ee7771b0 100644 --- a/plinth/modules/ejabberd/__init__.py +++ b/plinth/modules/ejabberd/__init__.py @@ -3,7 +3,6 @@ import json import logging -from typing import Tuple from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ @@ -226,7 +225,7 @@ def update_turn_configuration(config: TurnConfiguration, managed=True, privileged.configure_turn(json.loads(config.to_json()), managed) -def get_turn_configuration() -> Tuple[TurnConfiguration, bool]: +def get_turn_configuration() -> tuple[TurnConfiguration, bool]: """Get the latest STUN/TURN configuration.""" tc, managed = privileged.get_turn_config() return TurnConfiguration(tc['domain'], tc['uris'], diff --git a/plinth/modules/ejabberd/privileged.py b/plinth/modules/ejabberd/privileged.py index 118ad299e..7dd6e6498 100644 --- a/plinth/modules/ejabberd/privileged.py +++ b/plinth/modules/ejabberd/privileged.py @@ -8,7 +8,7 @@ import shutil import socket import subprocess from pathlib import Path -from typing import Any, Optional, Tuple +from typing import Any from ruamel.yaml import YAML, scalarstring @@ -28,7 +28,7 @@ MOD_IRC_DEPRECATED_VERSION = Version('18.06') yaml = YAML() yaml.allow_duplicate_keys = True -yaml.preserve_quotes = True +yaml.preserve_quotes = True # type: ignore [assignment] TURN_URI_REGEX = r'(stun|turn):(.*):([0-9]{4})\?transport=(tcp|udp)' @@ -240,7 +240,7 @@ def set_domains(domains: list[str]): @privileged -def mam(command: str) -> Optional[bool]: +def mam(command: str) -> bool | None: """Enable, disable, or get status of Message Archive Management (MAM).""" if command not in ('enable', 'disable', 'status'): raise ValueError('Invalid command') @@ -286,7 +286,11 @@ def mam(command: str) -> Optional[bool]: def _generate_service(uri: str) -> dict: """Generate ejabberd mod_stun_disco service config from Coturn URI.""" pattern = re.compile(TURN_URI_REGEX) - typ, domain, port, transport = pattern.match(uri).groups() + match = pattern.match(uri) + if not match: + raise ValueError('URL does not match TURN URI') + + typ, domain, port, transport = match.groups() return { "host": domain, "port": int(port), @@ -304,7 +308,7 @@ def _generate_uris(services: list[dict]) -> list[str]: @privileged -def get_turn_config() -> Tuple[dict[str, Any], bool]: +def get_turn_config() -> tuple[dict[str, Any], bool]: """Get the latest STUN/TURN configuration in JSON format.""" with open(EJABBERD_CONFIG, 'r', encoding='utf-8') as file_handle: conf = yaml.load(file_handle) diff --git a/plinth/modules/email/dns.py b/plinth/modules/email/dns.py index fecd051b7..2540fc8f9 100644 --- a/plinth/modules/email/dns.py +++ b/plinth/modules/email/dns.py @@ -10,7 +10,6 @@ See: https://rspamd.com/doc/modules/dkim_signing.html """ from dataclasses import dataclass -from typing import Union @dataclass @@ -19,12 +18,12 @@ class Entry: # pylint: disable=too-many-instance-attributes type_: str value: str - domain: Union[str, None] = None + domain: str | None = None class_: str = 'IN' ttl: int = 60 priority: int = 10 - weight: Union[int, None] = None - port: Union[int, None] = None + weight: int | None = None + port: int | None = None def get_split_value(self): """If the record is TXT and value > 255, split it.""" diff --git a/plinth/modules/email/postfix.py b/plinth/modules/email/postfix.py index a23c3153a..1a04731cb 100644 --- a/plinth/modules/email/postfix.py +++ b/plinth/modules/email/postfix.py @@ -23,7 +23,7 @@ class Service: # NOQA, pylint: disable=too-many-instance-attributes wakeup: str maxproc: str command: str - options: str + options: dict[str, str] def __str__(self) -> str: parts = [ @@ -49,7 +49,8 @@ def get_config(keys: list) -> dict: output = _run(args) result = {} - for line in filter(None, output.split('\n')): + lines: list[str] = list(filter(None, output.split('\n'))) + for line in lines: key, sep, value = line.partition('=') if not sep: raise ValueError('Invalid output detected') diff --git a/plinth/modules/email/privileged/postfix.py b/plinth/modules/email/privileged/postfix.py index be479c440..dde893141 100644 --- a/plinth/modules/email/privileged/postfix.py +++ b/plinth/modules/email/privileged/postfix.py @@ -32,7 +32,7 @@ default_config = { ]) } -submission_options = { +submission_options: dict[str, str] = { 'syslog_name': 'postfix/submission', 'smtpd_tls_security_level': 'encrypt', 'smtpd_client_restrictions': 'permit_sasl_authenticated,reject', @@ -43,7 +43,7 @@ submission_service = postconf.Service(service='submission', type_='inet', wakeup='-', maxproc='-', command='smtpd', options=submission_options) -smtps_options = { +smtps_options: dict[str, str] = { 'syslog_name': 'postfix/smtps', 'smtpd_tls_wrappermode': 'yes', 'smtpd_sasl_auth_enable': 'yes', diff --git a/plinth/modules/firewall/__init__.py b/plinth/modules/firewall/__init__.py index a4c2161ee..f390aa369 100644 --- a/plinth/modules/firewall/__init__.py +++ b/plinth/modules/firewall/__init__.py @@ -27,7 +27,7 @@ _description = [ 'security threat from the Internet.'), box_name=cfg.box_name) ] -_port_details = {} +_port_details: dict[str, list[str]] = {} logger = logging.getLogger(__name__) diff --git a/plinth/modules/firewall/components.py b/plinth/modules/firewall/components.py index 2bac48bd6..b3e266d97 100644 --- a/plinth/modules/firewall/components.py +++ b/plinth/modules/firewall/components.py @@ -5,6 +5,7 @@ App component for other apps to use firewall functionality. import logging import re +from typing import ClassVar from django.utils.text import format_lazy from django.utils.translation import gettext_lazy as _ @@ -18,7 +19,7 @@ logger = logging.getLogger(__name__) class Firewall(app.FollowerComponent): """Component to open/close firewall ports for an app.""" - _all_firewall_components = {} + _all_firewall_components: ClassVar[dict[str, 'Firewall']] = {} def __init__(self, component_id, name=None, ports=None, is_external=False): """Initialize the firewall component.""" diff --git a/plinth/modules/firewall/manifest.py b/plinth/modules/firewall/manifest.py index f8bd7bbfc..e666aa9bd 100644 --- a/plinth/modules/firewall/manifest.py +++ b/plinth/modules/firewall/manifest.py @@ -3,4 +3,4 @@ Application manifest for firewall. """ -backup = {} +backup: dict = {} diff --git a/plinth/modules/gitweb/privileged.py b/plinth/modules/gitweb/privileged.py index bcd2dc5ce..2248ec776 100644 --- a/plinth/modules/gitweb/privileged.py +++ b/plinth/modules/gitweb/privileged.py @@ -9,7 +9,7 @@ import re import shutil import subprocess import time -from typing import Any, Optional +from typing import Any from plinth import action_utils from plinth.actions import privileged @@ -347,7 +347,7 @@ def repo_info(name: str) -> dict[str, str]: @privileged -def create_repo(url: Optional[str] = None, name: Optional[str] = None, +def create_repo(url: str | None = None, name: str | None = None, description: str = '', owner: str = '', keep_ownership: bool = False, is_private: bool = False, skip_prepare: bool = False, prepare_only: bool = False): diff --git a/plinth/modules/i2p/privileged.py b/plinth/modules/i2p/privileged.py index bd3c50395..9220bd698 100644 --- a/plinth/modules/i2p/privileged.py +++ b/plinth/modules/i2p/privileged.py @@ -1,8 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later """Configure I2P.""" -from typing import Optional - from plinth.actions import privileged from plinth.modules.i2p.helpers import RouterEditor, TunnelEditor @@ -19,8 +17,8 @@ def set_tunnel_property(name: str, property_: str, value: str): @privileged -def add_favorite(name: str, url: str, description: Optional[str], - icon: Optional[str]): +def add_favorite(name: str, url: str, description: str | None, + icon: str | None): """Add a favorite to router.config.""" editor = RouterEditor() editor.read_conf().add_favorite(name, url, description, icon).write_conf() diff --git a/plinth/modules/ikiwiki/data/usr/share/freedombox/etc/ikiwiki/plinth-blog.setup b/plinth/modules/ikiwiki/data/usr/share/freedombox/etc/ikiwiki/plinth-blog.setup index 3db2ccc59..e0926c947 100644 --- a/plinth/modules/ikiwiki/data/usr/share/freedombox/etc/ikiwiki/plinth-blog.setup +++ b/plinth/modules/ikiwiki/data/usr/share/freedombox/etc/ikiwiki/plinth-blog.setup @@ -25,7 +25,7 @@ IkiWiki::Setup::Automator->import( cgiurl => "/ikiwiki/$wikiname_short/ikiwiki.cgi", cgiauthurl => "/ikiwiki-auth/$wikiname_short/ikiwiki.cgi", cgi_wrapper => "/var/www/ikiwiki/$wikiname_short/ikiwiki.cgi", - add_plugins => [qw{goodstuff websetup comments calendar sidebar trail httpauth lockedit opendiscussion moderatedcomments userlist remove attachment}], + add_plugins => [qw{goodstuff websetup comments calendar sidebar trail httpauth lockedit moderatedcomments userlist remove attachment}], rss => 1, atom => 1, syslog => 1, diff --git a/plinth/modules/ikiwiki/privileged.py b/plinth/modules/ikiwiki/privileged.py index ffd711889..5f6c6357f 100644 --- a/plinth/modules/ikiwiki/privileged.py +++ b/plinth/modules/ikiwiki/privileged.py @@ -6,7 +6,6 @@ import pathlib import re import shutil import subprocess -from typing import Tuple from plinth.actions import privileged @@ -43,7 +42,7 @@ def _get_title(site): @privileged -def get_sites() -> list[Tuple[str, str]]: +def get_sites() -> list[tuple[str, str]]: """Get wikis and blogs.""" sites = [] if os.path.exists(SITE_PATH): diff --git a/plinth/modules/janus/manifest.py b/plinth/modules/janus/manifest.py index 53aa2a9cb..467c65002 100644 --- a/plinth/modules/janus/manifest.py +++ b/plinth/modules/janus/manifest.py @@ -11,4 +11,4 @@ clients = [{ }] }] -backup = {} +backup: dict = {} diff --git a/plinth/modules/jsxc/manifest.py b/plinth/modules/jsxc/manifest.py index 9898d5e1d..0eb350b7c 100644 --- a/plinth/modules/jsxc/manifest.py +++ b/plinth/modules/jsxc/manifest.py @@ -11,4 +11,4 @@ clients = [{ }] }] -backup = {} +backup: dict = {} diff --git a/plinth/modules/letsencrypt/components.py b/plinth/modules/letsencrypt/components.py index f951277fa..762d28def 100644 --- a/plinth/modules/letsencrypt/components.py +++ b/plinth/modules/letsencrypt/components.py @@ -4,6 +4,7 @@ import logging import pathlib import threading +from typing import ClassVar from plinth import app from plinth.modules.names.components import DomainName @@ -38,7 +39,7 @@ class LetsEncrypt(app.FollowerComponent): """ - _all = {} + _all: ClassVar[dict[str, 'LetsEncrypt']] = {} def __init__(self, component_id, domains=None, daemons=None, should_copy_certificates=False, private_key_path=None, diff --git a/plinth/modules/matrixsynapse/__init__.py b/plinth/modules/matrixsynapse/__init__.py index de16cc499..4480adecd 100644 --- a/plinth/modules/matrixsynapse/__init__.py +++ b/plinth/modules/matrixsynapse/__init__.py @@ -3,7 +3,6 @@ import logging import os -from typing import List from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ @@ -191,7 +190,7 @@ def get_configured_domain_name(): return config['server_name'] -def get_turn_configuration() -> (List[str], str, bool): +def get_turn_configuration() -> tuple[TurnConfiguration, bool]: """Return TurnConfiguration if setup else empty.""" for file_path, managed in ((privileged.OVERRIDDEN_TURN_CONF_PATH, False), (privileged.TURN_CONF_PATH, True)): diff --git a/plinth/modules/matrixsynapse/privileged.py b/plinth/modules/matrixsynapse/privileged.py index f5b48459d..8f29caaec 100644 --- a/plinth/modules/matrixsynapse/privileged.py +++ b/plinth/modules/matrixsynapse/privileged.py @@ -7,7 +7,6 @@ import json import os import pathlib import shutil -from typing import Dict, List, Optional, Union import requests import yaml @@ -102,7 +101,7 @@ def get_config(): @privileged def set_config(public_registration: bool, - registration_verification: Optional[str] = None): + registration_verification: str | None = None): """Enable/disable public user registration.""" if registration_verification == 'token': _create_registration_token() @@ -243,7 +242,7 @@ def _get_access_token() -> str: @privileged -def list_registration_tokens() -> List[Dict[str, Optional[Union[str, int]]]]: +def list_registration_tokens() -> list[dict[str, str | int | None]]: """Return the current list of registration tokens.""" if not action_utils.service_is_running('matrix-synapse'): return [] @@ -262,7 +261,7 @@ def _get_headers(access_token: str): def _list_registration_tokens( - access_token: str) -> List[Dict[str, Optional[Union[str, int]]]]: + access_token: str) -> list[dict[str, str | int | None]]: """Use Admin API to fetch the list of registration tokens. For details on registration tokens API, see: diff --git a/plinth/modules/minetest/privileged.py b/plinth/modules/minetest/privileged.py index ceae1812f..73452d7b9 100644 --- a/plinth/modules/minetest/privileged.py +++ b/plinth/modules/minetest/privileged.py @@ -1,8 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later """Configure Minetest server.""" -from typing import Optional - import augeas from plinth import action_utils @@ -13,10 +11,9 @@ AUG_PATH = '/files' + CONFIG_FILE + '/.anon' @privileged -def configure(max_players: Optional[int] = None, - enable_pvp: Optional[bool] = None, - creative_mode: Optional[bool] = None, - enable_damage: Optional[bool] = None): +def configure(max_players: int | None = None, enable_pvp: bool | None = None, + creative_mode: bool | None = None, + enable_damage: bool | None = None): """Update configuration file and restart daemon if necessary.""" aug = load_augeas() if max_players is not None: diff --git a/plinth/modules/mumble/privileged.py b/plinth/modules/mumble/privileged.py index 9ef198fab..9385a0f8c 100644 --- a/plinth/modules/mumble/privileged.py +++ b/plinth/modules/mumble/privileged.py @@ -5,7 +5,6 @@ Configure Mumble server. import pathlib import subprocess -from typing import Optional import augeas @@ -33,7 +32,7 @@ def set_super_user_password(password: str): @privileged -def get_domain() -> Optional[str]: +def get_domain() -> str | None: """Return domain name set in mumble or empty string.""" domain_file = pathlib.Path('/var/lib/mumble-server/domain-freedombox') try: @@ -43,7 +42,7 @@ def get_domain() -> Optional[str]: @privileged -def set_domain(domain_name: Optional[str]): +def set_domain(domain_name: str | None): """Write a file containing domain name.""" if domain_name: domain_file = pathlib.Path('/var/lib/mumble-server/domain-freedombox') @@ -69,7 +68,7 @@ def change_root_channel_name(root_channel_name: str): @privileged -def get_root_channel_name() -> Optional[str]: +def get_root_channel_name() -> str | None: """Return the currently configured Root channel name.""" aug = _load_augeas() name = aug.get('.anon/registerName') diff --git a/plinth/modules/names/components.py b/plinth/modules/names/components.py index b9dc82797..bebf9941d 100644 --- a/plinth/modules/names/components.py +++ b/plinth/modules/names/components.py @@ -3,6 +3,8 @@ App component to introduce a new domain type. """ +from typing import ClassVar + from django.utils.translation import gettext_lazy as _ from plinth import app @@ -39,7 +41,7 @@ class DomainType(app.FollowerComponent): """ - _all = {} + _all: ClassVar[dict[str, 'DomainType']] = {} def __init__(self, component_id, display_name, configuration_url, can_have_certificate=True): @@ -90,7 +92,7 @@ class DomainName(app.FollowerComponent): primary reason for making a domain name available as a component. """ - _all = {} + _all: ClassVar[dict[str, 'DomainName']] = {} def __init__(self, component_id, name, domain_type, services): """Initialize a domain name. diff --git a/plinth/modules/names/manifest.py b/plinth/modules/names/manifest.py index 2d5b9ab3f..a8bdec5ae 100644 --- a/plinth/modules/names/manifest.py +++ b/plinth/modules/names/manifest.py @@ -3,4 +3,4 @@ Application manifest for names. """ -backup = {} +backup: dict = {} diff --git a/plinth/modules/pagekite/privileged.py b/plinth/modules/pagekite/privileged.py index f9b5eec69..c432a145f 100644 --- a/plinth/modules/pagekite/privileged.py +++ b/plinth/modules/pagekite/privileged.py @@ -2,7 +2,6 @@ """Configure PageKite.""" import os -from typing import Union import augeas @@ -118,7 +117,7 @@ def set_config(frontend: str, kite_name: str, kite_secret: str): @privileged -def remove_service(service: dict[str, Union[str, bool]]): +def remove_service(service: dict[str, str]): """Search and remove the service(s) that match all given parameters.""" aug = _augeas_load() service = utils.load_service(service) @@ -171,7 +170,7 @@ def _add_service(aug, service): @privileged -def add_service(service: dict[str, Union[str, bool]]): +def add_service(service: dict[str, str]): """Add one service.""" aug = _augeas_load() service = utils.load_service(service) diff --git a/plinth/modules/performance/manifest.py b/plinth/modules/performance/manifest.py index a770c1c33..ee153ee02 100644 --- a/plinth/modules/performance/manifest.py +++ b/plinth/modules/performance/manifest.py @@ -13,4 +13,4 @@ clients = [{ }] }] -backup = {} +backup: dict = {} diff --git a/plinth/modules/power/manifest.py b/plinth/modules/power/manifest.py index d958ecbac..bdacbc3d0 100644 --- a/plinth/modules/power/manifest.py +++ b/plinth/modules/power/manifest.py @@ -3,4 +3,4 @@ Application manifest for power. """ -backup = {} +backup: dict = {} diff --git a/plinth/modules/privacy/privileged.py b/plinth/modules/privacy/privileged.py index 04faff907..0a5782258 100644 --- a/plinth/modules/privacy/privileged.py +++ b/plinth/modules/privacy/privileged.py @@ -2,7 +2,6 @@ """Configure Privacy App.""" import pathlib -from typing import Optional import augeas @@ -30,7 +29,7 @@ def setup(): @privileged -def set_configuration(enable_popcon: Optional[bool] = None): +def set_configuration(enable_popcon: bool | None = None): """Update popcon configuration.""" aug = _load_augeas() if enable_popcon: diff --git a/plinth/modules/privoxy/manifest.py b/plinth/modules/privoxy/manifest.py index 87747ba2b..099231aa8 100644 --- a/plinth/modules/privoxy/manifest.py +++ b/plinth/modules/privoxy/manifest.py @@ -3,4 +3,4 @@ Application manifest for privoxy. """ -backup = {} +backup: dict = {} diff --git a/plinth/modules/shadowsocks/privileged.py b/plinth/modules/shadowsocks/privileged.py index 4d3075654..1776cc6d9 100644 --- a/plinth/modules/shadowsocks/privileged.py +++ b/plinth/modules/shadowsocks/privileged.py @@ -7,7 +7,6 @@ import pathlib import random import string from shutil import move -from typing import Union from plinth import action_utils from plinth.actions import privileged @@ -64,7 +63,7 @@ def setup(): @privileged -def get_config() -> dict[str, Union[int, str]]: +def get_config() -> dict[str, int | str]: """Read and print Shadowsocks configuration.""" config = open(SHADOWSOCKS_CONFIG_SYMLINK, 'r', encoding='utf-8').read() return json.loads(config) @@ -86,7 +85,7 @@ def _merge_config(config): @privileged -def merge_config(config: dict[str, Union[int, str]]): +def merge_config(config: dict[str, int | str]): """Configure Shadowsocks Client.""" _merge_config(config) diff --git a/plinth/modules/shadowsocksserver/privileged.py b/plinth/modules/shadowsocksserver/privileged.py index 1e51bdccd..1ea5f16d2 100644 --- a/plinth/modules/shadowsocksserver/privileged.py +++ b/plinth/modules/shadowsocksserver/privileged.py @@ -6,7 +6,6 @@ import os import pathlib import random import string -from typing import Union from plinth import action_utils from plinth.actions import privileged @@ -47,7 +46,7 @@ def setup(): @privileged -def get_config() -> dict[str, Union[int, str]]: +def get_config() -> dict[str, int | str]: """Read and print Shadowsocks Server configuration.""" config = open(SHADOWSOCKS_CONFIG_SYMLINK, 'r', encoding='utf-8').read() return json.loads(config) diff --git a/plinth/modules/storage/manifest.py b/plinth/modules/storage/manifest.py index f27f6313e..dd99aa59c 100644 --- a/plinth/modules/storage/manifest.py +++ b/plinth/modules/storage/manifest.py @@ -3,4 +3,4 @@ Application manifest for storage. """ -backup = {} +backup: dict = {} diff --git a/plinth/modules/storage/udisks2.py b/plinth/modules/storage/udisks2.py index 5784c0326..7779f35e6 100644 --- a/plinth/modules/storage/udisks2.py +++ b/plinth/modules/storage/udisks2.py @@ -14,7 +14,7 @@ gio = import_from_gi('Gio', '2.0') _DBUS_NAME = 'org.freedesktop.UDisks2' -_INTERFACES = { +_INTERFACES: dict[str, str] = { 'Ata': 'org.freedesktop.UDisks2.Drive.Ata', 'Block': 'org.freedesktop.UDisks2.Block', 'Drive': 'org.freedesktop.UDisks2.Drive', @@ -28,14 +28,14 @@ _INTERFACES = { 'UDisks2': 'org.freedesktop.UDisks2', } -_OBJECTS = { +_OBJECTS: dict[str, str] = { 'drives': '/org/freedesktop/UDisks2/drives/', 'jobs': '/org/freedesktop/UDisks2/jobs/', 'Manager': '/org/freedesktop/UDisks2/Manager', 'UDisks2': '/org/freedesktop/UDisks2', } -_ERRORS = { +_ERRORS: dict[str, str] = { 'AlreadyMounted': 'org.freedesktop.UDisks2.Error.AlreadyMounted', 'Failed': 'org.freedesktop.UDisks2.Error.Failed', } @@ -54,8 +54,8 @@ def _get_dbus_proxy(object_, interface): class Proxy: """Base methods for abstraction over UDisks2 DBus proxy objects.""" - interface = None - properties = {} + interface: str | None = None + properties: dict[str, tuple[str, str]] = {} def __init__(self, object_path): """Return an object instance.""" diff --git a/plinth/modules/tor/privileged.py b/plinth/modules/tor/privileged.py index 31906ca7a..c32a31dc5 100644 --- a/plinth/modules/tor/privileged.py +++ b/plinth/modules/tor/privileged.py @@ -10,7 +10,7 @@ import shutil import socket import subprocess import time -from typing import Any, Optional, Union +from typing import Any import augeas @@ -143,11 +143,10 @@ def _remove_proxy(): @privileged -def configure(use_upstream_bridges: Optional[bool] = None, - upstream_bridges: Optional[str] = None, - relay: Optional[bool] = None, - bridge_relay: Optional[bool] = None, - hidden_service: Optional[bool] = None): +def configure(use_upstream_bridges: bool | None = None, + upstream_bridges: str | None = None, relay: bool | None = None, + bridge_relay: bool | None = None, + hidden_service: bool | None = None): """Configure Tor.""" aug = augeas_load() @@ -193,7 +192,7 @@ def restart(): @privileged -def get_status() -> dict[str, Union[bool, str, dict[str, Any]]]: +def get_status() -> dict[str, bool | str | dict[str, Any]]: """Return dict with Tor status.""" aug = augeas_load() return { @@ -254,8 +253,8 @@ def _get_ports() -> dict[str, str]: def _get_orport() -> str: """Return the ORPort by querying running instance.""" - cookie = open(TOR_AUTH_COOKIE, 'rb').read() - cookie = codecs.encode(cookie, 'hex').decode() + cookie_bytes = open(TOR_AUTH_COOKIE, 'rb').read() + cookie = codecs.encode(cookie_bytes, 'hex').decode() commands = '''AUTHENTICATE {cookie} GETINFO net/listeners/or @@ -270,6 +269,9 @@ QUIT line = response.split(b'\r\n')[1].decode() matches = re.match(r'.*=".+:(\d+)"', line) + if not matches: + raise ValueError('Invalid orport value returned by Tor') + return matches.group(1) @@ -320,8 +322,7 @@ def _disable(): action_utils.service_disable(SERVICE_NAME) -def _use_upstream_bridges(use_upstream_bridges: Optional[bool] = None, - aug=None): +def _use_upstream_bridges(use_upstream_bridges: bool | None = None, aug=None): """Enable use of upstream bridges.""" if use_upstream_bridges is None: return @@ -360,8 +361,7 @@ def _set_upstream_bridges(upstream_bridges=None, aug=None): aug.save() -def _enable_relay(relay: Optional[bool], bridge: Optional[bool], - aug: augeas.Augeas): +def _enable_relay(relay: bool | None, bridge: bool | None, aug: augeas.Augeas): """Enable Tor bridge relay.""" if relay is None and bridge is None: return diff --git a/plinth/modules/torproxy/privileged.py b/plinth/modules/torproxy/privileged.py index 57216af9d..46b12393d 100644 --- a/plinth/modules/torproxy/privileged.py +++ b/plinth/modules/torproxy/privileged.py @@ -5,7 +5,7 @@ import logging import os import shutil import subprocess -from typing import Any, Optional, Union +from typing import Any import augeas @@ -66,9 +66,9 @@ def _first_time_setup(): @privileged -def configure(use_upstream_bridges: Optional[bool] = None, - upstream_bridges: Optional[str] = None, - apt_transport_tor: Optional[bool] = None): +def configure(use_upstream_bridges: bool | None = None, + upstream_bridges: str | None = None, + apt_transport_tor: bool | None = None): """Configure Tor.""" aug = augeas_load() @@ -92,7 +92,7 @@ def restart(): @privileged -def get_status() -> dict[str, Union[bool, str, dict[str, Any]]]: +def get_status() -> dict[str, bool | str | dict[str, Any]]: """Return dict with Tor Proxy status.""" aug = augeas_load() return { @@ -125,8 +125,7 @@ def _disable(): action_utils.service_disable(SERVICE_NAME) -def _use_upstream_bridges(use_upstream_bridges: Optional[bool] = None, - aug=None): +def _use_upstream_bridges(use_upstream_bridges: bool | None = None, aug=None): """Enable use of upstream bridges.""" if use_upstream_bridges is None: return diff --git a/plinth/modules/transmission/privileged.py b/plinth/modules/transmission/privileged.py index b9fe96483..fbadd312a 100644 --- a/plinth/modules/transmission/privileged.py +++ b/plinth/modules/transmission/privileged.py @@ -5,7 +5,6 @@ Configuration helper for Transmission daemon. import json import pathlib -from typing import Union from plinth import action_utils from plinth.actions import privileged @@ -20,14 +19,15 @@ def get_configuration() -> dict[str, str]: @privileged -def merge_configuration(configuration: dict[str, Union[str, bool]]): +def merge_configuration(configuration: dict[str, str | bool]): """Merge given JSON configuration with existing configuration.""" - current_configuration = _transmission_config.read_bytes() - current_configuration = json.loads(current_configuration) + current_configuration_bytes = _transmission_config.read_bytes() + current_configuration = json.loads(current_configuration_bytes) new_configuration = current_configuration new_configuration.update(configuration) - new_configuration = json.dumps(new_configuration, indent=4, sort_keys=True) + new_configuration_bytes = json.dumps(new_configuration, indent=4, + sort_keys=True) - _transmission_config.write_text(new_configuration, encoding='utf-8') + _transmission_config.write_text(new_configuration_bytes, encoding='utf-8') action_utils.service_reload('transmission-daemon') diff --git a/plinth/modules/ttrss/privileged.py b/plinth/modules/ttrss/privileged.py index 34778b596..a59aaf3ca 100644 --- a/plinth/modules/ttrss/privileged.py +++ b/plinth/modules/ttrss/privileged.py @@ -3,7 +3,6 @@ import os import subprocess -from typing import Optional import augeas @@ -19,15 +18,16 @@ DB_BACKUP_FILE = '/var/lib/plinth/backups-data/ttrss-database.sql' @privileged def pre_setup(): """Preseed debconf values before packages are installed.""" - action_utils.debconf_set_selections( - ['tt-rss tt-rss/database-type string pgsql', - 'tt-rss tt-rss/purge boolean true', - 'tt-rss tt-rss/dbconfig-remove boolean true', - 'tt-rss tt-rss/dbconfig-reinstall boolean true']) + action_utils.debconf_set_selections([ + 'tt-rss tt-rss/database-type string pgsql', + 'tt-rss tt-rss/purge boolean true', + 'tt-rss tt-rss/dbconfig-remove boolean true', + 'tt-rss tt-rss/dbconfig-reinstall boolean true' + ]) @privileged -def get_domain() -> Optional[str]: +def get_domain() -> str | None: """Get the domain set for Tiny Tiny RSS.""" aug = load_augeas() @@ -41,7 +41,7 @@ def get_domain() -> Optional[str]: @privileged -def set_domain(domain_name: Optional[str]): +def set_domain(domain_name: str | None): """Set the domain to be used by Tiny Tiny RSS.""" if not domain_name: return diff --git a/plinth/modules/upgrades/privileged.py b/plinth/modules/upgrades/privileged.py index fd020a8cb..1b734d2b3 100644 --- a/plinth/modules/upgrades/privileged.py +++ b/plinth/modules/upgrades/privileged.py @@ -7,7 +7,6 @@ import pathlib import re import subprocess import time -from typing import List, Tuple, Union from plinth.action_utils import (apt_hold, apt_hold_flag, apt_hold_freedombox, apt_unhold_freedombox, debconf_set_selections, @@ -81,7 +80,7 @@ Pin: release a=bullseye-backports Pin-Priority: 500 ''' -DIST_UPGRADE_OBSOLETE_PACKAGES: List[str] = [] +DIST_UPGRADE_OBSOLETE_PACKAGES: list[str] = [] DIST_UPGRADE_PACKAGES_WITH_PROMPTS = [ 'bind9', 'firewalld', 'janus', 'minetest-server', 'minidlna', @@ -90,7 +89,7 @@ DIST_UPGRADE_PACKAGES_WITH_PROMPTS = [ DIST_UPGRADE_PRE_INSTALL_PACKAGES = ['base-files'] -DIST_UPGRADE_PRE_DEBCONF_SELECTIONS: List[str] = [ +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' ] @@ -198,7 +197,7 @@ def get_log() -> str: def _get_protocol() -> str: """Return the protocol to use for newly added repository sources.""" try: - from plinth.modules.tor import utils + from plinth.modules.torproxy import utils if utils.is_apt_transport_tor_enabled(): return 'tor+http' except Exception: @@ -317,7 +316,7 @@ def _is_sufficient_free_space() -> bool: return free_space >= DIST_UPGRADE_REQUIRED_FREE_SPACE -def _check_dist_upgrade(test_upgrade=False) -> Tuple[bool, str]: +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 @@ -589,7 +588,7 @@ def _start_dist_upgrade_service(): @privileged -def start_dist_upgrade(test: bool = False) -> dict[str, Union[str, bool]]: +def start_dist_upgrade(test: bool = False) -> dict[str, str | bool]: """Start dist upgrade process. Check if a new stable release is available, and start dist-upgrade process diff --git a/plinth/modules/users/components.py b/plinth/modules/users/components.py index 1d79e412b..d0216accb 100644 --- a/plinth/modules/users/components.py +++ b/plinth/modules/users/components.py @@ -4,6 +4,7 @@ App component to manage users and groups. """ import itertools +from typing import ClassVar from plinth import app @@ -12,7 +13,7 @@ class UsersAndGroups(app.FollowerComponent): """Component to manage users and groups of an app.""" # Class variable to hold a list of user groups for apps - _all_components = set() + _all_components: ClassVar[set['UsersAndGroups']] = set() def __init__(self, component_id, reserved_usernames=[], groups={}): """Store reserved_usernames and groups of the app. diff --git a/plinth/modules/users/privileged.py b/plinth/modules/users/privileged.py index 7483474b1..a67284e84 100644 --- a/plinth/modules/users/privileged.py +++ b/plinth/modules/users/privileged.py @@ -6,7 +6,6 @@ import os import re import shutil import subprocess -from typing import Optional import augeas @@ -220,8 +219,8 @@ def _disconnect_samba_user(username): @privileged -def create_user(username: str, password: str, auth_user: Optional[str] = None, - auth_password: Optional[str] = None): +def create_user(username: str, password: str, auth_user: str | None = None, + auth_password: str | None = None): """Create an LDAP user, set password and flush cache.""" _validate_user(auth_user, auth_password) @@ -232,7 +231,7 @@ def create_user(username: str, password: str, auth_user: Optional[str] = None, @privileged -def remove_user(username: str, password: Optional[str] = None): +def remove_user(username: str, password: str | None = None): """Remove an LDAP user.""" groups = _get_user_groups(username) @@ -424,8 +423,8 @@ def _add_user_to_group(username, groupname): @privileged def add_user_to_group(username: str, groupname: str, - auth_user: Optional[str] = None, - auth_password: Optional[str] = None): + auth_user: str | None = None, + auth_password: str | None = None): """Add an LDAP user to an LDAP group.""" if groupname == 'admin': _validate_user(auth_user, auth_password) diff --git a/plinth/modules/users/tests/test_privileged.py b/plinth/modules/users/tests/test_privileged.py index 0852b01f9..356c6c10c 100644 --- a/plinth/modules/users/tests/test_privileged.py +++ b/plinth/modules/users/tests/test_privileged.py @@ -16,11 +16,6 @@ from plinth import action_utils from plinth.modules.users import privileged from plinth.tests import config as test_config -pytestmark = pytest.mark.usefixtures('mock_privileged') -privileged_modules_to_mock = [ - 'plinth.modules.users.privileged', 'plinth.modules.security.privileged' -] - _cleanup_users = None _cleanup_groups = None @@ -39,10 +34,13 @@ def _is_ldap_set_up(): return False -pytestmark = [ - pytest.mark.usefixtures('needs_root', 'load_cfg'), +pytestmark: list[pytest.MarkDecorator] = [ + pytest.mark.usefixtures('needs_root', 'load_cfg', 'mock_privileged'), pytest.mark.skipif(not _is_ldap_set_up(), reason="LDAP is not configured") ] +privileged_modules_to_mock = [ + 'plinth.modules.users.privileged', 'plinth.modules.security.privileged' +] def _random_string(length=8): diff --git a/plinth/modules/wireguard/privileged.py b/plinth/modules/wireguard/privileged.py index 34a61d0f0..50dd0cb26 100644 --- a/plinth/modules/wireguard/privileged.py +++ b/plinth/modules/wireguard/privileged.py @@ -19,7 +19,7 @@ def get_info() -> dict[str, dict]: if not line: continue - fields = [ + fields: list = [ field if field != '(none)' else None for field in line.split() ] interface_name = fields[0] diff --git a/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service b/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service index b7bcdaf72..0cb51d2e2 100644 --- a/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service +++ b/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service @@ -8,7 +8,7 @@ ConditionPathExists=/etc/wordpress/config-default.php [Service] CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_IPC_OWNER CAP_NET_ADMIN CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE CAP_KILL CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_LINUX_IMMUTABLE CAP_IPC_LOCK CAP_SYS_CHROOT CAP_BLOCK_SUSPEND CAP_LEASE CAP_SYS_PACCT CAP_SYS_TTY_CONFIG CAP_SYS_BOOT CAP_MAC_ADMIN CAP_MAC_OVERRIDE CAP_SYS_NICE CAP_SYS_RESOURCE DevicePolicy=closed -ExecStart=php --file /usr/share/wordpress/wp-cron.php +ExecStart=/usr/bin/php --file /usr/share/wordpress/wp-cron.php Group=www-data LockPersonality=yes NoNewPrivileges=yes diff --git a/plinth/modules/zoph/privileged.py b/plinth/modules/zoph/privileged.py index 65f342281..e5f3b79b9 100644 --- a/plinth/modules/zoph/privileged.py +++ b/plinth/modules/zoph/privileged.py @@ -5,7 +5,6 @@ import configparser import os import re import subprocess -from typing import Optional from plinth import action_utils from plinth.actions import privileged @@ -65,8 +64,8 @@ def _get_db_name(): @privileged -def set_configuration(enable_osm: Optional[bool] = None, - admin_user: Optional[str] = None): +def set_configuration(enable_osm: bool | None = None, + admin_user: str | None = None): """Setup Zoph Apache configuration.""" _zoph_configure('interface.user.remote', 'true') @@ -90,7 +89,7 @@ def set_configuration(enable_osm: Optional[bool] = None, @privileged -def is_configured() -> Optional[bool]: +def is_configured() -> bool | None: """Return whether zoph app is configured.""" try: process = subprocess.run( diff --git a/plinth/operation.py b/plinth/operation.py index ddb5f2522..8d61ed09d 100644 --- a/plinth/operation.py +++ b/plinth/operation.py @@ -4,7 +4,7 @@ import enum import logging import threading -from typing import Callable, Optional +from typing import Callable from . import app as app_module @@ -22,10 +22,10 @@ class Operation: COMPLETED: str = 'completed' def __init__(self, app_id: str, name: str, target: Callable, - args: Optional[list] = None, kwargs: Optional[dict] = None, + args: list | None = None, kwargs: dict | None = None, show_message: bool = True, show_notification: bool = False, - thread_data: Optional[dict] = None, - on_complete: Callable = None): + thread_data: dict | None = None, + on_complete: Callable | None = None): """Initialize to no operation.""" self.app_id = app_id self.name = name @@ -39,8 +39,8 @@ class Operation: self.state = Operation.State.WAITING self.return_value = None - self._message: Optional[str] = None - self.exception: Optional[Exception] = None + self._message: str | None = None + self.exception: Exception | None = None # Operation specific data self.thread_data: dict = thread_data or {} @@ -89,13 +89,13 @@ class Operation: return self.return_value @staticmethod - def get_operation(): + def get_operation() -> 'Operation': """Return the operation associated with this thread.""" thread = threading.current_thread() - return thread._operation + return thread._operation # type: ignore [attr-defined] - def on_update(self, message: Optional[str] = None, - exception: Optional[Exception] = None): + def on_update(self, message: str | None = None, + exception: Exception | None = None): """Call from within the thread to update the progress of operation.""" if message: self._message = message @@ -106,7 +106,7 @@ class Operation: self._update_notification() @property - def message(self): + def message(self) -> str | None: """Return a message about status of the operation.""" from django.utils.translation import gettext_noop if self._message: # Progress has been set by the operation itself @@ -124,8 +124,10 @@ class Operation: if self.state == Operation.State.COMPLETED: return gettext_noop('Finished: {name}') + return None + @property - def translated_message(self): + def translated_message(self) -> str: """Return a message about status of operation after translating. Must be called from a web request (UI) thread with user language set so @@ -141,7 +143,7 @@ class Operation: return message - def _update_notification(self): + def _update_notification(self) -> None: """Show an updated notification if needed.""" if not self.show_notification: return @@ -167,10 +169,10 @@ class Operation: class OperationsManager: """Global handler for all operations and their results.""" - def __init__(self): + def __init__(self) -> None: """Initialize the object.""" self._operations: list[Operation] = [] - self._current_operation: Optional[Operation] = None + self._current_operation: Operation | None = None # Assume that operations manager will be called from various threads # including the callback called from the threads it creates. Ensure @@ -180,17 +182,17 @@ class OperationsManager: # when done from the same thread which holds the lock. self._lock = threading.RLock() - def new(self, *args, **kwargs): + def new(self, *args, **kwargs) -> Operation: """Create a new operation instance and add to global list.""" with self._lock: - operation = Operation(*args, **kwargs, - on_complete=self._on_operation_complete) + kwargs['on_complete'] = self._on_operation_complete + operation = Operation(*args, **kwargs) self._operations.append(operation) logger.info('%s: added', operation) self._schedule_next() return operation - def _on_operation_complete(self, operation): + def _on_operation_complete(self, operation: Operation): """Trigger next operation. Called from within previous thread.""" logger.debug('%s: on_complete called', operation) with self._lock: @@ -201,7 +203,7 @@ class OperationsManager: self._schedule_next() - def _schedule_next(self): + def _schedule_next(self) -> None: """Schedule the next available operation.""" with self._lock: if self._current_operation: @@ -214,7 +216,7 @@ class OperationsManager: operation.run() break - def filter(self, app_id): + def filter(self, app_id: str) -> list[Operation]: """Return operations matching a pattern.""" with self._lock: return [ @@ -222,7 +224,7 @@ class OperationsManager: if operation.app_id == app_id ] - def collect_results(self, app_id): + def collect_results(self, app_id: str) -> list[Operation]: """Return the finished operations for an app.""" results: list[Operation] = [] remaining: list[Operation] = [] diff --git a/plinth/package.py b/plinth/package.py index dee7b9baf..c9afab8b2 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -5,7 +5,6 @@ import enum import logging import pathlib import time -from typing import Optional, Union import apt.cache from django.utils.translation import gettext as _ @@ -42,11 +41,11 @@ class Package(PackageExpression): self, name, optional: bool = False, - version: Optional[str] = None, # ">=1.0,<2.0" - distribution: Optional[str] = None, # Debian, Ubuntu - suite: Optional[str] = None, # stable, testing - codename: Optional[str] = None, # bullseye-backports - architecture: Optional[str] = None): # arm64 + version: str | None = None, # ">=1.0,<2.0" + distribution: str | None = None, # Debian, Ubuntu + suite: str | None = None, # stable, testing + codename: str | None = None, # bullseye-backports + architecture: str | None = None): # arm64 self.name = name self.optional = optional self.version = version @@ -108,10 +107,10 @@ class Packages(app_module.FollowerComponent): REMOVE = 'remove' # Remove the packages before installing the app def __init__(self, component_id: str, - packages: list[Union[str, PackageExpression]], + packages: list[str | PackageExpression], skip_recommends: bool = False, - conflicts: Optional[list[str]] = None, - conflicts_action: Optional[ConflictsAction] = None): + conflicts: list[str] | None = None, + conflicts_action: ConflictsAction | None = None): """Initialize a new packages component. 'component_id' should be a unique ID across all components of an app @@ -230,14 +229,14 @@ class Packages(app_module.FollowerComponent): return results - def find_conflicts(self) -> Optional[list[str]]: + def find_conflicts(self) -> list[str] | None: """Return list of conflicting packages installed on the system.""" if not self.conflicts: return None return packages_installed(self.conflicts) - def has_unavailable_packages(self) -> Optional[bool]: + def has_unavailable_packages(self) -> bool | None: """Return whether any of the packages are not available. Returns True if one or more of the packages is not available in the @@ -465,7 +464,7 @@ def filter_conffile_prompt_packages(packages): return privileged.filter_conffile_packages(list(packages)) -def packages_installed(candidates: Union[list, tuple]) -> list: +def packages_installed(candidates: list | tuple) -> list: """Check which candidates are installed on the system. :param candidates: A list of package names. diff --git a/plinth/privileged/packages.py b/plinth/privileged/packages.py index a315f9144..9045d2fad 100644 --- a/plinth/privileged/packages.py +++ b/plinth/privileged/packages.py @@ -5,7 +5,7 @@ import logging import os import subprocess from collections import defaultdict -from typing import Any, Optional +from typing import Any import apt.cache import apt_inst @@ -31,7 +31,7 @@ def update(): @privileged def install(app_id: str, packages: list[str], skip_recommends: bool = False, - force_configuration: Optional[str] = None, reinstall: bool = False, + force_configuration: str | None = None, reinstall: bool = False, force_missing_configuration: bool = False): """Install packages using apt-get.""" if force_configuration not in ('old', 'new', None): diff --git a/plinth/settings.py b/plinth/settings.py index 882fe688a..c7320ff7b 100644 --- a/plinth/settings.py +++ b/plinth/settings.py @@ -124,7 +124,7 @@ LOGIN_URL = 'users:login' LOGIN_REDIRECT_URL = 'index' # Overridden before initialization -MESSAGE_TAGS = {} +MESSAGE_TAGS: dict = {} MIDDLEWARE = ( 'django.middleware.security.SecurityMiddleware', @@ -135,6 +135,7 @@ MIDDLEWARE = ( 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'plinth.middleware.CommonErrorMiddleware', 'stronghold.middleware.LoginRequiredMiddleware', 'plinth.middleware.AdminRequiredMiddleware', 'plinth.middleware.FirstSetupMiddleware', diff --git a/plinth/templates/error.html b/plinth/templates/error.html new file mode 100644 index 000000000..fbedd105c --- /dev/null +++ b/plinth/templates/error.html @@ -0,0 +1,16 @@ +{% extends 'base.html' %} +{% comment %} +# SPDX-License-Identifier: AGPL-3.0-or-later +{% endcomment %} + +{% load i18n %} + +{% block content %} + +

{% trans "Error" %}

+ +

+ {{ message }} +

+ +{% endblock %} diff --git a/plinth/tests/test_actions_actions.py b/plinth/tests/test_actions_actions.py index 05c18b20c..088fa6fa4 100644 --- a/plinth/tests/test_actions_actions.py +++ b/plinth/tests/test_actions_actions.py @@ -147,9 +147,9 @@ def test_assert_valid_type(actions_module): # Invalid values for int, str, float and Optional values = [[1, bool], ['foo', int], [1, str], [1, float], - [1, typing.Optional[str]], [1.1, typing.Union[int, str]], - [1, list], [1, dict], [[1], list[str]], - [{ + [1, typing.Optional[str]], [1, str | None], + [1.1, typing.Union[int, str]], [1.1, int | str], [1, list], + [1, dict], [[1], list[str]], [{ 'a': 'b' }, dict[int, str]], [{ 1: 2 @@ -165,8 +165,12 @@ def test_assert_valid_type(actions_module): assert_valid('arg', 1.1, float) assert_valid('arg', None, typing.Optional[int]) assert_valid('arg', 1, typing.Optional[int]) + assert_valid('arg', None, int | None) + assert_valid('arg', 1, int | None) assert_valid('arg', 1, typing.Union[int, str]) assert_valid('arg', '1', typing.Union[int, str]) + assert_valid('arg', 1, int | str) + assert_valid('arg', '1', int | str) assert_valid('arg', [], list[int]) assert_valid('arg', ['foo'], list[str]) assert_valid('arg', {}, dict[int, str]) diff --git a/plinth/tests/test_middleware.py b/plinth/tests/test_middleware.py index e335c2583..a32a6ccff 100644 --- a/plinth/tests/test_middleware.py +++ b/plinth/tests/test_middleware.py @@ -8,12 +8,14 @@ from unittest.mock import MagicMock, Mock, call, patch import pytest from django.contrib.auth.models import AnonymousUser, Group, User from django.core.exceptions import PermissionDenied +from django.db.utils import OperationalError from django.http import HttpResponse from django.test.client import RequestFactory from stronghold.decorators import public from plinth import app as app_module -from plinth.middleware import AdminRequiredMiddleware, SetupMiddleware +from plinth.middleware import (AdminRequiredMiddleware, CommonErrorMiddleware, + SetupMiddleware) setup_helper = None @@ -255,3 +257,44 @@ class TestAdminMiddleware: response = middleware.process_view(web_request, **kwargs) assert response is None + + +class TestCommonErrorMiddleware: + """Test cases for common error middleware.""" + + @staticmethod + @pytest.fixture(name='middleware') + def fixture_middleware(load_cfg): + """Fixture for returning middleware.""" + return CommonErrorMiddleware(True) + + @staticmethod + @pytest.fixture(name='web_request') + def fixture_web_request(): + """Fixture for returning web request.""" + web_request = RequestFactory().get('/plinth/mockapp') + web_request.user = Mock() + return web_request + + @staticmethod + @pytest.fixture(name='operational_error') + def fixture_operational_error(): + """Fixture for returning an OperationalError.""" + return OperationalError() + + @staticmethod + @pytest.fixture(name='other_error') + def fixture_other_error(): + """Fixture for returning a different type of error.""" + return IndexError() + + @staticmethod + def test_operational_error(middleware, web_request, operational_error): + response = middleware.process_exception(web_request, operational_error) + assert response.template_name == 'error.html' + assert 'message' in response.context_data + + @staticmethod + def test_other_error(middleware, web_request, other_error): + response = middleware.process_exception(web_request, other_error) + assert response is None diff --git a/plinth/tests/test_utils.py b/plinth/tests/test_utils.py index ff4f0c637..c9e220433 100644 --- a/plinth/tests/test_utils.py +++ b/plinth/tests/test_utils.py @@ -92,7 +92,7 @@ class TestYAMLFileUtil: kv_pair = {'key': 'value'} yaml = ruamel.yaml.YAML() - yaml.preserve_quotes = True + yaml.preserve_quotes = True # type: ignore [assignment] def test_update_empty_yaml_file(self): """ diff --git a/plinth/views.py b/plinth/views.py index 8cb5d4c20..da37eeaea 100644 --- a/plinth/views.py +++ b/plinth/views.py @@ -9,6 +9,7 @@ import urllib.parse from django.contrib import messages from django.core.exceptions import ImproperlyConfigured +from django.forms import Form from django.http import Http404, HttpResponseBadRequest, HttpResponseRedirect from django.shortcuts import redirect from django.template.response import TemplateResponse @@ -164,9 +165,9 @@ class AppView(FormView): instead of the simple appearance provided by default. """ - form_class = None - app_id = None - template_name = 'app.html' + form_class: Form | None = None + app_id: str | None = None + template_name: str = 'app.html' def __init__(self, *args, **kwargs): """Initialize the view.""" diff --git a/plinth/web_server.py b/plinth/web_server.py index 9fcb622b0..65a9586fe 100644 --- a/plinth/web_server.py +++ b/plinth/web_server.py @@ -7,6 +7,7 @@ import logging import os import sys import warnings +from typing import ClassVar import cherrypy @@ -104,7 +105,7 @@ class StaticFiles(app_module.FollowerComponent): """ - _all_instances = {} + _all_instances: ClassVar[dict[str, 'StaticFiles']] = {} def __init__(self, component_id, directory_map=None): """Initialize the component. diff --git a/pyproject.toml b/pyproject.toml index fb28b3f97..311abe849 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,3 +81,27 @@ disable = [ "too-many-arguments", # Has not resulted in a refactoring "too-many-ancestors", # Easy to hit when using Django ] + +# Ignore missing type stubs for some libraries. Try to keep this list minimal +# and use type annotations where available. +[[tool.mypy.overrides]] +module = [ + "aptsources.*", + "augeas.*", + "axes.*", + "captcha.*", + "cherrypy.*", + "configobj.*", + "dbus.*", + "django.*", + "gi.*", + "pam.*", + "pgi.*", + "plinth.tests.config_local", + "pytest_splinter.*", + "ruamel.*", + "selenium.*", + "splinter.*", + "stronghold.*", +] +ignore_missing_imports = true diff --git a/setup.py b/setup.py index ccf2aa74f..f0a002e78 100755 --- a/setup.py +++ b/setup.py @@ -66,7 +66,7 @@ LOCALE_PATHS = ['plinth/locale'] class DjangoCommand(Command): """Setup command to run a Django management command.""" - user_options = [] + user_options: list = [] def initialize_options(self): """Declare the options for this command."""