diff --git a/.ci/functional-tests.yml b/.ci/functional-tests.yml index 706a8c5d7..3089ce1ad 100644 --- a/.ci/functional-tests.yml +++ b/.ci/functional-tests.yml @@ -9,14 +9,10 @@ script: - BUILD_JOB_ID=$(curl -s "https://salsa.debian.org/api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs?scope[]=success" | jq -r '.[] | select(.name==env.BUILD_JOB_NAME) | .id') - export AWS_DEFAULT_REGION=us-east-1 - - LAUNCH_TEMPLATE_ID=$(aws ec2 describe-launch-templates --launch-template-names $LAUNCH_TEMPLATE_NAME | jq -r ".LaunchTemplates[0].LaunchTemplateId") - | - INSTANCE_ID=$(aws ec2 run-instances --launch-template LaunchTemplateId="$LAUNCH_TEMPLATE_ID" --associate-public-ip-address \ - --tag-specifications "ResourceType=instance, Tags=[{Key=salsa:project-id,Value=$CI_PROJECT_ID},{Key=salsa:build-job-id,Value=$BUILD_JOB_ID},{Key=Name,Value=$INSTANCE_NAME}]" | \ - jq -r ".Instances[0].InstanceId") - - APP_SERVER_IP=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID | jq -r ".Reservations[0].Instances[0].PublicIpAddress") - - echo "APP_SERVER_IP=$APP_SERVER_IP" >> app-servers.env - - echo "INSTANCE_ID=$INSTANCE_ID" >> app-servers.env + aws lambda invoke --function-name launch_app_server --payload '{"launch_template_name": "'"$LAUNCH_TEMPLATE_NAME"'", "instance_name": "'"$INSTANCE_NAME"'", "ci_project_id": "'"$CI_PROJECT_ID"'", "build_job_id": "'"$BUILD_JOB_ID"'"}' response.json + - echo "APP_SERVER_IP=$(jq -r '.app_server_ip' response.json)" >> app-servers.env + - echo "INSTANCE_ID=$(jq -r '.instance_id' response.json)" >> app-servers.env tags: - functional-tests artifacts: @@ -38,7 +34,7 @@ - adduser tester --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password && echo "tester:password" | chpasswd script: - cp -r . /home/tester/freedombox && chown -R tester:tester /home/tester/freedombox - - sudo -u tester bash -c 'pip3 install --user splinter pytest-splinter pytest-reporter-html1' + - sudo -u tester bash -c 'pip3 install --user selenium==4.2.0 splinter==0.17.0 pytest-splinter pytest-reporter-html1' - | sudo FREEDOMBOX_URL="https://$APP_SERVER_IP" -u tester bash -c \ 'cd /home/tester/freedombox && py.test-3 -v --durations=10 --include-functional --splinter-headless --template=html1/index.html --report=functional-tests.html' @@ -58,6 +54,8 @@ .terminate-app-server: stage: functional-tests script: - - aws ec2 --region us-east-1 terminate-instances --instance-ids $INSTANCE_ID > /dev/null + - export AWS_DEFAULT_REGION=us-east-1 + - | + aws lambda invoke --function-name terminate_app_server --payload '{"instance_id": "'"$INSTANCE_ID"'"}' response.json tags: - functional-tests diff --git a/actions/auth-pubtkt b/actions/auth-pubtkt index fb4765946..bdf7f8f9c 100755 --- a/actions/auth-pubtkt +++ b/actions/auth-pubtkt @@ -51,12 +51,12 @@ def subcommand_create_key_pair(_): pkey = crypto.PKey() pkey.generate_key(crypto.TYPE_RSA, 4096) - with open(private_key_file, 'w') as priv_key_file: + with open(private_key_file, 'w', encoding='utf-8') as priv_key_file: priv_key = crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey).decode() priv_key_file.write(priv_key) - with open(public_key_file, 'w') as pub_key_file: + with open(public_key_file, 'w', encoding='utf-8') as pub_key_file: pub_key = crypto.dump_publickey(crypto.FILETYPE_PEM, pkey).decode() pub_key_file.write(pub_key) @@ -93,7 +93,7 @@ def subcommand_generate_ticket(arguments): uid = arguments.uid private_key_file = arguments.private_key_file tokens = arguments.tokens - with open(private_key_file, 'r') as fil: + with open(private_key_file, 'r', encoding='utf-8') as fil: pkey = crypto.load_privatekey(crypto.FILETYPE_PEM, fil.read().encode()) valid_until = minutes_from_now(12 * 60) grace_period = minutes_from_now(11 * 60) diff --git a/actions/bind b/actions/bind index b1a4703b9..c92df72f4 100755 --- a/actions/bind +++ b/actions/bind @@ -34,7 +34,7 @@ def parse_arguments(): def subcommand_setup(arguments): """Setup BIND configuration.""" if arguments.old_version == 0: - with open(CONFIG_FILE, "w") as conf_file: + with open(CONFIG_FILE, 'w', encoding='utf-8') as conf_file: conf_file.write(DEFAULT_CONFIG) Path(ZONES_DIR).mkdir(exist_ok=True, parents=True) diff --git a/actions/config b/actions/config index c8b661d63..31da406ee 100755 --- a/actions/config +++ b/actions/config @@ -40,7 +40,7 @@ def subcommand_set_home_page(arguments): redirect_rule = 'RedirectMatch "^/$" "{}"\n'.format(arguments.homepage) - with open(conf_file_path, 'w') as conf_file: + with open(conf_file_path, 'w', encoding='utf-8') as conf_file: conf_file.write(redirect_rule) action_utils.webserver_enable('freedombox-apache-homepage') diff --git a/actions/deluge b/actions/deluge index 609bd22de..e34437e2f 100755 --- a/actions/deluge +++ b/actions/deluge @@ -135,7 +135,8 @@ def subcommand_set_configuration(arguments): def subcommand_setup(_): """Perform initial setup for deluge.""" - with open(DELUGE_WEB_SYSTEMD_SERVICE_PATH, 'w') as file_handle: + with open(DELUGE_WEB_SYSTEMD_SERVICE_PATH, 'w', + encoding='utf-8') as file_handle: file_handle.write(DELUGE_WEB_SYSTEMD_SERVICE) _set_deluged_daemon_options() diff --git a/actions/ejabberd b/actions/ejabberd index 5ac834066..f9d9aed35 100755 --- a/actions/ejabberd +++ b/actions/ejabberd @@ -107,7 +107,7 @@ def parse_arguments(): def subcommand_get_configuration(_): """Return the current configuration, specifically domains configured.""" - with open(EJABBERD_CONFIG, 'r') as file_handle: + with open(EJABBERD_CONFIG, 'r', encoding='utf-8') as file_handle: conf = yaml.load(file_handle) print(json.dumps({'domains': conf['hosts']})) @@ -126,7 +126,7 @@ def subcommand_pre_install(arguments): def subcommand_setup(arguments): """Enabled LDAP authentication""" - with open(EJABBERD_CONFIG, 'r') as file_handle: + with open(EJABBERD_CONFIG, 'r', encoding='utf-8') as file_handle: conf = yaml.load(file_handle) for listen_port in conf['listen']: @@ -140,7 +140,7 @@ def subcommand_setup(arguments): conf['ldap_base'] = scalarstring.DoubleQuotedScalarString( 'ou=users,dc=thisbox') - with open(EJABBERD_CONFIG, 'w') as file_handle: + with open(EJABBERD_CONFIG, 'w', encoding='utf-8') as file_handle: yaml.dump(conf, file_handle) upgrade_config(arguments.domainname) @@ -157,7 +157,7 @@ def upgrade_config(domain): if not current_version: print('Warning: Unable to get ejabberd version.') - with open(EJABBERD_CONFIG, 'r') as file_handle: + with open(EJABBERD_CONFIG, 'r', encoding='utf-8') as file_handle: conf = yaml.load(file_handle) # Check if `iqdisc` is present and remove it @@ -190,7 +190,7 @@ def upgrade_config(domain): listen_port['certfile'] = cert_file # Write changes back to the file - with open(EJABBERD_CONFIG, 'w') as file_handle: + with open(EJABBERD_CONFIG, 'w', encoding='utf-8') as file_handle: yaml.dump(conf, file_handle) @@ -250,7 +250,7 @@ def subcommand_get_domains(_): print('ejabberdctl not found. Is ejabberd installed?') return - with open(EJABBERD_CONFIG, 'r') as file_handle: + with open(EJABBERD_CONFIG, 'r', encoding='utf-8') as file_handle: conf = yaml.load(file_handle) print(json.dumps(conf['hosts'])) @@ -268,14 +268,14 @@ def subcommand_add_domain(arguments): domainname = arguments.domainname # Add updated domainname to ejabberd hosts list. - with open(EJABBERD_CONFIG, 'r') as file_handle: + with open(EJABBERD_CONFIG, 'r', encoding='utf-8') as file_handle: conf = yaml.load(file_handle) conf['hosts'].append(scalarstring.DoubleQuotedScalarString(domainname)) conf['hosts'] = list(set(conf['hosts'])) - with open(EJABBERD_CONFIG, 'w') as file_handle: + with open(EJABBERD_CONFIG, 'w', encoding='utf-8') as file_handle: yaml.dump(conf, file_handle) # Restarting ejabberd is handled by letsencrypt-ejabberd component. @@ -290,19 +290,19 @@ def subcommand_set_domains(arguments): print('ejabberdctl not found. Is ejabberd installed?') return - with open(EJABBERD_CONFIG, 'r') as file_handle: + with open(EJABBERD_CONFIG, 'r', encoding='utf-8') as file_handle: conf = yaml.load(file_handle) conf['hosts'] = arguments.domains - with open(EJABBERD_CONFIG, 'w') as file_handle: + with open(EJABBERD_CONFIG, 'w', encoding='utf-8') as file_handle: yaml.dump(conf, file_handle) def subcommand_mam(argument): """Enable, disable, or get status of Message Archive Management (MAM).""" - with open(EJABBERD_CONFIG, 'r') as file_handle: + with open(EJABBERD_CONFIG, 'r', encoding='utf-8') as file_handle: conf = yaml.load(file_handle) if 'modules' not in conf: @@ -340,7 +340,7 @@ def subcommand_mam(argument): print("Unknown command: %s" % argument.command) return - with open(EJABBERD_CONFIG, 'w') as file_handle: + with open(EJABBERD_CONFIG, 'w', encoding='utf-8') as file_handle: yaml.dump(conf, file_handle) if action_utils.service_is_running('ejabberd'): @@ -370,7 +370,7 @@ def _generate_uris(services: list[dict]) -> list[str]: def subcommand_get_turn_config(_): """Get the latest STUN/TURN configuration in JSON format.""" - with open(EJABBERD_CONFIG, 'r') as file_handle: + with open(EJABBERD_CONFIG, 'r', encoding='utf-8') as file_handle: conf = yaml.load(file_handle) mod_stun_disco_config = conf['modules']['mod_stun_disco'] @@ -405,12 +405,12 @@ def subcommand_configure_turn(arguments): 'services': [_generate_service(uri) for uri in uris] } - with open(EJABBERD_CONFIG, 'r') as file_handle: + with open(EJABBERD_CONFIG, 'r', encoding='utf-8') as file_handle: conf = yaml.load(file_handle) conf['modules']['mod_stun_disco'] = mod_stun_disco_config - with open(EJABBERD_CONFIG, 'w') as file_handle: + with open(EJABBERD_CONFIG, 'w', encoding='utf-8') as file_handle: yaml.dump(conf, file_handle) if arguments.managed: diff --git a/actions/gitweb b/actions/gitweb index 4393d48f8..da0c9eaef 100755 --- a/actions/gitweb +++ b/actions/gitweb @@ -172,7 +172,8 @@ def _clone_with_progress_report(url, repo_dir): elapsed = _clone_status_line_to_percent(line) if elapsed is not None: try: - with open(status_file, 'w') as file_handle: + with open(status_file, 'w', + encoding='utf-8') as file_handle: file_handle.write(elapsed) except OSError as error: errors.append(str(error)) @@ -205,7 +206,7 @@ def _prepare_clone_repo(arguments): try: if arguments.is_private: _set_access_status(repo_name, 'private') - with open(status_file, 'w') as file_handle: + with open(status_file, 'w', encoding='utf-8') as file_handle: file_handle.write('0') except OSError: shutil.rmtree(repo_dir) @@ -289,7 +290,7 @@ def _get_repo_description(repo): """Set description of the repository.""" description_file = os.path.join(GIT_REPO_PATH, repo, 'description') if os.path.exists(description_file): - with open(description_file, 'r') as file_handle: + with open(description_file, 'r', encoding='utf-8') as file_handle: description = file_handle.read() else: description = '' @@ -300,7 +301,7 @@ def _get_repo_description(repo): def _set_repo_description(repo, description): """Set description of the repository.""" description_file = os.path.join(GIT_REPO_PATH, repo, 'description') - with open(description_file, 'w') as file_handle: + with open(description_file, 'w', encoding='utf-8') as file_handle: file_handle.write(description) @@ -326,7 +327,7 @@ def _set_repo_owner(repo, owner): config.add_section('gitweb') config['gitweb']['owner'] = owner - with open(repo_config, 'w') as file_handle: + with open(repo_config, 'w', encoding='utf-8') as file_handle: config.write(file_handle) @@ -343,7 +344,7 @@ def _set_access_status(repo, status): """Set repository as private or public""" private_file = os.path.join(GIT_REPO_PATH, repo, 'private') if status == 'private': - open(private_file, 'a') + open(private_file, 'a', encoding='utf-8') elif status == 'public': if os.path.exists(private_file): os.remove(private_file) diff --git a/actions/ikiwiki b/actions/ikiwiki index 6824f85c9..4080f9bef 100755 --- a/actions/ikiwiki +++ b/actions/ikiwiki @@ -59,7 +59,8 @@ def subcommand_setup(_): def get_title(site): """Get blog or wiki title""" try: - with open(os.path.join(SITE_PATH, site, 'index.html')) as index_file: + with open(os.path.join(SITE_PATH, site, 'index.html'), + encoding='utf-8') as index_file: match = re.search(r'(.*)', index_file.read()) if match: return match[1] diff --git a/actions/infinoted b/actions/infinoted index ebf92a851..aef33246a 100755 --- a/actions/infinoted +++ b/actions/infinoted @@ -130,10 +130,10 @@ def _kill_daemon(): def subcommand_setup(_): """Configure infinoted after install.""" if not os.path.isfile(CONF_PATH): - with open(CONF_PATH, 'w') as file_handle: + with open(CONF_PATH, 'w', encoding='utf-8') as file_handle: file_handle.write(CONF) - with open(SYSTEMD_SERVICE_PATH, 'w') as file_handle: + with open(SYSTEMD_SERVICE_PATH, 'w', encoding='utf-8') as file_handle: file_handle.write(SYSTEMD_SERVICE) subprocess.check_call(['systemctl', 'daemon-reload']) diff --git a/actions/janus b/actions/janus index bb9f76773..107a07141 100755 --- a/actions/janus +++ b/actions/janus @@ -22,10 +22,10 @@ def parse_arguments(): def subcommand_setup(_): """Configure Janus server.""" - with open(JANUS_CONF_PATH, 'r') as config_file: + with open(JANUS_CONF_PATH, 'r', encoding='utf-8') as config_file: config_lines = config_file.readlines() - with open(JANUS_CONF_PATH, 'w') as config_file: + with open(JANUS_CONF_PATH, 'w', encoding='utf-8') as config_file: for line in config_lines: if '#rtp_port_range' in line: config_file.write("\trtp_port_range = \"50176-51199\"\n") diff --git a/actions/letsencrypt b/actions/letsencrypt index 9dec15b97..ed9fb04fc 100755 --- a/actions/letsencrypt +++ b/actions/letsencrypt @@ -473,7 +473,7 @@ def setup_webserver_config(domain, webserver_change): if os.path.isfile(file_name): os.rename(file_name, file_name + '.fbx-bak') - with open(file_name, 'w') as file_handle: + with open(file_name, 'w', encoding='utf-8') as file_handle: file_handle.write(APACHE_CONFIGURATION.format(domain=domain)) webserver_change.enable('freedombox-tls-site-macro', kind='config') diff --git a/actions/matrixsynapse b/actions/matrixsynapse index 4b7acd824..75e22368f 100755 --- a/actions/matrixsynapse +++ b/actions/matrixsynapse @@ -73,11 +73,11 @@ def parse_arguments(): def subcommand_post_install(_): """Perform post installation configuration.""" - with open(STATIC_CONF_PATH, 'w') as static_conf_file: + with open(STATIC_CONF_PATH, 'w', encoding='utf-8') as static_conf_file: yaml.dump(STATIC_CONFIG, static_conf_file) # start with listener config from original homeserver.yaml - with open(ORIG_CONF_PATH) as orig_conf_file: + with open(ORIG_CONF_PATH, encoding='utf-8') as orig_conf_file: orig_config = yaml.load(orig_conf_file) listeners = orig_config['listeners'] @@ -86,7 +86,8 @@ def subcommand_post_install(_): listener['bind_addresses'] = ['::', '0.0.0.0'] listener.pop('bind_address', None) - with open(LISTENERS_CONF_PATH, 'w') as listeners_conf_file: + with open(LISTENERS_CONF_PATH, 'w', + encoding='utf-8') as listeners_conf_file: yaml.dump({'listeners': listeners}, listeners_conf_file) @@ -100,11 +101,11 @@ def subcommand_setup(arguments): def subcommand_public_registration(argument): """Enable/Disable/Status public user registration.""" try: - with open(REGISTRATION_CONF_PATH) as reg_conf_file: + with open(REGISTRATION_CONF_PATH, encoding='utf-8') as reg_conf_file: config = yaml.load(reg_conf_file) except FileNotFoundError: # Check if its set in original conffile. - with open(ORIG_CONF_PATH) as orig_conf_file: + with open(ORIG_CONF_PATH, encoding='utf-8') as orig_conf_file: orig_config = yaml.load(orig_conf_file) config = { 'enable_registration': @@ -123,7 +124,7 @@ def subcommand_public_registration(argument): elif argument.command == 'disable': config['enable_registration'] = False - with open(REGISTRATION_CONF_PATH, 'w') as reg_conf_file: + with open(REGISTRATION_CONF_PATH, 'w', encoding='utf-8') as reg_conf_file: yaml.dump(config, reg_conf_file) action_utils.service_try_restart('matrix-synapse') @@ -156,7 +157,7 @@ def _set_turn_config(conf_file): 'turn_allow_guests': True } - with open(conf_file, 'w+') as turn_config: + with open(conf_file, 'w+', encoding='utf-8') as turn_config: yaml.dump(config, turn_config) diff --git a/actions/mediawiki b/actions/mediawiki index 7da44c756..bf3fcd9a3 100755 --- a/actions/mediawiki +++ b/actions/mediawiki @@ -104,12 +104,11 @@ def subcommand_setup(_): subprocess.run(['chmod', '-R', 'o-rwx', data_dir], check=True) subprocess.run(['chown', '-R', 'www-data:www-data', data_dir], check=True) include_custom_config() - _fix_non_private_mode() def include_custom_config(): """Include FreedomBox specific configuration in LocalSettings.php.""" - with open(LOCAL_SETTINGS_CONF, 'r') as conf_file: + with open(LOCAL_SETTINGS_CONF, 'r', encoding='utf-8') as conf_file: lines = conf_file.readlines() static_settings_index = None @@ -130,25 +129,10 @@ def include_custom_config(): settings_index, 'include dirname(__FILE__)."/FreedomBoxStaticSettings.php";\n') - with open(LOCAL_SETTINGS_CONF, 'w') as conf_file: + with open(LOCAL_SETTINGS_CONF, 'w', encoding='utf-8') as conf_file: conf_file.writelines(lines) -def _fix_non_private_mode(): - """Drop the line that allows editing by anonymous users. - - Remove this fix after the release of Debian 11. - - """ - with open(CONF_FILE, 'r') as conf_file: - lines = conf_file.readlines() - - with open(CONF_FILE, 'w') as conf_file: - for line in lines: - if not line.startswith("$wgGroupPermissions['*']['edit']"): - conf_file.write(line) - - def subcommand_change_password(arguments): """Change the password for a given user""" new_password = ''.join(sys.stdin) @@ -170,7 +154,7 @@ def subcommand_update(_): def subcommand_public_registrations(arguments): """Enable or Disable public registrations for MediaWiki.""" - with open(CONF_FILE, 'r') as conf_file: + with open(CONF_FILE, 'r', encoding='utf-8') as conf_file: lines = conf_file.readlines() def is_pub_reg_line(line): @@ -183,7 +167,7 @@ def subcommand_public_registrations(arguments): else: print('disabled') else: - with open(CONF_FILE, 'w') as conf_file: + with open(CONF_FILE, 'w', encoding='utf-8') as conf_file: for line in lines: if is_pub_reg_line(line): words = line.split() @@ -198,7 +182,7 @@ def subcommand_public_registrations(arguments): def subcommand_private_mode(arguments): """Enable or Disable Private mode for wiki""" - with open(CONF_FILE, 'r') as conf_file: + with open(CONF_FILE, 'r', encoding='utf-8') as conf_file: lines = conf_file.readlines() def is_read_line(line): @@ -211,7 +195,7 @@ def subcommand_private_mode(arguments): else: print('disabled') else: - with open(CONF_FILE, 'w') as conf_file: + with open(CONF_FILE, 'w', encoding='utf-8') as conf_file: conf_value = 'false;' if arguments.command == 'enable' else 'true;' for line in lines: if is_read_line(line): @@ -228,7 +212,7 @@ def subcommand_private_mode(arguments): def _update_setting(setting_name, setting_line): """Update the value of one setting in the config file.""" - with open(CONF_FILE, 'r') as conf_file: + with open(CONF_FILE, 'r', encoding='utf-8') as conf_file: lines = conf_file.readlines() inserted = False @@ -241,7 +225,7 @@ def _update_setting(setting_name, setting_line): if not inserted: lines.append(setting_line) - with open(CONF_FILE, 'w') as conf_file: + with open(CONF_FILE, 'w', encoding='utf-8') as conf_file: conf_file.writelines(lines) diff --git a/actions/minidlna b/actions/minidlna index f84135f02..e742c52af 100755 --- a/actions/minidlna +++ b/actions/minidlna @@ -59,19 +59,20 @@ def _undo_old_configuration_changes(): aug.save() -def subcommand_setup(arguments): +def subcommand_setup(_): """ Increase inotify watches per folder to allow minidlna to monitor changes in large media-dirs. """ _undo_old_configuration_changes() - with open('/etc/sysctl.d/50-freedombox-minidlna.conf', 'w') as conf: + with open('/etc/sysctl.d/50-freedombox-minidlna.conf', 'w', + encoding='utf-8') as conf: conf.write(SYSCTL_CONF) subprocess.run(['systemctl', 'restart', 'systemd-sysctl'], check=True) -def subcommand_get_media_dir(arguments): +def subcommand_get_media_dir(_): """Retrieve media directory from minidlna.conf""" line = grep('^media_dir=', CONFIG_PATH) @@ -97,7 +98,7 @@ def replace_in_config_file(file_path, pattern, subst): """ temp_file, temp_file_path = mkstemp() with fdopen(temp_file, 'w') as new_file: - with open(file_path) as old_file: + with open(file_path, encoding='utf-8') as old_file: for line in old_file: new_file.write(line.replace(pattern, subst)) diff --git a/actions/openvpn b/actions/openvpn index df2a1f3dc..088995bc5 100755 --- a/actions/openvpn +++ b/actions/openvpn @@ -141,7 +141,8 @@ def parse_arguments(): def _is_using_ecc(): """Return whether the service is using ECC.""" if os.path.exists(SERVER_CONFIGURATION_PATH): - with open(SERVER_CONFIGURATION_PATH, 'r') as file_handle: + with open(SERVER_CONFIGURATION_PATH, 'r', + encoding='utf-8') as file_handle: for line in file_handle: if line.strip() == 'dh none': return True @@ -169,7 +170,7 @@ def subcommand_setup(_): def _write_server_config(): """Write server configuration.""" - with open(SERVER_CONFIGURATION_PATH, 'w') as file_handle: + with open(SERVER_CONFIGURATION_PATH, 'w', encoding='utf-8') as file_handle: file_handle.write(SERVER_CONFIGURATION) @@ -280,7 +281,7 @@ def set_unique_subject(value): def _read_file(filename): """Return the entire contents of a file as string.""" - with open(filename, 'r') as file_handle: + with open(filename, 'r', encoding='utf-8') as file_handle: return ''.join(file_handle.readlines()) diff --git a/actions/packages b/actions/packages index 48c8e8382..13f93a63b 100755 --- a/actions/packages +++ b/actions/packages @@ -118,7 +118,7 @@ def _assert_managed_packages(module, packages): cfg.read() module_file = os.path.join(cfg.config_dir, 'modules-enabled', module) - with open(module_file, 'r') as file_handle: + with open(module_file, 'r', encoding='utf-8') as file_handle: module_path = file_handle.read().strip() module = import_module(module_path) diff --git a/actions/pagekite b/actions/pagekite index fc3987514..b57ad2cd1 100755 --- a/actions/pagekite +++ b/actions/pagekite @@ -156,7 +156,7 @@ def subcommand_remove_service(arguments): for path in paths: filepath = _convert_augeas_path_to_filepath(path) service_found = False - with open(filepath, 'r') as file: + with open(filepath, 'r', encoding='utf-8') as file: lines = file.readlines() for i, line in enumerate(lines): if line.startswith('service_on') and \ @@ -165,7 +165,7 @@ def subcommand_remove_service(arguments): service_found = True break if service_found: - with open(filepath, 'w') as file: + with open(filepath, 'w', encoding='utf-8') as file: file.writelines(lines) # abort to only allow deleting one service break @@ -192,7 +192,7 @@ def _add_service(service): # TODO: after adding a service, augeas fails writing the config; # so add the service_on entry manually instead path = _convert_augeas_path_to_filepath(root) - with open(path, 'a') as servicefile: + with open(path, 'a', encoding='utf-8') as servicefile: line = "\nservice_on = %s\n" % utils.convert_service_to_string(service) servicefile.write(line) diff --git a/actions/quassel b/actions/quassel index 8da6c8b81..c22e14c5e 100755 --- a/actions/quassel +++ b/actions/quassel @@ -24,7 +24,7 @@ def parse_arguments(): def subcommand_set_domain(arguments): """Write a file containing domain name.""" domain_file = pathlib.Path('/var/lib/quassel/domain-freedombox') - domain_file.write_text(arguments.domain_name) + domain_file.write_text(arguments.domain_name, encoding='utf-8') def main(): diff --git a/actions/roundcube b/actions/roundcube index 02f771d7e..b0d7206fc 100755 --- a/actions/roundcube +++ b/actions/roundcube @@ -42,14 +42,14 @@ def subcommand_pre_install(_): def subcommand_setup(_): """Add FreedomBox configuration and include from main configuration.""" if not _config_file.exists(): - _config_file.write_text(' """ try: - with open(SERVICE_FILE.format(name), 'w') as service_file: + with open(SERVICE_FILE.format(name), 'w', + encoding='utf-8') as service_file: service_file.writelines(lines.format(name, number)) except FileNotFoundError: return diff --git a/actions/ttrss b/actions/ttrss index e54fa6ef3..3ae8caffb 100755 --- a/actions/ttrss +++ b/actions/ttrss @@ -126,7 +126,7 @@ def subcommand_enable_api_access(_): def subcommand_dump_database(_): """Dump database to file.""" os.makedirs(os.path.dirname(DB_BACKUP_FILE), exist_ok=True) - with open(DB_BACKUP_FILE, 'w') as db_backup_file: + with open(DB_BACKUP_FILE, 'w', encoding='utf-8') as db_backup_file: _run_as_postgres(['pg_dump', 'ttrss'], stdout=db_backup_file) @@ -134,7 +134,7 @@ def subcommand_restore_database(_): """Restore database from file.""" _run_as_postgres(['dropdb', 'ttrss']) _run_as_postgres(['createdb', 'ttrss']) - with open(DB_BACKUP_FILE, 'r') as db_restore_file: + with open(DB_BACKUP_FILE, 'r', encoding='utf-8') as db_restore_file: _run_as_postgres(['psql', '--dbname', 'ttrss'], stdin=db_restore_file) diff --git a/actions/upgrades b/actions/upgrades index 49069ce55..aba6566ef 100755 --- a/actions/upgrades +++ b/actions/upgrades @@ -84,7 +84,10 @@ DIST_UPGRADE_PACKAGES_WITH_PROMPTS = [ DIST_UPGRADE_PRE_INSTALL_PACKAGES = ['base-files'] -DIST_UPGRADE_PRE_DEBCONF_SELECTIONS: List[str] = [] +DIST_UPGRADE_PRE_DEBCONF_SELECTIONS: List[str] = [ + # Tell grub-pc to continue without installing grub again. + 'grub-pc grub-pc/install_devices_empty boolean true' +] DIST_UPGRADE_REQUIRED_FREE_SPACE = 5000000 @@ -194,14 +197,14 @@ def subcommand_check_auto(_): def subcommand_enable_auto(_): """Enable automatic upgrades""" - with open(AUTO_CONF_FILE, 'w') as conffile: + with open(AUTO_CONF_FILE, 'w', encoding='utf-8') as conffile: conffile.write('APT::Periodic::Update-Package-Lists "1";\n') conffile.write('APT::Periodic::Unattended-Upgrade "1";\n') def subcommand_disable_auto(_): """Disable automatic upgrades""" - with open(AUTO_CONF_FILE, 'w') as conffile: + with open(AUTO_CONF_FILE, 'w', encoding='utf-8') as conffile: conffile.write('APT::Periodic::Update-Package-Lists "0";\n') conffile.write('APT::Periodic::Unattended-Upgrade "0";\n') @@ -210,14 +213,14 @@ def subcommand_get_log(_): """Print the automatic upgrades log.""" try: print('==> ' + os.path.basename(LOG_FILE)) - with open(LOG_FILE, 'r') as file_handle: + with open(LOG_FILE, 'r', encoding='utf-8') as file_handle: print(file_handle.read()) except IOError: pass try: print('==> ' + os.path.basename(DPKG_LOG_FILE)) - with open(DPKG_LOG_FILE, 'r') as file_handle: + with open(DPKG_LOG_FILE, 'r', encoding='utf-8') as file_handle: print(file_handle.read()) except IOError: pass @@ -258,7 +261,7 @@ deb {protocol}://deb.debian.org/debian {dist}-backports main deb-src {protocol}://deb.debian.org/debian {dist}-backports main ''' sources = sources.format(protocol=protocol, dist=dist) - with open(sources_list, 'w') as file_handle: + with open(sources_list, 'w', encoding='utf-8') as file_handle: file_handle.write(sources) @@ -273,7 +276,8 @@ def _check_and_backports_sources(develop=False): return try: - with open('/etc/dpkg/origins/default', 'r') as default_origin: + with open('/etc/dpkg/origins/default', 'r', + encoding='utf-8') as default_origin: matches = [ re.match(r'Vendor:\s+Debian', line, flags=re.IGNORECASE) for line in default_origin.readlines() @@ -323,9 +327,11 @@ def _add_apt_preferences(): 'for backports.') else: print(f'Setting apt preferences for {dist}-backports.') - with open(base_path / '50freedombox4.pref', 'w') as file_handle: + with open(base_path / '50freedombox4.pref', 'w', + encoding='utf-8') as file_handle: file_handle.write(APT_PREFERENCES_FREEDOMBOX.format(dist)) - with open(base_path / '51freedombox-apps.pref', 'w') as file_handle: + with open(base_path / '51freedombox-apps.pref', 'w', + encoding='utf-8') as file_handle: file_handle.write(APT_PREFERENCES_APPS) @@ -391,10 +397,10 @@ def _check_dist_upgrade(test_upgrade=False) -> Tuple[bool, str]: return (False, 'not-enough-free-space') logging.info('Upgrading from %s to %s...', dist, codename) - with open(SOURCES_LIST, 'r') as sources_list: + with open(SOURCES_LIST, 'r', encoding='utf-8') as sources_list: lines = sources_list.readlines() - with open(SOURCES_LIST, 'w') as sources_list: + with open(SOURCES_LIST, 'w', encoding='utf-8') as sources_list: for line in lines: # E.g. replace 'buster' with 'bullseye'. new_line = line.replace(dist, codename) @@ -519,10 +525,6 @@ def _perform_dist_upgrade(): print( 'Holding packages with conffile prompts: ' + ', '.join(DIST_UPGRADE_PACKAGES_WITH_PROMPTS) + '...', flush=True) - # XXX: If any of these packages have been removed from the - # next stable release, they will causes the hold command to - # fail for all packages. So it would be safer to just hold one - # package at a time. with apt_hold(DIST_UPGRADE_PACKAGES_WITH_PROMPTS): print('Running apt full-upgrade...', flush=True) run_apt_command(['full-upgrade']) @@ -572,7 +574,8 @@ def subcommand_activate_backports(arguments): def _start_dist_upgrade_service(): """Create dist upgrade service and start it.""" - with open(DIST_UPGRADE_SERVICE_PATH, 'w') as service_file: + with open(DIST_UPGRADE_SERVICE_PATH, 'w', + encoding='utf-8') as service_file: service_file.write(DIST_UPGRADE_SERVICE) service_daemon_reload() diff --git a/actions/users b/actions/users index d7f06db71..759b847eb 100755 --- a/actions/users +++ b/actions/users @@ -262,6 +262,7 @@ def configure_ldapscripts(): aug.set('/files' + LDAPSCRIPTS_CONF + '/USUFFIX', '"ou=Users"') aug.set('/files' + LDAPSCRIPTS_CONF + '/GSUFFIX', '"ou=Groups"') aug.set('/files' + LDAPSCRIPTS_CONF + '/PASSWORDGEN', '"true"') + aug.set('/files' + LDAPSCRIPTS_CONF + '/CREATEHOMES', '"yes"') aug.save() diff --git a/actions/wordpress b/actions/wordpress index fe9fb2aa0..ba96e8a8d 100755 --- a/actions/wordpress +++ b/actions/wordpress @@ -87,7 +87,7 @@ define('WP_CONTENT_DIR', '/var/lib/wordpress/wp-content'); define('DISABLE_WP_CRON', true); ''' - _config_file_path.write_text(config_contents) + _config_file_path.write_text(config_contents, encoding='utf-8') db_contents = f''' Mon, 04 Jul 2022 21:30:09 -0400 + freedombox (22.14.1~bpo11+1) bullseye-backports; urgency=medium * Rebuild for bullseye-backports. diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index 2e0c4dc28..3f7061310 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -8,6 +8,33 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 22.15 (2022-07-04) == + +=== Highlights === + + * backups: Add options to keep sshfs shares responsive + * backups: Unmount repositories before and after backup + * users: create home directories for newly created users + +=== Other Changes === + + * *: pylint: Avoid calling super() with arguments + * *: pylint: Don't inherit from 'object' + * *: pylint: Drop unnecessary 'pass' statements + * *: pylint: Explicitly specify encoding when open a file + * *: pylint: Suppress unused argument warnings + * ci: Use compatible versions of Selenium and Splinter + * locale: Update translations for Bulgarian, Russian, Ukrainian + * mediawiki: Add regex validator to the domain field + * mediawiki: Remove Buster specific code not needed in Bullseye + * mediawiki: Remove wgLogo as it is not needed in Bullseye + * pyproject.toml: Ignore some refactoring messages with pylint + * static: js: css: Make multiple select fields work with Django 4.0 + * tests: functional: Simplify GitLabCI configuration + * upgrades: Hold packages one at a time + * upgrades: Re-add workaround for grub + * views: Add a comment about change in Django 4.0 + == FreedomBox 22.14.1 (2022-06-27) == === Highlights === diff --git a/doc/manual/es/Janus.raw.wiki b/doc/manual/es/Janus.raw.wiki index f4b48ddcf..9d14fc16c 100644 --- a/doc/manual/es/Janus.raw.wiki +++ b/doc/manual/es/Janus.raw.wiki @@ -8,18 +8,34 @@ == Janus (servidor WebRTC) == +|| {{attachment:FreedomBox/Manual/Janus/Janus-icon_en_V01.png|Icono de Janus}} || '''Disponible desde''': versión 22.13 Janus es un servidor WebRTC ligero de propósito general. Puede soportar diferentes tipos de aplicaciones de comunicación en tiempo real, como llamdas y retransmisiones de video. -Actualmente !FreedomBox incluye con Janus una sala simple de videoconferencia. En el futuro será reemplazada por [[DebianBug:1005877|Jangouts]], una app de videoconferencia completa. +Actualmente !FreedomBox incluye con Janus una sala simple de videoconferencia. Cualquiera que visite tu !FreedomBox puede acceder a esta sala. No requiere ingresar con una cuenta de usuario. -Para usar Janus se necesita un servidor STUN/TURN (como [[es/FreedomBox/Manual/Coturn|Coturn]]). +En el futuro será reemplazada por [[DebianBug:1005877|Jangouts]], una app de videoconferencia completa. -/* Captura de pantalla */ -/* Usar Janus */ +== Captura de pantalla == + +Para usar Janus se necesita [[es/FreedomBox/Manual/Coturn|Coturn]], así que también debe estar instalado y funcionando en tu !FreedomBox. + + +{{attachment:FreedomBox/Manual/Janus/freedombox-janus-videoroom.png|Sala de video de Janus|width=800}} + + +== Usar Janus == + +El acceso directo a Janus te llevará a la página Sala de Video de Janus. Pulsa aquí el botón Comenzar enla parte superior de la página. + +A continución tendrás que dar un nombre de pantalla. Puede ser cualquiera. Pulsa el botón "Unirse a la sala" para entrar. + +La primera vez que entres a la sala, tu navegador te preguntará si le das permiso a esta página para acceder a tu cámara y micrófono. Pulsa "Permitir" para seguir. + +Se mostrará tu propia imagen en la ventana "Video local". Desde aquí podrás acallar tu sonido o usar despublicar para dejar de compartir tu imagen y/o sonido. Si otra gente entra en la sala aparecerán en las ventanas de "Vídeo remoto". === Enlaces externos === diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index 2e0c4dc28..3f7061310 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -8,6 +8,33 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 22.15 (2022-07-04) == + +=== Highlights === + + * backups: Add options to keep sshfs shares responsive + * backups: Unmount repositories before and after backup + * users: create home directories for newly created users + +=== Other Changes === + + * *: pylint: Avoid calling super() with arguments + * *: pylint: Don't inherit from 'object' + * *: pylint: Drop unnecessary 'pass' statements + * *: pylint: Explicitly specify encoding when open a file + * *: pylint: Suppress unused argument warnings + * ci: Use compatible versions of Selenium and Splinter + * locale: Update translations for Bulgarian, Russian, Ukrainian + * mediawiki: Add regex validator to the domain field + * mediawiki: Remove Buster specific code not needed in Bullseye + * mediawiki: Remove wgLogo as it is not needed in Bullseye + * pyproject.toml: Ignore some refactoring messages with pylint + * static: js: css: Make multiple select fields work with Django 4.0 + * tests: functional: Simplify GitLabCI configuration + * upgrades: Hold packages one at a time + * upgrades: Re-add workaround for grub + * views: Add a comment about change in Django 4.0 + == FreedomBox 22.14.1 (2022-06-27) == === Highlights === diff --git a/doc/manual/es/images/Janus-icon_en_V01.png b/doc/manual/es/images/Janus-icon_en_V01.png new file mode 100644 index 000000000..912aad4f7 Binary files /dev/null and b/doc/manual/es/images/Janus-icon_en_V01.png differ diff --git a/doc/manual/es/images/freedombox-janus-videoroom.png b/doc/manual/es/images/freedombox-janus-videoroom.png new file mode 100644 index 000000000..73ce501fd Binary files /dev/null and b/doc/manual/es/images/freedombox-janus-videoroom.png differ diff --git a/plinth/__init__.py b/plinth/__init__.py index 7ae377b0f..e686974d5 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '22.14.1' +__version__ = '22.15' diff --git a/plinth/action_utils.py b/plinth/action_utils.py index ccc71a0e6..ffaad50d1 100644 --- a/plinth/action_utils.py +++ b/plinth/action_utils.py @@ -207,7 +207,7 @@ def webserver_disable(name, kind='config', apply_changes=True): return action_required -class WebserverChange(object): +class WebserverChange: """Context to restart/reload Apache after configuration changes.""" def __init__(self): @@ -424,16 +424,33 @@ def run_apt_command(arguments): @contextmanager -def apt_hold(packages, ignore_errors=False): - """Prevent packages from being removed during apt operations.""" - current_hold = subprocess.check_output(['apt-mark', 'showhold'] + packages) - try: - yield current_hold or subprocess.run(['apt-mark', 'hold'] + packages, - check=not ignore_errors) - finally: +def apt_hold(packages): + """Prevent packages from being removed during apt operations. + + `apt-mark hold PACKAGES` accepts a list of packages. But if one of + the package is missing from the apt repository, then it will fail + to hold any of the listed packages. So it is necessary to try to + hold each package by itself. + + Packages held by this context will be unheld when leaving the + context. But if a package was already held beforehand, it will be + ignored (and not unheld). + + """ + held_packages = [] + for package in packages: + current_hold = subprocess.check_output( + ['apt-mark', 'showhold', package]) if not current_hold: - subprocess.run(['apt-mark', 'unhold'] + packages, - check=not ignore_errors) + process = subprocess.run(['apt-mark', 'hold', package], + check=False) + if process.returncode == 0: # success + held_packages.append(package) + + yield held_packages + + for package in held_packages: + subprocess.check_call(['apt-mark', 'unhold', package]) @contextmanager diff --git a/plinth/errors.py b/plinth/errors.py index cfd6746d4..32d4387f8 100644 --- a/plinth/errors.py +++ b/plinth/errors.py @@ -6,17 +6,14 @@ Project specific errors class PlinthError(Exception): """Base class for all FreedomBox specific errors.""" - pass class ActionError(PlinthError): """Use this error for exceptions when executing an action.""" - pass class PackageNotInstalledError(PlinthError): """Could not complete module setup due to missing package.""" - pass class DomainNotRegisteredError(PlinthError): @@ -24,7 +21,6 @@ class DomainNotRegisteredError(PlinthError): An action couldn't be performed because this FreedomBox doesn't have a registered domain """ - pass class MissingPackageError(PlinthError): diff --git a/plinth/frontpage.py b/plinth/frontpage.py index 166f87c90..0fd7e8864 100644 --- a/plinth/frontpage.py +++ b/plinth/frontpage.py @@ -185,7 +185,7 @@ def get_custom_shortcuts(): continue logger.info('Loading custom shortcuts from %s', file_path) - with file_path.open() as file_handle: + with file_path.open(encoding='utf-8') as file_handle: shortcuts['shortcuts'] += json.load(file_handle)['shortcuts'] except Exception as exception: logger.warning('Error loading shortcuts from %s: %s', file_path, diff --git a/plinth/locale/ar/LC_MESSAGES/django.po b/plinth/locale/ar/LC_MESSAGES/django.po index 63d395214..25b3463aa 100644 --- a/plinth/locale/ar/LC_MESSAGES/django.po +++ b/plinth/locale/ar/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-03-31 09:12+0000\n" "Last-Translator: abidin toumi \n" "Language-Team: Arabic Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3226,7 +3226,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5606,7 +5606,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/ar_SA/LC_MESSAGES/django.po b/plinth/locale/ar_SA/LC_MESSAGES/django.po index fdbf5de18..09baf5844 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2020-06-10 15:41+0000\n" "Last-Translator: aiman an \n" "Language-Team: Arabic (Saudi Arabia) Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3230,7 +3230,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5610,7 +5610,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index 040a27275..e6733be74 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: 2022-06-20 20:21-0400\n" -"PO-Revision-Date: 2022-06-22 17:14+0000\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" +"PO-Revision-Date: 2022-06-29 21:17+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -434,11 +434,11 @@ msgstr "" "Папката на хранилището не е празна, но не е и съществуващо хранилище за " "резервни копия." -#: plinth/modules/backups/repository.py:143 +#: plinth/modules/backups/repository.py:147 msgid "Existing repository is not encrypted." msgstr "Съществуващото хранилище не е шифровано." -#: plinth/modules/backups/repository.py:327 +#: plinth/modules/backups/repository.py:331 #, python-brace-format msgid "{box_name} storage" msgstr "Хранилище на {box_name}" @@ -824,7 +824,7 @@ msgstr "" #: plinth/modules/bepasty/templates/bepasty.html:30 #: plinth/modules/users/forms.py:108 plinth/modules/users/forms.py:234 msgid "Permissions" -msgstr "" +msgstr "Права" #: plinth/modules/bepasty/forms.py:29 msgid "" @@ -998,7 +998,7 @@ msgstr "" #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:78 #: plinth/modules/ejabberd/views.py:96 plinth/modules/email/views.py:45 #: plinth/modules/matrixsynapse/views.py:124 -#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:29 +#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:35 #: plinth/modules/pagekite/forms.py:78 plinth/modules/quassel/views.py:28 #: plinth/modules/roundcube/views.py:32 plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:43 plinth/modules/ttrss/views.py:26 @@ -1171,6 +1171,8 @@ msgid "" "Here you can set some general configuration options like hostname, domain " "name, webserver home page etc." msgstr "" +"Тук можете да направите някои общи настройки, като име на хост, име на " +"домейн, начална страница на сървъра и др." #: plinth/modules/config/__init__.py:53 msgid "General Configuration" @@ -1197,15 +1199,15 @@ msgstr "Недопустимо име на домейн" #: plinth/modules/config/forms.py:40 #, python-brace-format msgid "{user}'s website" -msgstr "" +msgstr "Страница на {user}" #: plinth/modules/config/forms.py:42 msgid "Apache Default" -msgstr "" +msgstr "Apache по подразбиране" #: plinth/modules/config/forms.py:43 msgid "FreedomBox Service (Plinth)" -msgstr "" +msgstr "Услуга на FreedomBox (Plinth)" #: plinth/modules/config/forms.py:55 msgid "Hostname" @@ -1222,7 +1224,7 @@ msgstr "" #: plinth/modules/config/forms.py:64 msgid "Invalid hostname" -msgstr "Недействително име на хост" +msgstr "Недопустимо име на хост" #: plinth/modules/config/forms.py:70 #, python-brace-format @@ -1255,47 +1257,47 @@ msgstr "Допълнителни приложения и възможности" #: plinth/modules/config/forms.py:100 msgid "Show apps and features that require more technical knowledge." -msgstr "" +msgstr "Показване на приложения и възможности, изискващи технически познания" #: plinth/modules/config/views.py:46 #, python-brace-format msgid "Error setting hostname: {exception}" -msgstr "" +msgstr "Грешка при задаване на името на хоста: {exception}" #: plinth/modules/config/views.py:49 msgid "Hostname set" -msgstr "" +msgstr "Името на хоста е зададено" #: plinth/modules/config/views.py:58 #, python-brace-format msgid "Error setting domain name: {exception}" -msgstr "" +msgstr "Грешка при задаване на името на домейна: {exception}" #: plinth/modules/config/views.py:61 msgid "Domain name set" -msgstr "" +msgstr "Името на домейна е зададено" #: plinth/modules/config/views.py:69 #, python-brace-format msgid "Error setting webserver home page: {exception}" -msgstr "" +msgstr "Грешка при задаване на началната страница на сървъра: {exception}" #: plinth/modules/config/views.py:72 msgid "Webserver home page set" -msgstr "" +msgstr "Началната страница на сървъра е зададена" #: plinth/modules/config/views.py:80 #, python-brace-format msgid "Error changing advanced mode: {exception}" -msgstr "" +msgstr "Грешка при промяна на разширения режим: {exception}" #: plinth/modules/config/views.py:85 msgid "Showing advanced apps and features" -msgstr "" +msgstr "Разширените приложения и възможности се показват" #: plinth/modules/config/views.py:88 msgid "Hiding advanced apps and features" -msgstr "" +msgstr "Разширените приложения и възможности са скрити" #: plinth/modules/coturn/__init__.py:29 msgid "" @@ -1338,37 +1340,41 @@ msgid "" "Network time server is a program that maintains the system time in " "synchronization with servers on the Internet." msgstr "" +"Сървърът за време по мрежата е приложение, която поддържа системния часовник " +"синхронизиран със сървъри в интернет." #: plinth/modules/datetime/__init__.py:68 msgid "Date & Time" -msgstr "" +msgstr "Дата и час" #: plinth/modules/datetime/__init__.py:117 msgid "Time synchronized to NTP server" -msgstr "" +msgstr "Часовникът се сверява със сървър на NTP" #: plinth/modules/datetime/forms.py:18 msgid "Time Zone" -msgstr "" +msgstr "Часови пояс" #: plinth/modules/datetime/forms.py:19 msgid "" "Set your time zone to get accurate timestamps. This will set the system-wide " "time zone." msgstr "" +"Задайте часовия пояс, в който се намирате, за да получавате точно време. " +"Така ще настроите часови пояс на цялата система." #: plinth/modules/datetime/forms.py:30 msgid "-- no time zone set --" -msgstr "" +msgstr "— не е избран часови пояс —" -#: plinth/modules/datetime/views.py:45 +#: plinth/modules/datetime/views.py:49 #, python-brace-format msgid "Error setting time zone: {exception}" -msgstr "" +msgstr "Грешка при задаване на часовия пояс: {exception}" -#: plinth/modules/datetime/views.py:48 +#: plinth/modules/datetime/views.py:52 msgid "Time zone set" -msgstr "" +msgstr "Часовият пояс е зададен" #: plinth/modules/deluge/__init__.py:22 msgid "Deluge is a BitTorrent client that features a Web UI." @@ -1394,7 +1400,7 @@ msgstr "" msgid "BitTorrent Web Client" msgstr "" -#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:21 +#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:20 msgid "Download directory" msgstr "" @@ -1630,7 +1636,7 @@ msgstr "" #: plinth/modules/dynamicdns/forms.py:88 plinth/modules/networks/forms.py:212 #: plinth/modules/users/forms.py:68 msgid "Username" -msgstr "" +msgstr "Потребителско име" #: plinth/modules/dynamicdns/forms.py:95 plinth/modules/networks/forms.py:215 msgid "Show password" @@ -2100,14 +2106,17 @@ msgid "" "also be obtained by running the command \"sudo cat /var/lib/plinth/firstboot-" "wizard-secret\" on your {box_name}" msgstr "" +"Въведете тайния ключ, създаден по време на инсталацията на FreedomBox. " +"Ключът може да бъде получен и чрез изпълнение на командата „sudo cat /var/" +"lib/plinth/firstboot-wizard-secret“ на устройството {box_name}" #: plinth/modules/first_boot/forms.py:19 msgid "Firstboot Wizard Secret" -msgstr "" +msgstr "Помощник за тайния ключ при първо зареждане" #: plinth/modules/first_boot/templates/firstboot_complete.html:11 msgid "Setup Complete!" -msgstr "" +msgstr "Настройката е завършена!" #: plinth/modules/first_boot/templates/firstboot_complete.html:14 #, python-format @@ -2124,14 +2133,16 @@ msgid "" "You may want to check the network setup and " "modify it if necessary." msgstr "" +"Вероятно ще искате да промените настройките на " +"мрежата и при необходимост, да ги промените." #: plinth/modules/first_boot/templates/firstboot_welcome.html:29 msgid "Start Setup" -msgstr "" +msgstr "Начало на настройката" #: plinth/modules/first_boot/views.py:50 msgid "Setup Complete" -msgstr "" +msgstr "Настройката е завършена" #: plinth/modules/gitweb/__init__.py:26 msgid "" @@ -3061,41 +3072,41 @@ msgid "" "\"." msgstr "" -#: plinth/modules/mediawiki/forms.py:40 +#: plinth/modules/mediawiki/forms.py:41 #, fuzzy #| msgid "Service Name" msgid "Site Name" msgstr "Име на услуга" -#: plinth/modules/mediawiki/forms.py:41 +#: plinth/modules/mediawiki/forms.py:42 msgid "Name of the site as displayed throughout the wiki." msgstr "" -#: plinth/modules/mediawiki/forms.py:45 +#: plinth/modules/mediawiki/forms.py:46 msgid "Enable public registrations" msgstr "" -#: plinth/modules/mediawiki/forms.py:46 +#: plinth/modules/mediawiki/forms.py:47 msgid "" "If enabled, anyone on the internet will be able to create an account on your " "MediaWiki instance." msgstr "" -#: plinth/modules/mediawiki/forms.py:50 +#: plinth/modules/mediawiki/forms.py:51 msgid "Enable private mode" msgstr "" -#: plinth/modules/mediawiki/forms.py:51 +#: plinth/modules/mediawiki/forms.py:52 msgid "" "If enabled, access will be restricted. Only people who have accounts can " "read/write to the wiki. Public registrations will also be disabled." msgstr "" -#: plinth/modules/mediawiki/forms.py:56 +#: plinth/modules/mediawiki/forms.py:57 msgid "Default Skin" msgstr "" -#: plinth/modules/mediawiki/forms.py:57 +#: plinth/modules/mediawiki/forms.py:58 msgid "" "Choose a default skin for your MediaWiki installation. Users have the option " "to select their preferred skin." @@ -3256,24 +3267,24 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mumble/__init__.py:26 +#: plinth/modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " "software." msgstr "" -#: plinth/modules/mumble/__init__.py:28 +#: plinth/modules/mumble/__init__.py:27 msgid "" "You can connect to your Mumble server on the regular Mumble port 64738. Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3315,7 +3326,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "Паролата на суперпотребителя е обновена." @@ -3996,7 +4007,7 @@ msgstr "" #: plinth/modules/networks/templates/router_configuration_firstboot.html:19 #: plinth/modules/users/templates/users_firstboot.html:63 msgid "Skip this step" -msgstr "" +msgstr "Пропускане на стъпката" #: plinth/modules/networks/templates/internet_connectivity_firstboot.html:21 #: plinth/modules/networks/templates/network_topology_firstboot.html:21 @@ -5716,7 +5727,7 @@ msgstr "" msgid "Login" msgstr "Вход" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" @@ -6461,6 +6472,10 @@ msgid "" "authentication mechanism for most apps. Some apps further require a user " "account to be part of a group to authorize the user to access the app." msgstr "" +"Създавайте и управлявайте потребителски профили. Те служат като " +"централизиран механизъм за удостоверяване за повечето приложения. За да " +"получи достъп, някои приложения още имат изискване потребителският профил да " +"бъде част от определена група." #: plinth/modules/users/__init__.py:34 #, python-brace-format @@ -6469,46 +6484,53 @@ msgid "" "relevant to them in the home page. However, only users of the admin " "group may alter apps or system settings." msgstr "" +"Всеки потребител може да влезе в {box_name} и на началната страница да види " +"списъка с подходящите за него приложения. Но само потребителите от групата " +"администратори могат да променят приложенията и настройките на " +"системата." #: plinth/modules/users/__init__.py:57 msgid "Users and Groups" -msgstr "" +msgstr "Потребители и групи" #: plinth/modules/users/__init__.py:77 msgid "Access to all services and system settings" -msgstr "" +msgstr "Достъп до всички услуги и системни настройки" #: plinth/modules/users/__init__.py:113 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" -msgstr "" +msgstr "Проверете записа на LDAP „{search_item}“" #: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." -msgstr "" +msgstr "Потребителското име е заето." #: plinth/modules/users/forms.py:63 msgid "Enter a valid username." -msgstr "" +msgstr "Въведете валидно потребителско име." #: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" +"Задължително. 150 знака или по-малко. Само латински букви, цифри и @/./-/_." #: plinth/modules/users/forms.py:78 msgid "Authorization Password" -msgstr "" +msgstr "Парола за удостоверяване" #: plinth/modules/users/forms.py:84 #, python-brace-format msgid "" "Enter the password for user \"{user}\" to authorize account modifications." msgstr "" +"За да разрешите промяната на профила, въведете паролата на потребителя " +"„{user}“." #: plinth/modules/users/forms.py:93 msgid "Invalid password." -msgstr "" +msgstr "Грешна парола." #: plinth/modules/users/forms.py:110 msgid "" @@ -6522,16 +6544,16 @@ msgstr "" #: plinth/modules/users/forms.py:155 plinth/modules/users/forms.py:399 #, python-brace-format msgid "Creating LDAP user failed: {error}" -msgstr "" +msgstr "Не е създаден потребител в LDAP: {error}" #: plinth/modules/users/forms.py:168 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" -msgstr "" +msgstr "Новият потребител не е добавен към групата {group}: {error}" #: plinth/modules/users/forms.py:182 msgid "Authorized SSH Keys" -msgstr "" +msgstr "Удостоверени ключове на SSH" #: plinth/modules/users/forms.py:184 msgid "" @@ -6539,53 +6561,57 @@ msgid "" "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" +"Задаването на публичен ключ на SSH ще даде възможност на потребителя да " +"влиза сигурно в системата, без да използва парола. Можете да въведете " +"няколко ключа, по един на ред. Празните редове и редовете, започващи с #, ще " +"бъдат пренебрегнати." #: plinth/modules/users/forms.py:269 msgid "Renaming LDAP user failed." -msgstr "" +msgstr "Потребителят на LDAP не е преименуван." #: plinth/modules/users/forms.py:282 msgid "Failed to remove user from group." -msgstr "" +msgstr "Потребителят не е премахнат от групата." #: plinth/modules/users/forms.py:294 msgid "Failed to add user to group." -msgstr "" +msgstr "Потребителят не е добавен към групата." #: plinth/modules/users/forms.py:307 msgid "Unable to set SSH keys." -msgstr "" +msgstr "Ключовете на SSH не са зададени." #: plinth/modules/users/forms.py:325 msgid "Failed to change user status." -msgstr "" +msgstr "Състоянието на потребителя не е променено." #: plinth/modules/users/forms.py:370 msgid "Changing LDAP user password failed." -msgstr "" +msgstr "Паролата на потребителя на LDAP не е променена." #: plinth/modules/users/forms.py:410 #, python-brace-format msgid "Failed to add new user to admin group: {error}" -msgstr "" +msgstr "Новият потребител не е добавен към администраторската група: {error}" #: plinth/modules/users/forms.py:429 #, python-brace-format msgid "Failed to restrict console access: {error}" -msgstr "" +msgstr "Достъпът до конзолата не е ограничен: {error}" #: plinth/modules/users/forms.py:442 msgid "User account created, you are now logged in" -msgstr "" +msgstr "Профилът е създаден и вече сте влезли" #: plinth/modules/users/templates/users_change_password.html:11 #, python-format msgid "Change Password for %(username)s" -msgstr "Смяна на паролата на %(username)s" +msgstr "Промяна на паролата на %(username)s" #: plinth/modules/users/templates/users_change_password.html:21 msgid "Save Password" -msgstr "" +msgstr "Запазване на парола" #: plinth/modules/users/templates/users_create.html:11 #: plinth/modules/users/templates/users_create.html:19 @@ -6593,26 +6619,27 @@ msgstr "" #: plinth/modules/users/templates/users_list.html:17 #: plinth/modules/users/views.py:44 msgid "Create User" -msgstr "" +msgstr "Създаване на потребител" #: plinth/modules/users/templates/users_delete.html:11 #: plinth/modules/users/views.py:134 msgid "Delete User" -msgstr "" +msgstr "Премахване на потребител" #: plinth/modules/users/templates/users_delete.html:14 #, python-format msgid "Delete user %(username)s permanently?" msgstr "" +"Потвърждавате ли премахването на потребителя %(username)s?" #: plinth/modules/users/templates/users_delete.html:23 #, python-format msgid "Delete %(username)s" -msgstr "" +msgstr "Премахване на %(username)s" #: plinth/modules/users/templates/users_firstboot.html:11 msgid "Administrator Account" -msgstr "" +msgstr "Профил на администратора" #: plinth/modules/users/templates/users_firstboot.html:15 msgid "" @@ -6620,6 +6647,9 @@ msgid "" "can be changed later. This user will be granted administrative privileges. " "Other users can be added later." msgstr "" +"Изберете потребителско име и парола за достъп до този интерфейс. Паролата " +"може да бъде променена по-късно. Потребителят ще получи права на " +"администратор. Други потребители могат да бъдат добавени по-късно." #: plinth/modules/users/templates/users_firstboot.html:28 msgid "Create Account" @@ -6627,11 +6657,11 @@ msgstr "Създаване на профил" #: plinth/modules/users/templates/users_firstboot.html:32 msgid "An administrator account already exists." -msgstr "" +msgstr "Вече съществува администраторски профил." #: plinth/modules/users/templates/users_firstboot.html:38 msgid "The following administrator accounts exist in the system." -msgstr "" +msgstr "В системата съществуват следните администраторски профили." #: plinth/modules/users/templates/users_firstboot.html:50 #, python-format, python-brace-format @@ -6642,26 +6672,31 @@ msgid "" "{username}'. If an account is already usable with %(box_name)s, skip this " "step." msgstr "" +"а да създадете профил, който може да се използва с %(box_name)s, премахнете " +"тези профили от командния ред и презаредете страницата. Чрез командния ред " +"изпълнете 'echo \"{password}\" | /usr/share/plinth/actions/users remove-user " +"{username}'. Ако профилът вече може да се използва с %(box_name)s, " +"прескочете тази стъпка." #: plinth/modules/users/templates/users_list.html:11 #: plinth/modules/users/views.py:61 msgid "Users" -msgstr "" +msgstr "Поребители" #: plinth/modules/users/templates/users_list.html:28 #, python-format msgid "Edit user %(username)s" -msgstr "" +msgstr "Промяна на потребителя %(username)s" #: plinth/modules/users/templates/users_list.html:41 #, python-format msgid "Delete user %(username)s" -msgstr "" +msgstr "Премахване на потребителя %(username)s" #: plinth/modules/users/templates/users_update.html:11 #, python-format msgid "Edit User %(username)s" -msgstr "" +msgstr "Променяне на потребителя %(username)s" #: plinth/modules/users/templates/users_update.html:19 #, python-format @@ -6669,44 +6704,44 @@ msgid "" "Use the change password form to " "change the password." msgstr "" -"За да смените паролата, използвайте формуляра за смяна на парола." +"За да промените паролата, използвайте формуляра за промяна на парола." #: plinth/modules/users/templates/users_update.html:31 #: plinth/templates/language-selection.html:17 msgid "Save Changes" -msgstr "" +msgstr "Запазване на промените" #: plinth/modules/users/views.py:42 #, python-format msgid "User %(username)s created." -msgstr "" +msgstr "Потребителят %(username)s е създаден." #: plinth/modules/users/views.py:76 #, python-format msgid "User %(username)s updated." -msgstr "" +msgstr "Потребителят %(username)s е обновен." #: plinth/modules/users/views.py:77 msgid "Edit User" -msgstr "" +msgstr "Промяна на потребител" #: plinth/modules/users/views.py:146 #, python-brace-format msgid "User {user} deleted." -msgstr "" +msgstr "Потребителят {user} е премахнат." #: plinth/modules/users/views.py:153 msgid "Deleting LDAP user failed." -msgstr "" +msgstr "Потребителят на LDAP не е премахнат." #: plinth/modules/users/views.py:180 msgid "Change Password" -msgstr "Смяна на парола" +msgstr "Промяна на парола" #: plinth/modules/users/views.py:181 msgid "Password changed successfully." -msgstr "Паролата е сменена." +msgstr "Паролата е променена." #: plinth/modules/wireguard/__init__.py:20 msgid "WireGuard is a fast, modern, secure VPN tunnel." diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index 6cc44aed6..606af2aab 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-06-16 07:33+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3240,7 +3240,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5622,7 +5622,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/cs/LC_MESSAGES/django.po b/plinth/locale/cs/LC_MESSAGES/django.po index 66d53e22d..8a7287064 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-06-25 00:20+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech Clients to connect to Mumble from your " @@ -3621,11 +3621,11 @@ msgstr "" "dispozici jsou Klienti pro připojení k " "Mumble z vašeho počítače a mobilních zařízení." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Hlasový chat" @@ -3673,7 +3673,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "Heslo SuperUser bylo úspěšně aktualizováno." @@ -6426,7 +6426,7 @@ msgstr "Sdružené přihlášení (SSO)" msgid "Login" msgstr "Přihlášení" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "Odhlášení proběhlo úspěšně." diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index 8735e1f8e..6641906b2 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-05-10 02:10+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Danish Klienter til computere og Android-enheder " "er tilgængelige." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 #, fuzzy #| msgid "Voice Chat (Mumble)" msgid "Voice Chat" @@ -3726,7 +3726,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 #, fuzzy #| msgid "Password changed successfully." msgid "SuperUser password successfully updated." @@ -6481,7 +6481,7 @@ msgstr "" msgid "Login" msgstr "Log ind" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 #, fuzzy #| msgid "Password changed successfully." msgid "Logged out successfully." diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index bb88a8b23..8ec12407b 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-06-22 17:14+0000\n" "Last-Translator: ikmaak \n" "Language-Team: German Clients to connect to Mumble from your " @@ -3697,11 +3697,11 @@ msgstr "" "verbinden. Auf Mumble finden Sie " "Anwendungen, um sich vom Desktop oder Mobil-Gerät mit Mumble zu verbinden." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Sprachkonferenz" @@ -3750,7 +3750,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "SuperUser-Kennwort wurde erfolgreich aktualisiert." @@ -6546,7 +6546,7 @@ msgstr "Einmal-Anmeldung" msgid "Login" msgstr "Anmelden" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "Erfolgreich abgemeldet." diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index a31cb1b07..7ebf41392 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -395,11 +395,11 @@ msgstr "" msgid "Repository path is neither empty nor is an existing backups repository." msgstr "" -#: plinth/modules/backups/repository.py:143 +#: plinth/modules/backups/repository.py:147 msgid "Existing repository is not encrypted." msgstr "" -#: plinth/modules/backups/repository.py:327 +#: plinth/modules/backups/repository.py:331 #, python-brace-format msgid "{box_name} storage" msgstr "" @@ -936,7 +936,7 @@ msgstr "" #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:78 #: plinth/modules/ejabberd/views.py:96 plinth/modules/email/views.py:45 #: plinth/modules/matrixsynapse/views.py:124 -#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:29 +#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:35 #: plinth/modules/pagekite/forms.py:78 plinth/modules/quassel/views.py:28 #: plinth/modules/roundcube/views.py:32 plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:43 plinth/modules/ttrss/views.py:26 @@ -1295,12 +1295,12 @@ msgstr "" msgid "-- no time zone set --" msgstr "" -#: plinth/modules/datetime/views.py:45 +#: plinth/modules/datetime/views.py:49 #, python-brace-format msgid "Error setting time zone: {exception}" msgstr "" -#: plinth/modules/datetime/views.py:48 +#: plinth/modules/datetime/views.py:52 msgid "Time zone set" msgstr "" @@ -1328,7 +1328,7 @@ msgstr "" msgid "BitTorrent Web Client" msgstr "" -#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:21 +#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:20 msgid "Download directory" msgstr "" @@ -2971,39 +2971,39 @@ msgid "" "\"." msgstr "" -#: plinth/modules/mediawiki/forms.py:40 +#: plinth/modules/mediawiki/forms.py:41 msgid "Site Name" msgstr "" -#: plinth/modules/mediawiki/forms.py:41 +#: plinth/modules/mediawiki/forms.py:42 msgid "Name of the site as displayed throughout the wiki." msgstr "" -#: plinth/modules/mediawiki/forms.py:45 +#: plinth/modules/mediawiki/forms.py:46 msgid "Enable public registrations" msgstr "" -#: plinth/modules/mediawiki/forms.py:46 +#: plinth/modules/mediawiki/forms.py:47 msgid "" "If enabled, anyone on the internet will be able to create an account on your " "MediaWiki instance." msgstr "" -#: plinth/modules/mediawiki/forms.py:50 +#: plinth/modules/mediawiki/forms.py:51 msgid "Enable private mode" msgstr "" -#: plinth/modules/mediawiki/forms.py:51 +#: plinth/modules/mediawiki/forms.py:52 msgid "" "If enabled, access will be restricted. Only people who have accounts can " "read/write to the wiki. Public registrations will also be disabled." msgstr "" -#: plinth/modules/mediawiki/forms.py:56 +#: plinth/modules/mediawiki/forms.py:57 msgid "Default Skin" msgstr "" -#: plinth/modules/mediawiki/forms.py:57 +#: plinth/modules/mediawiki/forms.py:58 msgid "" "Choose a default skin for your MediaWiki installation. Users have the option " "to select their preferred skin." @@ -3162,24 +3162,24 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mumble/__init__.py:26 +#: plinth/modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " "software." msgstr "" -#: plinth/modules/mumble/__init__.py:28 +#: plinth/modules/mumble/__init__.py:27 msgid "" "You can connect to your Mumble server on the regular Mumble port 64738. Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3221,7 +3221,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5601,7 +5601,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index c41c1ed56..f72cf38df 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-04-21 09:08+0000\n" "Last-Translator: Giannis \n" "Language-Team: Greek Πελάτες για να συνδεθείτε με το Mumble από " "τον υπολογιστή και τις συσκευές Android είναι διαθέσιμες." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Φωνητική συνομιλία" @@ -3840,7 +3840,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "Ο κωδικός πρόσβασης SuperUser Ενημερώθηκε με επιτυχία." @@ -6647,7 +6647,7 @@ msgstr "Ενιαία είσοδος" msgid "Login" msgstr "Σύνδεση" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 #, fuzzy #| msgid "Password changed successfully." msgid "Logged out successfully." diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index 3791f11f9..7e2c6a021 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-03-10 22:59+0000\n" "Last-Translator: Nathaniel Ramos Alexander \n" "Language-Team: Spanish Clientes para conectar desde " "sus dispositivos de escritorio o Android." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Chat de voz" @@ -3752,7 +3752,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "Clave de administración cambiada con éxito." @@ -6514,7 +6514,7 @@ msgstr "Inicio de sesión único" msgid "Login" msgstr "Inicio de sesión" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 #, fuzzy #| msgid "Password changed successfully." msgid "Logged out successfully." diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index df25de78a..2e6e569c6 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-09-07 11:34+0000\n" "Last-Translator: Seyed mohammad ali Hosseinifard \n" "Language-Team: Persian نرم‌افزارهایی برای اتصال به سرور مامبل برای " "کامپیوتر رومیزی و دستگاه‌های اندروید در دسترس است." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 #, fuzzy #| msgid "Voice Chat (Mumble)" msgid "Voice Chat" @@ -3646,7 +3646,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -6223,7 +6223,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 #, fuzzy #| msgid "Partition expanded successfully." msgid "Logged out successfully." diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index afc7760bf..a38d4160f 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers CLIENTS TO CONNECT TO MUMBLE FROM YOUR " "DESKTOP AND ANDROID DEVICES ARE AVAILABLE." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 #, fuzzy #| msgid "Voice Chat (Mumble)" msgid "Voice Chat" @@ -3787,7 +3787,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 #, fuzzy #| msgid "Password changed successfully." msgid "SuperUser password successfully updated." @@ -6563,7 +6563,7 @@ msgstr "" msgid "Login" msgstr "LOGIN" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 #, fuzzy #| msgid "Password changed successfully." msgid "Logged out successfully." diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index f525e916b..e0c7ee411 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-06-17 19:15+0000\n" "Last-Translator: Coucouf \n" "Language-Team: French Clients to connect to Mumble from your " @@ -3719,11 +3719,11 @@ msgstr "" "64738. Utilisez l’un des clients Mumble " "pour vous connecter depuis votre ordinateur ou un appareil mobile." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Tchat vocal" @@ -3774,7 +3774,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "Le mot de passe du super utilisateur a été mis à jour." @@ -6592,7 +6592,7 @@ msgstr "Authentification unique" msgid "Login" msgstr "S’identifier" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "Déconnecté avec succès." diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index c6b85f532..15d52bdb6 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Galician Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3235,7 +3235,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5625,7 +5625,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/gu/LC_MESSAGES/django.po b/plinth/locale/gu/LC_MESSAGES/django.po index 8f9920150..ba47563a2 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Gujarati Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3467,7 +3467,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5888,7 +5888,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/hi/LC_MESSAGES/django.po b/plinth/locale/hi/LC_MESSAGES/django.po index f8dfb791f..b33b526d4 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Hindi Clients अापके डेस्कटॉप और एंड्रॉयड डिवाइस से ममबल से कनेक्ट होने के " "लिए उपलब्ध हैं." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "ममबल" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "वॉयस चैट" @@ -3728,7 +3728,7 @@ msgstr "ममबलफ्लाई" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 #, fuzzy #| msgid "Password changed successfully." msgid "SuperUser password successfully updated." @@ -6455,7 +6455,7 @@ msgstr "एकल साइन-ऑन" msgid "Login" msgstr "लॉगिन" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 #, fuzzy #| msgid "Password changed successfully." msgid "Logged out successfully." diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index ecc291ab0..45bca884a 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-05-10 02:10+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Hungarian Clients to connect to Mumble from your " @@ -3677,11 +3677,11 @@ msgstr "" "kapcsolódhatsz. A Mumble-kliensek " "elérhetők az asztali és mobil eszközökhöz." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Audiókonferencia" @@ -3731,7 +3731,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "A SuperUser jelszava sikeresen frissítve." @@ -6513,7 +6513,7 @@ msgstr "Egyszeri bejelentkezés" msgid "Login" msgstr "Bejelentkezés" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "Sikeres kijelentkezés." diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index e175923b4..3c9032a4f 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-06-24 00:42+0000\n" "Last-Translator: Reza Almanda \n" "Language-Team: Indonesian Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Pesan Suara" @@ -3643,7 +3643,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -6059,7 +6059,7 @@ msgstr "" msgid "Login" msgstr "Masuk" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index 9b297a489..67e7f9f40 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-01-06 22:41+0000\n" "Last-Translator: Dietmar \n" "Language-Team: Italian Sono disponibili dei client da " "connettere a Mumble dai tuoi dispositivi desktop e android." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Voice Chat" @@ -3681,7 +3681,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -6182,7 +6182,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index cd199f189..4534c4def 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-05-20 12:32+0000\n" "Last-Translator: Jacque Fresco \n" "Language-Team: Japanese Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3223,7 +3223,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5603,7 +5603,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/kn/LC_MESSAGES/django.po b/plinth/locale/kn/LC_MESSAGES/django.po index b1863aeb3..ea6100156 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2020-07-16 16:41+0000\n" "Last-Translator: Yogesh \n" "Language-Team: Kannada Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3223,7 +3223,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5605,7 +5605,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/lt/LC_MESSAGES/django.po b/plinth/locale/lt/LC_MESSAGES/django.po index d369bcc1f..b085c2ad5 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-02-22 10:50+0000\n" "Last-Translator: Kornelijus Tvarijanavičius \n" "Language-Team: Lithuanian Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3224,7 +3224,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5604,7 +5604,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/lv/LC_MESSAGES/django.po b/plinth/locale/lv/LC_MESSAGES/django.po index ee0b4cd9f..1763bc15a 100644 --- a/plinth/locale/lv/LC_MESSAGES/django.po +++ b/plinth/locale/lv/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -394,11 +394,11 @@ msgstr "" msgid "Repository path is neither empty nor is an existing backups repository." msgstr "" -#: plinth/modules/backups/repository.py:143 +#: plinth/modules/backups/repository.py:147 msgid "Existing repository is not encrypted." msgstr "" -#: plinth/modules/backups/repository.py:327 +#: plinth/modules/backups/repository.py:331 #, python-brace-format msgid "{box_name} storage" msgstr "" @@ -935,7 +935,7 @@ msgstr "" #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:78 #: plinth/modules/ejabberd/views.py:96 plinth/modules/email/views.py:45 #: plinth/modules/matrixsynapse/views.py:124 -#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:29 +#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:35 #: plinth/modules/pagekite/forms.py:78 plinth/modules/quassel/views.py:28 #: plinth/modules/roundcube/views.py:32 plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:43 plinth/modules/ttrss/views.py:26 @@ -1294,12 +1294,12 @@ msgstr "" msgid "-- no time zone set --" msgstr "" -#: plinth/modules/datetime/views.py:45 +#: plinth/modules/datetime/views.py:49 #, python-brace-format msgid "Error setting time zone: {exception}" msgstr "" -#: plinth/modules/datetime/views.py:48 +#: plinth/modules/datetime/views.py:52 msgid "Time zone set" msgstr "" @@ -1327,7 +1327,7 @@ msgstr "" msgid "BitTorrent Web Client" msgstr "" -#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:21 +#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:20 msgid "Download directory" msgstr "" @@ -2970,39 +2970,39 @@ msgid "" "\"." msgstr "" -#: plinth/modules/mediawiki/forms.py:40 +#: plinth/modules/mediawiki/forms.py:41 msgid "Site Name" msgstr "" -#: plinth/modules/mediawiki/forms.py:41 +#: plinth/modules/mediawiki/forms.py:42 msgid "Name of the site as displayed throughout the wiki." msgstr "" -#: plinth/modules/mediawiki/forms.py:45 +#: plinth/modules/mediawiki/forms.py:46 msgid "Enable public registrations" msgstr "" -#: plinth/modules/mediawiki/forms.py:46 +#: plinth/modules/mediawiki/forms.py:47 msgid "" "If enabled, anyone on the internet will be able to create an account on your " "MediaWiki instance." msgstr "" -#: plinth/modules/mediawiki/forms.py:50 +#: plinth/modules/mediawiki/forms.py:51 msgid "Enable private mode" msgstr "" -#: plinth/modules/mediawiki/forms.py:51 +#: plinth/modules/mediawiki/forms.py:52 msgid "" "If enabled, access will be restricted. Only people who have accounts can " "read/write to the wiki. Public registrations will also be disabled." msgstr "" -#: plinth/modules/mediawiki/forms.py:56 +#: plinth/modules/mediawiki/forms.py:57 msgid "Default Skin" msgstr "" -#: plinth/modules/mediawiki/forms.py:57 +#: plinth/modules/mediawiki/forms.py:58 msgid "" "Choose a default skin for your MediaWiki installation. Users have the option " "to select their preferred skin." @@ -3161,24 +3161,24 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mumble/__init__.py:26 +#: plinth/modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " "software." msgstr "" -#: plinth/modules/mumble/__init__.py:28 +#: plinth/modules/mumble/__init__.py:27 msgid "" "You can connect to your Mumble server on the regular Mumble port 64738. Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3220,7 +3220,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5600,7 +5600,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index 35684cdb2..8923da944 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-05-16 14:14+0000\n" "Last-Translator: Petter Reinholdtsen \n" "Language-Team: Norwegian Bokmål Klienter for å koble til Mumble når skrivebordet " "og/eller Android-enheter er tilgjengelige." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Talenettprat" @@ -3760,7 +3760,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 #, fuzzy #| msgid "Password changed successfully." msgid "SuperUser password successfully updated." @@ -6523,7 +6523,7 @@ msgstr "Engangspålogging" msgid "Login" msgstr "Login" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 #, fuzzy #| msgid "Password changed successfully." msgid "Logged out successfully." diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index 593cdaa7f..68ed02990 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-06-22 17:14+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch Clients to connect to Mumble from your " @@ -3662,11 +3662,11 @@ msgstr "" "programma's waarmee de Mumble dienst gebruikt kan worden. Er zijn " "programma's voor zowel desktop en mobiele apparaten." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Voice Chat" @@ -3714,7 +3714,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "Wachtwoord van de SuperGebruiker succesvol gewijzigd." @@ -6478,7 +6478,7 @@ msgstr "Eenmalige aanmelding" msgid "Login" msgstr "Aanmelding" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "Succesvol uitgelogd." diff --git a/plinth/locale/pl/LC_MESSAGES/django.po b/plinth/locale/pl/LC_MESSAGES/django.po index b4daf7694..a979b7045 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-05-10 02:10+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Polish Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3566,7 +3566,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -6033,7 +6033,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 #, fuzzy #| msgid "Partition expanded successfully." msgid "Logged out successfully." diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index 5098c815e..fc5f27f66 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-05-08 22:33+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3429,7 +3429,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5878,7 +5878,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index 7b3e0a046..752025023 100644 --- a/plinth/locale/ru/LC_MESSAGES/django.po +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-20 20:21-0400\n" -"PO-Revision-Date: 2022-06-13 12:19+0000\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" +"PO-Revision-Date: 2022-06-29 21:17+0000\n" "Last-Translator: Nikita Epifanov \n" "Language-Team: Russian \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -435,11 +435,11 @@ msgstr "" "Путь к хранилищу не пустой и не является существующим репозиторием резервных " "копий." -#: plinth/modules/backups/repository.py:143 +#: plinth/modules/backups/repository.py:147 msgid "Existing repository is not encrypted." msgstr "Имеющийся репозиторий не зашифрован." -#: plinth/modules/backups/repository.py:327 +#: plinth/modules/backups/repository.py:331 #, python-brace-format msgid "{box_name} storage" msgstr "Сохранение данных {box_name}" @@ -1020,7 +1020,7 @@ msgstr "Обновите IP-адреса и домены" #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:78 #: plinth/modules/ejabberd/views.py:96 plinth/modules/email/views.py:45 #: plinth/modules/matrixsynapse/views.py:124 -#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:29 +#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:35 #: plinth/modules/pagekite/forms.py:78 plinth/modules/quassel/views.py:28 #: plinth/modules/roundcube/views.py:32 plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:43 plinth/modules/ttrss/views.py:26 @@ -1439,12 +1439,12 @@ msgstr "" msgid "-- no time zone set --" msgstr "-- не выбран часовой пояс --" -#: plinth/modules/datetime/views.py:45 +#: plinth/modules/datetime/views.py:49 #, python-brace-format msgid "Error setting time zone: {exception}" msgstr "Ошибка установки часового пояса: {exception}" -#: plinth/modules/datetime/views.py:48 +#: plinth/modules/datetime/views.py:52 msgid "Time zone set" msgstr "Смена часового пояса" @@ -1474,7 +1474,7 @@ msgstr "Delugе" msgid "BitTorrent Web Client" msgstr "BitTorrent Веб Клиент" -#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:21 +#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:20 msgid "Download directory" msgstr "Папка для загрузок" @@ -1864,8 +1864,6 @@ msgid "Chat Server" msgstr "Чат-сервер" #: plinth/modules/ejabberd/forms.py:19 -#, fuzzy -#| msgid "Domain Names" msgid "Domain names" msgstr "Доменные имена" @@ -1874,6 +1872,9 @@ msgid "" "Domains to be used by ejabberd. Note that user accounts are unique for each " "domain, and migrating users to a new domain name is not yet implemented." msgstr "" +"Домены, которые будут использоваться ejabberd. Обратите внимание, что " +"учетные записи пользователей уникальны для каждого домена, и перенос " +"пользователей на новое доменное имя пока не реализовано." #: plinth/modules/ejabberd/forms.py:26 msgid "Enable Message Archive Management" @@ -3027,10 +3028,9 @@ msgid "A simple video conference room is included." msgstr "Включает в себя простую комнату видеоконференций." #: plinth/modules/janus/__init__.py:26 -#, fuzzy, python-brace-format -#| msgid "A STUN/TURN server (such as Coturn) is required to use Janus." +#, python-brace-format msgid "Coturn is required to use Janus." -msgstr "Для использования Janus требуется сервер STUN/TURN (например, Coturn)." +msgstr "Coturn необходим для использования Janus." #: plinth/modules/janus/__init__.py:44 msgid "Janus" @@ -3398,7 +3398,9 @@ msgid "" "password." msgstr "" "Установить новый пароль для учетной записи администратора MediaWiki (admin). " -"Оставьте это поле пустым, чтобы сохранить текущий пароль." +"Пароль не может быть общим, а минимальная требуемая длина составляет " +"10 символов. Оставьте это поле пустым, чтобы сохранить " +"текущий пароль." #: plinth/modules/mediawiki/forms.py:35 msgid "" @@ -3410,21 +3412,19 @@ msgstr "" "внизу веб-страниц, в RSS-потоках или в электронных письмах. Например: " "\"myfreedombox.example.org\" или \"example.onion\"." -#: plinth/modules/mediawiki/forms.py:40 -#, fuzzy -#| msgid "Kite name" -msgid "Site Name" -msgstr "Имя Kite" - #: plinth/modules/mediawiki/forms.py:41 -msgid "Name of the site as displayed throughout the wiki." -msgstr "" +msgid "Site Name" +msgstr "Название сайта" -#: plinth/modules/mediawiki/forms.py:45 +#: plinth/modules/mediawiki/forms.py:42 +msgid "Name of the site as displayed throughout the wiki." +msgstr "Название сайта, отображаемое в вики." + +#: plinth/modules/mediawiki/forms.py:46 msgid "Enable public registrations" msgstr "Включить публичную регистрацию" -#: plinth/modules/mediawiki/forms.py:46 +#: plinth/modules/mediawiki/forms.py:47 msgid "" "If enabled, anyone on the internet will be able to create an account on your " "MediaWiki instance." @@ -3432,11 +3432,11 @@ msgstr "" "Если включено, кто угодно в интернете сможет создать учётную запись в вашем " "экземпляре MediaWiki." -#: plinth/modules/mediawiki/forms.py:50 +#: plinth/modules/mediawiki/forms.py:51 msgid "Enable private mode" msgstr "Включить режим приватности" -#: plinth/modules/mediawiki/forms.py:51 +#: plinth/modules/mediawiki/forms.py:52 msgid "" "If enabled, access will be restricted. Only people who have accounts can " "read/write to the wiki. Public registrations will also be disabled." @@ -3445,11 +3445,11 @@ msgstr "" "записи, смогут читать или писать в вики. Публичные регистрации также будут " "отключены." -#: plinth/modules/mediawiki/forms.py:56 +#: plinth/modules/mediawiki/forms.py:57 msgid "Default Skin" msgstr "Скин по умолчанию" -#: plinth/modules/mediawiki/forms.py:57 +#: plinth/modules/mediawiki/forms.py:58 msgid "" "Choose a default skin for your MediaWiki installation. Users have the option " "to select their preferred skin." @@ -3490,10 +3490,8 @@ msgid "Domain name updated" msgstr "Доменное имя обновлено" #: plinth/modules/mediawiki/views.py:103 -#, fuzzy -#| msgid "Domain name updated" msgid "Site name updated" -msgstr "Доменное имя обновлено" +msgstr "Название сайта обновлено" #: plinth/modules/minetest/__init__.py:35 #, python-brace-format @@ -3635,7 +3633,7 @@ msgstr "Указанный каталог не существует." msgid "Updated media directory" msgstr "Обновленный каталог медиа" -#: plinth/modules/mumble/__init__.py:26 +#: plinth/modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " "software." @@ -3643,7 +3641,7 @@ msgstr "" "Mumble это шифрованый чат с высоким качеством голоса, низкой задержкой и " "открытым исходным кодом." -#: plinth/modules/mumble/__init__.py:28 +#: plinth/modules/mumble/__init__.py:27 msgid "" "You can connect to your Mumble server on the regular Mumble port 64738. Clients to connect to Mumble from your " @@ -3653,11 +3651,11 @@ msgstr "" "href=\"http://mumble.info\">Клиенты для подключения к Mumble с " "настольных и мобильных устройств так же доступны." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Голосовой чат" @@ -3675,7 +3673,7 @@ msgstr "" #: plinth/modules/mumble/forms.py:40 msgid "Set a password to join the server" -msgstr "" +msgstr "Установите пароль для подключения к серверу" #: plinth/modules/mumble/forms.py:42 #, fuzzy @@ -3686,8 +3684,8 @@ msgid "" "Set a password that is required to join the server. Leave empty to use the " "current password." msgstr "" -"Установить новый пароль для Coquelicot. Оставьте это поле пустым, чтобы " -"сохранить текущий пароль." +"Установить пароль для подключения к серверу. Оставьте пустым, чтобы " +"использовать текущий пароль." #: plinth/modules/mumble/forms.py:48 msgid "Set the name for the root channel" @@ -3709,15 +3707,13 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "Пароль суперпользователя успешно обновлён." #: plinth/modules/mumble/views.py:46 -#, fuzzy -#| msgid "Upload password updated" msgid "Join password changed" -msgstr "Пароль загрузки обновлен" +msgstr "Пароль для подключения обновлён" #: plinth/modules/mumble/views.py:51 msgid "Root channel name changed." @@ -6465,7 +6461,7 @@ msgstr "Единый вход" msgid "Login" msgstr "Логин" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "Выход выполнен успешно." diff --git a/plinth/locale/si/LC_MESSAGES/django.po b/plinth/locale/si/LC_MESSAGES/django.po index 56e432909..daaa33cdf 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-04-27 13:32+0000\n" "Last-Translator: HelaBasa \n" "Language-Team: Sinhala Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3223,7 +3223,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5603,7 +5603,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/sl/LC_MESSAGES/django.po b/plinth/locale/sl/LC_MESSAGES/django.po index 34764e305..75f0ae355 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Slovenian Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3427,7 +3427,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5835,7 +5835,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/sq/LC_MESSAGES/django.po b/plinth/locale/sq/LC_MESSAGES/django.po index cccf4f11d..3ffe3e6f7 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-02-06 23:23+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian Clients to connect to Mumble from your " @@ -3692,11 +3692,11 @@ msgstr "" "64738. Ka klientë klientë të gatshëm për " "t’u lidhur me Mumble-in që nga desktopi apo pajisjet tuaja celulare." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Fjalosje Me Zë" @@ -3741,7 +3741,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "Fjalëkalimi i superpërdoruesit u përditësua me sukses." @@ -6512,7 +6512,7 @@ msgstr "Hyrje Njëshe" msgid "Login" msgstr "Hyrje" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "U dol me sukses." diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index 6c25531f6..67cab624b 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Serbian Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3324,7 +3324,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5720,7 +5720,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index 26c253598..86736d1b5 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-05-27 17:17+0000\n" "Last-Translator: Michael Breidenbach \n" "Language-Team: Swedish Clients to connect to Mumble from your " @@ -3628,11 +3628,11 @@ msgstr "" "\"http://mumble.info\"> Appar finns för att ansluta till Mumble från din " "dator- och Android-enheter." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Röstchatt" @@ -3683,7 +3683,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "SuperUser lösenord har uppdaterats." @@ -6433,7 +6433,7 @@ msgstr "Enkel inloggning på" msgid "Login" msgstr "Logga in" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "Du har loggat ut framgångsrikt." diff --git a/plinth/locale/ta/LC_MESSAGES/django.po b/plinth/locale/ta/LC_MESSAGES/django.po index 4601b82f4..1f6972ab6 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -396,11 +396,11 @@ msgstr "" msgid "Repository path is neither empty nor is an existing backups repository." msgstr "" -#: plinth/modules/backups/repository.py:143 +#: plinth/modules/backups/repository.py:147 msgid "Existing repository is not encrypted." msgstr "" -#: plinth/modules/backups/repository.py:327 +#: plinth/modules/backups/repository.py:331 #, python-brace-format msgid "{box_name} storage" msgstr "" @@ -937,7 +937,7 @@ msgstr "" #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:78 #: plinth/modules/ejabberd/views.py:96 plinth/modules/email/views.py:45 #: plinth/modules/matrixsynapse/views.py:124 -#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:29 +#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:35 #: plinth/modules/pagekite/forms.py:78 plinth/modules/quassel/views.py:28 #: plinth/modules/roundcube/views.py:32 plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:43 plinth/modules/ttrss/views.py:26 @@ -1296,12 +1296,12 @@ msgstr "" msgid "-- no time zone set --" msgstr "" -#: plinth/modules/datetime/views.py:45 +#: plinth/modules/datetime/views.py:49 #, python-brace-format msgid "Error setting time zone: {exception}" msgstr "" -#: plinth/modules/datetime/views.py:48 +#: plinth/modules/datetime/views.py:52 msgid "Time zone set" msgstr "" @@ -1329,7 +1329,7 @@ msgstr "" msgid "BitTorrent Web Client" msgstr "" -#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:21 +#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:20 msgid "Download directory" msgstr "" @@ -2972,39 +2972,39 @@ msgid "" "\"." msgstr "" -#: plinth/modules/mediawiki/forms.py:40 +#: plinth/modules/mediawiki/forms.py:41 msgid "Site Name" msgstr "" -#: plinth/modules/mediawiki/forms.py:41 +#: plinth/modules/mediawiki/forms.py:42 msgid "Name of the site as displayed throughout the wiki." msgstr "" -#: plinth/modules/mediawiki/forms.py:45 +#: plinth/modules/mediawiki/forms.py:46 msgid "Enable public registrations" msgstr "" -#: plinth/modules/mediawiki/forms.py:46 +#: plinth/modules/mediawiki/forms.py:47 msgid "" "If enabled, anyone on the internet will be able to create an account on your " "MediaWiki instance." msgstr "" -#: plinth/modules/mediawiki/forms.py:50 +#: plinth/modules/mediawiki/forms.py:51 msgid "Enable private mode" msgstr "" -#: plinth/modules/mediawiki/forms.py:51 +#: plinth/modules/mediawiki/forms.py:52 msgid "" "If enabled, access will be restricted. Only people who have accounts can " "read/write to the wiki. Public registrations will also be disabled." msgstr "" -#: plinth/modules/mediawiki/forms.py:56 +#: plinth/modules/mediawiki/forms.py:57 msgid "Default Skin" msgstr "" -#: plinth/modules/mediawiki/forms.py:57 +#: plinth/modules/mediawiki/forms.py:58 msgid "" "Choose a default skin for your MediaWiki installation. Users have the option " "to select their preferred skin." @@ -3163,24 +3163,24 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mumble/__init__.py:26 +#: plinth/modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " "software." msgstr "" -#: plinth/modules/mumble/__init__.py:28 +#: plinth/modules/mumble/__init__.py:27 msgid "" "You can connect to your Mumble server on the regular Mumble port 64738. Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3222,7 +3222,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5602,7 +5602,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index 6644ae6b7..e4cb5ed51 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-03-02 12:27+0000\n" "Last-Translator: James Valleroy \n" "Language-Team: Telugu Clients to connect to Mumble from your " @@ -3537,11 +3537,11 @@ msgstr "" "పరికరాల నుండి Mumbleకి బంధించడానికి క్లయింట్లు " "అందుబాటులో ఉన్నాయి." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "మంబుల్" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "స్వర సంభాషణ" @@ -3591,7 +3591,7 @@ msgstr "ముంబుల్ ఫ్లై" msgid "Mumla" msgstr "ముంల" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "సూపర్ యూసర్ ర హస్యపదం విజయవంతంగా మార్చబడినది." @@ -6247,7 +6247,7 @@ msgstr "సింగిల్ సైన్ ఆన్" msgid "Login" msgstr "ప్రవేశించు" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "విజయవంతంగా లాగ్ అవుట్ చేయబడింది." diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index c1556c0f8..be803f17e 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-06-22 17:14+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish Clients to connect to Mumble from your " @@ -3640,11 +3640,11 @@ msgstr "" "bağlanabilirsiniz. Masaüstünüzden ve mobil cihazlarınızdan Mumble'a " "bağlanmak için istemciler mevcuttur." -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Sesli Sohbet" @@ -3692,7 +3692,7 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "Süper Kullanıcı parolası başarılı olarak güncellendi." @@ -6446,7 +6446,7 @@ msgstr "Tek Oturum Açma" msgid "Login" msgstr "Oturum aç" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "Başarılı olarak oturumu kapatıldı." diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index 4e47deab4..fcf2a9728 100644 --- a/plinth/locale/uk/LC_MESSAGES/django.po +++ b/plinth/locale/uk/LC_MESSAGES/django.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-20 20:21-0400\n" -"PO-Revision-Date: 2022-05-10 02:10+0000\n" -"Last-Translator: ikmaak \n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" +"PO-Revision-Date: 2022-07-05 01:21+0000\n" +"Last-Translator: Andrij Mizyk \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.12.1\n" +"X-Generator: Weblate 4.13.1-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -93,7 +93,7 @@ msgstr "Використовувати мовні налаштування ог #: plinth/middleware.py:38 plinth/templates/setup.html:18 msgid "Application installed." -msgstr "Застосунок установлено." +msgstr "Застосунок встановлено." #: plinth/middleware.py:43 #, python-brace-format @@ -167,9 +167,9 @@ msgid "" "Enable an automatic backup schedule for data safety. Prefer an encrypted " "remote backup location or an extra attached disk." msgstr "" -"Дозволити заплановане автоматичне резервне копіювання, щоб зберегти даних. " +"Дозволити заплановане автоматичне резервне копіювання для зберігання даних. " "Для резервних копій надається перевага віддаленому зашифрованому " -"розташуванні або зовнішньому знімному диску." +"розташуванню або зовнішньому знімному диску." #: plinth/modules/backups/__init__.py:205 msgid "Enable a Backup Schedule" @@ -374,14 +374,14 @@ msgstr "Резервна копія збережеться в каталозі F #: plinth/modules/backups/forms.py:242 msgid "SSH Repository Path" -msgstr "Шляз репозиторію SSH" +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/" +"Шлях до нового або наявного репозиторію. Приклад: user@host:~/path/to/" "repo/" #: plinth/modules/backups/forms.py:247 @@ -418,7 +418,7 @@ msgstr "З’єднання відхилено" #: plinth/modules/backups/repository.py:48 msgid "Repository not found" -msgstr "Сховище не знайдено" +msgstr "Репозиторій не знайдено" #: plinth/modules/backups/repository.py:53 msgid "Incorrect encryption passphrase" @@ -433,11 +433,11 @@ msgid "Repository path is neither empty nor is an existing backups repository." msgstr "" "Шлях репозиторію непорожній і не є наявним репозиторієм резервних копій." -#: plinth/modules/backups/repository.py:143 +#: plinth/modules/backups/repository.py:147 msgid "Existing repository is not encrypted." -msgstr "Існуючий репозиторій не зашифровано." +msgstr "Наявний репозиторій не зашифровано." -#: plinth/modules/backups/repository.py:327 +#: plinth/modules/backups/repository.py:331 #, python-brace-format msgid "{box_name} storage" msgstr "Сховище {box_name}" @@ -559,11 +559,11 @@ msgstr "Відновити" #: plinth/modules/backups/templates/backups_repository.html:109 msgid "No archives currently exist." -msgstr "Поки що нема існуючих архівів." +msgstr "Ще нема наявних архівів." #: plinth/modules/backups/templates/backups_repository_remove.html:13 msgid "Are you sure that you want to remove this repository?" -msgstr "Ви впевнені, що хочете видалити це сховище?" +msgstr "Ви впевнені, що хочете видалити цей репозиторій?" #: plinth/modules/backups/templates/backups_repository_remove.html:19 msgid "" @@ -693,7 +693,7 @@ msgstr "Відновити з вивантаженого файлу" #: plinth/modules/backups/views.py:289 msgid "No additional disks available to add a repository." -msgstr "Не доступно додаткового диска для додавання репозиторію." +msgstr "Нема доступних дисків для додавання репозиторію." #: plinth/modules/backups/views.py:297 msgid "Create backup repository" @@ -737,7 +737,7 @@ msgstr "Репозиторій вилучено." #: plinth/modules/backups/views.py:446 msgid "Remove Repository" -msgstr "Видалити сховище" +msgstr "Видалити репозиторій" #: plinth/modules/backups/views.py:455 msgid "Repository removed. Backups were not deleted." @@ -773,7 +773,7 @@ msgid "" msgstr "" "bepasty не використовує імена користувачів для входу. Використовує лише " "паролі. Для кожного пароля можна вибрати набір дозволів. Створивши пароль, " -"Ви зможете ділитися ним із користувачами, які мають відповідні дозволи." +"Ви зможете поділитися ним із користувачами, які мають відповідні дозволи." #: plinth/modules/bepasty/__init__.py:29 msgid "" @@ -1014,7 +1014,7 @@ msgstr "Оновити IP-адреси і домени" #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:78 #: plinth/modules/ejabberd/views.py:96 plinth/modules/email/views.py:45 #: plinth/modules/matrixsynapse/views.py:124 -#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:29 +#: plinth/modules/minetest/views.py:69 plinth/modules/mumble/views.py:35 #: plinth/modules/pagekite/forms.py:78 plinth/modules/quassel/views.py:28 #: plinth/modules/roundcube/views.py:32 plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:43 plinth/modules/ttrss/views.py:26 @@ -1429,12 +1429,12 @@ msgstr "" msgid "-- no time zone set --" msgstr "-- часовий пояс не обрано --" -#: plinth/modules/datetime/views.py:45 +#: plinth/modules/datetime/views.py:49 #, python-brace-format msgid "Error setting time zone: {exception}" msgstr "Помилка задавання часового поясу: {exception}" -#: plinth/modules/datetime/views.py:48 +#: plinth/modules/datetime/views.py:52 msgid "Time zone set" msgstr "Часовий пояс задано" @@ -1464,7 +1464,7 @@ msgstr "Deluge" msgid "BitTorrent Web Client" msgstr "Вебклієнт BitTorrent" -#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:21 +#: plinth/modules/deluge/forms.py:20 plinth/modules/transmission/forms.py:20 msgid "Download directory" msgstr "Каталог завантаження" @@ -1521,7 +1521,7 @@ msgstr "" #: plinth/modules/diagnostics/__init__.py:219 msgid "You should not install any new apps on this system." -msgstr "Не слід установлювати нових застосунків на цій системі." +msgstr "Не слід встановлювати нові застосунки в цій системі." #: plinth/modules/diagnostics/__init__.py:231 #, no-python-format, python-brace-format @@ -1809,6 +1809,10 @@ msgid "" "target='_blank'>XMPP client. When enabled, ejabberd can be accessed by " "any user with a {box_name} login." msgstr "" +"Для справжнього спілкування Вам потрібен веб-клієнт або будь-який інший клієнт XMPP. Якщо ввімкнено, то отримати доступ до ejabberd " +"зможе будь-який користувач із логіном {box_name}." #: plinth/modules/ejabberd/__init__.py:42 #, python-brace-format @@ -1816,7 +1820,7 @@ msgid "" "ejabberd needs a STUN/TURN server for audio/video calls. Install the Coturn app or configure an external server." msgstr "" -"ejabberd потребує сервера STUN/TURN для звукових/відео дзвінків. Установіть " +"ejabberd потребує сервера STUN/TURN для звукових/відео дзвінків. Встановіть " "застосунок Coturn або налаштуйте зовнішній " "сервер." @@ -1830,8 +1834,6 @@ msgid "Chat Server" msgstr "Сервер чату" #: plinth/modules/ejabberd/forms.py:19 -#, fuzzy -#| msgid "Domain Names" msgid "Domain names" msgstr "Назви доменів" @@ -2084,11 +2086,11 @@ msgstr "" #: plinth/modules/email/templates/email.html:36 msgid "TTL" -msgstr "" +msgstr "TTL" #: plinth/modules/email/templates/email.html:37 msgid "Class" -msgstr "" +msgstr "Клас" #: plinth/modules/email/templates/email.html:39 msgid "Priority" @@ -2185,6 +2187,9 @@ msgid "" "also permitted in the firewall and when you disable a service it is also " "disabled in the firewall." msgstr "" +"Операції фаєрвола автоматичні. Якщо Ви дозволите сервіс, він також буде " +"дозволений у фаєрволі і якщо Ви вимкнете сервіс, він також буде вимкнений у " +"фаєрволі." #: plinth/modules/firewall/templates/firewall.html:102 #: plinth/modules/networks/templates/networks_configuration.html:22 @@ -2223,7 +2228,7 @@ msgstr "Без застосунків Ваш %(box_name)s не зможе баг #: plinth/modules/first_boot/templates/firstboot_complete.html:21 msgid "Install Apps" -msgstr "Установити застосунки" +msgstr "Встановити застосунки" #: plinth/modules/first_boot/templates/firstboot_complete.html:27 #, python-format @@ -2252,14 +2257,21 @@ msgid "" "available graphical clients. And you can share your code with people around " "the world." msgstr "" +"Git — це розподілена система керування версіями для відстежування змін у " +"вихідному коді під час розробки програмного забезпечення. Gitweb надає " +"вебінтерфейс для репозиторіїв Git. Ви можете переглядати історію і вміст " +"вихідного коду, використовувати пошук для пошуку повʼязаних комітів і коду. " +"Ви можете також клонувати репозиторії і відвантажувати зміни коду через " +"термінальний клієнт для Git або через різні доступні графічні клієнти. І Ви " +"можете ділитися своїм кодом із людьми по всьому світу." #: plinth/modules/gitweb/__init__.py:33 msgid "" "To learn more on how to use Git visit Git tutorial." msgstr "" -"Щоб дізнатися більше як користуватися Git відвідайте навчання Git." +"Щоб дізнатися більше про те, як користуватися Git відвідайте навчання Git." #: plinth/modules/gitweb/__init__.py:51 msgid "Read-write access to Git repositories" @@ -2540,7 +2552,7 @@ msgid "" "tracker to let our developers know. To report, first check if the issue " "is already reported and then use the \"New issue\" button." msgstr "" -"Якщо Ви знайшли ваду або проблему, використовуйте відстежувач " "помилок, щоб повідомити наших розробників. Перш ніж звітувати, перевірте " "чи хтось вже не звітував про цю проблему, а потім використовуйте кнопку «New " @@ -2640,9 +2652,10 @@ msgid "" "attach this status log to the bug report." msgstr "" "Це останні %(num_lines)s рядків із журналу стану для цього вебінтерфейсу. " -"Якщо Ви бажаєте повідомити про ваду, будь ласка використовуйте сторінку відстеження вад і прикріпіть цей журнал стану до звіту про ваду." +"Якщо Ви бажаєте повідомити про недолік, будь ласка використовуйте сторінку " +"відстеження недоліків і прикріпіть цей журнал стану до звіту про " +"недолік." #: plinth/modules/help/templates/statuslog.html:24 msgid "" @@ -2673,6 +2686,10 @@ msgid "" "anonymity by sending encrypted traffic through a volunteer-run network " "distributed around the world." msgstr "" +"Invisible Internet Project — це анонімний мережевий рівень, призначений для " +"захисту спілкування від цензури та стеження. I2P забезпечує анонімність, " +"надсилаючи зашифрований трафік через волонтерську мережу, розподілену по " +"всьому світу." #: plinth/modules/i2p/__init__.py:26 msgid "" @@ -2896,30 +2913,28 @@ msgstr "" #: plinth/modules/janus/__init__.py:23 msgid "Janus is a lightweight WebRTC server." -msgstr "" +msgstr "Janus — це легкий сервер WebRTC." #: plinth/modules/janus/__init__.py:24 msgid "A simple video conference room is included." -msgstr "" +msgstr "Входить проста кімната для відеоконференцій." #: plinth/modules/janus/__init__.py:26 #, python-brace-format msgid "Coturn is required to use Janus." -msgstr "" +msgstr "Для використання Janus потрібен Coturn." #: plinth/modules/janus/__init__.py:44 msgid "Janus" -msgstr "" +msgstr "Janus" #: plinth/modules/janus/__init__.py:46 -#, fuzzy -#| msgid "Web Server" msgid "WebRTC server" -msgstr "Вебсервер" +msgstr "Сервер WebRTC" #: plinth/modules/janus/manifest.py:7 msgid "Janus Video Room" -msgstr "" +msgstr "Відеокімната Janus" #: plinth/modules/janus/templates/janus_video_room.html:205 #: plinth/modules/jsxc/templates/jsxc_launch.html:117 @@ -2932,7 +2947,7 @@ msgid "" "JSXC is a web client for XMPP. Typically it is used with an XMPP server " "running locally." msgstr "" -"JSXC – це вебклієнт для XMPP. Як правило, використовується з запущеним " +"JSXC – це вебклієнт для XMPP. Як правило, використовується зі запущеним " "локальним сервером XMPP." #: plinth/modules/jsxc/__init__.py:44 plinth/modules/jsxc/manifest.py:7 @@ -3222,47 +3237,39 @@ msgid "Administrator Password" msgstr "Пароль адміністратора" #: plinth/modules/mediawiki/forms.py:27 -#, fuzzy -#| msgid "" -#| "Set a new password for MediaWiki's administrator account (admin). Leave " -#| "this field blank to keep the current password." msgid "" "Set a new password for MediaWiki's administrator account (admin). The " "password cannot be a common one and the minimum required length is " "10 characters. Leave this field blank to keep the current " "password." msgstr "" -"Вкажіть новий пароль для обліківки адміністратора (admin) MediaWiki. Залиште " -"поле порожнім, якщо хочете зберегти поточний пароль." +"Вкажіть новий пароль для облікового запису адміністратора (admin) MediaWiki. " +"Пароль не повинен бути поширеним і не повинен бути коротшим за 10 " +"знаків. Залиште поле порожнім, щоб зберегти поточний пароль." #: plinth/modules/mediawiki/forms.py:35 -#, fuzzy -#| msgid "" -#| "Used by MediaWiki to generate URLs that point to the wiki such as in " -#| "footer, feeds and emails." msgid "" "Used by MediaWiki to generate URLs that point to the wiki such as in footer, " "feeds and emails. Examples: \"myfreedombox.example.org\" or \"example.onion" "\"." msgstr "" -"Використовується MediaWiki, щоб ґенерувати URL-адреси, які вказують на " -"вікісторінки, наприклад, внизу вебсторінок, у RSS-стрічках чи в ел. листах." - -#: plinth/modules/mediawiki/forms.py:40 -#, fuzzy -#| msgid "Kite name" -msgid "Site Name" -msgstr "Назва kite" +"Використовується в MediaWiki для ґенерування URL-адрес, що вказують на " +"вікісторінки, як-от внизу вебсторінок, у RSS-стрічках або в ел. листах. " +"Наприклад: \"myfreedombox.example.org\" або \"example.onion\"." #: plinth/modules/mediawiki/forms.py:41 +msgid "Site Name" +msgstr "Назва сайту" + +#: plinth/modules/mediawiki/forms.py:42 msgid "Name of the site as displayed throughout the wiki." msgstr "" -#: plinth/modules/mediawiki/forms.py:45 +#: plinth/modules/mediawiki/forms.py:46 msgid "Enable public registrations" msgstr "Дозволити публічні реєстрації" -#: plinth/modules/mediawiki/forms.py:46 +#: plinth/modules/mediawiki/forms.py:47 msgid "" "If enabled, anyone on the internet will be able to create an account on your " "MediaWiki instance." @@ -3270,11 +3277,11 @@ msgstr "" "Якщо дозволено, будь-хто з Інтернету зможе створити обліківку у Вашому " "екземплярі MediaWiki." -#: plinth/modules/mediawiki/forms.py:50 +#: plinth/modules/mediawiki/forms.py:51 msgid "Enable private mode" msgstr "Дозволити приватний режим" -#: plinth/modules/mediawiki/forms.py:51 +#: plinth/modules/mediawiki/forms.py:52 msgid "" "If enabled, access will be restricted. Only people who have accounts can " "read/write to the wiki. Public registrations will also be disabled." @@ -3282,11 +3289,11 @@ msgstr "" "Якщо дозволено, доступ буде обмежено. Лише люди, що мають обліківки можуть " "читати/писати у вікі. Публічна реєстрація також буде вимкнена." -#: plinth/modules/mediawiki/forms.py:56 +#: plinth/modules/mediawiki/forms.py:57 msgid "Default Skin" msgstr "Типова шкурка" -#: plinth/modules/mediawiki/forms.py:57 +#: plinth/modules/mediawiki/forms.py:58 msgid "" "Choose a default skin for your MediaWiki installation. Users have the option " "to select their preferred skin." @@ -3299,12 +3306,8 @@ msgid "Password updated" msgstr "Пароль оновлено" #: plinth/modules/mediawiki/views.py:57 -#, fuzzy -#| msgid "Password used to encrypt data. Must match server password." msgid "Password update failed. Please choose a stronger password" -msgstr "" -"Пароль, що використовується для шифрування даних. Має відповідати паролю " -"сервера." +msgstr "Не вдалося оновити пароль. Оберіть сильніший пароль" #: plinth/modules/mediawiki/views.py:67 msgid "Public registrations enabled" @@ -3327,16 +3330,12 @@ msgid "Default skin changed" msgstr "Типову шкурку змінено" #: plinth/modules/mediawiki/views.py:99 -#, fuzzy -#| msgid "Domain name set" msgid "Domain name updated" -msgstr "Доменну назву задано" +msgstr "Доменну назву оновлено" #: plinth/modules/mediawiki/views.py:103 -#, fuzzy -#| msgid "Domain name set" msgid "Site name updated" -msgstr "Доменну назву задано" +msgstr "Назву сайту оновлено" #: plinth/modules/minetest/__init__.py:35 #, python-brace-format @@ -3464,7 +3463,7 @@ msgstr "Призначений каталог не існує." msgid "Updated media directory" msgstr "Оновлено каталог медія" -#: plinth/modules/mumble/__init__.py:26 +#: plinth/modules/mumble/__init__.py:25 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " "software." @@ -3472,18 +3471,18 @@ msgstr "" "Mumble — це високоякісне ПЗ для голосового чату з відкритим кодом, низькою " "затримкою і шифруванням." -#: plinth/modules/mumble/__init__.py:28 +#: plinth/modules/mumble/__init__.py:27 msgid "" "You can connect to your Mumble server on the regular Mumble port 64738. Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "Mumble" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "Голосовий чат" @@ -3499,7 +3498,7 @@ msgstr "" #: plinth/modules/mumble/forms.py:40 msgid "Set a password to join the server" -msgstr "" +msgstr "Вкажіть пароль для долучення до сервера" #: plinth/modules/mumble/forms.py:42 msgid "" @@ -3525,15 +3524,13 @@ msgstr "Mumblefly" msgid "Mumla" msgstr "Mumla" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "Пароль суперкористувача успішно оновлено." #: plinth/modules/mumble/views.py:46 -#, fuzzy -#| msgid "Password added." msgid "Join password changed" -msgstr "Пароль додано." +msgstr "Долучення пароля змінено" #: plinth/modules/mumble/views.py:51 msgid "Root channel name changed." @@ -3591,7 +3588,7 @@ msgstr "Мережі" #: plinth/modules/networks/__init__.py:180 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" -msgstr "" +msgstr "Використання DNSSEC на IPv{kind}" #: plinth/modules/networks/forms.py:16 msgid "Connection Type" @@ -3864,6 +3861,13 @@ msgid "" "connectivity. If you have a public IP address but are unsure if it changes " "over time or not, it is safer to choose this option.

" msgstr "" +"Я маю публічну IP-адресу, яка час від часу змінюватися

Це означає, що пристрої в Інтернеті можуть звʼязуватися з Вами, коли Ви " +"підключені до Інтернету. Кожного разу, коли Ви підʼєднуєтеся до Інтернету, " +"Ваш постачальник Інтернет-послуг (ISP) може надавати Вам іншу IP-адресу, " +"особливо після тривалого часу без мережі. Багато постачальників пропонують " +"цей тип зʼєднання. Якщо у Вас є публічна IP-адреса, але Ви не впевнені чи " +"змінюється вона час від часу, то буде безпечніше обрати цей пункт.

" #: plinth/modules/networks/forms.py:368 #, python-brace-format @@ -3876,6 +3880,13 @@ msgid "" "but very few ISPs offer this. You may be able to get this service from your " "ISP by making an additional payment.

" msgstr "" +"Я маю публічну IP-адресу, яка не змінюється час від часу (рекомендовано)

Це означає, що пристрої в Інтернеті можуть звʼязуватися " +"з Вами, коли Ви підключені до Інтернету. Кожного разу, коли Ви підключаєтеся " +"до Інтернету через свого постачальника Інтернет-послуг, Ви отримуєте одну і " +"ту саму IP-адресу. Це найбільш безпроблемне налаштування для багатьох " +"сервісів {box_name}, але дуже мало постачальників пропонують це. Ви можете " +"отримати цю послугу від свого постачальника за додаткову оплату.

" #: plinth/modules/networks/forms.py:381 #, python-brace-format @@ -3888,6 +3899,14 @@ msgid "" "troublesome situation for hosting services at home. {box_name} provides many " "workaround solutions but each solution has some limitations.

" msgstr "" +"У мене нема публічної IP-адреси

Це означає, що " +"пристрої в Інтернеті не можуть звʼязуватися з Вами, коли ви " +"підʼєднані до Інтернету. Кожного разу, коли Ви підʼєднуєтеся до Інтернету " +"через свого постачальника Інтернет-послуг (ISP), Ви отримуєте IP-адресу " +"актуальну лише для локальних мереж. Багато постачальників пропонують цей тип " +"зʼєднання. Це найбільш клопітка ситуація для розміщення сервісів у дома. " +"{box_name} надає багато обхідних рішень, але кожне рішення має певні " +"обмеження.

" #: plinth/modules/networks/forms.py:394 msgid "" @@ -3911,11 +3930,11 @@ msgid "" "static local IP address for your {box_name} in your router's configuration." msgstr "" -"Використовується ДМЗ для перенаправлення всього трафіку (рекомендовано)

Більшість маршрутизаторів забезпечують налаштування, що " -"називається ДМЗ. Це дозволяє маршрутизатору перенаправляти весь трафік з " -"Інтернету на одну IP-адресу, як-от IP-адресу {box_name}, наприклад. Спочатку " -"не забудьте налаштувати статичну локальну IP-адресу для Вашого {box_name} у " +"називається DMZ. Це дозволяє маршрутизатору перенаправляти весь трафік з " +"Інтернету на одну IP-адресу, як-от IP-адресу {box_name}. Спочатку не " +"забудьте налаштувати статичну локальну IP-адресу для Вашого {box_name} у " "налаштуваннях Вашого маршрутизатора.

" #: plinth/modules/networks/forms.py:428 @@ -3929,6 +3948,13 @@ msgid "" "443 to work. Each of the other applications will suggest which port(s) need " "to be forwarded for that application to work.

" msgstr "" +"Перенаправляти певний трафік за потреби до окремої програми

Ви також можете обрати перенаправлення лише особливого трафіку на " +"Ваш {box_name}. Це ідеально, якщо у Вашій мережі є інші сервери на кшталт " +"{box_name} або Ваш маршрутизатор не підтримує DMZ. Для всіх програм, що " +"надають вебінтерфейс, потрібно перенаправляли трафік із портів 80 і 443. " +"Кожна інша програма запропонує, які порти потрібно перенаправити, щоб ця " +"програма працювала.

" #: plinth/modules/networks/forms.py:442 msgid "" @@ -3936,10 +3962,9 @@ msgid "" "have not configured or are unable to configure the router currently and wish " "to be reminded later. Some of the other configuration steps may fail.

" msgstr "" -"Маршрутизатор поки що не налаштовано

Оберіть цей " -"пункт, якщо маршрутизатор поки що не налаштовано або неможливо налаштувати, " -"і нагадати про це пізніше. Деякі наступні кроки налаштування можуть бути " -"невдалими.

" +"Маршрутизатор ще не налаштовано

Оберіть цей пункт, " +"якщо маршрутизатор ще не налаштовано або неможливо налаштувати, та нагадати " +"про це пізніше. Деякі наступні кроки налаштування можуть бути невдалими.

" #: plinth/modules/networks/templates/connection_show.html:24 #, python-format @@ -4296,9 +4321,9 @@ 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 #, python-format @@ -5003,8 +5028,8 @@ 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 msgid "" @@ -5625,7 +5650,7 @@ msgstr "" #: plinth/modules/shadowsocks/__init__.py:53 msgid "Socks5 Proxy" -msgstr "" +msgstr "Проксі Socks5" #: plinth/modules/shadowsocks/forms.py:12 #: plinth/modules/shadowsocks/forms.py:13 @@ -5720,7 +5745,7 @@ msgstr "Додати ділянку" #: plinth/modules/sharing/templates/sharing.html:27 msgid "No shares currently configured." -msgstr "Поки що нема налаштованих спільних ділянок." +msgstr "Ще нема налаштованих спільних ділянок." #: plinth/modules/sharing/templates/sharing.html:34 msgid "Disk Path" @@ -6012,6 +6037,9 @@ msgid "" "setup SSH keys in your administrator user account before enabling this " "option." msgstr "" +"Поліпшує безпеку, запобігаючи вгадуванню пароля. Перш ніж увімкнути цю " +"опцію, переконайтеся, що у Вашому обліковому записі адміністратора " +"налаштовано ключі SSH." #: plinth/modules/ssh/templates/ssh.html:11 msgid "Server Fingerprints" @@ -6022,6 +6050,8 @@ msgid "" "When connecting to the server, ensure that the fingerprint shown by the SSH " "client matches one of these fingerprints." msgstr "" +"Під час зʼєднання зі сервером, переконайтеся, що показаний SSH-клієнтом " +"відбиток відповідає одному з цих відбитків." #: plinth/modules/ssh/templates/ssh.html:24 msgid "Algorithm" @@ -6047,7 +6077,7 @@ msgstr "" msgid "Login" msgstr "Вхід" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "Вийшли успішно." @@ -6495,18 +6525,17 @@ msgid "" "Compared to Deluge, Transmission is simpler and " "lightweight but is less customizable." msgstr "" +"Порівняно з Deluge, Transmission простіший і " +"легший, але менш налаштовуваний." #: plinth/modules/transmission/__init__.py:32 -#, fuzzy, python-brace-format -#| msgid "" -#| "It can be accessed by any user on {box_name} " -#| "belonging to the admin group." +#, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the bit-torrent group." msgstr "" "До нього може мати доступ будь-який користувач " -"на {box_name}, що належить до групи admin." +"на {box_name}, що належить до групи bit-torrent." #: plinth/modules/transmission/__init__.py:36 #, python-brace-format @@ -6538,16 +6567,13 @@ msgstr "" "максимально близьким до стільничної програми, на скільки це можливо." #: plinth/modules/ttrss/__init__.py:27 -#, fuzzy, python-brace-format -#| msgid "" -#| "When enabled, Tiny Tiny RSS can be accessed by any user with a {box_name} login." +#, python-brace-format msgid "" "When enabled, Tiny Tiny RSS can be accessed by any " "user belonging to the feed-reader group." msgstr "" -"Коли дозволено, Tiny Tiny RSS може бути доступним для будь-якого користувача, що може входити у {box_name}." +"Коли дозволено, Tiny Tiny RSS може бути доступним для будь-якого користувача, що належить до групи feed-reader." #: plinth/modules/ttrss/__init__.py:32 msgid "" @@ -6567,7 +6593,7 @@ msgstr "Tiny Tiny RSS" #: plinth/modules/ttrss/__init__.py:54 msgid "News Feed Reader" -msgstr "Читачка новинних стрічок" +msgstr "Читання новинних стрічок" #: plinth/modules/ttrss/manifest.py:9 msgid "Tiny Tiny RSS (Fork)" @@ -6824,7 +6850,7 @@ msgstr "Доступ до всіх сервісів і налаштувань с #: plinth/modules/users/__init__.py:113 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" -msgstr "" +msgstr "Перевірка запису LDAP \"{search_item}\"" #: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." @@ -7432,6 +7458,15 @@ msgid "" "location using search, map and calendar views. Individual photos can be " "shared with others by sending a direct link." msgstr "" +"Zoph керує Вашою колекцією світлин. Світлини зберігаються на Вашому " +"{box_name}, під Вашим контролем. Замість фокусування на публічних галереях, " +"Zoph фокусується на керуванні для власного використання, організовуючи їх за " +"тим, хто їх зробив, місцем, де вони були зроблені та тим, хто на них " +"знаходиться. Світлини можна звʼязувати у кілька ієрархічних альбомів і " +"категорій. Легко знаходити світлини, на яких є особа, або світлини за датою, " +"або світлини зроблені в певному місці за допомогою пошуку, карти і " +"календарного перегляду. Окремими світлинами можна ділитися з іншими, " +"надіславши пряме посилання." #: plinth/modules/zoph/__init__.py:37 #, python-brace-format @@ -7440,6 +7475,9 @@ msgid "" "Zoph. For additional users, accounts must be created both in {box_name} and " "in Zoph with the same user name." msgstr "" +"Користувач {box_name}, що встановив Zoph, також стане адміністратором Zoph. " +"Для додаткових користувачів потрібно створити облікові записи і в " +"{box_name}, і в Zoph з тим же іменем користувача." #: plinth/modules/zoph/__init__.py:58 plinth/modules/zoph/manifest.py:6 msgid "Zoph" @@ -7447,7 +7485,7 @@ msgstr "Zoph" #: plinth/modules/zoph/__init__.py:59 msgid "Photo Organizer" -msgstr "Організатор фотографій" +msgstr "Упорядник світлин" #: plinth/modules/zoph/forms.py:14 msgid "Enable OpenStreetMap for maps" @@ -7489,15 +7527,15 @@ msgstr "" #: plinth/package.py:201 #, python-brace-format msgid "Package {package_name} is the latest version ({latest_version})" -msgstr "" +msgstr "Пакунок {package_name} має останню версію ({latest_version})" #: plinth/package.py:355 msgid "Error during installation" -msgstr "Помилка під час установлення" +msgstr "Помилка під час встановлення" #: plinth/package.py:377 msgid "installing" -msgstr "установлення" +msgstr "встановлення" #: plinth/package.py:379 msgid "downloading" @@ -7536,9 +7574,9 @@ msgid "" "FreedomBox Service (Plinth) project issue tracker." msgstr "" -"Якщо Ви вірите, що ця сторінка має існувати, будь ласка, надішліть ваду у відстежувач помилок проєкту служби FreedomBox (Plinth)." +"Якщо Ви вірите, що ця сторінка повинна існувати, будь ласка, надішліть " +"недолік у відстежувач помилок проєкту служби FreedomBox (Plinth)." #: plinth/templates/500.html:10 msgid "500" @@ -7554,13 +7592,13 @@ msgid "" msgstr "" "Це внутрішня помилка і не те, що Ви спричинили чи можете виправити. Будь " "ласка, повідомте про помилку на сторінці відстеження вад, щоб ми могли " -"виправити її. Також, будь ласка, прикріпіть до звіту про ваду відстеження недоліків, щоб ми могли " +"виправити її. Також, будь ласка, прикріпіть до звіту про недолік журнал стану." #: plinth/templates/app-header.html:22 msgid "Installation" -msgstr "Установлення" +msgstr "Встановлення" #: plinth/templates/app.html:29 #, python-format @@ -7811,10 +7849,8 @@ msgstr "" "%(service_name)s:" #: plinth/templates/port-forwarding-info.html:37 -#, fuzzy -#| msgid "Service Type" msgid "Service Name" -msgstr "Тип сервісу" +msgstr "Назва сервісу" #: plinth/templates/port-forwarding-info.html:38 msgid "Protocol" @@ -7831,7 +7867,7 @@ msgstr "До портів %(box_name)s" #: plinth/templates/setup.html:24 msgid "Install this application?" -msgstr "Установити цей застосунок?" +msgstr "Встановити цей застосунок?" #: plinth/templates/setup.html:28 msgid "This application needs an update. Update now?" @@ -7865,7 +7901,7 @@ msgstr "" #: plinth/templates/setup.html:71 msgid "Install" -msgstr "Установити" +msgstr "Встановити" #: plinth/templates/setup.html:73 msgid "Update" @@ -7882,7 +7918,7 @@ msgstr "Виконання післяінсталяційних операцій #: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" -msgstr "Установлюється %(package_names)s: %(status)s" +msgstr "Встановлюється %(package_names)s: %(status)s" #: plinth/templates/setup.html:104 #, python-format diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po index 00cda0ae7..e5172d2fe 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-07-28 08:34+0000\n" "Last-Translator: bruh \n" "Language-Team: Vietnamese Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3455,7 +3455,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5837,7 +5837,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index a12284135..9f39725d5 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2022-06-22 17:14+0000\n" "Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) Clients to connect to Mumble from your " @@ -3343,11 +3343,11 @@ msgstr "" "您可以使用常规端口 64738 连接到您的 Mumble 服务器。您可以从桌面和移动设备连" "接 Mumble 客户端。" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "语音聊天" @@ -3389,7 +3389,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "超级用户密码更新成功。" @@ -5838,7 +5838,7 @@ msgstr "" msgid "Login" msgstr "登录" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "已成功退出登录。" diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index 463c099f9..c09692759 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: 2022-06-20 20:21-0400\n" +"POT-Creation-Date: 2022-07-04 21:22-0400\n" "PO-Revision-Date: 2021-12-23 12:50+0000\n" "Last-Translator: pesder \n" "Language-Team: Chinese (Traditional) Clients to connect to Mumble from your " "desktop and mobile devices are available." msgstr "" -#: plinth/modules/mumble/__init__.py:48 plinth/modules/mumble/manifest.py:9 +#: plinth/modules/mumble/__init__.py:47 plinth/modules/mumble/manifest.py:9 msgid "Mumble" msgstr "" -#: plinth/modules/mumble/__init__.py:49 +#: plinth/modules/mumble/__init__.py:48 msgid "Voice Chat" msgstr "" @@ -3334,7 +3334,7 @@ msgstr "" msgid "Mumla" msgstr "" -#: plinth/modules/mumble/views.py:40 +#: plinth/modules/mumble/views.py:41 msgid "SuperUser password successfully updated." msgstr "" @@ -5716,7 +5716,7 @@ msgstr "" msgid "Login" msgstr "" -#: plinth/modules/sso/views.py:101 +#: plinth/modules/sso/views.py:100 msgid "Logged out successfully." msgstr "" diff --git a/plinth/modules/backups/__init__.py b/plinth/modules/backups/__init__.py index 4f70c58e4..e40ad75ba 100644 --- a/plinth/modules/backups/__init__.py +++ b/plinth/modules/backups/__init__.py @@ -95,7 +95,7 @@ def _backup_handler(packet, encryption_passphrase=None): 'backup': component.manifest } for component in packet.components] } - with open(manifest_path, 'w') as manifest_file: + with open(manifest_path, 'w', encoding='utf-8') as manifest_file: json.dump(manifests, manifest_file) paths = packet.directories + packet.files diff --git a/plinth/modules/backups/api.py b/plinth/modules/backups/api.py index 599d885ff..336ad1948 100644 --- a/plinth/modules/backups/api.py +++ b/plinth/modules/backups/api.py @@ -229,7 +229,6 @@ def _lockdown_apps(components, lockdown): def _is_snapshot_available(): """Return whether it is possible to take filesystem snapshots.""" - pass def _take_snapshot(): diff --git a/plinth/modules/backups/repository.py b/plinth/modules/backups/repository.py index 4ba462adc..25aca4aef 100644 --- a/plinth/modules/backups/repository.py +++ b/plinth/modules/backups/repository.py @@ -133,6 +133,10 @@ class BaseBorgRepository(abc.ABC): def prepare(): """Prepare the repository for operations.""" + @staticmethod + def cleanup(): + """Cleanup the repository after operations.""" + def get_info(self): """Return Borg information about a repository.""" output = self.run(['info', '--path', self.borg_path]) @@ -393,8 +397,13 @@ class SshBorgRepository(BaseBorgRepository): if not self.is_usable(): raise errors.SshfsError('Remote host not verified') + self._umount_ignore_errors() # In case the connection is stale. self.mount() + def cleanup(self): + """Cleanup the repository after operations by unmounting.""" + self._umount_ignore_errors() + @property def hostname(self): """Return hostname from the remote path.""" @@ -440,6 +449,13 @@ class SshBorgRepository(BaseBorgRepository): self._run('sshfs', ['umount', '--mountpoint', self._mountpoint]) + def _umount_ignore_errors(self): + """Run unmount operation and ignore any exceptions thrown.""" + try: + self.umount() + except Exception as exception: + logger.warning('Unable to unmount repository', exc_info=exception) + def remove(self): """Remove a repository from the kvstore and delete its mountpoint""" self.umount() diff --git a/plinth/modules/backups/schedule.py b/plinth/modules/backups/schedule.py index ee3729719..3a347ef6c 100644 --- a/plinth/modules/backups/schedule.py +++ b/plinth/modules/backups/schedule.py @@ -321,3 +321,5 @@ class Schedule: logger.info('Cleaning up in repository %s backup archive %s', self.repository_uuid, archive['name']) repository.delete_archive(archive['name']) + + repository.cleanup() diff --git a/plinth/modules/backups/tests/test_ssh_remotes.py b/plinth/modules/backups/tests/test_ssh_remotes.py index d0b789ad2..083ec5a47 100644 --- a/plinth/modules/backups/tests/test_ssh_remotes.py +++ b/plinth/modules/backups/tests/test_ssh_remotes.py @@ -110,7 +110,8 @@ def test_add_repository_when_directory_exists_and_not_empty( temp_user, temp_home, password): remote_path = os.path.join(temp_home, 'non_empty_dir') os.makedirs(remote_path) - open(os.path.join(remote_path, 'somefile.txt'), 'w').close() + open(os.path.join(remote_path, 'somefile.txt'), 'w', + encoding='utf-8').close() data = { 'repository': f'{temp_user}@localhost:{remote_path}', 'ssh_password': password, diff --git a/plinth/modules/backups/views.py b/plinth/modules/backups/views.py index 36d308fa6..feb9b0fbe 100644 --- a/plinth/modules/backups/views.py +++ b/plinth/modules/backups/views.py @@ -381,7 +381,7 @@ class VerifySshHostkeyView(SuccessMessageMixin, FormView): known_hosts_path.parent.mkdir(parents=True, exist_ok=True) known_hosts_path.touch() - with known_hosts_path.open('a') as known_hosts_file: + with known_hosts_path.open('a', encoding='utf-8') as known_hosts_file: known_hosts_file.write(ssh_public_key + '\n') def get(self, *args, **kwargs): diff --git a/plinth/modules/bind/__init__.py b/plinth/modules/bind/__init__.py index 8f3a475e1..001d33ad3 100644 --- a/plinth/modules/bind/__init__.py +++ b/plinth/modules/bind/__init__.py @@ -117,7 +117,7 @@ def force_upgrade(helper, _packages): def get_config(): """Get current configuration""" - data = [line.strip() for line in open(CONFIG_FILE, 'r')] + data = [line.strip() for line in open(CONFIG_FILE, 'r', encoding='utf-8')] forwarders = '' dnssec_enabled = False @@ -141,8 +141,8 @@ def get_config(): def set_forwarders(forwarders): """Set DNS forwarders.""" flag = 0 - data = [line.strip() for line in open(CONFIG_FILE, 'r')] - conf_file = open(CONFIG_FILE, 'w') + data = [line.strip() for line in open(CONFIG_FILE, 'r', encoding='utf-8')] + conf_file = open(CONFIG_FILE, 'w', encoding='utf-8') for line in data: if re.match(r'^\s*forwarders\s+{', line): conf_file.write(line + '\n') @@ -160,10 +160,10 @@ def set_forwarders(forwarders): def set_dnssec(choice): """Enable or disable DNSSEC.""" - data = [line.strip() for line in open(CONFIG_FILE, 'r')] + data = [line.strip() for line in open(CONFIG_FILE, 'r', encoding='utf-8')] if choice == 'enable': - conf_file = open(CONFIG_FILE, 'w') + conf_file = open(CONFIG_FILE, 'w', encoding='utf-8') for line in data: if re.match(r'//\s*dnssec-enable\s+yes;', line): line = line.lstrip('/') @@ -171,7 +171,7 @@ def set_dnssec(choice): conf_file.close() if choice == 'disable': - conf_file = open(CONFIG_FILE, 'w') + conf_file = open(CONFIG_FILE, 'w', encoding='utf-8') for line in data: if re.match(r'^\s*dnssec-enable\s+yes;', line): line = '//' + line diff --git a/plinth/modules/config/tests/test_config.py b/plinth/modules/config/tests/test_config.py index 68115528e..378626a4b 100644 --- a/plinth/modules/config/tests/test_config.py +++ b/plinth/modules/config/tests/test_config.py @@ -120,7 +120,7 @@ def test_homepage_mapping_skip_ci(): assert _home_page_scid2url(uws_scid) is None -class Dict2Obj(object): +class Dict2Obj: """Mock object made out of any dict.""" def __init__(self, a_dict): diff --git a/plinth/modules/datetime/views.py b/plinth/modules/datetime/views.py index 313309141..d92848245 100644 --- a/plinth/modules/datetime/views.py +++ b/plinth/modules/datetime/views.py @@ -4,6 +4,7 @@ FreedomBox app for configuring date and time. """ import logging +import pathlib from django.contrib import messages from django.utils.translation import gettext as _ @@ -17,6 +18,7 @@ logger = logging.getLogger(__name__) class DateTimeAppView(AppView): + """Serve configuration page.""" form_class = DateTimeForm app_id = 'datetime' @@ -25,9 +27,11 @@ class DateTimeAppView(AppView): status['time_zone'] = self.get_current_time_zone() return status - def get_current_time_zone(self): + @staticmethod + def get_current_time_zone(): """Get current time zone.""" - time_zone = open('/etc/timezone').read().rstrip() + path = pathlib.Path('/etc/timezone') + time_zone = path.read_text(encoding='utf-8').rstrip() return time_zone or 'none' def form_valid(self, form): diff --git a/plinth/modules/deluge/forms.py b/plinth/modules/deluge/forms.py index 825638204..195cfb158 100644 --- a/plinth/modules/deluge/forms.py +++ b/plinth/modules/deluge/forms.py @@ -17,6 +17,6 @@ class DelugeForm(DirectorySelectForm): def __init__(self, *args, **kw): validator = DirectoryValidator(username=SYSTEM_USER, check_creatable=True) - super(DelugeForm, self).__init__(title=_('Download directory'), - default='/var/lib/deluged/Downloads', - validator=validator, *args, **kw) + super().__init__(title=_('Download directory'), + default='/var/lib/deluged/Downloads', + validator=validator, *args, **kw) diff --git a/plinth/modules/deluge/utils.py b/plinth/modules/deluge/utils.py index 9d535a1e7..94942ce2d 100644 --- a/plinth/modules/deluge/utils.py +++ b/plinth/modules/deluge/utils.py @@ -16,6 +16,7 @@ _JSON_FORMAT = {'indent': 4, 'sort_keys': True, 'ensure_ascii': False} class Config: """Read or edit a Deluge configuration file.""" + def __init__(self, file_name): """Initialize the configuration object.""" self.file_name = file_name @@ -26,7 +27,7 @@ class Config: def load(self): """Parse the configuration file into memory.""" - text = self.file.read_text() + text = self.file.read_text(encoding='utf-8') matches = re.match(r'^({[^}]*})(.*)$', text, re.DOTALL) if not matches: raise Exception('Unexpected file format.') diff --git a/plinth/modules/email/privileged/domain.py b/plinth/modules/email/privileged/domain.py index c7e03bfa3..10176933c 100644 --- a/plinth/modules/email/privileged/domain.py +++ b/plinth/modules/email/privileged/domain.py @@ -61,7 +61,8 @@ def action_set_domains(primary_domain, all_domains): 'mydestination': my_destination } postfix.set_config(conf) - pathlib.Path('/etc/mailname').write_text(primary_domain + '\n') + pathlib.Path('/etc/mailname').write_text(primary_domain + '\n', + encoding='utf-8') tls.set_postfix_config(primary_domain, all_domains) tls.set_dovecot_config(primary_domain, all_domains) diff --git a/plinth/modules/email/privileged/tls.py b/plinth/modules/email/privileged/tls.py index 6aeac6c07..b540b5a69 100644 --- a/plinth/modules/email/privileged/tls.py +++ b/plinth/modules/email/privileged/tls.py @@ -80,4 +80,4 @@ local_name {domain} {{ }} ''' cert_config = pathlib.Path('/etc/dovecot/conf.d/91-freedombox-tls.conf') - cert_config.write_text(content) + cert_config.write_text(content, encoding='utf-8') diff --git a/plinth/modules/firewall/__init__.py b/plinth/modules/firewall/__init__.py index dacb29e57..1fbe71435 100644 --- a/plinth/modules/firewall/__init__.py +++ b/plinth/modules/firewall/__init__.py @@ -131,10 +131,8 @@ def ignore_dbus_error(dbus_error=None, service_error=None): if (dbus_error and parts[1].strip() == 'org.freedesktop.DBus.Error.' + dbus_error): logger.error('Firewalld is not running.') - pass elif (service_error and parts[2].strip() == service_error): logger.warning('Ignoring firewall exception: %s', service_error) - pass else: raise diff --git a/plinth/modules/first_boot/forms.py b/plinth/modules/first_boot/forms.py index 1e8f4ae7b..b4c51cd76 100644 --- a/plinth/modules/first_boot/forms.py +++ b/plinth/modules/first_boot/forms.py @@ -23,7 +23,7 @@ class FirstbootWizardSecretForm(forms.Form): generated during installation. """ secret_file_path = first_boot.get_secret_file_path() - with open(secret_file_path) as secret_file: + with open(secret_file_path, encoding='utf-8') as secret_file: if secret != secret_file.read().strip(): self.add_error('secret', 'Invalid secret') diff --git a/plinth/modules/gitweb/__init__.py b/plinth/modules/gitweb/__init__.py index e513414a0..e016fcd02 100644 --- a/plinth/modules/gitweb/__init__.py +++ b/plinth/modules/gitweb/__init__.py @@ -215,7 +215,7 @@ def get_repo_list(): progress_file = os.path.join(GIT_REPO_PATH, repo, 'clone_progress') if os.path.exists(progress_file): - with open(progress_file) as file_handle: + with open(progress_file, encoding='utf-8') as file_handle: clone_progress = file_handle.read() repo_info['clone_progress'] = clone_progress diff --git a/plinth/modules/matrixsynapse/__init__.py b/plinth/modules/matrixsynapse/__init__.py index f3b984ae3..d78afc809 100644 --- a/plinth/modules/matrixsynapse/__init__.py +++ b/plinth/modules/matrixsynapse/__init__.py @@ -185,7 +185,7 @@ def get_configured_domain_name(): if not is_setup(): return None - with open(SERVER_NAME_PATH) as config_file: + with open(SERVER_NAME_PATH, encoding='utf-8') as config_file: config, _, _ = load_yaml_guess_indent(config_file) return config['server_name'] @@ -196,7 +196,7 @@ def get_turn_configuration() -> (List[str], str, bool): for file_path, managed in ((OVERRIDDEN_TURN_CONF_PATH, False), (TURN_CONF_PATH, True)): if is_non_empty_file(file_path): - with open(file_path) as config_file: + with open(file_path, encoding='utf-8') as config_file: config, _, _ = load_yaml_guess_indent(config_file) return (TurnConfiguration(None, config['turn_uris'], config['turn_shared_secret']), diff --git a/plinth/modules/mediawiki/__init__.py b/plinth/modules/mediawiki/__init__.py index 6ca1f3c0d..8c2e7f1d7 100644 --- a/plinth/modules/mediawiki/__init__.py +++ b/plinth/modules/mediawiki/__init__.py @@ -128,7 +128,7 @@ def is_private_mode_enabled(): def _get_config_value_in_file(setting_name, config_file): """Return the value of a setting from a config file.""" - with open(config_file, 'r') as config: + with open(config_file, 'r', encoding='utf-8') as config: for line in config: if line.startswith(setting_name): return re.findall(r'["\'][^"\']*["\']', line)[0].strip('"\'') diff --git a/plinth/modules/mediawiki/data/etc/mediawiki/FreedomBoxStaticSettings.php b/plinth/modules/mediawiki/data/etc/mediawiki/FreedomBoxStaticSettings.php index 878c5be7d..f162cf98a 100644 --- a/plinth/modules/mediawiki/data/etc/mediawiki/FreedomBoxStaticSettings.php +++ b/plinth/modules/mediawiki/data/etc/mediawiki/FreedomBoxStaticSettings.php @@ -9,10 +9,7 @@ */ # Default logo -# wgLogos takes precedence over wgLogo. $wgLogos = [ '1x' => "$wgResourceBasePath/resources/assets/mediawiki.png" ]; -# TODO wgLogo can be removed from Debian 11 -$wgLogo = "$wgResourceBasePath/resources/assets/mediawiki.png"; # Enable file uploads $wgEnableUploads = true; diff --git a/plinth/modules/mediawiki/forms.py b/plinth/modules/mediawiki/forms.py index 85372dfc5..eb447d757 100644 --- a/plinth/modules/mediawiki/forms.py +++ b/plinth/modules/mediawiki/forms.py @@ -34,7 +34,8 @@ class MediaWikiForm(forms.Form): # pylint: disable=W0232 label=_('Domain'), required=False, help_text=_( 'Used by MediaWiki to generate URLs that point to the wiki ' 'such as in footer, feeds and emails. Examples: ' - '"myfreedombox.example.org" or "example.onion".')) + '"myfreedombox.example.org" or "example.onion".'), + validators=[validators.RegexValidator('[$"]', inverse_match=True)]) site_name = forms.CharField( label=_('Site Name'), required=False, diff --git a/plinth/modules/networks/forms.py b/plinth/modules/networks/forms.py index 621efad99..20b9260c0 100644 --- a/plinth/modules/networks/forms.py +++ b/plinth/modules/networks/forms.py @@ -167,7 +167,7 @@ class GenericForm(ConnectionForm): def __init__(self, *args, **kwargs): """Initialize the form, populate interface choices.""" - super(GenericForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) choices = self._get_interface_choices(nm.DeviceType.GENERIC) self.fields['interface'].choices = choices @@ -183,7 +183,7 @@ class EthernetForm(ConnectionForm): def __init__(self, *args, **kwargs): """Initialize the form, populate interface choices.""" - super(EthernetForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) choices = self._get_interface_choices(nm.DeviceType.ETHERNET) self.fields['interface'].choices = choices @@ -278,7 +278,7 @@ requires clients to have the password to connect.'), def __init__(self, *args, **kwargs): """Initialize the form, populate interface choices.""" - super(WifiForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) choices = self._get_interface_choices(nm.DeviceType.WIFI) self.fields['interface'].choices = choices diff --git a/plinth/modules/openvpn/__init__.py b/plinth/modules/openvpn/__init__.py index a3564e2c3..4f7523b6f 100644 --- a/plinth/modules/openvpn/__init__.py +++ b/plinth/modules/openvpn/__init__.py @@ -122,7 +122,8 @@ def is_setup(): def is_using_ecc(): """Return whether the service is using ECC.""" if os.path.exists(SERVER_CONFIGURATION_FILE): - with open(SERVER_CONFIGURATION_FILE, 'r') as file_handle: + with open(SERVER_CONFIGURATION_FILE, 'r', + encoding='utf-8') as file_handle: for line in file_handle: if line.strip() == 'dh none': return True diff --git a/plinth/modules/openvpn/tests/test_configuration.py b/plinth/modules/openvpn/tests/test_configuration.py index 72504ff18..35dd75d1a 100644 --- a/plinth/modules/openvpn/tests/test_configuration.py +++ b/plinth/modules/openvpn/tests/test_configuration.py @@ -34,7 +34,7 @@ def fixture_conf_file(tmp_path): def test_identify_rsa_configuration(conf_file): """Identify RSA configuration based on configuration file.""" with patch('plinth.modules.openvpn.SERVER_CONFIGURATION_FILE', conf_file): - with open(conf_file, 'w') as file_handle: + with open(conf_file, 'w', encoding='utf-8') as file_handle: file_handle.write('dh /etc/openvpn/freedombox-keys/pki/dh.pem') assert not openvpn.is_using_ecc() @@ -42,7 +42,7 @@ def test_identify_rsa_configuration(conf_file): def test_identify_ecc_configuration(conf_file): """Identify ECC configuration based on configuration file.""" with patch('plinth.modules.openvpn.SERVER_CONFIGURATION_FILE', conf_file): - with open(conf_file, 'w') as file_handle: + with open(conf_file, 'w', encoding='utf-8') as file_handle: file_handle.write('dh none') assert openvpn.is_using_ecc() diff --git a/plinth/modules/pagekite/forms.py b/plinth/modules/pagekite/forms.py index ff1abf9af..a05c8a6b8 100644 --- a/plinth/modules/pagekite/forms.py +++ b/plinth/modules/pagekite/forms.py @@ -22,7 +22,7 @@ class TrimmedCharField(forms.CharField): if value: value = value.strip() - return super(TrimmedCharField, self).clean(value) + return super().clean(value) class ConfigurationForm(forms.Form): @@ -155,7 +155,7 @@ class AddCustomServiceForm(BaseCustomServiceForm): return match_found def clean(self): - cleaned_data = super(AddCustomServiceForm, self).clean() + cleaned_data = super().clean() try: is_predefined = self.matches_predefined_service(cleaned_data) except KeyError: diff --git a/plinth/modules/pagekite/views.py b/plinth/modules/pagekite/views.py index 02c8dfac4..b5307b9cd 100644 --- a/plinth/modules/pagekite/views.py +++ b/plinth/modules/pagekite/views.py @@ -62,4 +62,4 @@ class ConfigurationView(AppView): def form_valid(self, form): form.save(self.request) - return super(ConfigurationView, self).form_valid(form) + return super().form_valid(form) diff --git a/plinth/modules/quassel/__init__.py b/plinth/modules/quassel/__init__.py index dbbbb7024..20772797e 100644 --- a/plinth/modules/quassel/__init__.py +++ b/plinth/modules/quassel/__init__.py @@ -118,7 +118,8 @@ def get_domain(): """Read TLS domain from config file select first available if none.""" domain = None try: - with open('/var/lib/quassel/domain-freedombox') as file_handle: + with open('/var/lib/quassel/domain-freedombox', + encoding='utf-8') as file_handle: domain = file_handle.read().strip() except FileNotFoundError: pass diff --git a/plinth/modules/security/__init__.py b/plinth/modules/security/__init__.py index db834c7d0..d736555cb 100644 --- a/plinth/modules/security/__init__.py +++ b/plinth/modules/security/__init__.py @@ -80,13 +80,13 @@ def enable_fail2ban(): def get_restricted_access_enabled(): """Return whether restricted access is enabled""" - with open(ACCESS_CONF_FILE_OLD, 'r') as conffile: + with open(ACCESS_CONF_FILE_OLD, 'r', encoding='utf-8') as conffile: if any(line.strip() in ACCESS_CONF_SNIPPETS for line in conffile.readlines()): return True try: - with open(ACCESS_CONF_FILE, 'r') as conffile: + with open(ACCESS_CONF_FILE, 'r', encoding='utf-8') as conffile: return any(line.strip() in ACCESS_CONF_SNIPPETS for line in conffile.readlines()) except FileNotFoundError: diff --git a/plinth/modules/shadowsocks/forms.py b/plinth/modules/shadowsocks/forms.py index 849c46fea..188e4caf5 100644 --- a/plinth/modules/shadowsocks/forms.py +++ b/plinth/modules/shadowsocks/forms.py @@ -29,7 +29,7 @@ class TrimmedCharField(forms.CharField): if value: value = value.strip() - return super(TrimmedCharField, self).clean(value) + return super().clean(value) class ShadowsocksForm(forms.Form): diff --git a/plinth/modules/sharing/forms.py b/plinth/modules/sharing/forms.py index b70782d12..e9a50a8c3 100644 --- a/plinth/modules/sharing/forms.py +++ b/plinth/modules/sharing/forms.py @@ -55,7 +55,7 @@ class AddShareForm(forms.Form): def clean(self): """Check that at least one group is added for non-public shares.""" - super(AddShareForm, self).clean() + super().clean() is_public = self.cleaned_data.get('is_public') groups = self.cleaned_data.get('groups') if not is_public and not groups: diff --git a/plinth/modules/sso/views.py b/plinth/modules/sso/views.py index 6415f545a..083d3eea7 100644 --- a/plinth/modules/sso/views.py +++ b/plinth/modules/sso/views.py @@ -53,7 +53,7 @@ class SSOLoginView(LoginView): form_class = AuthenticationForm def dispatch(self, request, *args, **kwargs): - response = super(SSOLoginView, self).dispatch(request, *args, **kwargs) + response = super().dispatch(request, *args, **kwargs) if request.user.is_authenticated: translation.set_language(request, response, request.user.userprofile.language) @@ -65,7 +65,7 @@ class SSOLoginView(LoginView): # axes_form_invalid when axes >= 5.0.0 becomes available in Debian stable. @axes_form_invalid def form_invalid(self, *args, **kwargs): - return super(SSOLoginView, self).form_invalid(*args, **kwargs) + return super().form_invalid(*args, **kwargs) class CaptchaLoginView(LoginView): @@ -74,8 +74,7 @@ class CaptchaLoginView(LoginView): form_class = CaptchaAuthenticationForm def dispatch(self, request, *args, **kwargs): - response = super(CaptchaLoginView, - self).dispatch(request, *args, **kwargs) + response = super().dispatch(request, *args, **kwargs) if not request.POST: return response diff --git a/plinth/modules/tor/forms.py b/plinth/modules/tor/forms.py index 08c67a38e..422456d68 100644 --- a/plinth/modules/tor/forms.py +++ b/plinth/modules/tor/forms.py @@ -24,7 +24,7 @@ class TrimmedCharField(forms.CharField): value = value.strip() value = value.replace('\r\n', '\n') - return super(TrimmedCharField, self).clean(value) + return super().clean(value) def bridges_validator(bridges): diff --git a/plinth/modules/transmission/forms.py b/plinth/modules/transmission/forms.py index 4bac74885..5fcf869b4 100644 --- a/plinth/modules/transmission/forms.py +++ b/plinth/modules/transmission/forms.py @@ -17,7 +17,6 @@ class TransmissionForm(DirectorySelectForm): def __init__(self, *args, **kw): validator = DirectoryValidator(username=SYSTEM_USER, check_creatable=True) - super(TransmissionForm, - self).__init__(title=_('Download directory'), - default='/var/lib/transmission-daemon/downloads', - validator=validator, *args, **kw) + super().__init__(title=_('Download directory'), + default='/var/lib/transmission-daemon/downloads', + validator=validator, *args, **kw) diff --git a/plinth/modules/upgrades/views.py b/plinth/modules/upgrades/views.py index 911fd3dfa..4958af928 100644 --- a/plinth/modules/upgrades/views.py +++ b/plinth/modules/upgrades/views.py @@ -97,7 +97,7 @@ def is_newer_version_available(): def get_os_release(): """Returns the Debian release number and name.""" output = 'Error: Cannot read PRETTY_NAME in /etc/os-release.' - with open('/etc/os-release', 'r') as release_file: + with open('/etc/os-release', 'r', encoding='utf-8') as release_file: for line in release_file: if 'PRETTY_NAME=' in line: line = line.replace('"', '').strip() diff --git a/plinth/modules/users/__init__.py b/plinth/modules/users/__init__.py index b90b22251..e3a3ee464 100644 --- a/plinth/modules/users/__init__.py +++ b/plinth/modules/users/__init__.py @@ -45,7 +45,7 @@ class UsersApp(app_module.App): app_id = 'users' - _version = 3 + _version = 4 can_be_disabled = False diff --git a/plinth/modules/users/forms.py b/plinth/modules/users/forms.py index 61814b5c5..5dd6b7a74 100644 --- a/plinth/modules/users/forms.py +++ b/plinth/modules/users/forms.py @@ -125,7 +125,7 @@ class CreateUserForm(ValidNewUsernameCheckMixin, def __init__(self, request, *args, **kwargs): """Initialize the form with extra request argument.""" self.request = request - super(CreateUserForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.fields['username'].widget.attrs.update({ 'autofocus': 'autofocus', 'autocapitalize': 'none', @@ -134,7 +134,7 @@ class CreateUserForm(ValidNewUsernameCheckMixin, def save(self, commit=True): """Save the user model and create LDAP user if required.""" - user = super(CreateUserForm, self).save(commit) + user = super().save(commit) if commit: user.userprofile.language = self.cleaned_data['language'] @@ -206,7 +206,7 @@ class UserUpdateForm(ValidNewUsernameCheckMixin, PasswordConfirmForm, self.request = request self.username = username - super(UserUpdateForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.is_last_admin_user = get_last_admin_user() == self.username self.fields['username'].widget.attrs.update({ 'autofocus': 'autofocus', @@ -243,7 +243,7 @@ class UserUpdateForm(ValidNewUsernameCheckMixin, PasswordConfirmForm, def save(self, commit=True): """Update LDAP user name and groups after saving user model.""" - user = super(UserUpdateForm, self).save(commit=False) + user = super().save(commit=False) # Profile is auto saved with user object user.userprofile.language = self.cleaned_data['language'] auth_username = self.request.user.username @@ -348,13 +348,13 @@ class UserChangePasswordForm(PasswordConfirmForm, SetPasswordForm): def __init__(self, request, *args, **kwargs): """Initialize the form with extra request argument.""" self.request = request - super(UserChangePasswordForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.fields['new_password1'].widget.attrs.update( {'autofocus': 'autofocus'}) def save(self, commit=True): """Save the user model and change LDAP password as well.""" - user = super(UserChangePasswordForm, self).save(commit) + user = super().save(commit) auth_username = self.request.user.username if commit: process_input = '{0}\n{1}'.format( diff --git a/plinth/modules/users/views.py b/plinth/modules/users/views.py index 3df2f31a7..7d25fe518 100644 --- a/plinth/modules/users/views.py +++ b/plinth/modules/users/views.py @@ -24,12 +24,12 @@ from .forms import (CreateUserForm, FirstBootForm, UserChangePasswordForm, UserUpdateForm) -class ContextMixin(object): +class ContextMixin: """Mixin to add 'title' to the template context.""" def get_context_data(self, **kwargs): """Add self.title to template context.""" - context = super(ContextMixin, self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) context['title'] = getattr(self, 'title', '') return context @@ -45,7 +45,7 @@ class UserCreate(ContextMixin, SuccessMessageMixin, CreateView): def get_form_kwargs(self): """Make the request object available to the form.""" - kwargs = super(UserCreate, self).get_form_kwargs() + kwargs = super().get_form_kwargs() kwargs['request'] = self.request return kwargs @@ -62,7 +62,7 @@ class UserList(AppView, ContextMixin, django.views.generic.ListView): app_id = 'users' def get_context_data(self, *args, **kwargs): - context = super(UserList, self).get_context_data(*args, **kwargs) + context = super().get_context_data(*args, **kwargs) context['last_admin_user'] = get_last_admin_user() return context @@ -86,14 +86,14 @@ class UserUpdate(ContextMixin, SuccessMessageMixin, UpdateView): def get_form_kwargs(self): """Make the request object available to the form.""" - kwargs = super(UserUpdate, self).get_form_kwargs() + kwargs = super().get_form_kwargs() kwargs['request'] = self.request kwargs['username'] = self.object.username return kwargs def get_initial(self): """Return the data for initial form load.""" - initial = super(UserUpdate, self).get_initial() + initial = super().get_initial() try: ssh_keys = actions.superuser_run( 'ssh', ['get-keys', '--username', self.object.username]) @@ -190,7 +190,7 @@ class UserChangePassword(ContextMixin, SuccessMessageMixin, FormView): def get_form_kwargs(self): """Make the user object available to the form.""" - kwargs = super(UserChangePassword, self).get_form_kwargs() + kwargs = super().get_form_kwargs() kwargs['request'] = self.request kwargs['user'] = User.objects.get(username=self.kwargs['slug']) return kwargs @@ -209,7 +209,7 @@ class UserChangePassword(ContextMixin, SuccessMessageMixin, FormView): """ form.save() update_session_auth_hash(self.request, form.user) - return super(UserChangePassword, self).form_valid(form) + return super().form_valid(form) class FirstBootView(django.views.generic.CreateView): @@ -238,7 +238,7 @@ class FirstBootView(django.views.generic.CreateView): def get_form_kwargs(self): """Make request available to the form (to insert messages)""" - kwargs = super(FirstBootView, self).get_form_kwargs() + kwargs = super().get_form_kwargs() kwargs['request'] = self.request return kwargs diff --git a/plinth/network.py b/plinth/network.py index ac6296490..d2efa1a9b 100644 --- a/plinth/network.py +++ b/plinth/network.py @@ -33,12 +33,10 @@ CONNECTION_TYPE_NAMES = collections.OrderedDict([ class ConnectionNotFound(Exception): """Network connection with a given name could not be found.""" - pass class DeviceNotFound(Exception): """Network device for specified operation could not be found.""" - pass def ipv4_string_to_int(address): diff --git a/plinth/package.py b/plinth/package.py index bb916e017..315b514b6 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -241,7 +241,7 @@ class PackageException(Exception): def __init__(self, error_string=None, error_details=None, *args, **kwargs): """Store apt-get error string and details.""" - super(PackageException, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.error_string = error_string self.error_details = error_details @@ -252,7 +252,7 @@ class PackageException(Exception): .format(self.error_string, self.error_details) -class Transaction(object): +class Transaction: """Information about an ongoing transaction.""" def __init__(self, module_name, package_names): diff --git a/plinth/setup.py b/plinth/setup.py index ae45399e5..1f43fece9 100644 --- a/plinth/setup.py +++ b/plinth/setup.py @@ -28,7 +28,7 @@ _is_shutting_down = False _force_upgrader = None -class Helper(object): +class Helper: """Helper routines for modules to show progress.""" def __init__(self, module_name, module): diff --git a/plinth/tests/functional/install.sh b/plinth/tests/functional/install.sh index 484de4ac6..829274bfb 100755 --- a/plinth/tests/functional/install.sh +++ b/plinth/tests/functional/install.sh @@ -7,7 +7,8 @@ sudo apt-get install -yq --no-install-recommends \ python3-pytest python3-pytest-django python3-pytest-xdist \ python3-pip python3-wheel firefox-esr git smbclient -pip3 install --user splinter pytest-splinter pytest-reporter-html1 +# Use compatible versions of Splinter and Selenium +pip3 install --user selenium==4.2.0 splinter==0.17.0 pytest-splinter pytest-reporter-html1 echo "Installing geckodriver" ( diff --git a/plinth/tests/test_utils.py b/plinth/tests/test_utils.py index 2e9e885fa..ff4f0c637 100644 --- a/plinth/tests/test_utils.py +++ b/plinth/tests/test_utils.py @@ -8,8 +8,8 @@ from unittest.mock import MagicMock, Mock import pytest import ruamel.yaml -from ruamel.yaml.compat import StringIO from django.test.client import RequestFactory +from ruamel.yaml.compat import StringIO from plinth.utils import YAMLFile, is_user_admin, is_valid_user_name @@ -105,7 +105,7 @@ class TestYAMLFileUtil: for key in conf: file_conf[key] = conf[key] - with open(test_file.name, 'r') as retrieved_conf: + with open(test_file.name, 'r', encoding='utf-8') as retrieved_conf: buffer = StringIO() self.yaml.dump(conf, buffer) assert retrieved_conf.read() == buffer.getvalue() @@ -116,13 +116,13 @@ class TestYAMLFileUtil: """ test_file = tempfile.NamedTemporaryFile() - with open(test_file.name, 'w') as conf_file: + with open(test_file.name, 'w', encoding='utf-8') as conf_file: self.yaml.dump({'property1': self.kv_pair}, conf_file) with YAMLFile(test_file.name) as file_conf: file_conf['property2'] = self.kv_pair - with open(test_file.name, 'r') as retrieved_conf: + with open(test_file.name, 'r', encoding='utf-8') as retrieved_conf: file_conf = self.yaml.load(retrieved_conf) assert file_conf == { 'property1': self.kv_pair, @@ -138,4 +138,4 @@ class TestYAMLFileUtil: yaml_file['property1'] = 'value1' raise ValueError('Test') - assert open(test_file.name, 'r').read() == '' + assert open(test_file.name, 'r', encoding='utf-8').read() == '' diff --git a/plinth/utils.py b/plinth/utils.py index 948a484a6..34b1db425 100644 --- a/plinth/utils.py +++ b/plinth/utils.py @@ -89,7 +89,7 @@ def is_user_admin(request, cached=False): return user_is_admin -class YAMLFile(object): +class YAMLFile: """A context management class for updating YAML files""" def __init__(self, yaml_file): @@ -106,7 +106,7 @@ class YAMLFile(object): self.yaml.preserve_quotes = True def __enter__(self): - with open(self.yaml_file, 'r') as intro_conf: + with open(self.yaml_file, 'r', encoding='utf-8') as intro_conf: if not self.is_file_empty(): self.conf = self.yaml.load(intro_conf) else: @@ -116,7 +116,7 @@ class YAMLFile(object): def __exit__(self, type_, value, traceback): if not traceback: - with open(self.yaml_file, 'w') as intro_conf: + with open(self.yaml_file, 'w', encoding='utf-8') as intro_conf: self.yaml.dump(self.conf, intro_conf) def is_file_empty(self): @@ -140,7 +140,8 @@ def generate_password(size=32): def grep(pattern, file_name): """Return lines of a file matching a pattern.""" return [ - line.rstrip() for line in open(file_name) if re.search(pattern, line) + line.rstrip() for line in open(file_name, encoding='utf-8') + if re.search(pattern, line) ] diff --git a/plinth/views.py b/plinth/views.py index 42b86b06a..737df09cc 100644 --- a/plinth/views.py +++ b/plinth/views.py @@ -33,7 +33,7 @@ REDIRECT_FIELD_NAME = 'next' def is_safe_url(url): """Check if the URL is safe to redirect to. - Based on Django internal utility. + Based on Django internal utility removed in Django 4.0. """ if url is not None: diff --git a/pyproject.toml b/pyproject.toml index e1ff06364..3954de651 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,3 +71,10 @@ markers = [ "wordpress", "zoph", ] + +# Useful when pylint is invoked separately instead of flake8 +[tool.pylint.'MESSAGES CONTROL'] +disable = [ + "too-many-arguments", # Has not resulted in a refactoring + "too-many-ancestors", # Easy to hit when using Django +] diff --git a/static/themes/default/css/main.css b/static/themes/default/css/main.css index e607ea96c..c939d0363 100644 --- a/static/themes/default/css/main.css +++ b/static/themes/default/css/main.css @@ -202,6 +202,10 @@ body { list-style-type: none; } +.multiple-checkbox > div { + padding-left: 40px; +} + .navbar .fa:not(.fa-bars) { margin-right: 0.25rem; } diff --git a/static/themes/default/js/main.js b/static/themes/default/js/main.js index 65c723f56..412ad493a 100644 --- a/static/themes/default/js/main.js +++ b/static/themes/default/js/main.js @@ -126,9 +126,14 @@ window.addEventListener('pageshow', function(event) { * Select all option for multiple checkboxes. */ document.addEventListener('DOMContentLoaded', function(event) { - let parents = document.querySelectorAll('ul.has-select-all'); + // Django < 4.0 generates
    and
  • where as Django >= 4.0 generates
    s + let parents = document.querySelectorAll('ul.has-select-all,div.has-select-all'); for (const parent of parents) { - let li = document.createElement('li'); + let childElementType = 'div'; + if (parent.tagName.toLowerCase() == 'ul') + childElementType = 'li'; + + let selectAllItem = document.createElement(childElementType); let label = document.createElement('label'); label.for = "select_all"; @@ -139,9 +144,9 @@ document.addEventListener('DOMContentLoaded', function(event) { checkbox.setAttribute('class', 'select-all'); label.appendChild(checkbox); - li.appendChild(label); + selectAllItem.appendChild(label); - parent.insertBefore(li, parent.childNodes[0]); + parent.insertBefore(selectAllItem, parent.childNodes[0]); setSelectAllValue(parent); checkbox.addEventListener('change', onSelectAllChanged);