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/"
"i>"
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 ""
+"Для справжнього спілкування Вам потрібен веб-клієнт"
+"a> або будь-який інший клієнт 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."
"p>"
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);