diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 00a764af8..000000000 --- a/.coveragerc +++ /dev/null @@ -1,9 +0,0 @@ -# .coveragerc -- specifies execution options for coverage.py - -[run] -branch = True -omit = */tests/* - -[report] -precision = 2 -omit = */tests/* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a22e93d80..ae7020554 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,7 +28,7 @@ unit-tests: - echo "tester:password" | chpasswd - cp -r . /home/tester/plinth - chown -R tester:tester /home/tester/plinth - - su -c "cd ~/plinth;PYTHONPATH='.' py.test-3 --cov=plinth --cov-report=html:/home/tester/plinth/htmlcov --cov-config=.coveragerc --cov-report=term" tester + - su -c "cd ~/plinth;PYTHONPATH='.' py.test-3 --cov=plinth --cov-report=html:/home/tester/plinth/htmlcov --cov-report=term" tester - cp -r /home/tester/plinth/htmlcov test-coverage-report coverage: '/^TOTAL\s+.*\s+(\d+\.\d+%)$/' artifacts: diff --git a/HACKING.md b/HACKING.md index df5ecdf1b..5f2f230cf 100644 --- a/HACKING.md +++ b/HACKING.md @@ -338,7 +338,7 @@ For more information on translations: https://wiki.debian.org/FreedomBox/Transla ### Running Tests -To run all the tests in the container/VM: +To run all the standard unit tests in the container/VM: ```bash guest$ py.test-3 @@ -369,6 +369,29 @@ guest$ py.test-3 plinth/tests/test_actions.py::TestActions guest$ py.test-3 plinth/tests/test_actions.py::TestActions::test_is_package_manager_busy ``` +Some tests are skipped by default: +* tests that need root privileges, +* functional tests (they need additional preparation to run. See next section), +* tests that take much time to run. + +Use `sudo` to run the ones that need root access: +```bash +guest$ sudo py.test-3 +``` + +To force functional tests and tests that take long to run, set the environment +variable EXTENDED_TESTING=1: + +```bash +guest$ EXTENDED_TESTING=1 py.test-3 +``` + +To really run all tests, combine sudo with EXTENDED_TESTING: + +```bash +guest$ sudo EXTENDED_TESTING=1 py.test-3 +``` + ### Running the Test Coverage Analysis To run the coverage tool in the container/VM: @@ -426,7 +449,6 @@ host$ pip3 install splinter host$ pip3 install pytest-splinter host$ pip3 install pytest-xdist # optional, to run tests in parallel host$ sudo apt install firefox -host$ sudo apt install python3-pytest-bdd host$ sudo apt install xvfb python3-pytest-xvfb # optional, to avoid opening browser windows host$ sudo apt install smbclient # optional, to test samba ``` diff --git a/actions/monkeysphere b/actions/monkeysphere index c01e9246e..e9c892a7e 100755 --- a/actions/monkeysphere +++ b/actions/monkeysphere @@ -226,7 +226,8 @@ def _get_ssh_key_file_for_import(original_key_file, service): shutil.copy2(original_key_file, key_file) # Convert OpenSSH format to PEM subprocess.run( - ['ssh-keygen', '-p', '-N', '', '-m', 'PEM', '-f', key_file]) + ['ssh-keygen', '-p', '-N', '', '-m', 'PEM', '-f', key_file], + check=True) yield key_file diff --git a/actions/packages b/actions/packages index 53d2afa7d..24517a3cd 100755 --- a/actions/packages +++ b/actions/packages @@ -48,6 +48,11 @@ def parse_arguments(): 'module', help='name of module for which package is being installed') subparser.add_argument('packages', nargs='+', help='list of packages to install') + + subparser = subparsers.add_parser('remove', help='remove the package(s)') + subparser.add_argument('--packages', required=True, + help='List of packages to remove', nargs='+') + subparsers.add_parser('is-package-manager-busy', help='Return whether package manager is busy') subparser = subparsers.add_parser( @@ -91,7 +96,7 @@ def subcommand_install(arguments): if arguments.force_missing_configuration: extra_arguments += ['-o', 'Dpkg::Options::=--force-confmiss'] - subprocess.run(['dpkg', '--configure', '-a']) + subprocess.run(['dpkg', '--configure', '-a'], check=False) with apt_hold_freedombox(): run_apt_command(['--fix-broken', 'install']) returncode = run_apt_command(['install'] + extra_arguments + @@ -100,6 +105,11 @@ def subcommand_install(arguments): sys.exit(returncode) +def subcommand_remove(arguments): + """Remove apt package(s).""" + sys.exit(run_apt_command(['remove'] + arguments.packages)) + + def _assert_managed_packages(module, packages): """Check that list of packages are in fact managed by module.""" cfg.read() @@ -116,7 +126,8 @@ def _assert_managed_packages(module, packages): def subcommand_is_package_manager_busy(_): """Check whether package manager is busy. - An exit code of zero indicates that package manager is busy.""" + An exit code of zero indicates that package manager is busy. + """ if not is_package_manager_busy(): sys.exit(-1) diff --git a/actions/storage b/actions/storage index 9ed372117..814c0adaf 100755 --- a/actions/storage +++ b/actions/storage @@ -273,7 +273,7 @@ def subcommand_mount(arguments): process = subprocess.run([ 'udisksctl', 'mount', '--block-device', arguments.block_device, '--no-user-interaction' - ]) + ], check=False) sys.exit(process.returncode) diff --git a/actions/upgrades b/actions/upgrades index 4edcb1be4..6abcaad9d 100755 --- a/actions/upgrades +++ b/actions/upgrades @@ -140,7 +140,7 @@ def parse_arguments(): def _run(): """Run unattended-upgrades""" - subprocess.run(['dpkg', '--configure', '-a']) + subprocess.run(['dpkg', '--configure', '-a'], check=False) run_apt_command(['--fix-broken', 'install']) # In case freedombox package was left in held state by an @@ -453,7 +453,7 @@ def _perform_dist_upgrade(): ['grub-pc grub-pc/install_devices_empty boolean true']) print('Running unattended-upgrade...', flush=True) - subprocess.run(['unattended-upgrade', '--verbose']) + subprocess.run(['unattended-upgrade', '--verbose'], check=False) # Remove obsolete packages that may prevent other packages from # upgrading. @@ -492,7 +492,7 @@ def _perform_dist_upgrade(): # Run unattended-upgrade once more to handle upgrading the # freedombox package. print('Running unattended-upgrade...', flush=True) - subprocess.run(['unattended-upgrade', '--verbose']) + subprocess.run(['unattended-upgrade', '--verbose'], check=False) # Restore original snapshots configuration. if snapshots_supported and apt_snapshots_enabled: diff --git a/actions/users b/actions/users index 5e0656cb8..d7f06db71 100755 --- a/actions/users +++ b/actions/users @@ -373,7 +373,7 @@ def set_samba_user(username, password): """ proc = subprocess.run(['smbpasswd', '-a', '-s', username], input='{0}\n{0}\n'.format(password).encode(), - stderr=subprocess.PIPE) + stderr=subprocess.PIPE, check=False) if proc.returncode != 0: raise RuntimeError('Unable to add Samba user: ', proc.stderr) @@ -580,13 +580,12 @@ def flush_cache(): action_utils.service_reload('apache2') -def _run(arguments, **kwargs): +def _run(arguments, check=True, **kwargs): """Run a command. Check return code and suppress output by default.""" env = dict(os.environ, LDAPSCRIPTS_CONF=LDAPSCRIPTS_CONF) kwargs['stdout'] = kwargs.get('stdout', subprocess.DEVNULL) kwargs['stderr'] = kwargs.get('stderr', subprocess.DEVNULL) - kwargs['check'] = kwargs.get('check', True) - return subprocess.run(arguments, env=env, **kwargs) + return subprocess.run(arguments, env=env, check=check, **kwargs) def main(): diff --git a/actions/zoph b/actions/zoph index 3b6b8a831..b32a5298c 100755 --- a/actions/zoph +++ b/actions/zoph @@ -128,7 +128,7 @@ def subcommand_dump_database(_): def subcommand_restore_database(_): """Restore database from file.""" db_name = _get_db_name() - subprocess.run(['mysqladmin', '--force', 'drop', 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') as db_restore_file: subprocess.run(['mysql', db_name], stdin=db_restore_file, check=True) diff --git a/conftest.py b/conftest.py index b016f7fcb..10aca349c 100644 --- a/conftest.py +++ b/conftest.py @@ -12,18 +12,16 @@ from unittest.mock import patch import pytest try: - importlib.import_module('pytest_bdd') - _bdd_available = True + importlib.import_module('splinter') + _splinter_available = True except ImportError: - _bdd_available = False -else: - from plinth.tests.functional.step_definitions import * + _splinter_available = False def pytest_ignore_collect(path, config): - """Return True to ignore functional tests.""" + """Ignore functional tests when splinter is not available.""" if path.basename == 'test_functional.py': - return not _bdd_available + return not _splinter_available def pytest_addoption(parser): @@ -33,18 +31,29 @@ def pytest_addoption(parser): def pytest_collection_modifyitems(config, items): - """Filter out functional tests unless --include-functional is passed.""" - if config.getoption('--include-functional'): - # Option provided on command line, no filtering - return + """Filter out specificly marked tests unless explicitly requested. - skip_functional = pytest.mark.skip( - reason='--include-functional not provided') - for item in items: - if 'functional' in item.keywords or (item.parent.fspath.basename - and item.parent.fspath.basename - == 'test_functional.py'): - item.add_marker(skip_functional) + 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') diff --git a/container b/container index 068de7962..48194ac26 100755 --- a/container +++ b/container @@ -199,7 +199,7 @@ apt-get update DEBIAN_FRONTEND=noninteractive apt-get -yq --with-new-pkgs upgrade # Install requirements for tests if not already installed as root -if ! [[ -e /usr/local/bin/geckodriver && -e /usr/local/bin/pytest-bdd ]] +if ! [[ -e /usr/local/bin/geckodriver ]] then /freedombox/plinth/tests/functional/install.sh fi @@ -327,7 +327,7 @@ def _check_command(command): else: which = ['sudo', 'which', command] - process = subprocess.run(which, stdout=subprocess.DEVNULL) + process = subprocess.run(which, stdout=subprocess.DEVNULL, check=False) return process.returncode == 0 @@ -341,7 +341,8 @@ def _verify_dependencies(): # it leading to machinectl start failing first time after boot. See # https://github.com/systemd/systemd/issues/13130 . Workaround for old # versions of machinectl. Ignore errors. - subprocess.run(['sudo', 'modprobe', '--all', '--quiet', 'loop']) + subprocess.run(['sudo', 'modprobe', '--all', '--quiet', 'loop'], + check=False) dependencies = { 'systemd-nspawn': 'systemd-container', @@ -370,13 +371,13 @@ def _verify_dependencies(): ' '.join(missing_commands)) process = subprocess.run(['lsb_release', '--id', '--short'], - stdout=subprocess.PIPE) + stdout=subprocess.PIPE, check=False) if process.stdout.decode().strip() != 'Debian': sys.exit(1) logger.info('Running apt for missing packages: %s', ' '.join(missing_commands)) - subprocess.run(['sudo', 'apt', 'install'] + missing_packages) + subprocess.run(['sudo', 'apt', 'install'] + missing_packages, check=False) def _get_systemd_nspawn_version(): @@ -583,7 +584,7 @@ def _setup_nm_connection(distribution): connection_name = f'fbx-{distribution}-shared' process = subprocess.run( ['sudo', 'nmcli', 'connection', 'show', connection_name], - stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=False) if not process.returncode: return @@ -600,7 +601,8 @@ def _setup_nm_connection(distribution): subprocess.run(['sudo', 'nmcli', 'connection', 'add'] + list(itertools.chain(*properties.items())), check=True) subprocess.run(['sudo', 'nmcli', 'connection', 'up', connection_name], - stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + check=False) def _setup_users(image_file): @@ -649,7 +651,7 @@ def _setup_ssh(image_file): logger.info('Generating SSH client key %s', key_file) subprocess.run( ['ssh-keygen', '-t', 'ed25519', '-N', '', '-f', - str(key_file)], stdout=subprocess.DEVNULL) + str(key_file)], stdout=subprocess.DEVNULL, check=True) public_key_file = key_file.with_suffix('.pub') public_key = public_key_file.read_bytes() @@ -713,33 +715,35 @@ VirtualEthernet=yes ''' nspawn_file = f'/run/systemd/nspawn/{machine_name}.nspawn' logger.info('Creating systemd-nspawn configuration: %s', nspawn_file) - subprocess.run(['sudo', 'rm', '--force', nspawn_file]) + subprocess.run(['sudo', 'rm', '--force', nspawn_file], check=False) subprocess.run(['sudo', 'tee', nspawn_file], input=nspawn_options.encode(), stdout=subprocess.DEVNULL, check=True) image_link = pathlib.Path(f'/var/lib/machines/{machine_name}.raw') logger.info('Linking systemd-nspawn image %s -> %s', image_link, image_file) - result = subprocess.run(['sudo', 'test', '-e', str(image_link)]) + result = subprocess.run( + ['sudo', 'test', '-e', str(image_link)], check=False) if not result.returncode: - result = subprocess.run(['sudo', 'test', '-L', str(image_link)]) + result = subprocess.run( + ['sudo', 'test', '-L', str(image_link)], check=False) if result.returncode: raise Exception(f'Image file {image_link} is not a symlink.') - subprocess.run(['sudo', 'rm', '--force', str(image_link)]) + subprocess.run(['sudo', 'rm', '--force', str(image_link)], check=False) subprocess.run([ 'sudo', 'ln', '--symbolic', str(image_file.resolve()), str(image_link) - ]) + ], check=False) def _get_machine_status(machine_name): """Return the running status of a container.""" process = subprocess.run(['sudo', 'machinectl', 'status', machine_name], stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL) + stderr=subprocess.DEVNULL, check=False) return process.returncode == 0 @@ -756,14 +760,14 @@ def _launch(image_file, distribution): f'fbx-{distribution}-shared') subprocess.run( ['sudo', 'nmcli', 'connection', 'up', f'fbx-{distribution}-shared'], - stdout=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, check=False) def _stop(distribution): """Stop the container.""" machine_name = f'fbx-{distribution}' logger.info('Running `machinectl stop %s`', machine_name) - subprocess.run(['sudo', 'machinectl', 'stop', machine_name]) + subprocess.run(['sudo', 'machinectl', 'stop', machine_name], check=False) _wait_for(lambda: not _get_machine_status(machine_name)) @@ -771,7 +775,8 @@ def _terminate(distribution): """Terminal the container.""" machine_name = f'fbx-{distribution}' logger.info('Running `machinectl terminate %s`', machine_name) - subprocess.run(['sudo', 'machinectl', 'terminate', machine_name]) + subprocess.run(['sudo', 'machinectl', 'terminate', machine_name], + check=False) _wait_for(lambda: not _get_machine_status(machine_name)) @@ -781,16 +786,17 @@ def _destroy(distribution): image_link = pathlib.Path(f'/var/lib/machines/{machine_name}.raw') logger.info('Removing link to systemd-nspawn image %s', image_link) - subprocess.run(['sudo', 'rm', '--force', str(image_link)]) + subprocess.run(['sudo', 'rm', '--force', str(image_link)], check=False) nspawn_file = f'/run/systemd/nspawn/{machine_name}.nspawn' logger.info('Removing systemd-nspawn configuration: %s', nspawn_file) - subprocess.run(['sudo', 'rm', '--force', nspawn_file]) + subprocess.run(['sudo', 'rm', '--force', nspawn_file], check=False) overlay_folder = _get_overlay_folder(distribution) logger.info('Removing overlay folder with container written data: %s', overlay_folder) - subprocess.run(['sudo', 'rm', '-r', '--force', overlay_folder]) + subprocess.run(['sudo', 'rm', '-r', '--force', overlay_folder], + check=False) compressed_image = _get_compressed_image_path(distribution) image_file = compressed_image.with_suffix('') @@ -814,7 +820,7 @@ def _destroy(distribution): logger.info('Removing Network Manager connection %s', connection_name) result = subprocess.run( ['sudo', 'nmcli', 'connection', 'delete', connection_name], - capture_output=True) + capture_output=True, check=False) if result.returncode not in (0, 10): # nmcli failed and not due to 'Connection, device, or access point does # not exist.' See diff --git a/data/lib/systemd/system/plinth.service b/data/usr/lib/systemd/system/plinth.service similarity index 100% rename from data/lib/systemd/system/plinth.service rename to data/usr/lib/systemd/system/plinth.service diff --git a/debian/changelog b/debian/changelog index 7bc82276d..88c36dd10 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,76 @@ +freedombox (21.11) unstable; urgency=medium + + [ Fioddor Superconcentrado ] + * test: help: Add help view tests + * test: Add tests for action utilities + * tests: Improve handling of tests skipped by default + * package: Add functions for removing packages + * setup: Show and remove conflicts before installation + * email: Manage known installation conflicts + + [ 109247019824 ] + * Translated using Weblate (Bulgarian) + + [ Andrij Mizyk ] + * Translated using Weblate (Ukrainian) + + [ James Valleroy ] + * openvpn: Convert functional tests to non-BDD python format + * pagekite: Convert functional tests to non-BDD python format + * privoxy: Convert functional tests to non-BDD python format + * tests: Add backups mark for openvpn, pagekite, privoxy + * quassel: Convert functional tests to non-BDD python format + * radicale: Convert functional tests to non-BDD python format + * roundcube: Convert functional tests to non-BDD python format + * searx: Convert functional tests to non-BDD python format + * security: Convert functional tests to non-BDD python format + * shadowsocks: Convert functional tests to non-BDD python format + * sharing: Convert functional tests to non-BDD python format + * snapshot: Convert functional tests to non-BDD python format + * ssh: Convert functional tests to non-BDD python format + * sso: Convert functional tests to non-BDD python format + * storage: Convert functional tests to non-BDD python format + * syncthing: Convert functional tests to non-BDD python format + * tahoe: Convert functional tests to non-BDD python format + * tor: Convert functional tests to non-BDD python format + * transmission: Convert functional tests to non-BDD python format + * ttrss: Convert functional tests to non-BDD python format + * upgrades: Convert functional tests to non-BDD python format + * zoph: Convert functional tests to non-BDD python format + * users: Convert functional tests to non-BDD python format + * tests: Add some missed marks for functional tests + * tests: Drop step definitions + * conftest: Skip functional tests if splinter not importable + * locale: Update translation strings + * doc: Fetch latest manual + + [ Sunil Mohan Adapa ] + * d/control: Allow building with python interpreter of any arch + * user: Accommodate Django 3.1 change for model choice iteration + * settings: Choose password hashing complexity suitable for SBCs + * pyproject.toml: Merge contents of pytest.ini + * pyproject.toml: Merge contents of .converagerc + * d/rules: Don't use setup.py to invoke tests, invoke directly instead + * users: Help set language cookie when user profile is edited + * sso, translation: Help set language cookie when user logins in + * translation: Always set language cookie when switching language + * *: Move all systemd service files from /lib to /usr + * wordpress: Run service only if when installed and configured + * calibre: Run service only if when installed + * d/rules: Don't install and enable other systemd service files + * storage: tests: functional: Fix tests always getting skipped + * package: Remove unused import to fix pipeline + * tests: Drop installation of pytest-bdd + * performance: Cleanup code meant for cockpit version < 235 + * *: Always pass check= argument to subprocess.run() + * ttrss: Fix daemon not running sometimes on startup + * ttrss: Add systemd security hardening to daemon + + [ Joseph Nuthalapati ] + * ttrss: tests: functional: Make subscription faster + + -- James Valleroy Mon, 11 Oct 2021 18:55:20 -0400 + freedombox (21.10~bpo11+1) bullseye-backports; urgency=medium * Rebuild for bullseye-backports. diff --git a/debian/control b/debian/control index c8e755e6c..4f0deb1b1 100644 --- a/debian/control +++ b/debian/control @@ -18,7 +18,7 @@ Build-Depends: e2fsprogs, gir1.2-nm-1.0, libjs-bootstrap4, - python3-all, + python3-all:any, python3-apt, python3-augeas, python3-bootstrapform, diff --git a/debian/freedombox.install b/debian/freedombox.install index d853deb19..feda023b2 100644 --- a/debian/freedombox.install +++ b/debian/freedombox.install @@ -1,5 +1,4 @@ etc -lib usr/bin usr/lib usr/share/augeas diff --git a/debian/rules b/debian/rules index 924d3b366..a99ef4c7f 100755 --- a/debian/rules +++ b/debian/rules @@ -11,10 +11,17 @@ override_dh_auto_install-indep: ./run --develop --list-dependencies | sort | tr '\n' ', ' | \ sed -e 's/^/freedombox:Depends=/' >> debian/freedombox.substvars +# pybuild can run pytest. However, when the top level directory is included in +# the path (done using manage.py), it results in import problems. +# https://www.mail-archive.com/debian-python@lists.debian.org/msg17997.html override_dh_auto_test: PYBUILD_SYSTEM=custom \ - PYBUILD_TEST_ARGS="{interpreter} setup.py test" dh_auto_test + PYBUILD_TEST_ARGS="{interpreter} -m pytest" dh_auto_test override_dh_installsystemd: - # Do not enable or start freedombox-manual-upgrade.service. - dh_installsystemd --exclude=freedombox-manual-upgrade.service + # Do not enable or start any service other than FreedomBox service. Use + # of --tmpdir is a hack to workaround an issue with dh_installsystemd + # (as of debhelper 13.5.2) that still has hardcoded search path of + # /lib/systemd/system for searching systemd services. See #987989 and + # reversion of its changes. + dh_installsystemd --tmpdir=debian/tmp/usr --package=freedombox plinth.service diff --git a/debian/tests/control b/debian/tests/control index e519f8de9..810fa0c93 100644 --- a/debian/tests/control +++ b/debian/tests/control @@ -13,5 +13,5 @@ Restrictions: needs-root # # Run unit and integration tests on installed files. # -Test-Command: PYTHONPATH='/usr/lib/python3/dist-packages/plinth/' py.test-3 -p no:cacheprovider --cov=plinth --cov-report=html:debci/htmlcov --cov-config=.coveragerc --cov-report=term +Test-Command: PYTHONPATH='/usr/lib/python3/dist-packages/plinth/' py.test-3 -p no:cacheprovider --cov=plinth --cov-report=html:debci/htmlcov --cov-report=term Depends: git, python3-pytest, python3-pytest-cov, python3-pytest-django, @ diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index a4a9d9608..1b82580b3 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -10,6 +10,42 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 21.11 (2021-10-11) == + +=== Highlights === + + * ttrss: Fix daemon not running sometimes on startup + +=== Other Changes === + + * *: Always pass check= argument to subprocess.run() + * *: Convert all functional tests to python format + * *: Move all systemd service files from /lib to /usr + * calibre: Run service only if when installed + * d/control: Allow building with python interpreter of any arch + * d/rules: Don't install and enable other systemd service files + * d/rules: Don't use setup.py to invoke tests, invoke directly instead + * email: Manage known installation conflicts + * locale: Update translation for Bulgarian, Ukrainian + * package: Add functions for removing packages + * performance: Cleanup code meant for cockpit version < 235 + * pyproject.toml: Merge contents of .converagerc + * pyproject.toml: Merge contents of pytest.ini + * settings: Choose password hashing complexity suitable for SBCs + * setup: Show and remove conflicts before installation + * sso, translation: Help set language cookie when user logins in + * storage: tests: functional: Fix tests always getting skipped + * tests: Add some missed marks for functional tests + * tests: Add tests for action utilities + * tests: Improve handling of tests skipped by default + * tests: help: Add help view tests + * translation: Always set language cookie when switching language + * ttrss: Add systemd security hardening to daemon + * ttrss: tests: functional: Make subscription faster + * user: Accommodate Django 3.1 change for model choice iteration + * users: Help set language cookie when user profile is edited + * wordpress: Run service only if when installed and configured + == FreedomBox 21.10 (2021-09-27) == === Highlights === diff --git a/doc/manual/es/MatrixSynapse.raw.wiki b/doc/manual/es/MatrixSynapse.raw.wiki index ef9fbb744..3eea26714 100644 --- a/doc/manual/es/MatrixSynapse.raw.wiki +++ b/doc/manual/es/MatrixSynapse.raw.wiki @@ -82,7 +82,8 @@ Si tu !FreedomBox está detrás de un router, necesitarás configurar la redirec * Sitio web de Matrix: https://matrix.org * Sección de Synapse: https://matrix.org/docs/projects/server/synapse - * Documentación de uso: https://matrix.org/docs/guides + * Documentación de uso: https://matrix.org/docs/guides+ + * Video tutorial para instalar Matrix Synapse sobre una instancia en la nube: https://youtu.be/8snpMHHbymI ## END_INCLUDE diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index a4a9d9608..1b82580b3 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -10,6 +10,42 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 21.11 (2021-10-11) == + +=== Highlights === + + * ttrss: Fix daemon not running sometimes on startup + +=== Other Changes === + + * *: Always pass check= argument to subprocess.run() + * *: Convert all functional tests to python format + * *: Move all systemd service files from /lib to /usr + * calibre: Run service only if when installed + * d/control: Allow building with python interpreter of any arch + * d/rules: Don't install and enable other systemd service files + * d/rules: Don't use setup.py to invoke tests, invoke directly instead + * email: Manage known installation conflicts + * locale: Update translation for Bulgarian, Ukrainian + * package: Add functions for removing packages + * performance: Cleanup code meant for cockpit version < 235 + * pyproject.toml: Merge contents of .converagerc + * pyproject.toml: Merge contents of pytest.ini + * settings: Choose password hashing complexity suitable for SBCs + * setup: Show and remove conflicts before installation + * sso, translation: Help set language cookie when user logins in + * storage: tests: functional: Fix tests always getting skipped + * tests: Add some missed marks for functional tests + * tests: Add tests for action utilities + * tests: Improve handling of tests skipped by default + * tests: help: Add help view tests + * translation: Always set language cookie when switching language + * ttrss: Add systemd security hardening to daemon + * ttrss: tests: functional: Make subscription faster + * user: Accommodate Django 3.1 change for model choice iteration + * users: Help set language cookie when user profile is edited + * wordpress: Run service only if when installed and configured + == FreedomBox 21.10 (2021-09-27) == === Highlights === diff --git a/plinth/__init__.py b/plinth/__init__.py index a8e21d7a6..4a959920c 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '21.10' +__version__ = '21.11' diff --git a/plinth/action_utils.py b/plinth/action_utils.py index baba9194b..ccc71a0e6 100644 --- a/plinth/action_utils.py +++ b/plinth/action_utils.py @@ -128,10 +128,10 @@ def service_action(service_name, action): """Perform the given action on the service_name.""" if is_systemd_running(): subprocess.run(['systemctl', action, service_name], - stdout=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, check=False) else: subprocess.run(['service', service_name, action], - stdout=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, check=False) def webserver_is_enabled(name, kind='config'): @@ -371,7 +371,7 @@ Owners: {package} env['DEBCONF_DB_OVERRIDE'] = 'File{' + override_file.name + \ ' readonly:true}' env['DEBIAN_FRONTEND'] = 'noninteractive' - subprocess.run(['dpkg-reconfigure', package], env=env) + subprocess.run(['dpkg-reconfigure', package], env=env, check=False) try: os.remove(override_file.name) @@ -419,7 +419,7 @@ def run_apt_command(arguments): env['DEBIAN_FRONTEND'] = 'noninteractive' process = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, close_fds=False, - env=env) + env=env, check=False) return process.returncode @@ -458,7 +458,8 @@ def apt_hold_freedombox(): def apt_unhold_freedombox(): """Remove any hold on freedombox package, and clear flag.""" subprocess.run(['apt-mark', 'unhold', 'freedombox'], - stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + check=False) if apt_hold_flag.exists(): apt_hold_flag.unlink() diff --git a/plinth/forms.py b/plinth/forms.py index 045c9231c..5bf5e739f 100644 --- a/plinth/forms.py +++ b/plinth/forms.py @@ -4,13 +4,10 @@ Common forms for use by modules. """ import os -from itertools import chain from django import forms from django.conf import settings -from django.forms import CheckboxInput from django.utils import translation -from django.utils.safestring import mark_safe from django.utils.translation import get_language_info from django.utils.translation import gettext_lazy as _ @@ -81,47 +78,25 @@ class LanguageSelectionForm(LanguageSelectionFormMixin, forms.Form): language = LanguageSelectionFormMixin.language -def _get_value_in_parens(string): - return string[string.find("(") + 1:string.find(")")] - - class CheckboxSelectMultipleWithReadOnly(forms.widgets.CheckboxSelectMultiple): - """ - Subclass of Django's CheckboxSelectMultiple widget that allows setting - individual fields as readonly + """Multiple checkbox widget that allows setting individual fields readonly. + To mark a feature as readonly an option, pass a dict instead of a string - for its label, of the form: {'label': 'option label', 'disabled': True} + for its label, of the form: {'label': 'option label', 'disabled': True}. - Derived from https://djangosnippets.org/snippets/2786/ """ - def render(self, name, value, attrs=None, choices=(), renderer=None): - if value is None: - value = [] - final_attrs = self.build_attrs(attrs) - output = [u'') - return mark_safe(u'\n'.join(output)) + def create_option(self, name, value, label, selected, index, subindex=None, + attrs=None): + option = super().create_option(name, value, label, selected, index, + subindex, attrs) + if isinstance(option['label'], dict): + if option['label'].get('disabled'): + option['attrs']['disabled'] = 'disabled' + + option['label'] = option['label']['label'] + + return option class CheckboxSelectMultiple(forms.widgets.CheckboxSelectMultiple): diff --git a/plinth/hashers.py b/plinth/hashers.py new file mode 100644 index 000000000..6f1fdde6f --- /dev/null +++ b/plinth/hashers.py @@ -0,0 +1,34 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Custom password hashers suitable for home servers. +""" + +from django.contrib.auth.hashers import Argon2PasswordHasher + + +class Argon2PasswordHasherLowMemory(Argon2PasswordHasher): + """Argon2 password hasher that uses less CPU and RAM than Django's default. + + Derive from and override the default complexity parameters for Django. In + Django 2.2, the defaults are time: 2, memory: 512 and parallelism: 2. In + Django 3.2, the defaults are time: 2, memory: 102400, parallelism: 8. This + takes more than 3 seconds per verification on a Lime2 board. + + On a Pioneer Edition, Olimex Lime2 board, the selected parameters result in + about 200ms for password verification: + + $ python3 -m argon2 -p 2 -m 4096 + Running Argon2id 100 times with: + hash_len: 16 bytes + memory_cost: 4096 KiB + parallelism: 2 threads + time_cost: 2 iterations + + Measuring... + + 2.17e+02ms per password verification + + """ + time_cost = 2 # Iterations + memory_cost = 4096 # KiB + parallelism = 2 # Threads diff --git a/plinth/locale/ar_SA/LC_MESSAGES/django.po b/plinth/locale/ar_SA/LC_MESSAGES/django.po index 190053fed..9ab75d12b 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2020-06-10 15:41+0000\n" "Last-Translator: aiman an \n" "Language-Team: Arabic (Saudi Arabia) Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "خادم ويب" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1983,7 +1989,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2085,11 +2091,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6594,15 +6600,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6634,32 +6640,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6668,66 +6674,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6749,7 +6751,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6842,20 +6844,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7274,23 +7276,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7590,24 +7592,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index 1ae700439..7d569b236 100644 --- a/plinth/locale/bg/LC_MESSAGES/django.po +++ b/plinth/locale/bg/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" -"PO-Revision-Date: 2021-09-15 21:34+0000\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" +"PO-Revision-Date: 2021-09-29 14:38+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -52,11 +52,11 @@ msgstr "Свързване с {host}:{port}" msgid "Cannot connect to {host}:{port}" msgstr "Не може да се свърже с {host}:{port}" -#: plinth/forms.py:39 +#: plinth/forms.py:36 msgid "Select a domain name to be used with this application" msgstr "Изберете име на домейн, което да се използва с това приложение" -#: plinth/forms.py:41 +#: plinth/forms.py:38 msgid "" "Warning! The application may not work properly if domain name is changed " "later." @@ -64,15 +64,15 @@ msgstr "" "Предупреждение! Приложението може да не работи правилно, ако името на " "домейна бъде променено по-късно." -#: plinth/forms.py:49 +#: plinth/forms.py:46 msgid "Language" msgstr "Език" -#: plinth/forms.py:50 +#: plinth/forms.py:47 msgid "Language to use for presenting this web interface" msgstr "Език, на който да се показва този интерфейс" -#: plinth/forms.py:57 +#: plinth/forms.py:54 msgid "Use the language preference set in the browser" msgstr "Използване на предпочитания от четеца език" @@ -138,11 +138,11 @@ msgstr "Откриване на услуги" #: plinth/modules/avahi/__init__.py:69 msgid "Local Network Domain" -msgstr "Домейн на местната мрежа" +msgstr "Домейн в местната мрежа" #: plinth/modules/backups/__init__.py:34 msgid "Backups allows creating and managing backup archives." -msgstr "" +msgstr "Създаване и управление на архиви с резервни копия." #: plinth/modules/backups/__init__.py:54 plinth/modules/backups/__init__.py:200 #: plinth/modules/backups/__init__.py:245 @@ -160,7 +160,7 @@ msgstr "" #: plinth/modules/backups/__init__.py:203 msgid "Enable a Backup Schedule" -msgstr "" +msgstr "Включване на резервни копия по график" #: plinth/modules/backups/__init__.py:207 #: plinth/modules/backups/__init__.py:254 @@ -175,49 +175,60 @@ msgid "" "A scheduled backup failed. Past {error_count} attempts for backup did not " "succeed. The latest error is: {error_message}" msgstr "" +"Резервно копие по график се провали. Последните {error_count} опита за " +"създаване на резервно копие са безуспешни. Последната грешка е: " +"{error_message}" #: plinth/modules/backups/__init__.py:250 msgid "Error During Backup" -msgstr "" +msgstr "Грешка при създаване на резервно копие" #: plinth/modules/backups/forms.py:33 #, python-brace-format msgid "{app} (No data to backup)" -msgstr "" +msgstr "{app} (липсват данни за архивиране)" #: plinth/modules/backups/forms.py:53 msgid "Enable scheduled backups" -msgstr "" +msgstr "Резервни копия по график" #: plinth/modules/backups/forms.py:54 msgid "" "If enabled, a backup is taken every day, every week and every month. Older " "backups are removed." msgstr "" +"Ако е отметнато резервно копие се прави всеки ден, всяка седмица и всеки " +"месец. По-ранните архиви биват премахвани." #: plinth/modules/backups/forms.py:58 msgid "Number of daily backups to keep" -msgstr "" +msgstr "Брой дневни архиви" #: plinth/modules/backups/forms.py:59 msgid "" "This many latest backups are kept and the rest are removed. A value of \"0\" " "disables backups of this type. Triggered at specified hour every day." msgstr "" +"Толкова от последните резервни копия ще бъдат запазвани, а останалите - " +"премахвани. Стойност „0“ изключва този вид резервно копие. Изпълнява се в " +"определен час всеки ден." #: plinth/modules/backups/forms.py:64 msgid "Number of weekly backups to keep" -msgstr "" +msgstr "Брой седмични архиви" #: plinth/modules/backups/forms.py:66 msgid "" "This many latest backups are kept and the rest are removed. A value of \"0\" " "disables backups of this type. Triggered at specified hour every Sunday." msgstr "" +"Толкова от последните резервни копия ще бъдат запазвани, а останалите - " +"премахвани. Стойност „0“ изключва този вид резервно копие. Изпълнява се в " +"определен час всяка неделя." #: plinth/modules/backups/forms.py:71 msgid "Number of monthly backups to keep" -msgstr "" +msgstr "Брой месечни архиви" #: plinth/modules/backups/forms.py:73 msgid "" @@ -225,26 +236,29 @@ msgid "" "disables backups of this type. Triggered at specified hour first day of " "every month." msgstr "" +"Толкова от последните резервни копия ще бъдат запазвани, а останалите - " +"премахвани. Стойност „0“ изключва този вид резервно копие. Изпълнява се в " +"определен час на първия ден от всеки месец." #: plinth/modules/backups/forms.py:78 msgid "Hour of the day to trigger backup operation" -msgstr "" +msgstr "Час от деня, в който да бъде създадено резервното копие" #: plinth/modules/backups/forms.py:79 msgid "In 24 hour format." -msgstr "" +msgstr "24-часов формат." #: plinth/modules/backups/forms.py:82 plinth/modules/backups/forms.py:104 msgid "Included apps" -msgstr "" +msgstr "Включени приложения" #: plinth/modules/backups/forms.py:82 plinth/modules/backups/forms.py:104 msgid "Apps to include in the backup" -msgstr "" +msgstr "Приложения, които да бъдат включени в резервното копие" #: plinth/modules/backups/forms.py:98 msgid "Repository" -msgstr "" +msgstr "Хранилище" #: plinth/modules/backups/forms.py:100 #: plinth/modules/backups/templates/backups_delete.html:17 @@ -253,180 +267,190 @@ msgstr "" #: plinth/modules/samba/templates/samba.html:66 #: plinth/modules/sharing/templates/sharing.html:33 msgid "Name" -msgstr "" +msgstr "Наименование" #: plinth/modules/backups/forms.py:101 msgid "(Optional) Set a name for this backup archive" -msgstr "" +msgstr "(по избор) Задайте име на архива с резервното копие" #: plinth/modules/backups/forms.py:121 msgid "Select the apps you want to restore" -msgstr "" +msgstr "Изберете приложенията, които да бъдат възстановени" #: plinth/modules/backups/forms.py:137 msgid "Upload File" -msgstr "" +msgstr "Качване на файл" #: plinth/modules/backups/forms.py:139 msgid "Backup files have to be in .tar.gz format" -msgstr "" +msgstr "Архивните файлове трябва да бъдат във формат .tar.gz" #: plinth/modules/backups/forms.py:140 msgid "Select the backup file you want to upload" -msgstr "" +msgstr "Изберете архивния файл, който искате да качите" #: plinth/modules/backups/forms.py:146 msgid "Repository path format incorrect." -msgstr "" +msgstr "Неправилен формат на пътя до хранилището." #: plinth/modules/backups/forms.py:153 #, python-brace-format msgid "Invalid username: {username}" -msgstr "" +msgstr "Недействително потребителско име: {username}" #: plinth/modules/backups/forms.py:163 #, python-brace-format msgid "Invalid hostname: {hostname}" -msgstr "" +msgstr "Недействително име на хост: {hostname}" #: plinth/modules/backups/forms.py:167 #, python-brace-format msgid "Invalid directory path: {dir_path}" -msgstr "" +msgstr "Недействителен път до папка: {dir_path}" #: plinth/modules/backups/forms.py:173 msgid "Encryption" -msgstr "" +msgstr "Шифроване" #: plinth/modules/backups/forms.py:174 msgid "" "\"Key in Repository\" means that a password-protected key is stored with the " "backup." msgstr "" +"„Ключ в хранилището“ означава, че ключ защитен с парола се съхранява заедно " +"с резервното копие." #: plinth/modules/backups/forms.py:176 msgid "Key in Repository" -msgstr "" +msgstr "Ключ в хранилището" #: plinth/modules/backups/forms.py:176 plinth/modules/searx/forms.py:15 msgid "None" -msgstr "" +msgstr "Няма" #: plinth/modules/backups/forms.py:178 plinth/modules/networks/forms.py:275 msgid "Passphrase" -msgstr "" +msgstr "Фраза за достъп" #: plinth/modules/backups/forms.py:179 msgid "Passphrase; Only needed when using encryption." -msgstr "" +msgstr "Фраза за достъп; Необходима е само при използване на шифроване." #: plinth/modules/backups/forms.py:182 msgid "Confirm Passphrase" -msgstr "" +msgstr "Потвърждаване на фразата за достъп" #: plinth/modules/backups/forms.py:182 msgid "Repeat the passphrase." -msgstr "" +msgstr "Повторете фразата за достъп." #: plinth/modules/backups/forms.py:193 msgid "The entered encryption passphrases do not match" -msgstr "" +msgstr "Въведените фрази за достъп за шифроване не съвпадат" #: plinth/modules/backups/forms.py:197 msgid "Passphrase is needed for encryption." -msgstr "" +msgstr "За шифроване е необходима фраза за достъп." #: plinth/modules/backups/forms.py:232 msgid "Select Disk or Partition" -msgstr "" +msgstr "Избиране на диск или дял" #: plinth/modules/backups/forms.py:233 msgid "Backups will be stored in the directory FreedomBoxBackups" -msgstr "" +msgstr "Резервните копия ще се съхраняват в папката FreedomBoxBackups" #: plinth/modules/backups/forms.py:242 msgid "SSH Repository Path" -msgstr "" +msgstr "Път към хранилището на SSH" #: plinth/modules/backups/forms.py:243 msgid "" "Path of a new or existing repository. Example: user@host:~/path/to/repo/" msgstr "" +"Път към ново или съществуващо хранилище. Пример: user@host:~/path/to/repo/" +"" #: plinth/modules/backups/forms.py:247 msgid "SSH server password" -msgstr "" +msgstr "Парола за сървъра през SSH" #: plinth/modules/backups/forms.py:248 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" +"Парола за сървъра през SSH.
Удостоверяване на SSH с ключове все още не е " +"възможно." #: plinth/modules/backups/forms.py:267 msgid "Remote backup repository already exists." -msgstr "" +msgstr "Отдалеченото хранилище за резервни копия вече съществува." #: plinth/modules/backups/forms.py:273 msgid "Select verified SSH public key" -msgstr "" +msgstr "Изберете проверен публичен ключ за SSH" #: plinth/modules/backups/repository.py:34 msgid "" "Connection refused - make sure you provided correct credentials and the " "server is running." msgstr "" +"Връзката е отказана - уверете се, че сте предоставили правилните данни за " +"вход и сървърът работи." #: plinth/modules/backups/repository.py:41 msgid "Connection refused" -msgstr "" +msgstr "Връзката е отказана" #: plinth/modules/backups/repository.py:48 msgid "Repository not found" -msgstr "" +msgstr "Хранилището не е намерено" #: plinth/modules/backups/repository.py:53 msgid "Incorrect encryption passphrase" -msgstr "" +msgstr "Грешна фраза за шифроване" #: plinth/modules/backups/repository.py:58 msgid "SSH access denied" -msgstr "" +msgstr "Достъпът през SSH е отказан" #: plinth/modules/backups/repository.py:64 msgid "Repository path is neither empty nor is an existing backups repository." msgstr "" +"Пътят до хранилището не е празен, нито е съществуващо хранилище за резервни " +"копия." #: plinth/modules/backups/repository.py:143 msgid "Existing repository is not encrypted." -msgstr "" +msgstr "Съществуващото хранилище не е шифровано." #: plinth/modules/backups/repository.py:327 #, python-brace-format msgid "{box_name} storage" -msgstr "" +msgstr "Хранилище на {box_name}" #: plinth/modules/backups/templates/backups.html:17 #: plinth/modules/backups/views.py:111 msgid "Create a new backup" -msgstr "" +msgstr "Създаване на резервно копие" #: plinth/modules/backups/templates/backups.html:21 msgid "Create Backup" -msgstr "" +msgstr "Създаване на резервно копие" #: plinth/modules/backups/templates/backups.html:24 msgid "Upload and restore a backup archive" -msgstr "" +msgstr "Качване и възстановяване на архив с резервно копие" #: plinth/modules/backups/templates/backups.html:28 msgid "Upload and Restore" -msgstr "" +msgstr "Качване и възстановяване" #: plinth/modules/backups/templates/backups.html:31 msgid "Add a backup location" -msgstr "" +msgstr "Добавяне на местоположение за архивиране" #: plinth/modules/backups/templates/backups.html:35 msgid "Add Backup Location" @@ -485,7 +509,7 @@ msgstr "" #: plinth/modules/sharing/templates/sharing_add_edit.html:20 #: plinth/templates/form.html:19 msgid "Submit" -msgstr "" +msgstr "Изпращане" #: plinth/modules/backups/templates/backups_repository.html:19 msgid "This repository is encrypted" @@ -493,7 +517,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:29 msgid "Schedule" -msgstr "" +msgstr "График" #: plinth/modules/backups/templates/backups_repository.html:40 msgid "Unmount Location" @@ -599,11 +623,11 @@ msgstr "" #: plinth/modules/backups/views.py:55 msgid "Backup schedule updated." -msgstr "" +msgstr "Графика за резервни копия е обновен." #: plinth/modules/backups/views.py:74 msgid "Schedule Backups" -msgstr "" +msgstr "Резервни копия по график" #: plinth/modules/backups/views.py:106 msgid "Archive created." @@ -763,7 +787,7 @@ msgstr "" #: plinth/modules/bepasty/forms.py:27 #: plinth/modules/bepasty/templates/bepasty.html:30 -#: plinth/modules/users/forms.py:103 plinth/modules/users/forms.py:227 +#: plinth/modules/users/forms.py:102 plinth/modules/users/forms.py:228 msgid "Permissions" msgstr "" @@ -1076,7 +1100,7 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:9 -#: plinth/modules/performance/manifest.py:33 +#: plinth/modules/performance/manifest.py:9 msgid "Cockpit" msgstr "" @@ -1630,7 +1654,7 @@ msgid "Use HTTP basic authentication" msgstr "" #: plinth/modules/dynamicdns/forms.py:103 plinth/modules/networks/forms.py:212 -#: plinth/modules/users/forms.py:69 +#: plinth/modules/users/forms.py:68 msgid "Username" msgstr "" @@ -1857,13 +1881,17 @@ msgid "" "Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 -#, fuzzy -#| msgid "Web Server" -msgid "Email Server" -msgstr "Уеб Сървър" +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:66 +msgid "Email Server" +msgstr "Пощенски сървър" + +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1993,7 +2021,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2079,7 +2107,7 @@ msgstr "" #: plinth/modules/networks/templates/connection_show.html:259 #: plinth/modules/security/__init__.py:45 msgid "Security" -msgstr "" +msgstr "Сигурност" #: plinth/modules/email_server/views.py:26 #: plinth/modules/monkeysphere/templates/monkeysphere.html:37 @@ -2095,11 +2123,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -2390,7 +2418,7 @@ msgstr "" #: plinth/modules/help/views.py:37 plinth/templates/help-menu.html:33 #: plinth/templates/help-menu.html:34 msgid "Submit Feedback" -msgstr "" +msgstr "Подаване на обратна връзка" #: plinth/modules/help/__init__.py:49 #: plinth/modules/help/templates/help_contribute.html:9 @@ -2602,6 +2630,8 @@ msgid "" "Please remove any passwords or other personal information from the log " "before submitting the bug report." msgstr "" +"Моля, премахнете всички пароли или друга лична информация от дневника, преди " +"да изпратите доклад за грешка." #: plinth/modules/help/views.py:25 msgid "Documentation and FAQ" @@ -3099,10 +3129,8 @@ msgid "" msgstr "" #: plinth/modules/mediawiki/forms.py:58 -#, fuzzy -#| msgid "Web Server" msgid "Server URL" -msgstr "Уеб Сървър" +msgstr "Адрес на сървъра" #: plinth/modules/mediawiki/forms.py:59 msgid "" @@ -5230,10 +5258,8 @@ msgid "Action" msgstr "" #: plinth/modules/samba/views.py:33 -#, fuzzy -#| msgid "FreedomBox" msgid "FreedomBox OS disk" -msgstr "FreedomBox" +msgstr "Диск с OS на FreedomBox" #: plinth/modules/samba/views.py:59 plinth/modules/storage/forms.py:147 msgid "Open Share" @@ -5338,7 +5364,7 @@ msgstr "" #: plinth/modules/security/templates/security.html:12 #: plinth/modules/security/templates/security.html:14 msgid "Show security report" -msgstr "" +msgstr "Доклад за сигурността" #: plinth/modules/security/templates/security.html:19 #: plinth/modules/upgrades/templates/backports-firstboot.html:11 @@ -5368,7 +5394,7 @@ msgstr "" #: plinth/modules/security/templates/security_report.html:10 #: plinth/modules/security/views.py:74 msgid "Security Report" -msgstr "" +msgstr "Доклад за сигурността" #: plinth/modules/security/templates/security_report.html:12 #, python-format @@ -6406,20 +6432,22 @@ msgstr "" #: plinth/modules/ttrss/__init__.py:57 plinth/modules/ttrss/manifest.py:18 msgid "Tiny Tiny RSS" -msgstr "" +msgstr "Tiny Tiny RSS" #: plinth/modules/ttrss/__init__.py:58 msgid "News Feed Reader" -msgstr "" +msgstr "Четец на абонаменти за новини" #: plinth/modules/ttrss/manifest.py:9 msgid "Tiny Tiny RSS (Fork)" -msgstr "" +msgstr "Tiny Tiny RSS (Fork)" #: plinth/modules/upgrades/__init__.py:45 #: plinth/modules/upgrades/templates/update-firstboot.html:14 msgid "Check for and apply the latest software and security updates." msgstr "" +"Проверява и прилага последните издания на софтуера и обновявания на " +"сигурността." #: plinth/modules/upgrades/__init__.py:46 msgid "" @@ -6431,13 +6459,11 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:122 msgid "Updates" -msgstr "" +msgstr "Обновяване" #: plinth/modules/upgrades/__init__.py:125 -#, fuzzy -#| msgid "FreedomBox" msgid "FreedomBox Updated" -msgstr "FreedomBox" +msgstr "Обновяване на FreedomBox" #: plinth/modules/upgrades/__init__.py:210 msgid "Could not start distribution update" @@ -6608,15 +6634,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6648,32 +6674,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6682,66 +6708,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6763,7 +6785,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6856,20 +6878,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -6972,10 +6994,8 @@ msgid "Typically checked for a VPN service though which all traffic is sent." msgstr "" #: plinth/modules/wireguard/templates/wireguard.html:10 -#, fuzzy -#| msgid "Web Server" msgid "As a Server" -msgstr "Уеб Сървър" +msgstr "Като сървър" #: plinth/modules/wireguard/templates/wireguard.html:12 msgid "Peers allowed to connect to this server:" @@ -7290,23 +7310,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7606,24 +7626,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index daec40353..9eb5eb72e 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-06-16 07:33+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1989,7 +1995,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2095,13 +2101,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enabled" msgid "Enabled aliases" msgstr "সক্রিয়" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -6608,15 +6614,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6648,32 +6654,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6682,66 +6688,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6763,7 +6765,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6856,20 +6858,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7288,23 +7290,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7604,24 +7606,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/cs/LC_MESSAGES/django.po b/plinth/locale/cs/LC_MESSAGES/django.po index 609814772..f5cdb2f50 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-25 11:32+0000\n" "Last-Translator: Milan \n" "Language-Team: Czech . Doménu je možné nastavit na stránce nastavení systému." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Chat server" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2251,7 +2257,7 @@ msgstr "Nová záloha" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Aktualizovat" @@ -2369,13 +2375,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Zapnout poškozování" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7676,15 +7682,15 @@ msgstr "Automatické aktualizace zapnuty" msgid "Distribution upgrade disabled" msgstr "Automatické aktualizace vypnuty" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Proces přechodu na novější verze zahájen." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Spouštění přechodu na novější verzi se nezdařilo." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7716,39 +7722,39 @@ msgstr "Přístup ke všem službám a nastavení systému" msgid "Check LDAP entry \"{search_item}\"" msgstr "Zkontrolujte LDAP položku „{search_item}“" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 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." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "Neplatný název serveru" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Password" msgid "Authorization Password" msgstr "Heslo k účtu správce" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "Zobrazit heslo" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7769,23 +7775,23 @@ msgstr "" "skupině správců (admin) se budou moci přihlásit všude. Mohou se k systému " "přihlásit také prostřednictvím SSH a mají práva správy (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "Vytvoření LDAP uživatele se nezdařilo." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "Přidání nového uživatele do skupiny {group} se nezdařilo." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Pověřené SSH klíče" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7795,49 +7801,45 @@ 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." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Přejmenování LDAP uživatele se nezdařilo." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Odebrání uživatele ze skupiny se nezdařilo." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Přidání uživatele do skupiny se nezdařilo." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Nepodařilo se vložit SSH klíče." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "Přidání uživatele do skupiny se nezdařilo." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Není možné smazat účet jediného zbývajícího správce systému." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Změna hesla LDAP uživatele se nezdařila." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "Přidání nového uživatele do skupiny správců (admin) se nezdařilo." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to restrict console access." msgid "Failed to restrict console access: {error}" msgstr "Omezení přístupu ke konzoli se nezdařilo." -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Uživatelský účet vytvořen, není jste jím přihlášeni" @@ -7859,7 +7861,7 @@ msgid "Create User" msgstr "Vytvořit uživatele" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Smazat uživatele" @@ -7962,20 +7964,20 @@ msgstr "Uživatel %(username)s aktualizován." msgid "Edit User" msgstr "Upravit uživatele" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Uživatel {user} smazán." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Smazání LDAP uživatele se nezdařilo." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Změnit heslo" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Heslo úspěšně změněno." @@ -8470,23 +8472,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Obecné" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Chyba při instalaci" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Instalace" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "stahování" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "změna média" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "soubor s nastaveními: {file}" @@ -8840,24 +8842,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Nainstalovat" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Provádění úkonů před instalací" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Provádění úkonů po instalaci" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Instalace %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% dokončeno" @@ -8866,6 +8875,9 @@ msgstr "%(percentage)s%% dokončeno" msgid "Gujarati" msgstr "gudžarátština" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Není možné smazat účet jediného zbývajícího správce systému." + #~ msgid "Past Vulnerabilities" #~ msgstr "Minulé zranitelnosti zabezpečení" diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index 692ca88b0..edbd08b91 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Danish brugernavn@%(domainname)s
. Du kan konfigurere systemets " "domæne på Konfigurer siden." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Chatserver" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2215,7 +2221,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Opdater" @@ -2333,13 +2339,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable PageKite" msgid "Enabled aliases" msgstr "Aktiver PageKite" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7613,15 +7619,15 @@ msgstr "Automatisk opdatering aktiveret" msgid "Distribution upgrade disabled" msgstr "Automatisk opdatering deaktiveret" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Opdateringsprocessen er startet." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Kunne ikke starte opdatering." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7653,38 +7659,38 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "Kontrol af LDAP-konfiguration \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "Ugyldigt servernavn" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "Administratorkonto" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "Vis kodeord" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7706,23 +7712,23 @@ msgstr "" "tjenester. De kan også logge ind på systemet gennem SSH og har " "administratorprivilegier (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "Kunne ikke oprette LDAP-bruger." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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}." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7732,50 +7738,46 @@ 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." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Kunne ikke omdøbe LDAP-bruger." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Kunne ikke fjerne bruger fra gruppe." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Kunne ikke tilføje bruger til gruppe." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "Kunne ikke tilføje bruger til gruppe." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Kunne ikke ændre LDAP-kodeord." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, 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." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to obtain certificate for domain {domain}: {error}" msgid "Failed to restrict console access: {error}" msgstr "" "Fejl ved forsøg på at erhverve certifikatet for domænet {domain}: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Brugerkonto oprettet, du er nu logget ind" @@ -7797,7 +7799,7 @@ msgid "Create User" msgstr "Opret Bruger" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Slet Bruger" @@ -7899,20 +7901,20 @@ msgstr "Bruger %(username)s opdateret." msgid "Edit User" msgstr "Rediger Bruger" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Brugeren {user} slettet." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Kunne ikke slette LDAP-bruger." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Ændr kodeord" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Kodeord blev ændret." @@ -8391,23 +8393,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Fejl under installation" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Installerer" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "downloader" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "medie-ændring" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurationsfil: {file}" @@ -8746,24 +8748,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installer" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Udfører før-installationshandlinger" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Udfører efter-installationshandlinger" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Installerer %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% færdig" diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index d1da77120..09fd6928e 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-26 06:35+0000\n" "Last-Translator: Johannes Keyser \n" "Language-Team: German Systemeinstellungen " "konfigurieren." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "E-Mail Server" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "Betrieben mit Postfix, Dovecot und Rspamd" @@ -2241,7 +2247,7 @@ msgstr "Neuer Wert" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Aktualisieren" @@ -2343,11 +2349,11 @@ msgstr "Interner Fehler in {0}" msgid "Check syslog for more information" msgstr "Prüfen Sie das Syslog für weitere Informationen" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Aktivierte Aliase" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Deaktivierte Aliase" @@ -7672,15 +7678,15 @@ msgstr "Distributions-Upgrade aktiviert" msgid "Distribution upgrade disabled" msgstr "Distributions-Upgrade deaktiviert" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Aktualisierung gestartet." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Starten der Aktualisierung fehlgeschlagen." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Häufige Funktions-Updates aktiviert." @@ -7720,35 +7726,35 @@ msgstr "Zugriff auf alle Anwendungen und Systemeinstellungen" msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP-Eintrag „{search_item}“ prüfen" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Benutzername wird bereits verwendet oder ist reserviert." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Einen gültigen Benutzernamen eingeben." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Erforderlich. Bis zu 150 Zeichen. Nur englische Buchstaben, Ziffern und " "@/./-/_." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Autorisierungs-Passwort" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" "Geben Sie Ihr aktuelles Kennwort ein, um Kontoänderungen zu autorisieren." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Ungültiges Passwort." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7763,22 +7769,22 @@ msgstr "" "allen Diensten anmelden und sie können sich auch über SSH im System anmelden " "und besitzen Administratorrechte (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Erstellen des LDAP-Benutzers ist fehlgeschlagen:{error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Autorisierte SSH-Schlüssel" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7789,46 +7795,42 @@ msgstr "" "eingeben, einen pro Zeile. Leerzeilen und Zeilen, die mit # beginnen, werden " "ignoriert." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Umbenennen des LDAP-Benutzers fehlgeschlagen." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Entfernen des Benutzers von der Gruppe fehlgeschlagen." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Hinzufügen eines Benutzers zur Gruppe ist fehlgeschlagen." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "SSH-Schlüssel kann nicht gesetzt werden." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Fehler beim Ändern des Benutzerstatus." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Der einzige Administrator des Systems kann nicht gelöscht werden." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Ändern des LDAP-Benutzerpassworts ist fehlgeschlagen." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" "Fehler beim Hinzufügen eines neuen Benutzers zur Administratorgruppe: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Fehler beim Einschränken des Konsolenzugriffs: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Benutzerkonto wurde erstellt, Sie sind jetzt angemeldet" @@ -7850,7 +7852,7 @@ msgid "Create User" msgstr "Benutzer anlegen" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Benutzer löschen" @@ -7955,20 +7957,20 @@ msgstr "Benutzer %(username)s geändert." msgid "Edit User" msgstr "Benutzer bearbeiten" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Benutzer {user} gelöscht." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Löschen von LDAP-Benutzer fehlgeschlagen." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Passwort ändern" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Passwort erfolgreich geändert." @@ -8465,23 +8467,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Allgemein" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Fehler bei der Installation" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Installation läuft" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "herunterladen" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "Medienwechsel" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "Konfigurationsdatei: {file}" @@ -8819,24 +8821,31 @@ msgstr "Diese Anwendung ist in Ihrer Distribution derzeit nicht erhältlich." msgid "Check again" msgstr "Erneut prüfen" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installieren" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Installationsvorbereitungen werden ausgeführt" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Installationsnachbereitungen werden ausgeführt" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "%(package_names)s wird installiert: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s %% abgeschlossen" @@ -8845,6 +8854,9 @@ msgstr "%(percentage)s %% abgeschlossen" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Der einzige Administrator des Systems kann nicht gelöscht werden." + #~ msgid "Past Vulnerabilities" #~ msgstr "Frühere Sicherheitslücken anzeigen" diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 2aa87b502..164135fda 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -50,25 +50,25 @@ msgstr "" msgid "Cannot connect to {host}:{port}" msgstr "" -#: plinth/forms.py:39 +#: plinth/forms.py:36 msgid "Select a domain name to be used with this application" msgstr "" -#: plinth/forms.py:41 +#: plinth/forms.py:38 msgid "" "Warning! The application may not work properly if domain name is changed " "later." msgstr "" -#: plinth/forms.py:49 +#: plinth/forms.py:46 msgid "Language" msgstr "" -#: plinth/forms.py:50 +#: plinth/forms.py:47 msgid "Language to use for presenting this web interface" msgstr "" -#: plinth/forms.py:57 +#: plinth/forms.py:54 msgid "Use the language preference set in the browser" msgstr "" @@ -750,7 +750,7 @@ msgstr "" #: plinth/modules/bepasty/forms.py:27 #: plinth/modules/bepasty/templates/bepasty.html:30 -#: plinth/modules/users/forms.py:103 plinth/modules/users/forms.py:227 +#: plinth/modules/users/forms.py:102 plinth/modules/users/forms.py:228 msgid "Permissions" msgstr "" @@ -1063,7 +1063,7 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:9 -#: plinth/modules/performance/manifest.py:33 +#: plinth/modules/performance/manifest.py:9 msgid "Cockpit" msgstr "" @@ -1617,7 +1617,7 @@ msgid "Use HTTP basic authentication" msgstr "" #: plinth/modules/dynamicdns/forms.py:103 plinth/modules/networks/forms.py:212 -#: plinth/modules/users/forms.py:69 +#: plinth/modules/users/forms.py:68 msgid "Username" msgstr "" @@ -1844,11 +1844,17 @@ msgid "" "Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1978,7 +1984,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2080,11 +2086,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6587,15 +6593,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6627,32 +6633,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6661,66 +6667,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6742,7 +6744,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6835,20 +6837,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7267,23 +7269,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7583,24 +7585,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index 38631a365..0b1e6b7bd 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-04-14 04:27+0000\n" "Last-Translator: Michalis \n" "Language-Team: Greek . Μπορείτε να ρυθμίσετε το όνομα της υπηρεσίας στο Ρυθμίστε page." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Διακομιστής συνομιλίας" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2280,7 +2286,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Ενημερωμένη έκδοση" @@ -2396,13 +2402,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Ενεργοποίηση ζημιών" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7785,15 +7791,15 @@ msgstr "Oι αυτόματες ενημερώσεις ενεργοποιήθηκ msgid "Distribution upgrade disabled" msgstr "Oι αυτόματες ενημερώσεις απενεργοποιήθηκαν" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Ξεκίνησε η διαδικασία αναβάθμισης." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Η εκκίνηση της αναβάθμισης απέτυχε." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7834,38 +7840,38 @@ msgstr "Πρόσβαση σε όλες τις υπηρεσίες και τις msgid "Check LDAP entry \"{search_item}\"" msgstr "Ελέγξτε την καταχώρηση LDAP \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Το όνομα χρήστη είναι δεσμευμένο." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "Μη έγκυρο όνομα διακομιστή" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Password" msgid "Authorization Password" msgstr "Κωδικός Πρόσβασης Διαχειριστή" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "Εμφάνιση κωδικού" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7887,23 +7893,23 @@ msgstr "" "υπηρεσίες. Μπορούν επίσης να συνδεθούν στο σύστημα μέσω του SSH και να έχουν " "δικαιώματα διαχειριστή (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "Η δημιουργία χρήστη LDAP απέτυχε." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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}." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Εξουσιοδοτημένα κλειδιά SSH" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7914,47 +7920,43 @@ msgstr "" "Μπορείτε να εισαγάγετε πολλαπλά κλειδιά, ένα σε κάθε γραμμή. Οι κενές " "γραμμές και οι γραμμές που ξεκινούν με # θα αγνοηθούν." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Η μετονομασία του χρήστη LDAP απέτυχε." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Απέτυχε η κατάργηση του χρήστη από την ομάδα." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Απέτυχε η προσθήκη χρήστη στην ομάδα." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Δεν ήταν δυνατό να προστεθούν τα κλειδιά SSH." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Απέτυχε η αλλαγή της κατάστασης χρήστη." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Δεν είναι δυνατή η διαγραφή του μοναδικού διαχειριστή στο σύστημα." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Η αλλαγή του κωδικού πρόσβασης χρήστη LDAP απέτυχε." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "Αποτυχία προσθήκης νέου χρήστη στην ομάδα διαχειριστών." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to restrict console access." msgid "Failed to restrict console access: {error}" msgstr "Απέτυχε ο περιορισμός της πρόσβασης στην κονσόλα." -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Ο λογαριασμός χρήστη δημιουργήθηκε, τώρα είστε συνδεδεμένοι" @@ -7976,7 +7978,7 @@ msgid "Create User" msgstr "Δημιουργία χρήστη" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Διαγραφή χρήστη" @@ -8080,20 +8082,20 @@ msgstr "O χρήστης %(username)s ενημερώθηκε." msgid "Edit User" msgstr "Επεξεργασία χρήστη" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Ο χρήστης {user} διαγράφηκε." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Η διαγραφή του χρήστη LDAP απέτυχε." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Αλλαγή κωδικού πρόσβασης" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Ο κωδικός πρόσβασης άλλαξε με επιτυχία." @@ -8584,23 +8586,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Γενικός" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Σφάλμα κατά την εγκατάσταση" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Εγκαθίσταται" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "Λήψη" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "Αλλαγή μέσου" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "αρχείο ρυθμίσεων: {file}" @@ -8960,24 +8962,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Εγκατάσταση" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Εκτελείται διαδικασία πριν από την εγκατάσταση" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Εκτέλεση διαδικασία μετά την εγκατάσταση" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Εγκατάσταση του %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "ολοκληρώθηκε το %(percentage)s%%" @@ -8986,6 +8995,9 @@ msgstr "ολοκληρώθηκε το %(percentage)s%%" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Δεν είναι δυνατή η διαγραφή του μοναδικού διαχειριστή στο σύστημα." + #~ msgid "Past Vulnerabilities" #~ msgstr "Προηγούμενα θέματα ασφαλείας" diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index c8a92a329..8f0d26a02 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-03-12 13:03+0000\n" "Last-Translator: Fioddor Superconcentrado \n" "Language-Team: Spanish username@%(domainname)s. Puede configurar su dominio " "en la página de sistema Configurar." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Servidor de Chat" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2247,7 +2253,7 @@ msgstr "Nueva copia de seguridad" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Actualización" @@ -2365,13 +2371,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Activar daño" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7618,15 +7624,15 @@ msgstr "Actualización automática de distibución activada" msgid "Distribution upgrade disabled" msgstr "Actualización automática de distibución desactivada" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Proceso de actualización iniciado." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "No se ha podido iniciar la actualización." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Las actualizaciones funcionales frecuentes están activadas." @@ -7666,33 +7672,33 @@ msgstr "Acceso a todos los servicios y configuraciones del sistema" msgid "Check LDAP entry \"{search_item}\"" msgstr "Comprobar la entrada LDAP \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "El nombre de usuaria/o está en uso o reservado." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Indique un nombre de usuario válido." -#: plinth/modules/users/forms.py:71 +#: plinth/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 @/./-/_ ." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Contraseña de autorización" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" "Introduce tu contraseña actual para autorizar modificaciones en la cuenta." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Contraseña no válida." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7707,21 +7713,21 @@ msgstr "" "servicios, también podrán acceder al sistema por SSH con privilegios de " "administración (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Ha fallado la creación de usuaria/o LDAP: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Claves de SSH autorizadas" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7731,45 +7737,41 @@ 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." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Ha fallado renombrar al o la usuaria LDAP." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Ha fallado la eliminación del o de la usuaria del grupo." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Ha fallado añadir al o la usuaria al grupo." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "No es posible configurar las claves SSH." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Ha fallado al cambiar el estado del usuario." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "No se puede eliminar la única cuenta de administración del sistema." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Ha fallado cambiar la clave del o de la usuaria LDAP." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, 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}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Falló al restringir el acceso a la consola: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Creada cuenta de usuaria/o, ya está usted en el sistema" @@ -7791,7 +7793,7 @@ msgid "Create User" msgstr "Crear usuaria/o" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Eliminar usuaria/o" @@ -7894,20 +7896,20 @@ msgstr "El o la usuaria %(username)s se ha actualizado." msgid "Edit User" msgstr "Editar usuario" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "El o la usuaria {user} se ha eliminado." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Ha fallado la eliminación del o de la usuaria LDAP." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Cambiar clave de acceso" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Clave de acceso cambiada con éxito." @@ -8375,23 +8377,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Genérica" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Error durante la instalación" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "instalando" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "descargando" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "cambio de medio" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "archivo de configuración: {file}" @@ -8725,24 +8727,31 @@ msgstr "Esta aplicación no está disponible actualmente en su distribución." msgid "Check again" msgstr "Volver a coomprobar" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Instalar" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Realizando operaciones previas a la instalación" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Realizando operaciones posteriores a la instalación" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Instalando %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% completado" @@ -8751,6 +8760,9 @@ msgstr "%(percentage)s%% completado" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "No se puede eliminar la única cuenta de administración del sistema." + #~ msgid "Past Vulnerabilities" #~ msgstr "Vulnerabilidades Anteriores" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index b29962b34..930c96263 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-07 11:34+0000\n" "Last-Translator: Seyed mohammad ali Hosseinifard \n" "Language-Team: Persian Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "سرور وب" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2212,7 +2218,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2328,13 +2334,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enabled" msgid "Enabled aliases" msgstr "فعال" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7270,15 +7276,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "برنامه نصب شد." -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7310,38 +7316,38 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "نام کاربری معتبر نیست" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "حساب مدیر" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "رمز را نشان بده" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7350,72 +7356,68 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "ساختن کاربر LDAP شکست خورد." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to {group} group: {error}" msgstr "افزودن کاربر به گروه مدیران شکست خورد." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add new user to admin group." msgid "Failed to change user status." msgstr "افزودن کاربر به گروه مدیران شکست خورد." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "افزودن کاربر به گروه مدیران شکست خورد." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to obtain certificate for domain {domain}: {error}" msgid "Failed to restrict console access: {error}" msgstr "گرفتن گواهی برای دامنهٔ {domain} شکست خورد: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "حساب کاربری ساخته شد، شما الان وارد سیستم هستید" @@ -7437,7 +7439,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7538,20 +7540,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -8018,23 +8020,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -8343,24 +8345,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index 25d60e5be..1235a4e6d 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers USERNAME@%(domainname)s. YOU CAN SETUP YOUR DOMAIN ON THE SYSTEM " "CONFIGURE PAGE." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "WEB SERVER" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2341,7 +2347,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 #, fuzzy #| msgid "Update URL" msgid "Update" @@ -2463,13 +2469,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable PageKite" msgid "Enabled aliases" msgstr "ENABLE PAGEKITE" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7774,15 +7780,15 @@ msgstr "AUTOMATIC UPGRADES ENABLED" msgid "Distribution upgrade disabled" msgstr "AUTOMATIC UPGRADES DISABLED" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "UPGRADE PROCESS STARTED." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "STARTING UPGRADE FAILED." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7814,38 +7820,38 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "CHECK LDAP ENTRY \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "INVALID SERVER NAME" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "ADMINISTRATOR ACCOUNT" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "SHOW PASSWORD" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7866,23 +7872,23 @@ msgstr "" "ABLE TO LOG IN TO ALL SERVICES. THEY CAN ALSO LOG IN TO THE SYSTEM THROUGH " "SSH AND HAVE ADMINISTRATIVE PRIVILEGES (SUDO)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "CREATING LDAP USER FAILED." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7892,49 +7898,45 @@ msgstr "" "SYSTEM WITHOUT USING A PASSWORD. YOU MAY ENTER MULTIPLE KEYS, ONE ON EACH " "LINE. BLANK LINES AND LINES STARTING WITH # WILL BE IGNORED." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "RENAMING LDAP USER FAILED." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "FAILED TO REMOVE USER FROM GROUP." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "FAILED TO ADD USER TO GROUP." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "FAILED TO ADD USER TO GROUP." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "CHANGING LDAP USER PASSWORD FAILED." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, 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." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to obtain certificate for domain {domain}: {error}" msgid "Failed to restrict console access: {error}" msgstr "FAILED TO OBTAIN CERTIFICATE FOR DOMAIN {domain}: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "USER ACCOUNT CREATED, YOU ARE NOW LOGGED IN" @@ -7956,7 +7958,7 @@ msgid "Create User" msgstr "CREATE USER" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "DELETE USER" @@ -8058,20 +8060,20 @@ msgstr "USER %(username)s UPDATED." msgid "Edit User" msgstr "EDIT USER" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "USER {user} DELETED." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "DELETING LDAP USER FAILED." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "CHANGE PASSWORD" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "PASSWORD CHANGED SUCCESSFULLY." @@ -8550,27 +8552,27 @@ msgstr "PPPOE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 #, fuzzy #| msgid "Installation" msgid "installing" msgstr "INSTALLATION" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 #, fuzzy #| msgid "Setting unchanged" msgid "media change" msgstr "SETTING UNCHANGED" -#: plinth/package.py:164 +#: plinth/package.py:167 #, fuzzy, python-brace-format #| msgid "Configuration" msgid "configuration file: {file}" @@ -8916,24 +8918,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "INSTALL" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "INSTALLING %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% COMPLETE" diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index ca52b76f4..550e3f8e7 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-05-31 22:13+0000\n" "Last-Translator: Coucouf \n" "Language-Team: French Configurer." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Serveur de discussion" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2278,7 +2284,7 @@ msgstr "Nouvelle sauvegarde" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Mises à jour" @@ -2396,13 +2402,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Activer les blessures" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7778,15 +7784,15 @@ msgstr "Mise à niveau de la distribution activée" msgid "Distribution upgrade disabled" msgstr "Mise à niveau de la distribution désactivée" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Mise à jour lancée." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Le lancement de la mise à niveau a échoué." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Mise à jour régulière des fonctionnalités activée." @@ -7826,36 +7832,36 @@ msgstr "Accès à tous les services et à la configuration du système" msgid "Check LDAP entry \"{search_item}\"" msgstr "Vérification de l’entrée LDAP « {search_item} »" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Le nom d'utilisateur est déjà pris ou est réservé." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Entrez un nom d’utilisateur valide." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Requis. 150 caractères ou moins. Lettres anglaises, chiffres et @/./-/_ " "uniquement." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Mot de passe actuel" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" "Veuillez saisir votre mot de passe actuel pour confirmer ces modifications " "de compte." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Mot de passe incorrect." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7870,21 +7876,21 @@ msgstr "" "peuvent également se connecter au système avec Secure Shell (SSH) et obtenir " "les privilèges de superutilisateur (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "La création de l’utilisateur LDAP a échoué : {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Clés SSH autorisées" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7895,46 +7901,42 @@ msgstr "" "plusieurs clefs, une sur chaque ligne. Les lignes vides et celles commençant " "par # sont ignorées." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Le changement du nom de l’utilisateur LDAP a échoué." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Échec du retrait de l’utilisateur du groupe." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Échec de l’ajout de l’utilisateur au groupe." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Échec du paramétrage des clefs SSH." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Échec du changement de statut de l’utilisateur." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Impossible de supprimer le seul administrateur de ce système." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Le changement du mot de passe de l’utilisateur LDAP a échoué." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, 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}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" "La mise en place des restrictions d’accès à la console à échoué : {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Compte utilisateur créé, vous êtes maintenant connecté" @@ -7956,7 +7958,7 @@ msgid "Create User" msgstr "Créer un utilisateur" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Supprimer Utilisateur" @@ -8061,20 +8063,20 @@ msgstr "Utilisateur %(username)s mis à jour." msgid "Edit User" msgstr "Modification de l’utilisateur" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Utilisateur {user} supprimé." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "La suppression de l’utilisateur LDAP a échoué." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Changer Mot de Passe" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Le mot de passe a été changé." @@ -8551,23 +8553,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Générique" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Erreur pendant l’installation" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "installation en cours" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "téléchargement en cours" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "changement de support" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "fichier de configuration : {file}" @@ -8907,24 +8909,31 @@ msgstr "" msgid "Check again" msgstr "Vérifier à nouveau" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installer" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Préinstallation en cours" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Postinstallation en cours" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Installation de %(package_names)s : %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% effectué" @@ -8933,6 +8942,9 @@ msgstr "%(percentage)s%% effectué" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Impossible de supprimer le seul administrateur de ce système." + #~ msgid "Past Vulnerabilities" #~ msgstr "Anciennes failles" diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index 8327bd88f..ba72258fd 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Galician Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "Servidor web" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1986,7 +1992,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2090,11 +2096,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6619,15 +6625,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6659,32 +6665,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6693,66 +6699,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6774,7 +6776,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6867,20 +6869,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7301,23 +7303,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7617,24 +7619,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/gu/LC_MESSAGES/django.po b/plinth/locale/gu/LC_MESSAGES/django.po index 319e38622..713c33efc 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Gujarati username@%(domainname)s. તમે સિસ્ટમ પર તમારા ડોમેન સેટ કરી શકો છો રૂપરેખાંકિત કરો પાનું." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "ચેટ સર્વર" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2164,7 +2170,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2276,13 +2282,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enabled" msgid "Enabled aliases" msgstr "સક્ષમ કરેલું" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -6905,15 +6911,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "વપરાશકર્તા રજીસ્ટ્રેશન અક્ષમ છે" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6945,36 +6951,36 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "અમાન્ય સર્વર નામ" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "પાસવર્ડ બતાવો" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6983,66 +6989,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -7064,7 +7066,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7157,20 +7159,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7615,23 +7617,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7946,24 +7948,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/hi/LC_MESSAGES/django.po b/plinth/locale/hi/LC_MESSAGES/django.po index d0214c508..b1c64ff6c 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Hindi username@%(domainname)s. आपका डोमेन सिसटेम पर सेटअप कर सकता है कॉन्फ़िगर पेजॅ." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "चाट सर्वर" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2265,7 +2271,7 @@ msgstr "बैकअप" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "अपडेट" @@ -2383,13 +2389,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "क्षति को सक्षम करें" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7596,15 +7602,15 @@ msgstr "ऑटोमेटिक अपग्रेडस सक्षम कि msgid "Distribution upgrade disabled" msgstr "ऑटोमेटिक अपग्रेडस अक्षम किया गया" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "अपग्रेड प्रक्रिया शुरू हुई." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "अपग्रेड प्रारंभ करना विफल रहा." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7636,38 +7642,38 @@ msgstr "सब सर्विसस और सिस्टम सेटिं msgid "Check LDAP entry \"{search_item}\"" msgstr "एलडीएपी प्रविष्टि चेक करें \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "यूसरनाम लिया है या आरक्षित है." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "सर्वर नाम अमान्य है" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Password" msgid "Authorization Password" msgstr "व्यवस्थापक पासवर्ड" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "शो पासवर्ड" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7687,23 +7693,23 @@ msgstr "" "

एडमिन ग्रुप के यूसरस सब सर्विसस पर लॉग इन कर सकेगें. SSH के माध्यम से भी " "सिस्टम पर लॉग इन कर सकते है अाैर उनको प्रशासनिक विशेषाधिकार (sudo) है." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "एलडीएपी यूसर बनाना विफल रहा." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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} समूह में नया यूसर जोड़ने में विफल." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7713,49 +7719,45 @@ msgstr "" "बिना सिस्टम में प्रवेश करने की अनुमति देगा. आप एकाधिक कीज़ दर्ज कर सकते हैं, हर लाइन रक " "एक. खाली लाइनस या # से प्रारंभ होने वाले लाइनस अनदेखा कर दिया जाएगा." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "एलडीएपी यूसर का नाम बदलना विफल रहा." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "समूह से यूसर को हटाने में विफल." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "समूह से यूसर को जोड़ने में विफल." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "एसएसएच कीज़ सेट करने में असमर्थ." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "समूह से यूसर को जोड़ने में विफल." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "सिस्टम में केवल व्यवस्थापक को नहीं हटा सकता." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "एलडीएपी यूसर का पासवर्ड बदलना विफल रहा." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "व्यवस्थापक समूह में नया यूसर जोड़ने में विफल." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to restrict console access." msgid "Failed to restrict console access: {error}" msgstr "कंसोल एक्सेस प्रतिबंधित करने में विफल." -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "युसर अकाउंट बनाया, अब आप लॉगड इन हैं" @@ -7777,7 +7779,7 @@ msgid "Create User" msgstr "यूसर बनाये" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "यूसर हटाइये" @@ -7880,20 +7882,20 @@ msgstr "युसर %(username)s अपडेट किया." msgid "Edit User" msgstr "यूसर संपादित करें" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "यूसर {user} हटाया." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "एलडीएपी यूसरको हटाने में असफल रहा." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "पासवर्ड बदलिये" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "पासवर्ड सफलतापूर्वक बदल गया." @@ -8379,23 +8381,23 @@ msgstr "पीपीपीअोइ" msgid "Generic" msgstr "जेनेरिक" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "इंस्टालेशन करते समय पर त्रुटि" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "इंस्टॉलिंग" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "डाउनलोडिंग" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "मीडिया बदलाव" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "कॉंफ़िगरेशन फ़ाइल: {file}" @@ -8735,24 +8737,31 @@ msgstr "यह एप्लिकेशन अभी अापका वित msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "इंस्टॉल करें" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "प्री-इंस्टॉलेशन ऑपरेशन कर रहा है" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "पोस्ट-इंस्टॉलेशन ऑपरेशन कर रहा है" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "%(package_names)s:%(status)s इंस्टॉलेशन किया" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% पूर्ण" @@ -8761,6 +8770,9 @@ msgstr "%(percentage)s%% पूर्ण" msgid "Gujarati" msgstr "" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "सिस्टम में केवल व्यवस्थापक को नहीं हटा सकता." + #~ msgid "Message Archive Management enabled" #~ msgstr "संदेश संग्रह प्रबंधन सक्षम किया गया है" diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index 6d32b806c..0fc17ec53 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-04-22 21:32+0000\n" "Last-Translator: Benedek Nagy \n" "Language-Team: Hungarian username@%(domainname)s. Beállíthatod a " "rendszered domain nevét a Beállítások lapon." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Chat szerver" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2245,7 +2251,7 @@ msgstr "Új biztonsági másolat" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Frissítés" @@ -2363,13 +2369,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Sérülés engedélyezése" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7534,15 +7540,15 @@ msgstr "Disztribúció frissítés engedélyezve" msgid "Distribution upgrade disabled" msgstr "Disztribúció frissítés letiltva" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "A frissítési folyamat elkezdődött." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "A frissítést nem sikerült elindítani." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7574,32 +7580,32 @@ msgstr "Hozzáférés az összes szolgáltatáshoz és rendszerbeállításhoz" msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP bejegyzés ellenőrzése: \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "A felhasználói név (már) foglalt." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Adjon meg egy érvényes felhasználónevet." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Hitelesítési jelszó" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Érvénytelen jelszó." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7615,21 +7621,21 @@ msgstr "" "képesek bejelentkezni a rendszerbe, ahol adminisztrátori jogosultságokkal " "rendelkeznek (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "LDAP felhasználó létrehozása sikertelen: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Az új felhasználó hozzáadása {group} csoporthoz nem sikerült: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Engedélyezett SSH kulcsok" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7639,47 +7645,43 @@ 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." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "LDAP felhasználó átnevezése sikertelen." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Nem sikerült eltávolítani a felhasználót a csoportból." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Nem sikerült hozzáadni a felhasználót a csoporthoz." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "SSH kulcsok beállítása sikertelen." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Nem sikerült a felhasználói állapot megváltoztatása." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Nem lehet törölni a rendszer egyetlen rendszergazdáját." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "LDAP felhasználó jelszavának megváltoztatása sikertelen." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, 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}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Nem sikerült a konzol hozzáférés korlátozása: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Felhasználói fiók létrehozva, bejelentkezés sikeres" @@ -7701,7 +7703,7 @@ msgid "Create User" msgstr "Felhasználó létrehozása" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Felhasználó törlése" @@ -7800,20 +7802,20 @@ msgstr "%(username)s nevű felhasználó frissítve." msgid "Edit User" msgstr "Felhasználó szerkesztése" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "{user} nevű felhasználó törölve." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "LDAP felhasználó törlése sikertelen." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Jelszómódosítás" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "A jelszó módosítása sikeres." @@ -8240,23 +8242,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Általános" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Hiba lépett fel a telepítés során" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "telepítés" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "letöltés" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "adathordozó csere" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurációs fájl: {file}" @@ -8588,24 +8590,31 @@ msgstr "Ez az alkalmazás jelenleg nem hozzáférhető ebben a disztribúcióban msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Telepítés" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Telepítés előtti műveletek végrehajtása" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Telepítés utáni műveletek végrehajtása" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "%(package_names)s telepítése: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "befejezettségi szint: %(percentage)s%%" @@ -8614,6 +8623,9 @@ msgstr "befejezettségi szint: %(percentage)s%%" msgid "Gujarati" msgstr "Gudzsaráti" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Nem lehet törölni a rendszer egyetlen rendszergazdáját." + #~ msgid "Past Vulnerabilities" #~ msgstr "Múltbéli biztonsági rések" diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index 4e00d36b7..1def9b229 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-06-24 00:42+0000\n" "Last-Translator: Reza Almanda \n" "Language-Team: Indonesian nama pengguna @%(domainname)s. Anda dapat mengatur " "domain Anda pada sistem Konfigurasi halaman." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Server obrolan" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2214,7 +2220,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Memperbarui" @@ -2330,13 +2336,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Aktifkan kerusakan" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7051,15 +7057,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "Pembaruan distribusi dinonaktifkan" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7091,34 +7097,34 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Masukkan sebuah nama pengguna yang valid." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "Akun Administrator" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Kata sandi tidak valid." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7127,68 +7133,64 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Gagal membuat pengguna LDAP. {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Gagal menambahkan pengguna baru ke kelompok {group}: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add new user to admin group." msgid "Failed to change user status." msgstr "Gagal menambahkan pengguna baru ke kelompok admin." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Gagal menambahkan pengguna baru ke kelompok admin. {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -7210,7 +7212,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7305,20 +7307,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Insan {user} dipangkar." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7761,23 +7763,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Galat saat pemasangan" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "memasang" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "mengunduh" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -8086,24 +8088,31 @@ msgstr "Aplikasi ini belum tersedia dalam distribusi Anda." msgid "Check again" msgstr "Periksa kembali" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Pasang" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Melakukan operasi pra-pemasangan" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Melakukan operasi pasca pemasangan" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Memasang %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s %% selesai" diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index 8a6294b71..d190cea7c 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-21 20:38+0000\n" "Last-Translator: Dietmar \n" "Language-Team: Italian . Configura " "la pagina ." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "Server e-mail" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2189,7 +2195,7 @@ msgstr "Nuovo valore" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2291,11 +2297,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Alias abilitati" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Alias disabilitati" @@ -7193,15 +7199,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7233,32 +7239,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Inserisci un nome utente valido." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Password di autorizzazione" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Password non valida." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7267,66 +7273,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Aggiunta del nuovo utente al gruppo admin fallita: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Fallito la limitazione dell'accesso alla console: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -7348,7 +7350,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7441,20 +7443,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7873,23 +7875,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -8197,24 +8199,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% completata" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index 93c32f10c..4f6890e89 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-05-20 12:32+0000\n" "Last-Translator: Jacque Fresco \n" "Language-Team: Japanese Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1980,7 +1986,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2082,11 +2088,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6589,15 +6595,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6629,32 +6635,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6663,66 +6669,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6744,7 +6746,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6837,20 +6839,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7269,23 +7271,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7585,24 +7587,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/kn/LC_MESSAGES/django.po b/plinth/locale/kn/LC_MESSAGES/django.po index 2a50336ba..543179373 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2020-07-16 16:41+0000\n" "Last-Translator: Yogesh \n" "Language-Team: Kannada Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1980,7 +1986,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2082,11 +2088,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6591,15 +6597,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6631,32 +6637,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6665,66 +6671,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6746,7 +6748,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6839,20 +6841,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7271,23 +7273,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7587,24 +7589,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/lt/LC_MESSAGES/django.po b/plinth/locale/lt/LC_MESSAGES/django.po index 97c69ce33..372a70dbc 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-02-22 10:50+0000\n" "Last-Translator: Kornelijus Tvarijanavičius \n" "Language-Team: Lithuanian Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1981,7 +1987,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2083,11 +2089,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6590,15 +6596,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6630,32 +6636,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6664,66 +6670,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6745,7 +6747,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6838,20 +6840,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7270,23 +7272,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7586,24 +7588,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index 6a6e83827..5733a18e8 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-08-19 13:51+0000\n" "Last-Translator: Petter Reinholdtsen \n" "Language-Team: Norwegian Bokmål username@%(domainname)s. Du kan sette opp ditt domene på " "systemsiden Configure ." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Nettprat-tjener" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2248,7 +2254,7 @@ msgstr "Ny sikkerhetskopi" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Oppdater" @@ -2366,13 +2372,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Aktiver skade" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7683,15 +7689,15 @@ msgstr "Automatiske oppgraderinger aktivert" msgid "Distribution upgrade disabled" msgstr "Automatiske oppgraderinger avslått (deaktivert)" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Oppgraderingsprosessen (upgrade process) har startet." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Å starte oppgradering (upgrade) mislyktes." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7730,39 +7736,39 @@ msgstr "Tilgang til alle tjenester og systeminnstillinger" msgid "Check LDAP entry \"{search_item}\"" msgstr "Sjekk LDAP-oppføring «{search_item}»" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Brukernavnet er opptatt eller reservert." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "Ugyldig tjenernavn" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Påkrevd. 150 tegn eller mindre. Kun engelske bokstaver, tall og @/./-/_." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Password" msgid "Authorization Password" msgstr "Administratorpassord" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "Vis passord" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7783,21 +7789,21 @@ msgstr "" "gruppen kan logge seg på alle tjenester. De kan også logge inn på systemet " "via SSH, og ha administrative rettigheter (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Oppretting av LDAP-bruker mislyktes: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Klarte ikke å legge ny bruker til i {group}-gruppen: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Autoriserte SSH-nøkler" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7807,47 +7813,43 @@ 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." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Klarte ikke å bytte navn på LDAP-bruker." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Klarte ikke å slette bruker fra gruppe." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Klarte ikke legge bruker til gruppe." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Klarte ikke sette SSH-nøkler." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "Klarte ikke legge bruker til gruppe." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Kan ikke å slette kun administratoren i systemet." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Klarte ikke å bytte passord for LDAP-bruker." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, 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}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Klarte ikke å begrense konsolltilgang: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Brukerkonto er opprettet, du er nå logget inn" @@ -7869,7 +7871,7 @@ msgid "Create User" msgstr "Opprett bruker" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Slett bruker" @@ -7969,20 +7971,20 @@ msgstr "Bruker %(username)s oppdatert." msgid "Edit User" msgstr "Rediger bruker" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Bruker {user} slettet." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Klarte ikke slette LDAP-bruker." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Endre passord" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Vellykket passordbytte." @@ -8474,23 +8476,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Generisk" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Feil under installasjon" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "installering" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "laster ned" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "mediaendring" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "oppsettsfil: {file}" @@ -8831,24 +8833,31 @@ msgstr "Dette programmet er for tiden ikke tilgjengelig for din distribusjon." msgid "Check again" msgstr "Sjekk på nytt" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installer" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Utfører en forhåndsinstallasjon" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Utfører en etterinstallasjon" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Installere %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% fullført" @@ -8857,6 +8866,9 @@ msgstr "%(percentage)s%% fullført" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Kan ikke å slette kun administratoren i systemet." + #, fuzzy #~| msgid "Show security vulnerabilities" #~ msgid "Past Vulnerabilities" diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index 90ef00bfa..23400b7b8 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-18 13:33+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch username@%(domainname)s. Het domein kan worden ingesteld op " "de Instellingen pagina." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "E-mailserver" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "Maakt gebruik van Postfix, Dovecot & Rspamd" @@ -2219,7 +2225,7 @@ msgstr "Nieuwe waarde" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Update" @@ -2321,11 +2327,11 @@ msgstr "Interne fout in {0}" msgid "Check syslog for more information" msgstr "Controleer syslog voor meer informatie" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Aktieve aliassen" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Inactieve aliassen" @@ -7605,15 +7611,15 @@ msgstr "Distributie bijwerken ingeschakeld" msgid "Distribution upgrade disabled" msgstr "Distributie bijwerken uitgeschakeld" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Upgrade-proces gestart." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Starten van de upgrade is mislukt." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Tussentijdse Software Updates zijn ingeschakeld." @@ -7653,32 +7659,32 @@ msgstr "Toegang tot alle diensten en systeeminstellingen" msgid "Check LDAP entry \"{search_item}\"" msgstr "Zoek LDAP item \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Gebruikersnaam is in gebruik of is gereserveerd." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Voer een geldige gebruikersnaam in." -#: plinth/modules/users/forms.py:71 +#: plinth/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 @/./-/_ ." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Authorisatie-wachtwoord" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "Voer je huidige wachtwoord in om accountwijzigingen toe te staan." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Ongeldig wachtwoord." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7693,21 +7699,21 @@ msgstr "" "ook op het systeem inloggen met SSH en kunnen systeemadministratie doen " "(sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "LDAP gebruiker aanmaken mislukt: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Toevoegen van gebruiker aan groep {group} mislukt: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Geautoriseerde SSH-sleutels" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7718,45 +7724,41 @@ msgstr "" "meerdere sleutels toevoegen, één op elke regel. Lege regels en regels die " "beginnen met # worden genegeerd." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "LDAP gebruiker hernoemen mislukt." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Gebruiker uit groep verwijderen mislukt." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Gebruiker aan groep toevoegen mislukt." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Kan de SSH-sleutels niet instellen." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Gebruikerstatus aanpassen mislukt." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Kan de enige beheerder in het systeem niet verwijderen." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Wijzigen LDAP gebruikerswachtwoord mislukt." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Toevoegen van gebruiker aan admin groep mislukt: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Consoletoegang beperken is mislukt: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Gebruikersaccount aangemaakt, je bent nu ingelogd" @@ -7778,7 +7780,7 @@ msgid "Create User" msgstr "Nieuwe gebruiker registreren" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Gebruiker verwijderen" @@ -7881,20 +7883,20 @@ msgstr "Gebruiker %(username)s bijgewerkt." msgid "Edit User" msgstr "Gebruiker wijzigen" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Gebruiker {user} verwijderd." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Verwijderen van LDAP gebruiker mislukt." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Wijzig wachtwoord" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Wachtwoord succesvol gewijzigd." @@ -8367,23 +8369,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Generiek" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Fout tijdens installatie" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "installeren" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "downloaden" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "media wijzigen" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "configuratiebestand: {file}" @@ -8718,24 +8720,31 @@ msgstr "Deze toepassing is momenteel niet beschikbaar in jouw distributie." msgid "Check again" msgstr "Controleer opnieuw" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installeer" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Pre-Install bewerkingen worden uitvoerd" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Post-install bewerkingen worden uitgevoerd" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Installeren van %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% voltooid" @@ -8744,6 +8753,9 @@ msgstr "%(percentage)s%% voltooid" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Kan de enige beheerder in het systeem niet verwijderen." + #~ msgid "Past Vulnerabilities" #~ msgstr "Kwetsbaarheden in het verleden" diff --git a/plinth/locale/pl/LC_MESSAGES/django.po b/plinth/locale/pl/LC_MESSAGES/django.po index f62764e87..5e165d0a1 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-03-03 16:50+0000\n" "Last-Translator: Karol Werner \n" "Language-Team: Polish . Możesz ustawić swoją domenę na stronie Konfiguruj." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Serwer czatu" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2194,7 +2200,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2310,13 +2316,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Włącz zniszczenia" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7049,15 +7055,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "Rejestracja użytkowników wyłączona" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7089,38 +7095,38 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "Niewłaściwa nazwa użytkownika" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "Konto Administratora" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "Pokaż hasło" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7129,68 +7135,64 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Tworzenie użytkownika LDAP nie udało się: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Nieudane dodanie użytkownika do {group} grupy:{error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add new user to admin group." msgid "Failed to change user status." msgstr "Nieudane dodawanie użytkownika do grupy admin." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Nieudane dodawanie użytkownika do grupy admin: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Utworzono konto użytkownika, możesz się teraz zalogować" @@ -7212,7 +7214,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7310,20 +7312,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7794,23 +7796,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "plik konfiguracyjny: {file}" @@ -8159,24 +8161,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index 87b608372..52f4822dc 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-05-08 22:33+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "Servidor Web" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2091,7 +2097,7 @@ msgstr "Novo Backup" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2203,13 +2209,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Applications" msgid "Enabled aliases" msgstr "Aplicações" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6896,15 +6902,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "Aplicações" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6936,36 +6942,36 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid domain name" msgid "Enter a valid username." msgstr "Nome de domínio inválido" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Upload Password" msgid "Invalid password." msgstr "Palavra-passe de Envio" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6974,66 +6980,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -7055,7 +7057,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7149,20 +7151,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7617,25 +7619,25 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 #, fuzzy #| msgid "Setting unchanged" msgid "media change" msgstr "Definição inalterada" -#: plinth/package.py:164 +#: plinth/package.py:167 #, fuzzy, python-brace-format #| msgid "Configuration" msgid "configuration file: {file}" @@ -7942,24 +7944,31 @@ msgstr "Atualmente, esta aplicação não está disponível na sua distribuiçã msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Instalar" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "A executar a operação de pré-instalação" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "A executar a operação de pós-Instalação" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "A instalar %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% concluída" diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index bd732ef93..a3490f4b0 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-10 07:34+0000\n" "Last-Translator: Artem \n" "Language-Team: Russian username@%(domainname)s. Вы можете " "настроить ваш домен на странице Настройка." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Чат-сервер" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2231,7 +2237,7 @@ msgstr "Резервные копии" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Обновление" @@ -2349,13 +2355,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Включить урон" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7652,15 +7658,15 @@ msgstr "Автоматические обновления включены" msgid "Distribution upgrade disabled" msgstr "Автоматические обновления отключены" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Начался процесс обновления." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Сбой при запуске обновления." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Активированы частые обновления функций." @@ -7701,33 +7707,33 @@ msgstr "Доступ ко всем сервисам и настройкам си msgid "Check LDAP entry \"{search_item}\"" msgstr "Проверьте запись LDAP \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Имя пользователя уже занято." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Введите действительное имя пользователя." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Требуется. 150 символов или меньше. Только английские буквы, цифры и @/./-/_." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Пароль авторизации" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "Введите свой текущий пароль, чтобы разрешить изменение учетной записи." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Неправильный пароль." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7741,21 +7747,21 @@ msgstr "" "Пользователи в группе администратора имеют доступ ко всем службам. Они также " "могут войти в систему через SSH и иметь административные привилегии (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Не удалось создать пользователя LDAP: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Не удалось добавить нового пользователя в группу {group}: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Авторизованные SSH ключи" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7766,46 +7772,42 @@ msgstr "" "на каждой строке. Пустые строки и строки, начинающиеся с # будут " "игнорироваться." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Переименование пользователя LDAP не удалось." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Не удалось удалить пользователя из группы." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Не удалось добавить пользователя в группу." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Не удалось задать ключи SSH." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Не удалось изменить статус пользователя." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Невозможно удалить единственного администратора в системе." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Изменение LDAP пароля пользователя не удалось." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" "Не удалось добавить нового пользователя в группу администраторов: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Не удалось ограничить доступ к консоли: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Учетная запись пользователя создана, теперь вы вошли" @@ -7827,7 +7829,7 @@ msgid "Create User" msgstr "Создать пользователя" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Удаление пользователя" @@ -7930,20 +7932,20 @@ msgstr "Пользователь %(username)s обновлен." msgid "Edit User" msgstr "Редактирование пользователя" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Пользователь {user} удален." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Сбой при удалении LDAP пользователя." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Изменить пароль" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Пароль успешно изменён." @@ -8398,23 +8400,23 @@ msgstr "PPPоE" msgid "Generic" msgstr "Универсальный" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Ошибка во время установки" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Установка" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "Загрузка" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "изменение медиа" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "Файл настроек: {file}" @@ -8750,24 +8752,31 @@ msgstr "Это приложение в настоящее время недос msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Установка" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Выполнение операции предварительной установки" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Выполнение операции после установки" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Установка %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% завершено" @@ -8776,6 +8785,9 @@ msgstr "%(percentage)s%% завершено" msgid "Gujarati" msgstr "Гуджарати" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Невозможно удалить единственного администратора в системе." + #~ msgid "Past Vulnerabilities" #~ msgstr "Прошлые уязвимости" diff --git a/plinth/locale/si/LC_MESSAGES/django.po b/plinth/locale/si/LC_MESSAGES/django.po index ba940985f..2af902dbf 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-04-27 13:32+0000\n" "Last-Translator: HelaBasa \n" "Language-Team: Sinhala Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1980,7 +1986,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2082,11 +2088,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6589,15 +6595,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6629,32 +6635,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6663,66 +6669,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6744,7 +6746,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6837,20 +6839,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7269,23 +7271,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7585,24 +7587,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/sl/LC_MESSAGES/django.po b/plinth/locale/sl/LC_MESSAGES/django.po index de73c2b74..f7da25c1c 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Slovenian Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Domain Name Server" msgid "Email Server" msgstr "Strežnik z imenom domene" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2134,7 +2140,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2242,11 +2248,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6821,15 +6827,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6861,36 +6867,36 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid hostname" msgid "Enter a valid username." msgstr "Neveljavno ime gostitelja" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Invalid hostname" msgid "Invalid password." msgstr "Neveljavno ime gostitelja" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6899,66 +6905,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6980,7 +6982,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7073,20 +7075,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7537,23 +7539,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7853,24 +7855,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/sq/LC_MESSAGES/django.po b/plinth/locale/sq/LC_MESSAGES/django.po index 2ec17075c..174e44061 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-06-07 12:34+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian Formësoni e sistemit." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Shërbyes Fjalosjesh" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2235,7 +2241,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Përditësoje" @@ -2351,13 +2357,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Aktivizo dëmtim" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7530,15 +7536,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7570,32 +7576,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Jepni një emër përdoruesi të vlefshëm." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Fjalëkalim Autorizimi" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Fjalëkalim i pavlefshëm." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7604,66 +7610,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -7685,7 +7687,7 @@ msgid "Create User" msgstr "Krijoni Përdorues" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Fshi Përdorues" @@ -7778,20 +7780,20 @@ msgstr "" msgid "Edit User" msgstr "Përpunoni Përdorues" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Ndryshoni Fjalëkalimin" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Fjalëkalimi u ndryshua me sukses." @@ -8216,23 +8218,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Elementar" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Gabim gjatë instalimit" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "po instalohet" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "po shkarkohet" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "ndryshim media" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "kartelë formësimi: {file}" @@ -8532,24 +8534,31 @@ msgstr "Ky aplikacion aktualisht s’mund të kihet në shpërndarjen tuaj." msgid "Check again" msgstr "Rikontrollo" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Instaloje" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index 92625dda8..94d3db14c 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Serbian Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Domain Name Server" msgid "Email Server" msgstr "Domain Name Server" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2058,7 +2064,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2164,11 +2170,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6689,15 +6695,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6729,32 +6735,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6763,66 +6769,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6844,7 +6846,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6937,20 +6939,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7369,23 +7371,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7685,24 +7687,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index addee5164..ec2563f61 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-21 20:38+0000\n" "Last-Translator: Michael Breidenbach \n" "Language-Team: Swedish användarnamn@%(domainname)s. Du kan ställa in " "din domän på systemet Konfigurera sidan." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "E-postserver" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "Drivs av Postfix, Dovecot och Rspamd" @@ -2205,7 +2211,7 @@ msgstr "Nytt värde" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Uppdatera" @@ -2307,11 +2313,11 @@ msgstr "Internt fel i {0}" msgid "Check syslog for more information" msgstr "Kontrollera syslog för mer information" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Aktiverade alias" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Inaktiverade alias" @@ -7540,15 +7546,15 @@ msgstr "Distributionsuppgradering aktiverad" msgid "Distribution upgrade disabled" msgstr "Distributionsuppgradering inaktiverad" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Uppgraderingsprocessen påbörjades." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Det gick inte att starta uppgraderingen." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Frekventa funktionsuppdateringar aktiverade." @@ -7587,34 +7593,34 @@ msgstr "Tillgång till alla tjänster och Systeminställningar" msgid "Check LDAP entry \"{search_item}\"" msgstr "Kontrollera LDAP-posten \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Användarnamnet är upptaget eller är reserverade." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Ange ett giltigt användarnamn." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 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 @/./-/" "_ ." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Auktoriseringslösenord" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "Ange ditt nuvarande lösenord för att auktorisera kontomodifieringar." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Ogiltigt lösenord." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7628,21 +7634,21 @@ 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)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Det gick inte att skapa LDAP-användare: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Auktoriserade SSH-nycklar" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7652,46 +7658,42 @@ 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." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Det gick inte att byta namn på LDAP-användare." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Det gick inte att ta bort användare från gruppen." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Det gick inte att lägga till användare i gruppen." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Det går inte att ange SSH-nycklar." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Det gick inte att ändra användarstatus." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Det går inte att ta bort den enda administratören i systemet." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Det gick inte att ändra användarlösenordet för LDAP." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, 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}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Det gick inte att begränsa konsolåtkomst: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Användarkonto skapat, du är nu inloggad" @@ -7713,7 +7715,7 @@ msgid "Create User" msgstr "Skapa användare" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Ta bort användare" @@ -7816,20 +7818,20 @@ msgstr "Användaren %(username)s har uppdaterats." msgid "Edit User" msgstr "Redigera användar" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Användare {user} borttagen." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Det gick inte att ta bort LDAP-användare." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Ändra lösenord" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Lösenordet har ändrats." @@ -8311,23 +8313,23 @@ msgstr "Pppoe" msgid "Generic" msgstr "Generiska" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Fel vid installation" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Installera" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "ladda ner" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "Mediabyte" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurationsfil: {file}" @@ -8663,24 +8665,31 @@ msgstr "Denna ansökan är för närvarande inte tillgänglig i din distribution msgid "Check again" msgstr "Kontrollera igen" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installera" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Utföra för installationsåtgärd" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Utföra åtgärder efter installationen" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Installerar %(package_names)s:%(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s %% färdigt" @@ -8689,6 +8698,9 @@ msgstr "%(percentage)s %% färdigt" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Det går inte att ta bort den enda administratören i systemet." + #~ msgid "Past Vulnerabilities" #~ msgstr "Tidigare sårbarheter" diff --git a/plinth/locale/ta/LC_MESSAGES/django.po b/plinth/locale/ta/LC_MESSAGES/django.po index 706ead7bd..8058d3824 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -51,25 +51,25 @@ msgstr "" msgid "Cannot connect to {host}:{port}" msgstr "" -#: plinth/forms.py:39 +#: plinth/forms.py:36 msgid "Select a domain name to be used with this application" msgstr "" -#: plinth/forms.py:41 +#: plinth/forms.py:38 msgid "" "Warning! The application may not work properly if domain name is changed " "later." msgstr "" -#: plinth/forms.py:49 +#: plinth/forms.py:46 msgid "Language" msgstr "" -#: plinth/forms.py:50 +#: plinth/forms.py:47 msgid "Language to use for presenting this web interface" msgstr "" -#: plinth/forms.py:57 +#: plinth/forms.py:54 msgid "Use the language preference set in the browser" msgstr "" @@ -751,7 +751,7 @@ msgstr "" #: plinth/modules/bepasty/forms.py:27 #: plinth/modules/bepasty/templates/bepasty.html:30 -#: plinth/modules/users/forms.py:103 plinth/modules/users/forms.py:227 +#: plinth/modules/users/forms.py:102 plinth/modules/users/forms.py:228 msgid "Permissions" msgstr "" @@ -1064,7 +1064,7 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:9 -#: plinth/modules/performance/manifest.py:33 +#: plinth/modules/performance/manifest.py:9 msgid "Cockpit" msgstr "" @@ -1618,7 +1618,7 @@ msgid "Use HTTP basic authentication" msgstr "" #: plinth/modules/dynamicdns/forms.py:103 plinth/modules/networks/forms.py:212 -#: plinth/modules/users/forms.py:69 +#: plinth/modules/users/forms.py:68 msgid "Username" msgstr "" @@ -1845,11 +1845,17 @@ msgid "" "Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1979,7 +1985,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2081,11 +2087,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6588,15 +6594,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6628,32 +6634,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6662,66 +6668,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6743,7 +6745,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6836,20 +6838,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7268,23 +7270,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7584,24 +7586,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index ec5b2b01f..ea9d08ac0 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-05-17 18:31+0000\n" "Last-Translator: chilumula vamshi krishna \n" "Language-Team: Telugu kaanfigar పేజీలో సెటప్ చేయవచ్చు." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "కబుర్ల సేవిక" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2214,7 +2220,7 @@ msgstr "బ్యాకప్స్" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "నవీకరణ" @@ -2332,12 +2338,12 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy msgid "Enabled aliases" msgstr "PageKite ప్రారంభించు" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7503,15 +7509,15 @@ msgstr "స్వయంచాలక నవీకరణలు ప్రారం msgid "Distribution upgrade disabled" msgstr "స్వయంచాలక నవీకరణలు నిలిపివేయబడ్డాయి" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "అప్గ్రేడ్ ప్రక్రియ ప్రారంభించబడింది." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "నవీకరణ ప్రారంభం విఫలమైంది." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7543,38 +7549,38 @@ msgstr "అన్ని సేవలకు మరియు సిస్టమ్ msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP నమోదు \"{search_item}\" తనిఖీ" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "యూజర్ పేరు తీసుకోబడింది లేదా రిజర్వ్ చేయబడింది." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "సేవిక పేరు చెలదు" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Password" msgid "Authorization Password" msgstr "నిర్వాహకుని రహస్యపదం" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "రహస్యపదం కనబర్చు" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7583,72 +7589,68 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "ఎల్.డి.ఏ.పి వాడుకరి సృష్టించడంలో విఫలమైంది." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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} సముహానికి జోడించడంలో విఫలం." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "అధీకృత SSH కీలు" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "ఎల్.డి.ఏ.పి వాడుకరి పేరుమార్పులో విఫలం." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "సమూహంలోంచి వినియోగదారుని తొలగించడంలో విఫలం." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "సమూహంలోకి వినియోగదారుని జోడించడంలో విఫలం." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "SSH కీలను సెట్ చేయడం సాధ్యం కాలేదు." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "సమూహంలోకి వినియోగదారుని జోడించడంలో విఫలం." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "సిస్టమ్‌లోని ఏకైక నిర్వాహకుడిని తొలగించలేరు." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "ఎల్.డి.ఏ.పి వాడుకరి పాస్‌వర్డ్ మార్పిడి విఫలం." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "కొత్త వాడుకరి ను అడ్మిన్ సమూహంలో జోడించడం విఫలమైనది." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to restrict console access." msgid "Failed to restrict console access: {error}" msgstr "console ప్రవేశమును పరిమితి చెయడంలొ విఫలమైంది." -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "వాడుకరి ఖాతా సృస్టించబడింది, మీరు లాగిన్ చేయబడ్డారు" @@ -7670,7 +7672,7 @@ msgid "Create User" msgstr "వినియోగదారుని సృష్టించు" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "వినియోగదారుని తొలగించు" @@ -7772,20 +7774,20 @@ msgstr "వినియోగదారి %(username)s నావీకరిం msgid "Edit User" msgstr "వినియోగదారి మార్పు" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "వినియోగదారి {user} తొలగించబడ్డాడు." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "ఎల్.డి.ఏ.పి వినియోగదారి తొలగింపు విఫలం." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "పాస్‌వర్డ్ మార్చు" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "పాస్‌వర్డ్ విజయవంతంగా మార్చబడినది." @@ -8263,23 +8265,23 @@ msgstr "పిపిపిఒఇ" msgid "Generic" msgstr "సాధారణమైన" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "సంస్థాపన ఒక పొరపాటు జరిగింది" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "వ్యవస్థాపిస్తోంది" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "దిగుమతి అవుతోంది" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "ప్రసార మాధ్యమం మార్పు" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "ఆకృతీకరణ ఫైలు: {file}" @@ -8616,24 +8618,31 @@ msgstr "ప్రస్తుతం ఈ అనువర్తనం మీ ప msgid "Check again" msgstr "మళ్ళీ ప్రయత్నించు" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "నిక్షిప్తం చేయు" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "ప్రీ-ఇన్‌స్టాల్ ఆపరేషన్ జరుగుతోంది" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "ఇన్స్తల్ల్ తర్వాత ప్రక్రియ జరుగుతోంది" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "%(package_names)s నిక్షిప్తం అవుతోంది: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s %% పూర్తి" @@ -8642,6 +8651,9 @@ msgstr "%(percentage)s %% పూర్తి" msgid "Gujarati" msgstr "గుజరాతీ" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "సిస్టమ్‌లోని ఏకైక నిర్వాహకుడిని తొలగించలేరు." + #~ msgid "Past Vulnerabilities" #~ msgstr "గత దుర్బలతలు" diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index 73bf97be9..b32530798 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-21 20:38+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish Yapılandır sayfasında " "ayarlayabilirsiniz." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "E-posta Sunucusu" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "Postfix, Dovecot ve Rspamd tarafından desteklenmektedir" @@ -2207,7 +2213,7 @@ msgstr "Yeni değer" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Güncelle" @@ -2309,11 +2315,11 @@ msgstr "{0} içinde dahili hata" msgid "Check syslog for more information" msgstr "Daha fazla bilgi için syslog'u gözden geçirin" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Etkinleştirilmiş kod adları" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Etkisizleştirilmiş kod adları" @@ -7566,15 +7572,15 @@ msgstr "Dağıtım yükseltmesi etkinleştirildi" msgid "Distribution upgrade disabled" msgstr "Dağıtım yükseltmesi etkisizleştirildi" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Yükseltme işlemi başladı." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Yükseltmeyi başlatma başarısız oldu." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Sık yapılan özellik güncellemeleri etkinleştirildi." @@ -7614,34 +7620,34 @@ msgstr "Tüm hizmetlere ve sistem ayarlarına erişim" msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP \"{search_item}\" girişini denetleme" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Kullanıcı adı alınmış veya ayrılmış." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Geçerli bir kullanıcı adı girin." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Zorunlu. 150 veya daha az karakter. Sadece İngilizce harfler, rakamlar ve " "@/./-/_ karakterleri." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Yetkilendirme Parolası" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "Hesap değişikliklerini yetkilendirmek için şu anki parolanızı girin." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Geçersiz parola." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7655,21 +7661,21 @@ 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." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "LDAP kullanıcısı oluşturma başarısız oldu: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Yetkili SSH Anahtarları" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7680,45 +7686,41 @@ msgstr "" "tane olmak üzere birden çok anahtar girebilirsiniz. Boş satırlar ve # ile " "başlayan satırlar yoksayılacaktır." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "LDAP kullanıcısının yeniden adlandırılması başarısız oldu." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Kullanıcıyı gruptan kaldırma başarısız oldu." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Kullanıcıyı gruba ekleme başarısız oldu." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "SSH anahtarları ayarlanamıyor." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Kullanıcı durumunu değiştirme başarısız oldu." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Sistemdeki tek yönetici silinemez." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "LDAP kullanıcı parolasının değiştirilmesi başarısız oldu." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, 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}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Konsol erişimini kısıtlama başarısız oldu: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Kullanıcı hesabı oluşturuldu, şu an oturum açtınız" @@ -7740,7 +7742,7 @@ msgid "Create User" msgstr "Kullanıcı Oluştur" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Kullanıcıyı Sil" @@ -7843,20 +7845,20 @@ msgstr "%(username)s kullanıcısı güncellendi." msgid "Edit User" msgstr "Kullanıcıyı Düzenle" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "{user} kullanıcısı silindi." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "LDAP kullanıcısının silinmesi başarısız oldu." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Parolayı Değiştir" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Parola başarılı olarak değiştirildi." @@ -8336,23 +8338,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Genel" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Kurulum sırasında hata oldu" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "yükleniyor" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "indiriliyor" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "ortam değiştirme" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "yapılandırma dosyası: {file}" @@ -8686,24 +8688,31 @@ msgstr "Bu uygulama şu anda dağıtımınızda mevcut değil." msgid "Check again" msgstr "Tekrar denetle" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Yükle" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Yükleme öncesi işlemi gerçekleştiriliyor" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Yükleme sonrası işlemi gerçekleştiriliyor" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Yüklenen %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%%%(percentage)s tamamlandı" @@ -8712,6 +8721,9 @@ msgstr "%%%(percentage)s tamamlandı" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Sistemdeki tek yönetici silinemez." + #~ msgid "Past Vulnerabilities" #~ msgstr "Geçmiş Güvenlik Açığı" diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index 4b2e0ea46..4d3b60cf5 100644 --- a/plinth/locale/uk/LC_MESSAGES/django.po +++ b/plinth/locale/uk/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" -"PO-Revision-Date: 2021-09-21 20:38+0000\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" +"PO-Revision-Date: 2021-10-02 21:38+0000\n" "Last-Translator: Andrij Mizyk \n" "Language-Team: Ukrainian \n" @@ -53,11 +53,11 @@ msgstr "Підключення до {host}:{port}" msgid "Cannot connect to {host}:{port}" msgstr "Неможливо підключитись до {host}:{port}" -#: plinth/forms.py:39 +#: plinth/forms.py:36 msgid "Select a domain name to be used with this application" msgstr "Оберіть назву домена, яка використовуватиметься для цього застосунка" -#: plinth/forms.py:41 +#: plinth/forms.py:38 msgid "" "Warning! The application may not work properly if domain name is changed " "later." @@ -65,15 +65,15 @@ msgstr "" "Попередження! Застосунок може працювати неправильно, якщо пізніше зміниться " "назва домену." -#: plinth/forms.py:49 +#: plinth/forms.py:46 msgid "Language" msgstr "Мова" -#: plinth/forms.py:50 +#: plinth/forms.py:47 msgid "Language to use for presenting this web interface" msgstr "Мова, що використовується для надання цього інтерфейсу" -#: plinth/forms.py:57 +#: plinth/forms.py:54 msgid "Use the language preference set in the browser" msgstr "Використовувати мовні налаштування оглядача" @@ -168,7 +168,7 @@ msgstr "Дозволити планування резервних копій" #: plinth/modules/storage/__init__.py:323 #, python-brace-format msgid "Go to {app_name}" -msgstr "Перейти до {app_name}" +msgstr "Перейти в {app_name}" #: plinth/modules/backups/__init__.py:242 #, python-brace-format @@ -820,7 +820,7 @@ msgstr "Дозволи для анонімних користувачів, що #: plinth/modules/bepasty/forms.py:27 #: plinth/modules/bepasty/templates/bepasty.html:30 -#: plinth/modules/users/forms.py:103 plinth/modules/users/forms.py:227 +#: plinth/modules/users/forms.py:102 plinth/modules/users/forms.py:228 msgid "Permissions" msgstr "Дозволи" @@ -1166,7 +1166,7 @@ msgstr "" "якщо звертатися до нього використовуючи IP-адресу як частину URL." #: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:9 -#: plinth/modules/performance/manifest.py:33 +#: plinth/modules/performance/manifest.py:9 msgid "Cockpit" msgstr "Cockpit" @@ -1773,7 +1773,7 @@ msgid "Use HTTP basic authentication" msgstr "Використовувати основну автентифікацію HTTP" #: plinth/modules/dynamicdns/forms.py:103 plinth/modules/networks/forms.py:212 -#: plinth/modules/users/forms.py:69 +#: plinth/modules/users/forms.py:68 msgid "Username" msgstr "Ім’я користувача" @@ -2030,11 +2030,17 @@ msgstr "" "виглядатиме як username@%(domainname)s. Ви можете налаштувати свій " "домен на системній сторінці Налаштувати." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "Сервер електронної пошти" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "Працює на Postfix, Dovecot та Rspamd" @@ -2164,7 +2170,7 @@ msgstr "Нове значення" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Оновити" @@ -2266,11 +2272,11 @@ msgstr "Внутрішня помилка в {0}" msgid "Check syslog for more information" msgstr "Перевірте системний журнал, щоб дізнатися більше" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Дозволені аліяси" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Вимкнені аліяси" @@ -2513,7 +2519,7 @@ msgstr "Нема доступних репозиторіїв." #: plinth/modules/gitweb/templates/gitweb_configure.html:35 #, python-format msgid "Go to repository %(repo.name)s" -msgstr "Перейти до репозиторію %(repo.name)s" +msgstr "Перейти в репозиторій %(repo.name)s" #: plinth/modules/gitweb/templates/gitweb_configure.html:42 msgid "Cloning…" @@ -2764,6 +2770,9 @@ msgid "" "using %(box_name)s, you can ask for help from our community of users and " "contributors." msgstr "" +"Якщо Вам потрібна допомога в якійсь роботі або Ви стикнулися з проблемами " +"використання %(box_name)s, можете звертатися до нашої спільноти користувачів " +"і розробників." #: plinth/modules/help/templates/help_support.html:20 msgid "" @@ -2953,7 +2962,7 @@ msgstr "Нема доступних вікі або боґів." #: plinth/modules/ikiwiki/templates/ikiwiki_configure.html:31 #, python-format msgid "Go to site %(site)s" -msgstr "Перейти до сайту %(site)s" +msgstr "Перейти на сайт %(site)s" #: plinth/modules/ikiwiki/templates/ikiwiki_configure.html:38 #, python-format @@ -4509,8 +4518,8 @@ msgid "" "your network. This information is used to guide you with further setup. It " "can be changed later." msgstr "" -"Виберіть пункт, який найкраще описує те, як Ваш %(box_name)s підʼєднано до " -"мережі. Ця інформація використовується лише для подальших вказівок " +"Оберіть пункт, який найкраще описує зʼєднання Вашого %(box_name)s із " +"мережею. Ця інформація використовується лише для подальших вказівок " "установлення. Її можна змінити пізніше." #: plinth/modules/networks/templates/network_topology_main.html:9 @@ -5195,7 +5204,7 @@ msgid "" "Are you sure you want to restart? You will not be able to access this web " "interface for a few minutes until the system is restarted." msgstr "" -"Ви справді хочете перезавантажити систему? Ви не матимете доступ до " +"Ви дійсно хочете перезавантажити систему? Ви не матимете доступу до " "вебінтерфейсу протягом кількох хвилин, поки система не перезавантажиться." #: plinth/modules/power/templates/power_restart.html:34 @@ -5214,7 +5223,7 @@ msgid "" "Are you sure you want to shut down? You will not be able to access this web " "interface after shut down." msgstr "" -"Ви справді хочете вимкнути систему? Ви не матимете доступу до вебінтерфейсу " +"Ви дійсно хочете вимкнути систему? Ви не матимете доступу до вебінтерфейсу " "після вимкнення." #: plinth/modules/power/templates/power_shutdown.html:33 @@ -6892,7 +6901,7 @@ msgid "" "case, refresh the page to continue." msgstr "" "Це може зайняти багато часу. Під час оновлення вебінтерфейс " -"може бути тимчасово недоступним і показувати помилку. В такому випадку " +"може тимчасово бути недоступним і показувати помилку. В такому випадку " "оновіть сторінку і продовжіть." #: plinth/modules/upgrades/templates/update-firstboot-progress.html:31 @@ -6917,6 +6926,8 @@ msgid "" "%(box_name)s has been updated to version %(version)s. See the release announcement." msgstr "" +"%(box_name)s оновлено до версії %(version)s. Дивіться анонс випуску." #: plinth/modules/upgrades/templates/upgrades-new-release.html:22 #: plinth/templates/notifications.html:44 @@ -6996,15 +7007,15 @@ msgstr "Дозволено оновлення дистрибутиву" msgid "Distribution upgrade disabled" msgstr "Вимкнено оновлення дистрибутиву" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Процес оновлення розпочато." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Не вдалося розпочати оновлення." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Оновлення частих можливостей активовано." @@ -7044,33 +7055,33 @@ msgstr "Доступ до всіх сервісів і налаштувань с msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Уведіть коректне імʼя користувача." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Обовʼязково. 150 знаків, не більше. Лише англійські букви, цифри і @/./-/_." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Пароль для авторизації" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "Уведіть свій поточний пароль для авторизування змін обліківки." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Неправильний пароль." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -7079,21 +7090,21 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Не вдалося створити користувача LDAP: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Не вдалося додати нового користувача до групи {group}: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Ключі SSH для авторизації" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7103,45 +7114,41 @@ msgstr "" "систему без використання пароля. Ви можете вказати декілька ключів, один на " "кожен рядок. Порожні рядки і рядки, що починаються на # іґноруються." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Не вдалося перейменувати користувача LDAP." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Не вдалося вилучити користувача з групи." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Не вдалося додати користувача до групи." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Не можливо задати ключі SSH." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Не вдалося змінити стан користувача." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Не можливо видалити лише адміністратора системи." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Не вдалося змінити пароль користувача LDAP." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Не вдалося додати нового користувача до адмінської групи: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Не вдалося обмежити доступ до консолі: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Обліківку користувача створено, Ви ввійшли в систему" @@ -7163,7 +7170,7 @@ msgid "Create User" msgstr "Створити користувача" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Видалити користувача" @@ -7261,20 +7268,20 @@ msgstr "Користувача %(username)s оновлено." msgid "Edit User" msgstr "Зміни користувача" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Користувача {user} видалено." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Не вдалося видалити користувача LDAP." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Зберегти пароль" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Пароль змінено успішно." @@ -7698,23 +7705,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Помилка під час установлення" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "установлення" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "завантаження" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "зміна медія" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "файл конфіґурації: {file}" @@ -7743,6 +7750,9 @@ msgid "" "FreedomBox Service (Plinth) project issue tracker." msgstr "" +"Якщо Ви вірите, що ця сторінка має існувати, будь ласка, надішліть ваду у відстежувач помилок проєкту служби FreedomBox (Plinth)." #: plinth/templates/500.html:10 msgid "500" @@ -8038,24 +8048,31 @@ msgstr "Цей застосунок поки що не доступний у В msgid "Check again" msgstr "Перевірити знову" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Установити" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Виконання передінсталяційних операцій" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Виконання післяінсталяційних операцій" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Установлюється %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% завершено" @@ -8064,6 +8081,9 @@ msgstr "%(percentage)s%% завершено" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Не можливо видалити лише адміністратора системи." + #~ msgid "Past Vulnerabilities" #~ msgstr "Минулі вразливості" diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po index 0458a7bc0..700f63653 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-07-28 08:34+0000\n" "Last-Translator: bruh \n" "Language-Team: Vietnamese Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Domain Name Server" msgid "Email Server" msgstr "Máy chủ tên miền" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2185,7 +2191,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Cập nhật" @@ -2293,11 +2299,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6803,15 +6809,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6843,32 +6849,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6877,66 +6883,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6958,7 +6960,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7051,20 +7053,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7483,23 +7485,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7799,24 +7801,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index 314ac7dad..91d0014ab 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-18 13:33+0000\n" "Last-Translator: 池边树下 \n" "Language-Team: Chinese (Simplified) 。你可以在系统的配置中设置你" "的域名。" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "Web 服务器" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2166,7 +2172,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "更新" @@ -2284,13 +2290,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "启用伤害" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7520,15 +7526,15 @@ msgstr "已启用自动升级" msgid "Distribution upgrade disabled" msgstr "已禁用自动升级" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "升级过程开始。" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "开始升级失败。" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7560,38 +7566,38 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "请检查 LDAP 条目“{search_item}”" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "用户名已经占用或保留。" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "服务器名称无效" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "管理员帐户" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "显示密码" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7610,23 +7616,23 @@ msgstr "" "支持单一登录的服务。

管理员(admin)组中的用户将能够登录所有服务。他" "们还可以通过 SSH 登录到系统并具有管理权限(sudo)。" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "创建 LDAP 用户失败。" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, 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}。" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 " @@ -7635,49 +7641,45 @@ msgstr "" "设置 SSH 公钥将允许此用户安全地登录到系统不使用密码。您可以输入多个密钥,每行" "一个。将忽略空行和以 # 开头的行。" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "重命名 LDAP 用户失败。" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "无法从组中删除用户。" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "无法将用户添加到组。" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "不能设置 SSH 密钥。" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "无法将用户添加到组。" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "更改 LDAP 用户密码失败。" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "未能将新用户添加到管理员组。" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to restrict console access." msgid "Failed to restrict console access: {error}" msgstr "限制命令行访问失败。" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "用户帐户已创建,您现在可以登录" @@ -7699,7 +7701,7 @@ msgid "Create User" msgstr "创建用户" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "删除用户" @@ -7797,20 +7799,20 @@ msgstr "用户 %(username)s 已更新。" msgid "Edit User" msgstr "编辑用户" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "用户 {user} 已删除。" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "删除 LDAP 用户失败。" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "更改密码" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "已成功更改密码。" @@ -8313,23 +8315,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "通用" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "安装时错误" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "安装" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "下载中" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "媒体改变" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "配置文件:{file}" @@ -8691,24 +8693,31 @@ msgstr "这项应用现在在你不中无法使用" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "安装" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "执行安装前操作" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "执行安装后操作" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "正在安装 %(package_names)s:%(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "已完成 %(percentage)s%%" diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index f720a5413..c49e980fc 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: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-04-27 13:32+0000\n" "Last-Translator: James Pan \n" "Language-Team: Chinese (Traditional) Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Domain Name Server" msgid "Email Server" msgstr "域名服務器 DNS" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2003,7 +2009,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2109,11 +2115,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6616,15 +6622,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6656,32 +6662,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 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 " @@ -6690,66 +6696,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 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 "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6771,7 +6773,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6864,20 +6866,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7296,23 +7298,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7612,24 +7614,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/modules/backups/forms.py b/plinth/modules/backups/forms.py index 627fa933c..ac70ad2fa 100644 --- a/plinth/modules/backups/forms.py +++ b/plinth/modules/backups/forms.py @@ -285,12 +285,13 @@ class VerifySshHostkeyForm(forms.Form): # Fetch public keys of ssh remote keyscan = subprocess.run(['ssh-keyscan', hostname], stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + stderr=subprocess.PIPE, check=False) keys = keyscan.stdout.decode().splitlines() error_message = keyscan.stderr.decode() if keyscan.returncode else None # Generate user-friendly fingerprints of public keys keygen = subprocess.run(['ssh-keygen', '-l', '-f', '-'], - input=keyscan.stdout, stdout=subprocess.PIPE) + input=keyscan.stdout, stdout=subprocess.PIPE, + check=False) fingerprints = keygen.stdout.decode().splitlines() return zip(keys, fingerprints), error_message diff --git a/plinth/modules/backups/tests/test_ssh_remotes.py b/plinth/modules/backups/tests/test_ssh_remotes.py index 5bc6688a8..d0b789ad2 100644 --- a/plinth/modules/backups/tests/test_ssh_remotes.py +++ b/plinth/modules/backups/tests/test_ssh_remotes.py @@ -38,7 +38,7 @@ def fixture_password(): def get_hashed_password(password): res = subprocess.run(['mkpasswd', '--method=md5', password], - stdout=subprocess.PIPE) + stdout=subprocess.PIPE, check=True) return res.stdout.decode().strip() diff --git a/plinth/modules/bind/data/lib/systemd/system/bind9.service.d/freedombox.conf b/plinth/modules/bind/data/usr/lib/systemd/system/bind9.service.d/freedombox.conf similarity index 100% rename from plinth/modules/bind/data/lib/systemd/system/bind9.service.d/freedombox.conf rename to plinth/modules/bind/data/usr/lib/systemd/system/bind9.service.d/freedombox.conf diff --git a/plinth/modules/calibre/data/lib/systemd/system/calibre-server-freedombox.service b/plinth/modules/calibre/data/usr/lib/systemd/system/calibre-server-freedombox.service similarity index 97% rename from plinth/modules/calibre/data/lib/systemd/system/calibre-server-freedombox.service rename to plinth/modules/calibre/data/usr/lib/systemd/system/calibre-server-freedombox.service index 0ac7a7026..df6acfacd 100644 --- a/plinth/modules/calibre/data/lib/systemd/system/calibre-server-freedombox.service +++ b/plinth/modules/calibre/data/usr/lib/systemd/system/calibre-server-freedombox.service @@ -4,6 +4,7 @@ Description=calibre Content Server Documentation=man:calibre-server(1) After=network.target +ConditionPathExists=/usr/bin/calibre-server [Service] CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_IPC_OWNER CAP_NET_ADMIN CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE CAP_KILL CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_LINUX_IMMUTABLE CAP_IPC_LOCK CAP_SYS_CHROOT CAP_BLOCK_SUSPEND CAP_LEASE CAP_SYS_PACCT CAP_SYS_TTY_CONFIG CAP_SYS_BOOT CAP_MAC_ADMIN CAP_MAC_OVERRIDE CAP_SYS_NICE CAP_SYS_RESOURCE diff --git a/plinth/modules/config/data/lib/systemd/system/zramswap.service.d/freedombox.conf b/plinth/modules/config/data/usr/lib/systemd/system/zramswap.service.d/freedombox.conf similarity index 100% rename from plinth/modules/config/data/lib/systemd/system/zramswap.service.d/freedombox.conf rename to plinth/modules/config/data/usr/lib/systemd/system/zramswap.service.d/freedombox.conf diff --git a/plinth/modules/coturn/data/lib/systemd/system/coturn.service.d/freedombox.conf b/plinth/modules/coturn/data/usr/lib/systemd/system/coturn.service.d/freedombox.conf similarity index 100% rename from plinth/modules/coturn/data/lib/systemd/system/coturn.service.d/freedombox.conf rename to plinth/modules/coturn/data/usr/lib/systemd/system/coturn.service.d/freedombox.conf diff --git a/plinth/modules/deluge/data/lib/systemd/system/deluged.service.d/freedombox.conf b/plinth/modules/deluge/data/usr/lib/systemd/system/deluged.service.d/freedombox.conf similarity index 100% rename from plinth/modules/deluge/data/lib/systemd/system/deluged.service.d/freedombox.conf rename to plinth/modules/deluge/data/usr/lib/systemd/system/deluged.service.d/freedombox.conf diff --git a/plinth/modules/email_server/__init__.py b/plinth/modules/email_server/__init__.py index da59314d2..9f69cea9b 100644 --- a/plinth/modules/email_server/__init__.py +++ b/plinth/modules/email_server/__init__.py @@ -15,14 +15,26 @@ from plinth.modules.apache.components import Webserver from plinth.modules.config import get_domainname from plinth.modules.firewall.components import Firewall from plinth.modules.letsencrypt.components import LetsEncrypt +from plinth.package import packages_installed, remove from . import audit, manifest version = 1 +# Other likely install conflicts have been discarded: +# - msmtp, nullmailer, sendmail don't cause install faults. +# - qmail and smail are missing in Bullseye (Not tested, +# but less likely due to that). +package_conflicts = ('exim4-base', 'exim4-config', 'exim4-daemon-light') +package_conflicts_action = 'ignore' + packages = [ - 'postfix-ldap', 'dovecot-pop3d', 'dovecot-imapd', - 'dovecot-ldap', 'dovecot-lmtpd', 'dovecot-managesieved', + 'postfix-ldap', + 'dovecot-pop3d', + 'dovecot-imapd', + 'dovecot-ldap', + 'dovecot-lmtpd', + 'dovecot-managesieved', ] packages_bloat = ['rspamd'] @@ -38,6 +50,12 @@ port_info = { managed_services = ['postfix', 'dovecot', 'rspamd'] managed_packages = packages + packages_bloat + +_description = [ + _('During installation, any other email servers in the system will be ' + 'uninstalled.') +] + app = None logger = logging.getLogger(__name__) @@ -55,18 +73,19 @@ class EmailServerApp(plinth.app.App): self._add_firewall_ports() # /rspamd location - webserver = Webserver('webserver-email', # unique id - 'email-server-freedombox', # config file name - urls=['https://{host}/rspamd']) + webserver = Webserver( + 'webserver-email', # unique id + 'email-server-freedombox', # config file name + urls=['https://{host}/rspamd']) self.add(webserver) # Let's Encrypt event hook default_domain = get_domainname() domains = [default_domain] if default_domain else [] - letsencrypt = LetsEncrypt( - 'letsencrypt-email-server', domains=domains, - daemons=['postfix', 'dovecot'], should_copy_certificates=False, - managing_app='email_server') + letsencrypt = LetsEncrypt('letsencrypt-email-server', domains=domains, + daemons=['postfix', 'dovecot'], + should_copy_certificates=False, + managing_app='email_server') self.add(letsencrypt) if not domains: @@ -74,14 +93,11 @@ class EmailServerApp(plinth.app.App): def _add_ui_components(self): info = plinth.app.Info( - app_id=self.app_id, - version=version, - name=self.app_name, + app_id=self.app_id, version=version, name=self.app_name, short_description=_('Powered by Postfix, Dovecot & Rspamd'), - manual_page='EmailServer', + description=_description, manual_page='EmailServer', clients=manifest.clients, - donation_url='https://freedomboxfoundation.org/donate/' - ) + donation_url='https://freedomboxfoundation.org/donate/') self.add(info) menu_item = plinth.menu.Menu( @@ -90,19 +106,14 @@ class EmailServerApp(plinth.app.App): info.short_description, # app description 'roundcube', # icon name in `static/theme/icons/` 'email_server:index', # view name - parent_url_name='apps' - ) + parent_url_name='apps') self.add(menu_item) shortcut = plinth.frontpage.Shortcut( - 'shortcut_' + self.app_id, - name=info.name, - short_description=info.short_description, - icon='roundcube', - url=reverse_lazy('email_server:my_mail'), - clients=manifest.clients, - login_required=True - ) + 'shortcut_' + self.app_id, name=info.name, + short_description=info.short_description, icon='roundcube', + url=reverse_lazy('email_server:my_mail'), clients=manifest.clients, + login_required=True) self.add(shortcut) def _add_daemons(self): @@ -142,14 +153,29 @@ class EmailServerApp(plinth.app.App): def setup(helper, old_version=None): """Installs and configures module""" + + def _clear_conflicts(): + packages_to_remove = packages_installed(package_conflicts) + if packages_to_remove: + logger.info('Removing conflicting packages: %s', + packages_to_remove) + remove(packages_to_remove) + + # Install + helper.call('pre', _clear_conflicts) helper.install(packages) helper.install(packages_bloat, skip_recommends=True) + + # Setup helper.call('post', audit.domain.repair) helper.call('post', audit.ldap.repair) helper.call('post', audit.spam.repair) helper.call('post', audit.tls.repair) helper.call('post', audit.rcube.repair) + + # Reload for srvname in managed_services: actions.superuser_run('service', ['reload', srvname]) - # Final step: expose service daemons to public internet + + # Expose to public internet helper.call('post', app.enable) diff --git a/plinth/modules/email_server/audit/domain.py b/plinth/modules/email_server/audit/domain.py index b9205292e..da8c77ea6 100644 --- a/plinth/modules/email_server/audit/domain.py +++ b/plinth/modules/email_server/audit/domain.py @@ -244,8 +244,8 @@ def _action_set_keys(): clean_dict[key] = clean_function(value) # Apply changes (postconf) - postconf_dict = dict(filter(lambda kv: not kv[0].startswith('_'), - clean_dict.items())) + postconf_dict = dict( + filter(lambda kv: not kv[0].startswith('_'), clean_dict.items())) postconf.set_many(postconf_dict) # Apply changes (special) @@ -258,7 +258,7 @@ def _action_set_keys(): with postconf.mutex.lock_all(): # systemctl reload postfix args = ['systemctl', 'reload', 'postfix'] - completed = subprocess.run(args, capture_output=True) + completed = subprocess.run(args, capture_output=True, check=False) if completed.returncode != 0: interproc.log_subprocess(completed) raise OSError('Could not reload postfix') diff --git a/plinth/modules/email_server/audit/home.py b/plinth/modules/email_server/audit/home.py index 2b5e24d41..3e7d54326 100644 --- a/plinth/modules/email_server/audit/home.py +++ b/plinth/modules/email_server/audit/home.py @@ -65,7 +65,7 @@ def action_mk(arg_type, user_info): args = ['sudo', '-n', '--user=#' + str(passwd.pw_uid)] args.extend(['/bin/sh', '-c', 'mkdir -p ~']) - completed = subprocess.run(args, capture_output=True) + completed = subprocess.run(args, capture_output=True, check=False) if completed.returncode != 0: interproc.log_subprocess(completed) raise OSError('Could not create home directory') diff --git a/plinth/modules/email_server/audit/spam.py b/plinth/modules/email_server/audit/spam.py index fb19f8dee..7809abd82 100644 --- a/plinth/modules/email_server/audit/spam.py +++ b/plinth/modules/email_server/audit/spam.py @@ -140,7 +140,7 @@ def _compile_sieve(): def _run_sievec(sieve_file): logger.info('Compiling sieve script %s', sieve_file) args = ['sievec', '--', sieve_file] - completed = subprocess.run(args, capture_output=True) + completed = subprocess.run(args, capture_output=True, check=False) if completed.returncode != 0: interproc.log_subprocess(completed) raise OSError('Sieve compilation failed: ' + sieve_file) diff --git a/plinth/modules/email_server/lock.py b/plinth/modules/email_server/lock.py index e3909039c..8619f1e6a 100644 --- a/plinth/modules/email_server/lock.py +++ b/plinth/modules/email_server/lock.py @@ -89,7 +89,7 @@ class Mutex: args.extend(['/bin/sh', '-c']) args.append('umask 177 && > ' + self.lock_path) - completed = subprocess.run(args, capture_output=True) + completed = subprocess.run(args, capture_output=True, check=False) if completed.returncode != 0: interproc.log_subprocess(completed) raise OSError('Could not create ' + self.lock_path) diff --git a/plinth/modules/email_server/views.py b/plinth/modules/email_server/views.py index 0feeacadf..66bb98b3d 100644 --- a/plinth/modules/email_server/views.py +++ b/plinth/modules/email_server/views.py @@ -121,6 +121,7 @@ class EmailServerView(TabMixin, AppView): return redirect(request.path) def _repair(self, module_name, action_name): + """Repair the configuration of the given audit module.""" module = getattr(audit, module_name) if not hasattr(module, 'repair_component'): return diff --git a/plinth/modules/help/tests/test_views.py b/plinth/modules/help/tests/test_views.py new file mode 100644 index 000000000..3ab4c53ab --- /dev/null +++ b/plinth/modules/help/tests/test_views.py @@ -0,0 +1,275 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Tests for help views. + +Design: - Make tests independent from URL policy by using Django names instead + of URLs to call the help module. For this, some additional fixture + work is needed: pytestmark and fixture_app_urls(). + +Pending: - status log + +""" + +import pathlib +import subprocess +from unittest.mock import patch + +import pytest +from django import urls +from django.conf import settings +from django.http import Http404 + +from plinth import module_loader +from plinth.modules.help import views + +# For all tests, use plinth.urls instead of urls configured for testing +pytestmark = pytest.mark.urls('plinth.urls') + + +def _is_page(response): + """Minimal check on help views.""" + return (response.status_code == 200 and 'title' in response.context_data + and response['content-type'] == 'text/html; charset=utf-8') + + +@pytest.fixture(autouse=True, scope='module') +def fixture_app_urls(): + """Make sure app's URLs are part of plinth.urls.""" + with patch('plinth.module_loader._modules_to_load', new=[]) as modules, \ + patch('plinth.urls.urlpatterns', new=[]): + modules.append('plinth.modules.help') + module_loader.include_urls() + yield + + +@pytest.mark.parametrize("view_name, view", ( + ('contribute', views.contribute), + ('feedback', views.feedback), + ('support', views.support), + ('index', views.index), +)) +def test_simple_help_pages(rf, view_name, view): + """Simple common test for certain help views.""" + response = view(rf.get(urls.reverse('help:' + view_name))) + assert _is_page(response) + + +def test_about(rf): + """Test some expected items in about view.""" + manual_url = urls.reverse('help:manual') + response = views.about(rf.get(manual_url)) + assert _is_page(response) + for item in ('version', 'new_version', 'os_release'): + assert item in response.context_data + + +# --------------------------------------------------------------------------- +# Tests for serving the offline user guide ( the "manual") +# +# The manual can be requested: +# - Either complete on a single page or page by page. +# - Specifying (or not) the language. +# - The complete manual can be requested in HTML or PDF formats. +# +# Expected Behaviour Rules: +# - If the page isn't specified, the help module returns the full manual in +# one single page. +# - The help module tries first to return the page in the specified +# language. If not found (either that page doesn't exist or the language +# wasn't secified) it falls back to its twin in the fallback language. If +# it is neither available, it shows a proper error message. +# +# Design Decisions: +# - The PDF manual has a separate function to serve it. +# - The 'Manual' page doesn't exist as such. However there are files named +# 'Manual' containing the complete full manual in one single page. +# - In order to avoid loops, the fallback language is intercepted and +# treated specifically. +# - Problem: Requesting a missing page in a language that happens to be +# the fallback one, missing it would cause the help module to +# redirect to the same page, closing thereby a neverending loop. +# The web served would probably break that loop, but it would +# cause confusion to the user. +# - CI environments don't setup FreedomBox completely. A regular setup run is +# impractically slow (10-15 mins), if even posible. Compiling and deploying +# the manual is just 3 extra lines in .gitlab-ci.yml file: +# - make -C doc +# - mkdir -p /usr/share/freedombox/manual +# - cp -r doc/manual /usr/share/freedombox/manual +# But again, this causes the 4 minutes of test preparation to bump to 6. +# It's not worth for just testing the offline manual, so the tests guess if +# they are running in a restricted environment and skip. + +canary = pathlib.Path('doc/manual/en/Coturn.part.html') +TRANSLATIONS = ('es', ) +MANUAL_PAGES = ('Apache_userdir', 'APU', 'Backups', 'BananaPro', 'BeagleBone', + 'bepasty', 'Bind', 'Calibre', 'Cockpit', 'Configure', + 'Contribute', 'Coturn', 'Cubieboard2', 'Cubietruck', + 'DateTime', 'Debian', 'Deluge', 'Developer', 'Diagnostics', + 'Download', 'DynamicDNS', 'ejabberd', 'Firewall', + 'freedombox-manual', 'GettingHelp', 'GitWeb', 'Hardware', + 'I2P', 'Ikiwiki', 'Infinoted', 'Introduction', 'JSXC', + 'LetsEncrypt', 'Maker', 'MatrixSynapse', 'MediaWiki', + 'Minetest', 'MiniDLNA', 'MLDonkey', 'Monkeysphere', 'Mumble', + 'NameServices', 'Networks', 'OpenVPN', 'OrangePiZero', + 'PageKite', 'pcDuino3', 'Performance', 'PineA64+', + 'PioneerEdition', 'Plinth', 'Power', 'Privoxy', 'Quassel', + 'QuickStart', 'Radicale', 'RaspberryPi2', 'RaspberryPi3B+', + 'RaspberryPi3B', 'RaspberryPi4B', 'ReleaseNotes', 'Rock64', + 'RockPro64', 'Roundcube', 'Samba', 'Searx', 'SecureShell', + 'Security', 'ServiceDiscovery', 'Shadowsocks', 'Sharing', + 'Snapshots', 'Storage', 'Syncthing', 'TinyTinyRSS', 'Tor', + 'Transmission', 'Upgrades', 'USBWiFi', 'Users', 'VirtualBox', + 'WireGuard') +_restricted_reason = ('Needs installed manual. ' + 'CI speed-optimized workspace does not provide it.') +not_restricted_environment = pytest.mark.skipif(not canary.exists(), + reason=_restricted_reason) + + +@pytest.mark.parametrize('lang', (None, '-')) +def test_full_default_manual(rf, lang): + """Test request for the full default manual. + + Expected: Redirect to the full manual in the fallback language. + + """ + manual_url = urls.reverse('help:manual') + response = views.manual(rf.get(manual_url), lang=lang) + assert response.status_code == 302 + assert response.url == '/help/manual/en/' + + # With a language cookie set + request = rf.get(manual_url) + request.COOKIES[settings.LANGUAGE_COOKIE_NAME] = TRANSLATIONS[0] + response = views.manual(request, lang=lang) + assert response.status_code == 302 + assert response.url == f'/help/manual/{TRANSLATIONS[0]}/' + + +@pytest.mark.parametrize('lang', (None, '-')) +def test_default_manual_by_pages(rf, lang): + """Test page-specific requests for the (default) manual. + + Expected: Redirect to their respective twins in the fallback language. + Pending.: Redirect pages with plus-sign '+' in their name. + + """ + manual_url = urls.reverse('help:manual') + for page in MANUAL_PAGES: + if '+' in page or 'Manual' in page: # Pine64+ & RaspberryPi3B+ + continue + + response = views.manual(rf.get(manual_url), lang=lang, page=page) + assert response.status_code == 302 + assert response.url == '/help/manual/en/' + page + + # With a language cookie set + request = rf.get(manual_url) + request.COOKIES[settings.LANGUAGE_COOKIE_NAME] = TRANSLATIONS[0] + response = views.manual(request, lang=lang, page=page) + assert response.status_code == 302 + assert response.url == f'/help/manual/{TRANSLATIONS[0]}/{page}' + + +@not_restricted_environment +def test_specific_full_manual_translation(rf): + """Test request for specific translated manuals. + + Expected: All return a page. + + """ + manual_url = urls.reverse('help:manual') + for lang in ('es', 'en'): + response = views.manual(rf.get(manual_url), lang=lang) + assert _is_page(response) + + +@not_restricted_environment +def test_specific_manual_translation_by_pages(rf): + """Test that translated-page-specific requests. + + Expected: All known page names return pages. + + """ + manual_url = urls.reverse('help:manual') + for lang in ('es', 'en'): + for page in MANUAL_PAGES: + response = views.manual(rf.get(manual_url), page=page, lang=lang) + assert _is_page(response) + + +@not_restricted_environment +def test_full_manual_requested_by_page_name(rf): + """Test requests for 'Manual'. + + Note: 'Manual' is a file, not a manual page. + Expected: Return a proper not found message (HTTP 404) + Currently: Non fallback languages return a page. + This is wrong, but doesn't cause any harm. + + """ + manual_url = urls.reverse('help:manual') + page = 'Manual' + + for lang in TRANSLATIONS: + response = views.manual(rf.get(manual_url), page=page, lang=lang) + assert _is_page(response) + + with pytest.raises(Http404): + views.manual(rf.get(manual_url), page=page, lang='en') + + +def test_missing_page(rf): + """Test requests for missing pages. + + Expected: + - Unspecified language: Fall back to its fallback twin. + - Translated languages: Fall back to its fallback twin. + - Fallback language...: Return a proper not found message (HTTP 404) + - Unknown languages...: Fall back to its fallback twin. + + """ + manual_url = urls.reverse('help:manual') + page = 'unknown' + for lang in TRANSLATIONS + ('unknown', None): + response = views.manual(rf.get(manual_url), page=page, lang=lang) + assert response.status_code == 302 + assert response.url == '/help/manual/en/unknown' + + with pytest.raises(Http404): + views.manual(rf.get(manual_url), page=page, lang='en') + + +@not_restricted_environment +def test_download_full_manual_file(rf, tmp_path): + """Test download of manual. + + Design: - Downloads the default manual, a translated one and the + fallback translation. None should fail. Then compares + them. + - Call diff command for fast comparision. Comparing the + over 10MB bytestrings in python is insanely slow. + + """ + + def _diff(file_name_a, file_name_b, same): + file_a = tmp_path / file_name_a + file_b = tmp_path / file_name_b + process = subprocess.run( + ['diff', '-q', str(file_a), str(file_b)], check=False) + assert bool(process.returncode) != same + + url = urls.reverse('help:manual') + manuals = { + 'unspecified': rf.get(url), + 'translated': rf.get(url, HTTP_ACCEPT_LANGUAGE='es'), + 'fallback': rf.get(url, HTTP_ACCEPT_LANGUAGE='en') + } + for name, request in manuals.items(): + response = views.download_manual(request) + assert response.status_code == 200 + file = tmp_path / (name + '.pdf') + file.write_bytes(response.content) + + _diff('fallback.pdf', 'unspecified.pdf', same=True) + _diff('fallback.pdf', 'translated.pdf', same=False) diff --git a/plinth/modules/matrixsynapse/data/lib/systemd/system/matrix-synapse.service.d/freedombox.conf b/plinth/modules/matrixsynapse/data/usr/lib/systemd/system/matrix-synapse.service.d/freedombox.conf similarity index 100% rename from plinth/modules/matrixsynapse/data/lib/systemd/system/matrix-synapse.service.d/freedombox.conf rename to plinth/modules/matrixsynapse/data/usr/lib/systemd/system/matrix-synapse.service.d/freedombox.conf diff --git a/plinth/modules/mldonkey/data/lib/systemd/system/mldonkey-server.service.d/freedombox.conf b/plinth/modules/mldonkey/data/usr/lib/systemd/system/mldonkey-server.service.d/freedombox.conf similarity index 100% rename from plinth/modules/mldonkey/data/lib/systemd/system/mldonkey-server.service.d/freedombox.conf rename to plinth/modules/mldonkey/data/usr/lib/systemd/system/mldonkey-server.service.d/freedombox.conf diff --git a/plinth/modules/mldonkey/tests/test_functional.py b/plinth/modules/mldonkey/tests/test_functional.py index c6fe54db8..1a439a37d 100644 --- a/plinth/modules/mldonkey/tests/test_functional.py +++ b/plinth/modules/mldonkey/tests/test_functional.py @@ -6,7 +6,7 @@ Functional, browser based tests for mldonkey app. import pytest from plinth.tests import functional -pytestmark = [pytest.mark.apps, pytest.mark.mldonkey] +pytestmark = [pytest.mark.apps, pytest.mark.mldonkey, pytest.mark.sso] @pytest.fixture(scope='module', autouse=True) diff --git a/plinth/modules/openvpn/tests/openvpn.feature b/plinth/modules/openvpn/tests/openvpn.feature deleted file mode 100644 index 931c4ddf2..000000000 --- a/plinth/modules/openvpn/tests/openvpn.feature +++ /dev/null @@ -1,43 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @openvpn -Feature: OpenVPN - Virtual Private Network - Setup and configure OpenVPN - -Background: - Given I'm a logged in user - Given the openvpn application is installed - -Scenario: Enable openvpn application - Given the openvpn application is disabled - When I enable the openvpn application - Then the openvpn service should be running - -Scenario: Download openvpn profile - Given the openvpn application is enabled - Then the openvpn profile should be downloadable - -Scenario: User of 'vpn' group - Given the openvpn application is enabled - And the user vpnuser in group vpn exists - When I'm logged in as the user vpnuser - Then the openvpn profile should be downloadable - -Scenario: User not of 'vpn' group - Given the openvpn application is enabled - And the user nonvpnuser exists - When I'm logged in as the user nonvpnuser - Then openvpn app should not be visible on the front page - -@backups -Scenario: Backup and restore openvpn - Given the openvpn application is enabled - And I download openvpn profile - When I create a backup of the openvpn app data with name test_openvpn - And I restore the openvpn app data backup with name test_openvpn - Then the openvpn profile downloaded should be same as before - -Scenario: Disable openvpn application - Given the openvpn application is enabled - When I disable the openvpn application - Then the openvpn service should not be running diff --git a/plinth/modules/openvpn/tests/test_functional.py b/plinth/modules/openvpn/tests/test_functional.py index 98f506e39..10d13ffdb 100644 --- a/plinth/modules/openvpn/tests/test_functional.py +++ b/plinth/modules/openvpn/tests/test_functional.py @@ -3,35 +3,76 @@ Functional, browser based tests for openvpn app. """ -from pytest_bdd import given, scenarios, then - +import pytest from plinth.tests import functional -scenarios('openvpn.feature') +pytestmark = [pytest.mark.apps, pytest.mark.openvpn] base_url = functional.config['DEFAULT']['URL'] shortcut_href = '?selected=shortcut-openvpn' -@given('I download openvpn profile', target_fixture='openvpn_profile') -def openvpn_download_profile(session_browser): - return _download_profile(session_browser) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'openvpn') + yield + functional.app_disable(session_browser, 'openvpn') -@then('the openvpn profile should be downloadable') -def openvpn_profile_downloadable(session_browser): +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'openvpn') + + functional.app_enable(session_browser, 'openvpn') + assert functional.service_is_running(session_browser, 'openvpn') + + functional.app_disable(session_browser, 'openvpn') + assert functional.service_is_not_running(session_browser, 'openvpn') + + +def test_download_profile(session_browser): + """Test that OpenVPN profile is downloadable.""" + functional.app_enable(session_browser, 'openvpn') _download_profile(session_browser) -@then('openvpn app should not be visible on the front page') -def openvpn_app_not_on_front_page(session_browser): +def test_user_group(session_browser): + """Test that only users in vpn group have access.""" + functional.app_enable(session_browser, 'openvpn') + if not functional.user_exists(session_browser, 'vpnuser'): + functional.create_user(session_browser, 'vpnuser', groups=['vpn']) + if not functional.user_exists(session_browser, 'nonvpnuser'): + functional.create_user(session_browser, 'nonvpnuser', groups=[]) + + functional.login_with_account(session_browser, base_url, 'vpnuser') + _download_profile(session_browser) + + functional.login_with_account(session_browser, base_url, 'nonvpnuser') + _not_on_front_page(session_browser) + + functional.login(session_browser) + + +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, 'openvpn') + profile = _download_profile(session_browser) + functional.backup_create(session_browser, 'openvpn', 'test_openvpn') + + functional.backup_restore(session_browser, 'openvpn', 'test_openvpn') + _profile_download_compare(session_browser, profile) + + +def _not_on_front_page(session_browser): session_browser.visit(base_url) links = session_browser.links.find_by_href(shortcut_href) assert len(links) == 0 -@then('the openvpn profile downloaded should be same as before') -def openvpn_profile_download_compare(session_browser, openvpn_profile): +def _profile_download_compare(session_browser, openvpn_profile): new_profile = _download_profile(session_browser) assert openvpn_profile == new_profile diff --git a/plinth/modules/pagekite/tests/pagekite.feature b/plinth/modules/pagekite/tests/pagekite.feature deleted file mode 100644 index 8e4848725..000000000 --- a/plinth/modules/pagekite/tests/pagekite.feature +++ /dev/null @@ -1,44 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -# TODO Scenario: Enable standard services -# TODO Scenario: Disable standard services -# TODO Scenario: Add custom service -# TODO Scenario: Delete custom service - -@apps @pagekite -Feature: Pagekite Public Visibility - Configure Pagekite public visitbility server. - -Background: - Given I'm a logged in user - Given the pagekite application is installed - -Scenario: Enable pagekite application - Given the pagekite application is disabled - When I enable the pagekite application - Then the pagekite service should be running - -Scenario: Configure pagekite application - Given the pagekite application is enabled - When I configure pagekite with host pagekite.example.com, port 8080, kite name mykite.example.com and kite secret mysecret - Then pagekite should be configured with host pagekite.example.com, port 8080, kite name mykite.example.com and kite secret mysecret - -Scenario: Capitalized kite name - Given the pagekite application is enabled - When I configure pagekite with host pagekite.example.com, port 8080, kite name Mykite.example.com and kite secret mysecret - Then pagekite should be configured with host pagekite.example.com, port 8080, kite name mykite.example.com and kite secret mysecret - -@backups -Scenario: Backup and restore pagekite - Given the pagekite application is enabled - When I configure pagekite with host beforebackup.example.com, port 8081, kite name beforebackup.example.com and kite secret beforebackupsecret - And I create a backup of the pagekite app data with name test_pagekite - And I configure pagekite with host afterbackup.example.com, port 8082, kite name afterbackup.example.com and kite secret afterbackupsecret - And I restore the pagekite app data backup with name test_pagekite - Then the pagekite service should be running - And pagekite should be configured with host beforebackup.example.com, port 8081, kite name beforebackup.example.com and kite secret beforebackupsecret - -Scenario: Disable pagekite application - Given the pagekite application is enabled - When I disable the pagekite application - Then the pagekite service should not be running diff --git a/plinth/modules/pagekite/tests/test_functional.py b/plinth/modules/pagekite/tests/test_functional.py index d18168619..64fd8cf92 100644 --- a/plinth/modules/pagekite/tests/test_functional.py +++ b/plinth/modules/pagekite/tests/test_functional.py @@ -3,28 +3,67 @@ Functional, browser based tests for pagekite app. """ -from pytest_bdd import parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('pagekite.feature') +pytestmark = [pytest.mark.system, pytest.mark.pagekite] + +# TODO Scenario: Enable standard services +# TODO Scenario: Disable standard services +# TODO Scenario: Add custom service +# TODO Scenario: Delete custom service -@when( - parsers.parse('I configure pagekite with host {host:S}, port {port:d}, ' - 'kite name {kite_name:S} and kite secret {kite_secret:w}')) -def pagekite_configure(session_browser, host, port, kite_name, kite_secret): - _configure(session_browser, host, port, kite_name, kite_secret) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'pagekite') + yield + functional.app_disable(session_browser, 'pagekite') -@then( - parsers.parse( - 'pagekite should be configured with host {host:S}, port {port:d}, ' - 'kite name {kite_name:S} and kite secret {kite_secret:w}')) -def pagekite_assert_configured(session_browser, host, port, kite_name, - kite_secret): - assert (host, port, kite_name, - kite_secret) == _get_configuration(session_browser) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'pagekite') + + functional.app_enable(session_browser, 'pagekite') + assert functional.service_is_running(session_browser, 'pagekite') + + functional.app_disable(session_browser, 'pagekite') + assert functional.service_is_not_running(session_browser, 'pagekite') + + +def test_configure(session_browser): + """Test pagekite configuration.""" + functional.app_enable(session_browser, 'pagekite') + _configure(session_browser, 'pagekite.example.com', 8080, + 'mykite.example.com', 'mysecret') + assert ('pagekite.example.com', 8080, 'mykite.example.com', + 'mysecret') == _get_configuration(session_browser) + + # Capitalized kite name should become lower case. + _configure(session_browser, 'pagekite.example.com', 8080, + 'Mykite.example.com', 'mysecret') + assert ('pagekite.example.com', 8080, 'mykite.example.com', + 'mysecret') == _get_configuration(session_browser) + + +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + functional.app_enable(session_browser, 'pagekite') + _configure(session_browser, 'beforebackup.example.com', 8081, + 'beforebackup.example.com', 'beforebackupsecret') + functional.backup_create(session_browser, 'pagekite', 'test_pagekite') + + _configure(session_browser, 'afterbackup.example.com', 8082, + 'afterbackup.example.com', 'afterbackupsecret') + functional.backup_restore(session_browser, 'pagekite', 'test_pagekite') + + assert functional.service_is_running(session_browser, 'pagekite') + assert ('beforebackup.example.com', 8081, 'beforebackup.example.com', + 'beforebackupsecret') == _get_configuration(session_browser) def _configure(browser, host, port, kite_name, kite_secret): diff --git a/plinth/modules/performance/manifest.py b/plinth/modules/performance/manifest.py index f40a63813..23eb84f8e 100644 --- a/plinth/modules/performance/manifest.py +++ b/plinth/modules/performance/manifest.py @@ -3,36 +3,12 @@ FreedomBox app for System Monitoring (cockpit-pcp) in ‘System’. """ -import subprocess -from functools import lru_cache - -from django.utils.functional import lazy from django.utils.translation import gettext_lazy as _ -from plinth.utils import Version - - -@lru_cache() -def _get_url(): - """Return the web client URL based on Cockpit version.""" - process = subprocess.run( - ['dpkg-query', '--showformat=${Version}', '--show', 'cockpit'], - stdout=subprocess.PIPE) - cockpit_version = process.stdout.decode() - if Version(cockpit_version) >= Version('235'): - url = '/_cockpit/metrics' - else: - url = '/_cockpit/system/graphs' - - return url - - -get_url = lazy(_get_url, str) - clients = [{ 'name': _('Cockpit'), 'platforms': [{ 'type': 'web', - 'url': get_url() + 'url': '/_cockpit/metrics' }] }] diff --git a/plinth/modules/privoxy/tests/privoxy.feature b/plinth/modules/privoxy/tests/privoxy.feature deleted file mode 100644 index ff397339d..000000000 --- a/plinth/modules/privoxy/tests/privoxy.feature +++ /dev/null @@ -1,26 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @privoxy -Feature: Privoxy Web Proxy - Proxy web connections for enhanced privacy. - -Background: - Given I'm a logged in user - Given the privoxy application is installed - -Scenario: Enable privoxy application - Given the privoxy application is disabled - When I enable the privoxy application - Then the privoxy service should be running - -@backups -Scenario: Backup and restore privoxy - Given the privoxy application is enabled - When I create a backup of the privoxy app data with name test_privoxy - And I restore the privoxy app data backup with name test_privoxy - Then the privoxy service should be running - -Scenario: Disable privoxy application - Given the privoxy application is enabled - When I disable the privoxy application - Then the privoxy service should not be running diff --git a/plinth/modules/privoxy/tests/test_functional.py b/plinth/modules/privoxy/tests/test_functional.py index 10638de5d..74a028d89 100644 --- a/plinth/modules/privoxy/tests/test_functional.py +++ b/plinth/modules/privoxy/tests/test_functional.py @@ -3,6 +3,36 @@ Functional, browser based tests for privoxy app. """ -from pytest_bdd import scenarios +import pytest +from plinth.tests import functional -scenarios('privoxy.feature') +pytestmark = [pytest.mark.apps, pytest.mark.privoxy] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'privoxy') + yield + functional.app_disable(session_browser, 'privoxy') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'privoxy') + + functional.app_enable(session_browser, 'privoxy') + assert functional.service_is_running(session_browser, 'privoxy') + + functional.app_disable(session_browser, 'privoxy') + assert functional.service_is_not_running(session_browser, 'privoxy') + + +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore.""" + functional.app_enable(session_browser, 'privoxy') + functional.backup_create(session_browser, 'privoxy', 'test_privoxy') + functional.backup_restore(session_browser, 'privoxy', 'test_privoxy') + assert functional.service_is_running(session_browser, 'privoxy') diff --git a/plinth/modules/quassel/data/lib/systemd/system/quasselcore.service.d/freedombox.conf b/plinth/modules/quassel/data/usr/lib/systemd/system/quasselcore.service.d/freedombox.conf similarity index 100% rename from plinth/modules/quassel/data/lib/systemd/system/quasselcore.service.d/freedombox.conf rename to plinth/modules/quassel/data/usr/lib/systemd/system/quasselcore.service.d/freedombox.conf diff --git a/plinth/modules/quassel/tests/quassel.feature b/plinth/modules/quassel/tests/quassel.feature deleted file mode 100644 index 2012ed0cc..000000000 --- a/plinth/modules/quassel/tests/quassel.feature +++ /dev/null @@ -1,27 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @quassel -Feature: Quassel IRC Client - Run Quassel core. - -Background: - Given I'm a logged in user - Given the quassel application is installed - -Scenario: Enable quassel application - Given the quassel application is disabled - When I enable the quassel application - Then the quassel service should be running - -# TODO: Improve this to actually check that data configured servers is restored. -@backups -Scenario: Backup and restore quassel - Given the quassel application is enabled - When I create a backup of the quassel app data with name test_quassel - And I restore the quassel app data backup with name test_quassel - Then the quassel service should be running - -Scenario: Disable quassel application - Given the quassel application is enabled - When I disable the quassel application - Then the quassel service should not be running diff --git a/plinth/modules/quassel/tests/test_functional.py b/plinth/modules/quassel/tests/test_functional.py index a9ddd2f57..e24faa699 100644 --- a/plinth/modules/quassel/tests/test_functional.py +++ b/plinth/modules/quassel/tests/test_functional.py @@ -3,6 +3,38 @@ Functional, browser based tests for quassel app. """ -from pytest_bdd import scenarios +import pytest +from plinth.tests import functional -scenarios('quassel.feature') +pytestmark = [pytest.mark.apps, pytest.mark.quassel] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'quassel') + yield + functional.app_disable(session_browser, 'quassel') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'quassel') + + functional.app_enable(session_browser, 'quassel') + assert functional.service_is_running(session_browser, 'quassel') + + functional.app_disable(session_browser, 'quassel') + assert functional.service_is_not_running(session_browser, 'quassel') + + +# TODO: Improve this to actually check that data configured servers is +# restored. +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, 'quassel') + functional.backup_create(session_browser, 'quassel', 'test_quassel') + functional.backup_restore(session_browser, 'quassel', 'test_quassel') + assert functional.service_is_running(session_browser, 'quassel') diff --git a/plinth/modules/radicale/tests/radicale.feature b/plinth/modules/radicale/tests/radicale.feature deleted file mode 100644 index 431e00cbb..000000000 --- a/plinth/modules/radicale/tests/radicale.feature +++ /dev/null @@ -1,54 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @radicale -Feature: Radicale Calendar and Addressbook - Configure CalDAV/CardDAV server. - -Background: - Given I'm a logged in user - Given the radicale application is installed - -Scenario: Enable radicale application - Given the radicale application is disabled - When I enable the radicale application - Then the radicale service should be running - And the calendar should be available - And the addressbook should be available - -Scenario: Owner-only access rights - Given the radicale application is enabled - And the access rights are set to "any user can view, but only the owner can make changes" - When I change the access rights to "only the owner can view or make changes" - Then the radicale service should be running - And the access rights should be "only the owner can view or make changes" - -Scenario: Owner-write access rights - Given the radicale application is enabled - And the access rights are set to "only the owner can view or make changes" - When I change the access rights to "any user can view, but only the owner can make changes" - Then the radicale service should be running - And the access rights should be "any user can view, but only the owner can make changes" - -Scenario: Authenticated access rights - Given the radicale application is enabled - And the access rights are set to "only the owner can view or make changes" - When I change the access rights to "any user can view or make changes" - Then the radicale service should be running - And the access rights should be "any user can view or make changes" - -@backups -Scenario: Backup and restore radicale - Given the radicale application is enabled - And the access rights are set to "only the owner can view or make changes" - When I create a backup of the radicale app data with name test_radicale - And I change the access rights to "any user can view, but only the owner can make changes" - And I restore the radicale app data backup with name test_radicale - Then the radicale service should be running - And the access rights should be "only the owner can view or make changes" - -Scenario: Disable radicale application - Given the radicale application is enabled - When I disable the radicale application - Then the radicale service should not be running - And the calendar should not be available - And the addressbook should not be available diff --git a/plinth/modules/radicale/tests/test_functional.py b/plinth/modules/radicale/tests/test_functional.py index 7b3a29463..ae9a46c68 100644 --- a/plinth/modules/radicale/tests/test_functional.py +++ b/plinth/modules/radicale/tests/test_functional.py @@ -5,83 +5,73 @@ Functional, browser based tests for radicale app. import logging +import pytest import requests -from pytest_bdd import given, scenarios, then, when from plinth.tests import functional logger = logging.getLogger(__name__) -scenarios('radicale.feature') + +pytestmark = [pytest.mark.apps, pytest.mark.radicale] -@given('the access rights are set to "only the owner can view or make changes"' - ) -def radicale_given_owner_only(session_browser): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'radicale') + yield + functional.app_disable(session_browser, 'radicale') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'radicale') + + functional.app_enable(session_browser, 'radicale') + assert functional.service_is_running(session_browser, 'radicale') + assert _calendar_is_available(session_browser) + assert _addressbook_is_available(session_browser) + + functional.app_disable(session_browser, 'radicale') + assert functional.service_is_not_running(session_browser, 'radicale') + assert not _calendar_is_available(session_browser) + assert not _addressbook_is_available(session_browser) + + +def test_access_rights(session_browser): + """Test setting the access rights.""" + functional.app_enable(session_browser, 'radicale') _set_access_rights(session_browser, 'owner_only') - -@given('the access rights are set to "any user can view, but only the ' - 'owner can make changes"') -def radicale_given_owner_write(session_browser): + # Owner-write access rights _set_access_rights(session_browser, 'owner_write') + assert functional.service_is_running(session_browser, 'radicale') + assert _get_access_rights(session_browser) == 'owner_write' - -@given('the access rights are set to "any user can view or make changes"') -def radicale_given_authenticated(session_browser): + # Authenticated access rights _set_access_rights(session_browser, 'authenticated') + assert functional.service_is_running(session_browser, 'radicale') + assert _get_access_rights(session_browser) == 'authenticated' - -@when('I change the access rights to "only the owner can view or make changes"' - ) -def radicale_set_owner_only(session_browser): + # Owner-only access rights _set_access_rights(session_browser, 'owner_only') - - -@when('I change the access rights to "any user can view, but only the ' - 'owner can make changes"') -def radicale_set_owner_write(session_browser): - _set_access_rights(session_browser, 'owner_write') - - -@when('I change the access rights to "any user can view or make changes"') -def radicale_set_authenticated(session_browser): - _set_access_rights(session_browser, 'authenticated') - - -@then('the access rights should be "only the owner can view or make changes"') -def radicale_check_owner_only(session_browser): + assert functional.service_is_running(session_browser, 'radicale') assert _get_access_rights(session_browser) == 'owner_only' -@then('the access rights should be "any user can view, but only the ' - 'owner can make changes"') -def radicale_check_owner_write(session_browser): - assert _get_access_rights(session_browser) == 'owner_write' +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + functional.app_enable(session_browser, 'radicale') + _set_access_rights(session_browser, 'owner_only') + functional.backup_create(session_browser, 'radicale', 'test_radicale') + _set_access_rights(session_browser, 'owner_write') + functional.backup_restore(session_browser, 'radicale', 'test_radicale') -@then('the access rights should be "any user can view or make changes"') -def radicale_check_authenticated(session_browser): - assert _get_access_rights(session_browser) == 'authenticated' - - -@then('the calendar should be available') -def assert_calendar_is_available(session_browser): - assert _calendar_is_available(session_browser) - - -@then('the calendar should not be available') -def assert_calendar_is_not_available(session_browser): - assert not _calendar_is_available(session_browser) - - -@then('the addressbook should be available') -def assert_addressbook_is_available(session_browser): - assert _addressbook_is_available(session_browser) - - -@then('the addressbook should not be available') -def assert_addressbook_is_not_available(session_browser): - assert not _addressbook_is_available(session_browser) + assert functional.service_is_running(session_browser, 'radicale') + assert _get_access_rights(session_browser) == 'owner_only' def _get_access_rights(browser): diff --git a/plinth/modules/roundcube/tests/roundcube.feature b/plinth/modules/roundcube/tests/roundcube.feature deleted file mode 100644 index 0baa92055..000000000 --- a/plinth/modules/roundcube/tests/roundcube.feature +++ /dev/null @@ -1,26 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @roundcube -Feature: Roundcube Email Client - Run webmail client. - -Background: - Given I'm a logged in user - Given the roundcube application is installed - -Scenario: Enable roundcube application - Given the roundcube application is disabled - When I enable the roundcube application - Then the roundcube site should be available - -@backups -Scenario: Backup and restore roundcube - Given the roundcube application is enabled - When I create a backup of the roundcube app data with name test_roundcube - And I restore the roundcube app data backup with name test_roundcube - Then the roundcube site should be available - -Scenario: Disable roundcube application - Given the roundcube application is enabled - When I disable the roundcube application - Then the roundcube site should not be available diff --git a/plinth/modules/roundcube/tests/test_functional.py b/plinth/modules/roundcube/tests/test_functional.py index 0aaee4b5e..e88220190 100644 --- a/plinth/modules/roundcube/tests/test_functional.py +++ b/plinth/modules/roundcube/tests/test_functional.py @@ -3,6 +3,36 @@ Functional, browser based tests for roundcube app. """ -from pytest_bdd import scenarios +import pytest +from plinth.tests import functional -scenarios('roundcube.feature') +pytestmark = [pytest.mark.apps, pytest.mark.roundcube] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'roundcube') + yield + functional.app_disable(session_browser, 'roundcube') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'roundcube') + + functional.app_enable(session_browser, 'roundcube') + assert functional.is_available(session_browser, 'roundcube') + + functional.app_disable(session_browser, 'roundcube') + assert not functional.is_available(session_browser, 'roundcube') + + +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore.""" + functional.app_enable(session_browser, 'roundcube') + functional.backup_create(session_browser, 'roundcube', 'test_roundcube') + functional.backup_restore(session_browser, 'roundcube', 'test_roundcube') + assert functional.is_available(session_browser, 'roundcube') diff --git a/plinth/modules/searx/tests/searx.feature b/plinth/modules/searx/tests/searx.feature deleted file mode 100644 index 83f0b07b7..000000000 --- a/plinth/modules/searx/tests/searx.feature +++ /dev/null @@ -1,50 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @searx @sso -Feature: Searx Web Search - Run Searx metasearch engine. - -Background: - Given I'm a logged in user - Given the searx application is installed - -Scenario: Enable searx application - Given the searx application is disabled - When I enable the searx application - Then the searx site should be available - And the search form should be visible - -@backups -Scenario: Backup and restore searx - Given the searx application is enabled - When I create a backup of the searx app data with name test_searx - And I restore the searx app data backup with name test_searx - Then the searx site should be available - -Scenario: Enable public access - Given the searx application is enabled - When I enable public access in searx - And I log out - Then searx app should be visible on the front page - And the searx site should be available - -Scenario: Disable public access - Given the searx application is enabled - When I disable public access in searx - And I log out - Then searx app should not be visible on the front page - And the searx site should not be available - -Scenario: Preserve public access setting - Given the searx application is enabled - And public access is enabled in searx - When I disable the searx application - And I enable the searx application - And I log out - Then searx app should be visible on the front page - And the searx site should be available - -Scenario: Disable searx application - Given the searx application is enabled - When I disable the searx application - Then the searx site should not be available diff --git a/plinth/modules/searx/tests/test_functional.py b/plinth/modules/searx/tests/test_functional.py index 747067bb1..74f952c91 100644 --- a/plinth/modules/searx/tests/test_functional.py +++ b/plinth/modules/searx/tests/test_functional.py @@ -3,32 +3,75 @@ Functional, browser based tests for searx app. """ -from pytest_bdd import given, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('searx.feature') +pytestmark = [pytest.mark.apps, pytest.mark.searx, pytest.mark.sso] -@given('public access is enabled in searx') -def searx_public_access_enabled(session_browser): - _enable_public_access(session_browser) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'searx') + yield + functional.login(session_browser) + functional.app_disable(session_browser, 'searx') -@when('I enable public access in searx') -def searx_enable_public_access(session_browser): - _enable_public_access(session_browser) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'searx') - -@when('I disable public access in searx') -def searx_disable_public_access(session_browser): - _disable_public_access(session_browser) - - -@then('the search form should be visible') -def is_searx_search_form_visible(session_browser): + functional.app_enable(session_browser, 'searx') + assert functional.is_available(session_browser, 'searx') _is_search_form_visible(session_browser) + functional.app_disable(session_browser, 'searx') + assert not functional.is_available(session_browser, 'searx') + + +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore.""" + functional.app_enable(session_browser, 'searx') + functional.backup_create(session_browser, 'searx', 'test_searx') + functional.backup_restore(session_browser, 'searx', 'test_searx') + assert functional.is_available(session_browser, 'searx') + + +def test_public_access(session_browser): + """Test enabling public access.""" + functional.app_enable(session_browser, 'searx') + + # Enable public access + _enable_public_access(session_browser) + functional.logout(session_browser) + assert functional.is_visible_on_front_page(session_browser, 'searx') + assert functional.is_available(session_browser, 'searx') + + # Disable public access + functional.login(session_browser) + _disable_public_access(session_browser) + functional.logout(session_browser) + assert not functional.is_visible_on_front_page(session_browser, 'searx') + assert not functional.is_available(session_browser, 'searx') + + +def test_preserve_public_access_setting(session_browser): + """Test that public access setting is preserved when disabling and + re-enabling the app.""" + functional.login(session_browser) + functional.app_enable(session_browser, 'searx') + _enable_public_access(session_browser) + + functional.app_disable(session_browser, 'searx') + functional.app_enable(session_browser, 'searx') + functional.logout(session_browser) + + assert functional.is_visible_on_front_page(session_browser, 'searx') + assert functional.is_available(session_browser, 'searx') + def _enable_public_access(browser): """Enable Public Access in SearX""" diff --git a/plinth/modules/security/tests/security.feature b/plinth/modules/security/tests/security.feature deleted file mode 100644 index d9dba5b9a..000000000 --- a/plinth/modules/security/tests/security.feature +++ /dev/null @@ -1,25 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@security @essential @system -Feature: Security - Configure security options. - -Background: - Given I'm a logged in user - -Scenario: Disable restricted console logins - Given restricted console logins are enabled - When I disable restricted console logins - Then restricted console logins should be disabled - -Scenario: Backup and restore security - When I enable restricted console logins - And I create a backup of the security app data with name test_security - And I disable restricted console logins - And I restore the security app data backup with name test_security - Then restricted console logins should be enabled - -Scenario: Enable restricted console logins - Given restricted console logins are disabled - When I enable restricted console logins - Then restricted console logins should be enabled diff --git a/plinth/modules/security/tests/test_functional.py b/plinth/modules/security/tests/test_functional.py index c0266b111..80b2e8f66 100644 --- a/plinth/modules/security/tests/test_functional.py +++ b/plinth/modules/security/tests/test_functional.py @@ -3,29 +3,37 @@ Functional, browser based tests for security app. """ -from pytest_bdd import given, parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('security.feature') +pytestmark = [pytest.mark.system, pytest.mark.essential, pytest.mark.security] -@given(parsers.parse('restricted console logins are {enabled}')) -def security_given_enable_restricted_logins(session_browser, enabled): - should_enable = (enabled == 'enabled') - _enable_restricted_logins(session_browser, should_enable) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login.""" + functional.login(session_browser) -@when(parsers.parse('I {enable} restricted console logins')) -def security_enable_restricted_logins(session_browser, enable): - should_enable = (enable == 'enable') - _enable_restricted_logins(session_browser, should_enable) +def test_restricted_console_logins(session_browser): + """Test enabling and disabling restricted console logins.""" + _enable_restricted_logins(session_browser, False) + assert not _get_restricted_logins(session_browser) + + _enable_restricted_logins(session_browser, True) + assert _get_restricted_logins(session_browser) -@then(parsers.parse('restricted console logins should be {enabled}')) -def security_assert_restricted_logins(session_browser, enabled): - enabled = (enabled == 'enabled') - assert _get_restricted_logins(session_browser) == enabled +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + _enable_restricted_logins(session_browser, True) + functional.backup_create(session_browser, 'security', 'test_security') + + _enable_restricted_logins(session_browser, False) + functional.backup_restore(session_browser, 'security', 'test_security') + + assert _get_restricted_logins(session_browser) def _enable_restricted_logins(browser, should_enable): diff --git a/plinth/modules/shadowsocks/data/lib/systemd/system/shadowsocks-libev-local@.service.d/freedombox.conf b/plinth/modules/shadowsocks/data/usr/lib/systemd/system/shadowsocks-libev-local@.service.d/freedombox.conf similarity index 100% rename from plinth/modules/shadowsocks/data/lib/systemd/system/shadowsocks-libev-local@.service.d/freedombox.conf rename to plinth/modules/shadowsocks/data/usr/lib/systemd/system/shadowsocks-libev-local@.service.d/freedombox.conf diff --git a/plinth/modules/shadowsocks/tests/shadowsocks.feature b/plinth/modules/shadowsocks/tests/shadowsocks.feature deleted file mode 100644 index 67167e004..000000000 --- a/plinth/modules/shadowsocks/tests/shadowsocks.feature +++ /dev/null @@ -1,30 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @shadowsocks -Feature: Shadowsocks Socks5 Proxy - Run the Shadowsocks Socks5 proxy client. - -Background: - Given I'm a logged in user - Given the shadowsocks application is installed - Given the shadowsocks application is configured - -Scenario: Enable shadowsocks application - Given the shadowsocks application is disabled - When I enable the shadowsocks application - Then the shadowsocks service should be running - -@backups -Scenario: Backup and restore shadowsocks - Given the shadowsocks application is enabled - When I configure shadowsocks with server example.com and password beforebackup123 - And I create a backup of the shadowsocks app data with name test_shadowsocks - And I configure shadowsocks with server example.org and password afterbackup123 - And I restore the shadowsocks app data backup with name test_shadowsocks - Then the shadowsocks service should be running - And shadowsocks should be configured with server example.com and password beforebackup123 - -Scenario: Disable shadowsocks application - Given the shadowsocks application is enabled - When I disable the shadowsocks application - Then the shadowsocks service should not be running diff --git a/plinth/modules/shadowsocks/tests/test_functional.py b/plinth/modules/shadowsocks/tests/test_functional.py index 3e6095690..5f7e7bcfa 100644 --- a/plinth/modules/shadowsocks/tests/test_functional.py +++ b/plinth/modules/shadowsocks/tests/test_functional.py @@ -3,30 +3,49 @@ Functional, browser based tests for shadowsocks app. """ -from pytest_bdd import given, parsers, scenarios, then, when +import pytest from plinth.tests import functional -scenarios('shadowsocks.feature') +pytestmark = [pytest.mark.apps, pytest.mark.shadowsocks] -@given('the shadowsocks application is configured') -def configure_shadowsocks(session_browser): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'shadowsocks') _configure(session_browser, 'example.com', 'fakepassword') + yield + functional.app_disable(session_browser, 'shadowsocks') -@when( - parsers.parse('I configure shadowsocks with server {server:S} and ' - 'password {password:w}')) -def configure_shadowsocks_with_details(session_browser, server, password): - _configure(session_browser, server, password) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'shadowsocks') + + functional.app_enable(session_browser, 'shadowsocks') + assert functional.service_is_running(session_browser, 'shadowsocks') + + functional.app_disable(session_browser, 'shadowsocks') + assert functional.service_is_not_running(session_browser, 'shadowsocks') -@then( - parsers.parse('shadowsocks should be configured with server {server:S} ' - 'and password {password:w}')) -def assert_shadowsocks_configuration(session_browser, server, password): - assert (server, password) == _get_configuration(session_browser) +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + functional.app_enable(session_browser, 'shadowsocks') + _configure(session_browser, 'example.com', 'beforebackup123') + functional.backup_create(session_browser, 'shadowsocks', + 'test_shadowsocks') + + _configure(session_browser, 'example.org', 'afterbackup123') + functional.backup_restore(session_browser, 'shadowsocks', + 'test_shadowsocks') + + assert functional.service_is_running(session_browser, 'shadowsocks') + assert _get_configuration(session_browser) == ('example.com', + 'beforebackup123') def _configure(browser, server, password): diff --git a/plinth/modules/sharing/tests/sharing.feature b/plinth/modules/sharing/tests/sharing.feature deleted file mode 100644 index fc75661ee..000000000 --- a/plinth/modules/sharing/tests/sharing.feature +++ /dev/null @@ -1,52 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @sharing -Feature: Sharing - Share server folders over HTTP, etc. - -Background: - Given I'm a logged in user - -Scenario: Add new share - Given share tmp is not available - When I add a share tmp from path /tmp for admin - Then the share tmp should be listed from path /tmp for admin - And the share tmp should be accessible - -Scenario: Edit a share - Given share tmp is not available - When I remove share boot - And I add a share tmp from path /tmp for admin - And I edit share tmp to boot from path /boot for admin - Then the share tmp should not be listed - And the share tmp should not exist - And the share boot should be listed from path /boot for admin - And the share boot should be accessible - -Scenario: Remove a share - When I remove share tmp - And I add a share tmp from path /tmp for admin - And I remove share tmp - Then the share tmp should not be listed - And the share tmp should not exist - -Scenario: Share permissions - When I remove share tmp - And I add a share tmp from path /tmp for syncthing-access - Then the share tmp should be listed from path /tmp for syncthing-access - And the share tmp should not be accessible - -Scenario: Public share - When I edit share tmp to be public - And I log out - Then the share_tmp site should be available - -@backups -Scenario: Backup and restore sharing - Given share tmp is not available - When I add a share tmp from path /tmp for admin - And I create a backup of the sharing app data with name test_sharing - And I remove share tmp - And I restore the sharing app data backup with name test_sharing - Then the share tmp should be listed from path /tmp for admin - And the share tmp should be accessible diff --git a/plinth/modules/sharing/tests/test_functional.py b/plinth/modules/sharing/tests/test_functional.py index 0717038ca..5e335d29a 100644 --- a/plinth/modules/sharing/tests/test_functional.py +++ b/plinth/modules/sharing/tests/test_functional.py @@ -5,66 +5,69 @@ Functional, browser based tests for sharing app. import pytest import splinter -from pytest_bdd import given, parsers, scenarios, then, when - from plinth.tests import functional -scenarios('sharing.feature') +pytestmark = [pytest.mark.apps, pytest.mark.sharing] -@given(parsers.parse('share {name:w} is not available')) -def remove_share(session_browser, name): - _remove_share(session_browser, name) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login.""" + functional.login(session_browser) -@when(parsers.parse('I add a share {name:w} from path {path} for {group:S}')) -def add_share(session_browser, name, path, group): - _add_share(session_browser, name, path, group) +def test_add_remove_share(session_browser): + """Test adding and removing a share.""" + _remove_share(session_browser, 'tmp') + _add_share(session_browser, 'tmp', '/tmp', 'admin') + _verify_share(session_browser, 'tmp', '/tmp', 'admin') + _access_share(session_browser, 'tmp') + + _remove_share(session_browser, 'tmp') + _verify_invalid_share(session_browser, 'tmp') + _verify_nonexistant_share(session_browser, 'tmp') -@when( - parsers.parse('I edit share {old_name:w} to {new_name:w} from path {path} ' - 'for {group:w}')) -def edit_share(session_browser, old_name, new_name, path, group): - _edit_share(session_browser, old_name, new_name, path, group) +def test_edit_share(session_browser): + """Test editing a share.""" + _remove_share(session_browser, 'tmp') + _remove_share(session_browser, 'boot') + + _add_share(session_browser, 'tmp', '/tmp', 'admin') + _edit_share(session_browser, 'tmp', 'boot', '/boot', 'admin') + + _verify_invalid_share(session_browser, 'tmp') + _verify_nonexistant_share(session_browser, 'tmp') + + _verify_share(session_browser, 'boot', '/boot', 'admin') + _access_share(session_browser, 'boot') -@when(parsers.parse('I remove share {name:w}')) -def remove_share2(session_browser, name): - _remove_share(session_browser, name) +def test_share_permissions(session_browser): + """Test share permissions.""" + _remove_share(session_browser, 'tmp') + _add_share(session_browser, 'tmp', '/tmp', 'syncthing-access') + _verify_share(session_browser, 'tmp', '/tmp', 'syncthing-access') + _verify_inaccessible_share(session_browser, 'tmp') + + _make_share_public(session_browser, 'tmp') + functional.logout(session_browser) + assert functional.is_available(session_browser, 'share_tmp') + functional.login(session_browser) -@when(parsers.parse('I edit share {name:w} to be public')) -def edit_share_public_access(session_browser, name): - _make_share_public(session_browser, name) +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore.""" + _remove_share(session_browser, 'tmp') + _add_share(session_browser, 'tmp', '/tmp', 'admin') + functional.backup_create(session_browser, 'sharing', 'test_sharing') + _remove_share(session_browser, 'tmp') + functional.backup_restore(session_browser, 'sharing', 'test_sharing') -@then( - parsers.parse( - 'the share {name:w} should be listed from path {path} for {group:S}')) -def verify_share(session_browser, name, path, group): - _verify_share(session_browser, name, path, group) - - -@then(parsers.parse('the share {name:w} should not be listed')) -def verify_invalid_share(session_browser, name): - with pytest.raises(splinter.exceptions.ElementDoesNotExist): - _get_share(session_browser, name) - - -@then(parsers.parse('the share {name:w} should be accessible')) -def access_share(session_browser, name): - _access_share(session_browser, name) - - -@then(parsers.parse('the share {name:w} should not exist')) -def verify_nonexistant_share(session_browser, name): - _verify_nonexistant_share(session_browser, name) - - -@then(parsers.parse('the share {name:w} should not be accessible')) -def verify_inaccessible_share(session_browser, name): - _verify_inaccessible_share(session_browser, name) + _verify_share(session_browser, 'tmp', '/tmp', 'admin') + _access_share(session_browser, 'tmp') def _remove_share(browser, name): @@ -135,6 +138,11 @@ def _make_share_public(browser, name): functional.submit(browser) +def _verify_invalid_share(browser, name): + with pytest.raises(splinter.exceptions.ElementDoesNotExist): + _get_share(browser, name) + + def _verify_nonexistant_share(browser, name): """Verify that given URL for a given share name is a 404.""" functional.visit(browser, f'/share/{name}') diff --git a/plinth/modules/snapshot/tests/snapshot.feature b/plinth/modules/snapshot/tests/snapshot.feature deleted file mode 100644 index bd2687186..000000000 --- a/plinth/modules/snapshot/tests/snapshot.feature +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@system @snapshot -Feature: Storage Snapshots - Run storage snapshots application - Snapper. - -Background: - Given I'm a logged in user - And the snapshot application is installed - And the filesystem supports snapshots - -Scenario: Create a snapshot - Given the list of snapshots is empty - When I manually create a snapshot - Then there should be 1 more snapshots in the list - -Scenario: Configure snapshots - Given snapshots are configured with free space 30, timeline snapshots disabled, software snapshots disabled, hourly limit 10, daily limit 3, weekly limit 2, monthly limit 2, yearly limit 0 - When I configure snapshots with free space 20, timeline snapshots enabled, software snapshots enabled, hourly limit 3, daily limit 2, weekly limit 1, monthly limit 1, yearly limit 1 - Then snapshots should be configured with free space 20, timeline snapshots enabled, software snapshots enabled, hourly limit 3, daily limit 2, weekly limit 1, monthly limit 1, yearly limit 1 - -@backups -Scenario: Backup and restore snapshot - When I configure snapshots with free space 30, timeline snapshots disabled, software snapshots disabled, hourly limit 10, daily limit 3, weekly limit 2, monthly limit 2, yearly limit 0 - And I create a backup of the snapshot app data with name test_storage_snapshots - And I configure snapshots with free space 20, timeline snapshots enabled, software snapshots enabled, hourly limit 3, daily limit 2, weekly limit 1, monthly limit 1, yearly limit 1 - And I restore the snapshot app data backup with name test_storage_snapshots - Then snapshots should be configured with free space 30, timeline snapshots disabled, software snapshots disabled, hourly limit 10, daily limit 3, weekly limit 2, monthly limit 2, yearly limit 0 diff --git a/plinth/modules/snapshot/tests/test_functional.py b/plinth/modules/snapshot/tests/test_functional.py index d1b0dc0be..7bdfc8ec8 100644 --- a/plinth/modules/snapshot/tests/test_functional.py +++ b/plinth/modules/snapshot/tests/test_functional.py @@ -4,84 +4,59 @@ Functional, browser based tests for snapshot app. """ import pytest -from pytest_bdd import given, parsers, scenarios, then, when - from plinth.tests import functional -scenarios('snapshot.feature') +pytestmark = [pytest.mark.system, pytest.mark.snapshot] -@given('the filesystem supports snapshots') -def is_snapshots_supported(session_browser): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'snapshot') if not _is_snapshot_supported(session_browser): pytest.skip('Filesystem doesn\'t support snapshots') - assert True -@given('the list of snapshots is empty', target_fixture='empty_snapshots_list') -def empty_snapshots_list(session_browser): - _delete_all(session_browser) - return _get_count(session_browser) +def test_create(session_browser): + """Test creating a snapshot.""" + _empty_snapshots_list(session_browser) + _create_snapshot(session_browser) + assert _get_count(session_browser) == 1 -@when('I manually create a snapshot') -def create_snapshot(session_browser): - _create(session_browser) +def test_configure(session_browser): + """Test configuring snapshots.""" + _set_configuration(session_browser, free_space=30, timeline_enabled=False, + software_enabled=False, hourly=10, daily=3, weekly=2, + monthly=2, yearly=0) + _set_configuration(session_browser, free_space=20, timeline_enabled=True, + software_enabled=True, hourly=3, daily=2, weekly=1, + monthly=1, yearly=1) + assert _get_configuration(session_browser) == (20, True, True, 3, 2, 1, 1, + 1) -@then(parsers.parse('there should be {count:d} more snapshots in the list')) -def verify_snapshot_count(session_browser, count, empty_snapshots_list): - assert _get_count(session_browser) == count + empty_snapshots_list +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + _set_configuration(session_browser, free_space=30, timeline_enabled=False, + software_enabled=False, hourly=10, daily=3, weekly=2, + monthly=2, yearly=0) + functional.backup_create(session_browser, 'snapshot', 'test_snapshot') + + _set_configuration(session_browser, free_space=20, timeline_enabled=True, + software_enabled=True, hourly=3, daily=2, weekly=1, + monthly=1, yearly=1) + functional.backup_restore(session_browser, 'snapshot', 'test_snapshot') + + assert _get_configuration(session_browser) == (30, False, False, 10, 3, 2, + 2, 0) -@given( - parsers.parse( - 'snapshots are configured with free space {free_space:d}, timeline ' - 'snapshots {timeline_enabled:w}, software snapshots ' - '{software_enabled:w}, hourly limit {hourly:d}, daily limit {daily:d}' - ', weekly limit {weekly:d}, monthly limit {monthly:d}, yearly limit ' - '{yearly:d}')) -def snapshot_given_set_configuration(session_browser, free_space, - timeline_enabled, software_enabled, - hourly, daily, weekly, monthly, yearly): - timeline_enabled = (timeline_enabled == 'enabled') - software_enabled = (software_enabled == 'enabled') - _set_configuration(session_browser, free_space, timeline_enabled, - software_enabled, hourly, daily, weekly, monthly, - yearly) - - -@when( - parsers.parse( - 'I configure snapshots with free space {free_space:d}, ' - 'timeline snapshots {timeline_enabled:w}, ' - 'software snapshots {software_enabled:w}, hourly limit {hourly:d}, ' - 'daily limit {daily:d}, weekly limit {weekly:d}, monthly limit ' - '{monthly:d}, yearly limit {yearly:d}')) -def snapshot_set_configuration(session_browser, free_space, timeline_enabled, - software_enabled, hourly, daily, weekly, - monthly, yearly): - timeline_enabled = (timeline_enabled == 'enabled') - software_enabled = (software_enabled == 'enabled') - _set_configuration(session_browser, free_space, timeline_enabled, - software_enabled, hourly, daily, weekly, monthly, - yearly) - - -@then( - parsers.parse( - 'snapshots should be configured with free space {free_space:d}, ' - 'timeline snapshots {timeline_enabled:w}, software snapshots ' - '{software_enabled:w}, hourly limit {hourly:d}, daily limit ' - '{daily:d}, weekly limit {weekly:d}, monthly limit {monthly:d}, ' - 'yearly limit {yearly:d}')) -def snapshot_assert_configuration(session_browser, free_space, - timeline_enabled, software_enabled, hourly, - daily, weekly, monthly, yearly): - timeline_enabled = (timeline_enabled == 'enabled') - software_enabled = (software_enabled == 'enabled') - assert (free_space, timeline_enabled, software_enabled, hourly, daily, - weekly, monthly, yearly) == _get_configuration(session_browser) +def _empty_snapshots_list(browser): + _delete_all(browser) + return _get_count(browser) def _delete_all(browser): @@ -96,7 +71,7 @@ def _delete_all(browser): functional.submit(browser, confirm_button) -def _create(browser): +def _create_snapshot(browser): functional.visit(browser, '/plinth/sys/snapshot/manage/') functional.submit(browser) # Click on 'Create Snapshot' diff --git a/plinth/modules/ssh/tests/ssh.feature b/plinth/modules/ssh/tests/ssh.feature deleted file mode 100644 index 251125044..000000000 --- a/plinth/modules/ssh/tests/ssh.feature +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @ssh -Feature: Secure Shell Server - Run secure shell server. - -Background: - Given I'm a logged in user - Given the ssh application is installed - -Scenario: Enable ssh application - Given the ssh application is disabled - When I enable the ssh application - Then the ssh service should be running - -Scenario: Disable ssh application - Given the ssh application is enabled - When I disable the ssh application - Then the ssh service should not be running - -# TODO: Improve this to actually check that earlier ssh certificate has been -# restored. -@backups -Scenario: Backup and restore ssh - Given the ssh application is enabled - When I create a backup of the ssh app data with name test_ssh - And I restore the ssh app data backup with name test_ssh - Then the ssh service should be running diff --git a/plinth/modules/ssh/tests/test_functional.py b/plinth/modules/ssh/tests/test_functional.py index 6b239f3ea..550769e1c 100644 --- a/plinth/modules/ssh/tests/test_functional.py +++ b/plinth/modules/ssh/tests/test_functional.py @@ -3,6 +3,39 @@ Functional, browser based tests for ssh app. """ -from pytest_bdd import scenarios +import pytest -scenarios('ssh.feature') +from plinth.tests import functional + +pytestmark = [pytest.mark.system, pytest.mark.ssh] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'ssh') + yield + functional.app_enable(session_browser, 'ssh') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'ssh') + + functional.app_enable(session_browser, 'ssh') + assert functional.service_is_running(session_browser, 'ssh') + + functional.app_disable(session_browser, 'ssh') + assert functional.service_is_not_running(session_browser, 'ssh') + + +# TODO: Improve this to actually check that earlier ssh certificate has been +# restored. +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore.""" + functional.app_enable(session_browser, 'ssh') + functional.backup_create(session_browser, 'ssh', 'test_ssh') + functional.backup_restore(session_browser, 'ssh', 'test_ssh') + assert functional.service_is_running(session_browser, 'ssh') diff --git a/plinth/modules/sso/tests/sso.feature b/plinth/modules/sso/tests/sso.feature deleted file mode 100644 index f6f0d998e..000000000 --- a/plinth/modules/sso/tests/sso.feature +++ /dev/null @@ -1,20 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@sso @essential @system -Feature: Single Sign On - Test Single Sign On features. - -Background: - Given I'm a logged in user - Given the syncthing application is installed - Given the syncthing application is enabled - - -Scenario: Logged out Plinth user cannot access Syncthing web interface - Given I'm a logged out user - When I access syncthing application - Then I should be prompted for login - -Scenario: Logged in Plinth user can access Syncthing web interface - When I access syncthing application - Then the syncthing site should be available diff --git a/plinth/modules/sso/tests/test_functional.py b/plinth/modules/sso/tests/test_functional.py index 3af0e47eb..631853720 100644 --- a/plinth/modules/sso/tests/test_functional.py +++ b/plinth/modules/sso/tests/test_functional.py @@ -3,6 +3,28 @@ Functional, browser based tests for sso app. """ -from pytest_bdd import scenarios +import pytest +from plinth.tests import functional -scenarios('sso.feature') +pytestmark = [pytest.mark.system, pytest.mark.essential, pytest.mark.sso] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'syncthing') + functional.app_enable(session_browser, 'syncthing') + yield + functional.app_disable(session_browser, 'syncthing') + + +def test_app_access(session_browser): + """Test that only logged-in users can access Syncthing web interface.""" + functional.logout(session_browser) + functional.access_url(session_browser, 'syncthing') + assert functional.is_login_prompt(session_browser) + + functional.login(session_browser) + functional.access_url(session_browser, 'syncthing') + assert functional.is_available(session_browser, 'syncthing') diff --git a/plinth/modules/sso/views.py b/plinth/modules/sso/views.py index a9033c6a0..d84984a96 100644 --- a/plinth/modules/sso/views.py +++ b/plinth/modules/sso/views.py @@ -13,7 +13,7 @@ from django.contrib.auth import REDIRECT_FIELD_NAME from django.contrib.auth.views import LoginView, LogoutView from django.http import HttpResponseRedirect -from plinth import actions, utils, web_framework +from plinth import actions, translation, utils, web_framework from .forms import AuthenticationForm, CaptchaAuthenticationForm @@ -51,6 +51,8 @@ class SSOLoginView(LoginView): def dispatch(self, request, *args, **kwargs): response = super(SSOLoginView, self).dispatch(request, *args, **kwargs) if request.user.is_authenticated: + translation.set_language(request, response, + request.user.userprofile.language) return set_ticket_cookie(request.user, response) return response diff --git a/plinth/modules/storage/tests/storage.feature b/plinth/modules/storage/tests/storage.feature deleted file mode 100644 index bc3f51e5b..000000000 --- a/plinth/modules/storage/tests/storage.feature +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@system @storage @essential -Feature: Storage - Show information about the disks. - -Background: - Given I'm a logged in user - -Scenario: List disks - Given I'm on the storage page - Then the root disk should be shown diff --git a/plinth/modules/storage/tests/test_functional.py b/plinth/modules/storage/tests/test_functional.py index 3125d8a3d..d0dd20bfb 100644 --- a/plinth/modules/storage/tests/test_functional.py +++ b/plinth/modules/storage/tests/test_functional.py @@ -3,24 +3,25 @@ Functional, browser based tests for storage app. """ import pytest -from pytest_bdd import given, parsers, scenarios, then from plinth.tests import functional -scenarios('storage.feature') +pytestmark = [pytest.mark.system, pytest.mark.essential, pytest.mark.storage] -@then('the root disk should be shown') -def storage_root_disk_is_shown(session_browser): - assert _is_root_disk_shown(session_browser) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login.""" + functional.login(session_browser) -@given(parsers.parse("I'm on the {name:w} page")) -def go_to_module(session_browser, name): - if functional.running_inside_container: +def test_list_disks(session_browser): + """Test that root disk is shown on storage page.""" + if functional.running_inside_container(): pytest.skip('Storage doesn\'t work inside a container') else: - functional.nav_to_module(session_browser, name) + functional.nav_to_module(session_browser, 'storage') + assert _is_root_disk_shown(session_browser) def _is_root_disk_shown(browser): diff --git a/plinth/modules/storage/tests/test_storage.py b/plinth/modules/storage/tests/test_storage.py index db11baca0..e84ccdb1e 100644 --- a/plinth/modules/storage/tests/test_storage.py +++ b/plinth/modules/storage/tests/test_storage.py @@ -56,7 +56,7 @@ class Disk(): command = 'losetup --show --find {file}'.format( file=self.disk_file.name) process = subprocess.run(command.split(), stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + stderr=subprocess.PIPE, check=False) if process.returncode: if b'cannot find an unused loop device' in process.stderr: pytest.skip('Loopback devices not available') @@ -107,7 +107,7 @@ class Disk(): def _cleanup_loopback(self): """Undo the loopback device setup.""" - subprocess.run(['losetup', '--detach', self.device]) + subprocess.run(['losetup', '--detach', self.device], check=False) def _remove_disk_file(self): """Delete the disk_file.""" @@ -231,16 +231,15 @@ class TestActions: self.assert_aligned(partition_number) @staticmethod - def call_action(action_command, **kwargs): + def call_action(action_command, check=True, **kwargs): """Call the action script.""" test_directory = pathlib.Path(__file__).parent top_directory = (test_directory / '..' / '..' / '..' / '..').resolve() action_command[0] = top_directory / 'actions' / action_command[0] kwargs['stdout'] = kwargs.get('stdout', subprocess.DEVNULL) kwargs['stderr'] = kwargs.get('stderr', subprocess.DEVNULL) - kwargs['check'] = kwargs.get('check', True) env = dict(os.environ, PYTHONPATH=str(top_directory)) - return subprocess.run(action_command, env=env, **kwargs) + return subprocess.run(action_command, env=env, check=check, **kwargs) def check_action(self, action_command): """Return success/failure result of the action command.""" @@ -255,7 +254,7 @@ class TestActions: subprocess.run([ 'parted', '--script', self.device, 'align-check', 'opti', str(partition_number) - ]) + ], check=True) def assert_btrfs_file_system_healthy(self, partition_number): """Perform a successful ext4 file system check.""" diff --git a/plinth/modules/syncthing/data/lib/systemd/system/syncthing@syncthing.service.d/freedombox.conf b/plinth/modules/syncthing/data/usr/lib/systemd/system/syncthing@syncthing.service.d/freedombox.conf similarity index 100% rename from plinth/modules/syncthing/data/lib/systemd/system/syncthing@syncthing.service.d/freedombox.conf rename to plinth/modules/syncthing/data/usr/lib/systemd/system/syncthing@syncthing.service.d/freedombox.conf diff --git a/plinth/modules/syncthing/tests/syncthing.feature b/plinth/modules/syncthing/tests/syncthing.feature deleted file mode 100644 index c252ac29d..000000000 --- a/plinth/modules/syncthing/tests/syncthing.feature +++ /dev/null @@ -1,59 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @syncthing @sso -Feature: Syncthing File Synchronization - Run Syncthing File Synchronization server. - -Background: - Given I'm a logged in user - Given the syncthing application is installed - -Scenario: Enable syncthing application - Given the syncthing application is disabled - When I enable the syncthing application - Then the syncthing service should be running - -Scenario: Authentication and usage reporting notifications not shown - Given the syncthing application is enabled - When I access syncthing application - Then the usage reporting notification is not shown - And the authentication notification is not shown - -Scenario: Add a syncthing folder - Given the syncthing application is enabled - And syncthing folder Test is not present - When I add a folder /tmp as syncthing folder Test - Then syncthing folder Test should be present - -Scenario: Remove a syncthing folder - Given the syncthing application is enabled - And folder /tmp is present as syncthing folder Test - When I remove syncthing folder Test - Then syncthing folder Test should not be present - -@backups -Scenario: Backup and restore syncthing - Given the syncthing application is enabled - And syncthing folder Test is not present - When I add a folder /tmp as syncthing folder Test - And I create a backup of the syncthing app data with name test_syncthing - And I remove syncthing folder Test - And I restore the syncthing app data backup with name test_syncthing - Then syncthing folder Test should be present - -Scenario: User of syncthing-access group can access syncthing site - Given the syncthing application is enabled - And the user syncthinguser in group syncthing-access exists - When I'm logged in as the user syncthinguser - Then the syncthing site should be available - -Scenario: User not of syncthing-access group can't access syncthing site - Given the syncthing application is enabled - And the user nogroupuser exists - When I'm logged in as the user nogroupuser - Then the syncthing site should not be available - -Scenario: Disable syncthing application - Given the syncthing application is enabled - When I disable the syncthing application - Then the syncthing service should not be running diff --git a/plinth/modules/syncthing/tests/test_functional.py b/plinth/modules/syncthing/tests/test_functional.py index cfbce4f55..e5ce13e00 100644 --- a/plinth/modules/syncthing/tests/test_functional.py +++ b/plinth/modules/syncthing/tests/test_functional.py @@ -5,63 +5,102 @@ Functional, browser based tests for syncthing app. import time -from pytest_bdd import given, parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('syncthing.feature') +pytestmark = [pytest.mark.apps, pytest.mark.syncthing, pytest.mark.sso] -@given(parsers.parse('syncthing folder {folder_name:w} is not present')) -def syncthing_folder_not_present(session_browser, folder_name): - if _folder_is_present(session_browser, folder_name): - _remove_folder(session_browser, folder_name) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'syncthing') + yield + functional.app_disable(session_browser, 'syncthing') -@given( - parsers.parse( - 'folder {folder_path:S} is present as syncthing folder {folder_name:w}' - )) -def syncthing_folder_present(session_browser, folder_name, folder_path): - if not _folder_is_present(session_browser, folder_name): - _add_folder(session_browser, folder_name, folder_path) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'syncthing') + + functional.app_enable(session_browser, 'syncthing') + assert functional.service_is_running(session_browser, 'syncthing') + + functional.app_disable(session_browser, 'syncthing') + assert functional.service_is_not_running(session_browser, 'syncthing') -@when( - parsers.parse( - 'I add a folder {folder_path:S} as syncthing folder {folder_name:w}')) -def syncthing_add_folder(session_browser, folder_name, folder_path): - _add_folder(session_browser, folder_name, folder_path) +def test_notifications(session_browser): + """Test that authentication and usage reporting notifications are not + shown.""" + functional.app_enable(session_browser, 'syncthing') + functional.access_url(session_browser, 'syncthing') + _assert_usage_report_notification_not_shown(session_browser) + _assert_authentication_notification_not_shown(session_browser) -@when(parsers.parse('I remove syncthing folder {folder_name:w}')) -def syncthing_remove_folder(session_browser, folder_name): - _remove_folder(session_browser, folder_name) +def test_add_remove_folder(session_browser): + """Test adding and removing a folder.""" + functional.app_enable(session_browser, 'syncthing') + if _folder_is_present(session_browser, 'Test'): + _remove_folder(session_browser, 'Test') + + _add_folder(session_browser, 'Test', '/tmp') + assert _folder_is_present(session_browser, 'Test') + + _remove_folder(session_browser, 'Test') + assert not _folder_is_present(session_browser, 'Test') -@then('the usage reporting notification is not shown') -def syncthing_assert_usage_report_notification_not_shown(session_browser): +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, 'syncthing') + if _folder_is_present(session_browser, 'Test'): + _remove_folder(session_browser, 'Test') + + _add_folder(session_browser, 'Test', '/tmp') + functional.backup_create(session_browser, 'syncthing', 'test_syncthing') + + _remove_folder(session_browser, 'Test') + functional.backup_restore(session_browser, 'syncthing', 'test_syncthing') + + assert _folder_is_present(session_browser, 'Test') + + +def test_user_group_access(session_browser): + """Test that only users in syncthing-access group can access syncthing + site.""" + functional.app_enable(session_browser, 'syncthing') + if not functional.user_exists(session_browser, 'syncthinguser'): + functional.create_user(session_browser, 'syncthinguser', + groups=['syncthing-access']) + if not functional.user_exists(session_browser, 'nogroupuser'): + functional.create_user(session_browser, 'nogroupuser') + + functional.login_with_account(session_browser, functional.base_url, + 'syncthinguser') + assert functional.is_available(session_browser, 'syncthing') + + functional.login_with_account(session_browser, functional.base_url, + 'nogroupuser') + assert not functional.is_available(session_browser, 'syncthing') + + functional.login(session_browser) + + +def _assert_usage_report_notification_not_shown(session_browser): _load_main_interface(session_browser) assert session_browser.find_by_id('ur').visible is False -@then('the authentication notification is not shown') -def syncthing_assert_authentication_notification_not_shown(session_browser): +def _assert_authentication_notification_not_shown(session_browser): _load_main_interface(session_browser) assert bool(session_browser.find_by_css( '#authenticationUserAndPassword *')) is False -@then(parsers.parse('syncthing folder {folder_name:w} should be present')) -def syncthing_assert_folder_present(session_browser, folder_name): - assert _folder_is_present(session_browser, folder_name) - - -@then(parsers.parse('syncthing folder {folder_name:w} should not be present')) -def syncthing_assert_folder_not_present(session_browser, folder_name): - assert not _folder_is_present(session_browser, folder_name) - - def _load_main_interface(browser): """Close the dialog boxes that many popup after visiting the URL.""" functional.access_url(browser, 'syncthing') diff --git a/plinth/modules/tahoe/tests/tahoe.feature b/plinth/modules/tahoe/tests/tahoe.feature deleted file mode 100644 index 8dcf9ca27..000000000 --- a/plinth/modules/tahoe/tests/tahoe.feature +++ /dev/null @@ -1,53 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -# TODO: When tahoe-lafs is restarted, it leaves a .gnupg folder in -# /var/lib/tahoe-lafs and failes to start in the next run. Enable tests after -# this is fixed. - -@apps @tahoe @skip -Feature: Tahoe-LAFS distribute file storage - Run the Tahoe distribute file storage server - -Background: - Given I'm a logged in user - And advanced mode is on - And the domain name is set to mydomain.example - And the tahoe application is installed - And the domain name for tahoe is set to mydomain.example - -Scenario: Enable tahoe application - Given the tahoe application is disabled - When I enable the tahoe application - Then the tahoe service should be running - -Scenario: Default tahoe introducers - Given the tahoe application is enabled - Then mydomain.example should be a tahoe local introducer - And mydomain.example should be a tahoe connected introducer - -Scenario: Add tahoe introducer - Given the tahoe application is enabled - And anotherdomain.example is not a tahoe introducer - When I add anotherdomain.example as a tahoe introducer - Then anotherdomain.example should be a tahoe connected introducer - -Scenario: Remove tahoe introducer - Given the tahoe application is enabled - And anotherdomain.example is a tahoe introducer - When I remove anotherdomain.example as a tahoe introducer - Then anotherdomain.example should not be a tahoe connected introducer - -@backups -Scenario: Backup and restore tahoe - Given the tahoe application is enabled - And backupdomain.example is a tahoe introducer - When I create a backup of the tahoe app data with name test_tahoe - And I remove backupdomain.example as a tahoe introducer - And I restore the tahoe app data backup with name test_tahoe - Then the tahoe service should be running - And backupdomain.example should be a tahoe connected introducer - -Scenario: Disable tahoe application - Given the tahoe application is enabled - When I disable the tahoe application - Then the tahoe service should not be running diff --git a/plinth/modules/tahoe/tests/test_functional.py b/plinth/modules/tahoe/tests/test_functional.py index c6ebedb29..cb13b6f25 100644 --- a/plinth/modules/tahoe/tests/test_functional.py +++ b/plinth/modules/tahoe/tests/test_functional.py @@ -3,47 +3,77 @@ Functional, browser based tests for tahoe app. """ -from pytest_bdd import given, parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('tahoe.feature') +pytestmark = [pytest.mark.apps, pytest.mark.tahoe, pytest.mark.skip] + +# TODO: When tahoe-lafs is restarted, it leaves a .gnupg folder in +# /var/lib/tahoe-lafs and failes to start in the next run. Enable tests after +# this is fixed. -@then( - parsers.parse( - '{domain:S} should be a tahoe {introducer_type:w} introducer')) -def tahoe_assert_introducer(session_browser, domain, introducer_type): - assert _get_introducer(session_browser, domain, introducer_type) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.set_advanced_mode(session_browser, True) + functional.set_domain_name(session_browser, 'mydomain.example') + functional.install(session_browser, 'tahoe') + functional.app_select_domain_name(session_browser, 'tahoe', + 'mydomain.example') + yield + functional.app_disable(session_browser, 'tahoe') -@then( - parsers.parse( - '{domain:S} should not be a tahoe {introducer_type:w} introducer')) -def tahoe_assert_not_introducer(session_browser, domain, introducer_type): - assert not _get_introducer(session_browser, domain, introducer_type) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'tahoe') + + functional.app_enable(session_browser, 'tahoe') + assert functional.service_is_running(session_browser, 'tahoe') + + functional.app_disable(session_browser, 'tahoe') + assert functional.service_is_not_running(session_browser, 'tahoe') -@given(parsers.parse('{domain:S} is not a tahoe introducer')) -def tahoe_given_remove_introducer(session_browser, domain): - if _get_introducer(session_browser, domain, 'connected'): - _remove_introducer(session_browser, domain) +def test_default_introducers(session_browser): + """Test default introducers.""" + functional.app_enable(session_browser, 'tahoe') + assert _get_introducer(session_browser, 'mydomain.example', 'local') + assert _get_introducer(session_browser, 'mydomain.example', 'connected') -@when(parsers.parse('I add {domain:S} as a tahoe introducer')) -def tahoe_add_introducer(session_browser, domain): - _add_introducer(session_browser, domain) +def test_add_remove_introducers(session_browser): + """Test add and remove introducers.""" + functional.app_enable(session_browser, 'tahoe') + if _get_introducer(session_browser, 'anotherdomain.example', 'connected'): + _remove_introducer(session_browser, 'anotherdomain.example') + + _add_introducer(session_browser, 'anotherdomain.example') + assert _get_introducer(session_browser, 'anotherdomain.example', + 'connected') + + _remove_introducer(session_browser, 'anotherdomain.example') + assert not _get_introducer(session_browser, 'anotherdomain.example', + 'connected') -@given(parsers.parse('{domain:S} is a tahoe introducer')) -def tahoe_given_add_introducer(session_browser, domain): - if not _get_introducer(session_browser, domain, 'connected'): - _add_introducer(session_browser, domain) +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, 'tahoe') + if not _get_introducer(session_browser, 'backupdomain.example', + 'connected'): + _add_introducer(session_browser, 'backupdomain.example') + functional.backup_create(session_browser, 'tahoe', 'test_tahoe') + _remove_introducer(session_browser, 'backupdomain.example') + functional.backup_restore(session_browser, 'tahoe', 'test_tahoe') -@when(parsers.parse('I remove {domain:S} as a tahoe introducer')) -def tahoe_remove_introducer(session_browser, domain): - _remove_introducer(session_browser, domain) + assert functional.service_is_running(session_browser, 'tahoe') + assert _get_introducer(session_browser, 'backupdomain.example', + 'connected') def _get_introducer(browser, domain, introducer_type): diff --git a/plinth/modules/tor/tests/test_functional.py b/plinth/modules/tor/tests/test_functional.py index ae159ca46..3ccaa539e 100644 --- a/plinth/modules/tor/tests/test_functional.py +++ b/plinth/modules/tor/tests/test_functional.py @@ -3,7 +3,7 @@ Functional, browser based tests for tor app. """ -from pytest_bdd import given, parsers, scenarios, then, when +import pytest from plinth.tests import functional @@ -14,85 +14,88 @@ _TOR_FEATURE_TO_ELEMENT = { 'software': 'tor-apt_transport_tor_enabled' } -scenarios('tor.feature') +pytestmark = [pytest.mark.apps, pytest.mark.tor] -@given(parsers.parse('tor relay is {enabled:w}')) -def tor_given_relay_enable(session_browser, enabled): - _feature_enable(session_browser, 'relay', enabled) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'tor') + yield + functional.app_disable(session_browser, 'tor') -@when(parsers.parse('I {enable:w} tor relay')) -def tor_relay_enable(session_browser, enable): - _feature_enable(session_browser, 'relay', enable) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'tor') + + functional.app_enable(session_browser, 'tor') + assert functional.service_is_running(session_browser, 'tor') + + functional.app_disable(session_browser, 'tor') + assert functional.service_is_not_running(session_browser, 'tor') -@then(parsers.parse('tor relay should be {enabled:w}')) -def tor_assert_relay_enabled(session_browser, enabled): - _assert_feature_enabled(session_browser, 'relay', enabled) +def test_set_tor_relay_configuration(session_browser): + """Test setting Tor relay configuration.""" + functional.app_enable(session_browser, 'tor') + _feature_enable(session_browser, 'relay', should_enable=False) + _feature_enable(session_browser, 'relay', should_enable=True) + _assert_feature_enabled(session_browser, 'relay', enabled=True) + assert 'orport' in _get_relay_ports(session_browser) -@then(parsers.parse('tor {port_name:w} port should be displayed')) -def tor_assert_port_displayed(session_browser, port_name): - assert port_name in _get_relay_ports(session_browser) +def test_set_tor_bridge_relay_configuration(session_browser): + """Test setting Tor bridge relay configuration.""" + functional.app_enable(session_browser, 'tor') + _feature_enable(session_browser, 'bridge-relay', should_enable=False) + _feature_enable(session_browser, 'bridge-relay', should_enable=True) + _assert_feature_enabled(session_browser, 'bridge-relay', enabled=True) + assert 'obfs3' in _get_relay_ports(session_browser) + assert 'obfs4' in _get_relay_ports(session_browser) -@given(parsers.parse('tor bridge relay is {enabled:w}')) -def tor_given_bridge_relay_enable(session_browser, enabled): - _feature_enable(session_browser, 'bridge-relay', enabled) - - -@when(parsers.parse('I {enable:w} tor bridge relay')) -def tor_bridge_relay_enable(session_browser, enable): - _feature_enable(session_browser, 'bridge-relay', enable) - - -@then(parsers.parse('tor bridge relay should be {enabled:w}')) -def tor_assert_bridge_relay_enabled(session_browser, enabled): - _assert_feature_enabled(session_browser, 'bridge-relay', enabled) - - -@given(parsers.parse('tor hidden services are {enabled:w}')) -def tor_given_hidden_services_enable(session_browser, enabled): - _feature_enable(session_browser, 'hidden-services', enabled) - - -@when(parsers.parse('I {enable:w} tor hidden services')) -def tor_hidden_services_enable(session_browser, enable): - _feature_enable(session_browser, 'hidden-services', enable) - - -@then(parsers.parse('tor hidden services should be {enabled:w}')) -def tor_assert_hidden_services_enabled(session_browser, enabled): - _assert_feature_enabled(session_browser, 'hidden-services', enabled) - - -@then(parsers.parse('tor hidden services information should be displayed')) -def tor_assert_hidden_services(session_browser): +def test_set_tor_hidden_services_configuration(session_browser): + """Test setting Tor hidden services configuration.""" + functional.app_enable(session_browser, 'tor') + _feature_enable(session_browser, 'hidden-services', should_enable=False) + _feature_enable(session_browser, 'hidden-services', should_enable=True) + _assert_feature_enabled(session_browser, 'hidden-services', enabled=True) _assert_hidden_services(session_browser) -@given(parsers.parse('download software packages over tor is {enabled:w}')) -def tor_given_download_software_over_tor_enable(session_browser, enabled): - _feature_enable(session_browser, 'software', enabled) +def test_set_download_software_packages_over_tor(session_browser): + """Test setting download software packages over Tor.""" + functional.app_enable(session_browser, 'tor') + _feature_enable(session_browser, 'software', should_enable=True) + _feature_enable(session_browser, 'software', should_enable=False) + _assert_feature_enabled(session_browser, 'software', enabled=False) -@when(parsers.parse('I {enable:w} download software packages over tor')) -def tor_download_software_over_tor_enable(session_browser, enable): - _feature_enable(session_browser, 'software', enable) +# TODO: Test more thoroughly by checking same hidden service is restored and by +# actually connecting using Tor. +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + functional.app_enable(session_browser, 'tor') + _feature_enable(session_browser, 'relay', should_enable=True) + _feature_enable(session_browser, 'bridge-relay', should_enable=True) + _feature_enable(session_browser, 'hidden-services', should_enable=True) + functional.backup_create(session_browser, 'tor', 'test_tor') + _feature_enable(session_browser, 'relay', should_enable=False) + _feature_enable(session_browser, 'hidden-services', should_enable=False) + functional.backup_restore(session_browser, 'tor', 'test_tor') -@then( - parsers.parse('download software packages over tor should be {enabled:w}')) -def tor_assert_download_software_over_tor(session_browser, enabled): - _assert_feature_enabled(session_browser, 'software', enabled) + assert functional.service_is_running(session_browser, 'tor') + _assert_feature_enabled(session_browser, 'relay', enabled=True) + _assert_feature_enabled(session_browser, 'bridge-relay', enabled=True) + _assert_feature_enabled(session_browser, 'hidden-services', enabled=True) def _feature_enable(browser, feature, should_enable): """Enable/disable a Tor feature.""" - if not isinstance(should_enable, bool): - should_enable = should_enable in ('enable', 'enabled') - element_name = _TOR_FEATURE_TO_ELEMENT[feature] functional.nav_to_module(browser, 'tor') checkbox_element = browser.find_by_name(element_name).first @@ -113,9 +116,6 @@ def _feature_enable(browser, feature, should_enable): def _assert_feature_enabled(browser, feature, enabled): """Assert whether Tor relay is enabled or disabled.""" - if not isinstance(enabled, bool): - enabled = enabled in ('enable', 'enabled') - element_name = _TOR_FEATURE_TO_ELEMENT[feature] functional.nav_to_module(browser, 'tor') assert browser.find_by_name(element_name).first.checked == enabled diff --git a/plinth/modules/tor/tests/tor.feature b/plinth/modules/tor/tests/tor.feature deleted file mode 100644 index 4bd1f46f9..000000000 --- a/plinth/modules/tor/tests/tor.feature +++ /dev/null @@ -1,60 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @tor -Feature: Tor Anonymity Network - Manage Tor configuration. - -Background: - Given I'm a logged in user - Given the tor application is installed - -Scenario: Enable tor application - Given the tor application is disabled - When I enable the tor application - Then the tor service should be running - -Scenario: Set tor relay configuration - Given tor relay is disabled - When I enable tor relay - Then tor relay should be enabled - And tor orport port should be displayed - -Scenario: Set tor bridge relay configuration - Given tor bridge relay is disabled - When I enable tor bridge relay - Then tor bridge relay should be enabled - And tor obfs3 port should be displayed - And tor obfs4 port should be displayed - -Scenario: Set tor hidden services configuration - Given tor hidden services are disabled - When I enable tor hidden services - Then tor hidden services should be enabled - And tor hidden services information should be displayed - -Scenario: Set download software packages over tor - Given download software packages over tor is enabled - When I disable download software packages over tor - Then download software packages over tor should be disabled - -# TODO: Test more thoroughly by checking same hidden service is restored and by -# actually connecting using Tor. -@backups -Scenario: Backup and restore tor - Given the tor application is enabled - And tor relay is enabled - And tor bridge relay is enabled - And tor hidden services are enabled - When I create a backup of the tor app data with name test_tor - And I disable tor relay - And I disable tor hidden services - And I restore the tor app data backup with name test_tor - Then the tor service should be running - And tor relay should be enabled - And tor bridge relay should be enabled - And tor hidden services should be enabled - -Scenario: Disable tor application - Given the tor application is enabled - When I disable the tor application - Then the tor service should not be running diff --git a/plinth/modules/transmission/data/lib/systemd/system/transmission-daemon.service.d/freedombox.conf b/plinth/modules/transmission/data/usr/lib/systemd/system/transmission-daemon.service.d/freedombox.conf similarity index 100% rename from plinth/modules/transmission/data/lib/systemd/system/transmission-daemon.service.d/freedombox.conf rename to plinth/modules/transmission/data/usr/lib/systemd/system/transmission-daemon.service.d/freedombox.conf diff --git a/plinth/modules/transmission/tests/test_functional.py b/plinth/modules/transmission/tests/test_functional.py index 68e8341e8..457e670e2 100644 --- a/plinth/modules/transmission/tests/test_functional.py +++ b/plinth/modules/transmission/tests/test_functional.py @@ -5,27 +5,58 @@ Functional, browser based tests for transmission app. import os -from pytest_bdd import parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('transmission.feature') +pytestmark = [pytest.mark.apps, pytest.mark.transmission, pytest.mark.sso] -@when('all torrents are removed from transmission') -def transmission_remove_all_torrents(session_browser): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'transmission') + yield + functional.app_disable(session_browser, 'transmission') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'transmission') + + functional.app_enable(session_browser, 'transmission') + assert functional.is_available(session_browser, 'transmission') + + functional.app_disable(session_browser, 'transmission') + assert not functional.is_available(session_browser, 'transmission') + + +def test_upload_torrent(session_browser): + """Test uploading a torrent to Transmission.""" + functional.app_enable(session_browser, 'transmission') _remove_all_torrents(session_browser) - - -@when('I upload a sample torrent to transmission') -def transmission_upload_sample_torrent(session_browser): _upload_sample_torrent(session_browser) + _assert_number_of_torrents(session_browser, 1) -@then( - parsers.parse( - 'there should be {torrents_number:d} torrents listed in transmission')) -def transmission_assert_number_of_torrents(session_browser, torrents_number): +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, 'transmission') + _remove_all_torrents(session_browser) + _upload_sample_torrent(session_browser) + functional.backup_create(session_browser, 'transmission', + 'test_transmission') + + _remove_all_torrents(session_browser) + functional.backup_restore(session_browser, 'transmission', + 'test_transmission') + + assert functional.service_is_running(session_browser, 'transmission') + _assert_number_of_torrents(session_browser, 1) + + +def _assert_number_of_torrents(session_browser, torrents_number): functional.visit(session_browser, '/transmission') assert functional.eventually( lambda: torrents_number == _get_number_of_torrents(session_browser)) diff --git a/plinth/modules/transmission/tests/transmission.feature b/plinth/modules/transmission/tests/transmission.feature deleted file mode 100644 index bec006c7b..000000000 --- a/plinth/modules/transmission/tests/transmission.feature +++ /dev/null @@ -1,36 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @transmission @sso -Feature: Transmission BitTorrent Client - Run the Transmission BitTorrent client. - -Background: - Given I'm a logged in user - Given the transmission application is installed - -Scenario: Enable transmission application - Given the transmission application is disabled - When I enable the transmission application - Then the transmission site should be available - -Scenario: Upload a torrent to transmission - Given the transmission application is enabled - When all torrents are removed from transmission - And I upload a sample torrent to transmission - Then there should be 1 torrents listed in transmission - -@backups -Scenario: Backup and restore transmission - Given the transmission application is enabled - When all torrents are removed from transmission - And I upload a sample torrent to transmission - And I create a backup of the transmission app data with name test_transmission - And all torrents are removed from transmission - And I restore the transmission app data backup with name test_transmission - Then the transmission service should be running - And there should be 1 torrents listed in transmission - -Scenario: Disable transmission application - Given the transmission application is enabled - When I disable the transmission application - Then the transmission site should not be available diff --git a/plinth/modules/ttrss/data/usr/lib/systemd/system/tt-rss.service.d/freedombox.conf b/plinth/modules/ttrss/data/usr/lib/systemd/system/tt-rss.service.d/freedombox.conf new file mode 100644 index 000000000..e5c1a5d7a --- /dev/null +++ b/plinth/modules/ttrss/data/usr/lib/systemd/system/tt-rss.service.d/freedombox.conf @@ -0,0 +1,35 @@ +# Restart the service every 120 seconds always. When tt-rss can't connect to a +# database temporarily, it will exist with exit code 101. 120 seconds is the +# default daemon sleep interval for tt-rss. +[Service] +CacheDirectory=tt-rss +CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_IPC_OWNER CAP_NET_ADMIN CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE CAP_KILL CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW CAP_LINUX_IMMUTABLE CAP_IPC_LOCK CAP_SYS_CHROOT CAP_BLOCK_SUSPEND CAP_LEASE CAP_SYS_PACCT CAP_SYS_TTY_CONFIG CAP_SYS_BOOT CAP_MAC_ADMIN CAP_MAC_OVERRIDE CAP_SYS_NICE CAP_SYS_RESOURCE +DevicePolicy=closed +LockPersonality=yes +NoNewPrivileges=yes +PrivateDevices=yes +PrivateMounts=yes +PrivateTmp=yes +PrivateUsers=yes +ProtectControlGroups=yes +ProtectClock=yes +ProtectHome=yes +ProtectHostname=yes +ProtectKernelLogs=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +ProtectProc=invisible +ProtectSystem=strict +RemoveIPC=yes +Restart=always +RestartSec=120s +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 +RestrictNamespaces=yes +RestrictSUIDSGID=yes +RestrictRealtime=yes +StateDirectory=tt-rss +SystemCallArchitectures=native +SystemCallFilter=@system-service +SystemCallFilter=~@resources +SystemCallFilter=~@privileged +SystemCallErrorNumber=EPERM diff --git a/plinth/modules/ttrss/tests/test_functional.py b/plinth/modules/ttrss/tests/test_functional.py index c67d99f52..b47202b6e 100644 --- a/plinth/modules/ttrss/tests/test_functional.py +++ b/plinth/modules/ttrss/tests/test_functional.py @@ -3,25 +3,46 @@ Functional, browser based tests for ttrss app. """ -from pytest_bdd import given, scenarios, then, when +import pytest from plinth.tests import functional -scenarios('ttrss.feature') +APP_ID = 'ttrss' + +pytestmark = [pytest.mark.apps, pytest.mark.ttrss, pytest.mark.sso] -@given('I subscribe to a feed in ttrss') -def ttrss_subscribe(session_browser): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, APP_ID) + yield + functional.app_disable(session_browser, APP_ID) + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, APP_ID) + + functional.app_enable(session_browser, APP_ID) + assert functional.service_is_running(session_browser, APP_ID) + + functional.app_disable(session_browser, APP_ID) + assert functional.service_is_not_running(session_browser, APP_ID) + + +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, APP_ID) _subscribe(session_browser) + functional.backup_create(session_browser, APP_ID, 'test_ttrss') - -@when('I unsubscribe from the feed in ttrss') -def ttrss_unsubscribe(session_browser): _unsubscribe(session_browser) + functional.backup_restore(session_browser, APP_ID, 'test_ttrss') - -@then('I should be subscribed to the feed in ttrss') -def ttrss_assert_subscribed(session_browser): + assert functional.service_is_running(session_browser, APP_ID) assert _is_subscribed(session_browser) @@ -38,12 +59,7 @@ def _is_feed_shown(browser, invert=False): def _click_main_menu_item(browser, text): """Select an item from the main actions menu.""" - burger_menu = browser.find_by_xpath('//*[contains(@title, "Actions...")]') - if burger_menu: - burger_menu.click() - else: - browser.find_by_text('Actions...').click() - + browser.find_by_css('.action-chooser').click() browser.find_by_text(text).click() @@ -67,12 +83,6 @@ def _subscribe(browser): browser.find_by_text('Cancel').click() functional.eventually(lambda: not add_dialog.visible) - expand = browser.find_by_css('span.dijitTreeExpandoClosed') - if expand: - functional.eventually(expand.first.click) - - assert functional.eventually(_is_feed_shown, [browser]) - def _unsubscribe(browser): """Unsubscribe from a feed in TT-RSS.""" @@ -96,4 +106,4 @@ def _unsubscribe(browser): def _is_subscribed(browser): """Return whether subscribed to a feed in TT-RSS.""" _ttrss_load_main_interface(browser) - return browser.is_text_present('Planet Debian') + return _is_feed_shown(browser) diff --git a/plinth/modules/ttrss/tests/ttrss.feature b/plinth/modules/ttrss/tests/ttrss.feature deleted file mode 100644 index b1efdfa80..000000000 --- a/plinth/modules/ttrss/tests/ttrss.feature +++ /dev/null @@ -1,29 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @ttrss @sso -Feature: TT-RSS News Feed Reader - Run TT-RSS News Feed Reader. - -Background: - Given I'm a logged in user - Given the ttrss application is installed - -Scenario: Enable ttrss application - Given the ttrss application is disabled - When I enable the ttrss application - Then the ttrss service should be running - -@backups -Scenario: Backup and restore ttrss - Given the ttrss application is enabled - And I subscribe to a feed in ttrss - When I create a backup of the ttrss app data with name test_ttrss - And I unsubscribe from the feed in ttrss - And I restore the ttrss app data backup with name test_ttrss - Then the ttrss service should be running - And I should be subscribed to the feed in ttrss - -Scenario: Disable ttrss application - Given the ttrss application is enabled - When I disable the ttrss application - Then the ttrss service should not be running diff --git a/plinth/modules/upgrades/data/lib/systemd/system/freedombox-manual-upgrade.service b/plinth/modules/upgrades/data/usr/lib/systemd/system/freedombox-manual-upgrade.service similarity index 100% rename from plinth/modules/upgrades/data/lib/systemd/system/freedombox-manual-upgrade.service rename to plinth/modules/upgrades/data/usr/lib/systemd/system/freedombox-manual-upgrade.service diff --git a/plinth/modules/upgrades/tests/test_functional.py b/plinth/modules/upgrades/tests/test_functional.py index 48e2c60fd..22fb94106 100644 --- a/plinth/modules/upgrades/tests/test_functional.py +++ b/plinth/modules/upgrades/tests/test_functional.py @@ -3,29 +3,40 @@ Functional, browser based tests for upgrades app. """ -from pytest_bdd import given, parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('upgrades.feature') +pytestmark = [pytest.mark.system, pytest.mark.essential, pytest.mark.upgrades] -@given(parsers.parse('automatic upgrades are {enabled:w}')) -def upgrades_given_enable_automatic(session_browser, enabled): - should_enable = (enabled == 'enabled') - _enable_automatic(session_browser, should_enable) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login.""" + functional.login(session_browser) + yield + _enable_automatic(session_browser, False) -@when(parsers.parse('I {enable:w} automatic upgrades')) -def upgrades_enable_automatic(session_browser, enable): - should_enable = (enable == 'enable') - _enable_automatic(session_browser, should_enable) +def test_enable_automatic_upgrades(session_browser): + """Test enabling automatic upgrades.""" + _enable_automatic(session_browser, False) + _enable_automatic(session_browser, True) + assert _get_automatic(session_browser) + + _enable_automatic(session_browser, False) + assert not _get_automatic(session_browser) -@then(parsers.parse('automatic upgrades should be {enabled:w}')) -def upgrades_assert_automatic(session_browser, enabled): - should_be_enabled = (enabled == 'enabled') - assert _get_automatic(session_browser) == should_be_enabled +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + _enable_automatic(session_browser, True) + functional.backup_create(session_browser, 'upgrades', 'test_upgrades') + + _enable_automatic(session_browser, False) + functional.backup_restore(session_browser, 'upgrades', 'test_upgrades') + + assert _get_automatic(session_browser) def _enable_automatic(browser, should_enable): diff --git a/plinth/modules/upgrades/tests/upgrades.feature b/plinth/modules/upgrades/tests/upgrades.feature deleted file mode 100644 index e828c7afc..000000000 --- a/plinth/modules/upgrades/tests/upgrades.feature +++ /dev/null @@ -1,26 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@essential @upgrades @system -Feature: Software Upgrades - Configure automatic software upgrades - -Background: - Given I'm a logged in user - -Scenario: Enable automatic upgrades - Given automatic upgrades are disabled - When I enable automatic upgrades - Then automatic upgrades should be enabled - -@backups -Scenario: Backup and restore upgrades - When I enable automatic upgrades - And I create a backup of the upgrades app data with name test_upgrades - And I disable automatic upgrades - And I restore the upgrades app data backup with name test_upgrades - Then automatic upgrades should be enabled - -Scenario: Disable automatic upgrades - Given automatic upgrades are enabled - When I disable automatic upgrades - Then automatic upgrades should be disabled diff --git a/plinth/modules/upgrades/views.py b/plinth/modules/upgrades/views.py index 3d17ca3a7..911fd3dfa 100644 --- a/plinth/modules/upgrades/views.py +++ b/plinth/modules/upgrades/views.py @@ -114,7 +114,8 @@ def get_log(): def _is_updating(): """Check if manually triggered update is running.""" command = ['systemctl', 'is-active', 'freedombox-manual-upgrade'] - result = subprocess.run(command, capture_output=True, text=True) + result = subprocess.run(command, capture_output=True, text=True, + check=False) return str(result.stdout).startswith('activ') # 'active' or 'activating' diff --git a/plinth/modules/users/forms.py b/plinth/modules/users/forms.py index 3c2333685..aa310ab44 100644 --- a/plinth/modules/users/forms.py +++ b/plinth/modules/users/forms.py @@ -19,7 +19,6 @@ from plinth import actions from plinth.errors import ActionError from plinth.modules import first_boot from plinth.modules.security import set_restricted_access -from plinth.translation import set_language from plinth.utils import is_user_admin from . import get_last_admin_user @@ -210,19 +209,21 @@ class UserUpdateForm(ValidNewUsernameCheckMixin, PasswordConfirmForm, }) 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 - for c in sorted(self.fields['groups'].choices, key=lambda x: x[1]): - # Handle case where groups exist in database for - # applications not installed yet. - if c[1] in group_choices: - # Replace group names with descriptions - if c[1] == 'admin' and self.is_last_admin_user: - choices.append((c[0], { - 'label': group_choices[c[1]], - 'readonly': True - })) - else: - choices.append((c[0], group_choices[c[1]])) + # 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 @@ -242,10 +243,6 @@ class UserUpdateForm(ValidNewUsernameCheckMixin, PasswordConfirmForm, auth_username = self.request.user.username confirm_password = self.cleaned_data['confirm_password'] - # If user is updating their own profile then only translate the pages - if self.username == auth_username: - set_language(self.request, None, user.userprofile.language) - if commit: user.save() self.save_m2m() @@ -323,18 +320,20 @@ class UserUpdateForm(ValidNewUsernameCheckMixin, PasswordConfirmForm, return user - def validate_last_admin_user(self, groups): - group_names = [group.name for group in groups] - if 'admin' not in group_names: - raise ValidationError( - _('Cannot delete the only administrator in the system.')) + def clean_groups(self): + """Validate groups to ensure admin group for last admin. - def clean(self): - """Override clean to add form validation logic.""" - cleaned_data = super().clean() + For the last admin user, we disable the checkbox for 'admin' group so + that it can't be unchecked. However, this means that browser will no + longer submit that value. Forcefully add 'admin' group in this case. + + """ + groups = self.cleaned_data['groups'] if self.is_last_admin_user: - self.validate_last_admin_user(cleaned_data.get("groups")) - return cleaned_data + groups = groups | self.fields['groups'].queryset.filter( + **{'name': 'admin'}) + + return groups class UserChangePasswordForm(PasswordConfirmForm, SetPasswordForm): diff --git a/plinth/modules/users/tests/test_actions.py b/plinth/modules/users/tests/test_actions.py index 5c038e814..832077d4e 100644 --- a/plinth/modules/users/tests/test_actions.py +++ b/plinth/modules/users/tests/test_actions.py @@ -138,12 +138,11 @@ def fixture_auto_cleanup_users_groups(needs_root, load_cfg): _delete_group(group) -def _call_action(arguments, **kwargs): +def _call_action(arguments, check=True, **kwargs): """Call the action script.""" kwargs['stdout'] = kwargs.get('stdout', subprocess.PIPE) kwargs['stderr'] = kwargs.get('stderr', subprocess.PIPE) - kwargs['check'] = kwargs.get('check', True) - return subprocess.run([_action_file()] + arguments, **kwargs) + return subprocess.run([_action_file()] + arguments, check=check, **kwargs) def _create_user(username=None, groups=None): diff --git a/plinth/modules/users/tests/test_functional.py b/plinth/modules/users/tests/test_functional.py index 6e6ecfe2c..467b18c5c 100644 --- a/plinth/modules/users/tests/test_functional.py +++ b/plinth/modules/users/tests/test_functional.py @@ -3,17 +3,19 @@ Functional, browser based tests for users app. """ +# TODO Scenario: Add user to wiki group +# TODO Scenario: Remove user from wiki group + import subprocess import urllib import pytest -from pytest_bdd import given, parsers, scenarios, then, when from plinth.tests import functional _admin_password = functional.config['DEFAULT']['password'] -scenarios('users.feature') +pytestmark = [pytest.mark.system, pytest.mark.essential, pytest.mark.users] _language_codes = { 'None': '', @@ -50,26 +52,150 @@ _config_page_title_language_map = { } -@given(parsers.parse('the admin user {name:w} exists')) -def admin_user_exists(session_browser, name): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login.""" + functional.login(session_browser) + yield + _set_language(session_browser, _language_codes['None']) + + +def test_create_user(session_browser): + """Test creating a user.""" + if functional.user_exists(session_browser, 'alice'): + functional.delete_user(session_browser, 'alice') + + functional.create_user(session_browser, 'alice') + assert functional.user_exists(session_browser, 'alice') + + +def test_rename_user(session_browser): + """Test renaming a user.""" + _non_admin_user_exists(session_browser, 'alice') + if functional.user_exists(session_browser, 'bob'): + functional.delete_user(session_browser, 'bob') + + _rename_user(session_browser, 'alice', 'bob') + assert not functional.user_exists(session_browser, 'alice') + assert functional.user_exists(session_browser, 'bob') + + +def test_admin_users_can_change_own_ssh_keys(session_browser): + """Test that admin users can change their own ssh keys.""" + _set_ssh_keys(session_browser, 'somekey123') + assert _get_ssh_keys(session_browser) == 'somekey123' + + +def test_non_admin_users_can_change_own_ssh_keys(session_browser): + """Test that non-admin users can change their own ssh keys.""" + _non_admin_user_exists(session_browser, 'alice') + functional.login_with_account(session_browser, functional.base_url, + 'alice') + _set_ssh_keys(session_browser, 'somekey456') + assert _get_ssh_keys(session_browser) == 'somekey456' + functional.login(session_browser) + + +def test_admin_users_can_change_other_users_ssh_keys(session_browser): + """Test that admin users can change other user's ssh keys.""" + _non_admin_user_exists(session_browser, 'alice') + _set_ssh_keys(session_browser, 'alicesomekey123', username='alice') + assert _get_ssh_keys(session_browser, + username='alice') == 'alicesomekey123' + + +def test_users_can_remove_ssh_keys(session_browser): + """Test that users can remove ssh keys.""" + _set_ssh_keys(session_browser, 'somekey123') + _set_ssh_keys(session_browser, '') + assert _get_ssh_keys(session_browser) == '' + + +def test_users_can_connect_passwordless_over_ssh(session_browser, + tmp_path_factory): + """Test that users can connect passwordless over ssh if the keys are + set.""" + functional.app_enable(session_browser, 'ssh') + _generate_ssh_keys(session_browser, tmp_path_factory) + _configure_ssh_keys(session_browser, tmp_path_factory) + _should_connect_passwordless_over_ssh(session_browser, tmp_path_factory) + + +def test_users_cannot_connect_passwordless_over_ssh(session_browser, + tmp_path_factory): + """Test that users cannot connect passwordless over ssh if the keys aren't + set.""" + functional.app_enable(session_browser, 'ssh') + _generate_ssh_keys(session_browser, tmp_path_factory) + _configure_ssh_keys(session_browser, tmp_path_factory) + _set_ssh_keys(session_browser, '') + _should_not_connect_passwordless_over_ssh(session_browser, + tmp_path_factory) + + +@pytest.mark.parametrize('language_code', _language_codes.values()) +def test_change_language(session_browser, language_code): + """Test changing the language.""" + _set_language(session_browser, language_code) + assert _check_language(session_browser, language_code) + + +def test_admin_users_can_set_others_as_inactive(session_browser): + """Test that admin users can set other users as inactive.""" + _non_admin_user_exists(session_browser, 'alice') + _set_user_inactive(session_browser, 'alice') + _cannot_log_in(session_browser, 'alice') + functional.login(session_browser) + + +def test_admin_users_can_change_own_password(session_browser): + """Test that admin users can change their own password.""" + _admin_user_exists(session_browser, 'testadmin') + functional.login_with_account(session_browser, functional.base_url, + 'testadmin') + _change_password(session_browser, 'newpassword456') + _can_log_in_with_password(session_browser, 'testadmin', 'newpassword456') + functional.login(session_browser) + + +def test_admin_users_can_change_others_password(session_browser): + """Test that admin users can change other user's password.""" + _non_admin_user_exists(session_browser, 'alice') + _change_password(session_browser, 'secretsecret567', username='alice') + _can_log_in_with_password(session_browser, 'alice', 'secretsecret567') + functional.login(session_browser) + + +def test_non_admin_users_can_change_own_password(session_browser): + """Test that non-admin users can change their own password.""" + _non_admin_user_exists(session_browser, 'alice') + functional.login_with_account(session_browser, functional.base_url, + 'alice') + _change_password(session_browser, 'newpassword123') + _can_log_in_with_password(session_browser, 'alice', 'newpassword123') + functional.login(session_browser) + + +def test_delete_user(session_browser): + """Test deleting a user.""" + _non_admin_user_exists(session_browser, 'alice') + functional.delete_user(session_browser, 'alice') + assert not functional.user_exists(session_browser, 'alice') + + +def _admin_user_exists(session_browser, name): if functional.user_exists(session_browser, name): functional.delete_user(session_browser, name) functional.create_user(session_browser, name, groups=['admin']) -@given(parsers.parse("the user {name:w} doesn't exist")) -def user_does_not_exist(session_browser, name): +def _non_admin_user_exists(session_browser, name): if functional.user_exists(session_browser, name): functional.delete_user(session_browser, name) + functional.create_user(session_browser, name) -@given(parsers.parse('the ssh keys are {ssh_keys:w}')) -def ssh_keys(session_browser, ssh_keys): - _set_ssh_keys(session_browser, ssh_keys) - - -@given('the client has a ssh key') -def generate_ssh_keys(session_browser, tmp_path_factory): +def _generate_ssh_keys(session_browser, tmp_path_factory): key_file = tmp_path_factory.getbasetemp() / 'users-ssh.key' try: key_file.unlink() @@ -81,147 +207,43 @@ def generate_ssh_keys(session_browser, tmp_path_factory): str(key_file)]) -@when(parsers.parse('I create a user named {name:w}')) -def create_user(session_browser, name): - functional.create_user(session_browser, name) - - -@when(parsers.parse('I rename the user {old_name:w} to {new_name:w}')) -def rename_user(session_browser, old_name, new_name): - _rename_user(session_browser, old_name, new_name) - - -@when(parsers.parse('I delete the user {name:w}')) -def delete_user(session_browser, name): - functional.delete_user(session_browser, name) - - -@when('I change the language to ') -def change_language(session_browser, language): - _set_language(session_browser, _language_codes[language]) - - -@when(parsers.parse('I change the ssh keys to {ssh_keys:w}')) -def change_ssh_keys(session_browser, ssh_keys): - _set_ssh_keys(session_browser, ssh_keys) - - -@when('I remove the ssh keys') -def remove_ssh_keys(session_browser): - _set_ssh_keys(session_browser, '') - - -@when( - parsers.parse( - 'I change the ssh keys to {ssh_keys:w} for the user {username:w}')) -def change_user_ssh_keys(session_browser, ssh_keys, username): - _set_ssh_keys(session_browser, ssh_keys, username=username) - - -@when(parsers.parse('I change my ssh keys to {ssh_keys:w}')) -def change_my_ssh_keys(session_browser, ssh_keys): - _set_ssh_keys(session_browser, ssh_keys) - - -@when(parsers.parse('I set the user {username:w} as inactive')) -def set_user_inactive(session_browser, username): - _set_user_inactive(session_browser, username) - - -@when(parsers.parse('I change my password to {new_password:w}')) -def change_my_password(session_browser, new_password): - _change_password(session_browser, new_password) - - -@when( - parsers.parse( - 'I change the user {username:w} password to {new_password:w}')) -def change_other_user_password(session_browser, username, new_password): - _change_password(session_browser, new_password, username=username) - - -@when('I configure the ssh keys') -def configure_ssh_keys(session_browser, tmp_path_factory): +def _configure_ssh_keys(session_browser, tmp_path_factory): public_key_file = tmp_path_factory.getbasetemp() / 'users-ssh.key.pub' public_key = public_key_file.read_text() _set_ssh_keys(session_browser, public_key) -@then(parsers.parse('I can log in as the user {username:w}')) -def can_log_in(session_browser, username): +def _can_log_in(session_browser, username): functional.login_with_account(session_browser, functional.base_url, username) assert len(session_browser.find_by_id('id_user_menu')) > 0 -@then( - parsers.parse( - 'I can log in as the user {username:w} with password {password:w}')) -def can_log_in_with_password(session_browser, username, password): +def _can_log_in_with_password(session_browser, username, password): functional.logout(session_browser) functional.login_with_account(session_browser, functional.base_url, username, password) assert len(session_browser.find_by_id('id_user_menu')) > 0 -@then(parsers.parse("I can't log in as the user {username:w}")) -def cannot_log_in(session_browser, username): +def _cannot_log_in(session_browser, username): functional.login_with_account(session_browser, functional.base_url, username) assert len(session_browser.find_by_id('id_user_menu')) == 0 -@then('Plinth language should be ') -def plinth_language_should_be(session_browser, language): - assert _check_language(session_browser, _language_codes[language]) - - -@then(parsers.parse('the ssh keys should be {ssh_keys:w}')) -def ssh_keys_match(session_browser, ssh_keys): - assert _get_ssh_keys(session_browser) == ssh_keys - - -@then('the ssh keys should be removed') -def ssh_keys_should_be_removed(session_browser, ssh_keys): - assert _get_ssh_keys(session_browser) == '' - - -@then( - parsers.parse( - 'the ssh keys should be {ssh_keys:w} for the user {username:w}')) -def ssh_keys_match_for_user(session_browser, ssh_keys, username): - assert _get_ssh_keys(session_browser, username=username) == ssh_keys - - -@then(parsers.parse('my ssh keys should be {ssh_keys:w}')) -def my_ssh_keys_match(session_browser, ssh_keys): - assert _get_ssh_keys(session_browser) == ssh_keys - - -@then('the client should be able to connect passwordless over ssh') -def should_connect_passwordless_over_ssh(session_browser, tmp_path_factory): +def _should_connect_passwordless_over_ssh(session_browser, tmp_path_factory): key_file = tmp_path_factory.getbasetemp() / 'users-ssh.key' _try_login_to_ssh(key_file=key_file) -@then("the client shouldn't be able to connect passwordless over ssh") -def should_not_connect_passwordless_over_ssh(session_browser, - tmp_path_factory): +def _should_not_connect_passwordless_over_ssh(session_browser, + tmp_path_factory): key_file = tmp_path_factory.getbasetemp() / 'users-ssh.key' with pytest.raises(subprocess.CalledProcessError): _try_login_to_ssh(key_file=key_file) -@then(parsers.parse('{name:w} should be listed as a user')) -def new_user_is_listed(session_browser, name): - assert functional.user_exists(session_browser, name) - - -@then(parsers.parse('{name:w} should not be listed as a user')) -def new_user_is_not_listed(session_browser, name): - assert not functional.user_exists(session_browser, name) - - def _rename_user(browser, old_name, new_name): functional.nav_to_module(browser, 'users') with functional.wait_for_page_update(browser): diff --git a/plinth/modules/users/tests/users.feature b/plinth/modules/users/tests/users.feature deleted file mode 100644 index 8f56ab348..000000000 --- a/plinth/modules/users/tests/users.feature +++ /dev/null @@ -1,105 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -# TODO Scenario: Add user to wiki group -# TODO Scenario: Remove user from wiki group - -@system @essential @users -Feature: Users and Groups - Manage users and groups. - -Background: - Given I'm a logged in user - -Scenario: Create user - Given the user alice doesn't exist - When I create a user named alice - Then alice should be listed as a user - -Scenario: Rename user - Given the user alice exists - Given the user bob doesn't exist - When I rename the user alice to bob - Then alice should not be listed as a user - And bob should be listed as a user - -Scenario: Admin users can change their own ssh keys - When I change the ssh keys to somekey123 - Then the ssh keys should be somekey123 - -Scenario: Non-admin users can change their own ssh keys - Given the user alice exists - And I'm logged in as the user alice - When I change my ssh keys to somekey456 - Then my ssh keys should be somekey456 - -Scenario: Admin users can change other user's ssh keys - Given the user alice exists - When I change the ssh keys to alicesomekey123 for the user alice - Then the ssh keys should be alicesomekey123 for the user alice - -Scenario: Users can remove ssh keys - Given the ssh keys are somekey123 - When I remove the ssh keys - Then the ssh keys should be removed - -Scenario: Users can connect passwordless over ssh if the keys are set - Given the ssh application is enabled - And the client has a ssh key - When I configure the ssh keys - Then the client should be able to connect passwordless over ssh - -Scenario: Users can't connect passwordless over ssh if the keys aren't set - Given the ssh application is enabled - And the client has a ssh key - And the ssh keys are configured - When I remove the ssh keys - Then the client shouldn't be able to connect passwordless over ssh - - -Scenario Outline: Change language - When I change the language to - Then Plinth language should be - - Examples: - | language | - | dansk | - | Deutsch | - | español | - | français | - | norsk (bokmål) | - | Nederlands | - | polski | - | Português | - | Русский | - | svenska | - | తెలుగు | - | Türkçe | - | 简体中文 | - | None | - -Scenario: Admin users can set other users an inactive - Given the user alice exists - When I set the user alice as inactive - Then I can't log in as the user alice - -Scenario: Admin users can change their own password - Given the user testadmin in group admin exists - And I'm logged in as the user testadmin - When I change my password to newpassword456 - Then I can log in as the user testadmin with password newpassword456 - -Scenario: Admin user can change other user's password - Given the user alice exists - When I change the user alice password to secretsecret567 - Then I can log in as the user alice with password secretsecret567 - -Scenario: Non-admin users can change their own password - Given the user alice exists - And I'm logged in as the user alice - When I change my password to newpassword123 - Then I can log in as the user alice with password newpassword123 - -Scenario: Delete user - Given the user alice exists - When I delete the user alice - Then alice should not be listed as a user diff --git a/plinth/modules/users/views.py b/plinth/modules/users/views.py index c7cb8bfc0..c0ea7986e 100644 --- a/plinth/modules/users/views.py +++ b/plinth/modules/users/views.py @@ -13,7 +13,7 @@ from django.utils.translation import gettext_lazy from django.views.generic.edit import (CreateView, DeleteView, FormView, UpdateView) -from plinth import actions +from plinth import actions, translation from plinth.errors import ActionError from plinth.modules import first_boot from plinth.utils import is_user_admin @@ -108,6 +108,18 @@ class UserUpdate(ContextMixin, SuccessMessageMixin, UpdateView): """Return the URL to redirect to in case of successful updation.""" return reverse('users:edit', kwargs={'slug': self.object.username}) + def form_valid(self, form): + """Set the user language if necessary.""" + response = super().form_valid(form) + + # If user is updating their own profile then set the language for + # current session too. + if self.object.username == self.request.user.username: + translation.set_language(self.request, response, + self.request.user.userprofile.language) + + return response + class UserDelete(ContextMixin, DeleteView): """Handle deleting users, showing a confirmation dialog first. diff --git a/plinth/modules/wordpress/data/lib/systemd/system/wordpress-freedombox.service b/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service similarity index 96% rename from plinth/modules/wordpress/data/lib/systemd/system/wordpress-freedombox.service rename to plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service index c25e0ac2a..b7bcdaf72 100644 --- a/plinth/modules/wordpress/data/lib/systemd/system/wordpress-freedombox.service +++ b/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service @@ -3,6 +3,7 @@ [Unit] Description=WordPress Scheduled Events Trigger (Cron) Documentation=https://rtcamp.com/tutorials/wordpress/wp-cron-crontab/ +ConditionPathExists=/etc/wordpress/config-default.php [Service] CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_IPC_OWNER CAP_NET_ADMIN CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE CAP_KILL CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_LINUX_IMMUTABLE CAP_IPC_LOCK CAP_SYS_CHROOT CAP_BLOCK_SUSPEND CAP_LEASE CAP_SYS_PACCT CAP_SYS_TTY_CONFIG CAP_SYS_BOOT CAP_MAC_ADMIN CAP_MAC_OVERRIDE CAP_SYS_NICE CAP_SYS_RESOURCE diff --git a/plinth/modules/wordpress/data/lib/systemd/system/wordpress-freedombox.timer b/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.timer similarity index 100% rename from plinth/modules/wordpress/data/lib/systemd/system/wordpress-freedombox.timer rename to plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.timer diff --git a/plinth/modules/zoph/tests/test_functional.py b/plinth/modules/zoph/tests/test_functional.py index f0ebab73a..854f7fb75 100644 --- a/plinth/modules/zoph/tests/test_functional.py +++ b/plinth/modules/zoph/tests/test_functional.py @@ -3,14 +3,42 @@ Functional, browser based tests for zoph app. """ -from pytest_bdd import given, parsers, scenarios - +import pytest from plinth.tests import functional -scenarios('zoph.feature') +pytestmark = [pytest.mark.apps, pytest.mark.zoph] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'zoph') + _zoph_is_setup(session_browser) + yield + functional.app_disable(session_browser, 'zoph') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'zoph') + + functional.app_enable(session_browser, 'zoph') + assert functional.app_is_enabled(session_browser, 'zoph') + + functional.app_disable(session_browser, 'zoph') + assert not functional.app_is_enabled(session_browser, 'zoph') + + +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore.""" + functional.app_enable(session_browser, 'zoph') + functional.backup_create(session_browser, 'zoph', 'test_zoph') + functional.backup_restore(session_browser, 'zoph', 'test_zoph') + assert functional.app_is_enabled(session_browser, 'zoph') -@given(parsers.parse('the zoph application is setup')) def _zoph_is_setup(session_browser): """Click setup button on the setup page.""" functional.nav_to_module(session_browser, 'zoph') diff --git a/plinth/modules/zoph/tests/zoph.feature b/plinth/modules/zoph/tests/zoph.feature deleted file mode 100644 index e7c655794..000000000 --- a/plinth/modules/zoph/tests/zoph.feature +++ /dev/null @@ -1,27 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @zoph -Feature: Zoph Organises PHotos - Run photo organiser - -Background: - Given I'm a logged in user - Given the zoph application is installed - Given the zoph application is setup - -Scenario: Enable zoph application - Given the zoph application is disabled - When I enable the zoph application - Then the zoph application is enabled - -@backups -Scenario: Backup and restore zoph - Given the zoph application is enabled - When I create a backup of the zoph app data with name test_zoph - And I restore the zoph app data backup with name test_zoph - Then the zoph application is enabled - -Scenario: Disable zoph application - Given the zoph application is enabled - When I disable the zoph application - Then the zoph application is disabled diff --git a/plinth/package.py b/plinth/package.py index c6221a0c9..617a4b3fd 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -7,11 +7,14 @@ import json import logging import subprocess import threading +from typing import Union +import apt.cache from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy from plinth import actions +from plinth.errors import ActionError from plinth.utils import format_lazy logger = logging.getLogger(__name__) @@ -195,3 +198,30 @@ def filter_conffile_prompt_packages(packages): 'packages', ['filter-conffile-packages', '--packages'] + list(packages)) return json.loads(response) + + +def packages_installed(candidates: Union[list, tuple]) -> list: + """Check which candidates are installed on the system. + + :param candidates: A list of package names. + :return: A list of installed Debian package names. + """ + cache = apt.cache.Cache() + installed_packages = [] + for package_name in candidates: + try: + package = cache[package_name] + if package.is_installed: + installed_packages.append(package_name) + except KeyError: + pass + + return installed_packages + + +def remove(packages: Union[list, tuple]) -> None: + """Remove packages.""" + try: + actions.superuser_run('packages', ['remove', '--packages'] + packages) + except ActionError: + pass diff --git a/plinth/settings.py b/plinth/settings.py index 5845c3dd3..6213d74a7 100644 --- a/plinth/settings.py +++ b/plinth/settings.py @@ -131,7 +131,7 @@ MIDDLEWARE = ( ) PASSWORD_HASHERS = [ - 'django.contrib.auth.hashers.Argon2PasswordHasher', + 'plinth.hashers.Argon2PasswordHasherLowMemory', 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', diff --git a/plinth/setup.py b/plinth/setup.py index d1f651a0e..8189f6199 100644 --- a/plinth/setup.py +++ b/plinth/setup.py @@ -13,6 +13,7 @@ from collections import defaultdict import apt import plinth +from plinth.package import packages_installed from plinth.signals import post_setup from . import package @@ -178,6 +179,15 @@ class Helper(object): if pkg_name not in cache) return any(unavailable_pkgs) + def get_package_conflicts(self): + """Report list of conflicting packages for the user.""" + package_conflicts, package_conflicts_action = \ + _get_module_package_conflicts(self.module) + if package_conflicts: + package_conflicts = packages_installed(package_conflicts) + + return package_conflicts, package_conflicts_action + def init(module_name, module): """Create a setup helper for a module for later use.""" @@ -298,6 +308,12 @@ def _is_module_essential(module): return getattr(module, 'is_essential', False) +def _get_module_package_conflicts(module): + """Return list of packages that conflict with packages of a module.""" + return (getattr(module, 'package_conflicts', + None), getattr(module, 'package_conflicts_action', None)) + + def _get_module_managed_packages(module): """Return list of packages managed by a module.""" return getattr(module, 'managed_packages', []) diff --git a/plinth/templates/setup.html b/plinth/templates/setup.html index 2846a0145..3d9d78bbf 100644 --- a/plinth/templates/setup.html +++ b/plinth/templates/setup.html @@ -50,6 +50,17 @@ {% trans "Check again" %} + {% elif package_conflicts and package_conflicts_action != 'ignore' %} + {% endif %} "\'': + assert char not in hostname + + +@ip_installed +def test_get_addresses(): + """Test that any FreedomBox has some addresses.""" + ips = get_addresses() + assert len(ips) > 3 # min: ip, 2x'localhost', hostname + for address in ips: + assert address['kind'] in ('4', '6') diff --git a/plinth/tests/test_package.py b/plinth/tests/test_package.py new file mode 100644 index 000000000..3339172ca --- /dev/null +++ b/plinth/tests/test_package.py @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Test module for package module. +""" + +from unittest.mock import call, patch + +from plinth.errors import ActionError +from plinth.package import packages_installed, remove + + +def test_packages_installed(): + """Test packages_installed().""" + # list as input + assert len(packages_installed([])) == 0 + assert len(packages_installed(['unknown-package'])) == 0 + assert len(packages_installed(['python3'])) == 1 + # tuples as input + assert len(packages_installed(())) == 0 + assert len(packages_installed(('unknown-package', ))) == 0 + assert len(packages_installed(('python3', ))) == 1 + + +@patch('plinth.actions.superuser_run') +def test_remove(run): + """Test removing packages.""" + remove(['package1', 'package2']) + run.assert_has_calls( + [call('packages', ['remove', '--packages', 'package1', 'package2'])]) + + run.reset_mock() + run.side_effect = ActionError() + remove(['package1']) + run.assert_has_calls( + [call('packages', ['remove', '--packages', 'package1'])]) diff --git a/plinth/translation.py b/plinth/translation.py index 3289f981c..af941af44 100644 --- a/plinth/translation.py +++ b/plinth/translation.py @@ -4,8 +4,6 @@ Utility methods for managing translations. """ from django.conf import settings -from django.contrib.auth.signals import user_logged_in -from django.dispatch import receiver from django.utils import translation @@ -27,8 +25,9 @@ def get_language_from_request(request): def set_language(request, response, language_code): """Set the language in session or as a separate cookie. - Sending language code as None removes the preference. If response is None, - cookies are not touched and setting/deleting language cookie will not work. + Sending language code as None removes the preference. response is not + optional as Django 3.0 up always set the language cookie and Django 4.0 + will no longer set the language in the session. """ if not language_code: @@ -49,17 +48,11 @@ def set_language(request, response, language_code): translation.activate(language_code) if hasattr(request, 'session'): request.session[translation.LANGUAGE_SESSION_KEY] = language_code - else: - response.set_cookie( - settings.LANGUAGE_COOKIE_NAME, - language_code, - max_age=settings.LANGUAGE_COOKIE_AGE, - path=settings.LANGUAGE_COOKIE_PATH, - domain=settings.LANGUAGE_COOKIE_DOMAIN, - ) - -@receiver(user_logged_in) -def _on_user_logged_in(sender, request, user, **kwargs): - """When the user logs in, set the current language.""" - set_language(request, None, user.userprofile.language) + response.set_cookie( + settings.LANGUAGE_COOKIE_NAME, + language_code, + max_age=settings.LANGUAGE_COOKIE_AGE, + path=settings.LANGUAGE_COOKIE_PATH, + domain=settings.LANGUAGE_COOKIE_DOMAIN, + ) diff --git a/plinth/views.py b/plinth/views.py index a0988e6e3..8cf07b614 100644 --- a/plinth/views.py +++ b/plinth/views.py @@ -275,11 +275,17 @@ class SetupView(TemplateView): context['setup_helper'] = setup_helper context['app_info'] = setup_helper.module.app.info + # Report any installed conflicting packages that will be removed. + package_conflicts, package_conflicts_action = \ + setup_helper.get_package_conflicts() + context['package_conflicts'] = package_conflicts + context['package_conflicts_action'] = package_conflicts_action + # Reuse the value of setup_state throughout the view for consistency. context['setup_state'] = setup_helper.get_state() context['setup_current_operation'] = setup_helper.current_operation - # Perform expensive operation only if needed + # Perform expensive operation only if needed. if not context['setup_current_operation']: context[ 'package_manager_is_busy'] = package.is_package_manager_busy() diff --git a/pyproject.toml b/pyproject.toml index 9f8a5ed54..2c77234ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,2 +1,70 @@ [tool.isort] known_first_party = ["plinth"] + +[tool.coverage.run] +branch = true +omit = ["*/tests/*"] + +[tool.coverage.report] +precision = 2 +omit = ["*/tests/*"] + +[tool.pytest.ini_options] +addopts = "--ds=plinth.tests.data.django_test_settings" +markers = [ + "essential", + "functional", + "skip", + "heavy", + "apps", + "avahi", + "backups", + "bepasty", + "bind", + "calibre", + "cockpit", + "config", + "coturn", + "datetime", + "deluge", + "dynamicdns", + "ejabberd", + "gitweb", + "help", + "i2p", + "ikiwiki", + "infinoted", + "jsxc", + "matrixsynapse", + "mediawiki", + "minetest", + "minidlna", + "mldonkey", + "monkeysphere", + "mumble", + "openvpn", + "pagekite", + "performance", + "privoxy", + "quassel", + "radicale", + "roundcube", + "samba", + "searx", + "security", + "shadowsocks", + "sharing", + "snapshot", + "ssh", + "sso", + "storage", + "syncthing", + "system", + "tahoe", + "tor", + "transmission", + "ttrss", + "upgrades", + "users", + "zoph", +] diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 4f3ac0700..000000000 --- a/pytest.ini +++ /dev/null @@ -1,56 +0,0 @@ -[pytest] -DJANGO_SETTINGS_MODULE = plinth.tests.data.django_test_settings -markers = functional - apps - avahi - backups - bepasty - bind - calibre - cockpit - config - coturn - datetime - deluge - dynamicdns - ejabberd - essential - gitweb - help - i2p - ikiwiki - infinoted - jsxc - matrixsynapse - mediawiki - minetest - minidlna - mldonkey - monkeysphere - mumble - openvpn - pagekite - performance - privoxy - quassel - radicale - roundcube - samba - searx - security - shadowsocks - sharing - skip - snapshot - ssh - sso - storage - syncthing - system - tahoe - tor - transmission - ttrss - upgrades - users - zoph diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 99ec86939..000000000 --- a/setup.cfg +++ /dev/null @@ -1,3 +0,0 @@ -[aliases] -# When './setup.py test' is invoked, run './setup.py pytest' -test=pytest