diff --git a/actions/actions b/actions/actions index 7b7e5459b..8761c73eb 100755 --- a/actions/actions +++ b/actions/actions @@ -1,210 +1,7 @@ #!/usr/bin/python3 # SPDX-License-Identifier: AGPL-3.0-or-later -import argparse -import importlib -import inspect -import json -import logging -import os -import sys -import traceback -import types -import typing - -import plinth.log -from plinth import cfg, module_loader - -EXIT_SYNTAX = 10 -EXIT_PERM = 20 - -logger = logging.getLogger(__name__) - - -def main(): - """Parse arguments.""" - plinth.log.action_init() - - parser = argparse.ArgumentParser() - parser.add_argument('module', help='Module to trigger action in') - parser.add_argument('action', help='Action to trigger in module') - parser.add_argument('--write-fd', type=int, default=1, - help='File descriptor to write output to') - parser.add_argument('--no-args', default=False, action='store_true', - help='Do not read arguments from stdin') - args = parser.parse_args() - - try: - try: - arguments = {'args': [], 'kwargs': {}} - if not args.no_args: - input_ = sys.stdin.read() - if input_: - arguments = json.loads(input_) - except json.JSONDecodeError as exception: - raise SyntaxError('Arguments on stdin not JSON.') from exception - - return_value = _call(args.module, args.action, arguments) - with os.fdopen(args.write_fd, 'w') as write_file_handle: - write_file_handle.write(json.dumps(return_value)) - except PermissionError as exception: - logger.error(exception.args[0]) - sys.exit(EXIT_PERM) - except SyntaxError as exception: - logger.error(exception.args[0]) - sys.exit(EXIT_SYNTAX) - except TypeError as exception: - logger.error(exception.args[0]) - sys.exit(EXIT_SYNTAX) - except Exception as exception: - logger.exception(exception) - sys.exit(1) - - -def _call(module_name, action_name, arguments): - """Import the module and run action as superuser""" - if '.' in module_name: - raise SyntaxError('Invalid module name') - - cfg.read() - if module_name == 'plinth': - import_path = 'plinth' - else: - import_path = module_loader.get_module_import_path(module_name) - - try: - module = importlib.import_module(import_path + '.privileged') - except ModuleNotFoundError as exception: - raise SyntaxError('Specified module not found') from exception - - try: - action = getattr(module, action_name) - except AttributeError as exception: - raise SyntaxError('Specified action not found') from exception - - if not getattr(action, '_privileged', None): - raise SyntaxError('Specified action is not privileged action') - - func = getattr(action, '__wrapped__') - - _assert_valid_arguments(func, arguments) - - try: - return_values = func(*arguments['args'], **arguments['kwargs']) - return_value = {'result': 'success', 'return': return_values} - except Exception as exception: - logger.exception('Error executing action: %s', exception) - return_value = { - 'result': 'exception', - 'exception': { - 'module': type(exception).__module__, - 'name': type(exception).__name__, - 'args': exception.args, - 'traceback': traceback.format_tb(exception.__traceback__) - } - } - - return return_value - - -def _assert_valid_arguments(func, arguments): - """Check the names, types and completeness of the arguments passed.""" - # Check if arguments match types - if not isinstance(arguments, dict): - raise SyntaxError('Invalid arguments format') - - if 'args' not in arguments or 'kwargs' not in arguments: - raise SyntaxError('Invalid arguments format') - - args = arguments['args'] - kwargs = arguments['kwargs'] - if not isinstance(args, list) or not isinstance(kwargs, dict): - raise SyntaxError('Invalid arguments format') - - argspec = inspect.getfullargspec(func) - if len(args) + len(kwargs) > len(argspec.args): - raise SyntaxError('Too many arguments') - - no_defaults = len(argspec.args) - if argspec.defaults: - no_defaults -= len(argspec.defaults) - - for key in argspec.args[len(args):no_defaults]: - if key not in kwargs: - raise SyntaxError(f'Argument not provided: {key}') - - for key, value in kwargs.items(): - if key not in argspec.args: - raise SyntaxError(f'Unknown argument: {key}') - - if argspec.args.index(key) < len(args): - raise SyntaxError(f'Duplicate argument: {key}') - - _assert_valid_type(f'arg {key}', value, argspec.annotations[key]) - - for index, arg in enumerate(args): - annotation = argspec.annotations[argspec.args[index]] - _assert_valid_type(f'arg #{index}', arg, annotation) - - -def _assert_valid_type(arg_name, value, annotation): - """Assert that the type of argument value matches the annotation.""" - if annotation == typing.Any: - return - - NoneType = type(None) - if annotation == NoneType: - if value is not None: - raise TypeError('Expected None for {arg_name}') - - return - - basic_types = {bool, int, str, float} - if annotation in basic_types: - if not isinstance(value, annotation): - raise TypeError( - f'Expected type {annotation.__name__} for {arg_name}') - - return - - # '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) - return - except TypeError: - pass - - raise TypeError(f'Expected one of unioned types for {arg_name}') - - # '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}') - - for index, inner_item in enumerate(value): - _assert_valid_type(f'{arg_name}[{index}]', inner_item, - annotation.__args__[0]) - - return - - # '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}') - - for inner_key, inner_value in value.items(): - _assert_valid_type(f'{arg_name}[{inner_key}]', inner_key, - annotation.__args__[0]) - _assert_valid_type(f'{arg_name}[{inner_value}]', inner_value, - annotation.__args__[1]) - - return - - raise TypeError('Unsupported annotation type') - +from plinth.actions import privileged_main if __name__ == '__main__': - main() + privileged_main() diff --git a/conftest.py b/conftest.py index 244b98ade..495bc791f 100644 --- a/conftest.py +++ b/conftest.py @@ -1,255 +1,10 @@ # SPDX-License-Identifier: AGPL-3.0-or-later """ -pytest configuration for all tests. +pytest configuration that needs to be pytest rootdir. """ -import importlib -import os -import pathlib -import sys - -import pytest - -try: - importlib.import_module('splinter') - importlib.import_module('selenium') - _functional_libs_available = True -except ImportError: - _functional_libs_available = False - - -def pytest_ignore_collect(path, config): - """Ignore functional tests when splinter is not available.""" - if path.basename == 'test_functional.py': - return not _functional_libs_available - def pytest_addoption(parser): """Add a command line option to run functional tests.""" parser.addoption('--include-functional', action='store_true', default=False, help='Run functional tests also') - - -def pytest_collection_modifyitems(config, items): - """Filter out specificly marked tests unless explicitly requested. - - The EXTENDED_TESTING environment variable is borrowed from the Lancaster - consensus met by the Pearl community. See - https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/lancaster-consensus.md - """ - - def skip(item, reason): - item.add_marker(pytest.mark.skip(reason=reason)) - - extended = 'EXTENDED_TESTING' in os.environ - if not (extended or config.getoption('--include-functional')): - for item in items: - if 'functional' in item.keywords or ( - item.parent.fspath.basename - and item.parent.fspath.basename == 'test_functional.py'): - skip(item, '--include-functional not provided') - - if not extended: - for item in items: - if 'heavy' in item.keywords: - skip(item, ('Takes too much time. ' - 'Set EXTENDED_TESTING=1 to force run')) - - -@pytest.fixture(name='load_cfg') -def fixture_load_cfg(): - """Load test configuration.""" - from plinth import cfg - - keys = ('file_root', 'config_dir', 'data_dir', 'custom_static_dir', - 'store_file', 'actions_dir', 'doc_dir', 'server_dir', 'host', - 'port', 'use_x_forwarded_for', 'use_x_forwarded_host', - 'secure_proxy_ssl_header', 'box_name', 'develop') - saved_state = {} - for key in keys: - saved_state[key] = getattr(cfg, key) - - root_dir = pathlib.Path(__file__).resolve().parent - cfg_file = root_dir / 'plinth' / 'develop.config' - cfg.read_file(str(cfg_file)) - yield cfg - - for key in keys: - setattr(cfg, key, saved_state[key]) - - -@pytest.fixture(name='develop_mode') -def fixture_develop_mode(load_cfg): - """Turn on development mode for a test.""" - load_cfg.develop = True - yield - load_cfg.develop = False - - -@pytest.fixture(name='needs_root', scope='session') -def fixture_needs_root(): - """Skip test if not running in root mode.""" - if os.geteuid() != 0: - pytest.skip('Needs to be root') - - -@pytest.fixture(name='needs_not_root', scope='session') -def fixture_needs_not_root(): - """Skip test if running in root mode.""" - if os.geteuid() == 0: - pytest.skip('Needs not to be root') - - -@pytest.fixture(name='needs_sudo') -def fixture_needs_sudo(): - """Skip test if sudo command is not available.""" - if not os.path.isfile('/usr/bin/sudo'): - pytest.skip('Needs sudo command installed.') - - -@pytest.fixture(scope='session') -def splinter_selenium_implicit_wait(): - """Disable implicit waiting.""" - return 0 - - -@pytest.fixture(scope='session') -def splinter_wait_time(): - """Disable explicit waiting.""" - return 0.01 - - -@pytest.fixture(scope='session') -def splinter_browser_load_condition(): - """When a page it loaded, wait until is available.""" - - def _load_condition(browser): - if browser.url == 'about:blank': - return True - - ready_state = browser.execute_script('return document.readyState;') - return ready_state == 'complete' - - return _load_condition - - -@pytest.fixture(name='actions_module', scope='module') -def fixture_actions_module(request): - """Import and return an action module.""" - actions_name = getattr(request.module, 'actions_name') - actions_file = str( - pathlib.Path(__file__).parent / 'actions' / actions_name) - - loader = importlib.machinery.SourceFileLoader(actions_name, actions_file) - spec = importlib.util.spec_from_loader(actions_name, loader) - module = importlib.util.module_from_spec(spec) - sys.modules[actions_name] = module - spec.loader.exec_module(module) - return module - - -@pytest.fixture(name='mock_privileged') -def fixture_mock_privileged(request): - """Mock the privileged decorator to nullify its effects.""" - try: - privileged_modules_to_mock = request.module.privileged_modules_to_mock - except AttributeError: - raise AttributeError( - 'mock_privileged fixture requires "privileged_module_to_mock" ' - 'attribute at module level') - - for module_name in privileged_modules_to_mock: - module = importlib.import_module(module_name) - for name, member in module.__dict__.items(): - wrapped = getattr(member, '__wrapped__', None) - if not callable(member) or not wrapped: - continue - - if not getattr(member, '_privileged', False): - continue - - setattr(wrapped, '_original_wrapper', member) - module.__dict__[name] = wrapped - - yield - - for module_name in privileged_modules_to_mock: - module = importlib.import_module(module_name) - for name, member in module.__dict__.items(): - wrapper = getattr(member, '_original_wrapper', None) - if not callable(member) or not wrapper: - continue - - module.__dict__[name] = wrapper - - -@pytest.fixture(name='splinter_screenshot_dir', scope='session') -def fixture_splinter_screenshot_dir(request): - """Set default screenshot directory to ./screenshots. - - This can be overridden using --splinter-screenshot-dir=foo as the option. - """ - option = request.config.getoption('--splinter-screenshot-dir') - screenshots_dir = option if option != '.' else './screenshots' - return os.path.abspath(screenshots_dir) - - -@pytest.fixture(autouse=True) -def fixture_fix_session_browser_screenshots(request): - """Fix a bug in pytest-splinter for screenshots. - - When using session_browser, pytest-splinter does not take a screenshot when - a test has failed. It is uses internal pytest API on the FixtureRequest - object. This API was removed in later versions of pytest causing the - failure. Re-implement the fixture that has the problem fixing this issue. - - Drop this fixture after a fix is merged and released in pytest-splinter. - See: https://github.com/pytest-dev/pytest-splinter/pull/157 - """ - yield - - if not request.config.pluginmanager.has_plugin('pytest-splinter'): - return - - session_tmpdir = request.getfixturevalue('session_tmpdir') - splinter_session_scoped_browser = request.getfixturevalue( - 'splinter_session_scoped_browser') - splinter_make_screenshot_on_failure = request.getfixturevalue( - 'splinter_make_screenshot_on_failure') - splinter_screenshot_dir = request.getfixturevalue( - 'splinter_screenshot_dir') - splinter_screenshot_getter_html = request.getfixturevalue( - 'splinter_screenshot_getter_html') - splinter_screenshot_getter_png = request.getfixturevalue( - 'splinter_screenshot_getter_png') - splinter_screenshot_encoding = request.getfixturevalue( - 'splinter_screenshot_encoding') - - # Screenshot for function scoped browsers is handled in - # browser_instance_getter - if not splinter_session_scoped_browser: - return - - for name in request.fixturenames: - fixture_def = request._fixture_defs.get(name) - if not fixture_def or not fixture_def.cached_result: - continue - - value = fixture_def.cached_result[0] - should_take_screenshot = (hasattr(value, "__splinter_browser__") - and splinter_make_screenshot_on_failure - and getattr(request.node, 'splinter_failure', - True)) - - from pytest_splinter import plugin - if should_take_screenshot: - plugin._take_screenshot( - request=request, - fixture_name=name, - session_tmpdir=session_tmpdir, - browser_instance=value, - splinter_screenshot_dir=splinter_screenshot_dir, - splinter_screenshot_getter_html=splinter_screenshot_getter_html, - splinter_screenshot_getter_png=splinter_screenshot_getter_png, - splinter_screenshot_encoding=splinter_screenshot_encoding, - ) diff --git a/debian/changelog b/debian/changelog index 566fecbd3..af472c7a3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,86 @@ +freedombox (24.7) unstable; urgency=medium + + [ Sunil Mohan Adapa ] + * actions: Move most of the privileged action code to main directory + * tests: Remove unused fixture for testing actions + * tests: Move test configuration to plinth directory + * tests: Merge actions related test files + * tests: Automatically create pytest marks for apps + * users: Add email address field when creating/updating user accounts + * users: Add email address field during first boot + * system: Organize items into sections + * views: Fix alignment of close button in error messages + * actions: Minor refactor to action error logging + * actions: Provide HTML error message with action error + * views: Implement a utility to easily show error message + * middleware: Show HTML exception message as extra detail in messages + * package: Drop special error message handling for package errors + * backups: Adjust to changes in privileged errors + * letsencrypt: Simplify error warning when certificate revoke fails + * letsencrypt: Show better error messages + * storage: Adjust to changes in privileged errors + * letsencrypt: Remove unnecessary processing of the error messages + * storage: Show better error message + * upgrades: Show better error messages + * snapshot: Show better error messages + * package: Don't remove packages of other apps on uninstall + * matrixsynapse: Prevent setup page from being shown during uninstall + + [ Veiko Aasa ] + * samba: Fix Samba not accessible from IPv6 localhost ::1 address + * samba: Disable nmbd NetBIOS service + + [ James Valleroy ] + * locale: Update translation strings + * doc: Fetch latest manual + + -- James Valleroy Mon, 25 Mar 2024 21:12:59 -0400 + +freedombox (24.6) unstable; urgency=medium + + [ Veiko Aasa ] + * gitweb: Fix modifying git repositories when gitweb app is disabled + * users: tests: Do not remove LDAP user when testing views + * samba: Ignore non-existent users who are in freedombox-share group + + [ ikmaak ] + * Translated using Weblate (Dutch) + + [ James Valleroy ] + * diagnostics: Add tests for get_results + * diagnostics: Handle TypeError when copying results + * locale: Update translation strings + * doc: Fetch latest manual + + [ Sunil Mohan Adapa ] + * users: Fix creating users with initial set of groups + * users: Minor refactor when creating django groups + * log: Don't log with in color inside actions scripts + * actions: Fix log message when action return can't be decoded + * actions: When action errors out, log a better message + * *: Add type hints for app init methods + * *: Add type hints for diagnose method + * action_utils: Implement method for starting a service temporarily + * zoph: Don't fail setup if mysql installed but not running + * wordpress: Don't fail setup if mysql installed but not running + * app: Add ability to hide configuration form when app is disabled + * zoph: Hide configuration form when app is disabled + * app: views: Expose method to get enabled/disabled state and cache it + * zoph: Don't redirect to setup page when app is disabled + * zoph: Don't fail with backup/restore if app is disabled + * zoph: Uninstall fully so that reinstall works + * daemon: Added method to ensure a daemon is running in component + * zoph: Ensure that database server is running when setting up app + * wordpress: Fix backup, restore and uninstall when db is not running + * wordpress: Drop database user when app is uninstalled + * tests: functional: Uninstall app after backup and before restore + * zoph: Restore database password to old value after restore operation + * wordpress: tests: Uninstall app after backup and before restore + * tests: functional: Refactor install/setup fixture for apps + * wordpress: Fix minor issue in restoring database + + -- James Valleroy Mon, 11 Mar 2024 20:40:48 -0400 + freedombox (24.5~bpo12+1) bookworm-backports; urgency=medium * Rebuild for bookworm-backports. diff --git a/doc/dev/reference/components/index.rst b/doc/dev/reference/components/index.rst index ad3fd9d97..0e523cba7 100644 --- a/doc/dev/reference/components/index.rst +++ b/doc/dev/reference/components/index.rst @@ -37,8 +37,8 @@ Base Classes Other Classes ^^^^^^^^^^^^^ -.. autoclass:: plinth.modules.diagnostics.check.DiagnosticCheck +.. autoclass:: plinth.diagnostic_check.DiagnosticCheck :members: -.. autoclass:: plinth.modules.diagnostics.check.Result +.. autoclass:: plinth.diagnostic_check.Result :members: diff --git a/doc/manual/en/Debian.raw.wiki b/doc/manual/en/Debian.raw.wiki index e6d612984..6fe9a19e8 100644 --- a/doc/manual/en/Debian.raw.wiki +++ b/doc/manual/en/Debian.raw.wiki @@ -13,7 +13,7 @@ !FreedomBox is a [[DebianPureBlends|pure blend]] of Debian. This means that all the work on !FreedomBox is available in Debian as packages. It also means that any machine running Debian can be turned into a !FreedomBox. -This page describes the process of installing !FreedomBox on a Debian system. Currently, !FreedomBox works in Debian Stable (Bullseye), Testing (Bookworm), and Unstable (Sid). +This page describes the process of installing !FreedomBox on a Debian system. Currently, !FreedomBox works in Debian Stable (bookworm), Testing (trixie), and Unstable (sid). '''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this approach. @@ -29,11 +29,11 @@ Installing !FreedomBox changes your Debian system in many important ways. This After !FreedomBox is fully setup, your system will no longer allow users not belonging to the ''admin'' group to log in to the system via console, secure shell (SSH) or graphical login. This behaviour can be disabled from the [[FreedomBox/Manual/Security|Security]] page. Use the administrator account created during !FreedomBox first boot for console logins and add further user accounts to ''admin'' group, if necessary. }}} -=== Installing on Debian 11 (Bullseye) or newer === +=== Installing on Debian 12 (bookworm) or newer === Check the Troubleshooting section below, for any tips or workarounds that might help during the install. - 1. [[InstallingDebianOn|Install Debian]] 11 (Bullseye), or Unstable (Sid) on your hardware. + 1. [[InstallingDebianOn|Install Debian]] 12 (bookworm), or Unstable (sid) on your hardware. 1. Update your package list. diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index 696ddcd00..276d2b4e5 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -8,6 +8,81 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 24.7 (2024-03-25) == + +=== Highlights === + + * package: Don't remove packages of other apps on uninstall + * samba: Fix Samba not accessible from IPv6 localhost ::1 address + * system: Organize items into sections + * users: Add email address field when creating/updating user accounts + +=== Other Changes === + + * actions: Minor refactor to action error logging + * actions: Move most of the privileged action code to main directory + * actions: Provide HTML error message with action error + * backups: Adjust to changes in privileged errors + * letsencrypt: Remove unnecessary processing of the error messages + * letsencrypt: Show better error messages + * letsencrypt: Simplify error warning when certificate revoke fails + * matrixsynapse: Prevent setup page from being shown during uninstall + * middleware: Show HTML exception message as extra detail in messages + * package: Drop special error message handling for package errors + * samba: Disable nmbd NetBIOS service + * snapshot: Show better error messages + * storage: Adjust to changes in privileged errors + * storage: Show better error message + * tests: Automatically create pytest marks for apps + * tests: Merge actions related test files + * tests: Move test configuration to plinth directory + * tests: Remove unused fixture for testing actions + * upgrades: Show better error messages + * users: Add email address field during first boot + * views: Fix alignment of close button in error messages + * views: Implement a utility to easily show error message + +== FreedomBox 24.6 (2024-03-11) == + +=== Highlights === + + * gitweb: Fix modifying git repositories when gitweb app is disabled + * users: Fix creating users with initial set of groups + * wordpress: + * Don't fail setup if mysql installed but not running + * Drop database user when app is uninstalled + * Fix backup, restore and uninstall when db is not running + * zoph: + * Don't fail setup if mysql installed but not running + * Don't fail with backup/restore if app is disabled + * Don't redirect to setup page when app is disabled + * Ensure that database server is running when setting up app + * Hide configuration form when app is disabled + * Restore database password to old value after restore operation + * Uninstall fully so that reinstall works + +=== Other Changes === + + * *: Add type hints for app init methods + * *: Add type hints for diagnose method + * action_utils: Implement method for starting a service temporarily + * actions: Fix log message when action return can't be decoded + * actions: When action errors out, log a better message + * app: Add ability to hide configuration form when app is disabled + * app: views: Expose method to get enabled/disabled state and cache it + * daemon: Added method to ensure a daemon is running in component + * diagnostics: Add tests for get_results + * diagnostics: Handle !TypeError when copying results + * locale: Update translations for Dutch + * log: Don't log with in color inside actions scripts + * samba: Ignore non-existent users who are in freedombox-share group + * tests: functional: Refactor install/setup fixture for apps + * tests: functional: Uninstall app after backup and before restore + * users: Minor refactor when creating django groups + * users: tests: Do not remove LDAP user when testing views + * wordpress: Fix minor issue in restoring database + * wordpress: tests: Uninstall app after backup and before restore + == FreedomBox 24.5 (2024-02-26) == * backups: tests: Don't use pytest marks on fixtures diff --git a/doc/manual/en/SecureShell.raw.wiki b/doc/manual/en/SecureShell.raw.wiki index aab11eb43..8a01df5a0 100644 --- a/doc/manual/en/SecureShell.raw.wiki +++ b/doc/manual/en/SecureShell.raw.wiki @@ -40,17 +40,37 @@ The "fbx" user also has superuser privileges via ``sudo``. === Logging In === -==== Local ==== +==== Who can log in to FreedomBox by SSH? ==== +!FreedomBox administrative users may use SSH to to log in to !FreedomBox. The user 'fbx' is created by !FreedomBox and is an administrative super-user. There are options which allow ordinary users to log in: + * SSH access can be granted to specific users in the Edit User page by selecting the option, "Remotely login using Secure Shell (SSH) (freedombox-ssh)" + * SSH access can be granted globally to all users in the SSH configuration page by selecting the, "Allow all users to login remotely," option. + +With a new !FreedomBox you may log in as fbx using ssh, and other ordinary users will be able to log in after adjusting the user or Secure Shell settings above in this section. The root user account will have no password set and will not be able to log in. + +==== SSH Client Software ==== +SSH client in included in many operating systems including Linux, Microsoft Windows, and Apple MacOS. SSH is included in Chromebooks, but requires some configuration by the user. In most cases you can run SSH from a terminal or command prompt as shown here, using your !FreedomBox hostname or IP address: +{{{ +$ ssh freedombox.local +}}} + +If your client computer does not have SSH available, PuTTY is a popular free software client program which complies with the Debian Free Software Guidelines. PuTTY has a graphical interface to remember and manage your SSH connections. See External links below for more information about PuTTY. + +===== Cockpit as an SSH Alternative ===== +The Cockpit Server Administration Terminal app available from the Cockpit Tools menu is an alternative shell access tool to SSH. Like SSH your connection to a !FreedomBox terminal is secured. Cockpit is a good choice for users who do not wish to enable the SSH server or those who prefer to connect through a web browser. With either tool you will be presented with the !FreedomBox bash command line interface. + +Some users prefer to run SSH instead of, or in addition to, Cockpit. Command shell users tend to like SSH because it's something that they are already using. Users with Linux or Unix system administration experience tend to rely on this connection method because it is a simpler service which is thought to be more likely to be available if problems arise. + +Refer to the Let's Encrypt and Cockpit sections of this manual to configure Cockpit and SSL certificates for security. + +==== SSH over Local Network ==== To login via SSH, to your !FreedomBox: {{{ -$ ssh fbx@freedombox +$ ssh fbx@freedombox.local }}} -Replace `fbx` with the name of the user you wish to login as. `freedombox` should be replaced with the hostname or IP address of you !FreedomBox device as found in the [[FreedomBox/Manual/QuickStart|Quick Start]] process. - -`fbx` is the default user present on !FreedomBox with superuser privileges. Any other user created using !FreedomBox and belonging to the group `admin` will be able to login. The `root` account has no password set and will not be able to login. Access will be denied to all other users. +Replace `fbx` with the name of the user you wish to login as. `freedombox` should be replaced with the hostname or IP address of you !FreedomBox device as found in the [[FreedomBox/Manual/QuickStart|Quick Start]] process. `fbx` and users in `admin` group will also be able to login on the terminal directly. Other users will be denied access. @@ -145,11 +165,150 @@ $ passwd This will ask you for your current password before giving you the opportunity to set a new one. +=== SSH Keys === +The next step for SSH security and convenience is to understand and use ssh keys. If you logged in to !FreedomBox the first time using ssh following the instructions above you specified a username and password to log in. In this section you'll learn about Server Fingerprints and host keys, authorized keys, and reasons to use these to make connection easier and more secure. + +By default SSH is configured to prefer to use keys while still allowing you to use a username and password to log in. At the end of this section you will be able to: + * Connect to !FreedomBox and know that you are connecting to the right computer. + * Connect instantly without giving a username and password. + * Further improve the security of your !FreedomBox by disabling SSH password authentication. + +==== SSH Public and Private Keys ==== +SSH keys are generated in pairs called a key pair. There is a public key and a private key for each key pair. The public key encrypts data which can only be read using the private key, and the private key encrypts data which can only be read using the public key. This is called an asymmetric cryptography system. SSH will distribute your public keys automatically to the other connected system while keeping your private keys safe. + +Using SSH keys creates a powerful set of security features: + * You are assured that you are connected to your !FreedomBox. + * Nobody will be able to read or modify your ssh communication to !FreedomBox. + * The !FreedomBox SSH server will know you are the remote user connected. + * Nobody will be able to read or modify your ssh communication from !FreedomBox. + * Connection is automatic with no username or password. + * Your !FreedomBox can block any password guessing attack. + +==== Create your personal SSH keys on your client computer using ssh-keygen ==== +You will create an SSH key pair on your client computer. We'll use the defaults and will not specify a password. Just press the Enter key when you are prompted for an SSH key password. This is very simple using the ssh-keygen command with no arguments. Here is how to run the command and a sample of the output the ssh-keygen program will give to you: +{{{ +$ ssh-keygen +Generating public/private rsa key pair. +Enter file in which to save the key (/home/username/.ssh/id_rsa): +Created directory '/home/username/.ssh'. +Enter passphrase (empty for no passphrase): +Enter same passphrase again: +Your identification has been saved in /home/username/.ssh/id_rsa +Your public key has been saved in /home/username/.ssh/id_rsa.pub +The key fingerprint is: +SHA256:nHcTP5DBKxBOgt8BFMyb2QUs//t8ge+8vw2zjOuE71U username@clientpc +The key's randomart image is: ++---[RSA 3072]----+ +| ==++o .. | +| . +++ . .o | +| . O.+ +. | +| =.+.. .+ | +| S...o.o E| +| ..o...o | +| ....+. | +| .+ =o+.| +| +O+*++| ++----[SHA256]-----+ +}}} +That's all you need to do. You now have a personal SSH key pair on your client computer. + +==== Verify your FreedomBox Server Fingerprint ==== +On your first time connecting to !FreedomBox using ssh you may have noticed a message similar to this: +{{{ +$ ssh fbx@freedombox.local +The authenticity of host 'freedombox.local (192.168.1.4)' can't be established. +ED25519 key fingerprint is SHA256:TwJFdepq7OaTXcycoYfYE8/lRtuOxUGCrst0K/RUh4E. +This key is not known by any other names. +Are you sure you want to continue connecting (yes/no/[fingerprint])? +}}} +There are a few things to understand about this message: + * SSH is telling you that you have never connected to this server before and SSH cannot guarantee that this server is safe for you to use. + * You have an opportunity to tell SSH that this new server is known to you and safe to use by indicating, 'yes.' + * SSH has received an encryption key to communicate securely with this server (even if we're not certain which with server we're communicating with). + * SSH is giving you a piece of information that you will use to confirm that the remote SSH server is in fact your !FreedomBox. + +Go to !FreedomBox in your web browser. Click on the System menu, and then Secure Shell. The second section of this page is, Server Fingerprints. There is an ED25519 key entry on this page: +||'''Algorithm'''||'''Fingerprint'''|| +||RSA||SHA256:ZGvgdxiDEpGKdw82Z6z0QRmDpT3Vgi07Ghba5IBJ4tQ|| +||ECDSA||SHA256:BLMMfPxNHpHF0sqCazAwE6ONdLtMY+W2yrgjP7AeXcQ|| +||ED25519||SHA256:TwJFdepq7OaTXcycoYfYE8/lRtuOxUGCrst0K/RUh4E|| +Compare the ED25519 fingerprint on the !FreedomBox Secure Shell page with the ED25519 fingerprint received by the ssh client in the first-connection example above. If these fingerprints are the same then you may be confident that you are connecting to your !FreedomBox. + +If you'd like to walk through these steps but you have already made the first connection, you can reset that. Issue this command on your ssh client computer. +{{{ +$ ssh-keygen -R freedombox.local +}}} +This removes the record of your known connection to !FreedomBox. Now open your Secure Shell system configuration page on !FreedomBox to the Server Fingerprints section. Next connect to !FreedomBox with your ssh client and properly verify the server fingerprint before indicating yes to the host authenticity question. Having done this correctly you can be certain that when you make an SSH connection to !FreedomBox you are connecting to your server. + +Each time you connect to a new SSH server you will be given the opportunity to verify the server fingerprint. If you connect to !FreedomBox using different names or IP address (local IP, DNS name, Pagekite name, TOR .onion address...) you will be asked once for each name or address, but the fingerprint will not change. + +Your server fingerprints are not private information. The fingerprint is a summary of a public key shared by the server which is used encrypt information sent to the SSH server. Your server public key is also not private information. You could share fingerprints and public keys with the world and the security of your !FreedomBox will not be diminished. + +==== Share your personal SSH key with FreedomBox using ssh-copy-id ==== +By now you have a personal key pair, and you have verified the identity of !FreedomBox. !FreedomBox still does not know about your identity, and will ask you for your password when you try to log in by ssh. The ssh-copy-id program will tell !FreedomBox to accept your personal key as your password. +{{{ +$ ssh-copy-id username@freedombox.local +/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed +/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys +username@freedombox.local's password: + +Number of key(s) added: 1 + +Now try logging into the machine, with: "ssh 'username@freedombox.local'" +and check to make sure that only the key(s) you wanted were added. +}}} +This step adds your personal public key to your user account on !FreedomBox. With this step complete the !FreedomBox SSH server will compare the key sent by the client computer with the key stored on !FreedomBox. If these match then you will be logged in without the need to give a password. Try it now: +{{{ +$ ssh freedombox.local +Linux freedombox 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64 + + .--._ _.--. + ( \ / ) + \ /\ / + \_ \/ _/ + / \ + ( /\ ) + `--' `--' + + FreedomBox + +FreedomBox is a pure blend of Debian GNU/Linux. Web interface is available at +https://localhost/ . FreedomBox manual is available in /usr/share/doc/freedombox +and from the web interface. + +The programs included with the Debian GNU/Linux system are free software; +the exact distribution terms for each program are described in the +individual files in /usr/share/doc/*/copyright. + +Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent +permitted by applicable law. +You have new mail. +Last login: Sun Mar 17 14:27:03 2024 from 192.168.144.101 +username@freedombox:~$ +}}} + +Once you have added your client SSH key to !FreedomBox you will be able to connect using that one key by every method of addressing your !FreedomBox: + * Local network name + * Local network IP address + * ISP Public IP address + * DNS name if you are using Dynamic DNS + * Pagekite name if you are using Pagekite + * TOR .onion address if you are using TOR + +==== Block SSH password guessing attempts by disabling password authentication ==== +Once you are able to connect to !FreedomBox by ssh using a key and not entering a password you can take a step to improve the security of !FreedomBox. If your !FreedomBox is accessible from the internet you may notice that there are repeated attempts to log in to your !FreedomBox from the internet. A good password is your first line of defense, and !FreedomBox has additional features which protect you from these intrusion attempts. You can stop this nonsense completely by disabling password authentication for Secure Shell. + +Go to your !FreedomBox System menu. Click the Secure Shell configuration link. Look under '''Configuration''' and select, "Disable password authentication" + [x] Disable password authentication + +Click the, "Update setup," button and it's done. This will stop all password guessing intrusion attempts using ssh. You can log in using your key, and nobody else will be able to log in by guessing a password. === External links === + * Debian SSH wiki: https://wiki.debian.org/SSH * Upstream project: https://www.openssh.com * User documentation: https://www.openssh.com/manual.html + * PuTTY Client Software: https://www.chiark.greenend.org.uk/~sgtatham/putty/ ## END_INCLUDE diff --git a/doc/manual/es/Debian.raw.wiki b/doc/manual/es/Debian.raw.wiki index e6d612984..6fe9a19e8 100644 --- a/doc/manual/es/Debian.raw.wiki +++ b/doc/manual/es/Debian.raw.wiki @@ -13,7 +13,7 @@ !FreedomBox is a [[DebianPureBlends|pure blend]] of Debian. This means that all the work on !FreedomBox is available in Debian as packages. It also means that any machine running Debian can be turned into a !FreedomBox. -This page describes the process of installing !FreedomBox on a Debian system. Currently, !FreedomBox works in Debian Stable (Bullseye), Testing (Bookworm), and Unstable (Sid). +This page describes the process of installing !FreedomBox on a Debian system. Currently, !FreedomBox works in Debian Stable (bookworm), Testing (trixie), and Unstable (sid). '''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this approach. @@ -29,11 +29,11 @@ Installing !FreedomBox changes your Debian system in many important ways. This After !FreedomBox is fully setup, your system will no longer allow users not belonging to the ''admin'' group to log in to the system via console, secure shell (SSH) or graphical login. This behaviour can be disabled from the [[FreedomBox/Manual/Security|Security]] page. Use the administrator account created during !FreedomBox first boot for console logins and add further user accounts to ''admin'' group, if necessary. }}} -=== Installing on Debian 11 (Bullseye) or newer === +=== Installing on Debian 12 (bookworm) or newer === Check the Troubleshooting section below, for any tips or workarounds that might help during the install. - 1. [[InstallingDebianOn|Install Debian]] 11 (Bullseye), or Unstable (Sid) on your hardware. + 1. [[InstallingDebianOn|Install Debian]] 12 (bookworm), or Unstable (sid) on your hardware. 1. Update your package list. diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index 696ddcd00..276d2b4e5 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -8,6 +8,81 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 24.7 (2024-03-25) == + +=== Highlights === + + * package: Don't remove packages of other apps on uninstall + * samba: Fix Samba not accessible from IPv6 localhost ::1 address + * system: Organize items into sections + * users: Add email address field when creating/updating user accounts + +=== Other Changes === + + * actions: Minor refactor to action error logging + * actions: Move most of the privileged action code to main directory + * actions: Provide HTML error message with action error + * backups: Adjust to changes in privileged errors + * letsencrypt: Remove unnecessary processing of the error messages + * letsencrypt: Show better error messages + * letsencrypt: Simplify error warning when certificate revoke fails + * matrixsynapse: Prevent setup page from being shown during uninstall + * middleware: Show HTML exception message as extra detail in messages + * package: Drop special error message handling for package errors + * samba: Disable nmbd NetBIOS service + * snapshot: Show better error messages + * storage: Adjust to changes in privileged errors + * storage: Show better error message + * tests: Automatically create pytest marks for apps + * tests: Merge actions related test files + * tests: Move test configuration to plinth directory + * tests: Remove unused fixture for testing actions + * upgrades: Show better error messages + * users: Add email address field during first boot + * views: Fix alignment of close button in error messages + * views: Implement a utility to easily show error message + +== FreedomBox 24.6 (2024-03-11) == + +=== Highlights === + + * gitweb: Fix modifying git repositories when gitweb app is disabled + * users: Fix creating users with initial set of groups + * wordpress: + * Don't fail setup if mysql installed but not running + * Drop database user when app is uninstalled + * Fix backup, restore and uninstall when db is not running + * zoph: + * Don't fail setup if mysql installed but not running + * Don't fail with backup/restore if app is disabled + * Don't redirect to setup page when app is disabled + * Ensure that database server is running when setting up app + * Hide configuration form when app is disabled + * Restore database password to old value after restore operation + * Uninstall fully so that reinstall works + +=== Other Changes === + + * *: Add type hints for app init methods + * *: Add type hints for diagnose method + * action_utils: Implement method for starting a service temporarily + * actions: Fix log message when action return can't be decoded + * actions: When action errors out, log a better message + * app: Add ability to hide configuration form when app is disabled + * app: views: Expose method to get enabled/disabled state and cache it + * daemon: Added method to ensure a daemon is running in component + * diagnostics: Add tests for get_results + * diagnostics: Handle !TypeError when copying results + * locale: Update translations for Dutch + * log: Don't log with in color inside actions scripts + * samba: Ignore non-existent users who are in freedombox-share group + * tests: functional: Refactor install/setup fixture for apps + * tests: functional: Uninstall app after backup and before restore + * users: Minor refactor when creating django groups + * users: tests: Do not remove LDAP user when testing views + * wordpress: Fix minor issue in restoring database + * wordpress: tests: Uninstall app after backup and before restore + == FreedomBox 24.5 (2024-02-26) == * backups: tests: Don't use pytest marks on fixtures diff --git a/doc/manual/es/SecureShell.raw.wiki b/doc/manual/es/SecureShell.raw.wiki index 94039d846..4414578a8 100644 --- a/doc/manual/es/SecureShell.raw.wiki +++ b/doc/manual/es/SecureShell.raw.wiki @@ -38,8 +38,39 @@ Hay un script incluído en el programa `freedom-maker` que permite establecer la El usuario "fbx" también tiene privilegios de superusuario mediante ``sudo``. === Ingresando === + +==== ¿Quién puede ingresar a FreedomBox por SSH? ==== -==== Local ==== +Los usuarios administradores de !FreedomBox pueden usar SSH para ingresar. !FreedomBox crea el superusuario 'fbx'. Hay opciones que permiten ingresar a usuarios normales: + * Se puede otorgar individualmente permiso de acceso por SSH a usuarios concretos en la página Editar Usuario seleccionando la opción ''Ingreso remoto usando Secure Shell (SSH) (freedombox-ssh)''. + * Se puede otorgar permiso de acceso por SSH en masa a todos los usuarios en la página de configuración de SSH seleccionando la opción ''Permitir el ingreso remoto por SSH a todos los usuarios''. + +En una !FreedomBox nueva puedes ingresar con SSH como fbx y los demás usuarios normales podrán hacerlo tras ajustar sus cuentas o la configuración de la Shell Segura arriba en esta sección. +La cuenta de usuario root no podrá ingresar al no tener contraseña. + +==== Software Cliente SSH ==== + +Muchos sistemas operativos, incluyendo Linux, Windows de Microsoft y MacOS de Apple incluyen clientes SSH. SSH se incluye en ''Chromebooks'' pero requiere que el usuario lo configure. +En la mayoría de los casos puedes ejecutar SSH desde la terminal o línea de órdenes como se muestra aquí, usando el nombre de la máquina de !FreedomBox o su dirección IP: +{{{ +$ ssh freedombox.local +}}} + +Si tu cliente no tiene SSH disponible, PuTTY es un cliente SSH popular y es software libre conforme a las Directrices de Debian para Software Libre. +PuTTY tiene una interfaz gráfica para recordar y administrar tus conexiones SSH. Consulta los enlaces externos más abajo para amplisr información acerca de PuTTy. + +===== Cockpit como alternativa a SSH ===== + +La aplicación ''Terminal de Administración de Servidor Cockpit'' disponible en el menú de ''Herramientas Cockpit'' es una herramienta de acceso por terminal alternativa a SSH. +Como con SSH, su conexión al terminal !FreedomBox esta securizada. Cockpit es una buena opción para usuarios que no quieran habilitar el servidor SSH o que prefieran conectar mediante un navegador web. +Com ambas herramientas se te presentará el interfaz de línea de órdenes bash de !FreedomBox. + +Algunos usuarios prefieren ejecutar SSH en vez de o junto a Cockpit. Los usuarios de la consola de órdenes suelen preferir SSH porque ya lo usan. +Los usuarios con experiencia administrando sistemas Linux o Unix suelen preferir este método de conexión porque es un servicio más simple y se cree que es más propenso a permanecer disponible en caso de problemas. + +Para configurar Cockpit y los certificados SSL con seguridad lea las secciones del manual ''Cockpit'' y ''Let's Encrypt'', respectivamente. + +==== SSL en la Red Local ==== Para ingresar mediante SSH a tu !FreedomBox: @@ -114,11 +145,186 @@ $ passwd Esto te preguntará tu contraseña actual antes de darte la oportunidad de establecer la nueva. +=== Claves SSH === + +El siguiente paso para mejorar la seguridad y la comodidad es comprender y empleare las claves SSH. Si la primera vez ingresaste a tu !FreedomBox mediante SSH siguiendo las instrucciones anteriores diste un usuario y una contraseña. +In esta sección aprenderás acerca de huellas de servidor, claves de máquina, claves autorizadas, y los motivos para usarlas securizando la conexión a la vez que la facilitas. + +SSH está configurada por omisión para preferir ingresar con claves mientras te sigue permitiendo emplear un nombre de usuario y contraseña. Al final de esta sección podrás: + * Conectar a !FreedomBox sabiendo que te conectas al ordenador deseado. + * Conectar instantáneamente sin tener que dar usuario y contraseña. + * Mejorar la seguridad de tu !FreedomBox deshabilitando la autenticación a SSH mediante cotraseña. + +==== Claves SSH Públicas y Privadas ==== + +Las claves SSH se generan emparejadas. Cada par par consta de una clave pública y su clave privada correspondiente. +Cada clave cifra los datos de modo que solo se pueden leer con la otra: lo que cifra la privada solo lo descifra la pública y viceversa. +Esto se llama sistema de cifrado asimétrico. SSH mantendrá tus claves privadas seguras y comunicará automáticamente tus claves públicas al otro sistema. + +Empplear claves SSH crea un conjunto potente de características de seguridad: + * Te aseguran que te conectas a tu !FreedomBox (y no a un impostor). + * Nadie más podrá leer ni modificar tu comunicación con !FreedomBox. + * El servicio SSH de !FreedomBox SSH sabrá que eres tú (y no un impostor) el usuario conectado. + * Nadie más podrá leer ni modificar la comunicación de !FreedomBox destinada a tí. + * La conexión es automática sin nombre de usuario ni contraseña. + * Tu !FreedomBox puede bloquear cualquier ataque basado en adivinar tu contraseña. + +==== Crea tus claves SSH personales en tu ordenador cliente usando ssh-keygen ==== + +Crearemos un par de claves SSH tu ordenador cliente usando usando valores por omisión y sin dar una contraseña. +Usa el comando {{{ssh-keygen}}} sin argumentos y cuando se te pida una contraseña introdúcela vacía. +He aquí un ejemplo: + +{{{ +$ ssh-keygen +Generating public/private rsa key pair. +Enter file in which to save the key (/home/username/.ssh/id_rsa): +Created directory '/home/username/.ssh'. +Enter passphrase (empty for no passphrase): +Enter same passphrase again: +Your identification has been saved in /home/username/.ssh/id_rsa +Your public key has been saved in /home/username/.ssh/id_rsa.pub +The key fingerprint is: +SHA256:nHcTP5DBKxBOgt8BFMyb2QUs//t8ge+8vw2zjOuE71U username@clientpc +The key's randomart image is: ++---[RSA 3072]----+ +| ==++o .. | +| . +++ . .o | +| . O.+ +. | +| =.+.. .+ | +| S...o.o E| +| ..o...o | +| ....+. | +| .+ =o+.| +| +O+*++| ++----[SHA256]-----+ +}}} + +Ya tienes un par de claves SSH personales en tu ordenador cliente. + +==== Verificar la Huella de tu Servidor FreedomBox ==== + +La primera vez que te conectes a !FreedomBox se te presentará un mensaje como este: + +{{{ +$ ssh fbx@freedombox.local +No se puede asegurar la autenticidad de 'freedombox.local (192.168.1.4)'. +Su huella ED25519 es SHA256:TwJFdepq7OaTXcycoYfYE8/lRtuOxUGCrst0K/RUh4E. +Esta huella no consta asociada a ningún otro nombre. +¿Seguro que quiere conectar (Si/No/[huella])? +}}} + +Hay varias partes que hay que entender en este mensaje: + * SSH te dice que nunca antes has conectado con este servidor por lo que no puede garantizarte que sea seguro. + * SSH te ofrece la oportunidad de validar este nuevo servidor indicando 'Si'. + * SSH ha recibido una clave de cifrado para comunicar con seguridad con este servidor (aunque no tengamos certeza de a qué máquina nos conectamos). + * SSH te está dando información que usarás para confirmar que el servidor SSH remoto es tu !FreedomBox. + +Vé con tu navegador a !FreedomBox. Entra en el menú de Sistema y luego a Shell Segura. La segunda sección de esta página es Huellas de Servidor y tiene una entrada ED25519: +||'''Algoritmo'''||'''Huella'''|| +||RSA||SHA256:ZGvgdxiDEpGKdw82Z6z0QRmDpT3Vgi07Ghba5IBJ4tQ|| +||ECDSA||SHA256:BLMMfPxNHpHF0sqCazAwE6ONdLtMY+W2yrgjP7AeXcQ|| +||ED25519||SHA256:TwJFdepq7OaTXcycoYfYE8/lRtuOxUGCrst0K/RUh4E|| +Compara la huella ED25519 de la página Shell Segura de tu !FreedomBox con la que ha recibido tu cliente SSH en su primera conexión. Si las huellas coinciden puedes confiar que estás conectando con tu !FreedomBox. + +Me gustaría acompañarte a dar estos pasos pero ... ¿ya has realizado tu primera conexión? Puedes reiniciar el proceso con esta orden en el ordenador de tu cliente SSH. +{{{ +$ ssh-keygen -R freedombox.local +}}} +Esto borra el registro de tu conexión a !FreedomBox. Ahora abre la página de configuración de la Shell Segura en !FreedomBox por la sección de Huellas de Servidor. +A continuación conecta a !FreedomBox con tu cliente SSH y verifica la huella de servidor antes de responder afirmativamente a la pregunta de authenticidad de la máquina. +Hacer esto correctamente te garantiza que cuando conectes mediante SSH a !FreedomBox te conectas al tuyo (y no a otro). + +Cada vez que te conectes a un servidor SSH nuevo para tí se te dará la oportunidad de verificar su huella. +Si te conectas a !FreedomBox usando nombres o direcciones IP diferentes (IP local, nombre DNS, nombre Pagekite, dirección .onion para TOR...) se te preguntará una vez por +cada una pero la huella será siempre la misma. + +Las huellas de tu servidor no son secretas. La huella es una versión resumida de la clave pública que se comparte para que la usen para cifrar la comunicación que se te envía. +Tu clave pública tampoco es secreta. Podrías publicar las huellas y las claves públicas sin afectar un ápice a la seguridad de tu !FreedomBox. + +==== Comparte tu clave SSH personal pública con FreedomBox usando ssh-copy-id ==== + +Ahora que tienes una clave personal y has verificado la identidad de !FreedomBox, éste sigue sin conocer la tuya y te pedirá una contraseña al intentar ingresar mediante SSH. +La orden {{{ssh-copy-id}}} le dirá a !FreedomBox que acepte tu clave personal en vez de tu contraseña. + +{{{ +$ ssh-copy-id username@freedombox.local +/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed +/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys +username@freedombox.local's password: + +Number of key(s) added: 1 + +Now try logging into the machine, with: "ssh 'username@freedombox.local'" +and check to make sure that only the key(s) you wanted were added. +}}} + +Estos pasos emparejan tu clave personal pública a tu cuenta de usuario en !FreedomBox. Al completar este paso el servidor SSH de !FreedomBox comparará la clave que le envía el +ordenador cliente con la que ha guardado !FreedomBox. Si coinciden ingresarás sin necesidad de introducir una contraseña. Compruébalo ahora: + +{{{ +$ ssh freedombox.local +Linux freedombox 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64 + + .--._ _.--. + ( \ / ) + \ /\ / + \_ \/ _/ + / \ + ( /\ ) + `--' `--' + + FreedomBox + +FreedomBox is a pure blend of Debian GNU/Linux. Web interface is available at +https://localhost/ . FreedomBox manual is available in /usr/share/doc/freedombox +and from the web interface. + +The programs included with the Debian GNU/Linux system are free software; +the exact distribution terms for each program are described in the +individual files in /usr/share/doc/*/copyright. + +Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent +permitted by applicable law. +You have new mail. +Last login: Sun Mar 17 14:27:03 2024 from 192.168.144.101 +username@freedombox:~$ +}}} + +Una vez !FreedomBox conoce tu clave pública podrás conectar usándola sin importar cómo te refieras a !FreedomBox: + * Nombre en la red local + * Dirección IP en la red local + * Dirección IP pública de tu proveedor de internet + * Nombre DNS, si usas DNS dinámico + * Nombre Pagekite, si usas Pagekite + * Dirección .onion, si usas TOR + +==== Bloquear intentos de adivinar tu contraseña SSH deshabilitando la autenticación mediante contraseña ==== + +Cuando ya puedas conectar a !FreedomBox por SSH mediante clave SSH sin introducir contraseña puedes dar otro paso para mejorar la seguridad de !FreedomBox. +Si tienes tu !FreedomBox accesible desde internet quizá notes que se repiten intentos de ingreso desde internet. Una buena contraseña es tu primera linea de defensa, +pero !FreedomBox tiene más características para protegerte de estos intentos de intrusión. Puedes atajar por completo este disparate deshabilitando la autenticación +por contraseña para la Shell Segura. +En el menú de ''Sistema'' de tu !FreedomBox elige la ''Configuración de Shell Segura'' y debajo de ''Configuración'' selecciona "Deshabilitar autenticación por contraseña": + + [x] Deshabilitar autenticación por contraseña + +Dale al botón "Actualizar Ajustes". Esto impide cualquier intento de intrusión que quiera adivinar tu contraseña. Podrás ingresar desde este ordenador cliente con tu clave. + +===== Conculsión acerca de la Huella de Servidor ===== + +En esta sección hemos aprendido a encontrar las Huellas de Servidor de la Shell Segura de !FreedomBox. +Hemos verificado la conexión con !FreedomBox comparando la huella recibida por el cliente SSH con la que hay en el servidor SSH de !FreedomBox. +Estos pasos solo se necesitan la primera vez que conectamos con !FreedomBox. +Quizá necesites repetirlos al conectar mediante la dirección IP o los nombres de la máquina en la red local o desde fuera de ella. +En cada caso recibirás la misma Huella de Servidor que podrás verificar la primera vez. === Enlaces externos === * Proyecto original: https://www.openssh.com * Documentación de uso: https://www.openssh.com/manual.html + * Software cliente PuTTY : https://www.chiark.greenend.org.uk/~sgtatham/putty/ + * SSH en el wiki de Debian: https://wiki.debian.org/SSH ## END_INCLUDE diff --git a/plinth/__init__.py b/plinth/__init__.py index 5ccd68a0b..f0715b040 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '24.5' +__version__ = '24.7' diff --git a/plinth/action_utils.py b/plinth/action_utils.py index c3d6945f9..4bf5a1a1b 100644 --- a/plinth/action_utils.py +++ b/plinth/action_utils.py @@ -48,6 +48,20 @@ def service_is_running(servicename): return False +@contextmanager +def service_ensure_running(service_name): + """Ensure a service is running and return to previous state.""" + starting_state = service_is_running(service_name) + if not starting_state: + service_enable(service_name) + + try: + yield starting_state + finally: + if not starting_state: + service_disable(service_name) + + def service_is_enabled(service_name, strict_check=False): """Check if service is enabled in systemd. @@ -275,7 +289,7 @@ def uwsgi_disable(config_name): service_start('uwsgi') -def get_addresses(): +def get_addresses() -> list[dict[str, str | bool]]: """Return a list of IP addresses and hostnames.""" addresses = get_ip_addresses() @@ -309,14 +323,14 @@ def get_addresses(): return addresses -def get_ip_addresses(): +def get_ip_addresses() -> list[dict[str, str | bool]]: """Return a list of IP addresses assigned to the system.""" addresses = [] output = subprocess.check_output(['ip', '-o', 'addr']) for line in output.decode().splitlines(): parts = line.split() - address = { + address: dict[str, str | bool] = { 'kind': '4' if parts[2] == 'inet' else '6', 'address': parts[3].split('/')[0], 'url_address': parts[3].split('/')[0], diff --git a/plinth/actions.py b/plinth/actions.py index b98eebab2..3db73e26c 100644 --- a/plinth/actions.py +++ b/plinth/actions.py @@ -1,6 +1,7 @@ # SPDX-License-Identifier: AGPL-3.0-or-later """Framework to run specified actions with elevated privileges.""" +import argparse import functools import importlib import inspect @@ -8,9 +9,16 @@ import json import logging import os import subprocess +import sys import threading +import traceback +import types +import typing -from plinth import cfg +from plinth import cfg, log, module_loader + +EXIT_SYNTAX = 10 +EXIT_PERM = 20 logger = logging.getLogger(__name__) @@ -124,19 +132,18 @@ def _wait_for_return(module_name, action_name, args, kwargs, log_error, proc, """Communicate with the subprocess and wait for its return.""" json_args = json.dumps({'args': args, 'kwargs': kwargs}) - output, error = proc.communicate(input=json_args.encode()) + stdout, stderr = proc.communicate(input=json_args.encode()) read_thread.join() if proc.returncode != 0: - logger.error('Error executing command - %s, %s, %s', command, output, - error) + logger.error('Error executing command - %s, %s, %s', command, stdout, + stderr) raise subprocess.CalledProcessError(proc.returncode, command) try: return_value = json.loads(b''.join(buffers)) except json.JSONDecodeError: - logger.error( - 'Error decoding action return value %s..%s(*%s, **%s): %s', - module_name, action_name, args, kwargs, return_value) + logger.error('Error decoding action return value %s..%s(*%s, **%s)', + module_name, action_name, args, kwargs) raise if return_value['result'] == 'success': @@ -144,16 +151,68 @@ def _wait_for_return(module_name, action_name, args, kwargs, log_error, proc, module = importlib.import_module(return_value['exception']['module']) exception_class = getattr(module, return_value['exception']['name']) - exception = exception_class(*return_value['exception']['args'], output, - error) + exception = exception_class(*return_value['exception']['args']) + exception.stdout = stdout + exception.stderr = stderr + + def _get_html_message(): + """Return an HTML format error that can be shown in messages.""" + from django.utils.html import format_html + + full_args, exception_args, stdout, stderr, traceback = _format_error( + args, kwargs, exception, return_value) + return format_html('Error running action: {}..{}({}): {}({})\n{}{}{}', + module_name, action_name, full_args, + return_value['exception']['name'], exception_args, + stdout, stderr, traceback) + + exception.get_html_message = _get_html_message + if log_error: - logger.error('Error running action %s..%s(*%s, **%s): %s %s %s', - module_name, action_name, args, kwargs, exception, - exception.args, return_value['exception']['traceback']) + full_args, exception_args, stdout, stderr, traceback = _format_error( + args, kwargs, exception, return_value) + logger.error('Error running action %s..%s(%s): %s(%s)\n' + '%s%s%s', module_name, action_name, full_args, + return_value['exception']['name'], exception_args, stdout, + stderr, traceback) raise exception +def _format_error(args, kwargs, exception, return_value): + """Log the exception in a readable manner.""" + args = [json.dumps(arg) for arg in args] + kwargs = [f'{key}=' + json.dumps(value) for key, value in kwargs.items()] + full_args = ', '.join(args + kwargs) + exception_args = ', '.join([json.dumps(arg) for arg in exception.args]) + + stdout = exception.stdout.decode() + if stdout: + lines = stdout.split('\n') + lines = lines[:-1] if not lines[-1] else lines + stdout = '\n'.join(('│ ' + line for line in lines)) + stdout = 'Stdout:\n' + stdout + '\n' + + stderr = exception.stderr.decode() + if stderr: + lines = stderr.split('\n') + lines = lines[:-1] if not lines[-1] else lines + stderr = '\n'.join(('║ ' + line for line in lines)) + stderr = 'Stderr:\n' + stderr + '\n' + + traceback = return_value['exception']['traceback'] + if traceback: + all_lines = [] + for entry in traceback: + lines = entry.split('\n') + all_lines += lines[:-1] if not lines[-1] else lines + + traceback = '\n'.join(('╞ ' + line for line in all_lines)) + traceback = 'Action traceback:\n' + traceback + '\n' + + return (full_args, exception_args, stdout, stderr, traceback) + + def _thread_reader(read_fd, buffers): """Read from the pipe in a separate thread.""" while True: @@ -198,3 +257,189 @@ def _log_action(module_name, action_name, run_as_user, run_in_background): prompt = f'({run_as_user})$' if run_as_user else '#' suffix = '&' if run_in_background else '' logger.info('%s %s..%s(…) %s', prompt, module_name, action_name, suffix) + + +def privileged_main(): + """Parse arguments for the program spawned as a privileged action.""" + log.action_init() + + parser = argparse.ArgumentParser() + parser.add_argument('module', help='Module to trigger action in') + parser.add_argument('action', help='Action to trigger in module') + parser.add_argument('--write-fd', type=int, default=1, + help='File descriptor to write output to') + parser.add_argument('--no-args', default=False, action='store_true', + help='Do not read arguments from stdin') + args = parser.parse_args() + + try: + try: + arguments = {'args': [], 'kwargs': {}} + if not args.no_args: + input_ = sys.stdin.read() + if input_: + arguments = json.loads(input_) + except json.JSONDecodeError as exception: + raise SyntaxError('Arguments on stdin not JSON.') from exception + + return_value = _privileged_call(args.module, args.action, arguments) + with os.fdopen(args.write_fd, 'w') as write_file_handle: + write_file_handle.write(json.dumps(return_value)) + except PermissionError as exception: + logger.error(exception.args[0]) + sys.exit(EXIT_PERM) + except SyntaxError as exception: + logger.error(exception.args[0]) + sys.exit(EXIT_SYNTAX) + except TypeError as exception: + logger.error(exception.args[0]) + sys.exit(EXIT_SYNTAX) + except Exception as exception: + logger.exception(exception) + sys.exit(1) + + +def _privileged_call(module_name, action_name, arguments): + """Import the module and run action as superuser""" + if '.' in module_name: + raise SyntaxError('Invalid module name') + + cfg.read() + if module_name == 'plinth': + import_path = 'plinth' + else: + import_path = module_loader.get_module_import_path(module_name) + + try: + module = importlib.import_module(import_path + '.privileged') + except ModuleNotFoundError as exception: + raise SyntaxError('Specified module not found') from exception + + try: + action = getattr(module, action_name) + except AttributeError as exception: + raise SyntaxError('Specified action not found') from exception + + if not getattr(action, '_privileged', None): + raise SyntaxError('Specified action is not privileged action') + + func = getattr(action, '__wrapped__') + + _privileged_assert_valid_arguments(func, arguments) + + try: + return_values = func(*arguments['args'], **arguments['kwargs']) + return_value = {'result': 'success', 'return': return_values} + except Exception as exception: + logger.exception('Error executing action: %s', exception) + return_value = { + 'result': 'exception', + 'exception': { + 'module': type(exception).__module__, + 'name': type(exception).__name__, + 'args': exception.args, + 'traceback': traceback.format_tb(exception.__traceback__) + } + } + + return return_value + + +def _privileged_assert_valid_arguments(func, arguments): + """Check the names, types and completeness of the arguments passed.""" + # Check if arguments match types + if not isinstance(arguments, dict): + raise SyntaxError('Invalid arguments format') + + if 'args' not in arguments or 'kwargs' not in arguments: + raise SyntaxError('Invalid arguments format') + + args = arguments['args'] + kwargs = arguments['kwargs'] + if not isinstance(args, list) or not isinstance(kwargs, dict): + raise SyntaxError('Invalid arguments format') + + argspec = inspect.getfullargspec(func) + if len(args) + len(kwargs) > len(argspec.args): + raise SyntaxError('Too many arguments') + + no_defaults = len(argspec.args) + if argspec.defaults: + no_defaults -= len(argspec.defaults) + + for key in argspec.args[len(args):no_defaults]: + if key not in kwargs: + raise SyntaxError(f'Argument not provided: {key}') + + for key, value in kwargs.items(): + if key not in argspec.args: + raise SyntaxError(f'Unknown argument: {key}') + + if argspec.args.index(key) < len(args): + raise SyntaxError(f'Duplicate argument: {key}') + + _privileged_assert_valid_type(f'arg {key}', value, + argspec.annotations[key]) + + for index, arg in enumerate(args): + annotation = argspec.annotations[argspec.args[index]] + _privileged_assert_valid_type(f'arg #{index}', arg, annotation) + + +def _privileged_assert_valid_type(arg_name, value, annotation): + """Assert that the type of argument value matches the annotation.""" + if annotation == typing.Any: + return + + NoneType = type(None) + if annotation == NoneType: + if value is not None: + raise TypeError('Expected None for {arg_name}') + + return + + basic_types = {bool, int, str, float} + if annotation in basic_types: + if not isinstance(value, annotation): + raise TypeError( + f'Expected type {annotation.__name__} for {arg_name}') + + return + + # '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: + _privileged_assert_valid_type(arg_name, value, arg) + return + except TypeError: + pass + + raise TypeError(f'Expected one of unioned types for {arg_name}') + + # '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}') + + for index, inner_item in enumerate(value): + _privileged_assert_valid_type(f'{arg_name}[{index}]', inner_item, + annotation.__args__[0]) + + return + + # '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}') + + for inner_key, inner_value in value.items(): + _privileged_assert_valid_type(f'{arg_name}[{inner_key}]', + inner_key, annotation.__args__[0]) + _privileged_assert_valid_type(f'{arg_name}[{inner_value}]', + inner_value, annotation.__args__[1]) + + return + + raise TypeError('Unsupported annotation type') diff --git a/plinth/app.py b/plinth/app.py index 17927270f..c093ceb32 100644 --- a/plinth/app.py +++ b/plinth/app.py @@ -7,9 +7,10 @@ import collections import enum import inspect import logging -from typing import ClassVar +from typing import ClassVar, TypeAlias from plinth import cfg +from plinth.diagnostic_check import DiagnosticCheck from plinth.signals import post_app_loading from . import clients as clients_module @@ -17,6 +18,8 @@ from . import db logger = logging.getLogger(__name__) +_list_type: TypeAlias = list + class App: """Implement common functionality for an app. @@ -39,6 +42,10 @@ class App: the app. This flag is currently set during backup and restore operations but UI changes are currently not implemented. + 'configure_when_disabled' is a boolean indicating whether the app can + configured while it is disabled. Some apps such those whose configuration + is stored in a database can't be configured while they are disabled because + the database server may not be running when the app is disabled. """ app_id: str | None = None @@ -48,6 +55,8 @@ class App: locked: bool = False # Whether user interaction with the app is allowed. # XXX: Lockdown the application UI by implementing a middleware + configure_when_disabled: bool = True + _all_apps: ClassVar[collections.OrderedDict[ str, 'App']] = collections.OrderedDict() @@ -58,7 +67,7 @@ class App: NEEDS_UPDATE = 'needs-update' UP_TO_DATE = 'up-to-date' - def __init__(self): + def __init__(self) -> None: """Build the app by adding components. App may be built just for the purpose for querying. For example, when @@ -71,7 +80,7 @@ class App: if not self.app_id: raise ValueError('Invalid app ID configured') - self.components = collections.OrderedDict() + self.components: dict[str, Component] = collections.OrderedDict() # Add self to global list of apps self._all_apps[self.app_id] = self @@ -208,11 +217,11 @@ class App: if not component.is_leader: component.set_enabled(enabled) - def diagnose(self): + def diagnose(self) -> _list_type[DiagnosticCheck]: """Run diagnostics and return results. Return value must be a list of results. Each result is a - :class:`~plinth.modules.diagnostics.check.DiagnosticCheck` with a + :class:`~plinth.diagnostic_check.DiagnosticCheck` with a unique check_id, a user visible description of the test, and the result. The test result is a string enumeration from 'failed', 'passed', 'error', 'warning' and 'not_done'. @@ -300,12 +309,11 @@ class Component: def disable(self): """Run operations to disable the component.""" - @staticmethod - def diagnose(): + def diagnose(self) -> list[DiagnosticCheck]: """Run diagnostics and return results. Return value must be a list of results. Each result is a - :class:`~plinth.modules.diagnostics.check.DiagnosticCheck` with a + :class:`~plinth.diagnostic_check.DiagnosticCheck` with a unique check_id, a user visible description of the test, and the result. The test result is a string enumeration from 'failed', 'passed', 'error', 'warning' and 'not_done'. diff --git a/plinth/config.py b/plinth/config.py index 1ab32cf0d..d274afd08 100644 --- a/plinth/config.py +++ b/plinth/config.py @@ -5,6 +5,8 @@ import pathlib from django.utils.translation import gettext_noop +from plinth.diagnostic_check import (DiagnosticCheck, + DiagnosticCheckParameters, Result) from plinth.privileged import config as privileged from . import app as app_module @@ -99,10 +101,8 @@ class DropinConfigs(app_module.FollowerComponent): for path in self.etc_paths: privileged.dropin_unlink(self.app_id, path, missing_ok=True) - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Check all links/copies and return generate diagnostic results.""" - from plinth.modules.diagnostics.check import DiagnosticCheck, Result - results = [] for path in self.etc_paths: etc_path = self._get_etc_path(path) @@ -118,7 +118,7 @@ class DropinConfigs(app_module.FollowerComponent): result_string = Result.PASSED if result else Result.FAILED description = gettext_noop( 'Static configuration {etc_path} is setup properly') - parameters = {'etc_path': str(etc_path)} + parameters: DiagnosticCheckParameters = {'etc_path': str(etc_path)} results.append( DiagnosticCheck(check_id, description, result_string, parameters)) diff --git a/plinth/conftest.py b/plinth/conftest.py new file mode 100644 index 000000000..9236f7fa6 --- /dev/null +++ b/plinth/conftest.py @@ -0,0 +1,252 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +pytest configuration for all tests. +""" + +import importlib +import os +import pathlib + +import pytest + +try: + importlib.import_module('splinter') + importlib.import_module('selenium') + _functional_libs_available = True +except ImportError: + _functional_libs_available = False + + +def pytest_ignore_collect(path, config): + """Ignore functional tests when splinter is not available.""" + if path.basename == 'test_functional.py': + return not _functional_libs_available + + +def pytest_configure(config): + """Register additional markers, one for each app.""" + for app in (pathlib.Path(__file__).parent / 'modules').iterdir(): + if not app.is_dir(): + continue + + config.addinivalue_line('markers', app.name) + + +def pytest_collection_modifyitems(config, items): + """Filter out specificly marked tests unless explicitly requested. + + The EXTENDED_TESTING environment variable is borrowed from the Lancaster + consensus met by the Pearl community. See + https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/lancaster-consensus.md + """ + + def skip(item, reason): + item.add_marker(pytest.mark.skip(reason=reason)) + + extended = 'EXTENDED_TESTING' in os.environ + if not (extended or config.getoption('--include-functional')): + for item in items: + if 'functional' in item.keywords or ( + item.parent.fspath.basename + and item.parent.fspath.basename == 'test_functional.py'): + skip(item, '--include-functional not provided') + + if not extended: + for item in items: + if 'heavy' in item.keywords: + skip(item, ('Takes too much time. ' + 'Set EXTENDED_TESTING=1 to force run')) + + +@pytest.fixture(name='load_cfg') +def fixture_load_cfg(): + """Load test configuration.""" + from plinth import cfg + + keys = ('file_root', 'config_dir', 'data_dir', 'custom_static_dir', + 'store_file', 'actions_dir', 'doc_dir', 'server_dir', 'host', + 'port', 'use_x_forwarded_for', 'use_x_forwarded_host', + 'secure_proxy_ssl_header', 'box_name', 'develop') + saved_state = {} + for key in keys: + saved_state[key] = getattr(cfg, key) + + root_dir = pathlib.Path(__file__).resolve().parent + cfg_file = root_dir / 'plinth' / 'develop.config' + cfg.read_file(str(cfg_file)) + yield cfg + + for key in keys: + setattr(cfg, key, saved_state[key]) + + +@pytest.fixture(name='develop_mode') +def fixture_develop_mode(load_cfg): + """Turn on development mode for a test.""" + load_cfg.develop = True + yield + load_cfg.develop = False + + +@pytest.fixture(name='needs_root', scope='session') +def fixture_needs_root(): + """Skip test if not running in root mode.""" + if os.geteuid() != 0: + pytest.skip('Needs to be root') + + +@pytest.fixture(name='needs_not_root', scope='session') +def fixture_needs_not_root(): + """Skip test if running in root mode.""" + if os.geteuid() == 0: + pytest.skip('Needs not to be root') + + +@pytest.fixture(name='needs_sudo') +def fixture_needs_sudo(): + """Skip test if sudo command is not available.""" + if not os.path.isfile('/usr/bin/sudo'): + pytest.skip('Needs sudo command installed.') + + +@pytest.fixture(scope='session') +def splinter_selenium_implicit_wait(): + """Disable implicit waiting.""" + return 0 + + +@pytest.fixture(scope='session') +def splinter_wait_time(): + """Disable explicit waiting.""" + return 0.01 + + +@pytest.fixture(scope='session') +def splinter_browser_load_condition(): + """When a page it loaded, wait until is available.""" + + def _load_condition(browser): + if browser.url == 'about:blank': + return True + + ready_state = browser.execute_script('return document.readyState;') + return ready_state == 'complete' + + return _load_condition + + +@pytest.fixture(name='mock_privileged') +def fixture_mock_privileged(request): + """Mock the privileged decorator to nullify its effects.""" + try: + privileged_modules_to_mock = request.module.privileged_modules_to_mock + except AttributeError: + raise AttributeError( + 'mock_privileged fixture requires "privileged_module_to_mock" ' + 'attribute at module level') + + for module_name in privileged_modules_to_mock: + module = importlib.import_module(module_name) + for name, member in module.__dict__.items(): + wrapped = getattr(member, '__wrapped__', None) + if not callable(member) or not wrapped: + continue + + if not getattr(member, '_privileged', False): + continue + + setattr(wrapped, '_original_wrapper', member) + module.__dict__[name] = wrapped + + yield + + for module_name in privileged_modules_to_mock: + module = importlib.import_module(module_name) + for name, member in module.__dict__.items(): + wrapper = getattr(member, '_original_wrapper', None) + if not callable(member) or not wrapper: + continue + + module.__dict__[name] = wrapper + + +@pytest.fixture(name='splinter_screenshot_dir', scope='session') +def fixture_splinter_screenshot_dir(request): + """Set default screenshot directory to ./screenshots. + + This can be overridden using --splinter-screenshot-dir=foo as the option. + """ + option = request.config.getoption('--splinter-screenshot-dir') + screenshots_dir = option if option != '.' else './screenshots' + return os.path.abspath(screenshots_dir) + + +@pytest.fixture(autouse=True) +def fixture_fix_session_browser_screenshots(request): + """Fix a bug in pytest-splinter for screenshots. + + When using session_browser, pytest-splinter does not take a screenshot when + a test has failed. It is uses internal pytest API on the FixtureRequest + object. This API was removed in later versions of pytest causing the + failure. Re-implement the fixture that has the problem fixing this issue. + + Drop this fixture after a fix is merged and released in pytest-splinter. + See: https://github.com/pytest-dev/pytest-splinter/pull/157 + """ + yield + + if not request.config.pluginmanager.has_plugin('pytest-splinter'): + return + + session_tmpdir = request.getfixturevalue('session_tmpdir') + splinter_session_scoped_browser = request.getfixturevalue( + 'splinter_session_scoped_browser') + splinter_make_screenshot_on_failure = request.getfixturevalue( + 'splinter_make_screenshot_on_failure') + splinter_screenshot_dir = request.getfixturevalue( + 'splinter_screenshot_dir') + splinter_screenshot_getter_html = request.getfixturevalue( + 'splinter_screenshot_getter_html') + splinter_screenshot_getter_png = request.getfixturevalue( + 'splinter_screenshot_getter_png') + splinter_screenshot_encoding = request.getfixturevalue( + 'splinter_screenshot_encoding') + + # Screenshot for function scoped browsers is handled in + # browser_instance_getter + if not splinter_session_scoped_browser: + return + + for name in request.fixturenames: + fixture_def = request._fixture_defs.get(name) + if not fixture_def or not fixture_def.cached_result: + continue + + value = fixture_def.cached_result[0] + should_take_screenshot = (hasattr(value, "__splinter_browser__") + and splinter_make_screenshot_on_failure + and getattr(request.node, 'splinter_failure', + True)) + + from pytest_splinter import plugin + if should_take_screenshot: + kwargs = { + 'request': + request, + 'fixture_name': + name, + 'session_tmpdir': + session_tmpdir, + 'browser_instance': + value, + 'splinter_screenshot_dir': + splinter_screenshot_dir, + 'splinter_screenshot_getter_html': + splinter_screenshot_getter_html, + 'splinter_screenshot_getter_png': + splinter_screenshot_getter_png, + 'splinter_screenshot_encoding': + splinter_screenshot_encoding + } + + plugin._take_screenshot(**kwargs) diff --git a/plinth/daemon.py b/plinth/daemon.py index 24844f1be..ae946800d 100644 --- a/plinth/daemon.py +++ b/plinth/daemon.py @@ -1,6 +1,7 @@ # SPDX-License-Identifier: AGPL-3.0-or-later """Component for managing a background daemon or any systemd unit.""" +import contextlib import socket import subprocess @@ -8,13 +9,17 @@ import psutil from django.utils.translation import gettext_noop from plinth import action_utils, app +from plinth.diagnostic_check import (DiagnosticCheck, + DiagnosticCheckParameters, Result) class Daemon(app.LeaderComponent): """Component to manage a background daemon or any systemd unit.""" - def __init__(self, component_id, unit, strict_check=False, - listen_ports=None, alias=None): + def __init__(self, component_id: str, unit: str, + strict_check: bool = False, + listen_ports: list[tuple[int, str]] | None = None, + alias: str | None = None): """Initialize a new daemon component. 'component_id' must be a unique string across all apps and components @@ -82,7 +87,21 @@ class Daemon(app.LeaderComponent): """Return whether the daemon/unit is running.""" return action_utils.service_is_running(self.unit) - def diagnose(self): + @contextlib.contextmanager + def ensure_running(self): + """Ensure a service is running and return to previous state.""" + from plinth.privileged import service as service_privileged + starting_state = self.is_running() + if not starting_state: + service_privileged.enable(self.unit) + + try: + yield starting_state + finally: + if not starting_state: + service_privileged.disable(self.unit) + + def diagnose(self) -> list[DiagnosticCheck]: """Check if the daemon is running and listening on expected ports. See :py:meth:`plinth.app.Component.diagnose`. @@ -95,15 +114,15 @@ class Daemon(app.LeaderComponent): return results - def _diagnose_unit_is_running(self): + def _diagnose_unit_is_running(self) -> DiagnosticCheck: """Check if a daemon is running.""" - from plinth.modules.diagnostics.check import DiagnosticCheck, Result - check_id = f'daemon-running-{self.unit}' result = Result.PASSED if self.is_running() else Result.FAILED description = gettext_noop('Service {service_name} is running') - parameters = {'service_name': self.unit} + parameters: DiagnosticCheckParameters = { + 'service_name': str(self.unit) + } return DiagnosticCheck(check_id, description, result, parameters) @@ -179,7 +198,9 @@ def app_is_running(app_): return True -def diagnose_port_listening(port, kind='tcp', listen_address=None): +def diagnose_port_listening( + port: int, kind: str = 'tcp', + listen_address: str | None = None) -> DiagnosticCheck: """Run a diagnostic on whether a port is being listened on. Kind must be one of inet, inet4, inet6, tcp, tcp4, tcp6, udp, @@ -187,11 +208,9 @@ def diagnose_port_listening(port, kind='tcp', listen_address=None): information. """ - from plinth.modules.diagnostics.check import DiagnosticCheck, Result - result = _check_port(port, kind, listen_address) - parameters = {'kind': kind, 'port': port} + parameters: DiagnosticCheckParameters = {'kind': kind, 'port': port} if listen_address: parameters['listen_address'] = listen_address check_id = f'daemon-listening-address-{kind}-{port}-{listen_address}' @@ -206,7 +225,8 @@ def diagnose_port_listening(port, kind='tcp', listen_address=None): parameters) -def _check_port(port, kind='tcp', listen_address=None): +def _check_port(port: int, kind: str = 'tcp', + listen_address: str | None = None) -> bool: """Return whether a port is being listened on.""" run_kind = kind @@ -228,11 +248,12 @@ def _check_port(port, kind='tcp', listen_address=None): continue # Port should match - if connection.laddr[1] != port: + if connection.laddr[1] != port: # type: ignore[misc] continue # Listen address if requested should match - if listen_address and connection.laddr[0] != listen_address: + if listen_address and connection.laddr[ + 0] != listen_address: # type: ignore[misc] continue # Special additional checks only for IPv4 @@ -244,22 +265,21 @@ def _check_port(port, kind='tcp', listen_address=None): return True # Full IPv6 address range includes mapped IPv4 address also - if connection.laddr[0] == '::': + if connection.laddr[0] == '::': # type: ignore[misc] return True return False -def diagnose_netcat(host, port, input='', negate=False): +def diagnose_netcat(host: str, port: int, remote_input: str = '', + negate: bool = False) -> DiagnosticCheck: """Run a diagnostic using netcat.""" - from plinth.modules.diagnostics.check import DiagnosticCheck, Result - try: process = subprocess.Popen(['nc', host, str(port)], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - process.communicate(input=input.encode()) + process.communicate(input=remote_input.encode()) if process.returncode != 0: result = Result.FAILED if not negate else Result.PASSED else: @@ -269,10 +289,13 @@ def diagnose_netcat(host, port, input='', negate=False): check_id = f'daemon-netcat-{host}-{port}' description = gettext_noop('Connect to {host}:{port}') - parameters = {'host': host, 'port': port, 'negate': negate} + parameters: DiagnosticCheckParameters = { + 'host': host, + 'port': port, + 'negate': negate + } if negate: check_id = f'daemon-netcat-negate-{host}-{port}' description = gettext_noop('Cannot connect to {host}:{port}') - return DiagnosticCheck(check_id, description.format(host=host, port=port), - result, parameters) + return DiagnosticCheck(check_id, description, result, parameters) diff --git a/plinth/modules/diagnostics/check.py b/plinth/diagnostic_check.py similarity index 91% rename from plinth/modules/diagnostics/check.py rename to plinth/diagnostic_check.py index 70afc75fb..f67661421 100644 --- a/plinth/modules/diagnostics/check.py +++ b/plinth/diagnostic_check.py @@ -5,11 +5,14 @@ import dataclasses import json from dataclasses import dataclass, field from enum import StrEnum +from typing import TypeAlias from django.utils.translation import gettext from plinth.utils import SafeFormatter +DiagnosticCheckParameters: TypeAlias = dict[str, str | int | bool | None] + class Result(StrEnum): """The result of a diagnostic check.""" @@ -26,7 +29,7 @@ class DiagnosticCheck: check_id: str description: str result: Result = Result.NOT_DONE - parameters: dict = field(default_factory=dict) + parameters: DiagnosticCheckParameters = field(default_factory=dict) @property def translated_description(self): diff --git a/plinth/locale/ar/LC_MESSAGES/django.po b/plinth/locale/ar/LC_MESSAGES/django.po index 63da4475c..dbbc02b25 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2023-10-19 06:18+0000\n" "Last-Translator: Shaik \n" "Language-Team: Arabic Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3503,19 +3525,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -3994,11 +4016,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4635,7 +4652,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4851,15 +4868,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4878,14 +4895,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4896,15 +4913,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5730,7 +5747,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5798,33 +5815,32 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" +#: modules/snapshot/views.py:160 +msgid "Configuration update failed." msgstr "" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5840,7 +5856,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5912,121 +5928,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6131,9 +6147,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6168,7 +6183,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6311,7 +6326,7 @@ msgstr "" msgid "Error configuring app: {error}" msgstr "خطأ أثناء تثبيت التطبيق: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6320,20 +6335,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6462,32 +6477,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6634,51 +6649,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6686,25 +6684,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6713,30 +6711,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6745,57 +6725,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7277,7 +7280,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7290,7 +7293,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7298,11 +7301,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7351,104 +7354,86 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "حدث خطأ أثناء تثبيت التطبيق: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "حدث خطأ أثناء تثبيت التطبيق: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "خطأ أثناء تثبيت التطبيق: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "خطأ أثناء تثبيت التطبيق: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "ثُبت التطبيق." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Error installing application: {error}" msgid "Uninstalling app" msgstr "خطأ أثناء تثبيت التطبيق: {error}" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "حدث خطأ أثناء تثبيت التطبيق: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "خطأ أثناء تثبيت التطبيق: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "ثُبت التطبيق." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7530,10 +7515,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7803,11 +7784,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -7816,6 +7797,21 @@ msgstr "" msgid "Gujarati" msgstr "" +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "حدث خطأ أثناء تثبيت التطبيق: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "حدث خطأ أثناء تثبيت التطبيق: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "حدث خطأ أثناء تثبيت التطبيق: {string} {details}" + #~ msgid "Page source" #~ msgstr "مصدر الصفحة" diff --git a/plinth/locale/ar_SA/LC_MESSAGES/django.po b/plinth/locale/ar_SA/LC_MESSAGES/django.po index 617371d1c..1b513e9e8 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2020-06-10 15:41+0000\n" "Last-Translator: aiman an \n" "Language-Team: Arabic (Saudi Arabia) Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3508,19 +3530,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -3999,11 +4021,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4640,7 +4657,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4856,15 +4873,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4883,14 +4900,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4901,15 +4918,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5735,7 +5752,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5803,33 +5820,32 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" +#: modules/snapshot/views.py:160 +msgid "Configuration update failed." msgstr "" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5845,7 +5861,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5917,121 +5933,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6136,9 +6152,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6173,7 +6188,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6316,7 +6331,7 @@ msgstr "" msgid "Error configuring app: {error}" msgstr "خطأ في تثبيت التطبيق:{error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6325,20 +6340,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6467,32 +6482,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6639,51 +6654,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6691,25 +6689,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6718,30 +6716,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6750,57 +6730,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7282,7 +7285,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7295,7 +7298,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7303,11 +7306,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7356,104 +7359,86 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "خطأ في تثبيت التطبيق :{string}{details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "خطأ في تثبيت التطبيق :{string}{details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "خطأ في تثبيت التطبيق:{error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "خطأ في تثبيت التطبيق:{error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "تم تثبيت التطبيق." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Error installing application: {error}" msgid "Uninstalling app" msgstr "خطأ في تثبيت التطبيق:{error}" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "خطأ في تثبيت التطبيق :{string}{details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "خطأ في تثبيت التطبيق:{error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "تم تثبيت التطبيق." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7535,10 +7520,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7808,11 +7789,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -7821,6 +7802,21 @@ msgstr "" msgid "Gujarati" msgstr "" +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "خطأ في تثبيت التطبيق :{string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "خطأ في تثبيت التطبيق :{string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "خطأ في تثبيت التطبيق :{string}{details}" + #, fuzzy #~| msgid "Web Server" #~ msgid "WebRTC server" diff --git a/plinth/locale/be/LC_MESSAGES/django.po b/plinth/locale/be/LC_MESSAGES/django.po index a6f7558d3..8fe9de458 100644 --- a/plinth/locale/be/LC_MESSAGES/django.po +++ b/plinth/locale/be/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -21,31 +21,31 @@ msgstr "" msgid "Static configuration {etc_path} is setup properly" msgstr "" -#: context_processors.py:23 views.py:95 +#: context_processors.py:23 views.py:116 msgid "FreedomBox" msgstr "" -#: daemon.py:105 +#: daemon.py:122 #, python-brace-format msgid "Service {service_name} is running" msgstr "" -#: daemon.py:164 +#: daemon.py:218 #, python-brace-format msgid "Listening on {kind} port {listen_address}:{port}" msgstr "" -#: daemon.py:167 +#: daemon.py:221 #, python-brace-format msgid "Listening on {kind} port {port}" msgstr "" -#: daemon.py:236 +#: daemon.py:291 #, python-brace-format msgid "Connect to {host}:{port}" msgstr "" -#: daemon.py:240 +#: daemon.py:299 #, python-brace-format msgid "Cannot connect to {host}:{port}" msgstr "" @@ -94,7 +94,28 @@ msgstr "" msgid "Use the language preference set in the browser" msgstr "" -#: middleware.py:130 +#: menu.py:106 +msgid "Visibility" +msgstr "" + +#: menu.py:108 +msgid "Data" +msgstr "" + +#: menu.py:110 templates/base.html:131 +msgid "System" +msgstr "" + +#: menu.py:112 modules/networks/templates/connection_show.html:259 +#: modules/security/__init__.py:35 +msgid "Security" +msgstr "" + +#: menu.py:114 +msgid "Administration" +msgstr "" + +#: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." msgstr "" @@ -111,12 +132,12 @@ msgstr "" msgid "{box_name} Web Interface (Plinth)" msgstr "" -#: modules/apache/components.py:154 +#: modules/apache/components.py:159 #, python-brace-format msgid "Access URL {url} on tcp{kind}" msgstr "" -#: modules/apache/components.py:157 +#: modules/apache/components.py:162 #, python-brace-format msgid "Access URL {url}" msgstr "" @@ -136,7 +157,7 @@ msgstr "" msgid "Service Discovery" msgstr "" -#: modules/avahi/__init__.py:60 +#: modules/avahi/__init__.py:61 msgid "Local Network Domain" msgstr "" @@ -144,35 +165,35 @@ msgstr "" msgid "Backups allows creating and managing backup archives." msgstr "" -#: modules/backups/__init__.py:44 modules/backups/__init__.py:167 -#: modules/backups/__init__.py:212 +#: modules/backups/__init__.py:44 modules/backups/__init__.py:168 +#: modules/backups/__init__.py:213 msgid "Backups" msgstr "" -#: modules/backups/__init__.py:164 +#: modules/backups/__init__.py:165 msgid "" "Enable an automatic backup schedule for data safety. Prefer an encrypted " "remote backup location or an extra attached disk." msgstr "" -#: modules/backups/__init__.py:170 +#: modules/backups/__init__.py:171 msgid "Enable a Backup Schedule" msgstr "" -#: modules/backups/__init__.py:174 modules/backups/__init__.py:221 -#: modules/privacy/__init__.py:76 modules/storage/__init__.py:314 +#: modules/backups/__init__.py:175 modules/backups/__init__.py:222 +#: modules/privacy/__init__.py:77 modules/storage/__init__.py:315 #, python-brace-format msgid "Go to {app_name}" msgstr "" -#: modules/backups/__init__.py:209 +#: modules/backups/__init__.py:210 #, python-brace-format msgid "" "A scheduled backup failed. Past {error_count} attempts for backup did not " "succeed. The latest error is: {error_message}" msgstr "" -#: modules/backups/__init__.py:217 +#: modules/backups/__init__.py:218 msgid "Error During Backup" msgstr "" @@ -399,7 +420,7 @@ msgstr "" msgid "Existing repository is not encrypted." msgstr "" -#: modules/backups/repository.py:335 +#: modules/backups/repository.py:337 #, python-brace-format msgid "{box_name} storage" msgstr "" @@ -746,7 +767,7 @@ msgid "Permissions for anonymous users, who have not provided a password." msgstr "" #: modules/bepasty/forms.py:27 modules/bepasty/templates/bepasty.html:30 -#: modules/users/forms.py:110 modules/users/forms.py:233 +#: modules/users/forms.py:103 msgid "Permissions" msgstr "" @@ -823,8 +844,9 @@ msgstr "" #: modules/bepasty/views.py:88 modules/diagnostics/views.py:52 #: modules/searx/views.py:35 modules/searx/views.py:46 -#: modules/security/views.py:56 modules/tor/views.py:73 -#: modules/torproxy/views.py:71 modules/zoph/views.py:74 +#: modules/security/views.py:56 modules/snapshot/views.py:158 +#: modules/tor/views.py:73 modules/torproxy/views.py:71 +#: modules/upgrades/views.py:83 modules/zoph/views.py:74 msgid "Configuration updated." msgstr "" @@ -908,7 +930,7 @@ msgstr "" #: modules/bind/views.py:61 modules/config/views.py:98 #: modules/coturn/views.py:40 modules/deluge/views.py:35 #: modules/dynamicdns/views.py:78 modules/ejabberd/views.py:95 -#: modules/email/views.py:45 modules/matrixsynapse/views.py:146 +#: modules/email/views.py:45 modules/matrixsynapse/views.py:149 #: modules/minetest/views.py:55 modules/mumble/views.py:37 #: modules/pagekite/forms.py:74 modules/privacy/views.py:36 #: modules/quassel/views.py:29 modules/roundcube/views.py:32 @@ -1080,7 +1102,7 @@ msgstr "" msgid "Configure" msgstr "" -#: modules/config/__init__.py:62 modules/config/forms.py:68 +#: modules/config/__init__.py:63 modules/config/forms.py:68 #: modules/dynamicdns/forms.py:82 modules/names/templates/names.html:16 msgid "Domain Name" msgstr "" @@ -1261,7 +1283,7 @@ msgstr "" msgid "Date & Time" msgstr "" -#: modules/datetime/__init__.py:122 +#: modules/datetime/__init__.py:123 msgid "Time synchronized to NTP server" msgstr "" @@ -1318,77 +1340,77 @@ msgstr "" msgid "Bittorrent client written in Python/PyGTK" msgstr "" -#: modules/diagnostics/__init__.py:27 +#: modules/diagnostics/__init__.py:28 msgid "" "The system diagnostic test will run a number of checks on your system to " "confirm that applications and services are working as expected." msgstr "" -#: modules/diagnostics/__init__.py:51 modules/diagnostics/__init__.py:236 +#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:240 msgid "Diagnostics" msgstr "" -#: modules/diagnostics/__init__.py:95 +#: modules/diagnostics/__init__.py:98 msgid "passed" msgstr "" -#: modules/diagnostics/__init__.py:96 modules/networks/views.py:50 +#: modules/diagnostics/__init__.py:99 modules/networks/views.py:50 msgid "failed" msgstr "" -#: modules/diagnostics/__init__.py:97 +#: modules/diagnostics/__init__.py:100 msgid "error" msgstr "" -#: modules/diagnostics/__init__.py:98 +#: modules/diagnostics/__init__.py:101 msgid "warning" msgstr "" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: modules/diagnostics/__init__.py:202 +#: modules/diagnostics/__init__.py:206 msgid "MiB" msgstr "" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: modules/diagnostics/__init__.py:207 +#: modules/diagnostics/__init__.py:211 msgid "GiB" msgstr "" -#: modules/diagnostics/__init__.py:214 +#: modules/diagnostics/__init__.py:218 msgid "You should disable some apps to reduce memory usage." msgstr "" -#: modules/diagnostics/__init__.py:219 +#: modules/diagnostics/__init__.py:223 msgid "You should not install any new apps on this system." msgstr "" -#: modules/diagnostics/__init__.py:231 +#: modules/diagnostics/__init__.py:235 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " "{memory_available_unit} free. {advice_message}" msgstr "" -#: modules/diagnostics/__init__.py:233 +#: modules/diagnostics/__init__.py:237 msgid "Low Memory" msgstr "" -#: modules/diagnostics/__init__.py:264 +#: modules/diagnostics/__init__.py:268 msgid "Running diagnostics" msgstr "" -#: modules/diagnostics/__init__.py:307 +#: modules/diagnostics/__init__.py:311 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: modules/diagnostics/__init__.py:308 +#: modules/diagnostics/__init__.py:312 msgid "Diagnostics results" msgstr "" -#: modules/diagnostics/__init__.py:313 +#: modules/diagnostics/__init__.py:317 msgid "Go to diagnostics results" msgstr "" @@ -1464,7 +1486,7 @@ msgstr "" msgid "Result" msgstr "" -#: modules/diagnostics/views.py:107 +#: modules/diagnostics/views.py:111 msgid "Diagnostic Test" msgstr "" @@ -1499,7 +1521,7 @@ msgstr "" msgid "Dynamic DNS Client" msgstr "" -#: modules/dynamicdns/__init__.py:74 +#: modules/dynamicdns/__init__.py:75 msgid "Dynamic Domain Name" msgstr "" @@ -1588,7 +1610,7 @@ msgid "Use HTTP basic authentication" msgstr "" #: modules/dynamicdns/forms.py:88 modules/networks/forms.py:207 -#: modules/users/forms.py:67 +#: modules/users/forms.py:129 msgid "Username" msgstr "" @@ -1956,29 +1978,29 @@ msgstr "" msgid "Firewall" msgstr "" -#: modules/firewall/__init__.py:271 +#: modules/firewall/__init__.py:273 msgid "Default zone is external" msgstr "" -#: modules/firewall/__init__.py:280 +#: modules/firewall/__init__.py:283 msgid "Firewall backend is nftables" msgstr "" -#: modules/firewall/__init__.py:293 +#: modules/firewall/__init__.py:297 msgid "Direct passthrough rules exist" msgstr "" -#: modules/firewall/components.py:136 +#: modules/firewall/components.py:139 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: modules/firewall/components.py:147 +#: modules/firewall/components.py:153 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: modules/firewall/components.py:153 +#: modules/firewall/components.py:159 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2096,11 +2118,11 @@ msgstr "" msgid "Read-write access to Git repositories" msgstr "" -#: modules/gitweb/__init__.py:50 modules/gitweb/manifest.py:11 +#: modules/gitweb/__init__.py:48 modules/gitweb/manifest.py:11 msgid "Gitweb" msgstr "" -#: modules/gitweb/__init__.py:51 +#: modules/gitweb/__init__.py:49 msgid "Simple Git Hosting" msgstr "" @@ -2537,7 +2559,7 @@ msgid "I2P" msgstr "" #: modules/i2p/__init__.py:53 modules/tor/__init__.py:63 -#: modules/torproxy/__init__.py:56 +#: modules/torproxy/__init__.py:57 msgid "Anonymity Network" msgstr "" @@ -2896,7 +2918,7 @@ msgstr "" msgid "Certificates" msgstr "" -#: modules/letsencrypt/__init__.py:104 +#: modules/letsencrypt/__init__.py:105 msgid "Cannot test: No domains are configured." msgstr "" @@ -2968,27 +2990,27 @@ msgstr "" #: modules/letsencrypt/views.py:46 #, python-brace-format -msgid "Failed to revoke certificate for domain {domain}: {error}" +msgid "Failed to revoke certificate for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:76 +#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:81 +#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 #, python-brace-format -msgid "Failed to obtain certificate for domain {domain}: {error}" +msgid "Failed to obtain certificate for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:93 +#: modules/letsencrypt/views.py:95 #, python-brace-format msgid "Certificate successfully deleted for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:98 +#: modules/letsencrypt/views.py:100 #, python-brace-format -msgid "Failed to delete certificate for domain {domain}: {error}" +msgid "Failed to delete certificate for domain {domain}" msgstr "" #: modules/matrixsynapse/__init__.py:26 @@ -3137,7 +3159,7 @@ msgid "" "go to Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3496,19 +3518,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -3987,11 +4009,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4628,7 +4645,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4844,15 +4861,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4871,14 +4888,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4889,15 +4906,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5723,7 +5740,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5791,33 +5808,32 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" +#: modules/snapshot/views.py:160 +msgid "Configuration update failed." msgstr "" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5833,7 +5849,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5905,121 +5921,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6124,9 +6140,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6161,7 +6176,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6303,7 +6318,7 @@ msgstr "" msgid "Error configuring app: {error}" msgstr "" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6312,20 +6327,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6454,32 +6469,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6626,51 +6641,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6678,25 +6676,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6705,30 +6703,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6737,57 +6717,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7269,7 +7272,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7282,7 +7285,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7290,11 +7293,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7343,92 +7346,77 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "" -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "" -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7510,10 +7498,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7781,11 +7765,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, 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 d4d180a54..de1315611 100644 --- a/plinth/locale/bg/LC_MESSAGES/django.po +++ b/plinth/locale/bg/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2023-09-18 19:00+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3680,13 +3704,13 @@ msgstr "Secure Shell" msgid "Services" msgstr "Услуги" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -3694,7 +3718,7 @@ msgstr "" "Управляваните по друг начин устройства ще бъдат недостъпни за управление от " "тук." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Мрежи" @@ -4242,11 +4266,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Сигурност" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4883,7 +4902,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -5109,17 +5128,17 @@ msgstr "Изключване" msgid "Manage system-wide privacy settings." msgstr "Управление на настройките за поверителност в цялата система." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "Поверителност" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" "Изберете настройките за поверителност, които отговарят на вашите " "предпочитания." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "Преглед на настройките за поверителност" @@ -5146,14 +5165,14 @@ msgstr "" "target=\"_blank\">popcon.debian.org. За допълнителна анонимност данните " "се изпращат през мрежата на Тор, ако приложението Тор е включено." -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5164,15 +5183,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -6027,7 +6046,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -6095,33 +6114,36 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Настройките на моментните снимки на хранилището са променени" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Настройките са променени." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Грешка при действие: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Потребителят на LDAP не е премахнат." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -6141,7 +6163,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Сървър за Secure Shell (SSH)" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "Отдалечен вход през SSH" @@ -6221,121 +6243,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Power" msgid "Go to Power" @@ -6442,9 +6464,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6491,7 +6512,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Синхронизиране на файлове" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6653,7 +6674,7 @@ msgstr "Запазване на настройки" msgid "Error configuring app: {error}" msgstr "Грешка при настройка на приложението: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6662,20 +6683,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "Прокси сървър на Тор" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Прокси сървър на Тор за SOCKS" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Достъп до {url} по tcp{kind} чрез Тор" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6820,32 +6841,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Обновяване на софтуера" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox е обновен" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "Обновяването на дистрибуцията не може да бъде стартирано" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7020,44 +7041,27 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Надграждане на дистрибуцията до тестова" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Честото обновяване на пакети е включено." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "Начало на опит за обновяване на дистрибуцията." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7068,7 +7072,7 @@ msgstr "" "получи достъп, някои приложения още имат изискване потребителският профил да " "бъде част от определена група." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7080,25 +7084,25 @@ msgstr "" "администратори могат да променят приложенията и настройките на " "системата." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Потребители и групи" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Достъп до всички услуги и системни настройки" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Проверете записа на LDAP „{search_item}“" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7107,33 +7111,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "Потребителското име е заето." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Въведете валидно потребителско име." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Задължително. 150 знака или по-малко. Само латински букви, цифри и @/./-/_." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Парола за удостоверяване" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" -"За да разрешите промяната на профила, въведете паролата на потребителя " -"„{user}“." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Грешна парола." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7142,21 +7125,47 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Въведете валидно потребителско име." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"Задължително. 150 знака или по-малко. Само латински букви, цифри и @/./-/_." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Парола за удостоверяване" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" +"За да разрешите промяната на профила, въведете паролата на потребителя " +"„{user}“." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Грешна парола." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Не е създаден потребител в LDAP: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Новият потребител не е добавен към групата {group}: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Удостоверени ключове на SSH" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7167,36 +7176,36 @@ msgstr "" "няколко ключа, по един на ред. Празните редове и редовете, започващи с #, ще " "бъдат пренебрегнати." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Потребителят на LDAP не е преименуван." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Потребителят не е премахнат от групата." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Потребителят не е добавен към групата." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "Ключовете на SSH не са зададени." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Състоянието на потребителя не е променено." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Паролата на потребителя на LDAP не е променена." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Новият потребител не е добавен към администраторската група: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Профилът е създаден и вече сте влезли" @@ -7690,7 +7699,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7703,7 +7712,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7711,11 +7720,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7766,93 +7775,78 @@ msgstr "Изчакване да започне: {name}" msgid "Finished: {name}" msgstr "Готово: {name}" -#: package.py:214 +#: package.py:206 #, fuzzy, python-brace-format #| msgid "Package {expression} is not available for install" msgid "Package {package_expression} is not available for install" msgstr "Пакетът „{expression}“ е недостъпен за инсталиране" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "Времето за изчакване на диспечера на пакети е изтекло" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "Инсталиране на приложение" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "Обновяване на приложение" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "Грешка при инсталиране на приложението: {string} {details}" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "Грешка при обновяване на приложението: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "Грешка при инсталиране на приложението: {error}" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "Грешка при обновяване на приложението: {error}" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "Приложението е инсталирано." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "Приложението е обновено" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "Премахване на приложение" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "Грешка при премахване на приложението: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "Грешка при премахване на приложението: {error}" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "Приложението е премахнато." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "Обновяване на пакетите на приложението" @@ -7937,10 +7931,6 @@ msgstr "Приложения" msgid " System" msgstr " Системни" -#: templates/base.html:131 -msgid "System" -msgstr "Системни" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Смяна на парола" @@ -8217,11 +8207,11 @@ msgstr "" "Всички данни и настройки на приложението ще бъдат загубени. Приложението " "може да бъде инсталирано отново." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Настройките не са променени" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "преди премахване на {app_id}" @@ -8230,6 +8220,25 @@ msgstr "преди премахване на {app_id}" msgid "Gujarati" msgstr "Гуджарати" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Настройките на моментните снимки на хранилището са променени" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Грешка при действие: {0} [{1}] [{2}]" + +#, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Грешка при инсталиране на приложението: {string} {details}" + +#, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Грешка при обновяване на приложението: {string} {details}" + +#, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Грешка при премахване на приложението: {string} {details}" + #~ msgid "Page source" #~ msgstr "Изходен код на страницата" diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index 8f107a0d6..85ed77747 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2021-06-16 07:33+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3532,19 +3554,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -4023,11 +4045,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4664,7 +4681,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4880,15 +4897,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4907,14 +4924,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4925,15 +4942,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5761,7 +5778,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5829,33 +5846,34 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration" +msgid "Configuration update failed." +msgstr "পছন্দসমূহ" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5871,7 +5889,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5943,121 +5961,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6162,9 +6180,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6199,7 +6216,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6343,7 +6360,7 @@ msgstr "পছন্দসমূহ" msgid "Error configuring app: {error}" msgstr "" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6352,20 +6369,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6494,32 +6511,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6666,51 +6683,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6718,25 +6718,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6745,30 +6745,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6777,57 +6759,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7309,7 +7314,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7322,7 +7327,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7330,11 +7335,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7383,92 +7388,77 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "" -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "" -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7550,10 +7540,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7823,11 +7809,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, 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 f695f01ee..ac9d2cff2 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2023-11-20 05:11+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech Let's " "Encrypt." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "Konfiguraci registrace nelze aktualizovat, když je aplikace zakázána." @@ -3989,7 +4018,7 @@ msgstr "Zabezpečený shell" msgid "Services" msgstr "Služby" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -3997,7 +4026,7 @@ msgstr "" "Nastavit síťová zařízení. Připojit k Internetu přes ethernet, WiFi nebo " "PPPoE. Sdílet toto připojení s ostatními zařízeními na síti." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4005,7 +4034,7 @@ msgstr "" "Zařízení spravovaná jinými metodami zde nemusí být k dispozici pro " "konfiguraci." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Sítě" @@ -4569,11 +4598,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Toto připojení není aktivní." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Zabezpečení" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5290,7 +5314,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Viditelnost na veřejnosti" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "PageKite doména" @@ -5529,17 +5553,17 @@ msgstr "Vypnout nyní" msgid "Manage system-wide privacy settings." msgstr "Správa nastavení ochrany osobních údajů v celém systému." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "Soukromí" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" "Aktualizujte nastavení ochrany osobních údajů tak, aby odpovídalo vašim " "preferencím." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "Zkontrolujte nastavení ochrany osobních údajů" @@ -5564,7 +5588,7 @@ msgstr "" "popcon.debian.org/\" target=\"_blank\">popcon.debian.org. Odesílání " "probíhá přes síť Tor pro další anonymitu, pokud je povolena aplikace Tor." -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5574,7 +5598,7 @@ msgstr "" "zlepšujícími soukromí, upravující data webových stánek a HTTP hlaviček, " "řídící přístup a odebírající reklamy a ostatní otravné Internetové smetí. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5591,15 +5615,15 @@ msgstr "" "org\">http://config.privoxy.org/ nebo http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Webová proxy" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Přistupte {url} s proxy {proxy} na tcp{kind}" @@ -6580,7 +6604,7 @@ msgstr "Datum" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Smazat zachycené stavy" @@ -6653,33 +6677,36 @@ msgstr "Spravovat zachycené stavy" msgid "Created snapshot." msgstr "Zachycený stav pořízen." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Nastavení zachycování stavů úložiště aktualizováno" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Nastavení aktualizována." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Chyba akce: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Označené zachycené stavy smazány" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Smazání LDAP uživatele se nezdařilo." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "Zachycený stav je používán. Zkuste to později." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "Vráceno zpět do podoby zachyceného stavu č. {number}." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "Pro dokončení obnovy ze zálohy je třeba systém restartovat." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Vrátit do podoby zachyceného stavu" @@ -6699,7 +6726,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Server zabezpečeného shellu (SSH)" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "Vzdálené přihlášení pomocí Secure Shell (SSH)" @@ -6782,104 +6809,104 @@ msgstr "" "{box_name}. Lze zobrazit úložná zařízení, která jsou využívána, připojovat a " "odpojovat ta vyjímatelná." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Úložiště" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} bajtů" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "Operace se nezdařila." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "Operace byla zrušena." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Toto zařízení už je odpojováno (umount)." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "Operace není podporována z důvodu chybějící podpory ovladače/nástroje." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "Časový limit aplikace překročen." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "Operace by probudila disk který je v režimu hlubokého spánku." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Pokus o odpojení zařízení které je zaneprázdněno." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "Operace už byla zrušena." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "Chybí oprávnění pro provedení požadované operace." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Toto zařízení je už připojeno (mount)." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Zařízení není připojeno." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "Není umožněno použít požadovanou volbu." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Zařízení je připojeno jiným uživatelem." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" "Málo místa na systémovém oddílu: {percent_used}% použito, {free_space} volné." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Málo místa na disku" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Hrozí selhání disku" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -6888,20 +6915,20 @@ msgstr "" "Disk {id} hlásí, že v blízké budoucnosti pravděpodobně selže. Zkopírujte " "všechna data, dokud to ještě jde, a disk vyměňte." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 #, fuzzy #| msgid "Root Filesystem" msgid "Read-only root filesystem" msgstr "Kořenový souborový systém" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Go to Networks" msgid "Go to Power" @@ -7015,9 +7042,10 @@ msgstr "{drive_vendor} {drive_model} je možné bezpečně odebrat." msgid "Device can be safely unplugged." msgstr "Zařízení je možné bezpečně odebrat." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Chyba při vysouvání zařízení: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7063,7 +7091,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Synchronizace souborů" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7232,7 +7260,7 @@ msgstr "Aktualizace konfigurace" msgid "Error configuring app: {error}" msgstr "Chyba při konfiguraci aplikace: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7245,20 +7273,20 @@ msgstr "" "aplikace pro přístup k internetu prostřednictvím sítě Tor. Cenzuru " "poskytovatelů internetových služeb lze obejít pomocí upstreamových mostů." -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "Tor Proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Tor Socks proxy" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Přistoupit k URL adrese {url} na tcp{kind} prostřednictvím Tor" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Potvrďte použití Tor na adrese {url} na tcp{kind}" @@ -7419,21 +7447,21 @@ msgstr "" "systému považován za nezbytný, provede se automaticky ve 02:00 a způsobí, že " "všechny aplikace budou krátce nedostupné." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Aktualizace software" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox aktualizován" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "Nelze spustit aktualizaci distribuce" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7443,11 +7471,11 @@ msgstr "" "distribuce. Zajistěte, aby bylo volných alespoň 5 GB. Aktualizace distribuce " "se bude opakovat po 24 hodinách, pokud je povolena." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "Zahájena aktualizace distribuce" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7619,44 +7647,29 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Otestujte aktualizaci distribuce" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "Chyba při nastavování bezobslužných aktualizací: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Automatické aktualizace zapnuty" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Automatické aktualizace vypnuty" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "Upgrade distribuce povoleno" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Upgrade distribuce zakázáno" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Proces přechodu na novější verze zahájen." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Spouštění přechodu na novější verzi se nezdařilo." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Aktivovány časté aktualizace funkcí." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "Zahájení testu aktualizace distribuce." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7667,7 +7680,7 @@ msgstr "" "aby uživatelský účet byl součástí skupiny, která uživatele opravňuje k " "přístupu k aplikaci." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7679,25 +7692,25 @@ msgstr "" "nebo nastavení systému však mohou měnit pouze uživatelé skupiny admin." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Uživatelé a skupiny" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Přístup ke všem službám a nastavení systému" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Zkontrolujte LDAP položku „{search_item}“" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "Zkontrolujte konfiguraci nslcd \"{key} {value}\"" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "Zkontrolujte konfiguraci nsswitch \" {database}\"" @@ -7707,31 +7720,12 @@ msgid "Username is taken or is reserved." msgstr "" "Toto uživatelské jméno je už používáno někým jiným nebo vyhrazeno pro systém." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Zadejte platné uživatelské jméno." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Požadováno. Nejvýše 150 znaků. Pouze anglická písmena, číslice a @/./-/_." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Autorizační heslo" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "Zadejte heslo uživatele \"{user}\" pro autorizaci změn účtu." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Neplatné heslo." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7745,21 +7739,45 @@ msgstr "" "skupině admin se budou moci přihlásit ke všem službám. Mohou se také " "přihlašovat do systému prostřednictvím SSH a mají práva správce (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Zadejte platné uživatelské jméno." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"Požadováno. Nejvýše 150 znaků. Pouze anglická písmena, číslice a @/./-/_." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Autorizační heslo" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "Zadejte heslo uživatele \"{user}\" pro autorizaci změn účtu." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Neplatné heslo." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Vytvoření uživatele LDAP se nezdařilo: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Nepodařilo se přidat nového uživatele do skupiny {group}: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Pověřené SSH klíče" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7769,36 +7787,36 @@ msgstr "" "systému i bez zadávání hesla. Klíčů je možné vložit vícero, každý na vlastní " "řádek. Prázdné řádky a ty, které začínají na znak # budou ignorovány." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Přejmenování LDAP uživatele se nezdařilo." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Odebrání uživatele ze skupiny se nezdařilo." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Přidání uživatele do skupiny se nezdařilo." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "Nepodařilo se vložit SSH klíče." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Nepodařilo se změnit stav uživatele." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Změna hesla LDAP uživatele se nezdařila." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Nepodařilo se přidat nového uživatele do skupiny admin: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Uživatelský účet vytvořen, není jste jím přihlášeni" @@ -8335,7 +8353,7 @@ msgstr "" "WordPress pouze správcům. Povolte pouze po provedení počátečního nastavení " "WordPressu." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8357,7 +8375,7 @@ msgstr "" "určitém místě. Jednotlivé fotografie lze sdílet s ostatními odesláním " "přímého odkazu." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8368,11 +8386,11 @@ msgstr "" "další uživatele musí být vytvořeny účty jak v {box_name}, tak v Zoph se " "stejným uživatelským jménem." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Organizér fotografií" @@ -8425,93 +8443,78 @@ msgstr "Čeká na spuštění: {name}" msgid "Finished: {name}" msgstr "Dokončeno: {name}" -#: package.py:214 +#: package.py:206 #, fuzzy, python-brace-format #| msgid "Package {expression} is not available for install" msgid "Package {package_expression} is not available for install" msgstr "Balíček {expression} není k dispozici pro instalaci" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Balíček {package_name} je nejnovější verze ({latest_version})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "Instalace" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "stahování" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "změna média" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "soubor s nastaveními: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "Časový limit čekání na správce balíčků" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "Instalace aplikací" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "Aktualizace aplikací" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "Chyba instalace aplikace: {string} {details}" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "Chyba aktualizace aplikace: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "Chyba při instalaci aplikace: {error}" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "Chyba při aktualizaci aplikace: {error}" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "Aplikace nainstalována." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "Aplikace aktualizována" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "Odinstalování aplikace" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "Chyba odinstalace aplikace: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "Chyba při odinstalaci aplikace: {error}" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "Aplikace odinstalována." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "Aktualizace balíčků aplikací" @@ -8603,10 +8606,6 @@ msgstr "Aplikace" msgid " System" msgstr " Systém" -#: templates/base.html:131 -msgid "System" -msgstr "Systém" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Změnit heslo" @@ -8904,11 +8903,11 @@ msgstr "" "Všechna data a konfigurace aplikace budou trvale ztraceny. Aplikaci lze " "nainstalovat znovu." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Nastavení se nezměnila" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "před odinstalací {app_id}" @@ -8917,6 +8916,37 @@ msgstr "před odinstalací {app_id}" msgid "Gujarati" msgstr "gudžarátština" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Nastavení zachycování stavů úložiště aktualizováno" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Chyba akce: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Automatické aktualizace zapnuty" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Automatické aktualizace vypnuty" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Upgrade distribuce povoleno" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Upgrade distribuce zakázáno" + +#, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Chyba instalace aplikace: {string} {details}" + +#, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Chyba aktualizace aplikace: {string} {details}" + +#, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Chyba odinstalace aplikace: {string} {details}" + #~ msgid "Page source" #~ msgstr "Zdrojový kód stránky" diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index 0c0324505..bf353a2be 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Danish Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -4039,19 +4067,19 @@ msgstr "Secure Shell" msgid "Services" msgstr "Tjeneste" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Netværk" @@ -4569,11 +4597,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Denne forbindelse er ikke aktiv." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Sikkerhed" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5329,7 +5352,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Offentlig Tilgængelighed (PageKite)" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 #, fuzzy #| msgid "PageKite Account" msgid "PageKite Domain" @@ -5577,17 +5600,17 @@ msgstr "Sluk Nu" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 #, fuzzy #| msgid "Enable Privoxy" msgid "Privacy" msgstr "Aktiver Privoxy" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5606,7 +5629,7 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5617,7 +5640,7 @@ msgstr "" "HTTP-headers, styre adgang og fjerne reklamer og andet vedderstyggeligt " "internetskrald. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, fuzzy, python-brace-format #| msgid "" #| "You can use Privoxy by modifying your browser proxy settings to your " @@ -5639,19 +5662,19 @@ msgstr "" "på http://config.privoxy.org/ " "eller http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 #, fuzzy #| msgid "Enable Privoxy" msgid "Privoxy" msgstr "Aktiver Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 #, fuzzy #| msgid "Privoxy Web Proxy" msgid "Web Proxy" msgstr "Privoxy Webproxy" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Tilgå {url} med proxy {proxy} ved brug af tcp{kind}" @@ -6630,7 +6653,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 #, fuzzy #| msgid "Delete %(name)s" msgid "Delete Snapshots" @@ -6706,37 +6729,38 @@ msgstr "Opret Bruger" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 +#: modules/snapshot/views.py:160 #, fuzzy -#| msgid "Configuration updated" -msgid "Storage snapshots configuration updated" -msgstr "Konfiguration opdateret" +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Konfiguration opdateret." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Fejl under handling: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 #, fuzzy #| msgid "Delete %(name)s" msgid "Deleted selected snapshots" msgstr "Slet %(name)s" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Kunne ikke slette LDAP-bruger." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -6752,7 +6776,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Secure Shell (SSH) Server" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 #, fuzzy #| msgid "Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)" @@ -6834,136 +6858,136 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 #, fuzzy #| msgid "reStore" msgid "Storage" msgstr "reStore" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, fuzzy, python-brace-format #| msgid "{disk_size} bytes" msgid "{disk_size:.1f} bytes" msgstr "{disk_size} bytes" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, fuzzy, python-brace-format #| msgid "{disk_size} KiB" msgid "{disk_size:.1f} KiB" msgstr "{disk_size} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, fuzzy, python-brace-format #| msgid "{disk_size} MiB" msgid "{disk_size:.1f} MiB" msgstr "{disk_size} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, fuzzy, python-brace-format #| msgid "{disk_size} GiB" msgid "{disk_size:.1f} GiB" msgstr "{disk_size} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, fuzzy, python-brace-format #| msgid "{disk_size} TiB" msgid "{disk_size:.1f} TiB" msgstr "{disk_size} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 #, fuzzy #| msgid "repro service is running" msgid "The device is already unmounting." msgstr "repro-tjenesten er aktiv" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 #, fuzzy #| msgid "This service already exists" msgid "The device is already mounted." msgstr "Denne tjeneste eksisterer allerede" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 #, fuzzy #| msgid "repro service is not running" msgid "The device is not mounted." msgstr "repro-tjenesten er ikke aktiv" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 #, fuzzy #| msgid "System" msgid "Read-only root filesystem" msgstr "System" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Go to Networks" msgid "Go to Power" @@ -7086,9 +7110,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -7125,7 +7148,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7291,7 +7314,7 @@ msgstr "Der opstod en fejl under konfigurationen." msgid "Error configuring app: {error}" msgstr "Kunne ikke installere applikation: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7300,22 +7323,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "I2P Proxy" msgid "Tor Proxy" msgstr "I2P Proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Tilgå URL {url} ved brug af tcp{kind} via Tor" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Bekræft brug af Tor på {url} ved brug af tcp{kind}" @@ -7467,7 +7490,7 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 #, fuzzy @@ -7475,30 +7498,30 @@ msgstr "" msgid "Software Update" msgstr "Softwareopdateringer" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 #, fuzzy #| msgid "FreedomBox Manual" msgid "FreedomBox Updated" msgstr "FreedomBox Brugervejledning" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 #, fuzzy #| msgid "Automatic upgrades disabled" msgid "Distribution update started" msgstr "Automatisk opdatering deaktiveret" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7683,58 +7706,39 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Automatisk opdatering aktiveret" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "" "Kunne ikke konfigurere automatisk opdatering (unattended-upgrades): {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Automatisk opdatering aktiveret" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Automatisk opdatering deaktiveret" - -#: modules/upgrades/views.py:86 -#, fuzzy -#| msgid "Automatic upgrades enabled" -msgid "Distribution upgrade enabled" -msgstr "Automatisk opdatering aktiveret" - -#: modules/upgrades/views.py:89 -#, fuzzy -#| msgid "Automatic upgrades disabled" -msgid "Distribution upgrade disabled" -msgstr "Automatisk opdatering deaktiveret" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Opdateringsprocessen er startet." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Kunne ikke starte opdatering." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 #, fuzzy #| msgid "Automatic upgrades enabled" msgid "Starting distribution upgrade test." msgstr "Automatisk opdatering aktiveret" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7742,25 +7746,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Brugere og Grupper" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Kontrol af LDAP-konfiguration \"{search_item}\"" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7769,36 +7773,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -#, fuzzy -#| msgid "Invalid server name" -msgid "Enter a valid username." -msgstr "Ugyldigt servernavn" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -#, fuzzy -#| msgid "Administrator Account" -msgid "Authorization Password" -msgstr "Administratorkonto" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -#, fuzzy -#| msgid "Show password" -msgid "Invalid password." -msgstr "Vis kodeord" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7820,23 +7800,52 @@ msgstr "" "tjenester. De kan også logge ind på systemet gennem SSH og har " "administratorprivilegier (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a valid username." +msgstr "Ugyldigt servernavn" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +#, fuzzy +#| msgid "Administrator Account" +msgid "Authorization Password" +msgstr "Administratorkonto" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +#, fuzzy +#| msgid "Show password" +msgid "Invalid password." +msgstr "Vis kodeord" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "Kunne ikke oprette LDAP-bruger." -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "Kunne ikke tilføje ny bruger til gruppen {group}." -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7846,39 +7855,39 @@ msgstr "" "sikkert ind på systemet uden et kodeord. Der kan defineres flere nøgler, en " "på hver linje. Tomme linjer og linjer som starter med # bliver ignoreret." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Kunne ikke omdøbe LDAP-bruger." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Kunne ikke fjerne bruger fra gruppe." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Kunne ikke tilføje bruger til gruppe." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "Kunne ikke tilføje bruger til gruppe." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Kunne ikke ændre LDAP-kodeord." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "Kunne ikke tilføje ny bruger til admin-gruppen." -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Brugerkonto oprettet, du er nu logget ind" @@ -8427,7 +8436,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8440,7 +8449,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8448,11 +8457,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -8505,108 +8514,90 @@ msgstr "" msgid "Finished: {name}" msgstr "Tjeneste ikke aktiv: {name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "Installerer" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "downloader" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "medie-ændring" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurationsfil: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install Apps" msgid "Installing app" msgstr "Installer applikationer" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Kunne ikke installere applikation: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Kunne ikke installere applikation: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Kunne ikke installere applikation: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Kunne ikke installere applikation: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Applikation installeret." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "Seneste opdatering" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install Apps" msgid "Uninstalling app" msgstr "Installer applikationer" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Kunne ikke installere applikation: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Kunne ikke installere applikation: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Applikation installeret." -#: setup.py:453 +#: setup.py:493 #, fuzzy #| msgid "Upgrade Packages" msgid "Updating app packages" @@ -8706,10 +8697,6 @@ msgstr "Apps" msgid " System" msgstr " System" -#: templates/base.html:131 -msgid "System" -msgstr "System" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Ændr kodeord" @@ -9008,11 +8995,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Indstilling uændret" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -9021,6 +9008,46 @@ msgstr "" msgid "Gujarati" msgstr "" +#, fuzzy +#~| msgid "Configuration updated" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Konfiguration opdateret" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Fejl under handling: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Automatisk opdatering aktiveret" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Automatisk opdatering deaktiveret" + +#, fuzzy +#~| msgid "Automatic upgrades enabled" +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Automatisk opdatering aktiveret" + +#, fuzzy +#~| msgid "Automatic upgrades disabled" +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Automatisk opdatering deaktiveret" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Kunne ikke installere applikation: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Kunne ikke installere applikation: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Kunne ikke installere applikation: {string} {details}" + #~ msgid "Page source" #~ msgstr "Sidens kildekode" diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index aae99e23c..a516751cf 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2024-02-22 14:02+0000\n" "Last-Translator: Olaf Schaf \n" "Language-Team: German Let's " "Encrypt, um eines zu beziehen." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" "Die Registrierungskonfiguration kann nicht aktualisiert werden, wenn die App " @@ -4073,7 +4102,7 @@ msgstr "Secure Shell" msgid "Services" msgstr "Dienste" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4082,7 +4111,7 @@ msgstr "" "eine Verbindung zum Internet her. Teilen Sie diese Verbindung mit anderen " "Geräten im Netzwerk." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4090,7 +4119,7 @@ msgstr "" "Geräte die mit anderen Methoden verwaltet werden, können hier möglicherweise " "nicht konfiguriert werden." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Netzwerke" @@ -4665,11 +4694,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Diese Verbindung ist nicht aktiv." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Sicherheit" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5392,7 +5416,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Öffentliche Sichtbarkeit" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "PageKite Domäne" @@ -5637,16 +5661,16 @@ msgstr "Jetzt herunterfahren" msgid "Manage system-wide privacy settings." msgstr "Verwaltung systemweiter Datenschutzeinstellungen." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "Datenschutz" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" "Bitte passen Sie die Datenschutzeinstellungen entsprechend Ihren Wünschen an." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "Datenschutzeinstellungen anpassen" @@ -5673,7 +5697,7 @@ msgstr "" "org. Die Übermittlung erfolgt über das Tor-Netzwerk für zusätzliche " "Anonymität, wenn die Tor-App aktiviert ist." -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5684,7 +5708,7 @@ msgstr "" "kontrolliert den Zugang und entfernt Werbung und anderen abscheulichen " "Internet-Müll. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5701,15 +5725,15 @@ msgstr "" "unter http://config.privoxy.org/ " "oder http://p.p einsehen." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Web Proxy" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Zugang auf {url} über Proxy {proxy} auf TCP{kind}" @@ -6707,7 +6731,7 @@ msgstr "Datum" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Speicherauszüge löschen" @@ -6781,36 +6805,39 @@ msgstr "Schnappschüsse verwalten" msgid "Created snapshot." msgstr "Schnappschuss erstellt." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Konfiguration der Speicherauszüge aktualisiert" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Konfiguration aktualisiert." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Aktionsfehler: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Ausgewählte Schnappschüsse gelöscht" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Löschen von LDAP-Benutzer fehlgeschlagen." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" "Schnappschüsse ist derzeit im Gebrauch. Bitte versuchen Sie es später noch " "einmal." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "Zurückgesetzt auf Speicherauszug #{number}." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" "Das System muss neu gestartet werden, um das Zurücksetzen abzuschließen." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Zurücksetzen auf Speicherauszug" @@ -6830,7 +6857,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Secure Shell (SSH) Server" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "Remote-Anmeldung mit Secure Shell (SSH)" @@ -6916,108 +6943,108 @@ msgstr "" "Speichermedien einsehen, Wechselmedien einbinden und aushängen, die Root-" "Partition erweitern usw." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Speicher" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} Bytes" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "Der Vorgang schlug fehl." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "Der Vorgang wurde abgebrochen." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Das Gerät wird bereits ausgehängt." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" "Der Vorgang ist wegen fehlender Treiber-/Werkzeugunterstützung nicht möglich." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "Der Vorgang beendet wegen Zeitüberschreitung." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" "Dieser Vorgang würde ein Gerät aufwecken, welches sich in einem Tiefschlaf-" "Zustand befindet." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Es wird versucht, ein Gerät auszuhängen, das beschäftigt ist." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "Dieser Vorgang wurde bereits abgebrochen." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "Nicht autorisiert, um den gewünschten Vorgang auszuführen." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Dieses Gerät ist bereits eingebunden." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Das Gerät ist nicht eingebunden." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "Die gewünschte Option ist nicht gestattet." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Das Gerät ist von einem anderen Benutzer eingebunden." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" "Geringer Speicherplatz auf der Systempartition: {percent_used}% belegt, " "{free_space} verfügbar." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Wenig Plattenspeicherplatz" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Festplattenfehler unmittelbar bevorstehend" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -7027,7 +7054,7 @@ msgstr "" "Kopieren Sie alle Daten, solange Sie noch können, und ersetzen Sie das " "Laufwerk." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " @@ -7037,11 +7064,11 @@ msgstr "" "System neu zu starten. Wenn das Problem nach einem Neustart anhält, " "überprüfen Sie das Speichergerät auf Fehler." -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "Schreibgeschütztes Root-Dateisystem" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "Springe zur Stromversorgung" @@ -7156,9 +7183,10 @@ msgstr "{drive_vendor} {drive_model} kann sicher entfernt werden." msgid "Device can be safely unplugged." msgstr "Gerät kann sicher entfernt werden." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Fehler beim Auswerfen des Geräts: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7205,7 +7233,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Dateisynchronisation" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7380,7 +7408,7 @@ msgstr "Aktualisieren der Konfiguration" msgid "Error configuring app: {error}" msgstr "Fehler beim Konfigurieren der App: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7394,20 +7422,20 @@ msgstr "" "Internet zuzugreifen. Die ISP-Zensur kann mit Upstream-Brücken umgangen " "werden." -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "Tor-Proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Tor-Socks-Proxy" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Zugangs-URL {url} auf TCP{kind} über Tor" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Tor-Nutzung auf {url} über TCP{kind} bestätigen" @@ -7568,21 +7596,21 @@ msgstr "" "erachtet wird, erfolgt dieser automatisch um 02:00 Uhr, so dass alle Apps " "kurzzeitig nicht verfügbar sind." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Software-Aktualisierung" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox aktualisiert" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "Distributions-Update konnte nicht gestartet werden" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7593,11 +7621,11 @@ msgstr "" "mindestens 5 GB frei sind. Das Distributions-Update wird nach 24 Stunden " "erneut versucht, falls aktiviert." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "Distributions-Upgrade gestartet" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7777,44 +7805,29 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Distributions-Upgrade jetzt testen" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "Fehler beim Konfigurieren von automatischen Aktualisierungen: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Automatische Systemaktualisierung aktivieren" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Automatische Aktualisierungen ausgeschaltet" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "Distributions-Upgrade aktiviert" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Distributions-Upgrade deaktiviert" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Aktualisierung gestartet." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Starten der Aktualisierung fehlgeschlagen." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Häufige Funktions-Updates aktiviert." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "Start des Tests zur Aktualisierung der Distribution." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7825,7 +7838,7 @@ msgstr "" "muss ein Benutzerkonto Teil einer Gruppe sein, damit ein Benutzer auf die " "App zugreifen kann." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7837,25 +7850,25 @@ msgstr "" "dürfen nur Mitglieder der Gruppe admin Apps oder " "Systemeinstellungen ändern." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Benutzer und Gruppen" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Zugriff auf alle Anwendungen und Systemeinstellungen" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP-Eintrag „{search_item}“ prüfen" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "Prüfen Sie die nslcd-Konfiguration \"{key} {value}\"" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "Prüfen Sie die nsswitch-Konfiguration \"{database}\"" @@ -7864,34 +7877,12 @@ msgstr "Prüfen Sie die nsswitch-Konfiguration \"{database}\"" msgid "Username is taken or is reserved." msgstr "Benutzername wird bereits verwendet oder ist reserviert." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Einen gültigen Benutzernamen eingeben." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Erforderlich. Bis zu 150 Zeichen. Nur englische Buchstaben, Ziffern und " -"@/./-/_." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Autorisierungs-Passwort" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" -"Geben Sie das Passwort für den Benutzer „{user}“ ein, um Kontoänderungen zu " -"autorisieren." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Ungültiges Passwort." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7906,22 +7897,49 @@ msgstr "" "allen Diensten anmelden und sie können sich auch über SSH im System anmelden " "und besitzen Administratorrechte (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Einen gültigen Benutzernamen eingeben." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"Erforderlich. Bis zu 150 Zeichen. Nur englische Buchstaben, Ziffern und " +"@/./-/_." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Autorisierungs-Passwort" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" +"Geben Sie das Passwort für den Benutzer „{user}“ ein, um Kontoänderungen zu " +"autorisieren." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Ungültiges Passwort." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Erstellen des LDAP-Benutzers ist fehlgeschlagen:{error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" "Fehler beim Hinzufügen eines neuen Benutzers zur {group}-Gruppe: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Autorisierte SSH-Schlüssel" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7932,37 +7950,37 @@ msgstr "" "eingeben, einen pro Zeile. Leerzeilen und Zeilen, die mit # beginnen, werden " "ignoriert." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Umbenennen des LDAP-Benutzers fehlgeschlagen." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Entfernen des Benutzers von der Gruppe fehlgeschlagen." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Hinzufügen eines Benutzers zur Gruppe ist fehlgeschlagen." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "SSH-Schlüssel kann nicht gesetzt werden." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Fehler beim Ändern des Benutzerstatus." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Ändern des LDAP-Benutzerpassworts ist fehlgeschlagen." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" "Fehler beim Hinzufügen eines neuen Benutzers zur Administratorgruppe: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Benutzerkonto wurde erstellt, Sie sind jetzt angemeldet" @@ -8514,7 +8532,7 @@ msgstr "" "Administratoren die WordPress-Website oder den Blog aufrufen. Aktivieren Sie " "diese Option erst nach der Ersteinrichtung von WordPress." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8539,7 +8557,7 @@ msgstr "" "Einzelne Fotos können mit anderen geteilt werden, indem ein direkter Link " "gesendet wird." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8550,11 +8568,11 @@ msgstr "" "Administrator in Zoph. Für zusätzliche Benutzer müssen Konten sowohl in " "{box_name} als auch in Zoph mit demselben Benutzernamen erstellt werden." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Foto-Manager" @@ -8608,92 +8626,77 @@ msgstr "Warten auf den Start: {name}" msgid "Finished: {name}" msgstr "Fertig: {name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "Paket {package_expression} ist nicht zur Installation verfügbar" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Paket {package_name} ist die aktuellste Version ({latest_version})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "Installation läuft" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "herunterladen" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "Medienwechsel" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "Konfigurationsdatei: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "Zeitüberschreitung beim Warten auf den Paket-Manager" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "Installation der App" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "Aktualisieren der App" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "Fehler bei der Installation der App: {string} {details}" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "Fehler beim Aktualisieren der App: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "Fehler bei der Installation der App: {error}" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "Fehler beim Aktualisieren der App: {error}" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "App installiert." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "App aktualisiert" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "Deinstallation der App" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "Fehler bei der Deinstallation der App: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "Fehler bei der Deinstallation der App: {error}" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "App deinstalliert." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "Aktualisieren von App-Paketen" @@ -8789,10 +8792,6 @@ msgstr "Apps" msgid " System" msgstr " System" -#: templates/base.html:131 -msgid "System" -msgstr "System" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Passwort ändern" @@ -9090,11 +9089,11 @@ msgstr "" "Alle App-Daten und -Konfigurationen gehen dauerhaft verloren. App kann " "wieder frisch installiert werden." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Einstellung unverändert" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "vor der Deinstallation von {app_id}" @@ -9103,6 +9102,37 @@ msgstr "vor der Deinstallation von {app_id}" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Konfiguration der Speicherauszüge aktualisiert" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Aktionsfehler: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Automatische Systemaktualisierung aktivieren" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Automatische Aktualisierungen ausgeschaltet" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Distributions-Upgrade aktiviert" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Distributions-Upgrade deaktiviert" + +#, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Fehler bei der Installation der App: {string} {details}" + +#, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Fehler beim Aktualisieren der App: {string} {details}" + +#, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Fehler bei der Deinstallation der App: {string} {details}" + #~ msgid "Page source" #~ msgstr "Seitenquelle" diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 63b334594..04c603603 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -22,31 +22,31 @@ msgstr "" msgid "Static configuration {etc_path} is setup properly" msgstr "" -#: context_processors.py:23 views.py:95 +#: context_processors.py:23 views.py:116 msgid "FreedomBox" msgstr "" -#: daemon.py:105 +#: daemon.py:122 #, python-brace-format msgid "Service {service_name} is running" msgstr "" -#: daemon.py:164 +#: daemon.py:218 #, python-brace-format msgid "Listening on {kind} port {listen_address}:{port}" msgstr "" -#: daemon.py:167 +#: daemon.py:221 #, python-brace-format msgid "Listening on {kind} port {port}" msgstr "" -#: daemon.py:236 +#: daemon.py:291 #, python-brace-format msgid "Connect to {host}:{port}" msgstr "" -#: daemon.py:240 +#: daemon.py:299 #, python-brace-format msgid "Cannot connect to {host}:{port}" msgstr "" @@ -95,7 +95,28 @@ msgstr "" msgid "Use the language preference set in the browser" msgstr "" -#: middleware.py:130 +#: menu.py:106 +msgid "Visibility" +msgstr "" + +#: menu.py:108 +msgid "Data" +msgstr "" + +#: menu.py:110 templates/base.html:131 +msgid "System" +msgstr "" + +#: menu.py:112 modules/networks/templates/connection_show.html:259 +#: modules/security/__init__.py:35 +msgid "Security" +msgstr "" + +#: menu.py:114 +msgid "Administration" +msgstr "" + +#: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." msgstr "" @@ -112,12 +133,12 @@ msgstr "" msgid "{box_name} Web Interface (Plinth)" msgstr "" -#: modules/apache/components.py:154 +#: modules/apache/components.py:159 #, python-brace-format msgid "Access URL {url} on tcp{kind}" msgstr "" -#: modules/apache/components.py:157 +#: modules/apache/components.py:162 #, python-brace-format msgid "Access URL {url}" msgstr "" @@ -137,7 +158,7 @@ msgstr "" msgid "Service Discovery" msgstr "" -#: modules/avahi/__init__.py:60 +#: modules/avahi/__init__.py:61 msgid "Local Network Domain" msgstr "" @@ -145,35 +166,35 @@ msgstr "" msgid "Backups allows creating and managing backup archives." msgstr "" -#: modules/backups/__init__.py:44 modules/backups/__init__.py:167 -#: modules/backups/__init__.py:212 +#: modules/backups/__init__.py:44 modules/backups/__init__.py:168 +#: modules/backups/__init__.py:213 msgid "Backups" msgstr "" -#: modules/backups/__init__.py:164 +#: modules/backups/__init__.py:165 msgid "" "Enable an automatic backup schedule for data safety. Prefer an encrypted " "remote backup location or an extra attached disk." msgstr "" -#: modules/backups/__init__.py:170 +#: modules/backups/__init__.py:171 msgid "Enable a Backup Schedule" msgstr "" -#: modules/backups/__init__.py:174 modules/backups/__init__.py:221 -#: modules/privacy/__init__.py:76 modules/storage/__init__.py:314 +#: modules/backups/__init__.py:175 modules/backups/__init__.py:222 +#: modules/privacy/__init__.py:77 modules/storage/__init__.py:315 #, python-brace-format msgid "Go to {app_name}" msgstr "" -#: modules/backups/__init__.py:209 +#: modules/backups/__init__.py:210 #, python-brace-format msgid "" "A scheduled backup failed. Past {error_count} attempts for backup did not " "succeed. The latest error is: {error_message}" msgstr "" -#: modules/backups/__init__.py:217 +#: modules/backups/__init__.py:218 msgid "Error During Backup" msgstr "" @@ -400,7 +421,7 @@ msgstr "" msgid "Existing repository is not encrypted." msgstr "" -#: modules/backups/repository.py:335 +#: modules/backups/repository.py:337 #, python-brace-format msgid "{box_name} storage" msgstr "" @@ -747,7 +768,7 @@ msgid "Permissions for anonymous users, who have not provided a password." msgstr "" #: modules/bepasty/forms.py:27 modules/bepasty/templates/bepasty.html:30 -#: modules/users/forms.py:110 modules/users/forms.py:233 +#: modules/users/forms.py:103 msgid "Permissions" msgstr "" @@ -824,8 +845,9 @@ msgstr "" #: modules/bepasty/views.py:88 modules/diagnostics/views.py:52 #: modules/searx/views.py:35 modules/searx/views.py:46 -#: modules/security/views.py:56 modules/tor/views.py:73 -#: modules/torproxy/views.py:71 modules/zoph/views.py:74 +#: modules/security/views.py:56 modules/snapshot/views.py:158 +#: modules/tor/views.py:73 modules/torproxy/views.py:71 +#: modules/upgrades/views.py:83 modules/zoph/views.py:74 msgid "Configuration updated." msgstr "" @@ -909,7 +931,7 @@ msgstr "" #: modules/bind/views.py:61 modules/config/views.py:98 #: modules/coturn/views.py:40 modules/deluge/views.py:35 #: modules/dynamicdns/views.py:78 modules/ejabberd/views.py:95 -#: modules/email/views.py:45 modules/matrixsynapse/views.py:146 +#: modules/email/views.py:45 modules/matrixsynapse/views.py:149 #: modules/minetest/views.py:55 modules/mumble/views.py:37 #: modules/pagekite/forms.py:74 modules/privacy/views.py:36 #: modules/quassel/views.py:29 modules/roundcube/views.py:32 @@ -1081,7 +1103,7 @@ msgstr "" msgid "Configure" msgstr "" -#: modules/config/__init__.py:62 modules/config/forms.py:68 +#: modules/config/__init__.py:63 modules/config/forms.py:68 #: modules/dynamicdns/forms.py:82 modules/names/templates/names.html:16 msgid "Domain Name" msgstr "" @@ -1262,7 +1284,7 @@ msgstr "" msgid "Date & Time" msgstr "" -#: modules/datetime/__init__.py:122 +#: modules/datetime/__init__.py:123 msgid "Time synchronized to NTP server" msgstr "" @@ -1319,77 +1341,77 @@ msgstr "" msgid "Bittorrent client written in Python/PyGTK" msgstr "" -#: modules/diagnostics/__init__.py:27 +#: modules/diagnostics/__init__.py:28 msgid "" "The system diagnostic test will run a number of checks on your system to " "confirm that applications and services are working as expected." msgstr "" -#: modules/diagnostics/__init__.py:51 modules/diagnostics/__init__.py:236 +#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:240 msgid "Diagnostics" msgstr "" -#: modules/diagnostics/__init__.py:95 +#: modules/diagnostics/__init__.py:98 msgid "passed" msgstr "" -#: modules/diagnostics/__init__.py:96 modules/networks/views.py:50 +#: modules/diagnostics/__init__.py:99 modules/networks/views.py:50 msgid "failed" msgstr "" -#: modules/diagnostics/__init__.py:97 +#: modules/diagnostics/__init__.py:100 msgid "error" msgstr "" -#: modules/diagnostics/__init__.py:98 +#: modules/diagnostics/__init__.py:101 msgid "warning" msgstr "" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: modules/diagnostics/__init__.py:202 +#: modules/diagnostics/__init__.py:206 msgid "MiB" msgstr "" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: modules/diagnostics/__init__.py:207 +#: modules/diagnostics/__init__.py:211 msgid "GiB" msgstr "" -#: modules/diagnostics/__init__.py:214 +#: modules/diagnostics/__init__.py:218 msgid "You should disable some apps to reduce memory usage." msgstr "" -#: modules/diagnostics/__init__.py:219 +#: modules/diagnostics/__init__.py:223 msgid "You should not install any new apps on this system." msgstr "" -#: modules/diagnostics/__init__.py:231 +#: modules/diagnostics/__init__.py:235 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " "{memory_available_unit} free. {advice_message}" msgstr "" -#: modules/diagnostics/__init__.py:233 +#: modules/diagnostics/__init__.py:237 msgid "Low Memory" msgstr "" -#: modules/diagnostics/__init__.py:264 +#: modules/diagnostics/__init__.py:268 msgid "Running diagnostics" msgstr "" -#: modules/diagnostics/__init__.py:307 +#: modules/diagnostics/__init__.py:311 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: modules/diagnostics/__init__.py:308 +#: modules/diagnostics/__init__.py:312 msgid "Diagnostics results" msgstr "" -#: modules/diagnostics/__init__.py:313 +#: modules/diagnostics/__init__.py:317 msgid "Go to diagnostics results" msgstr "" @@ -1465,7 +1487,7 @@ msgstr "" msgid "Result" msgstr "" -#: modules/diagnostics/views.py:107 +#: modules/diagnostics/views.py:111 msgid "Diagnostic Test" msgstr "" @@ -1500,7 +1522,7 @@ msgstr "" msgid "Dynamic DNS Client" msgstr "" -#: modules/dynamicdns/__init__.py:74 +#: modules/dynamicdns/__init__.py:75 msgid "Dynamic Domain Name" msgstr "" @@ -1589,7 +1611,7 @@ msgid "Use HTTP basic authentication" msgstr "" #: modules/dynamicdns/forms.py:88 modules/networks/forms.py:207 -#: modules/users/forms.py:67 +#: modules/users/forms.py:129 msgid "Username" msgstr "" @@ -1957,29 +1979,29 @@ msgstr "" msgid "Firewall" msgstr "" -#: modules/firewall/__init__.py:271 +#: modules/firewall/__init__.py:273 msgid "Default zone is external" msgstr "" -#: modules/firewall/__init__.py:280 +#: modules/firewall/__init__.py:283 msgid "Firewall backend is nftables" msgstr "" -#: modules/firewall/__init__.py:293 +#: modules/firewall/__init__.py:297 msgid "Direct passthrough rules exist" msgstr "" -#: modules/firewall/components.py:136 +#: modules/firewall/components.py:139 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: modules/firewall/components.py:147 +#: modules/firewall/components.py:153 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: modules/firewall/components.py:153 +#: modules/firewall/components.py:159 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2097,11 +2119,11 @@ msgstr "" msgid "Read-write access to Git repositories" msgstr "" -#: modules/gitweb/__init__.py:50 modules/gitweb/manifest.py:11 +#: modules/gitweb/__init__.py:48 modules/gitweb/manifest.py:11 msgid "Gitweb" msgstr "" -#: modules/gitweb/__init__.py:51 +#: modules/gitweb/__init__.py:49 msgid "Simple Git Hosting" msgstr "" @@ -2538,7 +2560,7 @@ msgid "I2P" msgstr "" #: modules/i2p/__init__.py:53 modules/tor/__init__.py:63 -#: modules/torproxy/__init__.py:56 +#: modules/torproxy/__init__.py:57 msgid "Anonymity Network" msgstr "" @@ -2897,7 +2919,7 @@ msgstr "" msgid "Certificates" msgstr "" -#: modules/letsencrypt/__init__.py:104 +#: modules/letsencrypt/__init__.py:105 msgid "Cannot test: No domains are configured." msgstr "" @@ -2969,27 +2991,27 @@ msgstr "" #: modules/letsencrypt/views.py:46 #, python-brace-format -msgid "Failed to revoke certificate for domain {domain}: {error}" +msgid "Failed to revoke certificate for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:76 +#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:81 +#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 #, python-brace-format -msgid "Failed to obtain certificate for domain {domain}: {error}" +msgid "Failed to obtain certificate for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:93 +#: modules/letsencrypt/views.py:95 #, python-brace-format msgid "Certificate successfully deleted for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:98 +#: modules/letsencrypt/views.py:100 #, python-brace-format -msgid "Failed to delete certificate for domain {domain}: {error}" +msgid "Failed to delete certificate for domain {domain}" msgstr "" #: modules/matrixsynapse/__init__.py:26 @@ -3138,7 +3160,7 @@ msgid "" "go to Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3497,19 +3519,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -3988,11 +4010,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4629,7 +4646,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4845,15 +4862,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4872,14 +4889,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4890,15 +4907,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5724,7 +5741,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5792,33 +5809,32 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" +#: modules/snapshot/views.py:160 +msgid "Configuration update failed." msgstr "" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5834,7 +5850,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5906,121 +5922,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6125,9 +6141,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6162,7 +6177,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6304,7 +6319,7 @@ msgstr "" msgid "Error configuring app: {error}" msgstr "" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6313,20 +6328,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6455,32 +6470,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6627,51 +6642,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6679,25 +6677,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6706,30 +6704,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6738,57 +6718,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7270,7 +7273,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7283,7 +7286,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7291,11 +7294,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7344,92 +7347,77 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "" -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "" -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7511,10 +7499,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7782,11 +7766,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, 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 faaa483a4..186ecc93e 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Greek " "Lets Encrypt για να αποκτήσετε ένα." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -4173,7 +4202,7 @@ msgstr "Secure Shell" msgid "Services" msgstr "Υπηρεσία" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4182,7 +4211,7 @@ msgstr "" "Ethernet, Wi-Fi ή PPPoE. Μοιραστείτε αυτήν τη σύνδεση με άλλες συσκευές στο " "δίκτυο." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4190,7 +4219,7 @@ msgstr "" "Οι συσκευές που διαχειρίζονται μέσω άλλων μεθόδων ενδέχεται να μην είναι " "διαθέσιμες για ρύθμιση παραμέτρων εδώ." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Δίκτυα" @@ -4697,11 +4726,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Αυτή η σύνδεση δεν είναι ενεργή." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Ασφάλεια" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5447,7 +5471,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Δημόσια ορατότητα" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "Όνομα διαδικτύου Pagekite" @@ -5694,17 +5718,17 @@ msgstr "Τερματισμός τώρα" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 #, fuzzy #| msgid "Privoxy" msgid "Privacy" msgstr "Privoxy" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5723,7 +5747,7 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5735,7 +5759,7 @@ msgstr "" "τον έλεγχο της πρόσβασης και την κατάργηση διαφημίσεων και άλλων " "ανεπιθύμητων μηνυμάτων στο Internet. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, fuzzy, python-brace-format #| msgid "" #| "You can use Privoxy by modifying your browser proxy settings to your " @@ -5758,15 +5782,15 @@ msgstr "" "href=\"http://config.privoxy.org\">http://config.privoxy.org/ ή http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Διακομιστής μεσολάβησης διαδικτύου" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -6821,7 +6845,7 @@ msgstr "Ημερομηνία" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Διαγραφή στιγμιότυπων" @@ -6901,36 +6925,39 @@ msgstr "Διαχείριση στιγμιότυπων" msgid "Created snapshot." msgstr "Το στιγμιότυπο δημιουργήθηκε." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Η ρύθμιση παραμέτρων των στιγμιότυπων αποθήκευσης Ενημερώθηκε" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Η ρύθμιση παραμέτρων Ενημερώθηκε." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Σφάλμα ενέργειας: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Διαγράφηκαν επιλεγμένα στιγμιότυπα" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Η διαγραφή του χρήστη LDAP απέτυχε." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" "Το στιγμιότυπο χρησιμοποιείται αυτήν τη στιγμή. Παρακαλώ προσπαθήστε ξανά " "αργότερα." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "Πραγματοποιήθηκε επαναφορά στο στιγμιότυπο #{number}." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" "Πρέπει να γίνει επανεκκίνηση του συστήματος για να ολοκληρωθεί η επαναφορά." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Επαναφορά σε στιγμιότυπο" @@ -6951,7 +6978,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Διακομιστής SSH" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 #, fuzzy #| msgid "Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)" @@ -7037,91 +7064,91 @@ msgstr "" "χρησιμοποιούνται προς το παρόν, να προσθέσετε και να αφαιρέσετε αφαιρούμενα " "μέσα, επεκτείνετε το root διαμέρισμα κλπ." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Χώρος Αποθήκευσης" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} bytes" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "Η ενέργεια απέτυχε." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "Η ενέργεια ακυρώθηκε." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Η συσκευή είναι ήδη προς αφαίρεση." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "Η ενέργεια δεν υποστηρίζεται λόγω μη υποστήριξης προγραμματος οδηγού." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "Η ενέργεια απέτυχε επειδή διήρκησε πολύ χρόνο." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" "Η ενέργεια θα ξυπνήσει ένα δίσκο που είναι σε μια βαθιά κατάσταση ύπνου." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Γίνεται προσπάθεια αφαίρεσης μιας συσκευής που είναι απασχολημένη." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "Η ενέργια έχει ήδη ακυρωθεί." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "Δεν έχετε εξουσιοδότηση για την εκτέλεση της συγκεκριμένης ενέργειας." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Η συσκευή έχει ήδη προστεθεί." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Η συσκευή δεν είναι τοποθετημένη." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "Δεν έχετε εξουσιοδότηση για την εκτέλεση της συγκεκριμένης ενέργειας." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Η συσκευή έχει ήδη προστεθεί από άλλο χρήστη." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, fuzzy, no-python-format, python-brace-format #| msgid "" #| "Warning: Low space on system partition ({percent_used}% used, " @@ -7131,33 +7158,33 @@ msgstr "" "Προειδοποίηση: χαμηλός χώρος στο διαμέρισμα του συστήματος ({percent_used}% " "χρησιμοποιείται, {free_space} είναι ελεύθερος)." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Power" msgid "Go to Power" @@ -7270,9 +7297,10 @@ msgstr "{drive_vendor} {drive_model} μπορεί να αποσυνδεθεί μ msgid "Device can be safely unplugged." msgstr "Η συσκευή μπορεί να αποσυνδεθεί με ασφάλεια." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Σφάλμα κατά την αφαίρεση της συσκευής: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7326,7 +7354,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Συγχρονισμός αρχείων" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7506,7 +7534,7 @@ msgstr "Παρουσιάστηκε σφάλμα κατά τη ρύθμιση π msgid "Error configuring app: {error}" msgstr "Σφάλμα κατά την εγκατάσταση της εφαρμογής: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7515,22 +7543,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "Tor Socks Proxy" msgid "Tor Proxy" msgstr "Tor διακομιστής μεσολάβησης τύπου socks5" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Tor διακομιστής μεσολάβησης τύπου socks5" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Πρόσβαση στη διεύθυνση URL {url} με tcp {kind} μέσω του Tor" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Επιβεβαίωση χρήσης του Tor στο {url} στο προτόκολλο TCP {kind}" @@ -7690,7 +7718,7 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 #, fuzzy @@ -7698,30 +7726,30 @@ msgstr "" msgid "Software Update" msgstr "Το μέρισμα διαγράφηκε." -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 #, fuzzy #| msgid "FreedomBox Foundation" msgid "FreedomBox Updated" msgstr "Ίδρυμα FreedomBox" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 #, fuzzy #| msgid "Automatic upgrades disabled" msgid "Distribution update started" msgstr "Oι αυτόματες ενημερώσεις απενεργοποιήθηκαν" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7908,50 +7936,31 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Oι αυτόματες ενημερώσεις ενεργοποιήθηκαν" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "Σφάλμα κατά τη ρύθμιση των αυτόματων ενημερώσεων: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Oι αυτόματες ενημερώσεις ενεργοποιήθηκαν" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Oι αυτόματες ενημερώσεις απενεργοποιήθηκαν" - -#: modules/upgrades/views.py:86 -#, fuzzy -#| msgid "Automatic upgrades enabled" -msgid "Distribution upgrade enabled" -msgstr "Oι αυτόματες ενημερώσεις ενεργοποιήθηκαν" - -#: modules/upgrades/views.py:89 -#, fuzzy -#| msgid "Automatic upgrades disabled" -msgid "Distribution upgrade disabled" -msgstr "Oι αυτόματες ενημερώσεις απενεργοποιήθηκαν" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Ξεκίνησε η διαδικασία αναβάθμισης." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Η εκκίνηση της αναβάθμισης απέτυχε." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 #, fuzzy #| msgid "Automatic upgrades enabled" msgid "Starting distribution upgrade test." msgstr "Oι αυτόματες ενημερώσεις ενεργοποιήθηκαν" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 #, fuzzy #| msgid "" #| "Create and managed user accounts. These accounts serve as centralized " @@ -7968,7 +7977,7 @@ msgstr "" "είναι μέρος μιας ομάδας για να εξουσιοδοτήσουν το χρήστη να αποκτήσει " "πρόσβαση στην εφαρμογή." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7980,25 +7989,25 @@ msgstr "" "σελίδα. Ωστόσο, μόνο οι χρήστες της ομάδας admin μπορούν να " "τροποποιήσουν τις εφαρμογές ή τις ρυθμίσεις του συστήματος." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Χρήστες και ομάδες" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Πρόσβαση σε όλες τις υπηρεσίες και τις ρυθμίσεις συστήματος" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Ελέγξτε την καταχώρηση LDAP \"{search_item}\"" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -8007,36 +8016,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "Το όνομα χρήστη είναι δεσμευμένο." -#: modules/users/forms.py:62 -#, fuzzy -#| msgid "Invalid server name" -msgid "Enter a valid username." -msgstr "Μη έγκυρο όνομα διακομιστή" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -#, fuzzy -#| msgid "Administrator Password" -msgid "Authorization Password" -msgstr "Κωδικός Πρόσβασης Διαχειριστή" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -#, fuzzy -#| msgid "Show password" -msgid "Invalid password." -msgstr "Εμφάνιση κωδικού" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -8058,23 +8043,52 @@ msgstr "" "υπηρεσίες. Μπορούν επίσης να συνδεθούν στο σύστημα μέσω του SSH και να έχουν " "δικαιώματα διαχειριστή (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a valid username." +msgstr "Μη έγκυρο όνομα διακομιστή" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +#, fuzzy +#| msgid "Administrator Password" +msgid "Authorization Password" +msgstr "Κωδικός Πρόσβασης Διαχειριστή" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +#, fuzzy +#| msgid "Show password" +msgid "Invalid password." +msgstr "Εμφάνιση κωδικού" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "Η δημιουργία χρήστη LDAP απέτυχε." -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "Απέτυχε η προσθήκη νέου χρήστη στην ομάδα {group}." -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Εξουσιοδοτημένα κλειδιά SSH" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -8085,37 +8099,37 @@ msgstr "" "Μπορείτε να εισαγάγετε πολλαπλά κλειδιά, ένα σε κάθε γραμμή. Οι κενές " "γραμμές και οι γραμμές που ξεκινούν με # θα αγνοηθούν." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Η μετονομασία του χρήστη LDAP απέτυχε." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Απέτυχε η κατάργηση του χρήστη από την ομάδα." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Απέτυχε η προσθήκη χρήστη στην ομάδα." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "Δεν ήταν δυνατό να προστεθούν τα κλειδιά SSH." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Απέτυχε η αλλαγή της κατάστασης χρήστη." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Η αλλαγή του κωδικού πρόσβασης χρήστη LDAP απέτυχε." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "Αποτυχία προσθήκης νέου χρήστη στην ομάδα διαχειριστών." -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Ο λογαριασμός χρήστη δημιουργήθηκε, τώρα είστε συνδεδεμένοι" @@ -8678,7 +8692,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8691,7 +8705,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8699,11 +8713,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -8755,110 +8769,92 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "Εγκαθίσταται" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "Λήψη" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "Αλλαγή μέσου" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "αρχείο ρυθμίσεων: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install Apps" msgid "Installing app" msgstr "Εγκαταστήσετε Εφαρμογές" -#: setup.py:43 +#: setup.py:41 #, fuzzy #| msgid "Updating..." msgid "Updating app" msgstr "Eνημερώνεται..." -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Σφάλμα κατά την εγκατάσταση της εφαρμογής: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Σφάλμα κατά την εγκατάσταση της εφαρμογής: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Σφάλμα κατά την εγκατάσταση της εφαρμογής: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Σφάλμα κατά την εγκατάσταση της εφαρμογής: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Η εφαρμογή εγκαταστάθηκε." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "Τελευταία ενημέρωση" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install Apps" msgid "Uninstalling app" msgstr "Εγκαταστήσετε Εφαρμογές" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Σφάλμα κατά την εγκατάσταση της εφαρμογής: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Σφάλμα κατά την εγκατάσταση της εφαρμογής: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Η εφαρμογή εγκαταστάθηκε." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -8962,10 +8958,6 @@ msgstr "Εφαρμογές" msgid " System" msgstr " Σύστημα" -#: templates/base.html:131 -msgid "System" -msgstr "Σύστημα" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Αλλαγή κωδικού πρόσβασης" @@ -9276,11 +9268,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Οι ρυθμίσεις δεν άλλαξαν" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -9289,6 +9281,44 @@ msgstr "" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Η ρύθμιση παραμέτρων των στιγμιότυπων αποθήκευσης Ενημερώθηκε" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Σφάλμα ενέργειας: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Oι αυτόματες ενημερώσεις ενεργοποιήθηκαν" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Oι αυτόματες ενημερώσεις απενεργοποιήθηκαν" + +#, fuzzy +#~| msgid "Automatic upgrades enabled" +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Oι αυτόματες ενημερώσεις ενεργοποιήθηκαν" + +#, fuzzy +#~| msgid "Automatic upgrades disabled" +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Oι αυτόματες ενημερώσεις απενεργοποιήθηκαν" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Σφάλμα κατά την εγκατάσταση της εφαρμογής: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Σφάλμα κατά την εγκατάσταση της εφαρμογής: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Σφάλμα κατά την εγκατάσταση της εφαρμογής: {string} {details}" + #~ msgid "Page source" #~ msgstr "Πηγή της σελίδας" diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index b66f76199..cef703c4e 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2024-02-06 14:01+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish Let's Encrypt para " "obtener uno." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" "La configuración del registro no se puede actualizar cuando la aplicación " @@ -4025,7 +4054,7 @@ msgstr "Intérprete de órdenes seguro" msgid "Services" msgstr "Servicios" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4033,7 +4062,7 @@ msgstr "" "Configurar dispositivos de red. Conectar con Internet mediante Ethernet, Wi-" "Fi o PPPoE. Compartir esa conexión con otros dispositivos de la red." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4041,7 +4070,7 @@ msgstr "" "Los dispositivos administrados mediante otros métodos quizá no estén " "disponibles para configurarse aquí." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Redes" @@ -4604,11 +4633,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Esta conexión no está activa." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Protección" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5318,7 +5342,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Visibilidad pública" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "Dominio PageKite" @@ -5559,15 +5583,15 @@ msgstr "Apagar ahora" msgid "Manage system-wide privacy settings." msgstr "Gestionar la configuración de la privacidad de todo el sistema." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "Privacidad" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "Por favor, compruebe la configuración de privacidad." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "Revisar la configuración de la privacidad" @@ -5594,7 +5618,7 @@ msgstr "" "target=\"_blank\">popcon.debian.org. La transmisión se realiza a través " "de la red Tor para mayor anonimato cuando la aplicación Tor está habilitada." -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5605,7 +5629,7 @@ msgstr "" "cabeceras HTTP, controlar el acceso y eliminar publicidad y otra basura de " "Internet. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5622,15 +5646,15 @@ msgstr "" "config.privoxy.org\">http://config.privoxy.org/ o http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Proxy Web" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Acceso a {url} con proxy {proxy} en tcp {kind}" @@ -6616,7 +6640,7 @@ msgstr "Fecha" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Eliminar instantáneas" @@ -6689,34 +6713,37 @@ msgstr "Gestionar instantáneas" msgid "Created snapshot." msgstr "Instantánea creada." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Configuración de instantáneas actualizada" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Configuración actualizada." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Acción de error: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Las instantáneas seleccionadas fueron eliminadas" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Ha fallado la eliminación del o de la usuaria LDAP." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" "La instantánea se está usando actualmente. Inténtelo de nuevo más tarde." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "Sistema restaurado a la instantánea {number}." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "Debe reiniciar el sistema para completar la restauración." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Restaurar a instantánea" @@ -6736,7 +6763,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Servidor de intérprete de órdenes seguro (SSH)" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "Inicio de sesión remoto mediante Secure Shell (SSH)" @@ -6819,105 +6846,105 @@ msgstr "" "{box_name}. Puede ver el medio de almacenamiento que está usando, montar y " "desmontar medios extraíbles, ampliar la partición raíz, etc." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Almacenamiento" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} bytes" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "Falló la operación." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "Se ha cancelado la operación." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "El dispositivo ya se está desmontando." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "No se soporta esta operación por falta de un driver o herramienta." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "La operación agotó el tiempo." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "La operación podría activar un disco que está en estado de reposo." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Tratando de desmontar un dispositivo ocupado." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "Ya se ha cancelado la operación." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "No tiene autorización para la operación solicitada." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "El dispositivo ya está montado." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "El dispositivo no está montado." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "La operación solicitada no está permitida." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "El dispositivo está ya montado por otro usuario." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" "Poco espacio en la partición del sistema: {percent_used}% usado, " "{free_space} libre." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Poco espacio en disco" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Fallo de disco inminente" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -6926,7 +6953,7 @@ msgstr "" "El disco {id} informa que es probable que falle en breve. Copie los datos " "mientras pueda y reemplace el disco." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " @@ -6936,11 +6963,11 @@ msgstr "" "Si el problema persiste después de reiniciar, compruebe si hay errores en el " "dispositivo de almacenamiento." -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "Sistema de archivos raíz de sólo lectura" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "Ir a la energía" @@ -7054,9 +7081,10 @@ msgstr "Ya puede desconectar {drive_vendor} {drive_model} con seguridad." msgid "Device can be safely unplugged." msgstr "El dispositivo ya se puede desconectar con seguridad." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Error al expulsar el dispositivo: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7102,7 +7130,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Sincronización de archivos" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7275,7 +7303,7 @@ msgstr "Actualizando la configuración" msgid "Error configuring app: {error}" msgstr "Error al configurar la aplicación: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7288,20 +7316,20 @@ msgstr "" "utilizado por varias aplicaciones para acceder a Internet a través de la red " "Tor. La censura del ISP puede eludirse usando puentes ascendentes." -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "Proxy de Tor" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Proxy Socks para Tor" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Acceso a URL {url} sobre tcp {kind} vía Tor" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Confirmar uso de Tor en {url} sobre tcp {kind}" @@ -7463,21 +7491,21 @@ msgstr "" "tiempo. Si se decide retrasar el reinicio del sistema, éste se hará de forma " "automática a las 02:00 h." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Actualización de software (Update)" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox actualizado" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "No se pudo iniciar la actualización de la distribución" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7488,11 +7516,11 @@ msgstr "" "libres. Si está habilitada, la actualización de la distribución se " "reintentará tras 24h ." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "Iniciada la actualización de la distribución" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7670,44 +7698,29 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Pruebe la actualización de distribución ahora" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "Error al configurar las actualizaciones desatendidas: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Actualizaciones automáticas activadas" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Actualizaciones automáticas desactivadas" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "Actualización automática de distibución activada" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Actualización automática de distibución desactivada" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Proceso de actualización iniciado." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "No se ha podido iniciar la actualización." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Las actualizaciones funcionales frecuentes están activadas." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "Comenzando la prueba de la actualización de la distribución." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7718,7 +7731,7 @@ msgstr "" "requieren que además la cuenta de usuario conste en un grupo para " "autorizarles a acceder." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7730,25 +7743,25 @@ msgstr "" "sólo los usuarios del grupo admin pueden cambiar configuraciones de " "apps o del sistema." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Usuarias/os y grupos" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Acceso a todos los servicios y configuraciones del sistema" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Comprobar la entrada LDAP \"{search_item}\"" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "Comprobar la configuración de nslcd \"{key} {value}\"" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "Comprueba la configuración del nsswitch \"{database}\"" @@ -7757,32 +7770,12 @@ msgstr "Comprueba la configuración del nsswitch \"{database}\"" msgid "Username is taken or is reserved." msgstr "El nombre de usuaria/o está en uso o reservado." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Indique un nombre de usuario válido." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." -msgstr "Obligatorio. Hasta 150 caracteres. Solo letras, números y @/./-/_ ." - -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Contraseña de autorización" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Introduce la contraseña del usuario \"{user}\" para autorizar modificaciones " -"en la cuenta." -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Contraseña no válida." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7797,21 +7790,46 @@ msgstr "" "servicios, también podrán acceder al sistema por SSH con privilegios de " "administración (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Indique un nombre de usuario válido." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "Obligatorio. Hasta 150 caracteres. Solo letras, números y @/./-/_ ." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Contraseña de autorización" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" +"Introduce la contraseña del usuario \"{user}\" para autorizar modificaciones " +"en la cuenta." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Contraseña no válida." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Ha fallado la creación de usuaria/o LDAP: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Ha fallado añadir usuaria/o nuevo al grupo {group}: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Claves de SSH autorizadas" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7821,36 +7839,36 @@ msgstr "" "de una clave. Puede introducir más de una clave, cada una en una línea. Las " "líneas en blanco y las que empiecen por # se ignorarán." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Ha fallado renombrar al o la usuaria LDAP." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Ha fallado la eliminación del o de la usuaria del grupo." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Ha fallado añadir al o la usuaria al grupo." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "No es posible configurar las claves SSH." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Ha fallado al cambiar el estado del usuario." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Ha fallado cambiar la clave del o de la usuaria LDAP." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Ha fallado añadir usuaria/o nueva/o al grupo admin: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Creada cuenta de usuaria/o, ya está usted en el sistema" @@ -8391,7 +8409,7 @@ msgstr "" "WordPress o blog a los administradores. Habilítalo solo después de ejecutar " "la configuración inicial de WordPress." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8413,7 +8431,7 @@ msgstr "" "de mapa y calendario. Se pueden compartir fotos sueltas con otras personas " "enviándoles un enlace directo." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8424,11 +8442,11 @@ msgstr "" "Para añadir más usuarios hay que crear cuentas con el mismo nombre tanto en " "Zoph como en {box_name} ." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Organizador de fotografías" @@ -8480,93 +8498,78 @@ msgstr "Esperando a empezar: {name}" msgid "Finished: {name}" msgstr "Terminó: {name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" "El paquete {package_expression} no está disponible para su instalación." -#: package.py:231 +#: package.py:226 #, 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})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "instalando" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "descargando" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "cambio de medio" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "archivo de configuración: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "Tiempo máximo esperando al administrador de paquetes" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "Instalando app" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "Actualizando app" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "Error al instalar la app: {string} {details}" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "Error al actualizar la aplicación: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "Error al instalar la app: {error}" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "Error al actualizar la app: {error}" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "App instalada." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "App actualizada" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "Instalando app" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "Error al desinstalar la aplicación: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "Error desinstalando la aplicación: {error}" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "Aplicación desinstalada." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "Actualizando los paquetes de la app" @@ -8660,10 +8663,6 @@ msgstr "Aplicaciones" msgid " System" msgstr " Sistema" -#: templates/base.html:131 -msgid "System" -msgstr "Sistema" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Cambiar clave de acceso" @@ -8959,11 +8958,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." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Configuración sin cambio" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "antes de desinstalar {app_id}" @@ -8972,6 +8971,37 @@ msgstr "antes de desinstalar {app_id}" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Configuración de instantáneas actualizada" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Acción de error: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Actualizaciones automáticas activadas" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Actualizaciones automáticas desactivadas" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Actualización automática de distibución activada" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Actualización automática de distibución desactivada" + +#, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Error al instalar la app: {string} {details}" + +#, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Error al actualizar la aplicación: {string} {details}" + +#, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Error al desinstalar la aplicación: {string} {details}" + #~ msgid "Page source" #~ msgstr "Página origen" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index 9ff2da9d9..798e6cd96 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Persian Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3948,19 +3974,19 @@ msgstr "پوستهٔ ایمن" msgid "Services" msgstr "سرویس" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "شبکه‌ها" @@ -4471,11 +4497,6 @@ msgstr "آی‌پی ن۶" msgid "This connection is not active." msgstr "این اتصال فعال نیست." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "امنیت" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5178,7 +5199,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 #, fuzzy #| msgid "Available Domains" msgid "PageKite Domain" @@ -5396,15 +5417,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5423,14 +5444,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5441,15 +5462,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -6349,7 +6370,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 #, fuzzy #| msgid "Delete %(name)s" msgid "Delete Snapshots" @@ -6423,37 +6444,38 @@ msgstr "پاک‌کردن %(name)s" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 +#: modules/snapshot/views.py:160 #, fuzzy #| msgid "Configuration updated" -msgid "Storage snapshots configuration updated" +msgid "Configuration update failed." msgstr "پیکربندی به‌روز شد" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 #, fuzzy #| msgid "Delete %(name)s" msgid "Deleted selected snapshots" msgstr "پاک‌کردن %(name)s" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Delete %(name)s" +msgid "Deleting snapshot failed." +msgstr "پاک‌کردن %(name)s" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -6469,7 +6491,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -6549,127 +6571,127 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, fuzzy, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size} بایت" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, fuzzy, python-brace-format #| msgid "{disk_size} KiB" msgid "{disk_size:.1f} KiB" msgstr "{disk_size} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, fuzzy, python-brace-format #| msgid "{disk_size} MiB" msgid "{disk_size:.1f} MiB" msgstr "{disk_size} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, fuzzy, python-brace-format #| msgid "{disk_size} GiB" msgid "{disk_size:.1f} GiB" msgstr "{disk_size} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, fuzzy, python-brace-format #| msgid "{disk_size} TiB" msgid "{disk_size:.1f} TiB" msgstr "{disk_size} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 #, fuzzy #| msgid "The requested domain is already registered." msgid "The device is already mounted." msgstr "دامنهٔ درخواستی از قبل ثبت شده است." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6787,9 +6809,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6824,7 +6845,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6975,7 +6996,7 @@ msgstr "پیکربندی فعلی شبکه" msgid "Error configuring app: {error}" msgstr "خطا هنگام نصب برنامه: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6984,20 +7005,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -7126,7 +7147,7 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 #, fuzzy @@ -7134,28 +7155,28 @@ msgstr "" msgid "Software Update" msgstr "{name} پاک شد." -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 #, fuzzy msgid "FreedomBox Updated" msgstr "FreedomBox" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 #, fuzzy msgid "Distribution update started" msgstr "برنامه نصب شد." -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7313,53 +7334,35 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "برنامه نصب شد." -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -#, fuzzy -msgid "Distribution upgrade disabled" -msgstr "برنامه نصب شد." - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 #, fuzzy msgid "Starting distribution upgrade test." msgstr "برنامه نصب شد." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7367,25 +7370,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7394,36 +7397,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -#, fuzzy -#| msgid "Invalid server name" -msgid "Enter a valid username." -msgstr "نام کاربری معتبر نیست" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -#, fuzzy -#| msgid "Administrator Account" -msgid "Authorization Password" -msgstr "حساب مدیر" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -#, fuzzy -#| msgid "Show password" -msgid "Invalid password." -msgstr "رمز را نشان بده" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7432,62 +7411,91 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a valid username." +msgstr "نام کاربری معتبر نیست" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +#, fuzzy +#| msgid "Administrator Account" +msgid "Authorization Password" +msgstr "حساب مدیر" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +#, fuzzy +#| msgid "Show password" +msgid "Invalid password." +msgstr "رمز را نشان بده" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "ساختن کاربر LDAP شکست خورد." -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to {group} group: {error}" msgstr "افزودن کاربر به گروه مدیران شکست خورد." -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 #, fuzzy #| msgid "Failed to add new user to admin group." msgid "Failed to change user status." msgstr "افزودن کاربر به گروه مدیران شکست خورد." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "افزودن کاربر به گروه مدیران شکست خورد." -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "حساب کاربری ساخته شد، شما الان وارد سیستم هستید" @@ -8023,7 +8031,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8036,7 +8044,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8044,11 +8052,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -8100,101 +8108,86 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "خطا هنگام نصب برنامه: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "خطا هنگام نصب برنامه: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "خطا هنگام نصب برنامه: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "خطا هنگام نصب برنامه: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy msgid "App installed." msgstr "برنامه نصب شد." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "آخرین به‌روزرسانی" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Error installing application: {error}" msgid "Uninstalling app" msgstr "خطا هنگام نصب برنامه: {error}" -#: setup.py:124 -#, fuzzy, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "خطا هنگام نصب برنامه: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "خطا هنگام نصب برنامه: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy msgid "App uninstalled." msgstr "برنامه نصب شد." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -8278,10 +8271,6 @@ msgstr "برنامه‌ها" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -8563,11 +8552,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -8576,6 +8565,27 @@ msgstr "" msgid "Gujarati" msgstr "" +#, fuzzy +#~| msgid "Configuration updated" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "پیکربندی به‌روز شد" + +#, fuzzy +#~ msgid "Distribution upgrade disabled" +#~ msgstr "برنامه نصب شد." + +#, fuzzy, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "خطا هنگام نصب برنامه: {string} {details}" + +#, fuzzy, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "خطا هنگام نصب برنامه: {string} {details}" + +#, fuzzy, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "خطا هنگام نصب برنامه: {string} {details}" + #, fuzzy #~| msgid "Web Server" #~ msgid "ChatSecure" @@ -9277,11 +9287,6 @@ msgstr "" #~ msgid "Delete snapshot #%(number)s" #~ msgstr "پاک‌کردن %(name)s" -#, fuzzy -#~| msgid "Delete %(name)s" -#~ msgid "Delete Snapshot" -#~ msgstr "پاک‌کردن %(name)s" - #, fuzzy #~| msgid "Disks" #~ msgid "Disk" diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index 4cb919466..dc49c7a84 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -4106,19 +4134,19 @@ msgstr "SECURE SHELL (SSH)" msgid "Services" msgstr "SERVICE" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "NETWORKS" @@ -4632,11 +4660,6 @@ msgstr "IPV6" msgid "This connection is not active." msgstr "THIS CONNECTION IS NOT ACTIVE." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "SECURITY" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5403,7 +5426,7 @@ msgstr "PAGEKITE" msgid "Public Visibility" msgstr "PUBLIC VISIBILITY (PAGEKITE)" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 #, fuzzy #| msgid "PageKite Account" msgid "PageKite Domain" @@ -5650,17 +5673,17 @@ msgstr "SHUT DOWN NOW" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 #, fuzzy #| msgid "Enable Privoxy" msgid "Privacy" msgstr "ENABLE PRIVOXY" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5679,7 +5702,7 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 #, fuzzy #| msgid "" #| "Privoxy is a non-caching web proxy with advanced filtering capabilities " @@ -5694,7 +5717,7 @@ msgstr "" "ENHANCING PRIVACY, MODIFYING WEB PAGE DATA AND HTTP HEADERS, CONTROLLING " "ACCESS, AND REMOVING ADS AND OTHER OBNOXIOUS INTERNET JUNK." -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, fuzzy, python-brace-format #| msgid "" #| "You can use Privoxy by modifying your browser proxy settings to your " @@ -5716,19 +5739,19 @@ msgstr "" "config.privoxy.org\">HTTP://CONFIG.PRIVOXY.ORG/ OR HTTP://P.P.\"" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 #, fuzzy #| msgid "Enable Privoxy" msgid "Privoxy" msgstr "ENABLE PRIVOXY" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 #, fuzzy #| msgid "Privoxy Web Proxy" msgid "Web Proxy" msgstr "PRIVOXY WEB PROXY" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "ACCESS {url} WITH PROXY {proxy} ON TCP{kind}" @@ -6710,7 +6733,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 #, fuzzy #| msgid "Delete %(name)s" msgid "Delete Snapshots" @@ -6786,37 +6809,38 @@ msgstr "CREATE USER" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 +#: modules/snapshot/views.py:160 #, fuzzy -#| msgid "Configuration updated" -msgid "Storage snapshots configuration updated" -msgstr "CONFIGURATION UPDATED" +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "CONFIGURATION UPDATED." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "ACTION ERROR: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 #, fuzzy #| msgid "Delete %(name)s" msgid "Deleted selected snapshots" msgstr "DELETE %(name)s" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "DELETING LDAP USER FAILED." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -6832,7 +6856,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "SECURE SHELL (SSH) SERVER" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 #, fuzzy #| msgid "Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)" @@ -6914,131 +6938,131 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 #, fuzzy #| msgid "reStore" msgid "Storage" msgstr "RESTORE" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 #, fuzzy #| msgid "repro service is running" msgid "The device is already unmounting." msgstr "REPRO SERVICE IS RUNNING" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 #, fuzzy #| msgid "This service already exists" msgid "The device is already mounted." msgstr "THIS SERVICE ALREADY EXISTS" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 #, fuzzy #| msgid "repro service is not running" msgid "The device is not mounted." msgstr "REPRO SERVICE IS NOT RUNNING" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 #, fuzzy #| msgid "System" msgid "Read-only root filesystem" msgstr "SYSTEM" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Go to Networks" msgid "Go to Power" @@ -7158,9 +7182,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -7197,7 +7220,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 #, fuzzy #| msgid "" #| "Tor is an anonymous communication system. You can learn more about it " @@ -7373,7 +7396,7 @@ msgstr "AN ERROR OCCURRED DURING CONFIGURATION." msgid "Error configuring app: {error}" msgstr "ERROR INSTALLING PACKAGES: {string} {details}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7382,22 +7405,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "Privoxy Web Proxy" msgid "Tor Proxy" msgstr "PRIVOXY WEB PROXY" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "ACCESS URL {url} ON TCP{kind} VIA TOR" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "CONFIRM TOR USAGE AT {url} ON TCP{kind}" @@ -7549,7 +7572,7 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 #, fuzzy @@ -7557,30 +7580,30 @@ msgstr "" msgid "Software Update" msgstr "SOFTWARE UPGRADES" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 #, fuzzy #| msgid "FreedomBox Manual" msgid "FreedomBox Updated" msgstr "FREEDOMBOX MANUAL" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 #, fuzzy #| msgid "Automatic upgrades disabled" msgid "Distribution update started" msgstr "AUTOMATIC UPGRADES DISABLED" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7763,57 +7786,38 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "AUTOMATIC UPGRADES ENABLED" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "ERROR WHEN CONFIGURING UNATTENDED-UPGRADES: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "AUTOMATIC UPGRADES ENABLED" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "AUTOMATIC UPGRADES DISABLED" - -#: modules/upgrades/views.py:86 -#, fuzzy -#| msgid "Automatic upgrades enabled" -msgid "Distribution upgrade enabled" -msgstr "AUTOMATIC UPGRADES ENABLED" - -#: modules/upgrades/views.py:89 -#, fuzzy -#| msgid "Automatic upgrades disabled" -msgid "Distribution upgrade disabled" -msgstr "AUTOMATIC UPGRADES DISABLED" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "UPGRADE PROCESS STARTED." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "STARTING UPGRADE FAILED." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 #, fuzzy #| msgid "Automatic upgrades enabled" msgid "Starting distribution upgrade test." msgstr "AUTOMATIC UPGRADES ENABLED" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7821,25 +7825,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "USERS AND GROUPS" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "CHECK LDAP ENTRY \"{search_item}\"" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7848,36 +7852,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -#, fuzzy -#| msgid "Invalid server name" -msgid "Enter a valid username." -msgstr "INVALID SERVER NAME" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -#, fuzzy -#| msgid "Administrator Account" -msgid "Authorization Password" -msgstr "ADMINISTRATOR ACCOUNT" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -#, fuzzy -#| msgid "Show password" -msgid "Invalid password." -msgstr "SHOW PASSWORD" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7898,23 +7878,52 @@ msgstr "" "ABLE TO LOG IN TO ALL SERVICES. THEY CAN ALSO LOG IN TO THE SYSTEM THROUGH " "SSH AND HAVE ADMINISTRATIVE PRIVILEGES (SUDO)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a valid username." +msgstr "INVALID SERVER NAME" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +#, fuzzy +#| msgid "Administrator Account" +msgid "Authorization Password" +msgstr "ADMINISTRATOR ACCOUNT" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +#, fuzzy +#| msgid "Show password" +msgid "Invalid password." +msgstr "SHOW PASSWORD" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "CREATING LDAP USER FAILED." -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "FAILED TO ADD NEW USER TO {group} GROUP." -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7924,39 +7933,39 @@ msgstr "" "SYSTEM WITHOUT USING A PASSWORD. YOU MAY ENTER MULTIPLE KEYS, ONE ON EACH " "LINE. BLANK LINES AND LINES STARTING WITH # WILL BE IGNORED." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "RENAMING LDAP USER FAILED." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "FAILED TO REMOVE USER FROM GROUP." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "FAILED TO ADD USER TO GROUP." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "FAILED TO ADD USER TO GROUP." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "CHANGING LDAP USER PASSWORD FAILED." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "FAILED TO ADD NEW USER TO ADMIN GROUP." -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "USER ACCOUNT CREATED, YOU ARE NOW LOGGED IN" @@ -8505,7 +8514,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8518,7 +8527,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8526,11 +8535,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -8583,113 +8592,95 @@ msgstr "" msgid "Finished: {name}" msgstr "SERVICE DISABLED: {name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 #, fuzzy #| msgid "Installation" msgid "installing" msgstr "INSTALLATION" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 #, fuzzy #| msgid "Setting unchanged" msgid "media change" msgstr "SETTING UNCHANGED" -#: package.py:388 +#: package.py:425 #, fuzzy, python-brace-format #| msgid "Configuration" msgid "configuration file: {file}" msgstr "CONFIGURATION" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install" msgid "Installing app" msgstr "INSTALL" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing packages: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "ERROR INSTALLING PACKAGES: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing packages: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "ERROR INSTALLING PACKAGES: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing packages: {string} {details}" msgid "Error installing app: {error}" msgstr "ERROR INSTALLING PACKAGES: {string} {details}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing packages: {string} {details}" msgid "Error updating app: {error}" msgstr "ERROR INSTALLING PACKAGES: {string} {details}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Applications" msgid "App installed." msgstr "APPLICATIONS" -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "LAST UPDATE" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install" msgid "Uninstalling app" msgstr "INSTALL" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing packages: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "ERROR INSTALLING PACKAGES: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing packages: {string} {details}" msgid "Error uninstalling app: {error}" msgstr "ERROR INSTALLING PACKAGES: {string} {details}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Applications" msgid "App uninstalled." msgstr "APPLICATIONS" -#: setup.py:453 +#: setup.py:493 #, fuzzy #| msgid "Upgrade Packages" msgid "Updating app packages" @@ -8793,10 +8784,6 @@ msgstr "APPS" msgid " System" msgstr "SYSTEM" -#: templates/base.html:131 -msgid "System" -msgstr "SYSTEM" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "CHANGE PASSWORD" @@ -9099,11 +9086,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "SETTING UNCHANGED" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -9112,6 +9099,46 @@ msgstr "" msgid "Gujarati" msgstr "" +#, fuzzy +#~| msgid "Configuration updated" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "CONFIGURATION UPDATED" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "ACTION ERROR: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "AUTOMATIC UPGRADES ENABLED" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "AUTOMATIC UPGRADES DISABLED" + +#, fuzzy +#~| msgid "Automatic upgrades enabled" +#~ msgid "Distribution upgrade enabled" +#~ msgstr "AUTOMATIC UPGRADES ENABLED" + +#, fuzzy +#~| msgid "Automatic upgrades disabled" +#~ msgid "Distribution upgrade disabled" +#~ msgstr "AUTOMATIC UPGRADES DISABLED" + +#, fuzzy, python-brace-format +#~| msgid "Error installing packages: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "ERROR INSTALLING PACKAGES: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing packages: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "ERROR INSTALLING PACKAGES: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing packages: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "ERROR INSTALLING PACKAGES: {string} {details}" + #, fuzzy, python-brace-format #~| msgid "" #~| "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index cc10cbda3..a5e56300b 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2024-01-05 07:09+0000\n" "Last-Translator: John Doe \n" "Language-Team: French Let’s Encrypt " "pour en obtenir un." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" "La configuration de l'enregistrement ne peut être mise à jour lorsque " @@ -4104,7 +4133,7 @@ msgstr "Secure Shell" msgid "Services" msgstr "Services" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4113,7 +4142,7 @@ msgstr "" "le Wi-Fi ou le protocole PPPoE. Partage de cette connexion avec d’autres " "appareils du réseau local." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4121,7 +4150,7 @@ msgstr "" "Les périphériques gérés par d’autres méthodes pourraient ne pas être " "disponibles pour être configurés ici." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Réseau" @@ -4698,11 +4727,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Cette connexion n’est pas active." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Sécurité" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5434,7 +5458,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Visibilité publique" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "Domaine PageKite" @@ -5676,15 +5700,15 @@ msgstr "Éteindre immédiatement" msgid "Manage system-wide privacy settings." msgstr "Gérér les paramètres de confidentialité globaux." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "Confidentialité" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "Veuillez vérifier les paramètres de confidentialité." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "Paramètres de confidentialité" @@ -5711,7 +5735,7 @@ msgstr "" "transmission a lieu au travers du réseau Tor pourvu que l’appli Tor soit " "activée." -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5723,7 +5747,7 @@ msgstr "" "accès et de retirer les publicités et autres éléments nuisibles de " "l’Internet. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5741,15 +5765,15 @@ msgstr "" "href=\"http://config.privoxy.org\">http://config.privoxy.org/ ou http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Serveur mandataire web" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Accéder à l’URL {url} avec le mandataire {proxy} sur tcp{kind}" @@ -6762,7 +6786,7 @@ msgstr "Date" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Supprimer les instantanés" @@ -6836,34 +6860,37 @@ msgstr "Gestion des instantanés" msgid "Created snapshot." msgstr "Instantané créé." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Configuration des instantanés de disque mise à jour" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Configuration mise à jour." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Erreur lors de l’opération : {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Supprimer les instantanés sélectionnés" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "La suppression de l’utilisateur LDAP a échoué." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" "L’instantané est en cours d’utilisation. Veuillez réessayer ultérieurement." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "Retour à l’instantané n° {number} effectué." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "Le système doit être redémarré pour terminer le retour en arrière." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Revenir à l’instantané" @@ -6883,7 +6910,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Serveur Secure Shell (SSH)" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "Se connecter à distance par shell sécurisé (SSH)" @@ -6969,108 +6996,108 @@ msgstr "" "d’utilisation, monter et démonter des médias amovibles, étendre la partition " "racine, etc." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Stockage" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} octets" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} Kio" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} Mio" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} Gio" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} Tio" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "L’opération a échoué." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "L’opération a été annulée." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Le périphérique est déjà en train d’être démonté." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" "L’opération n’est pas disponible par manque d’un pilote ou d’un outil adapté." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "L’opération ne s’est pas terminée." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" "L’opération réveillerait un disque qui se trouve dans un état de veille " "profond." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Tentative de démontage d’un périphérique en cours d’utilisation." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "L’opération a déjà été annulée." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "Vous n’êtes pas autorisé à effectuer l’opération demandée." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Le périphérique est déjà monté." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Le périphérique n’est pas monté." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "Vous n’êtes pas autorisé à utiliser l’option demandée." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Le périphérique est monté par un autre utilisateur." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" "Espace disque faible sur la partition système : {percent_used}% utilisés, " "{free_space} libres." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Espace disque faible" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Panne de disque imminente" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -7080,7 +7107,7 @@ msgstr "" "Copiez toutes les données qui s’y trouvent tant qu’il est encore temps et " "remplacez le disque." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " @@ -7090,11 +7117,11 @@ msgstr "" "de redémarrer le système. Si le problème persiste après un redémarrage, " "vérifiez le périphérique de stockage pour voir s'il n'y a pas d'erreurs." -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "Système de fichiers racine en lecture seule" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "Aller à l'alimentation" @@ -7209,9 +7236,10 @@ msgstr "{drive_vendor} {drive_model} peut être débranché en toute sécurité. msgid "Device can be safely unplugged." msgstr "Le périphérique peut être débranché en toute sécurité." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Erreur lors de l’éjection du périphérique : {error_message}" #: modules/syncthing/__init__.py:23 @@ -7258,7 +7286,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Synchronisation de fichiers" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7431,7 +7459,7 @@ msgstr "Mise à jour de la configuration" msgid "Error configuring app: {error}" msgstr "Erreur lors de la configuration de l’application : {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7445,20 +7473,20 @@ msgstr "" "Internet par le réseau Tor. La censure des FAI peut être contourné en " "utilisant des ponts en amont (upstream bridges)." -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "Mandataire Tor" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Mandataire Socks Tor" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Accédez à l’URL {url} sur tcp{kind} via Tor" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Confirmez l’utilisation de Tor pour {url} sur tcp{kind}" @@ -7625,21 +7653,21 @@ msgstr "" "nécessaire, il est effectué à 2h00, rendant indisponible l’ensemble des " "applications pour une courte période." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Mise à jour du système" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox mise à jour" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "Impossible de lancer la mise à niveau de la distribution" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7650,11 +7678,11 @@ msgstr "" "sont disponibles. Si la mise à niveau automatique de la distribution est " "activée, elle sera retentée dans 24H." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "Mise à niveau de la distribution démarrée" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7835,46 +7863,31 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Lancer le test de mise à niveau de la distribution" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "" "Erreur lors de la configuration du système de mise à jour automatique " "« unattended-upgrades » : {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Mises à niveau automatiques activées" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Mises à niveau automatiques désactivées" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "Mise à niveau de la distribution activée" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Mise à niveau de la distribution désactivée" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Mise à jour lancée." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Le lancement de la mise à niveau a échoué." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Mise à jour régulière des fonctionnalités activée." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "Démarrage du test de mise à niveau de la distribution." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7885,7 +7898,7 @@ msgstr "" "Certaines applis demandent en outre que les comptes soient membres d’un " "groupe particulier pour pouvoir accéder à l’application." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7897,25 +7910,25 @@ msgstr "" "principale. En revanche, seuls les utilisateurs membres du groupe admin peuvent modifier les applications ou changer les paramètres système." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Utilisateurs et groupes" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Accès à tous les services et à la configuration du système" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Vérification de l’entrée LDAP « {search_item} »" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "Vérifier la configuration nslcd \"{key} {value}\"" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "Vérifier la configuration nsswitch \"{database}\"" @@ -7924,34 +7937,12 @@ msgstr "Vérifier la configuration nsswitch \"{database}\"" msgid "Username is taken or is reserved." msgstr "Le nom d’utilisateur est déjà pris ou est réservé." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Entrez un nom d’utilisateur valide." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Requis. 150 caractères ou moins. Lettres anglaises, chiffres et @/./-/_ " -"uniquement." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Mot de passe actuel" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" -"Veuillez saisir votre mot de passe de l’utilisateur « {user} » pour " -"confirmer ces modifications de compte." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Mot de passe incorrect." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7966,21 +7957,48 @@ msgstr "" "peuvent également se connecter au système avec Secure Shell (SSH) et obtenir " "les privilèges d’administrateur (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Entrez un nom d’utilisateur valide." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"Requis. 150 caractères ou moins. Lettres anglaises, chiffres et @/./-/_ " +"uniquement." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Mot de passe actuel" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" +"Veuillez saisir votre mot de passe de l’utilisateur « {user} » pour " +"confirmer ces modifications de compte." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Mot de passe incorrect." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "La création de l’utilisateur LDAP a échoué : {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "L’ajout du nouvel utilisateur au groupe {group} a échoué : {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Clés SSH autorisées" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7991,36 +8009,36 @@ msgstr "" "plusieurs clefs, une sur chaque ligne. Les lignes vides et celles commençant " "par # sont ignorées." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Le changement du nom de l’utilisateur LDAP a échoué." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Échec du retrait de l’utilisateur du groupe." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Échec de l’ajout de l’utilisateur au groupe." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "Échec du paramétrage des clefs SSH." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Échec du changement de statut de l’utilisateur." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Le changement du mot de passe de l’utilisateur LDAP a échoué." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "L’ajout du nouvel utilisateur au groupe admin a échoué : {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Compte utilisateur créé, vous êtes maintenant connecté" @@ -8572,7 +8590,7 @@ msgstr "" "WordPress. N’activez cette option qu’après avoir réalisé la configuration " "initiale de WordPress." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8595,7 +8613,7 @@ msgstr "" "recherche, de carte et de calendrier. Les photos peuvent être partagées " "unitairement avec d’autres en leur envoyant un lien direct." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8606,11 +8624,11 @@ msgstr "" "l’administrateur Zoph. Pour ajouter des utilisateurs ceux-ci doivent être " "créés à la fois sur la {box_name} et dans Zoph avec le même identifiant." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Photothèque" @@ -8664,93 +8682,78 @@ msgstr "Attente du démarrage de : {name}" msgid "Finished: {name}" msgstr "Terminé : {name}" -#: package.py:214 +#: package.py:206 #, fuzzy, python-brace-format #| msgid "Package {expression} is not available for install" msgid "Package {package_expression} is not available for install" msgstr "Le paquet {expression} n’est pas disponible à l’installation" -#: package.py:231 +#: package.py:226 #, 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})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "installation en cours" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "téléchargement en cours" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "changement de support" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "fichier de configuration : {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "Aucune réponse du gestionnaire de paquets" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "Installation de l’application" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "Mise à jour de l’application" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "Erreur lors de l’installation de l’appli : {string} {details}" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "Erreur lors de la mise à jour de l’appli : {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "Erreur lors de l’installation de l’appli : {error}" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "Erreur lors de la mise à jour de l’appli : {error}" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "Application installée." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "Application mise à jour" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "Désinstallation de l’application" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "Erreur lors de la désinstallation de l’appli : {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "Erreur lors de la désinstallation de l’appli : {error}" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "Application désinstallée." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "Mise à jour des paquets de l’application" @@ -8845,10 +8848,6 @@ msgstr "Applis" msgid " System" msgstr " Système" -#: templates/base.html:131 -msgid "System" -msgstr "Système" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Changer le mot de passe" @@ -9149,11 +9148,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." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Paramètre inchangé" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "avant la désinstallation de {app_id}" @@ -9162,6 +9161,37 @@ msgstr "avant la désinstallation de {app_id}" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Configuration des instantanés de disque mise à jour" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Erreur lors de l’opération : {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Mises à niveau automatiques activées" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Mises à niveau automatiques désactivées" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Mise à niveau de la distribution activée" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Mise à niveau de la distribution désactivée" + +#, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Erreur lors de l’installation de l’appli : {string} {details}" + +#, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Erreur lors de la mise à jour de l’appli : {string} {details}" + +#, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Erreur lors de la désinstallation de l’appli : {string} {details}" + #~ msgid "Page source" #~ msgstr "Source de la page" diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index 2a924b202..302bf202f 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-12-30 10:51+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Galician Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3513,19 +3537,19 @@ msgstr "" msgid "Services" msgstr "Descubrimento de servizo" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -4004,11 +4028,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4647,7 +4666,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4863,15 +4882,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4890,14 +4909,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4908,15 +4927,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5746,7 +5765,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5816,33 +5835,32 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" +#: modules/snapshot/views.py:160 +msgid "Configuration update failed." msgstr "" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5858,7 +5876,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5930,121 +5948,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6149,9 +6167,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6186,7 +6203,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6329,7 +6346,7 @@ msgstr "" msgid "Error configuring app: {error}" msgstr "Produciuse un erro ao instalar o aplicativo: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6338,20 +6355,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6480,34 +6497,34 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 #, fuzzy #| msgid "FreedomBox" msgid "FreedomBox Updated" msgstr "FreedomBox" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6658,51 +6675,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6710,25 +6710,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6737,30 +6737,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6769,57 +6751,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7303,7 +7308,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7316,7 +7321,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7324,11 +7329,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7378,104 +7383,86 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Produciuse un erro ao instalar o aplicativo: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Produciuse un erro ao instalar o aplicativo: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Produciuse un erro ao instalar o aplicativo: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Produciuse un erro ao instalar o aplicativo: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Aplicativo instalado." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Error installing application: {error}" msgid "Uninstalling app" msgstr "Produciuse un erro ao instalar o aplicativo: {error}" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Produciuse un erro ao instalar o aplicativo: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Produciuse un erro ao instalar o aplicativo: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Aplicativo instalado." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7557,10 +7544,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7832,11 +7815,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -7845,6 +7828,21 @@ msgstr "" msgid "Gujarati" msgstr "" +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Produciuse un erro ao instalar o aplicativo: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Produciuse un erro ao instalar o aplicativo: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Produciuse un erro ao instalar o aplicativo: {string} {details}" + #, fuzzy #~| msgid "Web Server" #~ msgid "WebRTC server" @@ -7865,8 +7863,3 @@ msgstr "" #~ msgctxt "Not automatically" #~ msgid "Manual" #~ msgstr "Manual" - -#, fuzzy -#~| msgid "Enable application" -#~ msgid "Administer calibre application" -#~ msgstr "Activar o aplicativo" diff --git a/plinth/locale/gu/LC_MESSAGES/django.po b/plinth/locale/gu/LC_MESSAGES/django.po index 6115ff499..eca8617fc 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Gujarati Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3770,19 +3794,19 @@ msgstr "" msgid "Services" msgstr "સેવા પ્રકાર" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -4264,11 +4288,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4924,7 +4943,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -5142,15 +5161,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5169,14 +5188,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5187,15 +5206,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -6033,7 +6052,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -6103,34 +6122,34 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 +#: modules/snapshot/views.py:160 #, fuzzy -msgid "Storage snapshots configuration updated" -msgstr "DNSSEC ગોઠવણીને સુધારેલી શરુ કરો" +#| msgid "Configuration updated" +msgid "Configuration update failed." +msgstr "રૂપરેખાંકન સુધારાયુ" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -6146,7 +6165,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -6222,121 +6241,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6443,9 +6462,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6480,7 +6498,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6631,7 +6649,7 @@ msgstr "સામાન્ય ગોઠવણી" msgid "Error configuring app: {error}" msgstr "એપ્લીકેશન પ્રસ્થાપિત કરતાં ભૂલ થઇ છે: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6640,20 +6658,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6790,36 +6808,36 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 #, fuzzy #| msgid "FreedomBox" msgid "FreedomBox Updated" msgstr "ફ્રિડમબોક્ષ" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 #, fuzzy #| msgid "User registrations disabled" msgid "Distribution update started" msgstr "વપરાશકર્તા રજીસ્ટ્રેશન અક્ષમ છે" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6980,55 +6998,36 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "વપરાશકર્તા રજીસ્ટ્રેશન અક્ષમ છે" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -#, fuzzy -#| msgid "User registrations disabled" -msgid "Distribution upgrade disabled" -msgstr "વપરાશકર્તા રજીસ્ટ્રેશન અક્ષમ છે" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 #, fuzzy #| msgid "User registrations disabled" msgid "Starting distribution upgrade test." msgstr "વપરાશકર્તા રજીસ્ટ્રેશન અક્ષમ છે" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7036,25 +7035,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7063,34 +7062,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -#, fuzzy -#| msgid "Invalid server name" -msgid "Enter a valid username." -msgstr "અમાન્ય સર્વર નામ" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -#, fuzzy -#| msgid "Show password" -msgid "Invalid password." -msgstr "પાસવર્ડ બતાવો" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7099,57 +7076,84 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a valid username." +msgstr "અમાન્ય સર્વર નામ" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +#, fuzzy +#| msgid "Show password" +msgid "Invalid password." +msgstr "પાસવર્ડ બતાવો" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7655,7 +7659,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7668,7 +7672,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7676,11 +7680,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7732,108 +7736,90 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install Apps" msgid "Installing app" msgstr "એપ્લિકેશન્સ ઇન્સ્ટોલ કરો" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "એપ્લીકેશન પ્રસ્થાપિત કરતાં ભૂલ થઇ છે: {string}{details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "એપ્લીકેશન પ્રસ્થાપિત કરતાં ભૂલ થઇ છે: {string}{details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "એપ્લીકેશન પ્રસ્થાપિત કરતાં ભૂલ થઇ છે: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "એપ્લીકેશન પ્રસ્થાપિત કરતાં ભૂલ થઇ છે: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "એપ્લીકેશન પ્રસ્થાપિત થઇ ગઈ છે." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "છેલ્લો સુધારો" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install Apps" msgid "Uninstalling app" msgstr "એપ્લિકેશન્સ ઇન્સ્ટોલ કરો" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "એપ્લીકેશન પ્રસ્થાપિત કરતાં ભૂલ થઇ છે: {string}{details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "એપ્લીકેશન પ્રસ્થાપિત કરતાં ભૂલ થઇ છે: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "એપ્લીકેશન પ્રસ્થાપિત થઇ ગઈ છે." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7917,10 +7903,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -8205,11 +8187,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "સેટિંગ યથાવત" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -8218,6 +8200,30 @@ msgstr "" msgid "Gujarati" msgstr "" +#, fuzzy +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "DNSSEC ગોઠવણીને સુધારેલી શરુ કરો" + +#, fuzzy +#~| msgid "User registrations disabled" +#~ msgid "Distribution upgrade disabled" +#~ msgstr "વપરાશકર્તા રજીસ્ટ્રેશન અક્ષમ છે" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "એપ્લીકેશન પ્રસ્થાપિત કરતાં ભૂલ થઇ છે: {string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "એપ્લીકેશન પ્રસ્થાપિત કરતાં ભૂલ થઇ છે: {string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "એપ્લીકેશન પ્રસ્થાપિત કરતાં ભૂલ થઇ છે: {string}{details}" + #~ msgid "ChatSecure" #~ msgstr "ચેટસેક્યુર" diff --git a/plinth/locale/hi/LC_MESSAGES/django.po b/plinth/locale/hi/LC_MESSAGES/django.po index 5900c1ba4..b4fe27221 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2023-10-19 06:30+0000\n" "Last-Translator: Shaik \n" "Language-Team: Hindi %(service_name)s is running." msgid "Service {service_name} is running" msgstr "सर्विस %(service_name)s चल रहा है." -#: daemon.py:164 +#: daemon.py:218 #, python-brace-format msgid "Listening on {kind} port {listen_address}:{port}" msgstr "{kind} में सुन कर पोर्ट {listen_address} :{port}" -#: daemon.py:167 +#: daemon.py:221 #, python-brace-format msgid "Listening on {kind} port {port}" msgstr "{kind} में सुन कर पोर्ट{port}" -#: daemon.py:236 +#: daemon.py:291 #, python-brace-format msgid "Connect to {host}:{port}" msgstr "{host}:{port} से जुड़े" -#: daemon.py:240 +#: daemon.py:299 #, python-brace-format msgid "Cannot connect to {host}:{port}" msgstr "{host}:{port} से नहीं जोड़ सखता" @@ -103,7 +103,32 @@ msgstr "इस वेब इंटरफेस में इसतेमाल msgid "Use the language preference set in the browser" msgstr "जो भाषा ब्राउज़र में हैं, वो भाषा उपयोग करें" -#: middleware.py:130 +#: menu.py:106 +#, fuzzy +#| msgid "Public Visibility" +msgid "Visibility" +msgstr "सार्वजनिक विसिबिलिटी" + +#: menu.py:108 +msgid "Data" +msgstr "" + +#: menu.py:110 templates/base.html:131 +msgid "System" +msgstr "सिस्टम" + +#: menu.py:112 modules/networks/templates/connection_show.html:259 +#: modules/security/__init__.py:35 +msgid "Security" +msgstr "सुरक्षा" + +#: menu.py:114 +#, fuzzy +#| msgid "Server Administration" +msgid "Administration" +msgstr "सर्वर एडमिनिस्ट्रेशन" + +#: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." msgstr "" @@ -122,12 +147,12 @@ msgstr "वेब सर्वर" msgid "{box_name} Web Interface (Plinth)" msgstr "{box_name} वेब इंटरफेस (प्लिंथ)" -#: modules/apache/components.py:154 +#: modules/apache/components.py:159 #, python-brace-format msgid "Access URL {url} on tcp{kind}" msgstr "इस यूआरएल का अपयोग करें {url} टीसीपी पर {kind}" -#: modules/apache/components.py:157 +#: modules/apache/components.py:162 #, python-brace-format msgid "Access URL {url}" msgstr "इस यूआरएल का अपयोग करें {url}" @@ -152,7 +177,7 @@ msgstr "" msgid "Service Discovery" msgstr "सर्विस डिस्कोवरि" -#: modules/avahi/__init__.py:60 +#: modules/avahi/__init__.py:61 msgid "Local Network Domain" msgstr "" @@ -160,36 +185,36 @@ msgstr "" msgid "Backups allows creating and managing backup archives." msgstr "बैकअपस पुरालेखागार बनाने और प्रबंधित करने की अनुमति देता है." -#: modules/backups/__init__.py:44 modules/backups/__init__.py:167 -#: modules/backups/__init__.py:212 +#: modules/backups/__init__.py:44 modules/backups/__init__.py:168 +#: modules/backups/__init__.py:213 msgid "Backups" msgstr "बैकअप" -#: modules/backups/__init__.py:164 +#: modules/backups/__init__.py:165 msgid "" "Enable an automatic backup schedule for data safety. Prefer an encrypted " "remote backup location or an extra attached disk." msgstr "" -#: modules/backups/__init__.py:170 +#: modules/backups/__init__.py:171 msgid "Enable a Backup Schedule" msgstr "" -#: modules/backups/__init__.py:174 modules/backups/__init__.py:221 -#: modules/privacy/__init__.py:76 modules/storage/__init__.py:314 +#: modules/backups/__init__.py:175 modules/backups/__init__.py:222 +#: modules/privacy/__init__.py:77 modules/storage/__init__.py:315 #, fuzzy, python-brace-format #| msgid "About {box_name}" msgid "Go to {app_name}" msgstr "{box_name} के बारे में" -#: modules/backups/__init__.py:209 +#: modules/backups/__init__.py:210 #, python-brace-format msgid "" "A scheduled backup failed. Past {error_count} attempts for backup did not " "succeed. The latest error is: {error_message}" msgstr "" -#: modules/backups/__init__.py:217 +#: modules/backups/__init__.py:218 #, fuzzy #| msgid "Existing custom services" msgid "Error During Backup" @@ -436,7 +461,7 @@ msgstr "" msgid "Existing repository is not encrypted." msgstr "" -#: modules/backups/repository.py:335 +#: modules/backups/repository.py:337 #, fuzzy, python-brace-format #| msgid "{box_name} Manual" msgid "{box_name} storage" @@ -840,7 +865,7 @@ msgid "Permissions for anonymous users, who have not provided a password." msgstr "" #: modules/bepasty/forms.py:27 modules/bepasty/templates/bepasty.html:30 -#: modules/users/forms.py:110 modules/users/forms.py:233 +#: modules/users/forms.py:103 msgid "Permissions" msgstr "अनुमतियाँ" @@ -925,8 +950,9 @@ msgstr "" #: modules/bepasty/views.py:88 modules/diagnostics/views.py:52 #: modules/searx/views.py:35 modules/searx/views.py:46 -#: modules/security/views.py:56 modules/tor/views.py:73 -#: modules/torproxy/views.py:71 modules/zoph/views.py:74 +#: modules/security/views.py:56 modules/snapshot/views.py:158 +#: modules/tor/views.py:73 modules/torproxy/views.py:71 +#: modules/upgrades/views.py:83 modules/zoph/views.py:74 msgid "Configuration updated." msgstr "कॉन्फ़िगरेशन अपडेट किया." @@ -1029,7 +1055,7 @@ msgstr "" #: modules/bind/views.py:61 modules/config/views.py:98 #: modules/coturn/views.py:40 modules/deluge/views.py:35 #: modules/dynamicdns/views.py:78 modules/ejabberd/views.py:95 -#: modules/email/views.py:45 modules/matrixsynapse/views.py:146 +#: modules/email/views.py:45 modules/matrixsynapse/views.py:149 #: modules/minetest/views.py:55 modules/mumble/views.py:37 #: modules/pagekite/forms.py:74 modules/privacy/views.py:36 #: modules/quassel/views.py:29 modules/roundcube/views.py:32 @@ -1229,7 +1255,7 @@ msgstr "सामान्य कॉन्फ़िगरेशन" msgid "Configure" msgstr "कॉन्फ़िगर करें" -#: modules/config/__init__.py:62 modules/config/forms.py:68 +#: modules/config/__init__.py:63 modules/config/forms.py:68 #: modules/dynamicdns/forms.py:82 modules/names/templates/names.html:16 msgid "Domain Name" msgstr "डोमेन नाम" @@ -1438,7 +1464,7 @@ msgstr "" msgid "Date & Time" msgstr "तारीख और समय" -#: modules/datetime/__init__.py:122 +#: modules/datetime/__init__.py:123 msgid "Time synchronized to NTP server" msgstr "" @@ -1505,7 +1531,7 @@ msgstr "डायरेक्टरी डाउनलोड करें" msgid "Bittorrent client written in Python/PyGTK" msgstr "बिटटोरेंट ग्राहक पाईथोन/पाईजिटिके" -#: modules/diagnostics/__init__.py:27 +#: modules/diagnostics/__init__.py:28 msgid "" "The system diagnostic test will run a number of checks on your system to " "confirm that applications and services are working as expected." @@ -1513,79 +1539,79 @@ msgstr "" "पुष्टि करने के लिये कि एप्लिकेशन या सेवाएं अच्छेसे चल रहे है, सिस्टम निदान परिक्षा बहुत सारे " "चेकों करोगे." -#: modules/diagnostics/__init__.py:51 modules/diagnostics/__init__.py:236 +#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:240 msgid "Diagnostics" msgstr "निदानिकी" -#: modules/diagnostics/__init__.py:95 +#: modules/diagnostics/__init__.py:98 #, fuzzy #| msgid "Quassel" msgid "passed" msgstr "क्वासेल" -#: modules/diagnostics/__init__.py:96 modules/networks/views.py:50 +#: modules/diagnostics/__init__.py:99 modules/networks/views.py:50 #, fuzzy #| msgid "Setup failed." msgid "failed" msgstr "सेटअप विफल." -#: modules/diagnostics/__init__.py:97 +#: modules/diagnostics/__init__.py:100 msgid "error" msgstr "" -#: modules/diagnostics/__init__.py:98 +#: modules/diagnostics/__init__.py:101 msgid "warning" msgstr "" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: modules/diagnostics/__init__.py:202 +#: modules/diagnostics/__init__.py:206 msgid "MiB" msgstr "" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: modules/diagnostics/__init__.py:207 +#: modules/diagnostics/__init__.py:211 msgid "GiB" msgstr "" -#: modules/diagnostics/__init__.py:214 +#: modules/diagnostics/__init__.py:218 msgid "You should disable some apps to reduce memory usage." msgstr "" -#: modules/diagnostics/__init__.py:219 +#: modules/diagnostics/__init__.py:223 msgid "You should not install any new apps on this system." msgstr "" -#: modules/diagnostics/__init__.py:231 +#: modules/diagnostics/__init__.py:235 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " "{memory_available_unit} free. {advice_message}" msgstr "" -#: modules/diagnostics/__init__.py:233 +#: modules/diagnostics/__init__.py:237 msgid "Low Memory" msgstr "" -#: modules/diagnostics/__init__.py:264 +#: modules/diagnostics/__init__.py:268 #, fuzzy #| msgid "Run Diagnostics" msgid "Running diagnostics" msgstr "निदानिकी चलिये" -#: modules/diagnostics/__init__.py:307 +#: modules/diagnostics/__init__.py:311 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: modules/diagnostics/__init__.py:308 +#: modules/diagnostics/__init__.py:312 #, fuzzy #| msgid "Diagnostic Results" msgid "Diagnostics results" msgstr "निदानिकी का परिणाम" -#: modules/diagnostics/__init__.py:313 +#: modules/diagnostics/__init__.py:317 #, fuzzy #| msgid "Diagnostic Results" msgid "Go to diagnostics results" @@ -1677,7 +1703,7 @@ msgstr "परीक्षा" msgid "Result" msgstr "परिणाम" -#: modules/diagnostics/views.py:107 +#: modules/diagnostics/views.py:111 msgid "Diagnostic Test" msgstr "निदान परिक्षा" @@ -1732,7 +1758,7 @@ msgstr "" msgid "Dynamic DNS Client" msgstr "डायनेमिक डिएनएस ग्राहक" -#: modules/dynamicdns/__init__.py:74 +#: modules/dynamicdns/__init__.py:75 #, fuzzy #| msgid "Domain Name" msgid "Dynamic Domain Name" @@ -1843,7 +1869,7 @@ msgid "Use HTTP basic authentication" msgstr "एचटिटिपि बेसिकॅ प्रमाणीकरण उपयोग करें" #: modules/dynamicdns/forms.py:88 modules/networks/forms.py:207 -#: modules/users/forms.py:67 +#: modules/users/forms.py:129 msgid "Username" msgstr "युसरनाम" @@ -2269,33 +2295,33 @@ msgstr "" msgid "Firewall" msgstr "फ़ायरवॉल" -#: modules/firewall/__init__.py:271 +#: modules/firewall/__init__.py:273 #, fuzzy #| msgid "Default app set" msgid "Default zone is external" msgstr "डिफ़ॉल्ट एेप सेट" -#: modules/firewall/__init__.py:280 +#: modules/firewall/__init__.py:283 msgid "Firewall backend is nftables" msgstr "" -#: modules/firewall/__init__.py:293 +#: modules/firewall/__init__.py:297 msgid "Direct passthrough rules exist" msgstr "" -#: modules/firewall/components.py:136 +#: modules/firewall/components.py:139 #, 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 सिर्फ आंतरिक नेटवर्क्स पर उपलब्ध है." -#: modules/firewall/components.py:147 +#: modules/firewall/components.py:153 #, 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 सिर्फ आंतरिक नेटवर्क्स पर उपलब्ध है." -#: modules/firewall/components.py:153 +#: modules/firewall/components.py:159 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2422,11 +2448,11 @@ msgstr "" msgid "Read-write access to Git repositories" msgstr "" -#: modules/gitweb/__init__.py:50 modules/gitweb/manifest.py:11 +#: modules/gitweb/__init__.py:48 modules/gitweb/manifest.py:11 msgid "Gitweb" msgstr "" -#: modules/gitweb/__init__.py:51 +#: modules/gitweb/__init__.py:49 msgid "Simple Git Hosting" msgstr "" @@ -2944,7 +2970,7 @@ msgid "I2P" msgstr "" #: modules/i2p/__init__.py:53 modules/tor/__init__.py:63 -#: modules/torproxy/__init__.py:56 +#: modules/torproxy/__init__.py:57 msgid "Anonymity Network" msgstr "गुमनामी नेटवर्क" @@ -3351,7 +3377,7 @@ msgstr "लेटस एंक्रिप्ट" msgid "Certificates" msgstr "प्रमाण पत्र" -#: modules/letsencrypt/__init__.py:104 +#: modules/letsencrypt/__init__.py:105 msgid "Cannot test: No domains are configured." msgstr "" @@ -3429,28 +3455,31 @@ msgstr "" "लिए ले सकता है." #: modules/letsencrypt/views.py:46 -#, python-brace-format -msgid "Failed to revoke certificate for domain {domain}: {error}" +#, fuzzy, python-brace-format +#| msgid "Failed to revoke certificate for domain {domain}: {error}" +msgid "Failed to revoke certificate for domain {domain}" msgstr "डोमेन पर प्रमाणपत्र कामयाबी से वापस नहीं ले लिया गया{domain}:{error}" -#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:76 +#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" msgstr "डोमेन के लिए प्रमाणपत्र कामयाबी से प्राप्त किया {domain}" -#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:81 -#, python-brace-format -msgid "Failed to obtain certificate for domain {domain}: {error}" +#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 +#, fuzzy, python-brace-format +#| msgid "Failed to obtain certificate for domain {domain}: {error}" +msgid "Failed to obtain certificate for domain {domain}" msgstr "डोमेन के लिए प्रमाणपत्र कामयाबी से नहीं प्राप्त किया {domain}:{error}" -#: modules/letsencrypt/views.py:93 +#: modules/letsencrypt/views.py:95 #, python-brace-format msgid "Certificate successfully deleted for domain {domain}" msgstr "डोमेन के लिए प्रमाणपत्र कामयाबी से हटाया गया {domain}" -#: modules/letsencrypt/views.py:98 -#, python-brace-format -msgid "Failed to delete certificate for domain {domain}: {error}" +#: modules/letsencrypt/views.py:100 +#, fuzzy, python-brace-format +#| msgid "Failed to delete certificate for domain {domain}: {error}" +msgid "Failed to delete certificate for domain {domain}" msgstr "डोमेन के लिए प्रमाणपत्र नहीं हटाया गया {domain}:{error}" #: modules/matrixsynapse/__init__.py:26 @@ -3632,7 +3661,7 @@ msgid "" "go to Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -4054,19 +4083,19 @@ msgstr "सुरक्षित शेल" msgid "Services" msgstr "सर्विस" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "नेटवर्क्‍स" @@ -4568,11 +4597,6 @@ msgstr "आईपीवी6" msgid "This connection is not active." msgstr "यह कनेक्शन सक्रिय नहीं है." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "सुरक्षा" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5316,7 +5340,7 @@ msgstr "पेजकइट" msgid "Public Visibility" msgstr "सार्वजनिक विसिबिलिटी" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 #, fuzzy #| msgid "PageKite Account" msgid "PageKite Domain" @@ -5563,17 +5587,17 @@ msgstr "अब शट डाउन करें" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 #, fuzzy #| msgid "Privoxy" msgid "Privacy" msgstr "प्रिवोक्सी" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5592,7 +5616,7 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5602,7 +5626,7 @@ msgstr "" "लिए, वेब पेज डेटा और HTTP हेडर को मोडिफाई करने के लिए, ऐकसेस को नियंत्रित करने के लिए " "और एड या दुसरा इंटरनेट का जंक हटाने के लिए. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, fuzzy, python-brace-format #| msgid "" #| "You can use Privoxy by modifying your browser proxy settings to your " @@ -5624,15 +5648,15 @@ msgstr "" "org\">http://config.privoxy.org/ या http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "प्रिवोक्सी" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "वेब प्रॉक्सी" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "{url} ऐकसेस करें प्रॉक्सी लेकर {proxy} टीसीपी पर{kind}" @@ -6636,7 +6660,7 @@ msgstr "तिथि" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "स्नैपशॉटस हटाएँ" @@ -6708,35 +6732,38 @@ msgstr "स्नैपशॉटस प्रबंधित करें" msgid "Created snapshot." msgstr "स्नैपशॉट बनाया गया है." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "स्टोरेज स्नैपशॉट कॉंफ़िगरेशन अपडेट किया गया" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "कॉन्फ़िगरेशन अपडेट किया." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "क्रिया त्रुटि: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 #, fuzzy #| msgid "Delete all the snapshots" msgid "Deleted selected snapshots" msgstr "सब स्नैपशॉटस हटाएँ" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "एलडीएपी यूसरको हटाने में असफल रहा." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "स्नैपशॉट #{number} पर वापस रोलबाक होगा." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "रोलबैक शुरु करने के लिए सिस्टम रीस्टार्ट करने का ज़रुरत है." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "स्नैपशॉट को रोलबैक करें" @@ -6755,7 +6782,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "सुरक्षित शैल (SSH) सर्वर" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 #, fuzzy #| msgid "Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)" @@ -6837,90 +6864,90 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "स्टोरेज" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} बाइट्स" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} किब" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} मेब" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} जिब" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} टीब" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "ऑपरेशन अनुत्तीर्ण हो गया." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "ऑपरेशन रद्द किया गया." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "यह डिवाइस पहले से अनमाउट किया जा रहा है." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "यह ऑपरेशन अनुपलब्ध है क्यैकि ड्राइवर/उपकरण टूल समर्थित नहीं है." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "ऑपरेशन टाइम आउट हो गया." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "यह ऑपरेशन गहरी नींद की स्थिति का डिस्क को जाग जाएगा." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "व्यस्त डिवाइस को अनमाउंट करने का प्रयास कर रहा है." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "ऑपरेशन पहले से रद्द किया गया." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "अनुरोधित ऑपरेशन करने के लिए अधिकृत नहीं है." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "यह डिवाइस पहले से माउंट किया गया." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "यह डिवाइस नहीं माउंट किया गया." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "अनुरोधित विकल्प का उपयोग करने की अनुमति नहीं है." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "किसी और यूसर ने डिवाइस माउंट किया गया है." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, fuzzy, no-python-format, python-brace-format #| msgid "" #| "Warning: Low space on system partition ({percent_used}% used, " @@ -6930,35 +6957,35 @@ msgstr "" "वार्निंग: सिस्टम पार्टीशन पर कम जगह ({percent_used}% उपयोग किया गया, " "{free_space} free)." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 #, fuzzy #| msgid "Filesystem" msgid "Read-only root filesystem" msgstr "फ़ाइलसिस्टम" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Power" msgid "Go to Power" @@ -7082,9 +7109,10 @@ msgstr "{drive_vendor}{drive_model} को सुरक्षित रूप msgid "Device can be safely unplugged." msgstr "डिवाइस सुरक्षित रूप से अनप्लग किया जा सकता है." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "एेरर इजेक्टिग्न डिवाइस: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7134,7 +7162,7 @@ msgstr "सिंकतिन्ग" msgid "File Synchronization" msgstr "फ़ाइल सिंक्रनाइज़ेशन" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7310,7 +7338,7 @@ msgstr "कॉंफ़िगरेशन के दौरान कूछ त msgid "Error configuring app: {error}" msgstr "एप्लिकेशन नहीं इंस्टॉल जा सकता: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7319,22 +7347,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "Tor Socks Proxy" msgid "Tor Proxy" msgstr "टोर सोक्स प्रॉक्सी" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "टोर सोक्स प्रॉक्सी" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "यूआरएल एक्सेस करें {url} टीसीपी पर {kind} टोर के माध्यम से" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "टोर उपयोग की पुष्टि करें {url} पर टीसीपी पर {kind}" @@ -7500,7 +7528,7 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 #, fuzzy @@ -7508,30 +7536,30 @@ msgstr "" msgid "Software Update" msgstr "सॉफ्टवेयर अपग्रेडस" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 #, fuzzy #| msgid "FreedomBox Foundation" msgid "FreedomBox Updated" msgstr "फ्रीडमबाक्स फाउंडेशन" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 #, fuzzy #| msgid "Automatic upgrades disabled" msgid "Distribution update started" msgstr "ऑटोमेटिक अपग्रेडस अक्षम किया गया" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7714,57 +7742,38 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "ऑटोमेटिक अपग्रेडस सक्षम किया गया" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "अनअटेंडेड-अपग्रेडस कॉन्फ़िगर करते समय त्रुटि: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "ऑटोमेटिक अपग्रेडस सक्षम किया गया" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "ऑटोमेटिक अपग्रेडस अक्षम किया गया" - -#: modules/upgrades/views.py:86 -#, fuzzy -#| msgid "Automatic upgrades enabled" -msgid "Distribution upgrade enabled" -msgstr "ऑटोमेटिक अपग्रेडस सक्षम किया गया" - -#: modules/upgrades/views.py:89 -#, fuzzy -#| msgid "Automatic upgrades disabled" -msgid "Distribution upgrade disabled" -msgstr "ऑटोमेटिक अपग्रेडस अक्षम किया गया" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "अपग्रेड प्रक्रिया शुरू हुई." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "अपग्रेड प्रारंभ करना विफल रहा." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 #, fuzzy #| msgid "Automatic upgrades enabled" msgid "Starting distribution upgrade test." msgstr "ऑटोमेटिक अपग्रेडस सक्षम किया गया" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7772,25 +7781,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "यूसरस और समूह" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "सब सर्विसस और सिस्टम सेटिंग्स तक पहुंच" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "एलडीएपी प्रविष्टि चेक करें \"{search_item}\"" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7799,36 +7808,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "यूसरनाम लिया है या आरक्षित है." -#: modules/users/forms.py:62 -#, fuzzy -#| msgid "Invalid server name" -msgid "Enter a valid username." -msgstr "सर्वर नाम अमान्य है" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -#, fuzzy -#| msgid "Administrator Password" -msgid "Authorization Password" -msgstr "व्यवस्थापक पासवर्ड" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -#, fuzzy -#| msgid "Show password" -msgid "Invalid password." -msgstr "शो पासवर्ड" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7848,23 +7833,52 @@ msgstr "" "

एडमिन ग्रुप के यूसरस सब सर्विसस पर लॉग इन कर सकेगें. SSH के माध्यम से भी " "सिस्टम पर लॉग इन कर सकते है अाैर उनको प्रशासनिक विशेषाधिकार (sudo) है." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a valid username." +msgstr "सर्वर नाम अमान्य है" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +#, fuzzy +#| msgid "Administrator Password" +msgid "Authorization Password" +msgstr "व्यवस्थापक पासवर्ड" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +#, fuzzy +#| msgid "Show password" +msgid "Invalid password." +msgstr "शो पासवर्ड" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "एलडीएपी यूसर बनाना विफल रहा." -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "{group} समूह में नया यूसर जोड़ने में विफल." -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7874,39 +7888,39 @@ msgstr "" "बिना सिस्टम में प्रवेश करने की अनुमति देगा. आप एकाधिक कीज़ दर्ज कर सकते हैं, हर लाइन रक " "एक. खाली लाइनस या # से प्रारंभ होने वाले लाइनस अनदेखा कर दिया जाएगा." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "एलडीएपी यूसर का नाम बदलना विफल रहा." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "समूह से यूसर को हटाने में विफल." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "समूह से यूसर को जोड़ने में विफल." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "एसएसएच कीज़ सेट करने में असमर्थ." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "समूह से यूसर को जोड़ने में विफल." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "एलडीएपी यूसर का पासवर्ड बदलना विफल रहा." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "व्यवस्थापक समूह में नया यूसर जोड़ने में विफल." -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "युसर अकाउंट बनाया, अब आप लॉगड इन हैं" @@ -8463,7 +8477,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8476,7 +8490,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8484,11 +8498,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -8541,108 +8555,90 @@ msgstr "" msgid "Finished: {name}" msgstr "सर्विस सक्षम किया गया:{name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "इंस्टॉलिंग" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "डाउनलोडिंग" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "मीडिया बदलाव" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "कॉंफ़िगरेशन फ़ाइल: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install Apps" msgid "Installing app" msgstr "ऐप्लिकेशन इंस्टॉल करें" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "एप्लिकेशन नहीं इंस्टॉल जा सकता : {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "एप्लिकेशन नहीं इंस्टॉल जा सकता : {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "एप्लिकेशन नहीं इंस्टॉल जा सकता: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "एप्लिकेशन नहीं इंस्टॉल जा सकता: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "एप्लिकेशन इंस्टॉल हो गया." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "अंतिम अपडेट" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install Apps" msgid "Uninstalling app" msgstr "ऐप्लिकेशन इंस्टॉल करें" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "एप्लिकेशन नहीं इंस्टॉल जा सकता : {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "एप्लिकेशन नहीं इंस्टॉल जा सकता: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "एप्लिकेशन इंस्टॉल हो गया." -#: setup.py:453 +#: setup.py:493 #, fuzzy #| msgid "Upgrade Packages" msgid "Updating app packages" @@ -8745,10 +8741,6 @@ msgstr "ऐप्स" msgid " System" msgstr " सिस्टम" -#: templates/base.html:131 -msgid "System" -msgstr "सिस्टम" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "पासवर्ड बदलें" @@ -9042,11 +9034,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "सेटिंग स्थिर है" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -9055,6 +9047,44 @@ msgstr "" msgid "Gujarati" msgstr "" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "स्टोरेज स्नैपशॉट कॉंफ़िगरेशन अपडेट किया गया" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "क्रिया त्रुटि: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "ऑटोमेटिक अपग्रेडस सक्षम किया गया" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "ऑटोमेटिक अपग्रेडस अक्षम किया गया" + +#, fuzzy +#~| msgid "Automatic upgrades enabled" +#~ msgid "Distribution upgrade enabled" +#~ msgstr "ऑटोमेटिक अपग्रेडस सक्षम किया गया" + +#, fuzzy +#~| msgid "Automatic upgrades disabled" +#~ msgid "Distribution upgrade disabled" +#~ msgstr "ऑटोमेटिक अपग्रेडस अक्षम किया गया" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "एप्लिकेशन नहीं इंस्टॉल जा सकता : {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "एप्लिकेशन नहीं इंस्टॉल जा सकता : {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "एप्लिकेशन नहीं इंस्टॉल जा सकता : {string} {details}" + #, fuzzy, python-brace-format #~| msgid "" #~| "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index 29fd8c3fc..cd6b6ac2a 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-10-24 18:39+0000\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Hungarian Let's " "Encrypt weboldalát ahhoz, hogy beszerezz egyet." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -4070,7 +4099,7 @@ msgstr "Secure Shell (Biztonságos parancsértelmező)" msgid "Services" msgstr "Szolgáltatások" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4079,7 +4108,7 @@ msgstr "" "vagy PPPoE segítségével. Oszd meg ezt a kapcsolatot a hálózaton lévő más " "eszközökkel." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4087,7 +4116,7 @@ msgstr "" "Előfordulhat, hogy más módszerekkel felügyelt eszközök itt nem lesznek a " "konfigurálhatók." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Hálózatok" @@ -4656,11 +4685,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Ez a kapcsolat nem aktív." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Biztonság" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5386,7 +5410,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Nyilvános láthatóság" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "PageKite domain" @@ -5628,19 +5652,19 @@ msgstr "Leállítás most" msgid "Manage system-wide privacy settings." msgstr "Rendszerszintű adatvédelmi beállítások kezelése." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 #, fuzzy #| msgid "Privoxy" msgid "Privacy" msgstr "Privoxy" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" "Kérjük, frissítsd az adatvédelmi beállításokat, a preferenciáidnak " "megfelelően." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "Adatvédelmi beállítások kezelése" @@ -5659,7 +5683,7 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5670,7 +5694,7 @@ msgstr "" "Módosítja a weboldal adatait és HTTP fejléceket, szabályozza a hozzáférést, " "eltávolítja a hirdetéseket és az egyéb nem kívánt internetes szemetet. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, fuzzy, python-brace-format #| msgid "" #| "You can use Privoxy by modifying your browser proxy settings to your " @@ -5692,15 +5716,15 @@ msgstr "" "a címeken: http://config.privoxy.org/ és http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Web proxy" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -6695,7 +6719,7 @@ msgstr "Dátum" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Pillanatképek törlése" @@ -6769,35 +6793,38 @@ msgstr "Pillanatképek kezelése" msgid "Created snapshot." msgstr "Pillanatkép létrehozva." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Tárhelypillanatképek konfigurációja frissítve" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Beállítások frissítve." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Hiba a művelet közben: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Kiválasztott pillanatképek törölve" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "LDAP-felhasználó törlése sikertelen." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" "A Tárhelypillanatképek funkció jelenleg is használatban van. Kérlek, próbáld " "újra később." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "A {number} számú pillanatképre visszaállítva." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "A visszaállítás befejezéséhez a rendszert újra kell indítani." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Visszaállítás pillanatképre" @@ -6817,7 +6844,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "SSH-szerver" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 #, fuzzy #| msgid "Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)" @@ -6900,107 +6927,107 @@ msgstr "" "fel- és lecsatolhatsz cserélhető adathordozókat, kibővítheted a root " "partíciót, stb." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Tárhely" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} byte" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "A művelet sikertelen." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "A művelet meg lett szakítva." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Az eszköz leválasztása már folyamatban van." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" "A művelet nem támogatott a hiányzó illesztőprogram/eszköz támogatása miatt." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "A művelet túllépte az időkorlátot." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" "A művelet fel fogja ébreszteni a lemezt, amely mély-alvó állapotban van." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Foglalt eszköz leválasztásának a kísérlete." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "A művelet már meg lett szakítva." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "Nem vagy jogosult végrehajtani a kért műveletet." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Az eszköz már fel lett csatolva." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Az eszköz nincs felcsatolva." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "Nem használhatod a kért lehetőséget." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Az eszközt egy másik felhasználó felcsatolva." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" "Kevés a szabad hely a rendszerpartíción: {percent_used}% felhasználva, " "{free_space} szabad." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Kevés tárhely" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Lemezhiba várható" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -7009,20 +7036,20 @@ msgstr "" "A {id} lemez azt jelzi, hogy a közeljövőben valószínűleg meghibásodik. " "Másold át az adatokat, amíg még lehet, és cseréld ki a meghajtót." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 #, fuzzy #| msgid "Root Filesystem" msgid "Read-only root filesystem" msgstr "Gyökérfájlrendszer" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Power" msgid "Go to Power" @@ -7137,9 +7164,10 @@ msgstr "{drive_vendor} {drive_model} biztonságosan kivehető." msgid "Device can be safely unplugged." msgstr "Az eszköz biztonságosan kivehető." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Hiba történt az eszköz kiadása során: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7186,7 +7214,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Fájlszinkronizáció" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7361,7 +7389,7 @@ msgstr "Beállítások frissítése" msgid "Error configuring app: {error}" msgstr "Hiba lépett fel az alkalmazás konfigurációja során: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7370,22 +7398,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "Tor Socks Proxy" msgid "Tor Proxy" msgstr "Tor Socks proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Tor Socks proxy" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Hozzáférés a {url} URL-hez tcp{kind}-on Tor használatával" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Hagyd jóvá a Tor használatát {url} célcímhez tcp{kind} protokollon" @@ -7549,21 +7577,21 @@ msgstr "" "újraindítása szükségesnek bizonyul, akkor a rendszer automatikusan 02:00-kor " "újraindul, ami miatt az összes alkalmazás rövid ideig nem lesz elérhető." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Szoftverfrissítések" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox frissítve" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "A disztribúció frissítése nem tudott elindulni" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7574,11 +7602,11 @@ msgstr "" "disztribúció frissítését a rendszer 24 óra múlva újrapróbálja, ha " "engedélyezve van." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "A disztribúció frissítése elindult" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7756,46 +7784,31 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Disztribúció frissítés engedélyezve" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "Hiba a nem felügyelt frissítések konfigurálása közben: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Automatikus frissítések engedélyezve" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Automatikus frissítések kikapcsolva" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "Disztribúció frissítés engedélyezve" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Disztribúció frissítés letiltva" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "A frissítési folyamat elkezdődött." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "A frissítést nem sikerült elindítani." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Gyakori funkciófrissítések aktiválva." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 #, fuzzy #| msgid "Distribution upgrade enabled" msgid "Starting distribution upgrade test." msgstr "Disztribúció frissítés engedélyezve" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7806,7 +7819,7 @@ msgstr "" "alkalmazások megkövetelik továbbá, hogy a felhasználói fiók egy csoport " "tagja legyen, hogy a felhasználó hozzáférhessen az alkalmazáshoz." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7818,25 +7831,25 @@ msgstr "" "az admin csoport felhasználói módosíthatják az alkalmazásokat vagy " "a rendszerbeállításokat." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Felhasználók és csoportok" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Hozzáférés az összes szolgáltatáshoz és rendszerbeállításhoz" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP-bejegyzés ellenőrzése: \"{search_item}\"" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7845,32 +7858,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "A felhasználónév foglalt." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Adj meg egy érvényes felhasználónevet." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Szükséges. Legfeljebb 150 karakter. Csak angol betűk, számjegyek és @/./-/_." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Hitelesítési jelszó" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" -"A fiókmódosítások engedélyezéséhez add meg \"{user}\" felhasználó jelszavát." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Érvénytelen jelszó." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7886,22 +7879,47 @@ msgstr "" "képesek bejelentkezni a rendszerbe, ahol adminisztrátori jogosultságokkal " "rendelkeznek (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Adj meg egy érvényes felhasználónevet." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"Szükséges. Legfeljebb 150 karakter. Csak angol betűk, számjegyek és @/./-/_." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Hitelesítési jelszó" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" +"A fiókmódosítások engedélyezéséhez add meg \"{user}\" felhasználó jelszavát." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Érvénytelen jelszó." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "LDAP-felhasználó létrehozása sikertelen: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" "Az új felhasználó hozzáadása a(z) {group} csoporthoz nem sikerült: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Engedélyezett SSH-kulcsok" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7911,38 +7929,38 @@ msgstr "" "jelszó nélkül jelentkezzen be. Több kulcs is megadható; soronként egy. Az " "üres, illetve # jellel kezdődő sorok nem számítanak." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "LDAP-felhasználó átnevezése sikertelen." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Nem sikerült eltávolítani a felhasználót a csoportból." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Nem sikerült hozzáadni a felhasználót a csoporthoz." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "SSH-kulcsok beállítása sikertelen." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Nem sikerült a felhasználói állapot megváltoztatása." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "LDAP-felhasználó jelszavának megváltoztatása sikertelen." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" "Nem sikerült hozzáadni az új felhasználót a rendszergazdai csoporthoz: " "{error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Felhasználói fiók létrehozva, bejelentkezés sikeres" @@ -8489,7 +8507,7 @@ msgstr "" "teszi lehetővé a WordPress webhely vagy blog megtekintését. Csak a WordPress " "kezdeti beállításának elvégzése után engedélyezd." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8511,7 +8529,7 @@ msgstr "" "tartózkodási hely alapján. Az egyes fényképek közvetlen link elküldésével " "megoszthatók másokkal." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8523,11 +8541,11 @@ msgstr "" "rendszerben is létre kell hozni egy-egy fiókot ugyanazzal a " "felhasználónévvel." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Fotó szervező" @@ -8582,110 +8600,92 @@ msgstr "" msgid "Finished: {name}" msgstr "Szolgáltatás letiltva: {name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "A(z) {package_name} a legfrissebb verzió ({latest_version})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "telepítés" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "letöltés" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "adathordozó csere" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurációs fájl: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install Apps" msgid "Installing app" msgstr "Alkalmazások telepítése" -#: setup.py:43 +#: setup.py:41 #, fuzzy #| msgid "Updating..." msgid "Updating app" msgstr "Frissítés…" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Hiba lépett fel az alkalmazás telepítésekor: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Hiba lépett fel az alkalmazás telepítésekor: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Hiba lépett fel az alkalmazás telepítésekor: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Hiba lépett fel az alkalmazás telepítésekor: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Alkalmazás telepítve." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "Legutolsó frissítés" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install Apps" msgid "Uninstalling app" msgstr "Alkalmazások telepítése" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Hiba lépett fel az alkalmazás telepítésekor: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Hiba lépett fel az alkalmazás telepítésekor: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Alkalmazás telepítve." -#: setup.py:453 +#: setup.py:493 #, fuzzy #| msgid "Upgrade Packages" msgid "Updating app packages" @@ -8778,10 +8778,6 @@ msgstr "Alkalmazások" msgid " System" msgstr " Rendszer" -#: templates/base.html:131 -msgid "System" -msgstr "Rendszer" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Jelszómódosítás" @@ -9086,11 +9082,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "A beállítás változatlan" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -9099,6 +9095,40 @@ msgstr "" msgid "Gujarati" msgstr "Gudzsaráti" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Tárhelypillanatképek konfigurációja frissítve" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Hiba a művelet közben: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Automatikus frissítések engedélyezve" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Automatikus frissítések kikapcsolva" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Disztribúció frissítés engedélyezve" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Disztribúció frissítés letiltva" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Hiba lépett fel az alkalmazás telepítésekor: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Hiba lépett fel az alkalmazás telepítésekor: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Hiba lépett fel az alkalmazás telepítésekor: {string} {details}" + #~ msgid "Page source" #~ msgstr "Oldal forrása" diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index 7d8a73b58..45f996684 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Indonesian Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3955,19 +3984,19 @@ msgstr "Secure Shell" msgid "Services" msgstr "Layanan" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Jaringan" @@ -4446,11 +4475,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5087,7 +5111,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Visibilitas Publik" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "Domain PageKite" @@ -5307,17 +5331,17 @@ msgstr "Matikan Sekarang" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 #, fuzzy #| msgid "Privoxy" msgid "Privacy" msgstr "Privoxy" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5336,14 +5360,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5354,15 +5378,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Proksi Web" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Akses {url} dengan proksi {proxy} pada tcp{kind}" @@ -6229,7 +6253,7 @@ msgstr "Tanggal" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Hapus Snapshot" @@ -6297,33 +6321,36 @@ msgstr "Kelola Snapshot" msgid "Created snapshot." msgstr "Snapshot yang dibuat." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Konfigurasi snapshot penyimpanan diperbarui" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Konfigurasi diperbarui." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Galat {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Menghapus snapshot yang dipilih" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Delete Snapshots" +msgid "Deleting snapshot failed." +msgstr "Hapus Snapshot" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "Snapshot sedang digunakan. Silakan coba lagi nanti." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "Sistem harus dimulai ulang untuk menyelesaikan rollback." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Rollback ke Snapshot" @@ -6339,7 +6366,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Server Secure Shell (SSH)" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 #, fuzzy #| msgid "Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)" @@ -6417,121 +6444,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Penyimpanan" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} bytes" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "Operasi gagal." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "Operasi telah dibatalkan." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Perangkat belum terpasang." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Power" msgid "Go to Power" @@ -6638,9 +6665,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6675,7 +6701,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6826,7 +6852,7 @@ msgstr "Terjadi kesalahan selama konfigurasi." msgid "Error configuring app: {error}" msgstr "Kesalahan pemasangan aplikasi: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6835,22 +6861,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "I2P Proxy" msgid "Tor Proxy" msgstr "I2p proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6990,7 +7016,7 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 #, fuzzy @@ -6998,28 +7024,28 @@ msgstr "" msgid "Software Update" msgstr "URL Server diperbarui" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 #, fuzzy #| msgid "FreedomBox" msgid "FreedomBox Updated" msgstr "FreedomBox" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "Pembaruan distribusi dimulai" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7182,53 +7208,36 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Pembaruan distribusi dinonaktifkan" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Pembaruan distribusi dinonaktifkan" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 #, fuzzy #| msgid "Distribution upgrade disabled" msgid "Starting distribution upgrade test." msgstr "Pembaruan distribusi dinonaktifkan" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7236,25 +7245,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7263,32 +7272,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Masukkan sebuah nama pengguna yang valid." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -#, fuzzy -#| msgid "Administrator Account" -msgid "Authorization Password" -msgstr "Akun Administrator" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Kata sandi tidak valid." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7297,59 +7286,84 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Masukkan sebuah nama pengguna yang valid." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +#, fuzzy +#| msgid "Administrator Account" +msgid "Authorization Password" +msgstr "Akun Administrator" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Kata sandi tidak valid." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Gagal membuat pengguna LDAP. {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Gagal menambahkan pengguna baru ke kelompok {group}: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 #, fuzzy #| msgid "Failed to add new user to admin group." msgid "Failed to change user status." msgstr "Gagal menambahkan pengguna baru ke kelompok admin." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Gagal menambahkan pengguna baru ke kelompok admin. {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7857,7 +7871,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7870,7 +7884,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7878,11 +7892,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7932,108 +7946,90 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "memasang" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "mengunduh" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install Apps" msgid "Installing app" msgstr "Instal aplikasi" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Kesalahan Pemasangan aplikasi: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Kesalahan Pemasangan aplikasi: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Kesalahan pemasangan aplikasi: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Kesalahan pemasangan aplikasi: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Aplikasi telah terpasang." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "Pembaharuan Terakhir" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install Apps" msgid "Uninstalling app" msgstr "Instal aplikasi" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Kesalahan Pemasangan aplikasi: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Kesalahan pemasangan aplikasi: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Aplikasi telah terpasang." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -8116,10 +8112,6 @@ msgstr "Apps" msgid " System" msgstr " sistem" -#: templates/base.html:131 -msgid "System" -msgstr "Sistem" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Ganti kata sandi" @@ -8402,11 +8394,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -8415,6 +8407,31 @@ msgstr "" msgid "Gujarati" msgstr "Bahasa Gujarat" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Konfigurasi snapshot penyimpanan diperbarui" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Galat {0} [{1}] [{2}]" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Pembaruan distribusi dinonaktifkan" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Kesalahan Pemasangan aplikasi: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Kesalahan Pemasangan aplikasi: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Kesalahan Pemasangan aplikasi: {string} {details}" + #~ msgid "Page source" #~ msgstr "Sumber halaman" diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index 304ae774d..b1a882b58 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Italian Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3997,19 +4026,19 @@ msgstr "Secure Shell" msgid "Services" msgstr "Servizi" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Reti" @@ -4513,11 +4542,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Questa connessione non è attiva." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Sicurezza" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5196,7 +5220,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Visibilità Pubblica" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "Dominio PageKite" @@ -5434,17 +5458,17 @@ msgstr "Spegni Ora" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 #, fuzzy #| msgid "Privoxy" msgid "Privacy" msgstr "Privoxy" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5463,7 +5487,7 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5474,7 +5498,7 @@ msgstr "" "header HTTP, controllando gli accessi, rimuovendo pubblicità e altra odiosa " "spazzatura dell'Internet. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, fuzzy, python-brace-format #| msgid "" #| "You can use Privoxy by modifying your browser proxy settings to your " @@ -5496,15 +5520,15 @@ msgstr "" "documentazione su http://config." "Privoxy.org/ o http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Web Proxy" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Accesso {url} con proxy {proxy} su tcp{kind}" @@ -6365,7 +6389,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -6433,34 +6457,35 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration update failed." +msgstr "Configurazione caricata" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 #, fuzzy msgid "Deleted selected snapshots" msgstr "Istantanee selezionate cancellate" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -6476,7 +6501,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 #, fuzzy #| msgid "Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)" @@ -6550,122 +6575,122 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 #, fuzzy msgid "The device is already unmounting." msgstr "Il dispositivo sta già smontando." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Il dispositivo è già montato." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Power" msgid "Go to Power" @@ -6772,9 +6797,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6809,7 +6833,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6956,7 +6980,7 @@ msgstr "Aggiornamento della configurazione" msgid "Error configuring app: {error}" msgstr "Errore durante l'installazione dell'applicazione: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6965,22 +6989,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "I2P Proxy" msgid "Tor Proxy" msgstr "Proxy I2P" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -7121,32 +7145,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Aggiornamento software" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox aggiornato" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7296,51 +7320,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7348,25 +7355,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7375,30 +7382,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Inserisci un nome utente valido." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Password di autorizzazione" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Password non valida." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7407,57 +7396,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Inserisci un nome utente valido." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Password di autorizzazione" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Password non valida." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Fallito l'inserimento di un nuovo utente nel gruppo {group}: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Aggiunta del nuovo utente al gruppo admin fallita: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7939,7 +7951,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7952,7 +7964,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7960,11 +7972,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -8015,108 +8027,90 @@ msgstr "" msgid "Finished: {name}" msgstr "Servizio disabilitato: {name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install Apps" msgid "Installing app" msgstr "Installa App" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Errore installazione applicazione: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Errore installazione applicazione: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Errore durante l'installazione dell'applicazione: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Errore durante l'installazione dell'applicazione: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Applicazione installata." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "Ultimo aggiornamento" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install Apps" msgid "Uninstalling app" msgstr "Installa App" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Errore installazione applicazione: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Errore durante l'installazione dell'applicazione: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Applicazione installata." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -8203,10 +8197,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -8481,11 +8471,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Impostazioni invariate" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -8494,6 +8484,21 @@ msgstr "" msgid "Gujarati" msgstr "Gujarati" +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Errore installazione applicazione: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Errore installazione applicazione: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Errore installazione applicazione: {string} {details}" + #~ msgid "Page source" #~ msgstr "Pagina di origine" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index bc87e0872..1d43f9e96 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2023-05-07 23:50+0000\n" "Last-Translator: Nobuhiro Iwamatsu \n" "Language-Team: Japanese Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3499,19 +3521,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -3990,11 +4012,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4631,7 +4648,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4847,15 +4864,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4874,14 +4891,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4892,15 +4909,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5726,7 +5743,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5794,33 +5811,32 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" +#: modules/snapshot/views.py:160 +msgid "Configuration update failed." msgstr "" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5836,7 +5852,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5908,121 +5924,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6127,9 +6143,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6164,7 +6179,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6306,7 +6321,7 @@ msgstr "" msgid "Error configuring app: {error}" msgstr "" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6315,20 +6330,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6457,32 +6472,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6629,51 +6644,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6681,25 +6679,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6708,30 +6706,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6740,57 +6720,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7272,7 +7275,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7285,7 +7288,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7293,11 +7296,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7346,92 +7349,77 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "" -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "" -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7513,10 +7501,6 @@ msgstr "アプリ" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7784,11 +7768,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, 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 573125457..8e3f41813 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2020-07-16 16:41+0000\n" "Last-Translator: Yogesh \n" "Language-Team: Kannada Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3499,19 +3521,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -3990,11 +4012,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4631,7 +4648,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4847,15 +4864,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4874,14 +4891,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4892,15 +4909,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5728,7 +5745,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5796,33 +5813,32 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" +#: modules/snapshot/views.py:160 +msgid "Configuration update failed." msgstr "" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5838,7 +5854,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5910,121 +5926,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6129,9 +6145,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6166,7 +6181,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6308,7 +6323,7 @@ msgstr "" msgid "Error configuring app: {error}" msgstr "" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6317,20 +6332,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6459,32 +6474,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6631,51 +6646,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6683,25 +6681,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6710,30 +6708,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6742,57 +6722,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7274,7 +7277,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7287,7 +7290,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7295,11 +7298,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7348,92 +7351,77 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "" -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "" -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7515,10 +7503,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7786,11 +7770,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, 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 886091940..3de7841ca 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Lithuanian Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3501,19 +3523,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -3992,11 +4014,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4633,7 +4650,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4849,15 +4866,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4876,14 +4893,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4894,15 +4911,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5728,7 +5745,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5796,33 +5813,32 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" +#: modules/snapshot/views.py:160 +msgid "Configuration update failed." msgstr "" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5838,7 +5854,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5910,121 +5926,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6129,9 +6145,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6166,7 +6181,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6308,7 +6323,7 @@ msgstr "" msgid "Error configuring app: {error}" msgstr "" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6317,22 +6332,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "I2P Proxy" msgid "Tor Proxy" msgstr "I2P Proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6461,32 +6476,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6633,51 +6648,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6685,25 +6683,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6712,30 +6710,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6744,57 +6724,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7276,7 +7279,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7289,7 +7292,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7297,11 +7300,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7350,92 +7353,77 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "" -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "" -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7517,10 +7505,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7788,11 +7772,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, 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 f25547236..28042f231 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Latvian Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3500,19 +3522,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -3991,11 +4013,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4632,7 +4649,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4848,15 +4865,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4875,14 +4892,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4893,15 +4910,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5727,7 +5744,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5795,33 +5812,32 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" +#: modules/snapshot/views.py:160 +msgid "Configuration update failed." msgstr "" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5837,7 +5853,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5909,121 +5925,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6128,9 +6144,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6165,7 +6180,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6307,7 +6322,7 @@ msgstr "" msgid "Error configuring app: {error}" msgstr "" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6316,22 +6331,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "I2P Proxy" msgid "Tor Proxy" msgstr "I2P Proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6460,32 +6475,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6632,51 +6647,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6684,25 +6682,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6711,30 +6709,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6743,57 +6723,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7275,7 +7278,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7288,7 +7291,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7296,11 +7299,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7349,92 +7352,77 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "" -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "" -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7516,10 +7504,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7787,11 +7771,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, 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 187e257a6..a18f2d2d4 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2023-08-16 06:52+0000\n" "Last-Translator: Petter Reinholdtsen \n" "Language-Team: Norwegian Bokmål Let's Encrypt for å skaffe deg det." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -4105,7 +4134,7 @@ msgstr "Secure Shell (SSH)" msgid "Services" msgstr "Tjeneste" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4113,7 +4142,7 @@ msgstr "" "Sett opp nettverksenheter. Sett opp Internett via Ethernet, Wi-Fi eller " "PPPoE. Del den tilkoblingen med andre enheter på nettverket." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4121,7 +4150,7 @@ msgstr "" "Enheter administrert gjennom andre metoder kan være utilgjengelige for " "oppsett her." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Nettverk" @@ -4637,11 +4666,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Denne forbindelsen er ikke aktiv." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Sikkerhet" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5391,7 +5415,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Offentlig synlighet" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "PageKite-domene" @@ -5640,17 +5664,17 @@ msgstr "Slå av nå" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 #, fuzzy #| msgid "Privoxy" msgid "Privacy" msgstr "Privoxy" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5669,7 +5693,7 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5680,7 +5704,7 @@ msgstr "" "overskrifter, kontrollere tilgang, og fjerne annonser og annet ubehagelig " "Internett-søppel. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, fuzzy, python-brace-format #| msgid "" #| "You can use Privoxy by modifying your browser proxy settings to your " @@ -5702,15 +5726,15 @@ msgstr "" "href=\"http://config.privoxy.org\">http://config.privoxy.org/ eller http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Mellomtjener for nettet" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Tilgang {url} med mellomtjener {proxy} på tcp{kind}" @@ -6699,7 +6723,7 @@ msgstr "Dato" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Slett avbildninger" @@ -6778,33 +6802,36 @@ msgstr "Behandle avbildninger" msgid "Created snapshot." msgstr "Opprett øyeblikksbilde." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Oppsett for lagringsavbildninger oppdatert" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Konfigurering oppdatert." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Handlingsfeil: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Slettet alle valgte avbildninger" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Klarte ikke slette LDAP-bruker." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "Øyeblikksbilde i bruk. Prøv igjen senere." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "Rullet tilbake til øyeblikksbilde #{number}." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "Systemet må startes på nytt for å fullføre tilbakerullingen." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Rull tilbake til øyeblikksbilde" @@ -6824,7 +6851,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Secure Shell (SSH) tjener" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 #, fuzzy #| msgid "Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)" @@ -6913,91 +6940,91 @@ msgstr "" "kan vise lagringsmedia som er i bruk, montere og avmontere flyttbare medium, " "utvide rotpartisjonen, osv." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Lager" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} byte" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "Operasjonen mislyktes." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "Operasjonen ble avbrutt." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Enheten avmonteres allerede." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" "Denne aktiviteten støttes ikke på grunn av manglende driver-/verktøystøtte." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "Tidsavbrudd for operasjon." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "Operasjonen vil vekke en disk fra en tilstand av dyp søvn." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Prøver å avmontere en opptatt enhet." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "Operasjonen har allerede blitt avbrutt." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "Mangler rettigheter til utførelse av forespurt operasjon." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Denne enheten er allerede montert." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Enheten er ikke montert." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "Mangler rettigheter til bruk av forespurt valg." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Enheten er montert av en annen bruker." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, fuzzy, no-python-format, python-brace-format #| msgid "" #| "Warning: Low space on system partition ({percent_used}% used, " @@ -7007,15 +7034,15 @@ msgstr "" "Advarsel: Lite plass igjen på systempartisjon ({percent_used}% brukt, " "{free_space} ledig)." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Lite ledig diskplass" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Diskfeil nært forestående" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -7024,20 +7051,20 @@ msgstr "" "Disk {id} rapporterer at den sannsynligvis vil feile i nær fremtid. Kopier " "all data mens det fremdeles er mulig og bytt ut disken." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 #, fuzzy #| msgid "Root Filesystem" msgid "Read-only root filesystem" msgstr "Rotfilsystem" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Go to Networks" msgid "Go to Power" @@ -7150,9 +7177,10 @@ msgstr "{drive_vendor} {drive_model} kan trygt kobles fra." msgid "Device can be safely unplugged." msgstr "Enheten kan trygt kobles fra." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Feil ved utløsing av enhet: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7203,7 +7231,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Filsynkronisering" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7376,7 +7404,7 @@ msgstr "Oppdaterer oppsett" msgid "Error configuring app: {error}" msgstr "Feil ved programinstallering: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7385,22 +7413,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "Tor Socks Proxy" msgid "Tor Proxy" msgstr "Tor Socks-mellomtjener" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Tor Socks-mellomtjener" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Adgang til URL {url} på tcp{kind} via Tor" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Bekreft Tor-bruk på {url} via tcp{kind}" @@ -7554,34 +7582,34 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Programvare-oppdatering" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox oppdatert" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 #, fuzzy #| msgid "Automatic upgrades disabled" msgid "Distribution update started" msgstr "Automatiske oppgraderinger avslått (deaktivert)" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7765,49 +7793,30 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Automatiske oppgraderinger aktivert" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "" "Feil ved oppsett av uoppdaterte oppgraderinger (unattended-upgrades): {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Automatiske oppgraderinger aktivert" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Automatiske oppgraderinger avslått (deaktivert)" - -#: modules/upgrades/views.py:86 -#, fuzzy -#| msgid "Automatic upgrades enabled" -msgid "Distribution upgrade enabled" -msgstr "Automatiske oppgraderinger aktivert" - -#: modules/upgrades/views.py:89 -#, fuzzy -#| msgid "Automatic upgrades disabled" -msgid "Distribution upgrade disabled" -msgstr "Automatiske oppgraderinger avslått (deaktivert)" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Oppgraderingsprosessen (upgrade process) har startet." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Å starte oppgradering (upgrade) mislyktes." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "Starter test av distribusjonsoppgradering." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7818,7 +7827,7 @@ msgstr "" "kan kreve at en brukerkonto er medlem av en gruppe for å gi brukeren tilgang " "til programmet." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7829,25 +7838,25 @@ msgstr "" "liste over programmer som er relevante for dem på hjemmesiden. Dog kan kun " "brukere av admin-gruppen endre programmer eller systeminnstillinger." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Brukere og grupper" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Tilgang til alle tjenester og systeminnstillinger" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Sjekk LDAP-oppføring «{search_item}»" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7856,31 +7865,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "Brukernavnet er opptatt eller reservert." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Skriv et gyldig brukernavn." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Påkrevd. 150 tegn eller mindre. Kun engelske bokstaver, tall og @/./-/_." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Tilgangspassord" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "Skriv inn passordet for bruker «{user}» for å tillate kontoendringer." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Ugyldig passord." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7894,21 +7884,45 @@ msgstr "" "gruppen kan logge seg på alle tjenester. De kan også logge inn på systemet " "via SSH, og ha administrative rettigheter (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Skriv et gyldig brukernavn." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"Påkrevd. 150 tegn eller mindre. Kun engelske bokstaver, tall og @/./-/_." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Tilgangspassord" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "Skriv inn passordet for bruker «{user}» for å tillate kontoendringer." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Ugyldig passord." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Oppretting av LDAP-bruker mislyktes: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Klarte ikke å legge ny bruker til i {group}-gruppen: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Autoriserte SSH-nøkler" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7918,38 +7932,38 @@ msgstr "" "på systemet uten å bruke passord. Du kan legge inn multiple (flere) nøkler, " "én på hver linje. Blanke linjer og linjer som starter med # vil bli ignorert." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Klarte ikke å bytte navn på LDAP-bruker." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Klarte ikke å slette bruker fra gruppe." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Klarte ikke legge bruker til gruppe." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "Klarte ikke sette SSH-nøkler." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "Klarte ikke legge bruker til gruppe." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Klarte ikke å bytte passord for LDAP-bruker." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Klarte ikke å legge til en ny bruker i admin-gruppen: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Brukerkonto er opprettet, du er nå logget inn" @@ -8495,7 +8509,7 @@ msgstr "" "nettstedet eller bloggen. Aktiver kun etter at oppsettet av Wordpress er " "gjennomført." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8508,7 +8522,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8516,11 +8530,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Organiserer fotografier" @@ -8574,107 +8588,89 @@ msgstr "" msgid "Finished: {name}" msgstr "Tjeneste deaktivert: {name}" -#: package.py:214 +#: package.py:206 #, fuzzy, python-brace-format #| msgid "Package {expression} is not available for install" msgid "Package {package_expression} is not available for install" msgstr "Pakke {expression} er ikke tilgjengelig for installasjon" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Pakke {package_name} er siste versjon ({latest_version})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "installering" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "laster ned" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "mediaendring" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "oppsettsfil: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install Apps" msgid "Installing app" msgstr "Installer App-er" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "Oppdaterer program" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Feil ved programinstallering: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Feil ved programinstallering: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Feil ved programinstallering: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Feil ved programinstallering: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Program installert." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "Program oppdatert" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install Apps" msgid "Uninstalling app" msgstr "Installer App-er" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Feil ved programinstallering: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Feil ved programinstallering: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Program installert." -#: setup.py:453 +#: setup.py:493 #, fuzzy #| msgid "Upgrade Packages" msgid "Updating app packages" @@ -8768,10 +8764,6 @@ msgstr "Apps/Programmer" msgid " System" msgstr " System" -#: templates/base.html:131 -msgid "System" -msgstr "System" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Endre passord" @@ -9074,11 +9066,11 @@ msgstr "" "All programdata og oppsett blir permanent borte. Programmet kan installeres " "på nytt igjen." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Oppsett uendret" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "før avinstallering av {app_id}" @@ -9087,6 +9079,44 @@ msgstr "før avinstallering av {app_id}" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Oppsett for lagringsavbildninger oppdatert" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Handlingsfeil: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Automatiske oppgraderinger aktivert" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Automatiske oppgraderinger avslått (deaktivert)" + +#, fuzzy +#~| msgid "Automatic upgrades enabled" +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Automatiske oppgraderinger aktivert" + +#, fuzzy +#~| msgid "Automatic upgrades disabled" +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Automatiske oppgraderinger avslått (deaktivert)" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Feil ved programinstallering: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Feil ved programinstallering: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Feil ved programinstallering: {string} {details}" + #~ msgid "Page source" #~ msgstr "Sidekilde" diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index 797471529..6715750e6 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-12 20:35-0500\n" -"PO-Revision-Date: 2023-12-03 21:05+0000\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" +"PO-Revision-Date: 2024-02-28 10:02+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.3-dev\n" +"X-Generator: Weblate 5.5-dev\n" "X-Language: nl_NL\n" "X-Source-Language: C\n" @@ -26,31 +26,31 @@ msgstr "" msgid "Static configuration {etc_path} is setup properly" msgstr "Statische configuratie {etc_path} is correct ingesteld" -#: context_processors.py:23 views.py:95 +#: context_processors.py:23 views.py:116 msgid "FreedomBox" msgstr "FreedomBox" -#: daemon.py:105 +#: daemon.py:122 #, python-brace-format msgid "Service {service_name} is running" msgstr "Service {service_name} wordt uitgevoerd" -#: daemon.py:164 +#: daemon.py:218 #, python-brace-format msgid "Listening on {kind} port {listen_address}:{port}" msgstr "Luistert op {kind} poort {listen_address}:{port}" -#: daemon.py:167 +#: daemon.py:221 #, python-brace-format msgid "Listening on {kind} port {port}" msgstr "Luistert op {kind} poort {port}" -#: daemon.py:236 +#: daemon.py:291 #, python-brace-format msgid "Connect to {host}:{port}" msgstr "Verbind met {host}:{port}" -#: daemon.py:240 +#: daemon.py:299 #, python-brace-format msgid "Cannot connect to {host}:{port}" msgstr "Kan niet verbinden met {host}:{port}" @@ -104,7 +104,32 @@ msgstr "Te gebruiken taal voor de weergave van deze webinterface" msgid "Use the language preference set in the browser" msgstr "Gebruik de taalvoorkeuren die zijn ingesteld in de browser" -#: middleware.py:130 +#: menu.py:106 +#, fuzzy +#| msgid "Public Visibility" +msgid "Visibility" +msgstr "Openbare zichtbaarheid" + +#: menu.py:108 +msgid "Data" +msgstr "" + +#: menu.py:110 templates/base.html:131 +msgid "System" +msgstr "Systeem" + +#: menu.py:112 modules/networks/templates/connection_show.html:259 +#: modules/security/__init__.py:35 +msgid "Security" +msgstr "Security" + +#: menu.py:114 +#, fuzzy +#| msgid "Server Administration" +msgid "Administration" +msgstr "Serverbeheer" + +#: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." msgstr "Systeem is mogelijk zwaar belast. Probeer het later nog eens." @@ -121,12 +146,12 @@ msgstr "Webserver" msgid "{box_name} Web Interface (Plinth)" msgstr "{box_name} Web Interface (Plinth)" -#: modules/apache/components.py:154 +#: modules/apache/components.py:159 #, python-brace-format msgid "Access URL {url} on tcp{kind}" msgstr "ToegangsURL {url} op tcp{kind}" -#: modules/apache/components.py:157 +#: modules/apache/components.py:162 #, python-brace-format msgid "Access URL {url}" msgstr "ToegangsURL {url}" @@ -152,7 +177,7 @@ msgstr "" msgid "Service Discovery" msgstr "Service Discovery" -#: modules/avahi/__init__.py:60 +#: modules/avahi/__init__.py:61 msgid "Local Network Domain" msgstr "Lokaal netwerkdomein" @@ -160,12 +185,12 @@ msgstr "Lokaal netwerkdomein" msgid "Backups allows creating and managing backup archives." msgstr "Met back-ups kun je back-uparchieven maken en beheren." -#: modules/backups/__init__.py:44 modules/backups/__init__.py:167 -#: modules/backups/__init__.py:212 +#: modules/backups/__init__.py:44 modules/backups/__init__.py:168 +#: modules/backups/__init__.py:213 msgid "Backups" msgstr "Back-ups" -#: modules/backups/__init__.py:164 +#: modules/backups/__init__.py:165 msgid "" "Enable an automatic backup schedule for data safety. Prefer an encrypted " "remote backup location or an extra attached disk." @@ -174,17 +199,17 @@ msgstr "" "verhogen. Gebruik bij voorkeur een versleutelde externe back-uplocatie of " "een extra aangesloten schijf." -#: modules/backups/__init__.py:170 +#: modules/backups/__init__.py:171 msgid "Enable a Backup Schedule" msgstr "Een back-upschema inschakelen" -#: modules/backups/__init__.py:174 modules/backups/__init__.py:221 -#: modules/privacy/__init__.py:76 modules/storage/__init__.py:314 +#: modules/backups/__init__.py:175 modules/backups/__init__.py:222 +#: modules/privacy/__init__.py:77 modules/storage/__init__.py:315 #, python-brace-format msgid "Go to {app_name}" msgstr "Ga naar {app_name}" -#: modules/backups/__init__.py:209 +#: modules/backups/__init__.py:210 #, python-brace-format msgid "" "A scheduled backup failed. Past {error_count} attempts for backup did not " @@ -193,7 +218,7 @@ msgstr "" "Een geplande back-up is mislukt. De vorige {error_count} back-up pogingen " "zijn ook niet gelukt. De laatste fout was: {error_message}" -#: modules/backups/__init__.py:217 +#: modules/backups/__init__.py:218 msgid "Error During Backup" msgstr "Fout tijdens back-up" @@ -439,7 +464,7 @@ msgstr "Het opslag pad is niet leeg, en ook geen lege bestaande backup opslag." msgid "Existing repository is not encrypted." msgstr "Bestaande repository is niet versleuteld." -#: modules/backups/repository.py:335 +#: modules/backups/repository.py:337 #, python-brace-format msgid "{box_name} storage" msgstr "{box_name} opslag" @@ -826,7 +851,7 @@ msgstr "" "Rechten voor anonieme gebruikers, die geen wachtwoord hebben opgegeven." #: modules/bepasty/forms.py:27 modules/bepasty/templates/bepasty.html:30 -#: modules/users/forms.py:110 modules/users/forms.py:233 +#: modules/users/forms.py:103 msgid "Permissions" msgstr "Toegangsrechten" @@ -905,8 +930,9 @@ msgstr "Admin" #: modules/bepasty/views.py:88 modules/diagnostics/views.py:52 #: modules/searx/views.py:35 modules/searx/views.py:46 -#: modules/security/views.py:56 modules/tor/views.py:73 -#: modules/torproxy/views.py:71 modules/zoph/views.py:74 +#: modules/security/views.py:56 modules/snapshot/views.py:158 +#: modules/tor/views.py:73 modules/torproxy/views.py:71 +#: modules/upgrades/views.py:83 modules/zoph/views.py:74 msgid "Configuration updated." msgstr "Configuratie bijgewerkt." @@ -997,7 +1023,7 @@ msgstr "IP adressen en domeinen verversen" #: modules/bind/views.py:61 modules/config/views.py:98 #: modules/coturn/views.py:40 modules/deluge/views.py:35 #: modules/dynamicdns/views.py:78 modules/ejabberd/views.py:95 -#: modules/email/views.py:45 modules/matrixsynapse/views.py:146 +#: modules/email/views.py:45 modules/matrixsynapse/views.py:149 #: modules/minetest/views.py:55 modules/mumble/views.py:37 #: modules/pagekite/forms.py:74 modules/privacy/views.py:36 #: modules/quassel/views.py:29 modules/roundcube/views.py:32 @@ -1197,7 +1223,7 @@ msgstr "Algemene Instellingen" msgid "Configure" msgstr "Configureer" -#: modules/config/__init__.py:62 modules/config/forms.py:68 +#: modules/config/__init__.py:63 modules/config/forms.py:68 #: modules/dynamicdns/forms.py:82 modules/names/templates/names.html:16 msgid "Domain Name" msgstr "Domeinnaam" @@ -1408,7 +1434,7 @@ msgstr "" msgid "Date & Time" msgstr "Datum en Tijd" -#: modules/datetime/__init__.py:122 +#: modules/datetime/__init__.py:123 msgid "Time synchronized to NTP server" msgstr "Tijd gesynchroniseerd met NTP-server" @@ -1469,7 +1495,7 @@ msgstr "Opslagmap" msgid "Bittorrent client written in Python/PyGTK" msgstr "Bittorrent-client geschreven in Python/PyGTK" -#: modules/diagnostics/__init__.py:27 +#: modules/diagnostics/__init__.py:28 msgid "" "The system diagnostic test will run a number of checks on your system to " "confirm that applications and services are working as expected." @@ -1477,48 +1503,48 @@ msgstr "" "De systeemdiagnose zal een aantal tests op dit systeem uitvoeren om te " "bevestigen dat de toepassingen en diensten zoals verwacht functioneren." -#: modules/diagnostics/__init__.py:51 modules/diagnostics/__init__.py:236 +#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:240 msgid "Diagnostics" msgstr "Diagnose" -#: modules/diagnostics/__init__.py:95 +#: modules/diagnostics/__init__.py:98 msgid "passed" msgstr "geslaagd" -#: modules/diagnostics/__init__.py:96 modules/networks/views.py:50 +#: modules/diagnostics/__init__.py:99 modules/networks/views.py:50 msgid "failed" msgstr "mislukt" -#: modules/diagnostics/__init__.py:97 +#: modules/diagnostics/__init__.py:100 msgid "error" msgstr "fout" -#: modules/diagnostics/__init__.py:98 +#: modules/diagnostics/__init__.py:101 msgid "warning" msgstr "waarschuwing" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: modules/diagnostics/__init__.py:202 +#: modules/diagnostics/__init__.py:206 msgid "MiB" msgstr "MiB" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: modules/diagnostics/__init__.py:207 +#: modules/diagnostics/__init__.py:211 msgid "GiB" msgstr "GiB" -#: modules/diagnostics/__init__.py:214 +#: modules/diagnostics/__init__.py:218 msgid "You should disable some apps to reduce memory usage." msgstr "" "Door toepassingen uit te schakelen kan het geheugengebruik worden verminderd." -#: modules/diagnostics/__init__.py:219 +#: modules/diagnostics/__init__.py:223 msgid "You should not install any new apps on this system." msgstr "Extra toepassingen installeren wordt afgeraden." -#: modules/diagnostics/__init__.py:231 +#: modules/diagnostics/__init__.py:235 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " @@ -1527,52 +1553,44 @@ msgstr "" "Systeem heeft weinig geheugen beschikbaar: {percent_used}% gebruikt, " "{memory_available} {memory_available_unit} vrij. {advice_message}" -#: modules/diagnostics/__init__.py:233 +#: modules/diagnostics/__init__.py:237 msgid "Low Memory" msgstr "Geheugengebrek" -#: modules/diagnostics/__init__.py:264 +#: modules/diagnostics/__init__.py:268 msgid "Running diagnostics" msgstr "Voer diagnose uit" -#: modules/diagnostics/__init__.py:307 +#: modules/diagnostics/__init__.py:311 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." -msgstr "" +msgstr "{issue_count} problemen gevonden tijdens routinetests." -#: modules/diagnostics/__init__.py:308 +#: modules/diagnostics/__init__.py:312 msgid "Diagnostics results" msgstr "Resultaten van diagnose" -#: modules/diagnostics/__init__.py:313 +#: modules/diagnostics/__init__.py:317 msgid "Go to diagnostics results" msgstr "Ga naar resultaten van diagnose" #: modules/diagnostics/forms.py:11 -#, fuzzy -#| msgid "Enable Subdomains" msgid "Enable daily run" -msgstr "Subdomeinen Inschakelen" +msgstr "Dagelijkse tests inschakelen" #: modules/diagnostics/forms.py:12 -#, fuzzy -#| msgid "When enabled, FreedomBox automatically updates once a day." msgid "When enabled, diagnostic checks will run once a day." msgstr "" -"Als deze functie is ingeschakeld, wordt FreedomBox automatisch één keer per " -"dag bijgewerkt." +"Als deze functie is ingeschakeld, worden dagelijks diagnostische tests " +"uitgevoerd." #: modules/diagnostics/templates/diagnostics.html:11 -#, fuzzy -#| msgid "Diagnostics" msgid "Diagnostics Run" -msgstr "Diagnose" +msgstr "Diagnose uitvoeren" #: modules/diagnostics/templates/diagnostics.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Run Diagnostics Now" -msgstr "Voer Diagnostische test uit" +msgstr "Voer Diagnosetests nu uit" #: modules/diagnostics/templates/diagnostics.html:22 msgid "View Results" @@ -1633,7 +1651,7 @@ msgstr "Test" msgid "Result" msgstr "Resultaat" -#: modules/diagnostics/views.py:107 +#: modules/diagnostics/views.py:111 msgid "Diagnostic Test" msgstr "Diagnostische test" @@ -1684,7 +1702,7 @@ msgstr "" msgid "Dynamic DNS Client" msgstr "Dynamic DNS Cliënt" -#: modules/dynamicdns/__init__.py:74 +#: modules/dynamicdns/__init__.py:75 msgid "Dynamic Domain Name" msgstr "Dynamische domeinnaam" @@ -1790,7 +1808,7 @@ msgid "Use HTTP basic authentication" msgstr "Gebruik HTTP-basisverificatie" #: modules/dynamicdns/forms.py:88 modules/networks/forms.py:207 -#: modules/users/forms.py:67 +#: modules/users/forms.py:129 msgid "Username" msgstr "Gebruikersnaam" @@ -2208,29 +2226,29 @@ msgstr "" msgid "Firewall" msgstr "Firewall" -#: modules/firewall/__init__.py:271 +#: modules/firewall/__init__.py:273 msgid "Default zone is external" msgstr "Standaardzone is extern" -#: modules/firewall/__init__.py:280 +#: modules/firewall/__init__.py:283 msgid "Firewall backend is nftables" msgstr "Firewall backend is nftables" -#: modules/firewall/__init__.py:293 +#: modules/firewall/__init__.py:297 msgid "Direct passthrough rules exist" msgstr "Er zijn directe doorgeefregels ingesteld" -#: modules/firewall/components.py:136 +#: modules/firewall/components.py:139 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Poort {name} ({details}) is beschikbaar binnen interne netwerken" -#: modules/firewall/components.py:147 +#: modules/firewall/components.py:153 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Poort {name} ({details})is beschikbaar voor externe netwerken" -#: modules/firewall/components.py:153 +#: modules/firewall/components.py:159 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Poort {name} ({details}) is niet beschikbaar voor externe netwerken" @@ -2368,11 +2386,11 @@ msgstr "" msgid "Read-write access to Git repositories" msgstr "Lees- en schrijftoegang tot Git-repositories" -#: modules/gitweb/__init__.py:50 modules/gitweb/manifest.py:11 +#: modules/gitweb/__init__.py:48 modules/gitweb/manifest.py:11 msgid "Gitweb" msgstr "Gitweb" -#: modules/gitweb/__init__.py:51 +#: modules/gitweb/__init__.py:49 msgid "Simple Git Hosting" msgstr "Eenvoudige Git Hosting" @@ -2903,7 +2921,7 @@ msgid "I2P" msgstr "I2P" #: modules/i2p/__init__.py:53 modules/tor/__init__.py:63 -#: modules/torproxy/__init__.py:56 +#: modules/torproxy/__init__.py:57 msgid "Anonymity Network" msgstr "Anonimiteitsnetwerk" @@ -3214,7 +3232,7 @@ msgstr "" #: modules/kiwix/templates/kiwix-add-package.html:24 #, python-format msgid "You have %(max_filesize)s of free disk space available." -msgstr "" +msgstr "Er is %(max_filesize)s vrije diskruimte beschikbaar." #: modules/kiwix/templates/kiwix-add-package.html:36 msgid "Upload ZIM file" @@ -3230,6 +3248,8 @@ msgid "" "Delete this package permanently? You may add it back later if you have a " "copy of the ZIM file." msgstr "" +"Dit pakket permanent verwijderen? Het is later terug te zetten met behulp " +"van het ZIM bestand." #: modules/kiwix/templates/kiwix.html:11 msgid "Manage Content Packages" @@ -3301,7 +3321,7 @@ msgstr "Let's Encrypt" msgid "Certificates" msgstr "Certificaten" -#: modules/letsencrypt/__init__.py:104 +#: modules/letsencrypt/__init__.py:105 msgid "Cannot test: No domains are configured." msgstr "Kan niet testen: Er zijn geen domeinen ingesteld." @@ -3376,28 +3396,31 @@ msgstr "" "duren voordat het effect heeft." #: modules/letsencrypt/views.py:46 -#, python-brace-format -msgid "Failed to revoke certificate for domain {domain}: {error}" +#, fuzzy, python-brace-format +#| msgid "Failed to revoke certificate for domain {domain}: {error}" +msgid "Failed to revoke certificate for domain {domain}" msgstr "Intrekken certificaat voor domein {domain} mislukt: {error}" -#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:76 +#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" msgstr "Certificaat voor domein {domain} met succes verkregen" -#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:81 -#, python-brace-format -msgid "Failed to obtain certificate for domain {domain}: {error}" +#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 +#, fuzzy, python-brace-format +#| msgid "Failed to obtain certificate for domain {domain}: {error}" +msgid "Failed to obtain certificate for domain {domain}" msgstr "Verkrijgen van certificaat voor domein {domain} is mislukt: {error}" -#: modules/letsencrypt/views.py:93 +#: modules/letsencrypt/views.py:95 #, python-brace-format msgid "Certificate successfully deleted for domain {domain}" msgstr "Certificaat met succes verwijderd voor domein {domain}" -#: modules/letsencrypt/views.py:98 -#, python-brace-format -msgid "Failed to delete certificate for domain {domain}: {error}" +#: modules/letsencrypt/views.py:100 +#, fuzzy, python-brace-format +#| msgid "Failed to delete certificate for domain {domain}: {error}" +msgid "Failed to delete certificate for domain {domain}" msgstr "Verwijderen certificaat voor domein {domain} mislukt: {error}" #: modules/matrixsynapse/__init__.py:26 @@ -3592,7 +3615,7 @@ msgstr "" "vereist. Ga naar Let's Encrypt om er een " "te verkrijgen." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" "De registratieconfiguratie kan niet worden bijgewerkt wanneer de applicatie " @@ -4020,7 +4043,7 @@ msgstr "Secure Shell" msgid "Services" msgstr "Diensten" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4028,7 +4051,7 @@ msgstr "" "Stel netwerkapparaten in. Maak verbinding met internet via Ethernet, Wi-Fi " "of PPPoE. Deel die verbinding met andere apparaten op het netwerk." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4036,7 +4059,7 @@ msgstr "" "Apparaten die via andere methoden worden beheerd, zijn hier mogelijk niet " "beschikbaar voor configuratie." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Netwerken" @@ -4606,11 +4629,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Deze verbinding is niet actief." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Security" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5326,7 +5344,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Openbare zichtbaarheid" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "PageKite domein" @@ -5570,16 +5588,16 @@ msgstr "Nu Uitschakelen" msgid "Manage system-wide privacy settings." msgstr "Beheer de privacy-instellingen voor het hele systeem." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "Privacy" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" "Werk de privacy-instellingen bij zodat ze overeenkomen met uw voorkeuren." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "Privacy-instelling bekijken" @@ -5605,7 +5623,7 @@ msgstr "" "De insturen gebeurt via het Tor-netwerk voor extra anonimiteit als de Tor-" "app is ingeschakeld." -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5615,7 +5633,7 @@ msgstr "" "om privacy te verhogen, webpagina data en HTTP headers te wijzigen, toegang " "te controleren, en advertenties en andere rommel te weren. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5632,15 +5650,15 @@ msgstr "" "href=\"http://config.privoxy.org\">http://config.privoxy.org/ of http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Web Proxy" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Gebruik {url} via proxy {proxy} op tcp{kind}" @@ -6623,7 +6641,7 @@ msgstr "Datum" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Snapshots verwijderen" @@ -6697,34 +6715,37 @@ msgstr "Beheren van Snapshots" msgid "Created snapshot." msgstr "Gemaakte snapshot." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Opslag van Snapshots configuratie is bijgewerkt" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Configuratie bijgewerkt." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Actiefout: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Verwijderde geselecteerde snapshots" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Verwijderen van LDAP gebruiker mislukt." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "Snapshot is momenteel in gebruik. Probeer het later nog eens." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "Teruggezet naar snapshot #{number}." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" "Het systeem moet opnieuw worden opgestart om het terugdraaien te voltooien." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Terugdraaien naar Snapshot" @@ -6744,7 +6765,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Secure Shell (SSH) Server" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "Op afstand inloggen met Secure Shell (SSH)" @@ -6828,108 +6849,108 @@ msgstr "" "bekijken, verwijderbare media koppelen en ontkoppelen, de rootpartitie " "uitbreiden enz." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Storage" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} bytes" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "De bewerking is mislukt." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "De bewerking is afgebroken." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Het apparaat is al aan het ontkoppelen." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" "De bewerking wordt niet ondersteund vanwege ontbrekende driver / programma-" "ondersteuning." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "Er is een time-out opgetreden voor deze bewerking." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" "De operatie zou een schijf wakker maken die in \"diepe slaap\" stand is." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Poging om een apparaat te ontkoppelen dat in gebruik is." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "De bewerking is al geannuleerd." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "Niet gemachtigd om deze handeling uit te voeren." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Het apparaat is al gekoppeld." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Het apparaat is niet ge-mount." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "Het is niet toegestaan de gevraagde optie te gebruiken." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Het apparaat is door een andere gebruiker aangekoppeld." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" "Weinig ruimte op de systeempartitie: {percent_used} % gebruikt, {free_space} " "vrij." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Weinig schijfruimte" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Schijffout dreigt" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -6938,20 +6959,18 @@ msgstr "" "Schijf {id} meldt dat het waarschijnlijk in de nabije toekomst defect zal " "zijn. Kopieer alle gegevens terwijl het nog kan en vervang de schijf." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 -#, fuzzy -#| msgid "Filesystem" +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" -msgstr "Bestandssysteem" +msgstr "Alleen-lezen bestandssysteem" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Go to Networks" msgid "Go to Power" @@ -7066,9 +7085,10 @@ msgstr "{drive_vendor} {drive_model} kan veilig worden losgekoppeld." msgid "Device can be safely unplugged." msgstr "Het apparaat kan veilig worden losgekoppeld." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Fout bij verwijderen van apparaat: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7114,7 +7134,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Bestandssynchronisatie" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7289,7 +7309,7 @@ msgstr "Configuratie bijwerken" msgid "Error configuring app: {error}" msgstr "Fout bij het configureren van de toepassing: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7303,20 +7323,20 @@ msgstr "" "krijgen tot internet. ISP-censuur kan worden omzeild door upstream bridges " "te gebruiken." -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "Tor Proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Tor Socks Proxy" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Gebruik URL {url} op tcp{kind} via Tor" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Bevestig Tor gebruik met {url} via tcp{kind}" @@ -7475,21 +7495,21 @@ msgstr "" "het systeem opnieuw moet worden opgestart, gebeurt dit automatisch om 02:00 " "uur, waardoor alle toepassingen even niet beschikbaar zijn." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Software bijwerken" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox geaktualiseerd" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "Kan distributie-update niet starten" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7499,11 +7519,11 @@ msgstr "" "te starten. Zorg ervoor dat ten minste 5 GB ruimte vrij is. Als " "ingeschakeld, wordt de distributie-update na 24 uur opnieuw geprobeerd." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "Distributie-update gestart" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "Update naar volgende stabiele release gestart. Dit kan lang duren." @@ -7680,44 +7700,29 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Test de distributie-upgrade nu" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "Fout bij het instellen van automatische upgrades: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Automatisch bijwerken ingeschakeld" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Automatisch bijwerken uitgeschakeld" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "Distributie bijwerken ingeschakeld" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Distributie bijwerken uitgeschakeld" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Upgrade-proces gestart." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Starten van de upgrade is mislukt." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Tussentijdse Software Updates zijn ingeschakeld." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "Start de distributie upgrade test." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7728,7 +7733,7 @@ msgstr "" "apps moet een gebruikersaccount deel uitmaken van een groep om de gebruiker " "toegang te geven tot de toepassing." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7740,25 +7745,25 @@ msgstr "" "die lid zijn van de admin -groep mogen toepassings- of " "systeeminstellingen wijzigen." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Gebruikers en Groepen" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Toegang tot alle diensten en systeeminstellingen" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Zoek LDAP item \"{search_item}\"" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "Controleer nslcd configuratie \"{key} {value}\"" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "Controleer nsswitch config \"{database}\"" @@ -7767,32 +7772,12 @@ msgstr "Controleer nsswitch config \"{database}\"" msgid "Username is taken or is reserved." msgstr "Gebruikersnaam is in gebruik of is gereserveerd." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Voer een geldige gebruikersnaam in." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." -msgstr "Vereist. 150 tekens of minder. Alleen letters, cijfers en @/./-/_ ." - -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Authorisatie-wachtwoord" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Voer het wachtwoord voor gebruiker \"{user}\" in om accountwijzigingen toe " -"te staan." -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Ongeldig wachtwoord." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7807,21 +7792,46 @@ msgstr "" "ook op het systeem inloggen met SSH en kunnen systeemadministratie doen " "(sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Voer een geldige gebruikersnaam in." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "Vereist. 150 tekens of minder. Alleen letters, cijfers en @/./-/_ ." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Authorisatie-wachtwoord" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" +"Voer het wachtwoord voor gebruiker \"{user}\" in om accountwijzigingen toe " +"te staan." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Ongeldig wachtwoord." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "LDAP gebruiker aanmaken mislukt: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Toevoegen van gebruiker aan groep {group} mislukt: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Geautoriseerde SSH-sleutels" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7832,36 +7842,36 @@ msgstr "" "meerdere sleutels toevoegen, één op elke regel. Lege regels en regels die " "beginnen met # worden genegeerd." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "LDAP gebruiker hernoemen mislukt." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Gebruiker uit groep verwijderen mislukt." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Gebruiker aan groep toevoegen mislukt." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "Kan de SSH-sleutels niet instellen." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Gebruikerstatus aanpassen mislukt." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Wijzigen LDAP gebruikerswachtwoord mislukt." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Toevoegen van gebruiker aan admin groep mislukt: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Gebruikersaccount aangemaakt, je bent nu ingelogd" @@ -8405,7 +8415,7 @@ msgstr "" "WordPress-site of blog bekijken. Alleen inschakelen na het uitvoeren van de " "eerste WordPress-configuratie." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8427,7 +8437,7 @@ msgstr "" "van zoekwoorden, kaart- en kalenderweergaven. Individuele foto's kunnen met " "anderen worden gedeeld door een directe link te sturen." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8438,11 +8448,11 @@ msgstr "" "Zoph. Voor extra gebruikers moeten zowel in {box_name} als in Zoph accounts " "worden aangemaakt met dezelfde gebruikersnaam." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Foto Organisator" @@ -8496,93 +8506,77 @@ msgstr "Wachten om te starten: {name}" msgid "Finished: {name}" msgstr "Klaar: {name}" -#: package.py:214 -#, fuzzy, python-brace-format -#| msgid "Package {expression} is not available for install" +#: package.py:206 +#, python-brace-format msgid "Package {package_expression} is not available for install" -msgstr "Pakket {expression} is niet beschikbaar voor installatie" +msgstr "Pakket {package_expression} is niet beschikbaar voor installatie" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Pakket {package_name} is de nieuwste versie ({latest_version})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "installeren" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "downloaden" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "media wijzigen" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "configuratiebestand: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "Time-out wachtend op pakketbeheerder" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "Toepassing installeren" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "Toepassing updaten" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "Fout bij het installeren van de toepassing: {string} {details}" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "Fout bij het bijwerken van de toepassing: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "Fout bij het installeren van de toepassing: {error}" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "Fout bij het bijwerken van de toepassing: {error}" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "De toepassing is geïnstalleerd." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "Toepassing bijgewerkt" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "Toepassing wordt verwijderd" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "Fout bij het verwijderen van de toepassing: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "Fout bij het verwijderen van de toepassing: {error}" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "De toepassing is verwijderd." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "Toepassings-pakketten bijwerken" @@ -8676,10 +8670,6 @@ msgstr "Toepassingen" msgid " System" msgstr " Systeem" -#: templates/base.html:131 -msgid "System" -msgstr "Systeem" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Wijzig wachtwoord" @@ -8976,11 +8966,11 @@ msgstr "" "Alle toepassings-gegevens en configuratie gaan permanent verloren. de " "toepassing kan opnieuw vers worden geïnstalleerd." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Instelling onveranderd" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "voor het verwijderen van {app_id}" @@ -8989,6 +8979,37 @@ msgstr "voor het verwijderen van {app_id}" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Opslag van Snapshots configuratie is bijgewerkt" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Actiefout: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Automatisch bijwerken ingeschakeld" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Automatisch bijwerken uitgeschakeld" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Distributie bijwerken ingeschakeld" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Distributie bijwerken uitgeschakeld" + +#, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Fout bij het installeren van de toepassing: {string} {details}" + +#, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Fout bij het bijwerken van de toepassing: {string} {details}" + +#, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Fout bij het verwijderen van de toepassing: {string} {details}" + #~ msgid "Page source" #~ msgstr "Paginabron" diff --git a/plinth/locale/pl/LC_MESSAGES/django.po b/plinth/locale/pl/LC_MESSAGES/django.po index b0301b334..449b81637 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Polish Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3878,19 +3902,19 @@ msgstr "" msgid "Services" msgstr "Urządzenie" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -4371,11 +4395,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5036,7 +5055,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -5259,17 +5278,17 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 #, fuzzy #| msgid "Privoxy" msgid "Privacy" msgstr "Privoxy" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5288,14 +5307,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5306,15 +5325,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -6183,7 +6202,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 #, fuzzy #| msgid "Delete %(name)s" msgid "Delete Snapshots" @@ -6257,37 +6276,38 @@ msgstr "Usuń %(name)s" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 +#: modules/snapshot/views.py:160 #, fuzzy -#| msgid "Access rights configuration updated" -msgid "Storage snapshots configuration updated" -msgstr "Zaktualizowano ustawienia praw dostępu" +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Zaktualizowano ustawienia." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 #, fuzzy #| msgid "Delete %(name)s" msgid "Deleted selected snapshots" msgstr "Usuń %(name)s" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Delete %(name)s" +msgid "Deleting snapshot failed." +msgstr "Usuń %(name)s" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -6303,7 +6323,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -6381,123 +6401,123 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} bajtów" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 #, fuzzy #| msgid "The requested domain is already registered." msgid "The device is already mounted." msgstr "Wnioskowana domena jest już zarejstrowana." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Power" msgid "Go to Power" @@ -6614,9 +6634,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6651,7 +6670,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6802,7 +6821,7 @@ msgstr "Podczas konfiguracji wystąpił błąd." msgid "Error configuring app: {error}" msgstr "Błąd podczas instalowania aplikacji: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6811,22 +6830,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "I2P Proxy" msgid "Tor Proxy" msgstr "I2P Proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6965,7 +6984,7 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 #, fuzzy @@ -6973,30 +6992,30 @@ msgstr "" msgid "Software Update" msgstr "Archiwum zostało usunięte." -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 #, fuzzy #| msgid "FreedomBox Foundation" msgid "FreedomBox Updated" msgstr "Fundacja FreedomBox" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 #, fuzzy #| msgid "User registrations disabled" msgid "Distribution update started" msgstr "Rejestracja użytkowników wyłączona" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7159,55 +7178,36 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Rejestracja użytkowników wyłączona" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -#, fuzzy -#| msgid "User registrations disabled" -msgid "Distribution upgrade disabled" -msgstr "Rejestracja użytkowników wyłączona" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 #, fuzzy #| msgid "User registrations disabled" msgid "Starting distribution upgrade test." msgstr "Rejestracja użytkowników wyłączona" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7215,25 +7215,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7242,36 +7242,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -#, fuzzy -#| msgid "Invalid server name" -msgid "Enter a valid username." -msgstr "Niewłaściwa nazwa użytkownika" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -#, fuzzy -#| msgid "Administrator Account" -msgid "Authorization Password" -msgstr "Konto Administratora" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -#, fuzzy -#| msgid "Show password" -msgid "Invalid password." -msgstr "Pokaż hasło" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7280,59 +7256,88 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +#, fuzzy +#| msgid "Invalid server name" +msgid "Enter a valid username." +msgstr "Niewłaściwa nazwa użytkownika" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +#, fuzzy +#| msgid "Administrator Account" +msgid "Authorization Password" +msgstr "Konto Administratora" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +#, fuzzy +#| msgid "Show password" +msgid "Invalid password." +msgstr "Pokaż hasło" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Tworzenie użytkownika LDAP nie udało się: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Nieudane dodanie użytkownika do {group} grupy:{error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 #, fuzzy #| msgid "Failed to add new user to admin group." msgid "Failed to change user status." msgstr "Nieudane dodawanie użytkownika do grupy admin." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Nieudane dodawanie użytkownika do grupy admin: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Utworzono konto użytkownika, możesz się teraz zalogować" @@ -7869,7 +7874,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7882,7 +7887,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7890,11 +7895,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7946,108 +7951,90 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "plik konfiguracyjny: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install Apps" msgid "Installing app" msgstr "Instaluj aplikacje" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Błąd podczas instalowania aplikacji: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Błąd podczas instalowania aplikacji: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Błąd podczas instalowania aplikacji: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Błąd podczas instalowania aplikacji: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Aplikacja zainstalowania." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "Ostatnie uaktualnienie" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install Apps" msgid "Uninstalling app" msgstr "Instaluj aplikacje" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Błąd podczas instalowania aplikacji: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Błąd podczas instalowania aplikacji: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Aplikacja zainstalowania." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -8145,10 +8132,6 @@ msgstr "Aplikacje" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Zmień hasło" @@ -8457,11 +8440,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Ustawienie bez zmian" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -8470,6 +8453,31 @@ msgstr "" msgid "Gujarati" msgstr "Gujarati" +#, fuzzy +#~| msgid "Access rights configuration updated" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Zaktualizowano ustawienia praw dostępu" + +#, fuzzy +#~| msgid "User registrations disabled" +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Rejestracja użytkowników wyłączona" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Błąd podczas instalowania aplikacji: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Błąd podczas instalowania aplikacji: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Błąd podczas instalowania aplikacji: {string} {details}" + #~ msgid "Page source" #~ msgstr "Źródło strony" diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index 2812035ee..9664704cc 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2023-05-22 15:50+0000\n" "Last-Translator: Frederico Gomes \n" "Language-Team: Portuguese Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3768,19 +3792,19 @@ msgstr "" msgid "Services" msgstr "Descoberta do Serviço" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Redes" @@ -4267,11 +4291,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Esta ligação não está ativa." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Segurança" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4938,7 +4957,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -5160,15 +5179,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5187,14 +5206,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5205,15 +5224,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Acesse {url} com proxy {proxy} em tcp{kind}" @@ -6057,7 +6076,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -6127,35 +6146,34 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 +#: modules/snapshot/views.py:160 #, fuzzy -#| msgid "Configuration updated" -msgid "Storage snapshots configuration updated" -msgstr "Configuração atualizada" +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Configuração atualizada." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -6171,7 +6189,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -6245,123 +6263,123 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "O dispositivo já está a ser desmontado." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "Esta operação pode ligar um disco que esteja no estado de adormecido." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 #, fuzzy #| msgid "Root Filesystem" msgid "Read-only root filesystem" msgstr "Sistema de Ficheiros Raiz" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6469,9 +6487,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6506,7 +6523,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6657,7 +6674,7 @@ msgstr "Configuração Geral" msgid "Error configuring app: {error}" msgstr "Erro a instalar a aplicação: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6666,22 +6683,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "I2P Proxy" msgid "Tor Proxy" msgstr "I2P Proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6810,36 +6827,36 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Atualização de software" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 #, fuzzy #| msgid "FreedomBox" msgid "FreedomBox Updated" msgstr "Freedombox" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 #, fuzzy #| msgid "Applications" msgid "Distribution update started" msgstr "Aplicações" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6998,53 +7015,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Aplicações" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -#, fuzzy -#| msgid "Applications" -msgid "Distribution upgrade disabled" -msgstr "Aplicações" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "A iniciar teste de atualização de distribuição." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7052,25 +7050,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7079,30 +7077,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Insira um nome de utilizador válido." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Palavra-passe inválida." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7111,57 +7091,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Insira um nome de utilizador válido." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Palavra-passe inválida." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Conta de utilizador criada, a sua sessão já foi iniciada" @@ -7669,7 +7672,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7682,7 +7685,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7690,11 +7693,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7743,110 +7746,92 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 #, fuzzy #| msgid "Setting unchanged" msgid "media change" msgstr "Definição inalterada" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "ficheiro de configuração: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install" msgid "Installing app" msgstr "Instalar" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Erro a instalar a aplicação: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Erro a instalar a aplicação: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Erro a instalar a aplicação: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Erro a instalar a aplicação: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Aplicação instalada." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Name" msgid "App updated" msgstr "Nome" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install" msgid "Uninstalling app" msgstr "Instalar" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Erro a instalar a aplicação: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Erro a instalar a aplicação: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Aplicação instalada." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7928,10 +7913,6 @@ msgstr "Aplicações" msgid " System" msgstr " Sistema" -#: templates/base.html:131 -msgid "System" -msgstr "Sistema" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Alterar palavra-passe" @@ -8218,11 +8199,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Definição inalterada" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -8231,6 +8212,31 @@ msgstr "" msgid "Gujarati" msgstr "Gujarati" +#, fuzzy +#~| msgid "Configuration updated" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Configuração atualizada" + +#, fuzzy +#~| msgid "Applications" +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Aplicações" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Erro a instalar a aplicação: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Erro a instalar a aplicação: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Erro a instalar a aplicação: {string} {details}" + #~ msgid "Page source" #~ msgstr "Fonte da página" diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index 30191b0ba..48524c361 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-10-10 18:05+0000\n" "Last-Translator: Nikita Epifanov \n" "Language-Team: Russian Let's Encrypt, " "чтобы получить его." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -4041,7 +4070,7 @@ msgstr "Sеcure Shell" msgid "Services" msgstr "Службы" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4049,7 +4078,7 @@ msgstr "" "Настроить сетевые устройства. Подключайтесь к Интернету через Ethernet, Wi-" "Fi или PPPoE. Поделитесь этим подключением с другими устройствами в сети." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4057,7 +4086,7 @@ msgstr "" "Устройства, администрируемые другими методами, могут быть недоступны для " "настройки здесь." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Сети" @@ -4625,11 +4654,6 @@ msgstr "IРv6" msgid "This connection is not active." msgstr "Это подключение не активно." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Безопасность" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5351,7 +5375,7 @@ msgstr "PаgeKite" msgid "Public Visibility" msgstr "Публичная видимость" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "PageKite Домен" @@ -5592,17 +5616,17 @@ msgstr "Завершить работу сейчас" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 #, fuzzy #| msgid "Privoxy" msgid "Privacy" msgstr "Privoxy" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5621,7 +5645,7 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5632,7 +5656,7 @@ msgstr "" "HTTP, контроля доступа и удаления рекламы и прочего неприятного мусора в " "интернете. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, fuzzy, python-brace-format #| msgid "" #| "You can use Privoxy by modifying your browser proxy settings to your " @@ -5654,15 +5678,15 @@ msgstr "" "config.privoxy.org\">http://config.privoxy.org или http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Web-прокси" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Доступ к {url} с прокси {proxy} на tcp{kind}" @@ -6648,7 +6672,7 @@ msgstr "Дата" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Удалить снапшот" @@ -6720,33 +6744,36 @@ msgstr "Управление снапшотами" msgid "Created snapshot." msgstr "Создан снимок." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Настройки хранения снапшотов обновлены" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Конфигурация обновлена." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Ошибка действий: {0}[{1}][{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Удалить выбранные снапшоты" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Сбой при удалении LDAP пользователя." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "Снимок сейчас используется. Попробуйте позже." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "Откат к снимку #{number}." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "Необходимо перезагрузить систему для завершения отката." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Откат к снимку" @@ -6766,7 +6793,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Secure Shell (SSH) сервер" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 #, fuzzy #| msgid "Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)" @@ -6848,106 +6875,106 @@ msgstr "" "{box_name}. Вы можете видеть, какие носители используются, монтировать и " "размонтировать подключаемые носители, увеличивать корневой раздел итп." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Хранилище" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} байт" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} КиБ" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} Миб" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} Гиб" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} Тиб" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "Операция не удалась." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "Операция была отменена." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Устройство уже отключается." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" "Операция не поддерживается из-за отсутствия поддержки драйвера или утилиты." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "Время операции вышло." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "Операция пробудит диск, находящийся в режиме глубокого сна." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Попытка отключения устройства, которое используется." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "Операция уже отменена." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "Отсутствует авторизация для выполнения запрошенной операции." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Устройство уже подключено." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Устройство не подключено." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "Использование запрошенной опции не разрешено." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Устройство подключено другим пользователем." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" "Недостаточно места в системном разделе: использовано {percent_used}%, " "свободно {free_space}." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Недостаточно места на диске" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Неизбежный сбой диска" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -6956,20 +6983,20 @@ msgstr "" "Диск {id} сообщает, что в ближайшем будущем он может выйти из строя. " "Скопируйте любые данные, пока еще можете, и замените диск." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 #, fuzzy #| msgid "Root Filesystem" msgid "Read-only root filesystem" msgstr "Корневая файловая система" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Go to Networks" msgid "Go to Power" @@ -7086,9 +7113,10 @@ msgstr "{drive_vendor}{drive_model} может быть безопасно от msgid "Device can be safely unplugged." msgstr "Устройство может быть безопасно отсоединено." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Ошибка извлечения устройства: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7134,7 +7162,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Синхронизация файлов" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7310,7 +7338,7 @@ msgstr "Произошла ошибка во время настройки." msgid "Error configuring app: {error}" msgstr "Ошибка при установке приложения: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7319,22 +7347,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "Tor Socks Proxy" msgid "Tor Proxy" msgstr "Tor Socks прокси" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Tor Socks прокси" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Доступ к {url} по tcp{kind} через Tor" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Подтверждение использования Tor в {url} по tcp {kind}" @@ -7498,21 +7526,21 @@ msgstr "" "выполняется автоматически в 02:00, в результате чего все приложения на " "короткое время становятся недоступными." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Обновление программного обеспечения" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox обновлён" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "Не удалось запустить обновление дистрибутива" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7522,11 +7550,11 @@ msgstr "" "дистрибутива. Пожалуйста, убедитесь, что свободно не менее 5 ГБ. Обновление " "дистрибутива будет повторно запущено через 24 часа, если это включено." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "Началось обновление дистрибутива" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7704,46 +7732,31 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Обновление дистрибутива включено" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "Ошибка при настройке автоматического обновления: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Автоматические обновления включены" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Автоматические обновления отключены" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "Обновление дистрибутива включено" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Обновление дистрибутива отключено" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Начался процесс обновления." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Не удалось запустить обновление." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Активированы частые обновления функций." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 #, fuzzy #| msgid "Distribution upgrade enabled" msgid "Starting distribution upgrade test." msgstr "Обновление дистрибутива включено" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7755,7 +7768,7 @@ msgstr "" "запись пользователя была частью группы, чтобы разрешить пользователю доступ " "к приложению." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7767,25 +7780,25 @@ msgstr "" "пользователи группы admin могут изменять приложения или системные " "настройки." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Пользователи и группы" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Доступ ко всем сервисам и настройкам системы" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Проверьте запись LDAP \"{search_item}\"" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7794,33 +7807,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "Имя пользователя уже занято." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Введите действительное имя пользователя." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Требуется. 150 символов или меньше. Только английские буквы, цифры и @/./-/_." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Пароль авторизации" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" -"Введите пароль пользователя \"{user}\" для авторизации изменений учетной " -"записи." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Неправильный пароль." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7834,21 +7826,47 @@ msgstr "" "\"admin\" смогут войти во все службы. Они также могут входить в систему " "через SSH и иметь привилегии администратора (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Введите действительное имя пользователя." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"Требуется. 150 символов или меньше. Только английские буквы, цифры и @/./-/_." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Пароль авторизации" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" +"Введите пароль пользователя \"{user}\" для авторизации изменений учетной " +"записи." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Неправильный пароль." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Не удалось создать пользователя LDAP: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Не удалось добавить нового пользователя в группу {group}: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Авторизованные SSH ключи" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7859,37 +7877,37 @@ msgstr "" "на каждой строке. Пустые строки и строки, начинающиеся с # будут " "игнорироваться." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Переименование пользователя LDAP не удалось." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Не удалось удалить пользователя из группы." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Не удалось добавить пользователя в группу." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "Не удалось задать ключи SSH." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Не удалось изменить статус пользователя." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Изменение LDAP пароля пользователя не удалось." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" "Не удалось добавить нового пользователя в группу администраторов: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Учетная запись пользователя создана, теперь вы вошли" @@ -8435,7 +8453,7 @@ msgstr "" "просматривать сайт или блог WordPress. Включайте только после первоначальной " "настройки WordPress." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8458,7 +8476,7 @@ msgstr "" "месте. Отдельными фотографиями можно поделиться с другими, отправив прямую " "ссылку." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8469,11 +8487,11 @@ msgstr "" "Zoph. Для дополнительных пользователей необходимо создать учетные записи как " "в {box_name}, так и в Zoph с тем же именем пользователя." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Организатор фотографий" @@ -8528,111 +8546,93 @@ msgstr "" msgid "Finished: {name}" msgstr "Служба выключена: {name}" -#: package.py:214 +#: package.py:206 #, fuzzy, python-brace-format #| msgid "Package {expression} is not available for install" msgid "Package {package_expression} is not available for install" msgstr "Пакет {expression} недоступен для установки" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Пакет {package_name} последней версией ({latest_version})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "Установка" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "Загрузка" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "изменение медиа" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "Файл настроек: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install Apps" msgid "Installing app" msgstr "Установка приложений" -#: setup.py:43 +#: setup.py:41 #, fuzzy #| msgid "Updating..." msgid "Updating app" msgstr "Обновляется..." -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Ошибка при установке пакетов: {string}{details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Ошибка при установке пакетов: {string}{details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Ошибка при установке приложения: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Ошибка при установке приложения: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Приложение установлено." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "Последнее обновление" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install Apps" msgid "Uninstalling app" msgstr "Установка приложений" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Ошибка при установке пакетов: {string}{details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Ошибка при установке приложения: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Приложение установлено." -#: setup.py:453 +#: setup.py:493 #, fuzzy #| msgid "Upgrade Packages" msgid "Updating app packages" @@ -8726,10 +8726,6 @@ msgstr "Приложения" msgid " System" msgstr " Система" -#: templates/base.html:131 -msgid "System" -msgstr "Система" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Изменить пароль" @@ -9032,11 +9028,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Настройки без изменений" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -9045,6 +9041,40 @@ msgstr "" msgid "Gujarati" msgstr "Гуджарати" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Настройки хранения снапшотов обновлены" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Ошибка действий: {0}[{1}][{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Автоматические обновления включены" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Автоматические обновления отключены" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Обновление дистрибутива включено" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Обновление дистрибутива отключено" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Ошибка при установке пакетов: {string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Ошибка при установке пакетов: {string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Ошибка при установке пакетов: {string}{details}" + #~ msgid "Page source" #~ msgstr "Исходный код страницы" diff --git a/plinth/locale/si/LC_MESSAGES/django.po b/plinth/locale/si/LC_MESSAGES/django.po index ce9f8d5ad..a8ca55cfa 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2021-04-27 13:32+0000\n" "Last-Translator: HelaBasa \n" "Language-Team: Sinhala Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3499,19 +3521,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -3990,11 +4012,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4631,7 +4648,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4847,15 +4864,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4874,14 +4891,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4892,15 +4909,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5726,7 +5743,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5794,33 +5811,32 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" +#: modules/snapshot/views.py:160 +msgid "Configuration update failed." msgstr "" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5836,7 +5852,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5908,121 +5924,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6127,9 +6143,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6164,7 +6179,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6306,7 +6321,7 @@ msgstr "" msgid "Error configuring app: {error}" msgstr "" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6315,20 +6330,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6457,32 +6472,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6629,51 +6644,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6681,25 +6679,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6708,30 +6706,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6740,57 +6720,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7272,7 +7275,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7285,7 +7288,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7293,11 +7296,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7346,92 +7349,77 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "" -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "" -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7513,10 +7501,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7784,11 +7768,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, 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 0dceb7a79..59bb58977 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Slovenian Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3722,19 +3746,19 @@ msgstr "" msgid "Services" msgstr "Odkrivanje storitev" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -4213,11 +4237,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4868,7 +4887,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -5084,15 +5103,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5111,14 +5130,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5129,15 +5148,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5980,7 +5999,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -6050,33 +6069,34 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration update failed." +msgstr "Konfiguracija je posodobljena" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -6092,7 +6112,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -6166,121 +6186,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6387,9 +6407,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6424,7 +6443,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6569,7 +6588,7 @@ msgstr "Konfiguracija je posodobljena" msgid "Error configuring app: {error}" msgstr "Napaka ob nameščanju aplikacije: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6578,22 +6597,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "I2P Proxy" msgid "Tor Proxy" msgstr "I2P Proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6740,7 +6759,7 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 #, fuzzy @@ -6748,28 +6767,28 @@ msgstr "" msgid "Software Update" msgstr "Arhiv je izbrisan." -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 #, fuzzy #| msgid "FreedomBox" msgid "FreedomBox Updated" msgstr "FreedomBox" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6918,51 +6937,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6970,25 +6972,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6997,34 +6999,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -#, fuzzy -#| msgid "Invalid hostname" -msgid "Enter a valid username." -msgstr "Neveljavno ime gostitelja" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -#, fuzzy -#| msgid "Invalid hostname" -msgid "Invalid password." -msgstr "Neveljavno ime gostitelja" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7033,57 +7013,84 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +#, fuzzy +#| msgid "Invalid hostname" +msgid "Enter a valid username." +msgstr "Neveljavno ime gostitelja" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +#, fuzzy +#| msgid "Invalid hostname" +msgid "Invalid password." +msgstr "Neveljavno ime gostitelja" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7597,7 +7604,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7610,7 +7617,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7618,11 +7625,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7672,106 +7679,88 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Napaka ob nameščanju aplikacije: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Napaka ob nameščanju aplikacije: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Napaka ob nameščanju aplikacije: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Napaka ob nameščanju aplikacije: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Aplikacija je nameščena." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Name" msgid "App updated" msgstr "Ime" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Error installing application: {error}" msgid "Uninstalling app" msgstr "Napaka ob nameščanju aplikacije: {error}" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Napaka ob nameščanju aplikacije: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Napaka ob nameščanju aplikacije: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Aplikacija je nameščena." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7853,10 +7842,6 @@ msgstr "Aplikacije" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -8131,11 +8116,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -8144,6 +8129,21 @@ msgstr "" msgid "Gujarati" msgstr "" +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Napaka ob nameščanju aplikacije: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Napaka ob nameščanju aplikacije: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Napaka ob nameščanju aplikacije: {string} {details}" + #~ msgid "ChatSecure" #~ msgstr "ChatSecure" diff --git a/plinth/locale/sq/LC_MESSAGES/django.po b/plinth/locale/sq/LC_MESSAGES/django.po index f852ab91c..48dc7f798 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2024-02-13 01:32+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian Let's Encrypt, që " "të merrni një të tillë." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" "Formësimi i regjistrimeve s’mund të përditësohet kur aplikacioni është i " @@ -4038,7 +4067,7 @@ msgstr "Shell i Sigurt" msgid "Services" msgstr "Shërbime" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4046,7 +4075,7 @@ msgstr "" "Formësoni pajisje rrjeti. Lidhuni në Internet përmes Ethernet-i, Wi-Fi ose " "PPPoE. Ndajeni atë lidhje me pajisje të tjera në rrjet." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4054,7 +4083,7 @@ msgstr "" "Pajisjet e administruara përmes metodash të tjera mund të mos jenë të " "pranishme për formësim këtu." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Rrjete" @@ -4622,11 +4651,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Kjo lidhje s’është aktive." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Siguri" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5342,7 +5366,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "E dukshme Publikisht" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "Përkatësi PageKite" @@ -5586,17 +5610,17 @@ msgstr "Fike Tani" msgid "Manage system-wide privacy settings." msgstr "Administroni rregullime privatësie për krejt sistemin." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "Privatësi" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" "Ju lutemi, përditësoni rregullime privatësie që të përputhen me parapëlqimet " "tuaja." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "Shqyrtoni rregullim privatësie" @@ -5624,7 +5648,7 @@ msgstr "" "debian.org. Parashtrimi bëhet përmes rrjetit Tor, për anonimitet shtesë, " "nëse është i aktivizuar aplikacioni Tor." -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5635,7 +5659,7 @@ msgstr "" "faqesh web dhe kryesh HTTP, kontrollim hyrjesh, dhe heqje reklamash dhe të " "tjera hedhurina të papëlqyeshme Internet. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5652,15 +5676,15 @@ msgstr "" "te http://config.privoxy.org/ ose " "http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Ndërmjetës Web" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Hapni {url} me ndërmjetësin {proxy} në tcp{kind}" @@ -6650,7 +6674,7 @@ msgstr "Datë" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Fshi Fotografime" @@ -6724,34 +6748,37 @@ msgstr "Administroni Fotografime" msgid "Created snapshot." msgstr "U krijua fotografim." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "U përditësua formësim për depozitim fotografimesh" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Formësimi u përditësua." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Gabim veprimi: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "U fshinë fotografimet e përzgjedhur" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Fshirja e përdoruesi LDAP dështoi." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" "Fotografimi është aktualisht në përdorim. Ju lutemi, riprovoni më vonë." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "U kthye prapa te fotografimi #{number}." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "Që të plotësohet prapakthimi, duhet rinisur sistemi." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Prapaktheje te Fotografim" @@ -6771,7 +6798,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Shërbyes Shelli të Sigurt (SSH)" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "Hyrje së largëti duke përdorur Shell të Sigurt (SSH)" @@ -6855,106 +6882,106 @@ msgstr "" "përdorim, të montoni dhe çmontoni media të heqshme, të zgjeroni pjesën " "rrënjë, etj." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Depozitë" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} bajte" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "Veprimi dështoi." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "Veprimi u anulua." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Pajisja po çmontohet tashmë." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" "Veprimi nuk mbulohet, për shkak se mungon mbulimi për përudhësin/mjetin." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "Veprimit i mbaroi koha." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "Veprimi do të zgjonte një disk që është në gjendjen “deep-sleep”." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Po përpiqet të çmontohet një pajisje që është e zënë." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "Veprimi është anuluar tashmë." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "I paautorizuar për kryerjen e veprimit të kërkuar." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Pajisja është e çmontuar tashmë." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Pajisja s’është e montuar." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "S’i lejohet të përdorë mundësinë e kërkuar." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Pajisja është montuar nga tjetër përdorues." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" "Hapësirë e ulët në pjesë sistemi: {percent_used}% të përdorura, {free_space} " "të lira." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Hapësirë disku e pamjaftueshme" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Shumë afër dështimi disku" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -6963,7 +6990,7 @@ msgstr "" "Disku {id} po raporton se ka gjasa të dështojë tani afër. Kopjoni çfarëdo të " "dhënash që mundeni ende dhe zëvendësoni diskun." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " @@ -6972,11 +6999,11 @@ msgstr "" "S’mund të ruani ndryshime formësimi. Provoni të rinisni sistemin. Nëse " "problemi vazhdon pas rinisjes, shihni pajisjen e depozitimit për gabimin." -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "Sistem kartelash rrënjë vetëm-për-lexim" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -7089,9 +7116,10 @@ msgstr "{drive_vendor} {drive_model} mund të hiqet pa rrezik." msgid "Device can be safely unplugged." msgstr "Pajisja mund të hiqet pa rrezik." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Gabim në nxjerrje pajisjeje: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7137,7 +7165,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Njëkohësim Kartelash" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7311,7 +7339,7 @@ msgstr "Po përditësohet formësimi" msgid "Error configuring app: {error}" msgstr "Gabim në formësimin e aplikacionit: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7325,20 +7353,20 @@ msgstr "" "rrjetit Tor-in. Censurimi nga ISP-të mund të anashkalohen duke përdorur ura " "“upstream”." -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "Ndërmjetës Tor" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Ndërmjetës SOCKS Tor" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "URL hyrjesh {url} në tcp{kind} përmes Tor-i" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Ripohoni përdorim Tor-i te {url} në tcp{kind}" @@ -7500,21 +7528,21 @@ msgstr "" "rinisja e sistemit shihet si e domosdoshme, bëhet automatikisht më 02:00, " "duke bërë që krejt aplikacionet të jenë jashtë funksionimi për ca çaste." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Përditësim Software-i" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox-i u Përditësua" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "S’u fillua dot përditësim shpërndarjeje" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7525,11 +7553,11 @@ msgstr "" "Përditësimi i shpërndarjes do të riprovohet pas 24 orësh, nëse kjo është " "aktivizuar." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "Përditësimi i shpërndarjes filloi" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7708,45 +7736,30 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Testoni përmirësim shpërndarjeje tani" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "" "Gabim teksa formësohej <em>unattended-upgrades</em>: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "U aktivizuan përmirësime të automatizuara" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Përmirësimet e vetvetishme janë çaktivizuar" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "Me përmirësim shpërndarjeje të aktivizuar" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Me përmirësim shpërndarjeje të çaktivizuar" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Procesi i përmirësimit filloi." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Nisja e përmirësimi dështoi." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Përditësime të shpeshta veçorish të aktivizuara." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "Po fillohet provë përmirësimi shpërndarjeje." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7757,7 +7770,7 @@ msgstr "" "aplikacione kërkojnë doemos një llogari përdoruesi, për të qenë pjesë e një " "grupi që autorizon përdoruesin të përdorë aplikacionin." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7769,25 +7782,25 @@ msgstr "" "vetëm përdoruesit e grupit përgjegjës mund të ndryshojnë " "aplikacionet, apo rregullimet e sistemit." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Përdorues dhe Grupe" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Hyrje te krejt shërbimet dhe rregullime të sistemit" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Kontrolloni zërin LDAP \"{search_item}\"" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "Kontrolloni “{key} {value}” formësimi nslcd-je" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "Kontrolloni “{database}” formësimi nsswitch" @@ -7796,34 +7809,12 @@ msgstr "Kontrolloni “{database}” formësimi nsswitch" msgid "Username is taken or is reserved." msgstr "Emri i përdoruesit është i zënë, ose i rezervuar." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Jepni një emër përdoruesi të vlefshëm." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"E domosdoshme. 150 ose më pak shenja. Vetëm shkronja anglishteje, shifra, " -"dhe @/./-/_." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Fjalëkalim Autorizimi" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" -"Jepni fjalëkalimin për përdoruesin “{user}”, që të autorizoni ndryshime " -"llogarie." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Fjalëkalim i pavlefshëm." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7838,21 +7829,48 @@ msgstr "" "në krejt shërbimet. Munden edhe të hyjnë në sistem përmes SSH-së dhe të kenë " "privilegje administrative (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Jepni një emër përdoruesi të vlefshëm." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"E domosdoshme. 150 ose më pak shenja. Vetëm shkronja anglishteje, shifra, " +"dhe @/./-/_." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Fjalëkalim Autorizimi" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" +"Jepni fjalëkalimin për përdoruesin “{user}”, që të autorizoni ndryshime " +"llogarie." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Fjalëkalim i pavlefshëm." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "S’u arrit të krijohej përdorues LDAP: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "S’u arrit të shtohej përdorues i ri te grupi {group}: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Kyçe SSH të autorizuar" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7863,36 +7881,36 @@ msgstr "" "një për rresht. Rreshta të zbrazët dhe rreshta që fillojnë me # do të " "shpërfillen." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Riemërtimi i përdoruesit LDAP dështoi." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "S’u arrit të hiqej përdorues nga grupi." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "S’u arrit të shtohej përdorues te grup." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "S’arrihet të ujdisen kyçe SSH." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "S’u arrit të ndryshohej gjendje përdoruesi." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Ndryshimi i fjalëkalimit për përdorues LDAP dështoi." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "S’u arrit të shtohej përdorues i ri te grupi i përgjegjësve: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Llogaria e përdoruesit u krijua, tani jeni i futur në llogari" @@ -8436,7 +8454,7 @@ msgstr "" "sajtin ose blogun WordPress. Aktivizojeni vetëm pasi të jetë kryer ujdisja " "fillestare e WordPress-it." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8458,7 +8476,7 @@ msgstr "" "pamjet hartë dhe kalendar. Foto individuale mund të ndahen me të tjerë duke " "dërguar një lidhje të drejtpërdrejtë." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8469,11 +8487,11 @@ msgstr "" "Zoph. Për përdorues të tjerë, llogaritë mund të krijohen si në {box_name}, " "ashtu edhe në Zoph, me të njëjtin emër përdoruesi." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Sistemues Fotografish" @@ -8526,93 +8544,78 @@ msgstr "Po pritet të fillohet: {name}" msgid "Finished: {name}" msgstr "Përfundoi: {name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "Paketa {package_expression} s’është e gatshme për instalim" -#: package.py:231 +#: package.py:226 #, 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})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "po instalohet" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "po shkarkohet" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "ndryshim media" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "kartelë formësimi: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "Mbaroi koha teksa pritej për përgjegjës paketash" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "Po instalohet aplikacioni" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "Po përditësohet aplikacioni" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "Gabim në instalimin e aplikacionit: {string} {details}" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "Gabim në përditësimin e aplikacionit: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "Gabim në instalimin e aplikacionit: {error}" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "Gabim në përditësimin e aplikacionit: {error}" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "Aplikacioni u instalua." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "Aplikacioni u përditësua" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "Po çinstalohet aplikacion" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "Gabim në çinstalimin e aplikacionit: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "Gabim në çinstalimin e aplikacionit: {error}" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "Aplikacioni u çinstalua." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "Po përditësohet paketa aplikacioni" @@ -8705,10 +8708,6 @@ msgstr "Aplikacione" msgid " System" msgstr " Sistem" -#: templates/base.html:131 -msgid "System" -msgstr "Sistem" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Ndryshoni fjalëkalimin" @@ -9005,11 +9004,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." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Rregullim i pandryshuar" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "para çinstalimit të {app_id}" @@ -9018,6 +9017,37 @@ msgstr "para çinstalimit të {app_id}" msgid "Gujarati" msgstr "Gujaratase" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "U përditësua formësim për depozitim fotografimesh" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Gabim veprimi: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "U aktivizuan përmirësime të automatizuara" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Përmirësimet e vetvetishme janë çaktivizuar" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Me përmirësim shpërndarjeje të aktivizuar" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Me përmirësim shpërndarjeje të çaktivizuar" + +#, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Gabim në instalimin e aplikacionit: {string} {details}" + +#, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Gabim në përditësimin e aplikacionit: {string} {details}" + +#, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Gabim në çinstalimin e aplikacionit: {string} {details}" + #~ msgid "Page source" #~ msgstr "Burim faqeje" diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index 2c392ac99..e4a1fd39d 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Serbian Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3610,19 +3634,19 @@ msgstr "" msgid "Services" msgstr "Služi" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -4101,11 +4125,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4750,7 +4769,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4966,15 +4985,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4993,14 +5012,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5011,15 +5030,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5854,7 +5873,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5924,33 +5943,34 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration update failed." +msgstr "Konfiguracija sačuvana" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5966,7 +5986,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -6038,121 +6058,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6257,9 +6277,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6294,7 +6313,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6439,7 +6458,7 @@ msgstr "Konfiguracija sačuvana" msgid "Error configuring app: {error}" msgstr "Greška prilikom instaliranja aplikacije: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6448,22 +6467,22 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 #, fuzzy #| msgid "I2P Proxy" msgid "Tor Proxy" msgstr "I2P Proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6602,32 +6621,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6774,51 +6793,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6826,25 +6828,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6853,30 +6855,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6885,57 +6869,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7417,7 +7424,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7430,7 +7437,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7438,11 +7445,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7491,104 +7498,86 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Greška prilikom instaliranja aplikacije: {string}{details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Greška prilikom instaliranja aplikacije: {string}{details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Greška prilikom instaliranja aplikacije: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Greška prilikom instaliranja aplikacije: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Aplikacija instalirana." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Error installing application: {error}" msgid "Uninstalling app" msgstr "Greška prilikom instaliranja aplikacije: {error}" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Greška prilikom instaliranja aplikacije: {string}{details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Greška prilikom instaliranja aplikacije: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Aplikacija instalirana." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7670,10 +7659,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7947,11 +7932,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -7960,6 +7945,21 @@ msgstr "" msgid "Gujarati" msgstr "" +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Greška prilikom instaliranja aplikacije: {string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Greška prilikom instaliranja aplikacije: {string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Greška prilikom instaliranja aplikacije: {string}{details}" + #~ msgid "Page source" #~ msgstr "Izvorna stranica" diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index b69149d07..74978f802 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2024-02-02 20:01+0000\n" "Last-Translator: bittin1ddc447d824349b2 \n" "Language-Team: Swedish Let's Encrypt för " "att få en sådan." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" "Registreringskonfigurationen kan inte uppdateras när appen är inaktiverad." @@ -3996,7 +4025,7 @@ msgstr "Secure Shell" msgid "Services" msgstr "Tjänster" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4004,7 +4033,7 @@ msgstr "" "Konfigurera nätverksenheter. Anslut till Internet via Ethernet, Wi-Fi eller " "PPPoE. Dela den anslutningen med andra enheter i nätverket." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4012,7 +4041,7 @@ msgstr "" "Enheter som administreras via andra metoder kanske inte är tillgängliga för " "konfiguration här." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Nätverk" @@ -4578,11 +4607,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Den här anslutningen är inte aktiv." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Säkerhet" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5296,7 +5320,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Offentlig Synlighet" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "PageKite domän" @@ -5541,16 +5565,16 @@ msgstr "Stäng av nu" msgid "Manage system-wide privacy settings." msgstr "Hantera systemomfattande sekretessinställningar." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "Integritet" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" "Vänligen uppdatera sekretessinställningar för att matcha dina preferenser." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "Granska sekretessinställningen" @@ -5577,7 +5601,7 @@ msgstr "" "target=\"_blank\">popcon.debian.org. Inlämningen sker via Tor-nätverket " "för ytterligare anonymitet om Tor-appen är aktiverad." -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5587,7 +5611,7 @@ msgstr "" "för att förbättra sekretessen, ändra webbsidan data och HTTP-huvuden, " "kontrollera åtkomst och ta bort annonser och andra avskyvärda Internet Junk. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5603,15 +5627,15 @@ msgstr "" "href=\"http://config.privoxy.org\">http://config.privoxy.org/ eller http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Webbproxy" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Anslut till {url} med proxy {proxy} på TCP {kind}" @@ -6585,7 +6609,7 @@ msgstr "Datum" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Ta bort ögonblicksbilder" @@ -6659,33 +6683,36 @@ msgstr "Hantera ögonblicksbilder" msgid "Created snapshot." msgstr "Skapade ögonblicksbild." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Lagring ögonblicksbildkonfiguration uppdaterad" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Konfiguration uppdaterad." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Åtgärdsfel: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Borttagna markerade ögonblicksbilder" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Det gick inte att ta bort LDAP-användare." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "Ögonblicksbild används för närvarande. Vänligen försök igen senare." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "Återställs till Snapshot #{number}." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "Systemet måste startas om för att slutföra återställningen." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Återställning till ögonblicksbild" @@ -6705,7 +6732,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Secure Shell-Server (SSH)" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "Fjärrinloggning med Secure Shell (SSH)" @@ -6788,105 +6815,105 @@ msgstr "" "{box_name}. Du kan visa lagringsmedia som för närvarande används, montera " "och demontera flyttbara media, expandera rotpartitionen etc." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Lagring" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} byte" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} Kib" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} Mib" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} Gib" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} Tib" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "Åtgärden misslyckades." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "Operationen avbröts." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Enheten lossnar redan." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "Åtgärden stöds inte på grund av saknade drivrutiner/verktygsstöd." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "Åtgärden orsakade timeout." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "Åtgärden skulle väcka en disk som är i ett djupviloläge." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Försöker avmontera en enhet som är upptagen." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "Operationen har redan avbrutits." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "Inte behörig att utföra den begärda åtgärden." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Enheten är redan monterad." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Enheten är inte monterad." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "Inte tillåtet att använda det begärda alternativet." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Enheten monteras av en annan användare." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" "Lågt utrymme på systempartitionen: {percent_used}% används, {free_space} " "fritt." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Lågt diskutrymme" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Diskfel förestående" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -6895,7 +6922,7 @@ msgstr "" "Disk {id} rapporterar att den sannolikt kommer att misslyckas inom en snar " "framtid. Kopiera all data medan du fortfarande kan och byt ut enheten." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " @@ -6904,11 +6931,11 @@ msgstr "" "Du kan inte spara konfigurationsändringar. Testa att starta om systemet. Om " "problemet kvarstår efter en omstart, kontrollera lagringsenheten efter fel." -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "Läs-endast root filsystem" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "Gå till Ström" @@ -7021,9 +7048,10 @@ msgstr "{drive_vendor} {drive_model} kan kopplas ur på ett säkert sätt." msgid "Device can be safely unplugged." msgstr "Enheten kan kopplas ur på ett säkert sätt." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Fel mata ut enhet: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7069,7 +7097,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Filsynkronisering" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7241,7 +7269,7 @@ msgstr "Uppdatera konfigurationen" msgid "Error configuring app: {error}" msgstr "Fel vid konfigurering av appen: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7254,20 +7282,20 @@ msgstr "" "appar för att komma åt internet via Tor-nätverket. ISP-censur kan kringgås " "med hjälp av uppströms broar." -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "Tor Proxy" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Tor SOCKS-proxy" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Tillgång URL {url} på TCP {kind} via Tor" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Bekräfta Tor-användning vid {url} på TCP {kind}" @@ -7429,21 +7457,21 @@ msgstr "" "systemet bedöms vara nödvändigt, det sker automatiskt vid 02:00 orsakar alla " "apps för att vara tillgängligt en kort stund." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Mjukvaruuppdatering" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox uppdaterad" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "Det gick inte att starta distributionsuppdatering" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7454,11 +7482,11 @@ msgstr "" "Distributionsuppdateringen kommer att göras ett nytt behov efter 24 timmar, " "om det är aktiverat." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "Distributionsuppdateringen har startats" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7634,44 +7662,29 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Uppgradera testdistributionen nu" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "Fel vid konfigurering av obevakad uppgraderingar: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Automatiska uppgraderingar aktiverade" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Automatiska uppgraderingar inaktiverade" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "Distributionsuppgradering aktiverad" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Distributionsuppgradering inaktiverad" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Uppgraderingsprocessen påbörjades." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Det gick inte att starta uppgraderingen." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Frekventa funktionsuppdateringar aktiverade." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "Startar distributionsuppgraderingstest." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7682,7 +7695,7 @@ msgstr "" "ett användarkonto för att vara en del av en grupp för att auktorisera " "användaren att komma åt appen." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7693,25 +7706,25 @@ msgstr "" "över appar som är relevanta för dem på startsidan. Endast användare av " "gruppen admin kan dock ändra appar eller Systeminställningar." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Användare och grupper" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Tillgång till alla tjänster och systeminställningar" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Kontrollera LDAP-posten \"{search_item}\"" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "Kontrollera nslcd-konfigurationen \"{key}{value}\"" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "Kontrollera nsswitch-konfigurationen \"{database}\"" @@ -7720,34 +7733,12 @@ msgstr "Kontrollera nsswitch-konfigurationen \"{database}\"" msgid "Username is taken or is reserved." msgstr "Användarnamnet är upptaget eller är reserverade." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Ange ett giltigt användarnamn." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Krävs. 150 tecken eller färre. Engelska bokstäver, siffror och endast @/./-/" -"_ ." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Auktoriseringslösenord" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" -"Ange lösenordet för användaren \"{user}\" för att godkänna " -"kontomodifieringar." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Ogiltigt lösenord." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7761,21 +7752,48 @@ msgstr "" "administratörsgruppen kommer att kunna logga in på alla tjänster. De kan " "också logga in på systemet via SSH och har administratörsprivilegier (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Ange ett giltigt användarnamn." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"Krävs. 150 tecken eller färre. Engelska bokstäver, siffror och endast @/./-/" +"_ ." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Auktoriseringslösenord" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" +"Ange lösenordet för användaren \"{user}\" för att godkänna " +"kontomodifieringar." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Ogiltigt lösenord." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Det gick inte att skapa LDAP-användare: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Det gick inte att lägga till ny användare i gruppen {group} : {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Auktoriserade SSH-nycklar" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7785,37 +7803,37 @@ msgstr "" "systemet utan att använda ett lösenord. Du kan ange flera nycklar, en på " "varje rad. Tomma rader och rader som börjar med # kommer att ignoreras." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Det gick inte att byta namn på LDAP-användare." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Det gick inte att ta bort användare från gruppen." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Det gick inte att lägga till användare i gruppen." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "Det går inte att ange SSH-nycklar." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Det gick inte att ändra användarstatus." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Det gick inte att ändra användarlösenordet för LDAP." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" "Det gick inte att lägga till ny användare i administratörsgruppen: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Användarkonto skapat, du är nu inloggad" @@ -8356,7 +8374,7 @@ msgstr "" "WordPress-webbplatsen eller bloggen. Aktivera endast efter den första " "installationen av WordPress." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8377,7 +8395,7 @@ msgstr "" "på en plats med hjälp av sök-, kart- och kalendervyer. Enskilda foton kan " "delas med andra genom att skicka en direktlänk." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8388,11 +8406,11 @@ msgstr "" "i Zoph. För ytterligare användare måste konton skapas både i {box_name} och " "i Zoph med samma användarnamn." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Foto Organizer" @@ -8445,92 +8463,77 @@ msgstr "Väntar på att starta: {name}" msgid "Finished: {name}" msgstr "Avslutad: {name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "Paket {package_expression} är inte tillgänglig för installation" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Paketet {package_name} är den senaste versionen ({latest_version})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "Installera" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "ladda ner" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "Mediabyte" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurationsfil: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "Timeout väntar på pakethanteraren" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "Installera app" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "Uppdatera app" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "Fel vid installation av app: {string} {details}" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "Fel vid uppdatering av app: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "Fel vid installation av app: {error}" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "Fel vid uppdatering av app: {error}" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "App installerad." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "App uppdaterad" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "Avinstallera app" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "Fel vid avinstallation av app: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "Fel vid avinstallation av appen: {error}" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "Appen avinstallerad." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "Uppdatera appaket" @@ -8623,10 +8626,6 @@ msgstr "Appar" msgid " System" msgstr " System" -#: templates/base.html:131 -msgid "System" -msgstr "System" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Ändra lösenord" @@ -8925,11 +8924,11 @@ msgstr "" "All appdata och konfiguration kommer att gå förlorad permanent. Appen kan " "installeras på nytt igen." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Instänllningar oförändrade" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "innan du avinstallerar {app_id}" @@ -8938,6 +8937,37 @@ msgstr "innan du avinstallerar {app_id}" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Lagring ögonblicksbildkonfiguration uppdaterad" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Åtgärdsfel: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Automatiska uppgraderingar aktiverade" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Automatiska uppgraderingar inaktiverade" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Distributionsuppgradering aktiverad" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Distributionsuppgradering inaktiverad" + +#, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Fel vid installation av app: {string} {details}" + +#, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Fel vid uppdatering av app: {string} {details}" + +#, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Fel vid avinstallation av app: {string} {details}" + #~ msgid "Page source" #~ msgstr "Sidkälla" diff --git a/plinth/locale/ta/LC_MESSAGES/django.po b/plinth/locale/ta/LC_MESSAGES/django.po index 20127a019..a96b5cc08 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,31 +23,31 @@ msgstr "" msgid "Static configuration {etc_path} is setup properly" msgstr "" -#: context_processors.py:23 views.py:95 +#: context_processors.py:23 views.py:116 msgid "FreedomBox" msgstr "" -#: daemon.py:105 +#: daemon.py:122 #, python-brace-format msgid "Service {service_name} is running" msgstr "" -#: daemon.py:164 +#: daemon.py:218 #, python-brace-format msgid "Listening on {kind} port {listen_address}:{port}" msgstr "" -#: daemon.py:167 +#: daemon.py:221 #, python-brace-format msgid "Listening on {kind} port {port}" msgstr "" -#: daemon.py:236 +#: daemon.py:291 #, python-brace-format msgid "Connect to {host}:{port}" msgstr "" -#: daemon.py:240 +#: daemon.py:299 #, python-brace-format msgid "Cannot connect to {host}:{port}" msgstr "" @@ -96,7 +96,28 @@ msgstr "" msgid "Use the language preference set in the browser" msgstr "" -#: middleware.py:130 +#: menu.py:106 +msgid "Visibility" +msgstr "" + +#: menu.py:108 +msgid "Data" +msgstr "" + +#: menu.py:110 templates/base.html:131 +msgid "System" +msgstr "" + +#: menu.py:112 modules/networks/templates/connection_show.html:259 +#: modules/security/__init__.py:35 +msgid "Security" +msgstr "" + +#: menu.py:114 +msgid "Administration" +msgstr "" + +#: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." msgstr "" @@ -113,12 +134,12 @@ msgstr "" msgid "{box_name} Web Interface (Plinth)" msgstr "" -#: modules/apache/components.py:154 +#: modules/apache/components.py:159 #, python-brace-format msgid "Access URL {url} on tcp{kind}" msgstr "" -#: modules/apache/components.py:157 +#: modules/apache/components.py:162 #, python-brace-format msgid "Access URL {url}" msgstr "" @@ -138,7 +159,7 @@ msgstr "" msgid "Service Discovery" msgstr "" -#: modules/avahi/__init__.py:60 +#: modules/avahi/__init__.py:61 msgid "Local Network Domain" msgstr "" @@ -146,35 +167,35 @@ msgstr "" msgid "Backups allows creating and managing backup archives." msgstr "" -#: modules/backups/__init__.py:44 modules/backups/__init__.py:167 -#: modules/backups/__init__.py:212 +#: modules/backups/__init__.py:44 modules/backups/__init__.py:168 +#: modules/backups/__init__.py:213 msgid "Backups" msgstr "" -#: modules/backups/__init__.py:164 +#: modules/backups/__init__.py:165 msgid "" "Enable an automatic backup schedule for data safety. Prefer an encrypted " "remote backup location or an extra attached disk." msgstr "" -#: modules/backups/__init__.py:170 +#: modules/backups/__init__.py:171 msgid "Enable a Backup Schedule" msgstr "" -#: modules/backups/__init__.py:174 modules/backups/__init__.py:221 -#: modules/privacy/__init__.py:76 modules/storage/__init__.py:314 +#: modules/backups/__init__.py:175 modules/backups/__init__.py:222 +#: modules/privacy/__init__.py:77 modules/storage/__init__.py:315 #, python-brace-format msgid "Go to {app_name}" msgstr "" -#: modules/backups/__init__.py:209 +#: modules/backups/__init__.py:210 #, python-brace-format msgid "" "A scheduled backup failed. Past {error_count} attempts for backup did not " "succeed. The latest error is: {error_message}" msgstr "" -#: modules/backups/__init__.py:217 +#: modules/backups/__init__.py:218 msgid "Error During Backup" msgstr "" @@ -401,7 +422,7 @@ msgstr "" msgid "Existing repository is not encrypted." msgstr "" -#: modules/backups/repository.py:335 +#: modules/backups/repository.py:337 #, python-brace-format msgid "{box_name} storage" msgstr "" @@ -748,7 +769,7 @@ msgid "Permissions for anonymous users, who have not provided a password." msgstr "" #: modules/bepasty/forms.py:27 modules/bepasty/templates/bepasty.html:30 -#: modules/users/forms.py:110 modules/users/forms.py:233 +#: modules/users/forms.py:103 msgid "Permissions" msgstr "" @@ -825,8 +846,9 @@ msgstr "" #: modules/bepasty/views.py:88 modules/diagnostics/views.py:52 #: modules/searx/views.py:35 modules/searx/views.py:46 -#: modules/security/views.py:56 modules/tor/views.py:73 -#: modules/torproxy/views.py:71 modules/zoph/views.py:74 +#: modules/security/views.py:56 modules/snapshot/views.py:158 +#: modules/tor/views.py:73 modules/torproxy/views.py:71 +#: modules/upgrades/views.py:83 modules/zoph/views.py:74 msgid "Configuration updated." msgstr "" @@ -910,7 +932,7 @@ msgstr "" #: modules/bind/views.py:61 modules/config/views.py:98 #: modules/coturn/views.py:40 modules/deluge/views.py:35 #: modules/dynamicdns/views.py:78 modules/ejabberd/views.py:95 -#: modules/email/views.py:45 modules/matrixsynapse/views.py:146 +#: modules/email/views.py:45 modules/matrixsynapse/views.py:149 #: modules/minetest/views.py:55 modules/mumble/views.py:37 #: modules/pagekite/forms.py:74 modules/privacy/views.py:36 #: modules/quassel/views.py:29 modules/roundcube/views.py:32 @@ -1082,7 +1104,7 @@ msgstr "" msgid "Configure" msgstr "" -#: modules/config/__init__.py:62 modules/config/forms.py:68 +#: modules/config/__init__.py:63 modules/config/forms.py:68 #: modules/dynamicdns/forms.py:82 modules/names/templates/names.html:16 msgid "Domain Name" msgstr "" @@ -1263,7 +1285,7 @@ msgstr "" msgid "Date & Time" msgstr "" -#: modules/datetime/__init__.py:122 +#: modules/datetime/__init__.py:123 msgid "Time synchronized to NTP server" msgstr "" @@ -1320,77 +1342,77 @@ msgstr "" msgid "Bittorrent client written in Python/PyGTK" msgstr "" -#: modules/diagnostics/__init__.py:27 +#: modules/diagnostics/__init__.py:28 msgid "" "The system diagnostic test will run a number of checks on your system to " "confirm that applications and services are working as expected." msgstr "" -#: modules/diagnostics/__init__.py:51 modules/diagnostics/__init__.py:236 +#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:240 msgid "Diagnostics" msgstr "" -#: modules/diagnostics/__init__.py:95 +#: modules/diagnostics/__init__.py:98 msgid "passed" msgstr "" -#: modules/diagnostics/__init__.py:96 modules/networks/views.py:50 +#: modules/diagnostics/__init__.py:99 modules/networks/views.py:50 msgid "failed" msgstr "" -#: modules/diagnostics/__init__.py:97 +#: modules/diagnostics/__init__.py:100 msgid "error" msgstr "" -#: modules/diagnostics/__init__.py:98 +#: modules/diagnostics/__init__.py:101 msgid "warning" msgstr "" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: modules/diagnostics/__init__.py:202 +#: modules/diagnostics/__init__.py:206 msgid "MiB" msgstr "" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: modules/diagnostics/__init__.py:207 +#: modules/diagnostics/__init__.py:211 msgid "GiB" msgstr "" -#: modules/diagnostics/__init__.py:214 +#: modules/diagnostics/__init__.py:218 msgid "You should disable some apps to reduce memory usage." msgstr "" -#: modules/diagnostics/__init__.py:219 +#: modules/diagnostics/__init__.py:223 msgid "You should not install any new apps on this system." msgstr "" -#: modules/diagnostics/__init__.py:231 +#: modules/diagnostics/__init__.py:235 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " "{memory_available_unit} free. {advice_message}" msgstr "" -#: modules/diagnostics/__init__.py:233 +#: modules/diagnostics/__init__.py:237 msgid "Low Memory" msgstr "" -#: modules/diagnostics/__init__.py:264 +#: modules/diagnostics/__init__.py:268 msgid "Running diagnostics" msgstr "" -#: modules/diagnostics/__init__.py:307 +#: modules/diagnostics/__init__.py:311 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: modules/diagnostics/__init__.py:308 +#: modules/diagnostics/__init__.py:312 msgid "Diagnostics results" msgstr "" -#: modules/diagnostics/__init__.py:313 +#: modules/diagnostics/__init__.py:317 msgid "Go to diagnostics results" msgstr "" @@ -1466,7 +1488,7 @@ msgstr "" msgid "Result" msgstr "" -#: modules/diagnostics/views.py:107 +#: modules/diagnostics/views.py:111 msgid "Diagnostic Test" msgstr "" @@ -1501,7 +1523,7 @@ msgstr "" msgid "Dynamic DNS Client" msgstr "" -#: modules/dynamicdns/__init__.py:74 +#: modules/dynamicdns/__init__.py:75 msgid "Dynamic Domain Name" msgstr "" @@ -1590,7 +1612,7 @@ msgid "Use HTTP basic authentication" msgstr "" #: modules/dynamicdns/forms.py:88 modules/networks/forms.py:207 -#: modules/users/forms.py:67 +#: modules/users/forms.py:129 msgid "Username" msgstr "" @@ -1958,29 +1980,29 @@ msgstr "" msgid "Firewall" msgstr "" -#: modules/firewall/__init__.py:271 +#: modules/firewall/__init__.py:273 msgid "Default zone is external" msgstr "" -#: modules/firewall/__init__.py:280 +#: modules/firewall/__init__.py:283 msgid "Firewall backend is nftables" msgstr "" -#: modules/firewall/__init__.py:293 +#: modules/firewall/__init__.py:297 msgid "Direct passthrough rules exist" msgstr "" -#: modules/firewall/components.py:136 +#: modules/firewall/components.py:139 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: modules/firewall/components.py:147 +#: modules/firewall/components.py:153 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: modules/firewall/components.py:153 +#: modules/firewall/components.py:159 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2098,11 +2120,11 @@ msgstr "" msgid "Read-write access to Git repositories" msgstr "" -#: modules/gitweb/__init__.py:50 modules/gitweb/manifest.py:11 +#: modules/gitweb/__init__.py:48 modules/gitweb/manifest.py:11 msgid "Gitweb" msgstr "" -#: modules/gitweb/__init__.py:51 +#: modules/gitweb/__init__.py:49 msgid "Simple Git Hosting" msgstr "" @@ -2539,7 +2561,7 @@ msgid "I2P" msgstr "" #: modules/i2p/__init__.py:53 modules/tor/__init__.py:63 -#: modules/torproxy/__init__.py:56 +#: modules/torproxy/__init__.py:57 msgid "Anonymity Network" msgstr "" @@ -2898,7 +2920,7 @@ msgstr "" msgid "Certificates" msgstr "" -#: modules/letsencrypt/__init__.py:104 +#: modules/letsencrypt/__init__.py:105 msgid "Cannot test: No domains are configured." msgstr "" @@ -2970,27 +2992,27 @@ msgstr "" #: modules/letsencrypt/views.py:46 #, python-brace-format -msgid "Failed to revoke certificate for domain {domain}: {error}" +msgid "Failed to revoke certificate for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:76 +#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:81 +#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 #, python-brace-format -msgid "Failed to obtain certificate for domain {domain}: {error}" +msgid "Failed to obtain certificate for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:93 +#: modules/letsencrypt/views.py:95 #, python-brace-format msgid "Certificate successfully deleted for domain {domain}" msgstr "" -#: modules/letsencrypt/views.py:98 +#: modules/letsencrypt/views.py:100 #, python-brace-format -msgid "Failed to delete certificate for domain {domain}: {error}" +msgid "Failed to delete certificate for domain {domain}" msgstr "" #: modules/matrixsynapse/__init__.py:26 @@ -3139,7 +3161,7 @@ msgid "" "go to Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3498,19 +3520,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -3989,11 +4011,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4630,7 +4647,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4846,15 +4863,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4873,14 +4890,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -4891,15 +4908,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5725,7 +5742,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5793,33 +5810,32 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" +#: modules/snapshot/views.py:160 +msgid "Configuration update failed." msgstr "" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5835,7 +5851,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -5907,121 +5923,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6126,9 +6142,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6163,7 +6178,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6305,7 +6320,7 @@ msgstr "" msgid "Error configuring app: {error}" msgstr "" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6314,20 +6329,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6456,32 +6471,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6628,51 +6643,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6680,25 +6678,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6707,30 +6705,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6739,57 +6719,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7271,7 +7274,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7284,7 +7287,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7292,11 +7295,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7345,92 +7348,77 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "" -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "" -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7512,10 +7500,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7783,11 +7767,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, 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 596066e02..0444f6f63 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2024-02-11 20:14+0000\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Telugu లెట్స్ ఎన్‌క్రిప్ట్కి వెళ్లండి." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3875,7 +3904,7 @@ msgstr "సెక్యూర్ షెల్" msgid "Services" msgstr "సేవలు" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -3883,13 +3912,13 @@ msgstr "" "కాన్ఫిగర్ చేయగల నెట్‌వర్క్ పరికరాలు. ఈథర్నెట్ మరియు Wi-Fi లేదా PPPoE ద్వారా ఇంటర్నెట్‌తో కనెక్ట్ అవ్వండి. " "నెట్‌వర్క్‌లోని ఇతర పరికరాలతో ఆ కనెక్షన్‌ని భాగస్వామ్యం చేయండి." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "ఇతర పద్ధతుల ద్వారా నిర్వహించబడే పరికరాలు ఇక్కడ ఆకృతీకరణకు అందుబాటులో ఉండకపోవచ్చు." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "అల్లికలు" @@ -4430,11 +4459,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "ఈ అనుసంధానం చురుకుగాలేదు." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "భద్రత" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5127,7 +5151,7 @@ msgstr "పేజ్‌కైట్" msgid "Public Visibility" msgstr "ప్రజా దృశ్యమానం" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "పేజ్‌కైట్ అధికారక్షేత్రం" @@ -5362,15 +5386,15 @@ msgstr "ఇపుడు మూసివేయండి" msgid "Manage system-wide privacy settings." msgstr "సిస్టమ్-వైడ్ గోప్యతా సెట్టింగ్‌లను నిర్వహించండి." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "అంతరంగికత" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "మీ అభిరుచులకు అనుగుణంగా అంతరంగిక సెట్టింగులను మార్చుకోండి." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "అంతరంగిక సెట్టింగ్‌ని సమీక్షించండి" @@ -5394,7 +5418,7 @@ msgstr "" "target=\"_blank\">popcon.debian.orgలో పబ్లిక్‌గా అందుబాటులో ఉన్నాయి. టోర్ యాప్ " "ప్రారంభించబడితే అదనపు అజ్ఞాతం కోసం టోర్ నెట్‌వర్క్ ద్వారా సమర్పణ జరుగుతుంది." -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5404,7 +5428,7 @@ msgstr "" "నియంత్రించడం మరియు ప్రకటనలను మరియు ఇతర చెడ్డ ఇంటర్నెట్ వ్యర్థాలను తొలగించడం కోసం ఆధునిక ఫిల్టరింగ్ " "సామర్థ్యాలతో ఒక కాని క్యాచింగ్ వెబ్ ప్రాక్సీ. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, fuzzy, python-brace-format #| msgid "" #| "You can use Privoxy by modifying your browser proxy settings to your " @@ -5425,15 +5449,15 @@ msgstr "" "డాక్యుమెంటేషన్ http://config.privoxy.org/ లేదా http://p.p లో చూడవచ్చు." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "ప్రివొక్సి" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "వెబ్ ప్రాక్సీ" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "టీసీపీ{kind} పై{proxy} తో యాక్సిస్ {url} చేయండి" @@ -6392,7 +6416,7 @@ msgstr "తేదీ" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "స్నాప్షాట్‌లను తొలగించు" @@ -6464,33 +6488,36 @@ msgstr "స్నాప్‌షాట్‌లను నిర్వహిం msgid "Created snapshot." msgstr "స్నాప్షాట్‌ సృష్టించబడినది." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "నిల్వ స్నాప్‌షాట్‌ల కాన్ఫిగరేషన్ నవీకరించబడింది" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "ఆకృతీకరణ నవీకరించబడింది." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "చర్య లోపం:{0}{1}{2}" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "ఎంచుకున్న స్నాప్‌షాట్‌లు తొలగించబడ్డాయి" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "ఎల్.డి.ఏ.పి వినియోగదారి తొలగింపు విఫలం." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "స్నాప్‌షాట్ ప్రస్తుతం వాడుకలో ఉంది. దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "స్నాప్షాట్ #{number} కు తీస్కుని వెళ్ళబడింది." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "రొల్ల్బచ్క్ ని పూర్తి చేయడానికి వ్యవస్థను పునరుద్ధరించాలి." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "చాయాచిత్రం కు రొల్ల్బచ్క్ చేయండి" @@ -6509,7 +6536,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "సెక్యూర్ షెల్ (SSH) సర్వర్" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 #, fuzzy #| msgid "Secure Shell (SSH)" msgid "Remotely login using Secure Shell (SSH)" @@ -6591,103 +6618,103 @@ msgstr "" "ప్రస్తుతం వాడుకలో ఉన్న స్టోరేజ్ మీడియాను వీక్షించవచ్చు, తొలగించగల మీడియాను మౌంట్ చేయవచ్చు మరియు అన్‌మౌంట్ " "చేయవచ్చు, రూట్ విభజనను విస్తరించవచ్చు మొదలైనవి." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "నిల్వ" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} బైట్లు" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} కిలోబైట్లు" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} మెగాబైట్లు" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} గిగాబైట్లు" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} టెరాబైట్లు" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "ఆపరేషన్ విఫలమైంది." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "ఆపరేషన్ రద్దు చేయబడింది." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "పరికరం ఇప్పటికే అన్‌మౌంట్ చేయబడుతోంది." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "డ్రైవర్/టూల్ సపోర్ట్ తప్పిపోయినందున ఆపరేషన్‌కు మద్దతు లేదు." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "ఆపరేషన్ టైమవుట్ అయింది." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "ఈ ఆపరేషన్ గాఢ నిద్రలో ఉన్న ఒక డిస్క్ ను మేల్కొలుపుతుంది." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "బిజీగా ఉన్న పరికరాన్ని అన్‌మౌంట్ చేయడానికి ప్రయత్నిస్తోంది." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "ఆపరేషన్ ఇప్పటికే రద్దు చేయబడింది." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "అభ్యర్థించిన ఆపరేషన్ చేయడానికి అధికారం లేదు." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "పరికరం ఇప్పటికే మౌంట్ చేయబడింది." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "పరికరం మౌంట్ చేయబడలేదు." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "అభ్యర్థించిన ఎంపికను ఉపయోగించడానికి అనుమతి లేదు." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "పరికరం మరొక వినియోగదారుచే మౌంట్ చేయబడింది." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "సిస్టమ్ విభజనలో తక్కువ స్థలం: {percent_used}% used, {free_space} ఉచితం." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "తక్కువ ఖని స్థలం" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "ఖని వైఫల్యం ఆసన్నమైంది" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -6696,20 +6723,20 @@ msgstr "" "ఖని {id}సమీప భవిష్యత్తులో విఫలమయ్యే అవకాశం ఉందని నివేదిస్తోంది. మీరు చేయగలిగినప్పుడు ఏదైనా సమాచారంకాపీ " "చేసి, చోదకం భర్తీ చేయండి." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 #, fuzzy #| msgid "System" msgid "Read-only root filesystem" msgstr "వ్యవస్థ" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 #, fuzzy #| msgid "Go to Networks" msgid "Go to Power" @@ -6823,9 +6850,10 @@ msgstr "{drive_vendor} {drive_model} ని సురక్షితంగా msgid "Device can be safely unplugged." msgstr "పరికరాన్ని సురక్షితంగా తొలగించవచ్చు." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "పరికరాన్ని తొలగించడంలో లోపం: {error_message}" #: modules/syncthing/__init__.py:23 @@ -6868,7 +6896,7 @@ msgstr "సింక్ తింగ్" msgid "File Synchronization" msgstr "ఫైళ్ళ సమకాలీకరణ" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7034,7 +7062,7 @@ msgstr "కాన్ఫిగరేషన్‌ను నవీకరిస్ msgid "Error configuring app: {error}" msgstr "యాప్‌ని కాన్ఫిగర్ చేయడంలో లోపం: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7046,20 +7074,20 @@ msgstr "" "ప్రాక్సీని అందిస్తుంది. Tor నెట్‌వర్క్ ద్వారా ఇంటర్నెట్‌ను యాక్సెస్ చేయడానికి వివిధ యాప్‌ల ద్వారా దీన్ని " "ఉపయోగించవచ్చు. ISP సెన్సార్‌షిప్‌ను అప్‌స్ట్రీమ్ వంతెనలను ఉపయోగించి తప్పించుకోవచ్చు." -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "టోర్ ప్రాక్సీ" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "టోర్ సాక్స్ ప్రాతినిధ్య" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "టార్ ద్వారా {kind} లో {url} ను ఆక్సెస్ చెయ్యండి" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "టోర్ వాడుకను నిర్ధారించండి{url} టీ సి పి పై{kind}" @@ -7210,21 +7238,21 @@ msgstr "" "అందుబాటులో ఉండవు. సిస్టమ్ రీబూట్ అవసరమని భావించినట్లయితే, అది స్వయంచాలకంగా 02:00కి చేయబడుతుంది, " "దీని వలన అన్ని యాప్‌లు క్లుప్తంగా అందుబాటులో ఉండవు." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "సాఫ్ట్‌వేర్ నవీకరణ" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "స్వతంత్ర సాఫ్ట్వేర్ తాజా పరుచడం" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "పంపిణీ నవీకరణను ప్రారంభించడం సాధ్యపడలేదు" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7233,11 +7261,11 @@ msgstr "" "పంపిణీ నవీకరణను ప్రారంభించడానికి రూట్ విభజనలో తగినంత ఖాళీ స్థలం లేదు. దయచేసి కనీసం 5 GB ఉచితంగా " "ఉండేలా చూసుకోండి. ప్రారంభించబడితే, పంపిణీ నవీకరణ 24 గంటల తర్వాత మళ్లీ ప్రయత్నించబడుతుంది." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "పంపిణీ నవీకరణ ప్రారంభమైంది" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "తదుపరి స్థిరమైన విడుదలకు నవీకరణ ప్రారంభించబడింది. ఇది పూర్తి కావడానికి చాలా సమయం పట్టవచ్చు." @@ -7408,44 +7436,29 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "పంపిణీ మెరుగుపరుచడం ప్రారంభించబడింది" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "గమనింపబడని-నవీకరణలు ఆకృతీకరించునప్పుడు దోషం: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "స్వయంచాలక నవీకరణలు ప్రారంభించబడ్డాయి" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "స్వయంచాలక నవీకరణలు నిలిపివేయబడ్డాయి" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "పంపిణీ మెరుగుపరుచడం ప్రారంభించబడింది" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "పంపిణీ మెరుగుపరుచడం నిలిపివేయబడింది" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "అప్గ్రేడ్ ప్రక్రియ ప్రారంభించబడింది." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "నవీకరణ ప్రారంభం విఫలమైంది." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "తరచుగా ఫీచర్ అప్‌డేట్‌లు యాక్టివేట్ చేయబడ్డాయి." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "పంపిణీ మెరుగుపరిచే పరిక్ష ప్రారంభించబడింది." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7455,7 +7468,7 @@ msgstr "" "విధానంగా పనిచేస్తాయి. కొన్ని యాప్‌లకు యాప్‌ను యాక్సెస్ చేయడానికి వినియోగదారుని ప్రామాణీకరించడానికి సమూహంలో భాగంగా " "వినియోగదారు ఖాతా అవసరం." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7466,25 +7479,25 @@ msgstr "" "చేయవచ్చు. అయినప్పటికీ, అడ్మిన్ సమూహం యొక్క వినియోగదారులు మాత్రమే యాప్‌లు లేదా సిస్టమ్ " "సెట్టింగ్‌లను మార్చవచ్చు." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "వినియోగదారులు మరియు సమూహాలు" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "అన్ని సేవలకు మరియు సిస్టమ్ అమరికలకు ప్రాప్యత" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP నమోదు \"{search_item}\" తనిఖీ" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -7493,31 +7506,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "యూజర్ పేరు తీసుకోబడింది లేదా రిజర్వ్ చేయబడింది." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "చెల్లుబాటు అయ్యే వినియోగదారు పేరును నమోదు చేయండి." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"అవసరం. 150 అక్షరాలు లేదా అంతకంటే తక్కువ. ఆంగ్ల అక్షరాలు, అంకెలు మరియు @/./-/_ మాత్రమే." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "అధికార రహస్యపదం" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "వినియోగదారు కోసం పాస్‌వర్డ్‌ను నమోదు చేయండి\"{user}\"ఖాతా సవరణలకు అధికారం ఇవ్వడానికి." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "చెల్లని రహస్యపదం." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7530,21 +7524,45 @@ msgstr "" "అన్ని సేవలకు లాగిన్ చేయగలరు. వారు SSH ద్వారా సిస్టమ్‌కి లాగిన్ అవ్వగలరు మరియు నిర్వాహక అధికారాలను (సూడో) " "కలిగి ఉంటారు." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "చెల్లుబాటు అయ్యే వినియోగదారు పేరును నమోదు చేయండి." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"అవసరం. 150 అక్షరాలు లేదా అంతకంటే తక్కువ. ఆంగ్ల అక్షరాలు, అంకెలు మరియు @/./-/_ మాత్రమే." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "అధికార రహస్యపదం" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "వినియోగదారు కోసం పాస్‌వర్డ్‌ను నమోదు చేయండి\"{user}\"ఖాతా సవరణలకు అధికారం ఇవ్వడానికి." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "చెల్లని రహస్యపదం." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "ల్డప్ వినియోగదారుని సృష్టించడం విఫలమైంది: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, fuzzy, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "సమూహంసమూహానికి కొత్త వినియోగదారుని జోడించడంలో విఫలమైంది: {లోపం {group} {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "అధీకృత SSH కీలు" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7554,36 +7572,36 @@ msgstr "" "అవ్వడానికి అనుమతిస్తుంది. మీరు బహుళ కీలను నమోదు చేయవచ్చు, ఒక్కో లైన్‌లో ఒకటి. #తో ప్రారంభమయ్యే ఖాళీ " "పంక్తులు మరియు పంక్తులు విస్మరించబడతాయి." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "ఎల్.డి.ఏ.పి వాడుకరి పేరుమార్పులో విఫలం." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "సమూహంలోంచి వినియోగదారుని తొలగించడంలో విఫలం." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "సమూహంలోకి వినియోగదారుని జోడించడంలో విఫలం." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "SSH కీలను సెట్ చేయడం సాధ్యం కాలేదు." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "వినియోగదారు స్థితిని మార్చడంలో విఫలమైంది." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "ఎల్.డి.ఏ.పి వాడుకరి పాస్‌వర్డ్ మార్పిడి విఫలం." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "నిర్వాహక సమూహానికి కొత్త వినియోగదారుని జోడించడంలో విఫలమైంది: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "వాడుకరి ఖాతా సృస్టించబడింది, మీరు లాగిన్ చేయబడ్డారు" @@ -8113,7 +8131,7 @@ msgstr "" "సందర్శకులందరినీ అనుమతించండి. నిరుపయోగం చేయడం వలన వర్డుప్రెస్సు సైట్ లేదా బ్లాగును వీక్షించడానికి " "నిర్వాహకులు మాత్రమే అనుమతిస్తుంది. ప్రారంభ వర్డుప్రెస్సు సెటప్ చేసిన తర్వాత మాత్రమే ప్రారంభించండి." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8132,7 +8150,7 @@ msgstr "" "వీక్షణలను ఉపయోగించి ఒక వ్యక్తిని కలిగి ఉన్న అన్ని ఫోటోలు లేదా తేదీలో తీసిన ఫోటోలు లేదా ఒక ప్రదేశంలో తీసిన " "ఫోటోలను కనుగొనడం సులభం. డైరెక్ట్ లింక్‌ని పంపడం ద్వారా వ్యక్తిగత ఫోటోలను ఇతరులతో పంచుకోవచ్చు." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8142,11 +8160,11 @@ msgstr "" "జోఫ్ని సెటప్ చేసిన {box_name} వినియోగదారు కూడా Zophలో నిర్వాహకులు అవుతారు. అదనపు వినియోగదారుల " "కోసం, ఖాతాలు తప్పనిసరిగా {box_name}లో మరియు జోఫ్లో ఒకే వినియోగదారు పేరుతో సృష్టించబడాలి." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "జోఫ్" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "ఫోటో ఆర్గనైజర్" @@ -8198,108 +8216,90 @@ msgstr "" msgid "Finished: {name}" msgstr "సేవ నిలిపివేయబడింది: {name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "ప్యాకేజీ {package_name} తాజా వెర్షన్ ({latest_version})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "వ్యవస్థాపిస్తోంది" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "దిగుమతి అవుతోంది" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "ప్రసార మాధ్యమం మార్పు" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "ఆకృతీకరణ ఫైలు: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "ప్యాకేజీ మేనేజర్ కోసం వేచి ఉన్న సమయం ముగిసింది" -#: setup.py:41 +#: setup.py:39 #, fuzzy #| msgid "Install Apps" msgid "Installing app" msgstr "అనువర్తనాలను నిక్షిప్తం చేద్దాం" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "అనువర్తనం నవీకరించబడుతున్నది" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "అనువర్తనం స్థాపించుటలో దోషం: {string}{details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "అనువర్తనం స్థాపించుటలో దోషం: {string}{details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "అనువర్తనం స్థాపించుటలో దోషం: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "అనువర్తనం స్థాపించుటలో దోషం: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "అనువర్తనం స్థాపించబడింది." -#: setup.py:89 +#: setup.py:84 #, fuzzy #| msgid "Last update" msgid "App updated" msgstr "చివరి నవీకరణ" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Install Apps" msgid "Uninstalling app" msgstr "అనువర్తనాలను నిక్షిప్తం చేద్దాం" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "అనువర్తనం స్థాపించుటలో దోషం: {string}{details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "అనువర్తనం స్థాపించుటలో దోషం: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "అనువర్తనం స్థాపించబడింది." -#: setup.py:453 +#: setup.py:493 #, fuzzy #| msgid "Upgrade Packages" msgid "Updating app packages" @@ -8392,10 +8392,6 @@ msgstr "అనువర్తనాలు" msgid " System" msgstr " కార్యవ్యవస్థ" -#: templates/base.html:131 -msgid "System" -msgstr "వ్యవస్థ" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "రహస్యపదాన్ని మార్చు" @@ -8693,11 +8689,11 @@ msgid "" "installed freshly again." msgstr "మొత్తం యాప్ డేటా మరియు కాన్ఫిగరేషన్ శాశ్వతంగా పోతాయి. యాప్ను మళ్లీ తాజాగా ఇన్‌స్టాల్ చేయవచ్చు." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "మారకుండా అమర్చుతోంది" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "{app_id} ని అన్ఇన్‌స్టాల్ చేయడానికి ముందు" @@ -8707,6 +8703,40 @@ msgstr "{app_id} ని అన్ఇన్‌స్టాల్ చేయడా msgid "Gujarati" msgstr "గుజరాతీ" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "నిల్వ స్నాప్‌షాట్‌ల కాన్ఫిగరేషన్ నవీకరించబడింది" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "చర్య లోపం:{0}{1}{2}" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "స్వయంచాలక నవీకరణలు ప్రారంభించబడ్డాయి" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "స్వయంచాలక నవీకరణలు నిలిపివేయబడ్డాయి" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "పంపిణీ మెరుగుపరుచడం ప్రారంభించబడింది" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "పంపిణీ మెరుగుపరుచడం నిలిపివేయబడింది" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "అనువర్తనం స్థాపించుటలో దోషం: {string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "అనువర్తనం స్థాపించుటలో దోషం: {string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "అనువర్తనం స్థాపించుటలో దోషం: {string}{details}" + #~ msgid "Page source" #~ msgstr "పేజీ మూలం" diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index cf940932a..b0285323a 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2024-01-31 05:01+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish Let's Encrypt'a gidin." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "Uygulama etkisizleştirildiğinde kayıt yapılandırması güncellenemez." @@ -4008,7 +4037,7 @@ msgstr "Güvenli Kabuk" msgid "Services" msgstr "Hizmetler" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4016,7 +4045,7 @@ msgstr "" "Ağ cihazlarını yapılandırın. İnternet'e Ethernet, Wi-Fi veya PPPoE ile " "bağlanın. Bu bağlantıyı ağdaki diğer cihazlarla paylaşın." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4024,7 +4053,7 @@ msgstr "" "Diğer yöntemler aracılığıyla yönetilen cihazlar burada yapılandırma için " "mevcut olmayabilir." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Ağlar" @@ -4591,11 +4620,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Bu bağlantı etkin değil." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Güvenlik" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5303,7 +5327,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Herkese Açık Görünürlük" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "PageKite Etki Alanı" @@ -5548,15 +5572,15 @@ msgstr "Şimdi Kapat" msgid "Manage system-wide privacy settings." msgstr "Sistem genelinde gizlilik ayarlarını yönetin." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "Gizlilik" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "Lütfen gizlilik ayarlarını tercihlerinize uyacak şekilde güncelleyin." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "Gizlilik ayarlarını gözden geçirin" @@ -5583,7 +5607,7 @@ msgstr "" "herkese açıktır. Tor uygulaması etkinleştirilirse, ek isimsizlik için " "gönderme Tor ağı üzerinden gerçekleşir." -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5594,7 +5618,7 @@ msgstr "" "çöplerini kaldırmak için gelişmiş süzme yeteneklerine sahip, önbelleğe " "alınmayan bir web vekil sunucusudur. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5611,15 +5635,15 @@ msgstr "" "href=\"https://www.privoxy.org\">https://www.privoxy.org adresinde " "görebilirsiniz." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Web Vekil Sunucusu" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Tcp{kind} üzerinde {proxy} vekil sunucusu ile {url} adresine erişin" @@ -6605,7 +6629,7 @@ msgstr "Tarih" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Anlık Görüntüleri Sil" @@ -6679,34 +6703,37 @@ msgstr "Anlık Görüntüleri Yönet" msgid "Created snapshot." msgstr "Anlık görüntü oluşturuldu." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Depolama anlık görüntü yapılandırması güncellendi" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Yapılandırma güncellendi." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Eylem hatası: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Seçilen anlık görüntüler silindi" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "LDAP kullanıcısının silinmesi başarısız oldu." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "Anlık görüntü şu anda kullanımda. Lütfen daha sonra tekrar deneyin." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "#{number} nolu anlık görüntüye geri alındı." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" "Geri alma işlemini tamamlamak için sistem yeniden başlatılmak zorundadır." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Anlık Görüntüye Geri Al" @@ -6726,7 +6753,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Güvenli Kabuk (SSH) Sunucusu" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "Güvenli Kabuk (SSH) kullanarak uzaktan oturum açın" @@ -6810,104 +6837,104 @@ msgstr "" "ortamı bağlayabilir ve bağlantısını kaldırabilir, kök bölümünü vb. " "genişletebilirsiniz." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Depolama" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} bayt" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "İşlem başarısız oldu." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "İşlem iptal edildi." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Aygıtın zaten bağlantısı kaldırılıyor." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "Eksik sürücü/araç desteğinden dolayı işlem desteklenmiyor." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "İşlem zaman aşımına uğradı." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "İşlem, derin uyku durumunda olan bir diski uyandırır." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Meşgul olan bir aygıtın bağlantısı kaldırılmaya çalışılıyor." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "İşlem zaten iptal edildi." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "İstenen işlemi gerçekleştirmek için yetkili değilsiniz." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Aygıt zaten bağlı." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Aygıt bağlı değil." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "İstenen seçeneği kullanmak için izin verilmedi." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Aygıt başka bir kullanıcı tarafından bağlandı." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" "Sistem bölümünde düşük alan: %{percent_used} kullanıldı, {free_space} boş." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Düşük disk alanı" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Disk arızası yakın" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -6916,7 +6943,7 @@ msgstr "" "Disk {id}, yakın gelecekte başarısız olma ihtimalinin yüksek olduğunu " "bildiriyor. Hala yapabilirken tüm verileri kopyalayın ve sürücüyü değiştirin." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " @@ -6926,11 +6953,11 @@ msgstr "" "deneyin. Eğer yeniden başlatmanın ardından sorun devam ederse, hatalar için " "depolama cihazını gözden geçirin." -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "Salt okunur kök dosya sistemi" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "Güce Git" @@ -7043,9 +7070,10 @@ msgstr "{drive_vendor} {drive_model} güvenle çıkarılabilir." msgid "Device can be safely unplugged." msgstr "Aygıt güvenli bir şekilde çıkarılabilir." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Aygıt çıkarılırken hata oldu: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7091,7 +7119,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Dosya Eşitleme" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7262,7 +7290,7 @@ msgstr "Yapılandırma güncelleniyor" msgid "Error configuring app: {error}" msgstr "Uygulama yapılandırılırken hata oldu: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7275,20 +7303,20 @@ msgstr "" "ağı aracılığıyla internete erişmek için çeşitli uygulamalar tarafından " "kullanılabilir. İSS sansürü yukarı akış köprüleri kullanılarak atlatılabilir." -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "Tor Vekil Sunucusu" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Tor Socks Vekil Sunucusu" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Tor aracılığıyla tcp{kind} üzerinde erişim URL'si {url}" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Tcp{kind} üzerinde {url} adresinde Tor kullanımını onaylama" @@ -7450,21 +7478,21 @@ msgstr "" "Eğer sistemin yeniden başlatılması gerekli görülürse, saat 02:00'da otomatik " "olarak yapılır ve tüm uygulamalar kısa bir süre için kullanılamaz hale gelir." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Yazılım Güncellemesi" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox Güncellendi" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "Dağıtım güncellemesi başlatılamadı" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7474,11 +7502,11 @@ msgstr "" "Lütfen en az 5 GB boş alan olduğundan emin olun. Dağıtım güncellemesi, " "etkinleştirildiyse 24 saat sonra yeniden denenecektir." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "Dağıtım güncellemesi başlatıldı" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7656,44 +7684,29 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Dağıtım yükseltmesini şimdi dene" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "unattended-upgrades yapılandırılırken bir hata oldu: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Otomatik yükseltmeler etkinleştirildi" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Otomatik yükseltmeler etkisizleştirildi" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "Dağıtım yükseltmesi etkinleştirildi" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Dağıtım yükseltmesi etkisizleştirildi" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Yükseltme işlemi başladı." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Yükseltmeyi başlatma başarısız oldu." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Sık yapılan özellik güncellemeleri etkinleştirildi." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "Dağıtım yükseltmesi denemesi başlatılıyor." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7704,7 +7717,7 @@ msgstr "" "kullanıcıya, uygulamaya erişme yetkisi vermek için bir kullanıcı hesabının " "bir grubun parçası olmasını gerektirir." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7716,25 +7729,25 @@ msgstr "" "sadece admin grubunun kullanıcıları uygulamaları veya sistem " "ayarlarını değiştirebilir." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Kullanıcılar ve Gruplar" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Tüm hizmetlere ve sistem ayarlarına erişim" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP \"{search_item}\" girişini denetleme" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "\"{key} {value}\" nslcd yapılandırmasını denetleme" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "\"{database}\" nsswitch yapılandırmasını denetleme" @@ -7743,34 +7756,12 @@ msgstr "\"{database}\" nsswitch yapılandırmasını denetleme" msgid "Username is taken or is reserved." msgstr "Kullanıcı adı alınmış veya ayrılmış." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Geçerli bir kullanıcı adı girin." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Zorunlu. 150 veya daha az karakter. Sadece İngilizce harfler, rakamlar ve " -"@/./-/_ karakterleri." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Yetkilendirme Parolası" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" -"Hesap değişikliklerini yetkilendirmek için \"{user}\" kullanıcısının " -"parolasını girin." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Geçersiz parola." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7784,21 +7775,48 @@ msgstr "" "kullanıcılar tüm hizmetlere oturum açabilecektir. Ayrıca SSH aracılığıyla " "sisteme oturum açabilir ve yönetici yetkilerine (sudo) sahip olabilirler." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Geçerli bir kullanıcı adı girin." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"Zorunlu. 150 veya daha az karakter. Sadece İngilizce harfler, rakamlar ve " +"@/./-/_ karakterleri." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Yetkilendirme Parolası" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" +"Hesap değişikliklerini yetkilendirmek için \"{user}\" kullanıcısının " +"parolasını girin." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Geçersiz parola." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "LDAP kullanıcısı oluşturma başarısız oldu: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "{group} grubuna yeni kullanıcı ekleme başarısız oldu: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Yetkili SSH Anahtarları" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7809,36 +7827,36 @@ msgstr "" "tane olmak üzere birden çok anahtar girebilirsiniz. Boş satırlar ve # ile " "başlayan satırlar yoksayılacaktır." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "LDAP kullanıcısının yeniden adlandırılması başarısız oldu." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Kullanıcıyı gruptan kaldırma başarısız oldu." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Kullanıcıyı gruba ekleme başarısız oldu." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "SSH anahtarları ayarlanamıyor." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Kullanıcı durumunu değiştirme başarısız oldu." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "LDAP kullanıcı parolasının değiştirilmesi başarısız oldu." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Admin grubuna yeni kullanıcı ekleme başarısız oldu: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Kullanıcı hesabı oluşturuldu, şu an oturum açtınız" @@ -8375,7 +8393,7 @@ msgstr "" "WordPress sitesini veya blogunu görüntülemesine izin verir. Sadece ilk " "WordPress kurulumunu gerçekleştirdikten sonra etkinleştirin." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8397,7 +8415,7 @@ msgstr "" "çekilmiş fotoğrafları bulmak kolaydır. Tek tek fotoğraflar, doğrudan bir " "bağlantı gönderilerek başkalarıyla paylaşılabilir." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8408,11 +8426,11 @@ msgstr "" "Ek kullanıcılar için hesaplar hem {box_name} cihazında hem de Zoph'da aynı " "kullanıcı adıyla oluşturulmak zorundadır." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Fotoğraf Düzenleyici" @@ -8465,92 +8483,77 @@ msgstr "Başlamak için bekleniyor: {name}" msgid "Finished: {name}" msgstr "Tamamlandı: {name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "{package_expression} paketi yükleme için mevcut değil" -#: package.py:231 +#: package.py:226 #, 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})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "yükleniyor" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "indiriliyor" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "ortam değiştirme" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "yapılandırma dosyası: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "Paket yöneticisini beklerken zaman aşımı oldu" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "Uygulama yükleniyor" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "Uygulama güncelleniyor" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "Uygulama yüklenirken hata oldu: {string} {details}" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "Uygulama güncellenirken hata oldu: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "Uygulama yüklenirken hata oldu: {error}" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "Uygulama güncellenirken hata oldu: {error}" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "Uygulama yüklendi." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "Uygulama güncellendi" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "Uygulama kaldırılıyor" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "Uygulama kaldırılırken hata oldu: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "Uygulama kaldırılırken hata oldu: {error}" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "Uygulama kaldırıldı." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "Uygulama paketleri güncelleniyor" @@ -8644,10 +8647,6 @@ msgstr "Uygulamalar" msgid " System" msgstr " Sistem" -#: templates/base.html:131 -msgid "System" -msgstr "Sistem" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Parolayı değiştir" @@ -8943,11 +8942,11 @@ msgstr "" "Tüm uygulama verileri ve yapılandırması kalıcı olarak kaybolacaktır. " "Uygulama tekrar yeni olarak yüklenebilir." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Ayar değişmedi" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "{app_id} kaldırılmadan önce" @@ -8956,6 +8955,37 @@ msgstr "{app_id} kaldırılmadan önce" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Depolama anlık görüntü yapılandırması güncellendi" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Eylem hatası: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Otomatik yükseltmeler etkinleştirildi" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Otomatik yükseltmeler etkisizleştirildi" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Dağıtım yükseltmesi etkinleştirildi" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Dağıtım yükseltmesi etkisizleştirildi" + +#, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Uygulama yüklenirken hata oldu: {string} {details}" + +#, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Uygulama güncellenirken hata oldu: {string} {details}" + +#, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Uygulama kaldırılırken hata oldu: {string} {details}" + #~ msgid "Page source" #~ msgstr "Sayfa kaynağı" diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index 5121859c7..9c228f43e 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2024-02-05 00:01+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian Let's " "Encrypt, щоб отримати його." -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" "Конфігурація реєстрації не може бути оновлена, коли застосунок вимкнено." @@ -4013,7 +4042,7 @@ msgstr "Захищена оболонка" msgid "Services" msgstr "Сервіси" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." @@ -4021,7 +4050,7 @@ msgstr "" "Налаштування мережевих пристроїв. Зʼєднання з Інтернетом через Ethernet, Wi-" "Fi або PPPoE. Ділитися цим зʼєднанням з іншими пристроями в мережі." -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." @@ -4029,7 +4058,7 @@ msgstr "" "Пристрої, що адмініструються іншими способами, можуть бути недоступними для " "налаштування тут." -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "Мережі" @@ -4593,11 +4622,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "Це зʼєднання неактивне." -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "Безпека" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -5313,7 +5337,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "Публічна видимість" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "Домен PageKite" @@ -5554,16 +5578,16 @@ msgstr "Вимкнути зараз" msgid "Manage system-wide privacy settings." msgstr "Керування загальносистемними налаштуваннями приватності." -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "Приватність" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" "Будь ласка, оновіть налаштування приватності відповідно до ваших уподобань." -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "Переогляд налаштувань приватності" @@ -5590,7 +5614,7 @@ msgstr "" "org. Передача відбувається через мережу Tor для додаткової анонімності, " "якщо у вас увімкнено програму Tor." -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5600,7 +5624,7 @@ msgstr "" "підвищення приватності, зміни даних вебсторінок і HTTP-заголовків, контролю " "доступу, а також видалення реклами та іншого небажаного інтернет-мотлоху. " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5617,15 +5641,15 @@ msgstr "" "посиланнями http://config.privoxy.org/" " або http://p.p." -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Вебпроксі" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "Доступ за адресою {url} через проксі {proxy} по tcp{kind}" @@ -6606,7 +6630,7 @@ msgstr "Дата" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "Видалити зріз" @@ -6678,33 +6702,36 @@ msgstr "Керування зрізами" msgid "Created snapshot." msgstr "Створено зріз." -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "Налаштування зрізів сховища оновлено" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Налаштування оновлено." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "Помилка дії: {0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "Видалити вибрані зрізи" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "Не вдалося видалити користувача LDAP." + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "Зріз зараз використовується. Повторіть пізніше." -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "Відкочено до зрізу #{number}." -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "Систему потрібно перезапустити, щоб завершити відкат." -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "Повернутися до знімка" @@ -6724,7 +6751,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "Сервер захищеної оболонки (SSH)" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "Віддалений вхід за допомогою Secure Shell (SSH)" @@ -6807,106 +6834,106 @@ msgstr "" "{box_name}. Під час використання сховище даних можна переглядати, монтувати " "і відмонтовувати знімні накопичувачі, розширювати розділ root тощо." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "Сховище" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} байтів" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} КБ" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} МБ" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} ГБ" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} ТБ" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "Операція невдала." -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "Операцію скасовано." -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Пристрій вже відмонтований." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" "Операція не підтримується через відсутність підтримки драйверів/засобів." -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "Час операції вийшов." -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "Операція розбудить диск, який перебуває у стані глибокого сну." -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Спроба відмонтувати пристрій, який зайнятий." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "Операція вже була скасована." -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "Немає прав на виконання запитуваної операції." -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Пристрій уже змонтовано." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Пристрій не змонтовано." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "Не дозволено використовувати запитувану опцію." -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Пристрій змонтовано іншим користувачем." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" "Мало простору в розділі системи: {percent_used}% використано, {free_space} " "вільно." -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "Мало простору на диску" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "Неминучий збій диска" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " @@ -6915,7 +6942,7 @@ msgstr "" "Диск {id} повідомляє, що найближчим часом, ймовірно, вийде з ладу. Скопіюйте " "всі дані, поки це ще можливо, і замініть диск." -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " @@ -6925,11 +6952,11 @@ msgstr "" "Якщо після перезавантаження проблема не зникне, перевірте пристрій " "зберігання даних на наявність помилок." -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "Коренева файлова система лише для читання" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "Перейти до живлення" @@ -7042,9 +7069,10 @@ msgstr "{drive_vendor} {drive_model} можна безпечно відʼєдн msgid "Device can be safely unplugged." msgstr "Пристрій можна безпечно витягати." -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +#, fuzzy +#| msgid "Error ejecting device: {error_message}" +msgid "Error ejecting device." msgstr "Помилка виймання пристрою: {error_message}" #: modules/syncthing/__init__.py:23 @@ -7090,7 +7118,7 @@ msgstr "Syncthing" msgid "File Synchronization" msgstr "Синхронізація файлів" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -7260,7 +7288,7 @@ msgstr "Оновлення налаштувань" msgid "Error configuring app: {error}" msgstr "Помилка налаштування застосунку: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -7273,20 +7301,20 @@ msgstr "" "різними застосунками для доступу до інтернету через мережу Tor. Цензурування " "постачальником послуг інтернету може бути обійдене за допомогою мостів." -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "Проксі Tor" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "Проксі Tor Socks" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Доступ за адресою {url} на tcp{kind} через Tor" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Підтвердити використання Tor можна за посиланням {url} на tcp{kind}" @@ -7447,21 +7475,21 @@ msgstr "" "автоматично о 02:00, що призводить до короткочасної недоступності всіх " "застосунків." -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "Оновлення ПЗ" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox оновлено" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "Не можливо запустити оновлення дистрибутиву" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " @@ -7472,11 +7500,11 @@ msgstr "" "місця. Оновлення дистрибутива буде повторено через 24 години, якщо його " "увімкнено." -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "Оновлення дистрибутиву розпочато" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -7650,44 +7678,29 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "Тестувати оновлення дистрибутиву зараз" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "Помилка під час налаштування автоматичних оновлень: {error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "Дозволено автоматичні оновлення" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "Вимкнено автоматичні оновлення" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "Дозволено оновлення дистрибутиву" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "Вимкнено оновлення дистрибутиву" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "Процес оновлення розпочато." -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "Не вдалося розпочати оновлення." -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "Оновлення частих можливостей активовано." -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "Запуск тесту оновлення дистрибутиву." -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " @@ -7698,7 +7711,7 @@ msgstr "" "застосунки також вимагають, щоб обліковий запис був частиною групи, щоб " "отримати авторизований доступ до застосунку." -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -7710,25 +7723,25 @@ msgstr "" "користувачі з групи admin можуть змінювати застосунки або системні " "налаштування." -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "Користувачі і групи" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "Доступ до всіх сервісів і налаштувань системи" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "Перевірка запису LDAP \"{search_item}\"" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "Перевірте nslcd конфігурацію \"{key} {value}\"" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "Перевірте nsswitch конфігурацію \"{database}\"" @@ -7737,33 +7750,12 @@ msgstr "Перевірте nsswitch конфігурацію \"{database}\"" msgid "Username is taken or is reserved." msgstr "Імʼя користувача зайняте або зарезервоване." -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "Уведіть коректне імʼя користувача." - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -"Обовʼязково. 150 знаків, не більше. Лише англійські букви, цифри і @/./-/_." -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "Пароль для авторизації" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" -"Уведіть пароль для користувача \"{user}\", щоб авторизувати зміни облікового " -"запису." - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "Неправильний пароль." - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7777,21 +7769,47 @@ msgstr "" "входити в усі сервіси. Вони також можуть входити в систему через SSH і мати " "адміністративні права (sudo)." -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "Уведіть коректне імʼя користувача." + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" +"Обовʼязково. 150 знаків, не більше. Лише англійські букви, цифри і @/./-/_." + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "Пароль для авторизації" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" +"Уведіть пароль для користувача \"{user}\", щоб авторизувати зміни облікового " +"запису." + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "Неправильний пароль." + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Не вдалося створити користувача LDAP: {error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Не вдалося додати нового користувача до групи {group}: {error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "Ключі SSH для авторизації" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7801,36 +7819,36 @@ msgstr "" "систему без використання пароля. Ви можете вказати декілька ключів, один на " "кожен рядок. Порожні рядки і рядки, що починаються на # іґноруються." -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "Не вдалося перейменувати користувача LDAP." -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "Не вдалося вилучити користувача з групи." -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "Не вдалося додати користувача до групи." -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "Не можливо задати ключі SSH." -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "Не вдалося змінити стан користувача." -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "Не вдалося змінити пароль користувача LDAP." -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Не вдалося додати нового користувача до адмінської групи: {error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "Обліковий запис користувача створено, Ви ввійшли в систему" @@ -8367,7 +8385,7 @@ msgstr "" "переглядати сайт або блог WordPress. Увімкнути тільки після виконання " "початкового налаштування WordPress." -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -8389,7 +8407,7 @@ msgstr "" "календарного перегляду. Окремими світлинами можна ділитися з іншими, " "надіславши пряме посилання." -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -8400,11 +8418,11 @@ msgstr "" "Для додаткових користувачів потрібно створити облікові записи і в " "{box_name}, і в Zoph з тим же іменем користувача." -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "Zoph" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "Упорядник світлин" @@ -8457,92 +8475,77 @@ msgstr "Очікування запуску: {name}" msgid "Finished: {name}" msgstr "Завершено: {name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "Пакунок {package_expression} недоступний для встановлення" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "Пакунок {package_name} має останню версію ({latest_version})" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "встановлення" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "завантаження" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "зміна медія" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "файл конфіґурації: {file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "Час очікування менеджера пакунків" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "Встановлення застосунку" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "Оновлення застосунку" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "Помилка встановлення застосунку: {string} {details}" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "Помилка оновлення застосунку: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "Помилка встановлення застосунку: {error}" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "Помилка оновлення застосунку: {error}" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "Застосунок встановлено." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "Застосунок оновлено" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "Видалення застосунку" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "Помилка видалення застосунку: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "Помилка видалення застосунку: {error}" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "Застосунок видалено." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "Оновлення пакунків застосунків" @@ -8635,10 +8638,6 @@ msgstr "Застосунки" msgid " System" msgstr " Система" -#: templates/base.html:131 -msgid "System" -msgstr "Система" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "Змінити пароль" @@ -8935,11 +8934,11 @@ msgstr "" "Усі дані програми та налаштування буде втрачено назавжди. Застосунок можна " "встановити начисто ще раз." -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "Налаштування не змінено" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "перед видаленням {app_id}" @@ -8948,6 +8947,37 @@ msgstr "перед видаленням {app_id}" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "Налаштування зрізів сховища оновлено" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "Помилка дії: {0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "Дозволено автоматичні оновлення" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "Вимкнено автоматичні оновлення" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "Дозволено оновлення дистрибутиву" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "Вимкнено оновлення дистрибутиву" + +#, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Помилка встановлення застосунку: {string} {details}" + +#, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Помилка оновлення застосунку: {string} {details}" + +#, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Помилка видалення застосунку: {string} {details}" + #~ msgid "Page source" #~ msgstr "Джерело сторінки" diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po index 448c5e147..c03cb419b 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2021-07-28 08:34+0000\n" "Last-Translator: bruh \n" "Language-Team: Vietnamese Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3765,19 +3789,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -4256,11 +4280,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4897,7 +4916,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -5113,15 +5132,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5140,14 +5159,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5158,15 +5177,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5997,7 +6016,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -6065,33 +6084,34 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "Đã cập nhật thiết lập." -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -6107,7 +6127,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -6182,121 +6202,121 @@ msgstr "" "của bạn. Bạn có thể xem phương tiện lưu trữ hiện đang sử dụng, gắn và bỏ gắn " "phương tiện có thể rút ra, mở rộng phân vùng root, v.v." -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "Thiết bị này đã đang bỏ gắn rồi." -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "Đang thử bỏ gắn một thiết bị đang bận." -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "Thiết bị này đã được gắn rồi." -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "Thiết bị này chưa được gắn." -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "Thiết bị này được một người dùng khác gắn." -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6401,9 +6421,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6438,7 +6457,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6583,7 +6602,7 @@ msgstr "Đã xảy ra lỗi trong khi thiết lập." msgid "Error configuring app: {error}" msgstr "Lỗi khi cài đặt ứng dụng: {error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6592,20 +6611,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6744,32 +6763,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6916,51 +6935,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6968,25 +6970,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6995,30 +6997,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7027,57 +7011,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7559,7 +7566,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7572,7 +7579,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7580,11 +7587,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7634,104 +7641,86 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "Lỗi khi cài đặt ứng dụng: {string} {details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "Lỗi khi cài đặt ứng dụng: {string} {details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "Lỗi khi cài đặt ứng dụng: {error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "Lỗi khi cài đặt ứng dụng: {error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "Ứng dụng đã được cài đặt." -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Error installing application: {error}" msgid "Uninstalling app" msgstr "Lỗi khi cài đặt ứng dụng: {error}" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "Lỗi khi cài đặt ứng dụng: {string} {details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "Lỗi khi cài đặt ứng dụng: {error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "Ứng dụng đã được cài đặt." -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7813,10 +7802,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -8093,11 +8078,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -8106,6 +8091,21 @@ msgstr "" msgid "Gujarati" msgstr "" +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "Lỗi khi cài đặt ứng dụng: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "Lỗi khi cài đặt ứng dụng: {string} {details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "Lỗi khi cài đặt ứng dụng: {string} {details}" + #~ msgid "Page source" #~ msgstr "Nguồn của trang" diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index ece3474ca..6e7193198 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2024-01-31 05:01+0000\n" "Last-Translator: 大王叫我来巡山 \n" @@ -25,31 +25,31 @@ msgstr "" msgid "Static configuration {etc_path} is setup properly" msgstr "" -#: context_processors.py:23 views.py:95 +#: context_processors.py:23 views.py:116 msgid "FreedomBox" msgstr "FreedomBox" -#: daemon.py:105 +#: daemon.py:122 #, python-brace-format msgid "Service {service_name} is running" msgstr "服务{service_name}正在运行" -#: daemon.py:164 +#: daemon.py:218 #, python-brace-format msgid "Listening on {kind} port {listen_address}:{port}" msgstr "正在侦听 {kind} 端口 {listen_address}:{port}" -#: daemon.py:167 +#: daemon.py:221 #, python-brace-format msgid "Listening on {kind} port {port}" msgstr "正在侦听 {kind} 端口 {port}" -#: daemon.py:236 +#: daemon.py:291 #, python-brace-format msgid "Connect to {host}:{port}" msgstr "连接到主机 {host}:{port}" -#: daemon.py:240 +#: daemon.py:299 #, python-brace-format msgid "Cannot connect to {host}:{port}" msgstr "不能连接到主机 {host}:{port}" @@ -98,7 +98,32 @@ msgstr "此 web 管理界面的语言" msgid "Use the language preference set in the browser" msgstr "使用浏览器中设置的语言首选项" -#: middleware.py:130 +#: menu.py:106 +#, fuzzy +#| msgid "Public Visibility" +msgid "Visibility" +msgstr "公开可见性" + +#: menu.py:108 +msgid "Data" +msgstr "" + +#: menu.py:110 templates/base.html:131 +msgid "System" +msgstr "系统" + +#: menu.py:112 modules/networks/templates/connection_show.html:259 +#: modules/security/__init__.py:35 +msgid "Security" +msgstr "安全" + +#: menu.py:114 +#, fuzzy +#| msgid "Server Administration" +msgid "Administration" +msgstr "服务器管理" + +#: middleware.py:131 msgid "System is possibly under heavy load. Please retry later." msgstr "" @@ -115,12 +140,12 @@ msgstr "Web 服务器" msgid "{box_name} Web Interface (Plinth)" msgstr "{box_name} Web 界面(Plinth)" -#: modules/apache/components.py:154 +#: modules/apache/components.py:159 #, python-brace-format msgid "Access URL {url} on tcp{kind}" msgstr "在 tcp {kind} 访问 URL {url}" -#: modules/apache/components.py:157 +#: modules/apache/components.py:162 #, python-brace-format msgid "Access URL {url}" msgstr "访问 URL {url}" @@ -144,7 +169,7 @@ msgstr "" msgid "Service Discovery" msgstr "服务发现" -#: modules/avahi/__init__.py:60 +#: modules/avahi/__init__.py:61 msgid "Local Network Domain" msgstr "本地网络领域" @@ -152,28 +177,28 @@ msgstr "本地网络领域" msgid "Backups allows creating and managing backup archives." msgstr "备份允许创建和管理备份存档。" -#: modules/backups/__init__.py:44 modules/backups/__init__.py:167 -#: modules/backups/__init__.py:212 +#: modules/backups/__init__.py:44 modules/backups/__init__.py:168 +#: modules/backups/__init__.py:213 msgid "Backups" msgstr "备份" -#: modules/backups/__init__.py:164 +#: modules/backups/__init__.py:165 msgid "" "Enable an automatic backup schedule for data safety. Prefer an encrypted " "remote backup location or an extra attached disk." msgstr "为数据安全启用自动备份计划,最好使用加密的远程备份位置或附加的磁盘。" -#: modules/backups/__init__.py:170 +#: modules/backups/__init__.py:171 msgid "Enable a Backup Schedule" msgstr "启用备份计划" -#: modules/backups/__init__.py:174 modules/backups/__init__.py:221 -#: modules/privacy/__init__.py:76 modules/storage/__init__.py:314 +#: modules/backups/__init__.py:175 modules/backups/__init__.py:222 +#: modules/privacy/__init__.py:77 modules/storage/__init__.py:315 #, python-brace-format msgid "Go to {app_name}" msgstr "转到 {app_name}" -#: modules/backups/__init__.py:209 +#: modules/backups/__init__.py:210 #, python-brace-format msgid "" "A scheduled backup failed. Past {error_count} attempts for backup did not " @@ -181,7 +206,7 @@ msgid "" msgstr "" "定时备份失败,尝试{error_count}次备份未成功。最后的错误是:{error_message}" -#: modules/backups/__init__.py:217 +#: modules/backups/__init__.py:218 msgid "Error During Backup" msgstr "备份时出错" @@ -414,7 +439,7 @@ msgstr "存储库的路径为空或已有备份。" msgid "Existing repository is not encrypted." msgstr "现有存储库未加密。" -#: modules/backups/repository.py:335 +#: modules/backups/repository.py:337 #, python-brace-format msgid "{box_name} storage" msgstr "{box_name} 存储" @@ -783,7 +808,7 @@ msgid "Permissions for anonymous users, who have not provided a password." msgstr "未提供密码的匿名用户的权限。" #: modules/bepasty/forms.py:27 modules/bepasty/templates/bepasty.html:30 -#: modules/users/forms.py:110 modules/users/forms.py:233 +#: modules/users/forms.py:103 msgid "Permissions" msgstr "许可" @@ -860,8 +885,9 @@ msgstr "管理员" #: modules/bepasty/views.py:88 modules/diagnostics/views.py:52 #: modules/searx/views.py:35 modules/searx/views.py:46 -#: modules/security/views.py:56 modules/tor/views.py:73 -#: modules/torproxy/views.py:71 modules/zoph/views.py:74 +#: modules/security/views.py:56 modules/snapshot/views.py:158 +#: modules/tor/views.py:73 modules/torproxy/views.py:71 +#: modules/upgrades/views.py:83 modules/zoph/views.py:74 msgid "Configuration updated." msgstr "配置已更新。" @@ -949,7 +975,7 @@ msgstr "刷新 IP 地址和域" #: modules/bind/views.py:61 modules/config/views.py:98 #: modules/coturn/views.py:40 modules/deluge/views.py:35 #: modules/dynamicdns/views.py:78 modules/ejabberd/views.py:95 -#: modules/email/views.py:45 modules/matrixsynapse/views.py:146 +#: modules/email/views.py:45 modules/matrixsynapse/views.py:149 #: modules/minetest/views.py:55 modules/mumble/views.py:37 #: modules/pagekite/forms.py:74 modules/privacy/views.py:36 #: modules/quassel/views.py:29 modules/roundcube/views.py:32 @@ -1135,7 +1161,7 @@ msgstr "常规配置" msgid "Configure" msgstr "配置" -#: modules/config/__init__.py:62 modules/config/forms.py:68 +#: modules/config/__init__.py:63 modules/config/forms.py:68 #: modules/dynamicdns/forms.py:82 modules/names/templates/names.html:16 msgid "Domain Name" msgstr "域名" @@ -1331,7 +1357,7 @@ msgstr "网络时间服务是与 Internet 上的服务器同步系统时间的 msgid "Date & Time" msgstr "日期与时间" -#: modules/datetime/__init__.py:122 +#: modules/datetime/__init__.py:123 msgid "Time synchronized to NTP server" msgstr "时间同步到NTP服务器" @@ -1388,54 +1414,54 @@ msgstr "下载目录" msgid "Bittorrent client written in Python/PyGTK" msgstr "用Python/PyGTK编写的Bittorrent客户端" -#: modules/diagnostics/__init__.py:27 +#: modules/diagnostics/__init__.py:28 msgid "" "The system diagnostic test will run a number of checks on your system to " "confirm that applications and services are working as expected." msgstr "" "系统诊断将运行测试程序检查您的系统以确认应用程序和服务正在按预期方式运行。" -#: modules/diagnostics/__init__.py:51 modules/diagnostics/__init__.py:236 +#: modules/diagnostics/__init__.py:52 modules/diagnostics/__init__.py:240 msgid "Diagnostics" msgstr "诊断程序" -#: modules/diagnostics/__init__.py:95 +#: modules/diagnostics/__init__.py:98 msgid "passed" msgstr "通过了" -#: modules/diagnostics/__init__.py:96 modules/networks/views.py:50 +#: modules/diagnostics/__init__.py:99 modules/networks/views.py:50 msgid "failed" msgstr "失败" -#: modules/diagnostics/__init__.py:97 +#: modules/diagnostics/__init__.py:100 msgid "error" msgstr "错误" -#: modules/diagnostics/__init__.py:98 +#: modules/diagnostics/__init__.py:101 msgid "warning" msgstr "警告" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: modules/diagnostics/__init__.py:202 +#: modules/diagnostics/__init__.py:206 msgid "MiB" msgstr "MiB" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: modules/diagnostics/__init__.py:207 +#: modules/diagnostics/__init__.py:211 msgid "GiB" msgstr "GiB" -#: modules/diagnostics/__init__.py:214 +#: modules/diagnostics/__init__.py:218 msgid "You should disable some apps to reduce memory usage." msgstr "你应该禁用一些应用程序以减少内存的使用。" -#: modules/diagnostics/__init__.py:219 +#: modules/diagnostics/__init__.py:223 msgid "You should not install any new apps on this system." msgstr "你不应该在这个系统上安装任何新的应用程序。" -#: modules/diagnostics/__init__.py:231 +#: modules/diagnostics/__init__.py:235 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " @@ -1444,24 +1470,24 @@ msgstr "" "系统内存不足:已使用 {percent_used},{memory_available} " "{memory_available_unit}可用。{advice_message}" -#: modules/diagnostics/__init__.py:233 +#: modules/diagnostics/__init__.py:237 msgid "Low Memory" msgstr "低内存" -#: modules/diagnostics/__init__.py:264 +#: modules/diagnostics/__init__.py:268 msgid "Running diagnostics" msgstr "运行诊断程序" -#: modules/diagnostics/__init__.py:307 +#: modules/diagnostics/__init__.py:311 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: modules/diagnostics/__init__.py:308 +#: modules/diagnostics/__init__.py:312 msgid "Diagnostics results" msgstr "诊断结果" -#: modules/diagnostics/__init__.py:313 +#: modules/diagnostics/__init__.py:317 msgid "Go to diagnostics results" msgstr "转到诊断结果" @@ -1540,7 +1566,7 @@ msgstr "测试" msgid "Result" msgstr "结果" -#: modules/diagnostics/views.py:107 +#: modules/diagnostics/views.py:111 msgid "Diagnostic Test" msgstr "诊断测试" @@ -1586,7 +1612,7 @@ msgstr "" msgid "Dynamic DNS Client" msgstr "动态 DNS 客户端" -#: modules/dynamicdns/__init__.py:74 +#: modules/dynamicdns/__init__.py:75 msgid "Dynamic Domain Name" msgstr "动态域名" @@ -1684,7 +1710,7 @@ msgid "Use HTTP basic authentication" msgstr "使用 HTTP 基本身份验证" #: modules/dynamicdns/forms.py:88 modules/networks/forms.py:207 -#: modules/users/forms.py:67 +#: modules/users/forms.py:129 msgid "Username" msgstr "用户名" @@ -2070,29 +2096,29 @@ msgstr "" msgid "Firewall" msgstr "防火墙" -#: modules/firewall/__init__.py:271 +#: modules/firewall/__init__.py:273 msgid "Default zone is external" msgstr "默认区域是外部的" -#: modules/firewall/__init__.py:280 +#: modules/firewall/__init__.py:283 msgid "Firewall backend is nftables" msgstr "" -#: modules/firewall/__init__.py:293 +#: modules/firewall/__init__.py:297 msgid "Direct passthrough rules exist" msgstr "" -#: modules/firewall/components.py:136 +#: modules/firewall/components.py:139 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "内网端口 {name}({details})可用" -#: modules/firewall/components.py:147 +#: modules/firewall/components.py:153 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "外网端口 {name}({details})可用" -#: modules/firewall/components.py:153 +#: modules/firewall/components.py:159 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -2212,11 +2238,11 @@ msgstr "" msgid "Read-write access to Git repositories" msgstr "" -#: modules/gitweb/__init__.py:50 modules/gitweb/manifest.py:11 +#: modules/gitweb/__init__.py:48 modules/gitweb/manifest.py:11 msgid "Gitweb" msgstr "" -#: modules/gitweb/__init__.py:51 +#: modules/gitweb/__init__.py:49 msgid "Simple Git Hosting" msgstr "" @@ -2681,7 +2707,7 @@ msgid "I2P" msgstr "" #: modules/i2p/__init__.py:53 modules/tor/__init__.py:63 -#: modules/torproxy/__init__.py:56 +#: modules/torproxy/__init__.py:57 msgid "Anonymity Network" msgstr "匿名网络" @@ -3051,7 +3077,7 @@ msgstr "Let's Encrypt" msgid "Certificates" msgstr "证书" -#: modules/letsencrypt/__init__.py:104 +#: modules/letsencrypt/__init__.py:105 msgid "Cannot test: No domains are configured." msgstr "" @@ -3124,28 +3150,31 @@ msgid "" msgstr "成功吊销了域名 {domain} 的证书。可能需要一会儿才能生效。" #: modules/letsencrypt/views.py:46 -#, python-brace-format -msgid "Failed to revoke certificate for domain {domain}: {error}" +#, fuzzy, python-brace-format +#| msgid "Failed to revoke certificate for domain {domain}: {error}" +msgid "Failed to revoke certificate for domain {domain}" msgstr "无法为 {domain} 撤销证书:{error}" -#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:76 +#: modules/letsencrypt/views.py:59 modules/letsencrypt/views.py:77 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" msgstr "为域名 {domain} 成功获得证书" -#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:81 -#, python-brace-format -msgid "Failed to obtain certificate for domain {domain}: {error}" +#: modules/letsencrypt/views.py:64 modules/letsencrypt/views.py:82 +#, fuzzy, python-brace-format +#| msgid "Failed to obtain certificate for domain {domain}: {error}" +msgid "Failed to obtain certificate for domain {domain}" msgstr "未能为域名 {domain} 获取证书:{error}" -#: modules/letsencrypt/views.py:93 +#: modules/letsencrypt/views.py:95 #, python-brace-format msgid "Certificate successfully deleted for domain {domain}" msgstr "成功删除域名 {domain} 的证书" -#: modules/letsencrypt/views.py:98 -#, python-brace-format -msgid "Failed to delete certificate for domain {domain}: {error}" +#: modules/letsencrypt/views.py:100 +#, fuzzy, python-brace-format +#| msgid "Failed to delete certificate for domain {domain}: {error}" +msgid "Failed to delete certificate for domain {domain}" msgstr "删除 {domain} 域名证书失败:{error}" #: modules/matrixsynapse/__init__.py:26 @@ -3296,7 +3325,7 @@ msgid "" "go to Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3660,19 +3689,19 @@ msgstr "安全 Shell" msgid "Services" msgstr "服务" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "网络" @@ -4161,11 +4190,6 @@ msgstr "IPv6" msgid "This connection is not active." msgstr "此连接未处于激活状态。" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "安全" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4819,7 +4843,7 @@ msgstr "PageKite" msgid "Public Visibility" msgstr "公开可见性" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "PageKite 域名" @@ -5042,15 +5066,15 @@ msgstr "现在关闭" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "隐私" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -5069,7 +5093,7 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " @@ -5078,7 +5102,7 @@ msgstr "" "Privoxy 是一个非缓存 Web 代理,具有高级过滤功能,用于增强隐私,修改网页数据" "和 HTTP 标头,控制访问,以及删除广告和其他令人讨厌的互联网垃圾。 " -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5093,15 +5117,15 @@ msgstr "" "config.privoxy.org\">http://config.privoxy.org/ 或 http://p.p 中查看其配置详细信息和文档。" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "Privoxy" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "Web 代理" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "在 tcp{kind} 上通过 {proxy} 访问 {url}" @@ -5954,7 +5978,7 @@ msgstr "日期" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "删除快照" @@ -6024,33 +6048,36 @@ msgstr "管理快照" msgid "Created snapshot." msgstr "创建快照。" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "存储快照配置已更新" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "配置已更新。" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "操作错误:{0} [{1}] [{2}]" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "已删除选定的快照" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +#, fuzzy +#| msgid "Deleting LDAP user failed." +msgid "Deleting snapshot failed." +msgstr "删除 LDAP 用户失败。" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "回滚到快照 #{number}。" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "系统需要重启以完成完全回滚。" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "回滚到快照" @@ -6066,7 +6093,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "安全 Shell(SSH)服务器" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "使用 Secure Shell(SSH 远程登录" @@ -6138,121 +6165,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "存储" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "{disk_size:.1f} 字节" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "{disk_size:.1f} KiB" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "{disk_size:.1f} MiB" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "{disk_size:.1f} GiB" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "{disk_size:.1f} TiB" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "已经在卸载设备。" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "已挂载此设备。" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "此设备未挂载。" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "只读根文件系统" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "转到电源" @@ -6361,9 +6388,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6398,7 +6424,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6550,7 +6576,7 @@ msgstr "更新配置" msgid "Error configuring app: {error}" msgstr "配置应用出错:{error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6559,20 +6585,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "Tor 代理" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "在 tcp{kind} 上通过 Tor 访问 {url}" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "确认使用 Tor 通过 tcp{kind} 访问 {url}" @@ -6709,32 +6735,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "软件更新" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "FreedomBox 已更新" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "已启动分发更新" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6888,51 +6914,36 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "立即测试分发升级" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +#, fuzzy +#| msgid "Error when configuring unattended-upgrades: {error}" +msgid "Error when configuring unattended-upgrades" msgstr "配置无人参与升级时错误:{error}" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "已启用自动升级" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "已禁用自动升级" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "已启用分发升级" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "已禁用分发升级" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "升级过程开始。" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "开始升级失败。" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "启动分发升级测试。" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6940,25 +6951,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "用户和组" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "请检查 LDAP 条目“{search_item}”" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6967,30 +6978,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "用户名已经占用或保留。" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "输入有效的用户名。" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "验证密码" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "密码无效。" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7002,21 +6995,44 @@ msgstr "" "单点登录的服务。

管理员(admin)组中的用户将能够登录所有服务。他们还可" "以通过 SSH 登录到系统并具有管理权限(sudo)。" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "输入有效的用户名。" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "验证密码" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "密码无效。" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "创建 LDAP 用户失败:{error}" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "未能将新用户添加到 {group} 组:{error}" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7025,36 +7041,36 @@ msgstr "" "设置 SSH 公钥将允许此用户安全地登录到系统不使用密码。您可以输入多个密钥,每行" "一个。将忽略空行和以 # 开头的行。" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "重命名 LDAP 用户失败。" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "无法从组中删除用户。" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "无法将用户添加到组。" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "不能设置 SSH 密钥。" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "更改用户状态失败。" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "更改 LDAP 用户密码失败。" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "未能将新用户添加到管理员组:{error}" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "用户帐户已创建,您现在可以登录" @@ -7538,7 +7554,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7551,7 +7567,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7559,11 +7575,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7612,92 +7628,77 @@ msgstr "" msgid "Finished: {name}" msgstr "已完成:{name}" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "安装" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "下载中" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "媒体改变" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "配置文件:{file}" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "安装应用中" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, python-brace-format -msgid "Error installing app: {string} {details}" -msgstr "安装应用出错:{string} {details}" - -#: setup.py:74 -#, python-brace-format -msgid "Error updating app: {string} {details}" -msgstr "更新应用出错:{string} {details}" - -#: setup.py:80 +#: setup.py:75 #, python-brace-format msgid "Error installing app: {error}" msgstr "安装应用出错:{error}" -#: setup.py:83 +#: setup.py:78 #, python-brace-format msgid "Error updating app: {error}" msgstr "更新应用出错:{error}" -#: setup.py:87 +#: setup.py:82 msgid "App installed." msgstr "应用已安装。" -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "应用已更新" -#: setup.py:106 +#: setup.py:101 msgid "Uninstalling app" msgstr "卸载应用" -#: setup.py:124 -#, python-brace-format -msgid "Error uninstalling app: {string} {details}" -msgstr "卸载应用出错:{string} {details}" - -#: setup.py:130 +#: setup.py:117 #, python-brace-format msgid "Error uninstalling app: {error}" msgstr "卸载应用出错:{error}" -#: setup.py:133 +#: setup.py:120 msgid "App uninstalled." msgstr "应用已卸载。" -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "更新软件包中" @@ -7786,10 +7787,6 @@ msgstr "应用程序" msgid " System" msgstr " 系统" -#: templates/base.html:131 -msgid "System" -msgstr "系统" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "更改密码" @@ -8064,11 +8061,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "设置未改变" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -8077,6 +8074,37 @@ msgstr "" msgid "Gujarati" msgstr "古吉拉特语" +#~ msgid "Storage snapshots configuration updated" +#~ msgstr "存储快照配置已更新" + +#, python-brace-format +#~ msgid "Action error: {0} [{1}] [{2}]" +#~ msgstr "操作错误:{0} [{1}] [{2}]" + +#~ msgid "Automatic upgrades enabled" +#~ msgstr "已启用自动升级" + +#~ msgid "Automatic upgrades disabled" +#~ msgstr "已禁用自动升级" + +#~ msgid "Distribution upgrade enabled" +#~ msgstr "已启用分发升级" + +#~ msgid "Distribution upgrade disabled" +#~ msgstr "已禁用分发升级" + +#, python-brace-format +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "安装应用出错:{string} {details}" + +#, python-brace-format +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "更新应用出错:{string} {details}" + +#, python-brace-format +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "卸载应用出错:{string} {details}" + #~ msgid "Page source" #~ msgstr "来源页面" diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index 791202e34..ea533e548 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: 2024-02-12 20:35-0500\n" +"POT-Creation-Date: 2024-03-25 20:44-0400\n" "PO-Revision-Date: 2021-12-23 12:50+0000\n" "Last-Translator: pesder \n" "Language-Team: Chinese (Traditional) Let's Encrypt to obtain one." msgstr "" -#: modules/matrixsynapse/views.py:137 +#: modules/matrixsynapse/views.py:140 msgid "Registration configuration cannot be updated when app is disabled." msgstr "" @@ -3622,19 +3646,19 @@ msgstr "" msgid "Services" msgstr "" -#: modules/networks/__init__.py:35 +#: modules/networks/__init__.py:36 msgid "" "Configure network devices. Connect to the Internet via Ethernet, Wi-Fi or " "PPPoE. Share that connection with other devices on the network." msgstr "" -#: modules/networks/__init__.py:37 +#: modules/networks/__init__.py:38 msgid "" "Devices administered through other methods may not be available for " "configuration here." msgstr "" -#: modules/networks/__init__.py:58 +#: modules/networks/__init__.py:59 msgid "Networks" msgstr "" @@ -4113,11 +4137,6 @@ msgstr "" msgid "This connection is not active." msgstr "" -#: modules/networks/templates/connection_show.html:259 -#: modules/security/__init__.py:35 -msgid "Security" -msgstr "" - #: modules/networks/templates/connection_show.html:264 #: modules/networks/templates/connection_show.html:284 #: modules/networks/templates/connection_show.html:303 @@ -4754,7 +4773,7 @@ msgstr "" msgid "Public Visibility" msgstr "" -#: modules/pagekite/__init__.py:73 +#: modules/pagekite/__init__.py:74 msgid "PageKite Domain" msgstr "" @@ -4970,15 +4989,15 @@ msgstr "" msgid "Manage system-wide privacy settings." msgstr "" -#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:69 +#: modules/privacy/__init__.py:32 modules/privacy/__init__.py:70 msgid "Privacy" msgstr "" -#: modules/privacy/__init__.py:67 +#: modules/privacy/__init__.py:68 msgid "Please update privacy settings to match your preferences." msgstr "" -#: modules/privacy/__init__.py:72 +#: modules/privacy/__init__.py:73 msgid "Review privacy setting" msgstr "" @@ -4997,14 +5016,14 @@ msgid "" "network for additional anonymity if Tor app is enabled." msgstr "" -#: modules/privoxy/__init__.py:24 +#: modules/privoxy/__init__.py:25 msgid "" "Privoxy is a non-caching web proxy with advanced filtering capabilities for " "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk. " msgstr "" -#: modules/privoxy/__init__.py:29 +#: modules/privoxy/__init__.py:30 #, python-brace-format msgid "" "You can use Privoxy by modifying your browser proxy settings to your " @@ -5015,15 +5034,15 @@ msgid "" "p\">http://p.p." msgstr "" -#: modules/privoxy/__init__.py:52 +#: modules/privoxy/__init__.py:53 msgid "Privoxy" msgstr "" -#: modules/privoxy/__init__.py:53 +#: modules/privoxy/__init__.py:54 msgid "Web Proxy" msgstr "" -#: modules/privoxy/__init__.py:117 +#: modules/privoxy/__init__.py:118 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" msgstr "" @@ -5854,7 +5873,7 @@ msgstr "" #: modules/snapshot/templates/snapshot_delete_selected.html:42 #: modules/snapshot/templates/snapshot_manage.html:20 -#: modules/snapshot/views.py:201 +#: modules/snapshot/views.py:197 msgid "Delete Snapshots" msgstr "" @@ -5922,33 +5941,34 @@ msgstr "" msgid "Created snapshot." msgstr "" -#: modules/snapshot/views.py:158 -msgid "Storage snapshots configuration updated" -msgstr "" +#: modules/snapshot/views.py:160 +#, fuzzy +#| msgid "Configuration updated." +msgid "Configuration update failed." +msgstr "配置已更新。" -#: modules/snapshot/views.py:162 -#, python-brace-format -msgid "Action error: {0} [{1}] [{2}]" -msgstr "" - -#: modules/snapshot/views.py:188 +#: modules/snapshot/views.py:184 msgid "Deleted selected snapshots" msgstr "" -#: modules/snapshot/views.py:193 +#: modules/snapshot/views.py:186 +msgid "Deleting snapshot failed." +msgstr "" + +#: modules/snapshot/views.py:189 msgid "Snapshot is currently in use. Please try again later." msgstr "" -#: modules/snapshot/views.py:212 +#: modules/snapshot/views.py:208 #, python-brace-format msgid "Rolled back to snapshot #{number}." msgstr "" -#: modules/snapshot/views.py:215 +#: modules/snapshot/views.py:211 msgid "The system must be restarted to complete the rollback." msgstr "" -#: modules/snapshot/views.py:225 +#: modules/snapshot/views.py:221 msgid "Rollback to Snapshot" msgstr "" @@ -5964,7 +5984,7 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: modules/ssh/__init__.py:73 +#: modules/ssh/__init__.py:75 msgid "Remotely login using Secure Shell (SSH)" msgstr "" @@ -6036,121 +6056,121 @@ msgid "" "media, expand the root partition etc." msgstr "" -#: modules/storage/__init__.py:45 modules/storage/__init__.py:307 -#: modules/storage/__init__.py:338 modules/storage/__init__.py:384 +#: modules/storage/__init__.py:45 modules/storage/__init__.py:308 +#: modules/storage/__init__.py:339 modules/storage/__init__.py:385 msgid "Storage" msgstr "" -#: modules/storage/__init__.py:215 +#: modules/storage/__init__.py:216 #, python-brace-format msgid "{disk_size:.1f} bytes" msgstr "" -#: modules/storage/__init__.py:219 +#: modules/storage/__init__.py:220 #, python-brace-format msgid "{disk_size:.1f} KiB" msgstr "" -#: modules/storage/__init__.py:223 +#: modules/storage/__init__.py:224 #, python-brace-format msgid "{disk_size:.1f} MiB" msgstr "" -#: modules/storage/__init__.py:227 +#: modules/storage/__init__.py:228 #, python-brace-format msgid "{disk_size:.1f} GiB" msgstr "" -#: modules/storage/__init__.py:230 +#: modules/storage/__init__.py:231 #, python-brace-format msgid "{disk_size:.1f} TiB" msgstr "" -#: modules/storage/__init__.py:242 +#: modules/storage/__init__.py:243 msgid "The operation failed." msgstr "" -#: modules/storage/__init__.py:244 +#: modules/storage/__init__.py:245 msgid "The operation was cancelled." msgstr "" -#: modules/storage/__init__.py:246 +#: modules/storage/__init__.py:247 msgid "The device is already unmounting." msgstr "" -#: modules/storage/__init__.py:248 +#: modules/storage/__init__.py:249 msgid "The operation is not supported due to missing driver/tool support." msgstr "" -#: modules/storage/__init__.py:251 +#: modules/storage/__init__.py:252 msgid "The operation timed out." msgstr "" -#: modules/storage/__init__.py:253 +#: modules/storage/__init__.py:254 msgid "The operation would wake up a disk that is in a deep-sleep state." msgstr "" -#: modules/storage/__init__.py:256 +#: modules/storage/__init__.py:257 msgid "Attempting to unmount a device that is busy." msgstr "" -#: modules/storage/__init__.py:258 +#: modules/storage/__init__.py:259 msgid "The operation has already been cancelled." msgstr "" -#: modules/storage/__init__.py:260 modules/storage/__init__.py:262 -#: modules/storage/__init__.py:264 +#: modules/storage/__init__.py:261 modules/storage/__init__.py:263 +#: modules/storage/__init__.py:265 msgid "Not authorized to perform the requested operation." msgstr "" -#: modules/storage/__init__.py:266 +#: modules/storage/__init__.py:267 msgid "The device is already mounted." msgstr "" -#: modules/storage/__init__.py:268 +#: modules/storage/__init__.py:269 msgid "The device is not mounted." msgstr "" -#: modules/storage/__init__.py:270 +#: modules/storage/__init__.py:271 msgid "Not permitted to use the requested option." msgstr "" -#: modules/storage/__init__.py:272 +#: modules/storage/__init__.py:273 msgid "The device is mounted by another user." msgstr "" -#: modules/storage/__init__.py:302 +#: modules/storage/__init__.py:303 #, no-python-format, python-brace-format msgid "Low space on system partition: {percent_used}% used, {free_space} free." msgstr "" -#: modules/storage/__init__.py:304 +#: modules/storage/__init__.py:305 msgid "Low disk space" msgstr "" -#: modules/storage/__init__.py:332 +#: modules/storage/__init__.py:333 msgid "Disk failure imminent" msgstr "" -#: modules/storage/__init__.py:334 +#: modules/storage/__init__.py:335 #, python-brace-format msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" -#: modules/storage/__init__.py:378 +#: modules/storage/__init__.py:379 #, no-python-format msgid "" "You cannot save configuration changes. Try rebooting the system. If the " "problem persists after a reboot, check the storage device for errors." msgstr "" -#: modules/storage/__init__.py:381 +#: modules/storage/__init__.py:382 msgid "Read-only root filesystem" msgstr "" -#: modules/storage/__init__.py:391 +#: modules/storage/__init__.py:392 msgid "Go to Power" msgstr "" @@ -6255,9 +6275,8 @@ msgstr "" msgid "Device can be safely unplugged." msgstr "" -#: modules/storage/views.py:98 -#, python-brace-format -msgid "Error ejecting device: {error_message}" +#: modules/storage/views.py:93 +msgid "Error ejecting device." msgstr "" #: modules/syncthing/__init__.py:23 @@ -6292,7 +6311,7 @@ msgstr "" msgid "File Synchronization" msgstr "" -#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:28 +#: modules/tor/__init__.py:33 modules/torproxy/__init__.py:29 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -6437,7 +6456,7 @@ msgstr "設置過程中發生錯誤。" msgid "Error configuring app: {error}" msgstr "安裝應用遇到錯誤:{error}" -#: modules/torproxy/__init__.py:35 +#: modules/torproxy/__init__.py:36 #, python-brace-format msgid "" "This app provides a web proxy on your {box_name} for internal networks on " @@ -6446,20 +6465,20 @@ msgid "" "using upstream bridges." msgstr "" -#: modules/torproxy/__init__.py:55 +#: modules/torproxy/__init__.py:56 msgid "Tor Proxy" msgstr "" -#: modules/torproxy/__init__.py:80 +#: modules/torproxy/__init__.py:81 msgid "Tor Socks Proxy" msgstr "" -#: modules/torproxy/__init__.py:140 +#: modules/torproxy/__init__.py:142 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: modules/torproxy/__init__.py:152 +#: modules/torproxy/__init__.py:154 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" @@ -6598,32 +6617,32 @@ msgid "" "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" -#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:125 +#: modules/upgrades/__init__.py:65 modules/upgrades/__init__.py:126 #: modules/upgrades/templates/update-firstboot-progress.html:11 #: modules/upgrades/templates/update-firstboot.html:11 msgid "Software Update" msgstr "" -#: modules/upgrades/__init__.py:128 +#: modules/upgrades/__init__.py:129 msgid "FreedomBox Updated" msgstr "" -#: modules/upgrades/__init__.py:196 +#: modules/upgrades/__init__.py:197 msgid "Could not start distribution update" msgstr "" -#: modules/upgrades/__init__.py:198 +#: modules/upgrades/__init__.py:199 msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB is free. Distribution " "update will be retried after 24 hours, if enabled." msgstr "" -#: modules/upgrades/__init__.py:209 +#: modules/upgrades/__init__.py:210 msgid "Distribution update started" msgstr "" -#: modules/upgrades/__init__.py:211 +#: modules/upgrades/__init__.py:212 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6770,51 +6789,34 @@ msgstr "" msgid "Test distribution upgrade now" msgstr "" -#: modules/upgrades/views.py:71 -#, python-brace-format -msgid "Error when configuring unattended-upgrades: {error}" +#: modules/upgrades/views.py:73 +msgid "Error when configuring unattended-upgrades" msgstr "" -#: modules/upgrades/views.py:75 -msgid "Automatic upgrades enabled" -msgstr "" - -#: modules/upgrades/views.py:78 -msgid "Automatic upgrades disabled" -msgstr "" - -#: modules/upgrades/views.py:86 -msgid "Distribution upgrade enabled" -msgstr "" - -#: modules/upgrades/views.py:89 -msgid "Distribution upgrade disabled" -msgstr "" - -#: modules/upgrades/views.py:126 +#: modules/upgrades/views.py:120 msgid "Upgrade process started." msgstr "" -#: modules/upgrades/views.py:128 +#: modules/upgrades/views.py:122 msgid "Starting upgrade failed." msgstr "" -#: modules/upgrades/views.py:138 +#: modules/upgrades/views.py:132 msgid "Frequent feature updates activated." msgstr "" -#: modules/upgrades/views.py:224 +#: modules/upgrades/views.py:218 msgid "Starting distribution upgrade test." msgstr "" -#: modules/users/__init__.py:32 +#: modules/users/__init__.py:33 msgid "" "Create and manage user accounts. These accounts serve as centralized " "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" -#: modules/users/__init__.py:37 +#: modules/users/__init__.py:38 #, python-brace-format msgid "" "Any user may login to {box_name} web interface to see a list of apps " @@ -6822,25 +6824,25 @@ msgid "" "group may alter apps or system settings." msgstr "" -#: modules/users/__init__.py:58 +#: modules/users/__init__.py:59 msgid "Users and Groups" msgstr "" -#: modules/users/__init__.py:83 +#: modules/users/__init__.py:85 msgid "Access to all services and system settings" msgstr "" -#: modules/users/__init__.py:127 +#: modules/users/__init__.py:129 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: modules/users/__init__.py:141 +#: modules/users/__init__.py:144 #, python-brace-format msgid "Check nslcd config \"{key} {value}\"" msgstr "" -#: modules/users/__init__.py:171 +#: modules/users/__init__.py:174 #, python-brace-format msgid "Check nsswitch config \"{database}\"" msgstr "" @@ -6849,30 +6851,12 @@ msgstr "" msgid "Username is taken or is reserved." msgstr "" -#: modules/users/forms.py:62 -msgid "Enter a valid username." -msgstr "" - -#: modules/users/forms.py:69 +#: modules/users/forms.py:70 msgid "" -"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +"Optional. Used to send emails to reset password and important notifications." msgstr "" -#: modules/users/forms.py:78 -msgid "Authorization Password" -msgstr "" - -#: modules/users/forms.py:85 -#, python-brace-format -msgid "" -"Enter the password for user \"{user}\" to authorize account modifications." -msgstr "" - -#: modules/users/forms.py:94 -msgid "Invalid password." -msgstr "" - -#: modules/users/forms.py:112 +#: modules/users/forms.py:106 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6881,57 +6865,80 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: modules/users/forms.py:155 modules/users/forms.py:375 +#: modules/users/forms.py:124 +msgid "Enter a valid username." +msgstr "" + +#: modules/users/forms.py:131 +msgid "" +"Required. 150 characters or fewer. English letters, digits and @/./-/_ only." +msgstr "" + +#: modules/users/forms.py:140 +msgid "Authorization Password" +msgstr "" + +#: modules/users/forms.py:147 +#, python-brace-format +msgid "" +"Enter the password for user \"{user}\" to authorize account modifications." +msgstr "" + +#: modules/users/forms.py:156 +msgid "Invalid password." +msgstr "" + +#: modules/users/forms.py:212 modules/users/forms.py:417 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: modules/users/forms.py:166 +#: modules/users/forms.py:224 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: modules/users/forms.py:181 +#: modules/users/forms.py:240 msgid "Authorized SSH Keys" msgstr "" -#: modules/users/forms.py:183 +#: modules/users/forms.py:242 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: modules/users/forms.py:263 +#: modules/users/forms.py:298 msgid "Renaming LDAP user failed." msgstr "" -#: modules/users/forms.py:274 +#: modules/users/forms.py:309 msgid "Failed to remove user from group." msgstr "" -#: modules/users/forms.py:284 +#: modules/users/forms.py:319 msgid "Failed to add user to group." msgstr "" -#: modules/users/forms.py:291 +#: modules/users/forms.py:326 msgid "Unable to set SSH keys." msgstr "" -#: modules/users/forms.py:304 +#: modules/users/forms.py:339 msgid "Failed to change user status." msgstr "" -#: modules/users/forms.py:345 +#: modules/users/forms.py:380 msgid "Changing LDAP user password failed." msgstr "" -#: modules/users/forms.py:383 +#: modules/users/forms.py:425 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: modules/users/forms.py:408 +#: modules/users/forms.py:448 msgid "User account created, you are now logged in" msgstr "" @@ -7413,7 +7420,7 @@ msgid "" "WordPress site or blog. Enable only after performing initial WordPress setup." msgstr "" -#: modules/zoph/__init__.py:23 +#: modules/zoph/__init__.py:24 #, python-brace-format msgid "" "Zoph manages your photo collection. Photos are stored on your {box_name}, " @@ -7426,7 +7433,7 @@ msgid "" "shared with others by sending a direct link." msgstr "" -#: modules/zoph/__init__.py:34 +#: modules/zoph/__init__.py:35 #, python-brace-format msgid "" "The {box_name} user who setup Zoph will also become the administrator in " @@ -7434,11 +7441,11 @@ msgid "" "in Zoph with the same user name." msgstr "" -#: modules/zoph/__init__.py:53 modules/zoph/manifest.py:6 +#: modules/zoph/__init__.py:56 modules/zoph/manifest.py:6 msgid "Zoph" msgstr "" -#: modules/zoph/__init__.py:54 +#: modules/zoph/__init__.py:57 msgid "Photo Organizer" msgstr "" @@ -7488,104 +7495,86 @@ msgstr "" msgid "Finished: {name}" msgstr "" -#: package.py:214 +#: package.py:206 #, python-brace-format msgid "Package {package_expression} is not available for install" msgstr "" -#: package.py:231 +#: package.py:226 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" msgstr "" -#: package.py:382 +#: package.py:419 msgid "installing" msgstr "" -#: package.py:384 +#: package.py:421 msgid "downloading" msgstr "" -#: package.py:386 +#: package.py:423 msgid "media change" msgstr "" -#: package.py:388 +#: package.py:425 #, python-brace-format msgid "configuration file: {file}" msgstr "" -#: package.py:416 package.py:441 +#: package.py:453 package.py:478 msgid "Timeout waiting for package manager" msgstr "" -#: setup.py:41 +#: setup.py:39 msgid "Installing app" msgstr "" -#: setup.py:43 +#: setup.py:41 msgid "Updating app" msgstr "" -#: setup.py:70 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error installing app: {string} {details}" -msgstr "安裝過程中遇到錯誤:{string}{details}" - -#: setup.py:74 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error updating app: {string} {details}" -msgstr "安裝過程中遇到錯誤:{string}{details}" - -#: setup.py:80 +#: setup.py:75 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error installing app: {error}" msgstr "安裝應用遇到錯誤:{error}" -#: setup.py:83 +#: setup.py:78 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error updating app: {error}" msgstr "安裝應用遇到錯誤:{error}" -#: setup.py:87 +#: setup.py:82 #, fuzzy #| msgid "Application installed." msgid "App installed." msgstr "應用已完成安裝。" -#: setup.py:89 +#: setup.py:84 msgid "App updated" msgstr "" -#: setup.py:106 +#: setup.py:101 #, fuzzy #| msgid "Error installing application: {error}" msgid "Uninstalling app" msgstr "安裝應用遇到錯誤:{error}" -#: setup.py:124 -#, fuzzy, python-brace-format -#| msgid "Error installing application: {string} {details}" -msgid "Error uninstalling app: {string} {details}" -msgstr "安裝過程中遇到錯誤:{string}{details}" - -#: setup.py:130 +#: setup.py:117 #, fuzzy, python-brace-format #| msgid "Error installing application: {error}" msgid "Error uninstalling app: {error}" msgstr "安裝應用遇到錯誤:{error}" -#: setup.py:133 +#: setup.py:120 #, fuzzy #| msgid "Application installed." msgid "App uninstalled." msgstr "應用已完成安裝。" -#: setup.py:453 +#: setup.py:493 msgid "Updating app packages" msgstr "" @@ -7667,10 +7656,6 @@ msgstr "" msgid " System" msgstr "" -#: templates/base.html:131 -msgid "System" -msgstr "" - #: templates/base.html:166 templates/base.html:167 msgid "Change password" msgstr "" @@ -7944,11 +7929,11 @@ msgid "" "installed freshly again." msgstr "" -#: views.py:242 +#: views.py:268 msgid "Setting unchanged" msgstr "" -#: views.py:479 +#: views.py:502 #, python-brace-format msgid "before uninstall of {app_id}" msgstr "" @@ -7957,6 +7942,21 @@ msgstr "" msgid "Gujarati" msgstr "" +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error installing app: {string} {details}" +#~ msgstr "安裝過程中遇到錯誤:{string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error updating app: {string} {details}" +#~ msgstr "安裝過程中遇到錯誤:{string}{details}" + +#, fuzzy, python-brace-format +#~| msgid "Error installing application: {string} {details}" +#~ msgid "Error uninstalling app: {string} {details}" +#~ msgstr "安裝過程中遇到錯誤:{string}{details}" + #~ msgid "Page source" #~ msgstr "來源頁面" diff --git a/plinth/log.py b/plinth/log.py index 5b5b7974f..69199c5d2 100644 --- a/plinth/log.py +++ b/plinth/log.py @@ -76,7 +76,9 @@ def action_init(): """Initialize logging for action scripts.""" _capture_warnings() - logging.config.dictConfig(get_configuration()) + configuration = get_configuration() + del configuration['handlers']['console']['formatter'] + logging.config.dictConfig(configuration) def init(): diff --git a/plinth/menu.py b/plinth/menu.py index fb1a561fa..a1d50110d 100644 --- a/plinth/menu.py +++ b/plinth/menu.py @@ -3,6 +3,7 @@ from typing import ClassVar from django.urls import reverse_lazy +from django.utils.translation import gettext_lazy as _ from plinth import app @@ -101,3 +102,14 @@ def init(): parent_url_name='index') Menu('menu-system', icon='fa-cog', url_name='system', parent_url_name='index') + + Menu('menu-system-visibility', name=_('Visibility'), icon='fa-cog', + url_name='system:visibility', parent_url_name='system', order=10) + Menu('menu-system-data', name=_('Data'), icon='fa-cog', + url_name='system:data', parent_url_name='system', order=20) + Menu('menu-system-system', name=_('System'), icon='fa-cog', + url_name='system:system', parent_url_name='system', order=30) + Menu('menu-system-security', name=_('Security'), icon='fa-cog', + url_name='system:security', parent_url_name='system', order=40) + Menu('menu-system-administration', name=_('Administration'), icon='fa-cog', + url_name='system:administration', parent_url_name='system', order=50) diff --git a/plinth/middleware.py b/plinth/middleware.py index 5a34798b8..a44a25072 100644 --- a/plinth/middleware.py +++ b/plinth/middleware.py @@ -32,7 +32,8 @@ def _collect_operations_results(request, app): operations = operation_module.manager.collect_results(app.app_id) for operation in operations: if operation.exception: - messages.error(request, operation.message) + views.messages_error(request, operation.message, + operation.exception) else: messages.success(request, operation.message) diff --git a/plinth/modules/apache/__init__.py b/plinth/modules/apache/__init__.py index d5ead948b..ba8bd67af 100644 --- a/plinth/modules/apache/__init__.py +++ b/plinth/modules/apache/__init__.py @@ -24,7 +24,7 @@ class ApacheApp(app_module.App): _version = 12 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -61,8 +61,8 @@ class ApacheApp(app_module.App): daemon = Daemon('daemon-apache', 'apache2') self.add(daemon) - daemon = RelatedDaemon('related-daemon-apache', 'uwsgi') - self.add(daemon) + related_daemon = RelatedDaemon('related-daemon-apache', 'uwsgi') + self.add(related_daemon) def setup(self, old_version): """Install and configure the app.""" diff --git a/plinth/modules/apache/components.py b/plinth/modules/apache/components.py index 4fdce303e..2a9ed9e1d 100644 --- a/plinth/modules/apache/components.py +++ b/plinth/modules/apache/components.py @@ -7,7 +7,8 @@ import subprocess from django.utils.translation import gettext_noop from plinth import action_utils, app -from plinth.modules.diagnostics.check import DiagnosticCheck, Result +from plinth.diagnostic_check import (DiagnosticCheck, + DiagnosticCheckParameters, Result) from plinth.privileged import service as service_privileged from . import privileged @@ -58,7 +59,7 @@ class Webserver(app.LeaderComponent): """Disable the Apache configuration.""" privileged.disable(self.web_name, self.kind) - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Check if the web path is accessible by clients. See :py:meth:`plinth.app.Component.diagnose`. @@ -135,8 +136,12 @@ class Uwsgi(app.LeaderComponent): and action_utils.service_is_running('uwsgi') -def diagnose_url(url, kind=None, env=None, check_certificate=True, - extra_options=None, wrapper=None, expected_output=None): +def diagnose_url(url: str, kind: str | None = None, + env: dict[str, str] | None = None, + check_certificate: bool = True, + extra_options: list[str] | None = None, + wrapper: str | None = None, + expected_output: str | None = None) -> DiagnosticCheck: """Run a diagnostic on whether a URL is accessible. Kind can be '4' for IPv4 or '6' for IPv6. @@ -148,7 +153,7 @@ def diagnose_url(url, kind=None, env=None, check_certificate=True, except FileNotFoundError: result = Result.ERROR - parameters = {'url': url, 'kind': kind} + parameters: DiagnosticCheckParameters = {'url': url, 'kind': kind} if kind: check_id = f'apache-url-kind-{url}-{kind}' description = gettext_noop('Access URL {url} on tcp{kind}') @@ -159,7 +164,8 @@ def diagnose_url(url, kind=None, env=None, check_certificate=True, return DiagnosticCheck(check_id, description, result, parameters) -def diagnose_url_on_all(url, expect_redirects=False, **kwargs): +def diagnose_url_on_all(url: str, expect_redirects: bool = False, + **kwargs) -> list[DiagnosticCheck]: """Run a diagnostic on whether a URL is accessible.""" results = [] for address in action_utils.get_addresses(): @@ -173,8 +179,12 @@ def diagnose_url_on_all(url, expect_redirects=False, **kwargs): return results -def check_url(url, kind=None, env=None, check_certificate=True, - extra_options=None, wrapper=None, expected_output=None): +def check_url(url: str, kind: str | None = None, + env: dict[str, str] | None = None, + check_certificate: bool = True, + extra_options: list[str] | None = None, + wrapper: str | None = None, + expected_output: str | None = None) -> bool: """Check whether a URL is accessible.""" command = ['curl', '--location', '-f', '-w', '%{response_code}'] diff --git a/plinth/modules/apache/tests/test_components.py b/plinth/modules/apache/tests/test_components.py index 6cbd1c574..39d6e1229 100644 --- a/plinth/modules/apache/tests/test_components.py +++ b/plinth/modules/apache/tests/test_components.py @@ -9,10 +9,10 @@ from unittest.mock import call, patch import pytest from plinth import app +from plinth.diagnostic_check import DiagnosticCheck, Result from plinth.modules.apache.components import (Uwsgi, Webserver, check_url, diagnose_url, diagnose_url_on_all) -from plinth.modules.diagnostics.check import DiagnosticCheck, Result def test_webserver_init(): diff --git a/plinth/modules/api/__init__.py b/plinth/modules/api/__init__.py index 153718faf..261d3ec06 100644 --- a/plinth/modules/api/__init__.py +++ b/plinth/modules/api/__init__.py @@ -13,7 +13,7 @@ class ApiApp(app_module.App): _version = 1 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/avahi/__init__.py b/plinth/modules/avahi/__init__.py index 420b4153b..8226a0bd4 100644 --- a/plinth/modules/avahi/__init__.py +++ b/plinth/modules/avahi/__init__.py @@ -38,7 +38,7 @@ class AvahiApp(app_module.App): _version = 1 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -50,7 +50,8 @@ class AvahiApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-avahi', info.name, None, info.icon, - 'avahi:index', parent_url_name='system') + 'avahi:index', + parent_url_name='system:visibility', order=50) self.add(menu_item) packages = Packages('packages-avahi', ['avahi-daemon', 'avahi-utils']) diff --git a/plinth/modules/backups/__init__.py b/plinth/modules/backups/__init__.py index 3cee6898c..5a6c6db19 100644 --- a/plinth/modules/backups/__init__.py +++ b/plinth/modules/backups/__init__.py @@ -35,7 +35,7 @@ class BackupsApp(app_module.App): _version = 3 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -47,7 +47,8 @@ class BackupsApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-backups', info.name, None, info.icon, - 'backups:index', parent_url_name='system') + 'backups:index', parent_url_name='system:data', + order=20) self.add(menu_item) packages = Packages('packages-backups', ['borgbackup', 'sshfs']) diff --git a/plinth/modules/backups/repository.py b/plinth/modules/backups/repository.py index 026d8f5f7..9ec67c134 100644 --- a/plinth/modules/backups/repository.py +++ b/plinth/modules/backups/repository.py @@ -275,7 +275,9 @@ class BaseBorgRepository(abc.ABC): @staticmethod def reraise_known_error(err): """Look whether the caught error is known and reraise it accordingly""" - caught_error = str((err, err.args)) + stdout = getattr(err, 'stdout', b'').decode() + stderr = getattr(err, 'stderr', b'').decode() + caught_error = str((err, err.args, stdout, stderr)) for known_error in KNOWN_ERRORS: for error in known_error['errors']: if re.search(error, caught_error): diff --git a/plinth/modules/bepasty/__init__.py b/plinth/modules/bepasty/__init__.py index 784650814..09c199a3e 100644 --- a/plinth/modules/bepasty/__init__.py +++ b/plinth/modules/bepasty/__init__.py @@ -50,7 +50,7 @@ class BepastyApp(app_module.App): _version = 3 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/bind/__init__.py b/plinth/modules/bind/__init__.py index 0f4c6449d..4f4971731 100644 --- a/plinth/modules/bind/__init__.py +++ b/plinth/modules/bind/__init__.py @@ -32,7 +32,7 @@ class BindApp(app_module.App): _version = 3 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -44,7 +44,7 @@ class BindApp(app_module.App): menu_item = menu.Menu('menu-bind', info.name, info.short_description, info.icon, 'bind:index', - parent_url_name='system') + parent_url_name='system:visibility', order=30) self.add(menu_item) packages = Packages('packages-bind', ['bind9']) diff --git a/plinth/modules/calibre/__init__.py b/plinth/modules/calibre/__init__.py index dd5558e05..a04792a88 100644 --- a/plinth/modules/calibre/__init__.py +++ b/plinth/modules/calibre/__init__.py @@ -46,7 +46,7 @@ class CalibreApp(app_module.App): DAEMON = 'calibre-server-freedombox' - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/cockpit/__init__.py b/plinth/modules/cockpit/__init__.py index 9bc16d059..571d17419 100644 --- a/plinth/modules/cockpit/__init__.py +++ b/plinth/modules/cockpit/__init__.py @@ -44,7 +44,7 @@ class CockpitApp(app_module.App): _version = 3 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -59,7 +59,9 @@ class CockpitApp(app_module.App): menu_item = menu.Menu('menu-cockpit', info.name, info.short_description, info.icon, - 'cockpit:index', parent_url_name='system') + 'cockpit:index', + parent_url_name='system:administration', + order=20) self.add(menu_item) shortcut = frontpage.Shortcut('shortcut-cockpit', info.name, diff --git a/plinth/modules/config/__init__.py b/plinth/modules/config/__init__.py index 293168da2..fb28c948f 100644 --- a/plinth/modules/config/__init__.py +++ b/plinth/modules/config/__init__.py @@ -35,7 +35,7 @@ class ConfigApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() info = app_module.Info(app_id=self.app_id, version=self._version, @@ -47,7 +47,8 @@ class ConfigApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-config', _('Configure'), None, info.icon, - 'config:index', parent_url_name='system') + 'config:index', parent_url_name='system:system', + order=30) self.add(menu_item) packages = Packages('packages-config', ['zram-tools']) diff --git a/plinth/modules/coturn/__init__.py b/plinth/modules/coturn/__init__.py index 1eebd4c34..133511ac7 100644 --- a/plinth/modules/coturn/__init__.py +++ b/plinth/modules/coturn/__init__.py @@ -44,7 +44,7 @@ class CoturnApp(app_module.App): _version = 2 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/datetime/__init__.py b/plinth/modules/datetime/__init__.py index 2a8e7b397..4bc35802c 100644 --- a/plinth/modules/datetime/__init__.py +++ b/plinth/modules/datetime/__init__.py @@ -11,8 +11,8 @@ from django.utils.translation import gettext_noop from plinth import app as app_module from plinth import menu from plinth.daemon import Daemon, RelatedDaemon +from plinth.diagnostic_check import DiagnosticCheck, Result from plinth.modules.backups.components import BackupRestore -from plinth.modules.diagnostics.check import DiagnosticCheck, Result from plinth.package import Packages from . import manifest @@ -60,7 +60,7 @@ class DateTimeApp(app_module.App): return self._time_managed - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -71,15 +71,16 @@ class DateTimeApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-datetime', info.name, None, info.icon, - 'datetime:index', parent_url_name='system') + 'datetime:index', + parent_url_name='system:system', order=40) self.add(menu_item) packages = Packages('packages-datetime', ['systemd-timesyncd']) self.add(packages) - daemon = RelatedDaemon('daemon-datetime-timedated', - 'systemd-timedated') - self.add(daemon) + related_daemon = RelatedDaemon('daemon-datetime-timedated', + 'systemd-timedated') + self.add(related_daemon) if self._is_time_managed(): daemon = Daemon('daemon-datetime', 'systemd-timesyncd') @@ -89,7 +90,7 @@ class DateTimeApp(app_module.App): **manifest.backup) self.add(backup_restore) - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Run diagnostics and return the results.""" results = super().diagnose() if self._is_time_managed(): @@ -107,7 +108,7 @@ class DateTimeApp(app_module.App): self.enable() -def _diagnose_time_synchronized(): +def _diagnose_time_synchronized() -> DiagnosticCheck: """Check whether time is synchronized to NTP server.""" result = Result.FAILED try: diff --git a/plinth/modules/deluge/__init__.py b/plinth/modules/deluge/__init__.py index 385abe2c5..deec8588e 100644 --- a/plinth/modules/deluge/__init__.py +++ b/plinth/modules/deluge/__init__.py @@ -33,7 +33,7 @@ class DelugeApp(app_module.App): _version = 8 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/diagnostics/__init__.py b/plinth/modules/diagnostics/__init__.py index cdef381a5..ff771de82 100644 --- a/plinth/modules/diagnostics/__init__.py +++ b/plinth/modules/diagnostics/__init__.py @@ -17,11 +17,12 @@ from django.utils.translation import gettext_noop from plinth import app as app_module from plinth import daemon, glib, kvstore, menu from plinth import operation as operation_module +from plinth.diagnostic_check import (CheckJSONDecoder, CheckJSONEncoder, + DiagnosticCheck, Result) from plinth.modules.apache.components import diagnose_url_on_all from plinth.modules.backups.components import BackupRestore from . import manifest -from .check import CheckJSONDecoder, CheckJSONEncoder, Result _description = [ _('The system diagnostic test will run a number of checks on your ' @@ -44,7 +45,7 @@ class DiagnosticsApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() info = app_module.Info(app_id=self.app_id, version=self._version, @@ -54,7 +55,9 @@ class DiagnosticsApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-diagnostics', info.name, None, info.icon, - 'diagnostics:index', parent_url_name='system') + 'diagnostics:index', + parent_url_name='system:administration', + order=30) self.add(menu_item) backup_restore = BackupRestore('backup-restore-diagnostics', @@ -75,7 +78,7 @@ class DiagnosticsApp(app_module.App): super().setup(old_version) self.enable() - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Run diagnostics and return the results.""" results = super().diagnose() results.append(daemon.diagnose_port_listening(8000, 'tcp4')) @@ -103,7 +106,8 @@ def _run_on_all_enabled_modules(): current_results = { 'apps': [], 'results': collections.OrderedDict(), - 'progress_percentage': 0 + 'progress_percentage': 0, + 'exception': None, } for app in app_module.App.list(): @@ -335,15 +339,26 @@ def are_results_available(): return bool(results) -def get_results(): +def get_results() -> dict: """Return the latest results of full diagnostics.""" + global current_results + with results_lock: - results = deepcopy(current_results) + try: + results = deepcopy(current_results) + except TypeError as error: + # See #2410: cannot pickle 'dict_values' object + logger.error('Cannot get diagnostic results: %s - %s', error, + current_results) + exception = str(error) + ' - ' + str(current_results) + # Clear the results that can't be used. + current_results = {} + return {'exception': exception} # If no results are available in memory, then load from database. if not results: results = kvstore.get_default('diagnostics_results', '{}') - results = json.loads(results, cls=CheckJSONDecoder) + results = json.loads(str(results), cls=CheckJSONDecoder) results = {'results': results, 'progress_percentage': 100} # Add a translated name for each app diff --git a/plinth/modules/diagnostics/tests/test_diagnostics.py b/plinth/modules/diagnostics/tests/test_diagnostics.py new file mode 100644 index 000000000..f056167aa --- /dev/null +++ b/plinth/modules/diagnostics/tests/test_diagnostics.py @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Tests for Diagnostics app functions.""" + +from collections import OrderedDict +from unittest.mock import patch + +from plinth.app import App, Info +from plinth.modules.diagnostics import get_results + + +class AppTest(App): + """Sample App for testing.""" + app_id = 'test-app' + + def __init__(self): + super().__init__() + info = Info('test-app', 1) + self.add(info) + + +def test_get_results(): + """Test getting the diagnostics results.""" + var = 'plinth.modules.diagnostics.current_results' + with patch(var, {}): + assert get_results() == {'progress_percentage': 100, 'results': {}} + + with patch(var, { + 'apps': [], + 'results': OrderedDict(), + 'progress_percentage': 0 + }): + assert get_results() == { + 'apps': [], + 'results': {}, + 'progress_percentage': 0 + } + + _ = AppTest() + results = OrderedDict({ + 'test-app': { + 'id': 'test-app', + 'diagnosis': [], + 'exception': None, + 'show_rerun_setup': False + } + }) + with patch( + var, { + 'apps': [('test-app', AppTest)], + 'results': results, + 'progress_percentage': 0 + }): + results['test-app'].update({'name': 'test-app'}) + assert get_results() == { + 'apps': [('test-app', AppTest)], + 'results': results, + 'progress_percentage': 0 + } diff --git a/plinth/modules/diagnostics/views.py b/plinth/modules/diagnostics/views.py index c9bd1ab8b..6102db56e 100644 --- a/plinth/modules/diagnostics/views.py +++ b/plinth/modules/diagnostics/views.py @@ -14,10 +14,10 @@ from django.views.generic import TemplateView from plinth import operation from plinth.app import App +from plinth.diagnostic_check import Result from plinth.modules import diagnostics from plinth.views import AppView -from .check import Result from .forms import ConfigureForm logger = logging.getLogger(__name__) @@ -75,6 +75,10 @@ class DiagnosticsFullView(TemplateView): context['is_task_running'] = is_task_running context['results'] = diagnostics.get_results() context['refresh_page_sec'] = 3 if is_task_running else None + exception = context['results'].pop('exception', None) + if exception: + messages.error(self.request, exception) + return context diff --git a/plinth/modules/dynamicdns/__init__.py b/plinth/modules/dynamicdns/__init__.py index 97053fa22..e0e0ec231 100644 --- a/plinth/modules/dynamicdns/__init__.py +++ b/plinth/modules/dynamicdns/__init__.py @@ -52,7 +52,7 @@ class DynamicDNSApp(app_module.App): _version = 2 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -64,7 +64,8 @@ class DynamicDNSApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-dynamicdns', info.name, None, info.icon, - 'dynamicdns:index', parent_url_name='system') + 'dynamicdns:index', + parent_url_name='system:visibility', order=20) self.add(menu_item) enable_state = app_module.EnableState('enable-state-dynamicdns') diff --git a/plinth/modules/ejabberd/__init__.py b/plinth/modules/ejabberd/__init__.py index d4489c7a1..d11fe1983 100644 --- a/plinth/modules/ejabberd/__init__.py +++ b/plinth/modules/ejabberd/__init__.py @@ -52,7 +52,7 @@ class EjabberdApp(app_module.App): _version = 8 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/email/__init__.py b/plinth/modules/email/__init__.py index 947f45d63..5c28538da 100644 --- a/plinth/modules/email/__init__.py +++ b/plinth/modules/email/__init__.py @@ -55,7 +55,7 @@ class EmailApp(plinth.app.App): _version = 4 - def __init__(self): + def __init__(self) -> None: """Initialize the email app.""" super().__init__() diff --git a/plinth/modules/firewall/__init__.py b/plinth/modules/firewall/__init__.py index 3cd45ea7c..72a1f627e 100644 --- a/plinth/modules/firewall/__init__.py +++ b/plinth/modules/firewall/__init__.py @@ -10,8 +10,8 @@ from django.utils.translation import gettext_noop from plinth import app as app_module from plinth import cfg, menu from plinth.daemon import Daemon +from plinth.diagnostic_check import DiagnosticCheck, Result from plinth.modules.backups.components import BackupRestore -from plinth.modules.diagnostics.check import DiagnosticCheck, Result from plinth.package import Packages, install from plinth.utils import Version, format_lazy, import_from_gi @@ -53,7 +53,7 @@ class FirewallApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -64,7 +64,8 @@ class FirewallApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-firewall', info.name, None, info.icon, - 'firewall:index', parent_url_name='system') + 'firewall:index', + parent_url_name='system:security', order=30) self.add(menu_item) packages = Packages('packages-firewall', ['firewalld', 'nftables']) @@ -96,7 +97,7 @@ class FirewallApp(app_module.App): _run_setup() return True - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Run diagnostics and return the results.""" results = super().diagnose() config = privileged.get_config() @@ -265,7 +266,8 @@ def remove_passthrough(ipv, *args): config_direct.removePassthrough('(sas)', ipv, args) -def _diagnose_default_zone(config): +def _diagnose_default_zone( + config: privileged.FirewallConfig) -> DiagnosticCheck: """Diagnose whether the default zone is external.""" check_id = 'firewall-default-zone' description = gettext_noop('Default zone is external') @@ -274,7 +276,8 @@ def _diagnose_default_zone(config): return DiagnosticCheck(check_id, description, result) -def _diagnose_firewall_backend(config): +def _diagnose_firewall_backend( + config: privileged.FirewallConfig) -> DiagnosticCheck: """Diagnose whether the firewall backend is nftables.""" check_id = 'firewall-backend' description = gettext_noop('Firewall backend is nftables') @@ -283,7 +286,8 @@ def _diagnose_firewall_backend(config): return DiagnosticCheck(check_id, description, result) -def _diagnose_direct_passthroughs(config): +def _diagnose_direct_passthroughs( + config: privileged.FirewallConfig) -> DiagnosticCheck: """Diagnose direct passthroughs for local service protection. Currently, we just check that the number of passthroughs is at least 12, diff --git a/plinth/modules/firewall/components.py b/plinth/modules/firewall/components.py index 666292c18..e3c381b26 100644 --- a/plinth/modules/firewall/components.py +++ b/plinth/modules/firewall/components.py @@ -5,16 +5,19 @@ App component for other apps to use firewall functionality. import logging import re -from typing import ClassVar +from typing import ClassVar, TypeAlias from django.utils.translation import gettext_noop from plinth import app +from plinth.diagnostic_check import (DiagnosticCheck, + DiagnosticCheckParameters, Result) from plinth.modules import firewall -from plinth.modules.diagnostics.check import DiagnosticCheck, Result logger = logging.getLogger(__name__) +_list_type: TypeAlias = list + class Firewall(app.FollowerComponent): """Component to open/close firewall ports for an app.""" @@ -114,7 +117,7 @@ class Firewall(app.FollowerComponent): if not re.fullmatch(r'tun\d+', interface) ] - def diagnose(self): + def diagnose(self) -> _list_type[DiagnosticCheck]: """Check if the firewall ports are open and only as expected. See :py:meth:`plinth.app.Component.diagnose`. @@ -124,7 +127,7 @@ class Firewall(app.FollowerComponent): internal_ports = firewall.get_enabled_services(zone='internal') external_ports = firewall.get_enabled_services(zone='external') for port_detail in self.ports_details: - port = port_detail['name'] + port = str(port_detail['name']) details = ', '.join( (f'{port_number}/{protocol}' for port_number, protocol in port_detail['details'])) @@ -134,7 +137,10 @@ class Firewall(app.FollowerComponent): result = Result.PASSED if port in internal_ports else Result.FAILED description = gettext_noop( 'Port {name} ({details}) available for internal networks') - parameters = {'name': port, 'details': details} + parameters: DiagnosticCheckParameters = { + 'name': port, + 'details': details + } results.append( DiagnosticCheck(check_id, description, result, parameters)) diff --git a/plinth/modules/firewall/privileged.py b/plinth/modules/firewall/privileged.py index f673b50dc..4463b528e 100644 --- a/plinth/modules/firewall/privileged.py +++ b/plinth/modules/firewall/privileged.py @@ -2,12 +2,15 @@ """Configuration helper for FreedomBox firewall interface.""" import subprocess +from typing import TypeAlias import augeas from plinth import action_utils from plinth.actions import privileged +FirewallConfig: TypeAlias = dict[str, str | list[str]] + def _flush_iptables_rules(): """Flush firewalld iptables rules before restarting it. @@ -132,9 +135,9 @@ def setup(): @privileged -def get_config(): +def get_config() -> FirewallConfig: """Return firewalld configuration for diagnostics.""" - config = {} + config: FirewallConfig = {} # Get the default zone. output = subprocess.check_output(['firewall-cmd', '--get-default-zone']) diff --git a/plinth/modules/firewall/tests/test_components.py b/plinth/modules/firewall/tests/test_components.py index e4a53f303..a6d943db9 100644 --- a/plinth/modules/firewall/tests/test_components.py +++ b/plinth/modules/firewall/tests/test_components.py @@ -8,7 +8,7 @@ from unittest.mock import call, patch import pytest from plinth.app import App -from plinth.modules.diagnostics.check import DiagnosticCheck, Result +from plinth.diagnostic_check import DiagnosticCheck, Result from plinth.modules.firewall.components import (Firewall, FirewallLocalProtection) diff --git a/plinth/modules/first_boot/__init__.py b/plinth/modules/first_boot/__init__.py index a608f569d..bf3877710 100644 --- a/plinth/modules/first_boot/__init__.py +++ b/plinth/modules/first_boot/__init__.py @@ -39,7 +39,7 @@ class FirstBootApp(app_module.App): _version = 1 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/gitweb/__init__.py b/plinth/modules/gitweb/__init__.py index 26c9c968b..78c34ecf5 100644 --- a/plinth/modules/gitweb/__init__.py +++ b/plinth/modules/gitweb/__init__.py @@ -38,14 +38,12 @@ class GitwebApp(app_module.App): _version = 3 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() groups = {'git-access': _('Read-write access to Git repositories')} - self.repos = [] - info = app_module.Info(app_id=self.app_id, version=self._version, name=_('Gitweb'), icon_filename='gitweb', short_description=_('Simple Git Hosting'), @@ -98,7 +96,7 @@ class GitwebApp(app_module.App): def post_init(self): """Perform post initialization operations.""" - if not self.needs_setup() and self.is_enabled(): + if not self.needs_setup(): self.update_service_access() def set_shortcut_login_required(self, login_required): @@ -122,7 +120,7 @@ class GitwebApp(app_module.App): def _disable_public_access(self): """Allow Gitweb app to be accessed by logged-in users only.""" - if not self.auth_webserver.is_conf_enabled(): + if self.is_enabled() and not self.auth_webserver.is_conf_enabled(): self.auth_webserver.enable() self.set_shortcut_login_required(True) diff --git a/plinth/modules/gitweb/tests/test_functional.py b/plinth/modules/gitweb/tests/test_functional.py index 5c833aaff..5f8a67ee7 100644 --- a/plinth/modules/gitweb/tests/test_functional.py +++ b/plinth/modules/gitweb/tests/test_functional.py @@ -63,23 +63,30 @@ class TestGitwebApp(functional.BaseAppTests): @pytest.mark.parametrize('access', ['public', 'private']) @pytest.mark.parametrize('repo_name', ['Test-repo', 'Test-repo.git']) - def test_create_delete_repo(self, session_browser, access, repo_name): + @pytest.mark.parametrize('app_status', ['enabled', 'disabled']) + def test_create_delete_repo(self, session_browser, access, repo_name, + app_status): """Test creating and deleting a repo and accessing with a git client.""" + if app_status == "disabled": + functional.app_disable(session_browser, 'gitweb') + _delete_repo(session_browser, repo_name, ignore_missing=True) _create_repo(session_browser, repo_name, access) assert _repo_exists(session_browser, repo_name, access) - assert _site_repo_exists(session_browser, repo_name) - if access == "public": - assert _repo_is_readable(repo_name) - else: - assert not _repo_is_readable(repo_name) + if app_status == "enabled": + assert _site_repo_exists(session_browser, repo_name) - assert not _repo_is_writable(repo_name) - assert _repo_is_readable(repo_name, with_auth=True) - assert _repo_is_writable(repo_name, with_auth=True) + if access == "public": + assert _repo_is_readable(repo_name) + else: + assert not _repo_is_readable(repo_name) + + assert not _repo_is_writable(repo_name) + assert _repo_is_readable(repo_name, with_auth=True) + assert _repo_is_writable(repo_name, with_auth=True) _delete_repo(session_browser, repo_name) assert not _repo_exists(session_browser, repo_name) @@ -93,8 +100,12 @@ class TestGitwebApp(functional.BaseAppTests): assert _site_repo_exists(session_browser, 'Test-repo') assert not _site_repo_exists(session_browser, 'Test-repo-private') - def test_edit_repo_metadata(self, session_browser): + @pytest.mark.parametrize('app_status', ['enabled', 'disabled']) + def test_edit_repo_metadata(self, session_browser, app_status): """Test edit repo metadata.""" + if app_status == "disabled": + functional.app_disable(session_browser, 'gitweb') + _create_repo(session_browser, 'Test-repo2', 'public', ok_if_exists=True) _delete_repo(session_browser, 'Test-repo', ignore_missing=True) @@ -108,10 +119,12 @@ class TestGitwebApp(functional.BaseAppTests): assert _get_repo_metadata(session_browser, "Test-repo") == repo_metadata - _create_branch('Test-repo', 'branch1') - _set_default_branch(session_browser, 'Test-repo', 'branch1') - assert _get_gitweb_site_default_repo_branch(session_browser, - 'Test-repo') == 'branch1' + if app_status == "enabled": + _create_branch('Test-repo', 'branch1') + _set_default_branch(session_browser, 'Test-repo', 'branch1') + + assert _get_gitweb_site_default_repo_branch( + session_browser, 'Test-repo') == 'branch1' def _create_local_repo(path): diff --git a/plinth/modules/help/__init__.py b/plinth/modules/help/__init__.py index 0acfa765f..e634df881 100644 --- a/plinth/modules/help/__init__.py +++ b/plinth/modules/help/__init__.py @@ -22,7 +22,7 @@ class HelpApp(app_module.App): _version = 1 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/i2p/__init__.py b/plinth/modules/i2p/__init__.py index b9f94f91f..acd89bcdf 100644 --- a/plinth/modules/i2p/__init__.py +++ b/plinth/modules/i2p/__init__.py @@ -42,7 +42,7 @@ class I2PApp(app_module.App): _version = 3 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/ikiwiki/__init__.py b/plinth/modules/ikiwiki/__init__.py index 3c81712f9..3d498fdea 100644 --- a/plinth/modules/ikiwiki/__init__.py +++ b/plinth/modules/ikiwiki/__init__.py @@ -37,7 +37,7 @@ class IkiwikiApp(app_module.App): _version = 2 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/infinoted/__init__.py b/plinth/modules/infinoted/__init__.py index aa0b6f884..00f98e69c 100644 --- a/plinth/modules/infinoted/__init__.py +++ b/plinth/modules/infinoted/__init__.py @@ -33,7 +33,7 @@ class InfinotedApp(app_module.App): _version = 3 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/janus/__init__.py b/plinth/modules/janus/__init__.py index 74428d3cd..3c4dafac2 100644 --- a/plinth/modules/janus/__init__.py +++ b/plinth/modules/janus/__init__.py @@ -35,7 +35,7 @@ class JanusApp(app_module.App): _version = 2 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/jsxc/__init__.py b/plinth/modules/jsxc/__init__.py index 39194eef4..2f66bdcd8 100644 --- a/plinth/modules/jsxc/__init__.py +++ b/plinth/modules/jsxc/__init__.py @@ -30,7 +30,7 @@ class JSXCApp(app_module.App): _version = 1 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/kiwix/__init__.py b/plinth/modules/kiwix/__init__.py index 012ef534b..eaa439a12 100644 --- a/plinth/modules/kiwix/__init__.py +++ b/plinth/modules/kiwix/__init__.py @@ -46,7 +46,7 @@ class KiwixApp(app_module.App): DAEMON = 'kiwix-server-freedombox' - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/letsencrypt/__init__.py b/plinth/modules/letsencrypt/__init__.py index 7098690a5..5464126f0 100644 --- a/plinth/modules/letsencrypt/__init__.py +++ b/plinth/modules/letsencrypt/__init__.py @@ -11,10 +11,10 @@ from django.utils.translation import gettext_noop from plinth import app as app_module from plinth import cfg, menu from plinth.config import DropinConfigs +from plinth.diagnostic_check import DiagnosticCheck, Result from plinth.modules import names from plinth.modules.apache.components import diagnose_url from plinth.modules.backups.components import BackupRestore -from plinth.modules.diagnostics.check import DiagnosticCheck, Result from plinth.modules.names.components import DomainType from plinth.package import Packages from plinth.signals import domain_added, domain_removed, post_app_loading @@ -51,7 +51,7 @@ class LetsEncryptApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -66,7 +66,8 @@ class LetsEncryptApp(app_module.App): menu_item = menu.Menu('menu-letsencrypt', info.name, info.short_description, info.icon, - 'letsencrypt:index', parent_url_name='system') + 'letsencrypt:index', + parent_url_name='system:security', order=20) self.add(menu_item) packages = Packages('packages-letsencrypt', ['certbot']) @@ -89,7 +90,7 @@ class LetsEncryptApp(app_module.App): post_app_loading.connect(_certificate_handle_modified) - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Run diagnostics and return the results.""" results = super().diagnose() @@ -186,9 +187,8 @@ def on_domain_removed(sender, domain_type, name='', **kwargs): logger.info('Revoking certificate for %s', name) certificate_revoke(name, really_revoke=False) return True - except Exception as exception: - logger.warning('Failed to revoke certificate for %s: %s', name, - exception.args[2]) + except Exception: + logger.warning('Failed to revoke certificate for %s', name) return False diff --git a/plinth/modules/letsencrypt/privileged.py b/plinth/modules/letsencrypt/privileged.py index 843515472..17de4d568 100644 --- a/plinth/modules/letsencrypt/privileged.py +++ b/plinth/modules/letsencrypt/privileged.py @@ -142,12 +142,7 @@ def revoke(domain: str): if TEST_MODE: command.append('--staging') - process = subprocess.Popen(command, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - _, stderr = process.communicate() - if process.returncode: - raise RuntimeError('Error revoking certificate: {error}'.format( - error=stderr.decode())) + subprocess.run(command, check=True) action_utils.webserver_disable(domain, kind='site') @@ -164,12 +159,7 @@ def obtain(domain: str): if TEST_MODE: command.append('--staging') - process = subprocess.Popen(command, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - _, stderr = process.communicate() - if process.returncode: - raise RuntimeError('Error obtaining certificate: {error}'.format( - error=stderr.decode())) + subprocess.run(command, check=True) with action_utils.WebserverChange() as webserver_change: _setup_webserver_config(domain, webserver_change) @@ -330,13 +320,7 @@ def _assert_managed_path(module, path): def delete(domain: str): """Disable a domain and delete the certificate.""" command = ['certbot', 'delete', '--non-interactive', '--cert-name', domain] - process = subprocess.Popen(command, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - _, stderr = process.communicate() - if process.returncode: - raise RuntimeError('Error deleting certificate: {error}'.format( - error=stderr.decode())) - + subprocess.run(command, check=True) action_utils.webserver_disable(domain, kind='site') diff --git a/plinth/modules/letsencrypt/views.py b/plinth/modules/letsencrypt/views.py index 5a946f680..2dbae35d2 100644 --- a/plinth/modules/letsencrypt/views.py +++ b/plinth/modules/letsencrypt/views.py @@ -12,7 +12,7 @@ from django.utils.translation import gettext as _ from django.views.decorators.http import require_POST from plinth.modules import letsencrypt -from plinth.views import AppView +from plinth.views import AppView, messages_error logger = logging.getLogger(__name__) @@ -41,10 +41,10 @@ def revoke(request, domain): 'This may take a few moments to take effect.').format( domain=domain)) except Exception as exception: - messages.error( + messages_error( request, - _('Failed to revoke certificate for domain {domain}: {error}'). - format(domain=domain, error=exception.args)) + _('Failed to revoke certificate for domain {domain}').format( + domain=domain), exception) return redirect(reverse_lazy('letsencrypt:index')) @@ -59,10 +59,11 @@ def obtain(request, domain): _('Certificate successfully obtained for domain {domain}').format( domain=domain)) except Exception as exception: - messages.error( + messages_error( request, - _('Failed to obtain certificate for domain {domain}: {error}'). - format(domain=domain, error=exception.args)) + _('Failed to obtain certificate for domain {domain}').format( + domain=domain), exception) + return redirect(reverse_lazy('letsencrypt:index')) @@ -76,10 +77,11 @@ def reobtain(request, domain): _('Certificate successfully obtained for domain {domain}').format( domain=domain)) except Exception as exception: - messages.error( + messages_error( request, - _('Failed to obtain certificate for domain {domain}: {error}'). - format(domain=domain, error=exception.args)) + _('Failed to obtain certificate for domain {domain}').format( + domain=domain), exception) + return redirect(reverse_lazy('letsencrypt:index')) @@ -93,9 +95,9 @@ def delete(request, domain): _('Certificate successfully deleted for domain {domain}').format( domain=domain)) except Exception as exception: - messages.error( + messages_error( request, - _('Failed to delete certificate for domain {domain}: {error}'). - format(domain=domain, error=exception.args)) + _('Failed to delete certificate for domain {domain}').format( + domain=domain), exception) return redirect(reverse_lazy('letsencrypt:index')) diff --git a/plinth/modules/matrixsynapse/__init__.py b/plinth/modules/matrixsynapse/__init__.py index 9078111d5..dc1292081 100644 --- a/plinth/modules/matrixsynapse/__init__.py +++ b/plinth/modules/matrixsynapse/__init__.py @@ -46,7 +46,7 @@ class MatrixSynapseApp(app_module.App): _version = 10 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/matrixsynapse/tests/test_functional.py b/plinth/modules/matrixsynapse/tests/test_functional.py index 9a57103fd..b1bc4e3ce 100644 --- a/plinth/modules/matrixsynapse/tests/test_functional.py +++ b/plinth/modules/matrixsynapse/tests/test_functional.py @@ -21,7 +21,10 @@ class TestMatrixSynapseApp(functional.BaseAppTests): """Setup the app.""" functional.login(session_browser) functional.set_domain_name(session_browser, 'mydomain.example') - functional.install(session_browser, self.app_name) + + def install_and_setup(self, session_browser): + """Install the app and run setup.""" + super().install_and_setup(session_browser) functional.app_select_domain_name(session_browser, self.app_name, 'mydomain.example') diff --git a/plinth/modules/matrixsynapse/views.py b/plinth/modules/matrixsynapse/views.py index 503e49d39..3f081e5ba 100644 --- a/plinth/modules/matrixsynapse/views.py +++ b/plinth/modules/matrixsynapse/views.py @@ -53,8 +53,11 @@ class MatrixSynapseAppView(AppView): def dispatch(self, request, *args, **kwargs): """Redirect to setup page if setup is not done yet.""" - if not matrixsynapse.is_setup(): - return redirect('matrixsynapse:setup') + status = self.get_common_status() + if status['is_enabled']: + # App is disabled when uninstalling + if not matrixsynapse.is_setup(): + return redirect('matrixsynapse:setup') return super().dispatch(request, *args, **kwargs) diff --git a/plinth/modules/mediawiki/__init__.py b/plinth/modules/mediawiki/__init__.py index 1bec60eea..ab1802578 100644 --- a/plinth/modules/mediawiki/__init__.py +++ b/plinth/modules/mediawiki/__init__.py @@ -42,7 +42,7 @@ class MediaWikiApp(app_module.App): _version = 12 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() self._private_mode = True diff --git a/plinth/modules/mediawiki/tests/test_functional.py b/plinth/modules/mediawiki/tests/test_functional.py index b82afdc2e..a01d0faeb 100644 --- a/plinth/modules/mediawiki/tests/test_functional.py +++ b/plinth/modules/mediawiki/tests/test_functional.py @@ -20,12 +20,9 @@ class TestMediawikiApp(functional.BaseAppTests): has_service = False has_web = True - @pytest.fixture(scope='class', autouse=True) - def fixture_setup(self, session_browser): - """Setup the app.""" - functional.login(session_browser) - functional.install(session_browser, 'mediawiki') - functional.app_enable(session_browser, 'mediawiki') + def install_and_setup(self, session_browser): + """Install the app and run setup.""" + super().install_and_setup(session_browser) _set_domain(session_browser) _set_admin_password(session_browser, 'whatever123') diff --git a/plinth/modules/minetest/__init__.py b/plinth/modules/minetest/__init__.py index e3f44c204..fe08ad228 100644 --- a/plinth/modules/minetest/__init__.py +++ b/plinth/modules/minetest/__init__.py @@ -48,7 +48,7 @@ class MinetestApp(app_module.App): _version = 2 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/minidlna/__init__.py b/plinth/modules/minidlna/__init__.py index 6cc2c6a1b..edf97e245 100644 --- a/plinth/modules/minidlna/__init__.py +++ b/plinth/modules/minidlna/__init__.py @@ -37,7 +37,7 @@ class MiniDLNAApp(app_module.App): _version = 5 - def __init__(self): + def __init__(self) -> None: """Initialize the app components.""" super().__init__() diff --git a/plinth/modules/mumble/__init__.py b/plinth/modules/mumble/__init__.py index b18ce5d4d..e43f26be7 100644 --- a/plinth/modules/mumble/__init__.py +++ b/plinth/modules/mumble/__init__.py @@ -37,7 +37,7 @@ class MumbleApp(app_module.App): _version = 2 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/names/__init__.py b/plinth/modules/names/__init__.py index f06913e77..1beaf06cc 100644 --- a/plinth/modules/names/__init__.py +++ b/plinth/modules/names/__init__.py @@ -36,7 +36,7 @@ class NamesApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() info = app_module.Info(app_id=self.app_id, version=self._version, @@ -46,7 +46,8 @@ class NamesApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-names', info.name, None, info.icon, - 'names:index', parent_url_name='system') + 'names:index', + parent_url_name='system:visibility', order=10) self.add(menu_item) backup_restore = BackupRestore('backup-restore-names', diff --git a/plinth/modules/networks/__init__.py b/plinth/modules/networks/__init__.py index d231b832e..54371feda 100644 --- a/plinth/modules/networks/__init__.py +++ b/plinth/modules/networks/__init__.py @@ -9,6 +9,7 @@ from django.utils.translation import gettext_lazy as _ from plinth import app as app_module from plinth import daemon, kvstore, menu, network from plinth.config import DropinConfigs +from plinth.diagnostic_check import DiagnosticCheck from plinth.package import Packages from . import privileged @@ -50,7 +51,7 @@ class NetworksApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -61,7 +62,8 @@ class NetworksApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-networks', info.name, None, info.icon, - 'networks:index', parent_url_name='system') + 'networks:index', + parent_url_name='system:system', order=20) self.add(menu_item) packages = Packages('packages-networks', ['network-manager', 'batctl']) @@ -72,7 +74,7 @@ class NetworksApp(app_module.App): ]) self.add(dropin_configs) - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Run diagnostics and return the results.""" results = super().diagnose() diff --git a/plinth/modules/openvpn/__init__.py b/plinth/modules/openvpn/__init__.py index 542975692..5a41ea820 100644 --- a/plinth/modules/openvpn/__init__.py +++ b/plinth/modules/openvpn/__init__.py @@ -36,7 +36,7 @@ class OpenVPNApp(app_module.App): _version = 5 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/pagekite/__init__.py b/plinth/modules/pagekite/__init__.py index c9df15ec2..033fd8a73 100644 --- a/plinth/modules/pagekite/__init__.py +++ b/plinth/modules/pagekite/__init__.py @@ -50,7 +50,7 @@ class PagekiteApp(app_module.App): _version = 2 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -64,7 +64,8 @@ class PagekiteApp(app_module.App): menu_item = menu.Menu('menu-pagekite', info.name, info.short_description, info.icon, - 'pagekite:index', parent_url_name='system') + 'pagekite:index', + parent_url_name='system:visibility', order=40) self.add(menu_item) packages = Packages('packages-pagekite', ['pagekite']) diff --git a/plinth/modules/performance/__init__.py b/plinth/modules/performance/__init__.py index 0d79fee77..59d1498f5 100644 --- a/plinth/modules/performance/__init__.py +++ b/plinth/modules/performance/__init__.py @@ -32,7 +32,7 @@ class PerformanceApp(app_module.App): _version = 1 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -46,7 +46,9 @@ class PerformanceApp(app_module.App): menu_item = menu.Menu('menu-performance', info.name, info.short_description, info.icon, - 'performance:index', parent_url_name='system') + 'performance:index', + parent_url_name='system:administration', + order=40) self.add(menu_item) packages = Packages('packages-performance', ['cockpit-pcp']) diff --git a/plinth/modules/power/__init__.py b/plinth/modules/power/__init__.py index 60ae0dcdc..3720c0212 100644 --- a/plinth/modules/power/__init__.py +++ b/plinth/modules/power/__init__.py @@ -23,7 +23,7 @@ class PowerApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -34,7 +34,9 @@ class PowerApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-power', info.name, None, info.icon, - 'power:index', parent_url_name='system') + 'power:index', + parent_url_name='system:administration', + order=50) self.add(menu_item) backup_restore = BackupRestore('backup-restore-power', diff --git a/plinth/modules/privacy/__init__.py b/plinth/modules/privacy/__init__.py index 742c8758c..89343f93a 100644 --- a/plinth/modules/privacy/__init__.py +++ b/plinth/modules/privacy/__init__.py @@ -24,7 +24,7 @@ class PrivacyApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -36,7 +36,8 @@ class PrivacyApp(app_module.App): menu_item = menu.Menu('menu-privacy', info.name, info.short_description, info.icon, - 'privacy:index', parent_url_name='system') + 'privacy:index', parent_url_name='system:data', + order=10) self.add(menu_item) packages = Packages('packages-privacy', ['popularity-contest', 'gpg']) diff --git a/plinth/modules/privoxy/__init__.py b/plinth/modules/privoxy/__init__.py index 364b11e52..0e4a01e28 100644 --- a/plinth/modules/privoxy/__init__.py +++ b/plinth/modules/privoxy/__init__.py @@ -11,6 +11,7 @@ from plinth import action_utils from plinth import app as app_module from plinth import cfg, frontpage, menu from plinth.daemon import Daemon +from plinth.diagnostic_check import DiagnosticCheck from plinth.modules.apache.components import diagnose_url from plinth.modules.backups.components import BackupRestore from plinth.modules.firewall.components import Firewall @@ -44,7 +45,7 @@ class PrivoxyApp(app_module.App): _version = 2 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -86,7 +87,7 @@ class PrivoxyApp(app_module.App): **manifest.backup) self.add(backup_restore) - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Run diagnostics and return the results.""" results = super().diagnose() results.append(diagnose_url('https://www.debian.org')) @@ -102,16 +103,16 @@ class PrivoxyApp(app_module.App): self.enable() -def diagnose_url_with_proxy(): +def diagnose_url_with_proxy() -> list[DiagnosticCheck]: """Run a diagnostic on a URL with a proxy.""" url = 'https://debian.org/' # Gives a simple redirect to www. results = [] for address in action_utils.get_addresses(): - proxy = 'http://{host}:8118/'.format(host=address['url_address']) + proxy = f'http://{address["url_address"]}:8118/' env = {'https_proxy': proxy} - result = diagnose_url(url, kind=address['kind'], env=env) + result = diagnose_url(url, kind=str(address['kind']), env=env) result.check_id = f'privoxy-url-proxy-kind-{url}-{address["kind"]}' result.description = gettext_noop( 'Access {url} with proxy {proxy} on tcp{kind}') diff --git a/plinth/modules/quassel/__init__.py b/plinth/modules/quassel/__init__.py index b6bcc06dc..ed59be865 100644 --- a/plinth/modules/quassel/__init__.py +++ b/plinth/modules/quassel/__init__.py @@ -43,7 +43,7 @@ class QuasselApp(app_module.App): _version = 1 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/radicale/__init__.py b/plinth/modules/radicale/__init__.py index c2b72ff79..70c7cdf2c 100644 --- a/plinth/modules/radicale/__init__.py +++ b/plinth/modules/radicale/__init__.py @@ -45,7 +45,7 @@ class RadicaleApp(app_module.App): _version = 3 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/roundcube/__init__.py b/plinth/modules/roundcube/__init__.py index fbcf2f018..0268208ff 100644 --- a/plinth/modules/roundcube/__init__.py +++ b/plinth/modules/roundcube/__init__.py @@ -42,7 +42,7 @@ class RoundcubeApp(app_module.App): _version = 4 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/rssbridge/__init__.py b/plinth/modules/rssbridge/__init__.py index 49520a7a0..7126b5ac3 100644 --- a/plinth/modules/rssbridge/__init__.py +++ b/plinth/modules/rssbridge/__init__.py @@ -39,7 +39,7 @@ class RSSBridgeApp(app_module.App): _version = 2 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/samba/__init__.py b/plinth/modules/samba/__init__.py index ef2bee768..6a4c9e910 100644 --- a/plinth/modules/samba/__init__.py +++ b/plinth/modules/samba/__init__.py @@ -41,9 +41,9 @@ class SambaApp(app_module.App): app_id = 'samba' - _version = 3 + _version = 5 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -82,11 +82,6 @@ class SambaApp(app_module.App): (445, 'tcp6')]) self.add(daemon) - daemon_nmbd = Daemon('daemon-samba-nmbd', 'nmbd', - listen_ports=[(137, 'udp4'), (138, 'udp4')]) - - self.add(daemon_nmbd) - users_and_groups = UsersAndGroups('users-and-groups-samba', groups=groups) self.add(users_and_groups) @@ -137,7 +132,11 @@ def get_users(): allowed_users = [] for group_user in group_users: - uid = pwd.getpwnam(group_user).pw_uid + try: + uid = pwd.getpwnam(group_user).pw_uid + except KeyError: # User doesn't exist + continue + if uid > 1000: allowed_users.append(group_user) diff --git a/plinth/modules/samba/data/usr/lib/systemd/system/nmbd.service.d/freedombox.conf b/plinth/modules/samba/data/usr/lib/systemd/system/nmbd.service.d/freedombox.conf deleted file mode 100644 index c178ad6a1..000000000 --- a/plinth/modules/samba/data/usr/lib/systemd/system/nmbd.service.d/freedombox.conf +++ /dev/null @@ -1,16 +0,0 @@ -[Service] -LockPersonality=yes -MemoryDenyWriteExecute=yes -NoNewPrivileges=yes -PrivateDevices=yes -PrivateMounts=yes -PrivateTmp=yes -ProtectControlGroups=yes -ProtectHome=yes -ProtectKernelLogs=yes -ProtectKernelModules=yes -ProtectKernelTunables=yes -ProtectSystem=full -RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK -RestrictRealtime=yes -SystemCallArchitectures=native diff --git a/plinth/modules/samba/manifest.py b/plinth/modules/samba/manifest.py index 8c336ea7a..810fe9e11 100644 --- a/plinth/modules/samba/manifest.py +++ b/plinth/modules/samba/manifest.py @@ -85,9 +85,4 @@ clients = [{ }] }] -backup = { - 'data': { - 'files': [SHARES_CONF_BACKUP_FILE] - }, - 'services': ['smbd', 'nmbd'] -} +backup = {'data': {'files': [SHARES_CONF_BACKUP_FILE]}, 'services': ['smbd']} diff --git a/plinth/modules/samba/privileged.py b/plinth/modules/samba/privileged.py index cb10482b4..77664adc0 100644 --- a/plinth/modules/samba/privileged.py +++ b/plinth/modules/samba/privileged.py @@ -45,8 +45,7 @@ CONF = r''' # https://en.wikipedia.org/wiki/Private_network # https://en.wikipedia.org/wiki/Link-local_address # https://en.wikipedia.org/wiki/Unique_local_address - access control = yes - hosts allow = 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 169.254.0.0/16 [::1] [fc00::]/7 [fe80::] + hosts allow = 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 169.254.0.0/16 ::1 hosts deny = all ''' # noqa: E501 @@ -286,6 +285,13 @@ def setup(): _use_config_file(CONF_PATH) os.makedirs('/var/lib/freedombox', exist_ok=True) os.chmod('/var/lib/freedombox', 0o0755) + + # Disable NetBIOS Service, used with now deprecated SMB1 protocol + if action_utils.service_is_running('nmbd'): + action_utils.service_stop('nmbd') + action_utils.service_disable('nmbd') + action_utils.service_mask('nmbd') + if action_utils.service_is_running('smbd'): action_utils.service_restart('smbd') diff --git a/plinth/modules/searx/__init__.py b/plinth/modules/searx/__init__.py index 72e6a851d..f81e3375f 100644 --- a/plinth/modules/searx/__init__.py +++ b/plinth/modules/searx/__init__.py @@ -31,7 +31,7 @@ class SearxApp(app_module.App): _version = 6 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/security/__init__.py b/plinth/modules/security/__init__.py index ecaf38555..01ca1e84a 100644 --- a/plinth/modules/security/__init__.py +++ b/plinth/modules/security/__init__.py @@ -27,7 +27,7 @@ class SecurityApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -37,7 +37,8 @@ class SecurityApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-security', info.name, None, info.icon, - 'security:index', parent_url_name='system') + 'security:index', + parent_url_name='system:security', order=10) self.add(menu_item) packages = Packages('packages-security', ['fail2ban', 'debsecan']) diff --git a/plinth/modules/shaarli/__init__.py b/plinth/modules/shaarli/__init__.py index a6db3aa60..4559f2613 100644 --- a/plinth/modules/shaarli/__init__.py +++ b/plinth/modules/shaarli/__init__.py @@ -28,7 +28,7 @@ class ShaarliApp(app_module.App): _version = 1 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/shaarli/tests/test_functional.py b/plinth/modules/shaarli/tests/test_functional.py index 4a1cb4fdf..b756a8bf9 100644 --- a/plinth/modules/shaarli/tests/test_functional.py +++ b/plinth/modules/shaarli/tests/test_functional.py @@ -17,12 +17,9 @@ class TestShaarliApp(functional.BaseAppTests): has_service = False has_web = True - @pytest.fixture(scope='class', autouse=True) - def fixture_setup(self, session_browser): - """Setup the app.""" - functional.login(session_browser) - functional.install(session_browser, self.app_name) - functional.app_enable(session_browser, self.app_name) + def install_and_setup(self, session_browser): + """Install the app and set it up if needed.""" + super().install_and_setup(session_browser) self._shaarli_is_setup(session_browser) def _shaarli_is_setup(self, session_browser): diff --git a/plinth/modules/shadowsocks/__init__.py b/plinth/modules/shadowsocks/__init__.py index 9707a87eb..57f26d4cb 100644 --- a/plinth/modules/shadowsocks/__init__.py +++ b/plinth/modules/shadowsocks/__init__.py @@ -42,7 +42,7 @@ class ShadowsocksApp(app_module.App): DAEMON = 'shadowsocks-libev-local@freedombox' - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/shadowsocks/tests/test_functional.py b/plinth/modules/shadowsocks/tests/test_functional.py index 87bcda6e0..1ed8fc38e 100644 --- a/plinth/modules/shadowsocks/tests/test_functional.py +++ b/plinth/modules/shadowsocks/tests/test_functional.py @@ -15,11 +15,9 @@ class TestShadowsocksApp(functional.BaseAppTests): has_service = True has_web = False - @pytest.fixture(scope='class', autouse=True) - def fixture_setup(self, session_browser): - """Setup the app.""" - functional.login(session_browser) - functional.install(session_browser, 'shadowsocks') + def install_and_setup(self, session_browser): + """Install the app and run setup.""" + super().install_and_setup(session_browser) _configure(session_browser, 'example.com', 'fakepassword') @pytest.mark.backups diff --git a/plinth/modules/shadowsocksserver/__init__.py b/plinth/modules/shadowsocksserver/__init__.py index 01c237a0b..f574ca4e1 100644 --- a/plinth/modules/shadowsocksserver/__init__.py +++ b/plinth/modules/shadowsocksserver/__init__.py @@ -39,7 +39,7 @@ class ShadowsocksServerApp(app_module.App): DAEMON = 'shadowsocks-libev-server@fbxserver' - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/shadowsocksserver/tests/test_functional.py b/plinth/modules/shadowsocksserver/tests/test_functional.py index c270bc163..4b0cc2c07 100644 --- a/plinth/modules/shadowsocksserver/tests/test_functional.py +++ b/plinth/modules/shadowsocksserver/tests/test_functional.py @@ -15,11 +15,9 @@ class TestShadowsocksServerApp(functional.BaseAppTests): has_service = True has_web = False - @pytest.fixture(scope='class', autouse=True) - def fixture_setup(self, session_browser): - """Setup the app.""" - functional.login(session_browser) - functional.install(session_browser, 'shadowsocksserver') + def install_and_setup(self, session_browser): + """Install the app and run setup.""" + super().install_and_setup(session_browser) _configure(session_browser, 'fakepassword') @pytest.mark.backups diff --git a/plinth/modules/sharing/__init__.py b/plinth/modules/sharing/__init__.py index 0d43274cc..e6c1e4c5d 100644 --- a/plinth/modules/sharing/__init__.py +++ b/plinth/modules/sharing/__init__.py @@ -27,7 +27,7 @@ class SharingApp(app_module.App): _version = 3 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() info = app_module.Info(app_id=self.app_id, version=self._version, diff --git a/plinth/modules/snapshot/__init__.py b/plinth/modules/snapshot/__init__.py index 9c281aa9b..f4cf52846 100644 --- a/plinth/modules/snapshot/__init__.py +++ b/plinth/modules/snapshot/__init__.py @@ -42,7 +42,7 @@ class SnapshotApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -53,7 +53,8 @@ class SnapshotApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-snapshot', info.name, None, info.icon, - 'snapshot:index', parent_url_name='system') + 'snapshot:index', parent_url_name='system:data', + order=40) self.add(menu_item) packages = Packages('packages-snapshot', ['snapper']) diff --git a/plinth/modules/snapshot/views.py b/plinth/modules/snapshot/views.py index 8fc4c5b6c..55581c5a0 100644 --- a/plinth/modules/snapshot/views.py +++ b/plinth/modules/snapshot/views.py @@ -14,7 +14,7 @@ from django.utils.translation import gettext_lazy from plinth import app as app_module from plinth.modules import snapshot as snapshot_module from plinth.modules import storage -from plinth.views import AppView +from plinth.views import AppView, messages_error from . import get_configuration, privileged from .forms import SnapshotForm @@ -155,13 +155,9 @@ def update_configuration(request, old_status, new_status): try: privileged.set_config(list(config)) - messages.success(request, _('Storage snapshots configuration updated')) + messages.success(request, _('Configuration updated.')) except Exception as exception: - messages.error( - request, - _('Action error: {0} [{1}] [{2}]').format(exception.args[0], - exception.args[1], - exception.args[2])) + messages_error(request, _('Configuration update failed.'), exception) def delete_selected(request): @@ -187,13 +183,13 @@ def delete_selected(request): messages.success(request, _('Deleted selected snapshots')) except Exception as exception: - if 'Config is in use.' in exception.args[2]: - messages.error( - request, - _('Snapshot is currently in use. ' - 'Please try again later.')) - else: - raise + message = _('Deleting snapshot failed.') + stderr = getattr(exception, 'stderr', b'').decode() + if 'Config is in use.' in stderr: + message = _('Snapshot is currently in use. ' + 'Please try again later.') + + messages_error(request, message, exception) return redirect(reverse('snapshot:manage')) diff --git a/plinth/modules/ssh/__init__.py b/plinth/modules/ssh/__init__.py index f4144e619..29cbba45a 100644 --- a/plinth/modules/ssh/__init__.py +++ b/plinth/modules/ssh/__init__.py @@ -33,7 +33,7 @@ class SSHApp(app_module.App): _version = 4 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -45,7 +45,9 @@ class SSHApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-ssh', info.name, None, info.icon, - 'ssh:index', parent_url_name='system') + 'ssh:index', + parent_url_name='system:administration', + order=10) self.add(menu_item) packages = Packages('packages-ssh', ['openssh-server']) diff --git a/plinth/modules/sso/__init__.py b/plinth/modules/sso/__init__.py index 42753e7b3..20782d462 100644 --- a/plinth/modules/sso/__init__.py +++ b/plinth/modules/sso/__init__.py @@ -17,7 +17,7 @@ class SSOApp(app_module.App): _version = 2 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/storage/__init__.py b/plinth/modules/storage/__init__.py index 71cfce75e..dff8d60b2 100644 --- a/plinth/modules/storage/__init__.py +++ b/plinth/modules/storage/__init__.py @@ -37,7 +37,7 @@ class StorageApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -48,7 +48,8 @@ class StorageApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-storage', info.name, None, info.icon, - 'storage:index', parent_url_name='system') + 'storage:index', parent_url_name='system:data', + order=30) self.add(menu_item) packages = Packages('packages-storage', diff --git a/plinth/modules/storage/udisks2.py b/plinth/modules/storage/udisks2.py index 7779f35e6..0a19008e9 100644 --- a/plinth/modules/storage/udisks2.py +++ b/plinth/modules/storage/udisks2.py @@ -196,7 +196,7 @@ def _mount(object_path): try: privileged.mount(block_device.preferred_device, _log_error=False) except Exception as exception: - stderr = exception.args[3].decode() + stderr = getattr(exception, 'stderr', b'').decode() if 'GDBus.Error' not in stderr: raise diff --git a/plinth/modules/storage/views.py b/plinth/modules/storage/views.py index 851929cb7..8a05cdf52 100644 --- a/plinth/modules/storage/views.py +++ b/plinth/modules/storage/views.py @@ -14,7 +14,7 @@ from django.views.decorators.http import require_POST from plinth import views from plinth.modules import storage -from . import get_error_message, privileged +from . import privileged logger = logging.getLogger(__name__) @@ -90,12 +90,6 @@ def eject(request, device_path): else: messages.success(request, _('Device can be safely unplugged.')) except Exception as exception: - message = get_error_message(exception.args[-2].decode()) # stdout - - logger.error('Error ejecting device - %s', message) - messages.error( - request, - _('Error ejecting device: {error_message}').format( - error_message=message)) + views.messages_error(request, _('Error ejecting device.'), exception) return redirect(reverse('storage:index')) diff --git a/plinth/modules/syncthing/__init__.py b/plinth/modules/syncthing/__init__.py index 2d18a525b..4c11317a6 100644 --- a/plinth/modules/syncthing/__init__.py +++ b/plinth/modules/syncthing/__init__.py @@ -47,7 +47,7 @@ class SyncthingApp(app_module.App): DAEMON = 'syncthing@syncthing' - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/tor/__init__.py b/plinth/modules/tor/__init__.py index 541ff9e92..d603aab2b 100644 --- a/plinth/modules/tor/__init__.py +++ b/plinth/modules/tor/__init__.py @@ -13,10 +13,10 @@ from plinth import cfg, kvstore, menu from plinth import setup as setup_module_ # Not setup_module, for pytest from plinth.daemon import (Daemon, app_is_running, diagnose_netcat, diagnose_port_listening) +from plinth.diagnostic_check import DiagnosticCheck, Result from plinth.modules import torproxy from plinth.modules.apache.components import Webserver from plinth.modules.backups.components import BackupRestore -from plinth.modules.diagnostics.check import DiagnosticCheck, Result from plinth.modules.firewall.components import Firewall from plinth.modules.names.components import DomainType from plinth.modules.torproxy.utils import is_apt_transport_tor_enabled @@ -53,7 +53,7 @@ class TorApp(app_module.App): _version = 7 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -123,7 +123,7 @@ class TorApp(app_module.App): super().disable() update_hidden_service_domain() - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Run diagnostics and return the results.""" results = super().diagnose() @@ -235,7 +235,7 @@ def update_hidden_service_domain(status=None): name=status['hs_hostname'], services=services) -def _diagnose_control_port(): +def _diagnose_control_port() -> list[DiagnosticCheck]: """Diagnose whether Tor control port is open on 127.0.0.1 only.""" results = [] @@ -249,7 +249,7 @@ def _diagnose_control_port(): negate = False results.append( - diagnose_netcat(address['address'], 9051, input='QUIT\n', - negate=negate)) + diagnose_netcat(str(address['address']), 9051, + remote_input='QUIT\n', negate=negate)) return results diff --git a/plinth/modules/torproxy/__init__.py b/plinth/modules/torproxy/__init__.py index 6e805bb7e..cd38b8c17 100644 --- a/plinth/modules/torproxy/__init__.py +++ b/plinth/modules/torproxy/__init__.py @@ -11,6 +11,7 @@ from django.utils.translation import gettext_noop from plinth import app as app_module from plinth import cfg, frontpage, kvstore, menu from plinth.daemon import Daemon +from plinth.diagnostic_check import DiagnosticCheck from plinth.modules.apache.components import diagnose_url from plinth.modules.backups.components import BackupRestore from plinth.modules.firewall.components import Firewall @@ -47,7 +48,7 @@ class TorProxyApp(app_module.App): _version = 1 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -100,7 +101,7 @@ class TorProxyApp(app_module.App): privileged.configure(apt_transport_tor=False) super().disable() - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Run diagnostics and return the results.""" results = super().diagnose() results.append(_diagnose_url_via_tor('http://www.debian.org', '4')) @@ -133,7 +134,8 @@ class TorProxyApp(app_module.App): privileged.uninstall() -def _diagnose_url_via_tor(url, kind=None): +def _diagnose_url_via_tor(url: str, + kind: str | None = None) -> DiagnosticCheck: """Diagnose whether a URL is reachable via Tor.""" result = diagnose_url(url, kind=kind, wrapper='torsocks') result.check_id = 'torproxy-url' @@ -142,7 +144,7 @@ def _diagnose_url_via_tor(url, kind=None): return result -def _diagnose_tor_use(url, kind=None): +def _diagnose_tor_use(url: str, kind: str | None = None) -> DiagnosticCheck: """Diagnose whether webpage at URL reports that we are using Tor.""" expected_output = 'Congratulations. This browser is configured to use Tor.' result = diagnose_url(url, kind=kind, wrapper='torsocks', diff --git a/plinth/modules/transmission/__init__.py b/plinth/modules/transmission/__init__.py index 5ecd1faad..4ad655571 100644 --- a/plinth/modules/transmission/__init__.py +++ b/plinth/modules/transmission/__init__.py @@ -62,7 +62,7 @@ class TransmissionApp(app_module.App): DAEMON = 'transmission-daemon' - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/ttrss/__init__.py b/plinth/modules/ttrss/__init__.py index 9445fcf67..de9f53f3a 100644 --- a/plinth/modules/ttrss/__init__.py +++ b/plinth/modules/ttrss/__init__.py @@ -40,7 +40,7 @@ class TTRSSApp(app_module.App): _version = 6 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/upgrades/__init__.py b/plinth/modules/upgrades/__init__.py index 9685ce5a6..14e7a49c7 100644 --- a/plinth/modules/upgrades/__init__.py +++ b/plinth/modules/upgrades/__init__.py @@ -57,7 +57,7 @@ class UpgradesApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -68,7 +68,8 @@ class UpgradesApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-upgrades', info.name, None, info.icon, - 'upgrades:index', parent_url_name='system') + 'upgrades:index', + parent_url_name='system:system', order=50) self.add(menu_item) packages = Packages('packages-upgrades', diff --git a/plinth/modules/upgrades/views.py b/plinth/modules/upgrades/views.py index 0736ff000..fc1d919c8 100644 --- a/plinth/modules/upgrades/views.py +++ b/plinth/modules/upgrades/views.py @@ -15,7 +15,7 @@ from django.views.generic.edit import FormView from plinth import __version__ from plinth.modules import first_boot, upgrades from plinth.privileged import packages as packages_privileged -from plinth.views import AppView +from plinth.views import AppView, messages_error from . import privileged from .forms import BackportsFirstbootForm, ConfigureForm, UpdateFirstbootForm @@ -56,6 +56,8 @@ class UpgradesConfigurationView(AppView): old_status = form.initial new_status = form.cleaned_data + is_changed = False + if old_status['auto_upgrades_enabled'] \ != new_status['auto_upgrades_enabled']: @@ -64,29 +66,21 @@ class UpgradesConfigurationView(AppView): privileged.enable_auto() else: privileged.disable_auto() - except Exception as exception: - error = exception.args[2] - messages.error( - self.request, - _('Error when configuring unattended-upgrades: {error}'). - format(error=error)) - if new_status['auto_upgrades_enabled']: - messages.success(self.request, _('Automatic upgrades enabled')) - else: - messages.success(self.request, - _('Automatic upgrades disabled')) + is_changed = True + except Exception as exception: + messages_error(self.request, + _('Error when configuring unattended-upgrades'), + exception) if old_status['dist_upgrade_enabled'] \ != new_status['dist_upgrade_enabled']: upgrades.set_dist_upgrade_enabled( new_status['dist_upgrade_enabled']) - if new_status['dist_upgrade_enabled']: - messages.success(self.request, - _('Distribution upgrade enabled')) - else: - messages.success(self.request, - _('Distribution upgrade disabled')) + is_changed = True + + if is_changed: + messages.success(self.request, _('Configuration updated.')) return super().form_valid(form) diff --git a/plinth/modules/users/__init__.py b/plinth/modules/users/__init__.py index b97bf28a0..021dffa5e 100644 --- a/plinth/modules/users/__init__.py +++ b/plinth/modules/users/__init__.py @@ -13,7 +13,8 @@ from plinth import app as app_module from plinth import cfg, menu from plinth.config import DropinConfigs from plinth.daemon import Daemon -from plinth.modules.diagnostics.check import DiagnosticCheck, Result +from plinth.diagnostic_check import (DiagnosticCheck, + DiagnosticCheckParameters, Result) from plinth.package import Packages from plinth.privileged import service as service_privileged @@ -50,7 +51,7 @@ class UsersApp(app_module.App): can_be_disabled = False - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -61,7 +62,8 @@ class UsersApp(app_module.App): self.add(info) menu_item = menu.Menu('menu-users', info.name, None, info.icon, - 'users:index', parent_url_name='system') + 'users:index', parent_url_name='system:system', + order=10) self.add(menu_item) packages = Packages('packages-users', [ @@ -85,7 +87,7 @@ class UsersApp(app_module.App): groups=groups) self.add(users_and_groups) - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Run diagnostics and return the results.""" results = super().diagnose() @@ -112,7 +114,7 @@ class UsersApp(app_module.App): privileged.create_group('freedombox-share') -def _diagnose_ldap_entry(search_item): +def _diagnose_ldap_entry(search_item: str) -> DiagnosticCheck: """Diagnose that an LDAP entry exists.""" check_id = f'users-ldap-entry-{search_item}' result = Result.FAILED @@ -125,12 +127,13 @@ def _diagnose_ldap_entry(search_item): pass description = gettext_noop('Check LDAP entry "{search_item}"') - parameters = {'search_item': search_item} + parameters: DiagnosticCheckParameters = {'search_item': search_item} return DiagnosticCheck(check_id, description, result, parameters) -def _diagnose_nslcd_config(config, key, value): +def _diagnose_nslcd_config(config: dict[str, str], key: str, + value: str) -> DiagnosticCheck: """Diagnose that nslcd has a configuration.""" check_id = f'users-nslcd-config-{key}' try: @@ -139,12 +142,12 @@ def _diagnose_nslcd_config(config, key, value): result = Result.FAILED description = gettext_noop('Check nslcd config "{key} {value}"') - parameters = {'key': key, 'value': value} + parameters: DiagnosticCheckParameters = {'key': key, 'value': value} return DiagnosticCheck(check_id, description, result, parameters) -def _diagnose_nsswitch_config(): +def _diagnose_nsswitch_config() -> list[DiagnosticCheck]: """Diagnose that Name Service Switch is configured to use LDAP.""" nsswitch_conf = '/etc/nsswitch.conf' aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + @@ -169,7 +172,7 @@ def _diagnose_nsswitch_config(): break description = gettext_noop('Check nsswitch config "{database}"') - parameters = {'database': database} + parameters: DiagnosticCheckParameters = {'database': database} results.append( DiagnosticCheck(check_id, description, result, parameters)) diff --git a/plinth/modules/users/forms.py b/plinth/modules/users/forms.py index 41df46aa1..e4297a662 100644 --- a/plinth/modules/users/forms.py +++ b/plinth/modules/users/forms.py @@ -50,6 +50,68 @@ class ValidNewUsernameCheckMixin: return True +def _create_django_groups(): + """Ensure that all groups are present in the Django's group table.""" + group_choices = UsersAndGroups.get_group_choices() + for group_name, _label in group_choices: + Group.objects.get_or_create(name=group_name) + + return group_choices + + +class EmailFieldMixin: + """Mixin to set common properties for the email field.""" + + def __init__(self, *args, **kwargs): + """Set basic properties for the email field.""" + super().__init__(*args, **kwargs) + + self.fields['email'].help_text = _( + 'Optional. Used to send emails to reset password and important ' + 'notifications.') + + +class GroupsFieldMixin: + """Mixin to set common properties for the group field.""" + + def __init__(self, *args, **kwargs): + """Set basic properties for the groups field. + + Also ensure that all the groups are created in django. + """ + groups_dict = dict(_create_django_groups()) + + super().__init__(*args, **kwargs) + + choices = [] + django_groups = sorted(self.fields['groups'].choices, + key=lambda choice: choice[1]) + for group_id, group_name in django_groups: + try: + group_id = group_id.value + except AttributeError: + pass + + # Show choices only from groups declared by apps. + if group_name in groups_dict: + label = groups_dict[group_name] + if group_name == 'admin' and self.is_last_admin_user: + label = {'label': label, 'disabled': True} + + choices.append((group_id, label)) + + self.fields['groups'].label = _('Permissions') + self.fields['groups'].choices = choices + self.fields['groups'].help_text = _( + 'Select which services should be available to the new ' + 'user. The user will be able to log in to services that ' + 'support single sign-on through LDAP, if they are in the ' + 'appropriate group.

Users in the admin group ' + 'will be able to log in to all services. They can also ' + 'log in to the system through SSH and have ' + 'administrative privileges (sudo).') + + @deconstructible class UsernameValidator(validators.RegexValidator): """Username validator. @@ -96,8 +158,8 @@ class PasswordConfirmForm(forms.Form): return confirm_password -class CreateUserForm(ValidNewUsernameCheckMixin, - plinth.forms.LanguageSelectionFormMixin, +class CreateUserForm(ValidNewUsernameCheckMixin, EmailFieldMixin, + GroupsFieldMixin, plinth.forms.LanguageSelectionFormMixin, PasswordConfirmForm, UserCreationForm): """Custom user create form. @@ -105,29 +167,22 @@ class CreateUserForm(ValidNewUsernameCheckMixin, """ username = USERNAME_FIELD - groups = forms.MultipleChoiceField( - choices=UsersAndGroups.get_group_choices, - label=gettext_lazy('Permissions'), required=False, - widget=plinth.forms.CheckboxSelectMultiple, help_text=gettext_lazy( - 'Select which services should be available to the new ' - 'user. The user will be able to log in to services that ' - 'support single sign-on through LDAP, if they are in the ' - 'appropriate group.

Users in the admin group ' - 'will be able to log in to all services. They can also ' - 'log in to the system through SSH and have ' - 'administrative privileges (sudo).')) language = plinth.forms.LanguageSelectionFormMixin.language class Meta(UserCreationForm.Meta): """Metadata to control automatic form building.""" - fields = ('username', 'password1', 'password2', 'groups', 'language', - 'confirm_password') + fields = ('username', 'email', 'password1', 'password2', 'groups', + 'language', 'confirm_password') + widgets = { + 'groups': plinth.forms.CheckboxSelectMultiple(), + } def __init__(self, request, *args, **kwargs): """Initialize the form with extra request argument.""" self.request = request + self.is_last_admin_user = False super().__init__(*args, **kwargs) self.fields['username'].widget.attrs.update({ 'autofocus': 'autofocus', @@ -140,6 +195,8 @@ class CreateUserForm(ValidNewUsernameCheckMixin, user = super().save(commit) if commit: + self.save_m2m() # Django 3.x does not call save_m2m() + user.userprofile.language = self.cleaned_data['language'] user.userprofile.save() auth_username = self.request.user.username @@ -155,7 +212,8 @@ class CreateUserForm(ValidNewUsernameCheckMixin, _('Creating LDAP user failed: {error}'.format( error=error))) - for group in self.cleaned_data['groups']: + groups = user.groups.values_list('name', flat=True) + for group in groups: try: privileged.add_user_to_group(user.get_username(), group, auth_username, @@ -173,6 +231,7 @@ class CreateUserForm(ValidNewUsernameCheckMixin, class UserUpdateForm(ValidNewUsernameCheckMixin, PasswordConfirmForm, + EmailFieldMixin, GroupsFieldMixin, plinth.forms.LanguageSelectionFormMixin, forms.ModelForm): """When user info is changed, also updates LDAP user.""" @@ -191,8 +250,8 @@ class UserUpdateForm(ValidNewUsernameCheckMixin, PasswordConfirmForm, class Meta: """Metadata to control automatic form building.""" - fields = ('username', 'groups', 'ssh_keys', 'language', 'is_active', - 'confirm_password') + fields = ('username', 'email', 'groups', 'ssh_keys', 'language', + 'is_active', 'confirm_password') model = User widgets = { 'groups': plinth.forms.CheckboxSelectMultipleWithReadOnly(), @@ -200,39 +259,15 @@ class UserUpdateForm(ValidNewUsernameCheckMixin, PasswordConfirmForm, def __init__(self, request, username, *args, **kwargs): """Initialize the form with extra request argument.""" - group_choices = dict(UsersAndGroups.get_group_choices()) - for group in group_choices: - Group.objects.get_or_create(name=group) - self.request = request self.username = username - super().__init__(*args, **kwargs) self.is_last_admin_user = get_last_admin_user() == self.username + super().__init__(*args, **kwargs) self.fields['username'].widget.attrs.update({ 'autocapitalize': 'none', 'autocomplete': 'username' }) - choices = [] - django_groups = sorted(self.fields['groups'].choices, - key=lambda choice: choice[1]) - for group_id, group_name in django_groups: - try: - group_id = group_id.value - except AttributeError: - pass - - # Show choices only from groups declared by apps. - if group_name in group_choices: - label = group_choices[group_name] - if group_name == 'admin' and self.is_last_admin_user: - label = {'label': label, 'disabled': True} - - choices.append((group_id, label)) - - self.fields['groups'].label = _('Permissions') - self.fields['groups'].choices = choices - if not is_user_admin(request): self.fields['is_active'].widget = forms.HiddenInput() self.fields['groups'].disabled = True @@ -347,11 +382,16 @@ class UserChangePasswordForm(PasswordConfirmForm, SetPasswordForm): return user -class FirstBootForm(ValidNewUsernameCheckMixin, auth.forms.UserCreationForm): +class FirstBootForm(ValidNewUsernameCheckMixin, EmailFieldMixin, + auth.forms.UserCreationForm): """User module first boot step: create a new admin user.""" username = USERNAME_FIELD + class Meta(UserCreationForm.Meta): + """Metadata to control automatic form building.""" + fields = ('username', 'email', 'password1') + def __init__(self, *args, **kwargs): self.request = kwargs.pop('request') super().__init__(*args, **kwargs) @@ -364,6 +404,8 @@ class FirstBootForm(ValidNewUsernameCheckMixin, auth.forms.UserCreationForm): """Create and log the user in.""" user = super().save(commit=commit) if commit: + self.save_m2m() # Django 3.x does not call save_m2m() + first_boot.mark_step_done('users_firstboot') try: @@ -383,9 +425,7 @@ class FirstBootForm(ValidNewUsernameCheckMixin, auth.forms.UserCreationForm): _('Failed to add new user to admin group: {error}'.format( error=error))) - # Create initial Django groups - for group_choice in UsersAndGroups.get_group_choices(): - auth.models.Group.objects.get_or_create(name=group_choice[0]) + _create_django_groups() admin_group = auth.models.Group.objects.get(name='admin') admin_group.user_set.add(user) diff --git a/plinth/modules/users/privileged.py b/plinth/modules/users/privileged.py index a67284e84..b1189691b 100644 --- a/plinth/modules/users/privileged.py +++ b/plinth/modules/users/privileged.py @@ -178,7 +178,7 @@ def _configure_ldapscripts(): @privileged -def get_nslcd_config(): +def get_nslcd_config() -> dict[str, str]: """Get nslcd configuration for diagnostics.""" nslcd_conf = '/etc/nslcd.conf' aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + diff --git a/plinth/modules/users/tests/test_functional.py b/plinth/modules/users/tests/test_functional.py index 063c7f548..d877ff81e 100644 --- a/plinth/modules/users/tests/test_functional.py +++ b/plinth/modules/users/tests/test_functional.py @@ -65,8 +65,9 @@ def test_create_user(session_browser): if functional.user_exists(session_browser, 'alice'): functional.delete_user(session_browser, 'alice') - functional.create_user(session_browser, 'alice') + functional.create_user(session_browser, 'alice', email='alice@example.com') assert functional.user_exists(session_browser, 'alice') + assert _get_email(session_browser, 'alice') == 'alice@example.com' def test_rename_user(session_browser): @@ -133,6 +134,17 @@ def test_users_cannot_connect_passwordless_over_ssh(session_browser, tmp_path_factory) +def test_update_user(session_browser): + """Test changing properties of a user.""" + functional.create_user(session_browser, 'alice', email='alice@example.com') + + # Update email + _set_email(session_browser, 'alice', 'alice1@example.com') + assert _get_email(session_browser, 'alice') == 'alice1@example.com' + _set_email(session_browser, 'alice', 'alice2@example.com') + assert _get_email(session_browser, 'alice') == 'alice2@example.com' + + @pytest.mark.parametrize('language_code', _language_codes.values()) def test_change_language(session_browser, language_code): """Test changing the language.""" @@ -254,6 +266,20 @@ def _rename_user(browser, old_name, new_name): functional.submit(browser, form_class='form-update') +def _set_email(browser, username, email): + """Set the email field value for a user.""" + functional.visit(browser, '/plinth/sys/users/{}/edit/'.format(username)) + browser.find_by_id('id_email').fill(email) + browser.find_by_id('id_confirm_password').fill(_admin_password) + functional.submit(browser, form_class='form-update') + + +def _get_email(browser, username): + """Return the email field value for a user.""" + functional.visit(browser, '/plinth/sys/users/{}/edit/'.format(username)) + return browser.find_by_id('id_email').value + + def _set_language(browser, language_code): username = functional.config['DEFAULT']['username'] functional.visit(browser, '/plinth/sys/users/{}/edit/'.format(username)) diff --git a/plinth/modules/users/tests/test_views.py b/plinth/modules/users/tests/test_views.py index ec4751beb..c0672b053 100644 --- a/plinth/modules/users/tests/test_views.py +++ b/plinth/modules/users/tests/test_views.py @@ -52,7 +52,8 @@ def module_patch(): patch(f'{privileged}.get_group_users') as get_group_users, \ patch('plinth.modules.ssh.privileged.set_keys'), \ patch('plinth.modules.ssh.privileged.get_keys') as get_keys, \ - patch(f'{privileged}.get_user_groups') as get_user_groups: + patch(f'{privileged}.get_user_groups') as get_user_groups, \ + patch(f'{privileged}.remove_user'): get_group_users.return_value = ['admin'] get_keys.return_value = [] get_user_groups.return_value = [] diff --git a/plinth/modules/wireguard/__init__.py b/plinth/modules/wireguard/__init__.py index 49297e1e4..043db2aba 100644 --- a/plinth/modules/wireguard/__init__.py +++ b/plinth/modules/wireguard/__init__.py @@ -39,7 +39,7 @@ class WireguardApp(app_module.App): _version = 1 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/wordpress/__init__.py b/plinth/modules/wordpress/__init__.py index 668e2c9c9..91d24de24 100644 --- a/plinth/modules/wordpress/__init__.py +++ b/plinth/modules/wordpress/__init__.py @@ -45,7 +45,7 @@ class WordPressApp(app_module.App): _version = 4 - def __init__(self): + def __init__(self) -> None: """Create components for the app.""" super().__init__() diff --git a/plinth/modules/wordpress/privileged.py b/plinth/modules/wordpress/privileged.py index 73a74adbe..0b5c92f72 100644 --- a/plinth/modules/wordpress/privileged.py +++ b/plinth/modules/wordpress/privileged.py @@ -36,8 +36,9 @@ def setup(): db_password = _generate_secret_key(16) _create_config_file(DB_HOST, DB_NAME, DB_USER, db_password) - _create_database(DB_NAME) - _set_privileges(DB_HOST, DB_NAME, DB_USER, db_password) + with action_utils.service_ensure_running('mysql'): + _create_database(DB_NAME) + _set_privileges(DB_HOST, DB_NAME, DB_USER, db_password) def _create_config_file(db_host, db_name, db_user, db_password): @@ -143,21 +144,23 @@ def is_public() -> bool: def dump_database(): """Dump database to file.""" _db_backup_file.parent.mkdir(parents=True, exist_ok=True) - with _db_backup_file.open('w', encoding='utf-8') as file_handle: - subprocess.run([ - 'mysqldump', '--add-drop-database', '--add-drop-table', - '--add-drop-trigger', '--user', 'root', '--databases', DB_NAME - ], stdout=file_handle, check=True) + with action_utils.service_ensure_running('mysql'): + with _db_backup_file.open('w', encoding='utf-8') as file_handle: + subprocess.run([ + 'mysqldump', '--add-drop-database', '--add-drop-table', + '--add-drop-trigger', '--user', 'root', '--databases', DB_NAME + ], stdout=file_handle, check=True) @privileged def restore_database(): """Restore database from file.""" - with _db_backup_file.open('r', encoding='utf-8') as file_handle: - subprocess.run(['mysql', '--user', 'root'], stdin=file_handle, - check=True) + with action_utils.service_ensure_running('mysql'): + with _db_backup_file.open('r', encoding='utf-8') as file_handle: + subprocess.run(['mysql', '--user', 'root'], stdin=file_handle, + check=True) - _set_privileges(DB_HOST, DB_NAME, DB_USER, _read_db_password()) + _set_privileges(DB_HOST, DB_NAME, DB_USER, _read_db_password()) def _read_db_password(): @@ -180,13 +183,18 @@ def _load_augeas(): @privileged def uninstall(): """Remove config files and drop database.""" - _drop_database() + _drop_database(DB_HOST, DB_NAME, DB_USER) for file_ in [_public_access_file, _config_file_path, _db_file_path]: file_.unlink(missing_ok=True) -def _drop_database(): +def _drop_database(db_host, db_name, db_user): """Drop the mysql database that was created during install.""" - query = f'''DROP DATABASE {DB_NAME};''' - subprocess.run(['mysql', '--user', 'root'], input=query.encode(), - check=True) + with action_utils.service_ensure_running('mysql'): + query = f"DROP DATABASE {db_name};" + subprocess.run(['mysql', '--user', 'root'], input=query.encode(), + check=False) + + query = f"DROP USER IF EXISTS {db_user}@{db_host};" + subprocess.run(['mysql', '--user', 'root'], input=query.encode(), + check=False) diff --git a/plinth/modules/wordpress/tests/test_functional.py b/plinth/modules/wordpress/tests/test_functional.py index 9cbc5cb2d..0042ae427 100644 --- a/plinth/modules/wordpress/tests/test_functional.py +++ b/plinth/modules/wordpress/tests/test_functional.py @@ -80,6 +80,7 @@ def test_backup(session_browser): _write_post(session_browser, 'FunctionalTest') functional.backup_create(session_browser, 'wordpress', 'test_wordpress') _delete_post(session_browser, 'FunctionalTest') + functional.uninstall(session_browser, 'wordpress') functional.backup_restore(session_browser, 'wordpress', 'test_wordpress') assert _get_post(session_browser, 'FunctionalTest') diff --git a/plinth/modules/zoph/__init__.py b/plinth/modules/zoph/__init__.py index 3f6297c19..1008272dc 100644 --- a/plinth/modules/zoph/__init__.py +++ b/plinth/modules/zoph/__init__.py @@ -46,7 +46,9 @@ class ZophApp(app_module.App): _version = 2 - def __init__(self): + configure_when_disabled = False + + def __init__(self) -> None: """Create components for the app.""" super().__init__() @@ -100,7 +102,11 @@ class ZophApp(app_module.App): def setup(self, old_version): """Install and configure the app.""" privileged.pre_install() - super().setup(old_version) + with self.get_component('shared-daemon-zoph-mysql').ensure_running(): + # Database needs to be running for successful initialization or + # upgrade of zoph database. + super().setup(old_version) + privileged.setup() if not old_version: self.enable() @@ -108,6 +114,12 @@ class ZophApp(app_module.App): if self.get_component('webserver-zoph').is_enabled(): self.enable() + def uninstall(self): + """De-configure and uninstall the app.""" + # Before package uninstall, so that config file is still available + privileged.uninstall() + super().uninstall() + class ZophBackupRestore(BackupRestore): """Component to backup/restore Zoph database""" diff --git a/plinth/modules/zoph/privileged.py b/plinth/modules/zoph/privileged.py index e5f3b79b9..2f5655c88 100644 --- a/plinth/modules/zoph/privileged.py +++ b/plinth/modules/zoph/privileged.py @@ -3,6 +3,7 @@ import configparser import os +import pathlib import re import subprocess @@ -10,6 +11,7 @@ from plinth import action_utils from plinth.actions import privileged APACHE_CONF = '/etc/apache2/conf-available/zoph.conf' +DB_CONF = pathlib.Path('/etc/zoph.ini') DB_BACKUP_FILE = '/var/lib/plinth/backups-data/zoph-database.sql' @@ -18,7 +20,9 @@ def pre_install(): """Preseed debconf values before packages are installed.""" action_utils.debconf_set_selections([ 'zoph zoph/dbconfig-install boolean true', - 'zoph zoph/mysql/admin-user string root' + 'zoph zoph/dbconfig-upgrade boolean true', + 'zoph zoph/dbconfig-remove boolean true', + 'zoph zoph/mysql/admin-user string root', ]) @@ -42,25 +46,34 @@ def _zoph_configure(key, value): @privileged def setup(): - """Setup Zoph configuration.""" - _zoph_configure('import.enable', 'true') - _zoph_configure('import.upload', 'true') - _zoph_configure('import.rotate', 'true') - _zoph_configure('path.unzip', 'unzip') - _zoph_configure('path.untar', 'tar xvf') - _zoph_configure('path.ungz', 'gunzip') + """Setup Zoph configuration. - # Maps using OpenStreetMap is enabled by default. - _zoph_configure('maps.provider', 'osm') + May be called when app is disabled. + """ + with action_utils.service_ensure_running('mysql'): + _zoph_configure('import.enable', 'true') + _zoph_configure('import.upload', 'true') + _zoph_configure('import.rotate', 'true') + _zoph_configure('path.unzip', 'unzip') + _zoph_configure('path.untar', 'tar xvf') + _zoph_configure('path.ungz', 'gunzip') + + # Maps using OpenStreetMap is enabled by default. + _zoph_configure('maps.provider', 'osm') -def _get_db_name(): +def _get_db_config(): """Return the name of the database configured by dbconfig.""" config = configparser.ConfigParser() - with open('/etc/zoph.ini', 'r', encoding='utf-8') as file_handle: + with DB_CONF.open('r', encoding='utf-8') as file_handle: config.read_file(file_handle) - return config['zoph']['db_name'].strip('"') + return { + 'db_host': config['zoph']['db_host'].strip('"'), + 'db_name': config['zoph']['db_name'].strip('"'), + 'db_user': config['zoph']['db_user'].strip('"'), + 'db_pass': config['zoph']['db_pass'].strip('"'), + } @privileged @@ -84,37 +97,70 @@ def set_configuration(enable_osm: bool | None = None, query = f"UPDATE zoph_users SET user_name='{admin_user}' \ WHERE user_name='admin';" - subprocess.run(['mysql', _get_db_name()], input=query.encode(), - check=True) + subprocess.run(['mysql', _get_db_config()['db_name']], + input=query.encode(), check=True) @privileged def is_configured() -> bool | None: """Return whether zoph app is configured.""" - try: - process = subprocess.run( - ['zoph', '--get-config', 'interface.user.remote'], - stdout=subprocess.PIPE, check=True) - return process.stdout.decode().strip() == 'true' - except FileNotFoundError: - return None + process = subprocess.run(['zoph', '--get-config', 'interface.user.remote'], + stdout=subprocess.PIPE, check=True) + return process.stdout.decode().strip() == 'true' @privileged def dump_database(): - """Dump database to file.""" - db_name = _get_db_name() - os.makedirs(os.path.dirname(DB_BACKUP_FILE), exist_ok=True) - with open(DB_BACKUP_FILE, 'w', encoding='utf-8') as db_backup_file: - subprocess.run(['mysqldump', db_name], stdout=db_backup_file, - check=True) + """Dump database to file. + + May be called when app is disabled. + """ + with action_utils.service_ensure_running('mysql'): + db_name = _get_db_config()['db_name'] + os.makedirs(os.path.dirname(DB_BACKUP_FILE), exist_ok=True) + with open(DB_BACKUP_FILE, 'w', encoding='utf-8') as db_backup_file: + subprocess.run(['mysqldump', db_name], stdout=db_backup_file, + check=True) @privileged def restore_database(): - """Restore database from file.""" - db_name = _get_db_name() - subprocess.run(['mysqladmin', '--force', 'drop', db_name], check=False) - subprocess.run(['mysqladmin', 'create', db_name], check=True) - with open(DB_BACKUP_FILE, 'r', encoding='utf-8') as db_restore_file: - subprocess.run(['mysql', db_name], stdin=db_restore_file, check=True) + """Restore database from file. + + May be called when app is disabled. + """ + with action_utils.service_ensure_running('mysql'): + db_name = _get_db_config()['db_name'] + db_user = _get_db_config()['db_user'] + db_host = _get_db_config()['db_host'] + db_pass = _get_db_config()['db_pass'] + subprocess.run(['mysqladmin', '--force', 'drop', db_name], check=False) + subprocess.run(['mysqladmin', 'create', db_name], check=True) + with open(DB_BACKUP_FILE, 'r', encoding='utf-8') as db_restore_file: + subprocess.run(['mysql', db_name], stdin=db_restore_file, + check=True) + + # Set the password for user from restored configuration + query = f'ALTER USER {db_user}@{db_host} IDENTIFIED BY "{db_pass}";' + subprocess.run(['mysql'], input=query.encode(), check=True) + + +@privileged +def uninstall(): + """Drop database, database user and database configuration. + + May be called when app is disabled. + """ + with action_utils.service_ensure_running('mysql'): + try: + config = _get_db_config() + subprocess.run( + ['mysqladmin', '--force', 'drop', config['db_name']], + check=False) + + query = f'DROP USER IF EXISTS {config["db_user"]}@localhost;' + subprocess.run(['mysql'], input=query.encode(), check=False) + except FileNotFoundError: # Database configuration not found + pass + + DB_CONF.unlink(missing_ok=True) diff --git a/plinth/modules/zoph/tests/test_functional.py b/plinth/modules/zoph/tests/test_functional.py index 62fa7f82c..1b34c2abe 100644 --- a/plinth/modules/zoph/tests/test_functional.py +++ b/plinth/modules/zoph/tests/test_functional.py @@ -15,17 +15,16 @@ class TestZophApp(functional.BaseAppTests): has_service = False has_web = True - @pytest.fixture(scope='class', autouse=True) - def fixture_setup(self, session_browser): - """Setup the app.""" - functional.login(session_browser) - functional.install(session_browser, self.app_name) + def install_and_setup(self, session_browser): + """Install the app and run setup.""" + super().install_and_setup(session_browser) self._zoph_is_setup(session_browser) def _zoph_is_setup(self, session_browser): """Click setup button on the setup page.""" functional.nav_to_module(session_browser, self.app_name) - functional.submit(session_browser, form_class='form-configuration') + if session_browser.find_by_css('.form-configuration'): + functional.submit(session_browser, form_class='form-configuration') def assert_app_running(self, session_browser): assert functional.app_is_enabled(session_browser, self.app_name) diff --git a/plinth/modules/zoph/views.py b/plinth/modules/zoph/views.py index f646f5de6..9e9cabb1b 100644 --- a/plinth/modules/zoph/views.py +++ b/plinth/modules/zoph/views.py @@ -48,12 +48,12 @@ class ZophAppView(views.AppView): def dispatch(self, request, *args, **kwargs): """Redirect to setup page if setup is not done yet.""" - is_configured = privileged.is_configured() - if is_configured is False: - return redirect('zoph:setup') + status = self.get_common_status() + if status['is_enabled']: + # When disabled, such as when uninstalling + if privileged.is_configured() is False: + return redirect('zoph:setup') - # During operations such as uninstall, zoph command may not be - # available, let the base class show operations view instead. return super().dispatch(request, *args, **kwargs) def get_initial(self): diff --git a/plinth/package.py b/plinth/package.py index 5de556c60..6bb0a71ae 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -6,12 +6,15 @@ import logging import pathlib import time +import apt import apt.cache from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy, gettext_noop import plinth.privileged.packages as privileged from plinth import app as app_module +from plinth.diagnostic_check import (DiagnosticCheck, + DiagnosticCheckParameters, Result) from plinth.errors import MissingPackageError from plinth.utils import format_lazy @@ -181,29 +184,18 @@ class Packages(app_module.FollowerComponent): def uninstall(self): """Uninstall and purge the packages.""" + # Ensure package list is update-to-date before looking at dependencies. + refresh_package_lists() + + # List of packages to purge from the system packages = self.get_actual_packages() - packages_set = set(packages) - for app in app_module.App.list(): - # uninstall() will be called on Packages of this app separately - # for uninstalling this app. - if app == self.app: - continue + logger.info('App\'s list of packages to remove: %s', packages) - if app.get_setup_state() == app_module.App.SetupState.NEEDS_SETUP: - continue + packages = self._filter_packages_to_keep(packages) + uninstall(packages, purge=True) - # Remove packages used by other installed apps - for component in app.get_components_of_type(Packages): - packages_set -= set(component.get_actual_packages()) - - # Preserve order of packages for ease of testing - uninstall([package for package in packages if package in packages_set], - purge=True) - - def diagnose(self): + def diagnose(self) -> list[DiagnosticCheck]: """Run diagnostics and return results.""" - from plinth.modules.diagnostics.check import DiagnosticCheck, Result - results = super().diagnose() cache = apt.Cache() for package_expression in self.package_expressions: @@ -213,7 +205,9 @@ class Packages(app_module.FollowerComponent): check_id = f'package-available-{package_expression}' description = gettext_noop('Package {package_expression} is ' 'not available for install') - parameters = {'package_expression': str(package_expression)} + parameters: DiagnosticCheckParameters = { + 'package_expression': str(package_expression) + } results.append( DiagnosticCheck(check_id, description, Result.FAILED, parameters)) @@ -223,16 +217,17 @@ class Packages(app_module.FollowerComponent): latest_version = '?' if package_name in cache: package = cache[package_name] - latest_version = package.candidate.version - if package.candidate.is_installed: - result = Result.PASSED + if package.candidate: + latest_version = package.candidate.version + if package.candidate.is_installed: + result = Result.PASSED check_id = f'package-latest-{package_name}' description = gettext_noop('Package {package_name} is the latest ' 'version ({latest_version})') parameters = { - 'package_name': package_name, - 'latest_version': latest_version, + 'package_name': str(package_name), + 'latest_version': str(latest_version) } results.append( DiagnosticCheck(check_id, description, result, parameters)) @@ -268,22 +263,64 @@ class Packages(app_module.FollowerComponent): return False + def _filter_packages_to_keep(self, packages: list[str]) -> list[str]: + """Filter out the list of packages to keep from given list. + + Packages to keep are packages needed by other installed apps and their + dependencies (PreDepends, Depends, Recommends). + """ + packages_set: set[str] = set(packages) + + # Get list of packages needed by other installed apps (packages to + # keep). + keep_packages: set[str] = set() + for app in app_module.App.list(): + # uninstall() will be called on Packages of this app separately + # for uninstalling this app. + if app == self.app: + continue + + if app.get_setup_state() == app_module.App.SetupState.NEEDS_SETUP: + continue + + # Remove packages used by other installed apps + for component in app.get_components_of_type(Packages): + keep_packages |= set(component.get_actual_packages()) + + # Get list of all the dependencies of packages to keep. + keep_packages_with_deps: set[str] = set() + cache = apt.Cache() + while keep_packages: + package_name = keep_packages.pop() + if package_name in keep_packages_with_deps: + continue # Already processed + + keep_packages_with_deps.add(package_name) + if package_name not in cache: + continue # Package is not available in sources + + if not cache[package_name].is_installed: + continue # Package is not installed + + version = cache[package_name].installed + if not version: + continue + + dependencies = version.dependencies + version.recommends + for dependency in dependencies: + for or_dependency in dependency.or_dependencies: + keep_packages.add(or_dependency.name) + + # Filter out any packages that are to be kept or their dependencies. + packages_set -= keep_packages_with_deps + + # Preserve order of packages for ease of testing. + return [package for package in packages if package in packages_set] + class PackageException(Exception): """A package operation has failed.""" - def __init__(self, error_string=None, error_details=None, *args, **kwargs): - """Store apt-get error string and details.""" - super().__init__(*args, **kwargs) - - self.error_string = error_string - self.error_details = error_details - - def __str__(self): - """Return the strin representation of the exception.""" - return 'PackageException(error_string="{0}", error_details="{1}")' \ - .format(self.error_string, self.error_details) - class Transaction: """Information about an ongoing transaction.""" diff --git a/plinth/setup.py b/plinth/setup.py index edf9e54f9..12729e519 100644 --- a/plinth/setup.py +++ b/plinth/setup.py @@ -13,7 +13,7 @@ from django.utils.translation import gettext_noop import plinth from plinth import app as app_module -from plinth.package import PackageException, Packages +from plinth.package import Packages from plinth.signals import post_setup from . import operation as operation_module @@ -69,18 +69,6 @@ def _run_setup_on_app(app, current_version): app.setup(old_version=current_version) app.set_setup_version(app.info.version) post_setup.send_robust(sender=app.__class__, module_name=app.app_id) - except PackageException as exception: - exception_to_update = exception - error_string = getattr(exception, 'error_string', str(exception)) - error_details = getattr(exception, 'error_details', '') - if not current_version: - message = gettext_noop('Error installing app: {string} ' - '{details}').format(string=error_string, - details=error_details) - else: - message = gettext_noop('Error updating app: {string} ' - '{details}').format(string=error_string, - details=error_details) except Exception as exception: exception_to_update = exception if not current_version: @@ -124,14 +112,6 @@ def _run_uninstall_on_app(app): app.disable() app.uninstall() app.set_setup_version(0) - except PackageException as exception: - exception_to_update = exception - error_string = getattr(exception, 'error_string', str(exception)) - error_details = getattr(exception, 'error_details', '') - message = gettext_noop('Error uninstalling app: {string} ' - '{details}').format(string=error_string, - details=error_details) - except Exception as exception: exception_to_update = exception message = gettext_noop('Error uninstalling app: {error}').format( diff --git a/plinth/templates/cards.html b/plinth/templates/cards.html index da19bdc3a..f5ba47d82 100644 --- a/plinth/templates/cards.html +++ b/plinth/templates/cards.html @@ -31,7 +31,7 @@ {% if show_disabled %}
-
{% trans "Disabled" %}
+
{% trans "Disabled" %}
{% for item in submenu.sorted_items %} diff --git a/plinth/templates/messages.html b/plinth/templates/messages.html index 9fe1932ff..95ae9847f 100644 --- a/plinth/templates/messages.html +++ b/plinth/templates/messages.html @@ -5,7 +5,7 @@ {% load i18n %} {% for message in messages %} -
+
{{ message }}