Merge branch 'dev' into bullseye

This commit is contained in:
Alexandre Aubin 2021-09-05 15:09:18 +02:00 committed by GitHub
commit 47cef90efd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 1906 additions and 1017 deletions

View file

@ -2,7 +2,7 @@
# TRANSLATION # TRANSLATION
######################################## ########################################
remove-stale-translated-strings: autofix-translated-strings:
stage: translation stage: translation
image: "before-install" image: "before-install"
needs: [] needs: []
@ -14,12 +14,14 @@ remove-stale-translated-strings:
script: script:
- cd tests # Maybe move this script location to another folder? - cd tests # Maybe move this script location to another folder?
# create a local branch that will overwrite distant one # create a local branch that will overwrite distant one
- git checkout -b "ci-remove-stale-translated-strings-${CI_COMMIT_REF_NAME}" --no-track - git checkout -b "ci-autofix-translated-strings-${CI_COMMIT_REF_NAME}" --no-track
- python3 remove_stale_translated_strings.py - python3 remove_stale_translated_strings.py
- python3 autofix_locale_format.py
- python3 reformat_locales.py
- '[ $(git diff -w | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit - '[ $(git diff -w | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit
- git commit -am "[CI] Remove stale translated strings" || true - git commit -am "[CI] Reformat / remove stale translated strings" || true
- git push -f origin "ci-remove-stale-translated-strings-${CI_COMMIT_REF_NAME}":"ci-remove-stale-translated-strings-${CI_COMMIT_REF_NAME}" - git push -f origin "ci-remove-stale-translated-strings-${CI_COMMIT_REF_NAME}":"ci-remove-stale-translated-strings-${CI_COMMIT_REF_NAME}"
- hub pull-request -m "[CI] Remove stale translated strings" -b Yunohost:dev -p || true # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd - hub pull-request -m "[CI] Reformat / remove stale translated strings" -b Yunohost:dev -p || true # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd
only: only:
variables: variables:
- $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH - $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH

View file

@ -59,7 +59,7 @@ user:
api: GET /users api: GET /users
arguments: arguments:
--fields: --fields:
help: fields to fetch help: fields to fetch (username, fullname, mail, mail-alias, mail-forward, mailbox-quota, groups, shell, home-path)
nargs: "+" nargs: "+"
### user_create() ### user_create()
@ -196,6 +196,28 @@ user:
username: username:
help: Username or email to get information help: Username or email to get information
### user_export()
export:
action_help: Export users into CSV
api: GET /users/export
### user_import()
import:
action_help: Import several users from CSV
api: POST /users/import
arguments:
csvfile:
help: "CSV file with columns username, firstname, lastname, password, mail, mailbox-quota, mail-alias, mail-forward, groups (separated by coma)"
type: open
-u:
full: --update
help: Update all existing users contained in the CSV file (by default existing users are ignored)
action: store_true
-d:
full: --delete
help: Delete all existing users that are not contained in the CSV file (by default existing users are kept)
action: store_true
subcategories: subcategories:
group: group:
subcategory_help: Manage user groups subcategory_help: Manage user groups

View file

@ -60,6 +60,7 @@ do_pre_regen() {
main_domain=$(cat /etc/yunohost/current_host) main_domain=$(cat /etc/yunohost/current_host)
# Support different strategy for security configurations # Support different strategy for security configurations
export redirect_to_https="$(yunohost settings get 'security.nginx.redirect_to_https')"
export compatibility="$(yunohost settings get 'security.nginx.compatibility')" export compatibility="$(yunohost settings get 'security.nginx.compatibility')"
export experimental="$(yunohost settings get 'security.experimental.enabled')" export experimental="$(yunohost settings get 'security.experimental.enabled')"
ynh_render_template "security.conf.inc" "${nginx_conf_dir}/security.conf.inc" ynh_render_template "security.conf.inc" "${nginx_conf_dir}/security.conf.inc"

View file

@ -133,6 +133,13 @@ class BaseSystemDiagnoser(Diagnoser):
summary="diagnosis_backports_in_sources_list", summary="diagnosis_backports_in_sources_list",
) )
if self.number_of_recent_auth_failure() > 500:
yield dict(
meta={"test": "high_number_auth_failure"},
status="WARNING",
summary="diagnosis_high_number_auth_failures",
)
def bad_sury_packages(self): def bad_sury_packages(self):
packages_to_check = ["openssl", "libssl1.1", "libssl-dev"] packages_to_check = ["openssl", "libssl1.1", "libssl-dev"]
@ -154,6 +161,23 @@ class BaseSystemDiagnoser(Diagnoser):
cmd = "grep -q -nr '^ *deb .*-backports' /etc/apt/sources.list*" cmd = "grep -q -nr '^ *deb .*-backports' /etc/apt/sources.list*"
return os.system(cmd) == 0 return os.system(cmd) == 0
def number_of_recent_auth_failure(self):
# Those syslog facilities correspond to auth and authpriv
# c.f. https://unix.stackexchange.com/a/401398
# and https://wiki.archlinux.org/title/Systemd/Journal#Facility
cmd = "journalctl -q SYSLOG_FACILITY=10 SYSLOG_FACILITY=4 --since '1day ago' | grep 'authentication failure' | wc -l"
n_failures = check_output(cmd)
try:
return int(n_failures)
except Exception:
self.logger_warning(
"Failed to parse number of recent auth failures, expected an int, got '%s'"
% n_failures
)
return -1
def is_vulnerable_to_meltdown(self): def is_vulnerable_to_meltdown(self):
# meltdown CVE: https://security-tracker.debian.org/tracker/CVE-2017-5754 # meltdown CVE: https://security-tracker.debian.org/tracker/CVE-2017-5754

View file

@ -12,12 +12,6 @@ server {
include /etc/nginx/conf.d/acme-challenge.conf.inc; include /etc/nginx/conf.d/acme-challenge.conf.inc;
include /etc/nginx/conf.d/{{ domain }}.d/*.conf;
location /yunohost {
return 301 https://$http_host$request_uri;
}
location ^~ '/.well-known/ynh-diagnosis/' { location ^~ '/.well-known/ynh-diagnosis/' {
alias /tmp/.well-known/ynh-diagnosis/; alias /tmp/.well-known/ynh-diagnosis/;
} }
@ -26,6 +20,16 @@ server {
alias /var/www/.well-known/{{ domain }}/autoconfig/mail/; alias /var/www/.well-known/{{ domain }}/autoconfig/mail/;
} }
{# Note that this != "False" is meant to be failure-safe, in the case the redrect_to_https would happen to contain empty string or whatever value. We absolutely don't want to disable the HTTPS redirect *except* when it's explicitly being asked to be disabled. #}
{% if redirect_to_https != "False" %}
location / {
return 301 https://$http_host$request_uri;
}
{# The app config snippets are not included in the HTTP conf unless HTTPS redirect is disabled, because app's location may blocks will conflict or bypass/ignore the HTTPS redirection. #}
{% else %}
include /etc/nginx/conf.d/{{ domain }}.d/*.conf;
{% endif %}
access_log /var/log/nginx/{{ domain }}-access.log; access_log /var/log/nginx/{{ domain }}-access.log;
error_log /var/log/nginx/{{ domain }}-error.log; error_log /var/log/nginx/{{ domain }}-error.log;
} }

View file

@ -33,6 +33,7 @@ olcAuthzPolicy: none
olcConcurrency: 0 olcConcurrency: 0
olcConnMaxPending: 100 olcConnMaxPending: 100
olcConnMaxPendingAuth: 1000 olcConnMaxPendingAuth: 1000
olcSizeLimit: 50000
olcIdleTimeout: 0 olcIdleTimeout: 0
olcIndexSubstrIfMaxLen: 4 olcIndexSubstrIfMaxLen: 4
olcIndexSubstrIfMinLen: 2 olcIndexSubstrIfMinLen: 2
@ -188,7 +189,7 @@ olcDbIndex: memberUid eq
olcDbIndex: uniqueMember eq olcDbIndex: uniqueMember eq
olcDbIndex: virtualdomain eq olcDbIndex: virtualdomain eq
olcDbIndex: permission eq olcDbIndex: permission eq
olcDbMaxSize: 10485760 olcDbMaxSize: 104857600
structuralObjectClass: olcMdbConfig structuralObjectClass: olcMdbConfig
# #

View file

@ -240,8 +240,8 @@
"pattern_positive_number": "Ha de ser un nombre positiu", "pattern_positive_number": "Ha de ser un nombre positiu",
"pattern_username": "Ha d'estar compost per caràcters alfanumèrics en minúscula i guió baix exclusivament", "pattern_username": "Ha d'estar compost per caràcters alfanumèrics en minúscula i guió baix exclusivament",
"pattern_password_app": "Les contrasenyes no poden de tenir els següents caràcters: {forbidden_chars}", "pattern_password_app": "Les contrasenyes no poden de tenir els següents caràcters: {forbidden_chars}",
"port_already_closed": "El port {port:d} ja està tancat per les connexions {ip_version}", "port_already_closed": "El port {port} ja està tancat per les connexions {ip_version}",
"port_already_opened": "El port {port:d} ja està obert per les connexions {ip_version}", "port_already_opened": "El port {port} ja està obert per les connexions {ip_version}",
"regenconf_file_backed_up": "S'ha guardat una còpia de seguretat del fitxer de configuració «{conf}» a «{backup}»", "regenconf_file_backed_up": "S'ha guardat una còpia de seguretat del fitxer de configuració «{conf}» a «{backup}»",
"regenconf_file_copy_failed": "No s'ha pogut copiar el nou fitxer de configuració «{new}» a «{conf}»", "regenconf_file_copy_failed": "No s'ha pogut copiar el nou fitxer de configuració «{new}» a «{conf}»",
"regenconf_file_kept_back": "S'espera que el fitxer de configuració «{conf}» sigui suprimit per regen-conf (categoria {category}) però s'ha mantingut.", "regenconf_file_kept_back": "S'espera que el fitxer de configuració «{conf}» sigui suprimit per regen-conf (categoria {category}) però s'ha mantingut.",
@ -265,8 +265,8 @@
"restore_extracting": "Extracció dels fitxers necessaris de l'arxiu…", "restore_extracting": "Extracció dels fitxers necessaris de l'arxiu…",
"restore_failed": "No s'ha pogut restaurar el sistema", "restore_failed": "No s'ha pogut restaurar el sistema",
"restore_hook_unavailable": "El script de restauració «{part}» no està disponible en el sistema i tampoc és en l'arxiu", "restore_hook_unavailable": "El script de restauració «{part}» no està disponible en el sistema i tampoc és en l'arxiu",
"restore_may_be_not_enough_disk_space": "Sembla que no hi ha prou espai disponible en el sistema (lliure: {free_space:d} B, espai necessari: {needed_space:d} B, marge de seguretat: {margin:d} B)", "restore_may_be_not_enough_disk_space": "Sembla que no hi ha prou espai disponible en el sistema (lliure: {free_space} B, espai necessari: {needed_space} B, marge de seguretat: {margin} B)",
"restore_not_enough_disk_space": "No hi ha prou espai disponible (espai: {free_space:d} B, espai necessari: {needed_space:d} B, marge de seguretat: {margin:d} B)", "restore_not_enough_disk_space": "No hi ha prou espai disponible (espai: {free_space} B, espai necessari: {needed_space} B, marge de seguretat: {margin} B)",
"restore_nothings_done": "No s'ha restaurat res", "restore_nothings_done": "No s'ha restaurat res",
"restore_removing_tmp_dir_failed": "No s'ha pogut eliminar un directori temporal antic", "restore_removing_tmp_dir_failed": "No s'ha pogut eliminar un directori temporal antic",
"restore_running_app_script": "Restaurant l'aplicació «{app}»…", "restore_running_app_script": "Restaurant l'aplicació «{app}»…",

View file

@ -83,8 +83,8 @@
"pattern_password": "Muss mindestens drei Zeichen lang sein", "pattern_password": "Muss mindestens drei Zeichen lang sein",
"pattern_port_or_range": "Muss ein valider Port (z.B. 0-65535) oder ein Bereich (z.B. 100:200) sein", "pattern_port_or_range": "Muss ein valider Port (z.B. 0-65535) oder ein Bereich (z.B. 100:200) sein",
"pattern_username": "Darf nur aus klein geschriebenen alphanumerischen Zeichen und Unterstrichen bestehen", "pattern_username": "Darf nur aus klein geschriebenen alphanumerischen Zeichen und Unterstrichen bestehen",
"port_already_closed": "Der Port {port:d} wurde bereits für {ip_version} Verbindungen geschlossen", "port_already_closed": "Der Port {port} wurde bereits für {ip_version} Verbindungen geschlossen",
"port_already_opened": "Der Port {port:d} wird bereits von {ip_version} benutzt", "port_already_opened": "Der Port {port} wird bereits von {ip_version} benutzt",
"restore_already_installed_app": "Eine Applikation mit der ID '{app}' ist bereits installiert", "restore_already_installed_app": "Eine Applikation mit der ID '{app}' ist bereits installiert",
"restore_cleaning_failed": "Das temporäre Dateiverzeichnis für Systemrestaurierung konnte nicht gelöscht werden", "restore_cleaning_failed": "Das temporäre Dateiverzeichnis für Systemrestaurierung konnte nicht gelöscht werden",
"restore_complete": "Vollständig wiederhergestellt", "restore_complete": "Vollständig wiederhergestellt",
@ -570,8 +570,8 @@
"regenconf_would_be_updated": "Die Konfiguration wäre für die Kategorie '{category}' aktualisiert worden", "regenconf_would_be_updated": "Die Konfiguration wäre für die Kategorie '{category}' aktualisiert worden",
"restore_system_part_failed": "Die Systemteile '{part}' konnten nicht wiederhergestellt werden", "restore_system_part_failed": "Die Systemteile '{part}' konnten nicht wiederhergestellt werden",
"restore_removing_tmp_dir_failed": "Ein altes, temporäres Directory konnte nicht entfernt werden", "restore_removing_tmp_dir_failed": "Ein altes, temporäres Directory konnte nicht entfernt werden",
"restore_not_enough_disk_space": "Nicht genug Speicher (Speicher: {free_space:d} B, benötigter Speicher: {needed_space:d} B, Sicherheitspuffer: {margin:d} B)", "restore_not_enough_disk_space": "Nicht genug Speicher (Speicher: {free_space} B, benötigter Speicher: {needed_space} B, Sicherheitspuffer: {margin} B)",
"restore_may_be_not_enough_disk_space": "Ihr System scheint nicht genug Speicherplatz zu haben (frei: {free_space:d} B, benötigter Platz: {needed_space:d} B, Sicherheitspuffer: {margin:d} B)", "restore_may_be_not_enough_disk_space": "Ihr System scheint nicht genug Speicherplatz zu haben (frei: {free_space} B, benötigter Platz: {needed_space} B, Sicherheitspuffer: {margin} B)",
"restore_extracting": "Packe die benötigten Dateien aus dem Archiv aus…", "restore_extracting": "Packe die benötigten Dateien aus dem Archiv aus…",
"restore_already_installed_apps": "Folgende Apps können nicht wiederhergestellt werden, weil sie schon installiert sind: {apps}", "restore_already_installed_apps": "Folgende Apps können nicht wiederhergestellt werden, weil sie schon installiert sind: {apps}",
"regex_with_only_domain": "Du kannst regex nicht als Domain verwenden, sondern nur als Pfad", "regex_with_only_domain": "Du kannst regex nicht als Domain verwenden, sondern nur als Pfad",

View file

@ -8,8 +8,8 @@
"admin_password_changed": "The administration password was changed", "admin_password_changed": "The administration password was changed",
"admin_password_too_long": "Please choose a password shorter than 127 characters", "admin_password_too_long": "Please choose a password shorter than 127 characters",
"already_up_to_date": "Nothing to do. Everything is already up-to-date.", "already_up_to_date": "Nothing to do. Everything is already up-to-date.",
"app_action_cannot_be_ran_because_required_services_down": "These required services should be running to run this action: {services}. Try restarting them to continue (and possibly investigate why they are down).",
"app_action_broke_system": "This action seems to have broken these important services: {services}", "app_action_broke_system": "This action seems to have broken these important services: {services}",
"app_action_cannot_be_ran_because_required_services_down": "These required services should be running to run this action: {services}. Try restarting them to continue (and possibly investigate why they are down).",
"app_already_installed": "{app} is already installed", "app_already_installed": "{app} is already installed",
"app_already_installed_cant_change_url": "This app is already installed. The URL cannot be changed just by this function. Check in `app changeurl` if it's available.", "app_already_installed_cant_change_url": "This app is already installed. The URL cannot be changed just by this function. Check in `app changeurl` if it's available.",
"app_already_up_to_date": "{app} is already up-to-date", "app_already_up_to_date": "{app} is already up-to-date",
@ -24,49 +24,48 @@
"app_extraction_failed": "Could not extract the installation files", "app_extraction_failed": "Could not extract the installation files",
"app_full_domain_unavailable": "Sorry, this app must be installed on a domain of its own, but other apps are already installed on the domain '{domain}'. You could use a subdomain dedicated to this app instead.", "app_full_domain_unavailable": "Sorry, this app must be installed on a domain of its own, but other apps are already installed on the domain '{domain}'. You could use a subdomain dedicated to this app instead.",
"app_id_invalid": "Invalid app ID", "app_id_invalid": "Invalid app ID",
"app_install_files_invalid": "These files cannot be installed",
"app_install_failed": "Unable to install {app}: {error}", "app_install_failed": "Unable to install {app}: {error}",
"app_install_files_invalid": "These files cannot be installed",
"app_install_script_failed": "An error occurred inside the app installation script", "app_install_script_failed": "An error occurred inside the app installation script",
"app_make_default_location_already_used": "Unable to make '{app}' the default app on the domain, '{domain}' is already in use by '{other_app}'",
"app_label_deprecated": "This command is deprecated! Please use the new command 'yunohost user permission update' to manage the app label.", "app_label_deprecated": "This command is deprecated! Please use the new command 'yunohost user permission update' to manage the app label.",
"app_location_unavailable": "This URL is either unavailable, or conflicts with the already installed app(s):\n{apps}", "app_location_unavailable": "This URL is either unavailable, or conflicts with the already installed app(s):\n{apps}",
"app_manifest_invalid": "Something is wrong with the app manifest: {error}", "app_make_default_location_already_used": "Unable to make '{app}' the default app on the domain, '{domain}' is already in use by '{other_app}'",
"app_manifest_install_ask_domain": "Choose the domain where this app should be installed",
"app_manifest_install_ask_path": "Choose the URL path (after the domain) where this app should be installed",
"app_manifest_install_ask_password": "Choose an administration password for this app",
"app_manifest_install_ask_admin": "Choose an administrator user for this app", "app_manifest_install_ask_admin": "Choose an administrator user for this app",
"app_manifest_install_ask_domain": "Choose the domain where this app should be installed",
"app_manifest_install_ask_is_public": "Should this app be exposed to anonymous visitors?", "app_manifest_install_ask_is_public": "Should this app be exposed to anonymous visitors?",
"app_not_upgraded": "The app '{failed_app}' failed to upgrade, and as a consequence the following apps' upgrades have been cancelled: {apps}", "app_manifest_install_ask_password": "Choose an administration password for this app",
"app_manifest_install_ask_path": "Choose the URL path (after the domain) where this app should be installed",
"app_manifest_invalid": "Something is wrong with the app manifest: {error}",
"app_not_correctly_installed": "{app} seems to be incorrectly installed", "app_not_correctly_installed": "{app} seems to be incorrectly installed",
"app_not_installed": "Could not find {app} in the list of installed apps: {all_apps}", "app_not_installed": "Could not find {app} in the list of installed apps: {all_apps}",
"app_not_properly_removed": "{app} has not been properly removed", "app_not_properly_removed": "{app} has not been properly removed",
"app_not_upgraded": "The app '{failed_app}' failed to upgrade, and as a consequence the following apps' upgrades have been cancelled: {apps}",
"app_packaging_format_not_supported": "This app cannot be installed because its packaging format is not supported by your YunoHost version. You should probably consider upgrading your system.",
"app_remove_after_failed_install": "Removing the app following the installation failure...",
"app_removed": "{app} uninstalled", "app_removed": "{app} uninstalled",
"app_requirements_checking": "Checking required packages for {app}...", "app_requirements_checking": "Checking required packages for {app}...",
"app_requirements_unmeet": "Requirements are not met for {app}, the package {pkgname} ({version}) must be {spec}", "app_requirements_unmeet": "Requirements are not met for {app}, the package {pkgname} ({version}) must be {spec}",
"app_remove_after_failed_install": "Removing the app following the installation failure...",
"app_restore_failed": "Could not restore {app}: {error}", "app_restore_failed": "Could not restore {app}: {error}",
"app_restore_script_failed": "An error occured inside the app restore script", "app_restore_script_failed": "An error occured inside the app restore script",
"app_sources_fetch_failed": "Could not fetch sources files, is the URL correct?", "app_sources_fetch_failed": "Could not fetch sources files, is the URL correct?",
"app_start_backup": "Collecting files to be backed up for {app}...",
"app_start_install": "Installing {app}...", "app_start_install": "Installing {app}...",
"app_start_remove": "Removing {app}...", "app_start_remove": "Removing {app}...",
"app_start_backup": "Collecting files to be backed up for {app}...",
"app_start_restore": "Restoring {app}...", "app_start_restore": "Restoring {app}...",
"app_unknown": "Unknown app", "app_unknown": "Unknown app",
"app_unsupported_remote_type": "Unsupported remote type used for the app", "app_unsupported_remote_type": "Unsupported remote type used for the app",
"app_upgrade_several_apps": "The following apps will be upgraded: {apps}",
"app_upgrade_app_name": "Now upgrading {app}...", "app_upgrade_app_name": "Now upgrading {app}...",
"app_upgrade_failed": "Could not upgrade {app}: {error}", "app_upgrade_failed": "Could not upgrade {app}: {error}",
"app_upgrade_script_failed": "An error occurred inside the app upgrade script", "app_upgrade_script_failed": "An error occurred inside the app upgrade script",
"app_upgrade_several_apps": "The following apps will be upgraded: {apps}",
"app_upgrade_some_app_failed": "Some apps could not be upgraded", "app_upgrade_some_app_failed": "Some apps could not be upgraded",
"app_upgraded": "{app} upgraded", "app_upgraded": "{app} upgraded",
"app_packaging_format_not_supported": "This app cannot be installed because its packaging format is not supported by your YunoHost version. You should probably consider upgrading your system.",
"apps_already_up_to_date": "All apps are already up-to-date", "apps_already_up_to_date": "All apps are already up-to-date",
"apps_catalog_init_success": "App catalog system initialized!",
"apps_catalog_updating": "Updating application catalog…",
"apps_catalog_failed_to_download": "Unable to download the {apps_catalog} app catalog: {error}", "apps_catalog_failed_to_download": "Unable to download the {apps_catalog} app catalog: {error}",
"apps_catalog_init_success": "App catalog system initialized!",
"apps_catalog_obsolete_cache": "The app catalog cache is empty or obsolete.", "apps_catalog_obsolete_cache": "The app catalog cache is empty or obsolete.",
"apps_catalog_update_success": "The application catalog has been updated!", "apps_catalog_update_success": "The application catalog has been updated!",
"ask_user_domain": "Domain to use for the user's email address and XMPP account", "apps_catalog_updating": "Updating application catalog...",
"ask_firstname": "First name", "ask_firstname": "First name",
"ask_lastname": "Last name", "ask_lastname": "Last name",
"ask_main_domain": "Main domain", "ask_main_domain": "Main domain",
@ -74,6 +73,7 @@
"ask_new_domain": "New domain", "ask_new_domain": "New domain",
"ask_new_path": "New path", "ask_new_path": "New path",
"ask_password": "Password", "ask_password": "Password",
"ask_user_domain": "Domain to use for the user's email address and XMPP account",
"backup_abstract_method": "This backup method has yet to be implemented", "backup_abstract_method": "This backup method has yet to be implemented",
"backup_actually_backuping": "Creating a backup archive from the collected files...", "backup_actually_backuping": "Creating a backup archive from the collected files...",
"backup_app_failed": "Could not back up {app}", "backup_app_failed": "Could not back up {app}",
@ -82,11 +82,11 @@
"backup_applying_method_tar": "Creating the backup TAR archive...", "backup_applying_method_tar": "Creating the backup TAR archive...",
"backup_archive_app_not_found": "Could not find {app} in the backup archive", "backup_archive_app_not_found": "Could not find {app} in the backup archive",
"backup_archive_broken_link": "Could not access the backup archive (broken link to {path})", "backup_archive_broken_link": "Could not access the backup archive (broken link to {path})",
"backup_archive_cant_retrieve_info_json": "Could not load infos for archive '{archive}'... The info.json cannot be retrieved (or is not a valid json).",
"backup_archive_corrupted": "It looks like the backup archive '{archive}' is corrupted : {error}",
"backup_archive_name_exists": "A backup archive with this name already exists.", "backup_archive_name_exists": "A backup archive with this name already exists.",
"backup_archive_name_unknown": "Unknown local backup archive named '{name}'", "backup_archive_name_unknown": "Unknown local backup archive named '{name}'",
"backup_archive_open_failed": "Could not open the backup archive", "backup_archive_open_failed": "Could not open the backup archive",
"backup_archive_cant_retrieve_info_json": "Could not load infos for archive '{archive}'... The info.json cannot be retrieved (or is not a valid json).",
"backup_archive_corrupted": "It looks like the backup archive '{archive}' is corrupted : {error}",
"backup_archive_system_part_not_available": "System part '{part}' unavailable in this backup", "backup_archive_system_part_not_available": "System part '{part}' unavailable in this backup",
"backup_archive_writing_error": "Could not add the files '{source}' (named in the archive '{dest}') to be backed up into the compressed archive '{archive}'", "backup_archive_writing_error": "Could not add the files '{source}' (named in the archive '{dest}') to be backed up into the compressed archive '{archive}'",
"backup_ask_for_copying_if_needed": "Do you want to perform the backup using {size}MB temporarily? (This way is used since some files could not be prepared using a more efficient method.)", "backup_ask_for_copying_if_needed": "Do you want to perform the backup using {size}MB temporarily? (This way is used since some files could not be prepared using a more efficient method.)",
@ -94,8 +94,8 @@
"backup_cleaning_failed": "Could not clean up the temporary backup folder", "backup_cleaning_failed": "Could not clean up the temporary backup folder",
"backup_copying_to_organize_the_archive": "Copying {size}MB to organize the archive", "backup_copying_to_organize_the_archive": "Copying {size}MB to organize the archive",
"backup_couldnt_bind": "Could not bind {src} to {dest}.", "backup_couldnt_bind": "Could not bind {src} to {dest}.",
"backup_created": "Backup created",
"backup_create_size_estimation": "The archive will contain about {size} of data.", "backup_create_size_estimation": "The archive will contain about {size} of data.",
"backup_created": "Backup created",
"backup_creation_failed": "Could not create the backup archive", "backup_creation_failed": "Could not create the backup archive",
"backup_csv_addition_failed": "Could not add files to backup into the CSV file", "backup_csv_addition_failed": "Could not add files to backup into the CSV file",
"backup_csv_creation_failed": "Could not create the CSV file needed for restoration", "backup_csv_creation_failed": "Could not create the CSV file needed for restoration",
@ -130,163 +130,164 @@
"certmanager_cert_renew_success": "Let's Encrypt certificate renewed for the domain '{domain}'", "certmanager_cert_renew_success": "Let's Encrypt certificate renewed for the domain '{domain}'",
"certmanager_cert_signing_failed": "Could not sign the new certificate", "certmanager_cert_signing_failed": "Could not sign the new certificate",
"certmanager_certificate_fetching_or_enabling_failed": "Trying to use the new certificate for {domain} did not work...", "certmanager_certificate_fetching_or_enabling_failed": "Trying to use the new certificate for {domain} did not work...",
"certmanager_domain_not_diagnosed_yet": "There is no diagnosis result for domain {domain} yet. Please re-run a diagnosis for categories 'DNS records' and 'Web' in the diagnosis section to check if the domain is ready for Let's Encrypt. (Or if you know what you are doing, use '--no-checks' to turn off those checks.)",
"certmanager_domain_cert_not_selfsigned": "The certificate for domain {domain} is not self-signed. Are you sure you want to replace it? (Use '--force' to do so.)", "certmanager_domain_cert_not_selfsigned": "The certificate for domain {domain} is not self-signed. Are you sure you want to replace it? (Use '--force' to do so.)",
"certmanager_domain_dns_ip_differs_from_public_ip": "The DNS records for domain '{domain}' is different from this server's IP. Please check the 'DNS records' (basic) category in the diagnosis for more info. If you recently modified your A record, please wait for it to propagate (some DNS propagation checkers are available online). (If you know what you are doing, use '--no-checks' to turn off those checks.)", "certmanager_domain_dns_ip_differs_from_public_ip": "The DNS records for domain '{domain}' is different from this server's IP. Please check the 'DNS records' (basic) category in the diagnosis for more info. If you recently modified your A record, please wait for it to propagate (some DNS propagation checkers are available online). (If you know what you are doing, use '--no-checks' to turn off those checks.)",
"certmanager_domain_http_not_working": "Domain {domain} does not seem to be accessible through HTTP. Please check the 'Web' category in the diagnosis for more info. (If you know what you are doing, use '--no-checks' to turn off those checks.)", "certmanager_domain_http_not_working": "Domain {domain} does not seem to be accessible through HTTP. Please check the 'Web' category in the diagnosis for more info. (If you know what you are doing, use '--no-checks' to turn off those checks.)",
"certmanager_warning_subdomain_dns_record": "Subdomain '{subdomain}' does not resolve to the same IP address as '{domain}'. Some features will not be available until you fix this and regenerate the certificate.", "certmanager_domain_not_diagnosed_yet": "There is no diagnosis result for domain {domain} yet. Please re-run a diagnosis for categories 'DNS records' and 'Web' in the diagnosis section to check if the domain is ready for Let's Encrypt. (Or if you know what you are doing, use '--no-checks' to turn off those checks.)",
"certmanager_hit_rate_limit": "Too many certificates already issued for this exact set of domains {domain} recently. Please try again later. See https://letsencrypt.org/docs/rate-limits/ for more details", "certmanager_hit_rate_limit": "Too many certificates already issued for this exact set of domains {domain} recently. Please try again later. See https://letsencrypt.org/docs/rate-limits/ for more details",
"certmanager_no_cert_file": "Could not read the certificate file for the domain {domain} (file: {file})", "certmanager_no_cert_file": "Could not read the certificate file for the domain {domain} (file: {file})",
"certmanager_self_ca_conf_file_not_found": "Could not find configuration file for self-signing authority (file: {file})", "certmanager_self_ca_conf_file_not_found": "Could not find configuration file for self-signing authority (file: {file})",
"certmanager_unable_to_parse_self_CA_name": "Could not parse name of self-signing authority (file: {file})", "certmanager_unable_to_parse_self_CA_name": "Could not parse name of self-signing authority (file: {file})",
"certmanager_warning_subdomain_dns_record": "Subdomain '{subdomain}' does not resolve to the same IP address as '{domain}'. Some features will not be available until you fix this and regenerate the certificate.",
"confirm_app_install_danger": "DANGER! This app is known to be still experimental (if not explicitly not working)! You should probably NOT install it unless you know what you are doing. NO SUPPORT will be provided if this app doesn't work or breaks your system... If you are willing to take that risk anyway, type '{answers}'",
"confirm_app_install_thirdparty": "DANGER! This app is not part of YunoHost's app catalog. Installing third-party apps may compromise the integrity and security of your system. You should probably NOT install it unless you know what you are doing. NO SUPPORT will be provided if this app doesn't work or breaks your system... If you are willing to take that risk anyway, type '{answers}'",
"confirm_app_install_warning": "Warning: This app may work, but is not well-integrated in YunoHost. Some features such as single sign-on and backup/restore might not be available. Install anyway? [{answers}] ", "confirm_app_install_warning": "Warning: This app may work, but is not well-integrated in YunoHost. Some features such as single sign-on and backup/restore might not be available. Install anyway? [{answers}] ",
"confirm_app_install_danger": "DANGER! This app is known to be still experimental (if not explicitly not working)! You should probably NOT install it unless you know what you are doing. NO SUPPORT will be provided if this app doesn't work or breaks your system… If you are willing to take that risk anyway, type '{answers}'",
"confirm_app_install_thirdparty": "DANGER! This app is not part of YunoHost's app catalog. Installing third-party apps may compromise the integrity and security of your system. You should probably NOT install it unless you know what you are doing. NO SUPPORT will be provided if this app doesn't work or breaks your system… If you are willing to take that risk anyway, type '{answers}'",
"custom_app_url_required": "You must provide a URL to upgrade your custom app {app}", "custom_app_url_required": "You must provide a URL to upgrade your custom app {app}",
"diagnosis_apps_allgood": "All installed apps respect basic packaging practices",
"diagnosis_apps_bad_quality": "This application is currently flagged as broken on YunoHost's application catalog. This may be a temporary issue while the maintainers attempt to fix the issue. In the meantime, upgrading this app is disabled.",
"diagnosis_apps_broken": "This application is currently flagged as broken on YunoHost's application catalog. This may be a temporary issue while the maintainers attempt to fix the issue. In the meantime, upgrading this app is disabled.",
"diagnosis_apps_deprecated_practices": "This app's installed version still uses some super-old deprecated packaging practices. You should really consider upgrading it.",
"diagnosis_apps_issue": "An issue was found for app {app}",
"diagnosis_apps_not_in_app_catalog": "This application is not in YunoHost's application catalog. If it was in the past and got removed, you should consider uninstalling this app as it won't receive upgrade, and may compromise the integrity and security of your system.",
"diagnosis_apps_outdated_ynh_requirement": "This app's installed version only requires yunohost >= 2.x, which tends to indicate that it's not up to date with recommended packaging practices and helpers. You should really consider upgrading it.",
"diagnosis_backports_in_sources_list": "It looks like apt (the package manager) is configured to use the backports repository. Unless you really know what you are doing, we strongly discourage from installing packages from backports, because it's likely to create unstabilities or conflicts on your system.",
"diagnosis_basesystem_hardware": "Server hardware architecture is {virt} {arch}", "diagnosis_basesystem_hardware": "Server hardware architecture is {virt} {arch}",
"diagnosis_basesystem_hardware_model": "Server model is {model}", "diagnosis_basesystem_hardware_model": "Server model is {model}",
"diagnosis_basesystem_host": "Server is running Debian {debian_version}", "diagnosis_basesystem_host": "Server is running Debian {debian_version}",
"diagnosis_basesystem_kernel": "Server is running Linux kernel {kernel_version}", "diagnosis_basesystem_kernel": "Server is running Linux kernel {kernel_version}",
"diagnosis_basesystem_ynh_single_version": "{package} version: {version} ({repo})",
"diagnosis_basesystem_ynh_main_version": "Server is running YunoHost {main_version} ({repo})",
"diagnosis_basesystem_ynh_inconsistent_versions": "You are running inconsistent versions of the YunoHost packages... most probably because of a failed or partial upgrade.", "diagnosis_basesystem_ynh_inconsistent_versions": "You are running inconsistent versions of the YunoHost packages... most probably because of a failed or partial upgrade.",
"diagnosis_backports_in_sources_list": "It looks like apt (the package manager) is configured to use the backports repository. Unless you really know what you are doing, we strongly discourage from installing packages from backports, because it's likely to create unstabilities or conflicts on your system.", "diagnosis_basesystem_ynh_main_version": "Server is running YunoHost {main_version} ({repo})",
"diagnosis_package_installed_from_sury": "Some system packages should be downgraded", "diagnosis_basesystem_ynh_single_version": "{package} version: {version} ({repo})",
"diagnosis_package_installed_from_sury_details": "Some packages were inadvertendly installed from a third-party repository called Sury. The YunoHost team improved the strategy that handle these packages, but it's expected that some setups that installed PHP7.3 apps while still on Stretch have some remaining inconsistencies. To fix this situation, you should try running the following command: <cmd>{cmd_to_fix}</cmd>",
"diagnosis_display_tip": "To see the issues found, you can go to the Diagnosis section of the webadmin, or run 'yunohost diagnosis show --issues --human-readable' from the command-line.",
"diagnosis_failed_for_category": "Diagnosis failed for category '{category}': {error}",
"diagnosis_cache_still_valid": "(Cache still valid for {category} diagnosis. Won't re-diagnose it yet!)", "diagnosis_cache_still_valid": "(Cache still valid for {category} diagnosis. Won't re-diagnose it yet!)",
"diagnosis_cant_run_because_of_dep": "Can't run diagnosis for {category} while there are important issues related to {dep}.", "diagnosis_cant_run_because_of_dep": "Can't run diagnosis for {category} while there are important issues related to {dep}.",
"diagnosis_ignored_issues": "(+ {nb_ignored} ignored issue(s))", "diagnosis_description_apps": "Applications",
"diagnosis_found_errors": "Found {errors} significant issue(s) related to {category}!", "diagnosis_description_basesystem": "Base system",
"diagnosis_found_errors_and_warnings": "Found {errors} significant issue(s) (and {warnings} warning(s)) related to {category}!", "diagnosis_description_dnsrecords": "DNS records",
"diagnosis_found_warnings": "Found {warnings} item(s) that could be improved for {category}.", "diagnosis_description_ip": "Internet connectivity",
"diagnosis_everything_ok": "Everything looks good for {category}!", "diagnosis_description_mail": "Email",
"diagnosis_failed": "Failed to fetch diagnosis result for category '{category}': {error}", "diagnosis_description_ports": "Ports exposure",
"diagnosis_no_cache": "No diagnosis cache yet for category '{category}'", "diagnosis_description_regenconf": "System configurations",
"diagnosis_ip_connected_ipv4": "The server is connected to the Internet through IPv4!", "diagnosis_description_services": "Services status check",
"diagnosis_ip_no_ipv4": "The server does not have working IPv4.", "diagnosis_description_systemresources": "System resources",
"diagnosis_ip_connected_ipv6": "The server is connected to the Internet through IPv6!", "diagnosis_description_web": "Web",
"diagnosis_ip_no_ipv6": "The server does not have working IPv6.", "diagnosis_diskusage_low": "Storage <code>{mountpoint}</code> (on device <code>{device}</code>) has only {free} ({free_percent}%) space remaining (out of {total}). Be careful.",
"diagnosis_ip_no_ipv6_tip": "Having a working IPv6 is not mandatory for your server to work, but it is better for the health of the Internet as a whole. IPv6 should usually be automatically configured by the system or your provider if it's available. Otherwise, you might need to configure a few things manually as explained in the documentation here: <a href='https://yunohost.org/#/ipv6'>https://yunohost.org/#/ipv6</a>. If you cannot enable IPv6 or if it seems too technical for you, you can also safely ignore this warning.", "diagnosis_diskusage_ok": "Storage <code>{mountpoint}</code> (on device <code>{device}</code>) still has {free} ({free_percent}%) space left (out of {total})!",
"diagnosis_ip_global": "Global IP: <code>{global}</code>", "diagnosis_diskusage_verylow": "Storage <code>{mountpoint}</code> (on device <code>{device}</code>) has only {free} ({free_percent}%) space remaining (out of {total}). You should really consider cleaning up some space!",
"diagnosis_ip_local": "Local IP: <code>{local}</code>", "diagnosis_display_tip": "To see the issues found, you can go to the Diagnosis section of the webadmin, or run 'yunohost diagnosis show --issues --human-readable' from the command-line.",
"diagnosis_ip_not_connected_at_all": "The server does not seem to be connected to the Internet at all!?",
"diagnosis_ip_dnsresolution_working": "Domain name resolution is working!",
"diagnosis_ip_broken_dnsresolution": "Domain name resolution seems to be broken for some reason... Is a firewall blocking DNS requests ?",
"diagnosis_ip_broken_resolvconf": "Domain name resolution seems to be broken on your server, which seems related to <code>/etc/resolv.conf</code> not pointing to <code>127.0.0.1</code>.",
"diagnosis_ip_weird_resolvconf": "DNS resolution seems to be working, but it looks like you're using a custom <code>/etc/resolv.conf</code>.",
"diagnosis_ip_weird_resolvconf_details": "The file <code>/etc/resolv.conf</code> should be a symlink to <code>/etc/resolvconf/run/resolv.conf</code> itself pointing to <code>127.0.0.1</code> (dnsmasq). If you want to manually configure DNS resolvers, please edit <code>/etc/resolv.dnsmasq.conf</code>.",
"diagnosis_dns_good_conf": "DNS records are correctly configured for domain {domain} (category {category})",
"diagnosis_dns_bad_conf": "Some DNS records are missing or incorrect for domain {domain} (category {category})", "diagnosis_dns_bad_conf": "Some DNS records are missing or incorrect for domain {domain} (category {category})",
"diagnosis_dns_missing_record": "According to the recommended DNS configuration, you should add a DNS record with the following info.<br>Type: <code>{type}</code><br>Name: <code>{name}</code><br>Value: <code>{value}</code>",
"diagnosis_dns_discrepancy": "The following DNS record does not seem to follow the recommended configuration:<br>Type: <code>{type}</code><br>Name: <code>{name}</code><br>Current value: <code>{current}</code><br>Expected value: <code>{value}</code>", "diagnosis_dns_discrepancy": "The following DNS record does not seem to follow the recommended configuration:<br>Type: <code>{type}</code><br>Name: <code>{name}</code><br>Current value: <code>{current}</code><br>Expected value: <code>{value}</code>",
"diagnosis_dns_good_conf": "DNS records are correctly configured for domain {domain} (category {category})",
"diagnosis_dns_missing_record": "According to the recommended DNS configuration, you should add a DNS record with the following info.<br>Type: <code>{type}</code><br>Name: <code>{name}</code><br>Value: <code>{value}</code>",
"diagnosis_dns_point_to_doc": "Please check the documentation at <a href='https://yunohost.org/dns_config'>https://yunohost.org/dns_config</a> if you need help about configuring DNS records.", "diagnosis_dns_point_to_doc": "Please check the documentation at <a href='https://yunohost.org/dns_config'>https://yunohost.org/dns_config</a> if you need help about configuring DNS records.",
"diagnosis_dns_try_dyndns_update_force": "This domain's DNS configuration should automatically be managed by YunoHost. If that's not the case, you can try to force an update using <cmd>yunohost dyndns update --force</cmd>.",
"diagnosis_dns_specialusedomain": "Domain {domain} is based on a special-use top-level domain (TLD) and is therefore not expected to have actual DNS records.", "diagnosis_dns_specialusedomain": "Domain {domain} is based on a special-use top-level domain (TLD) and is therefore not expected to have actual DNS records.",
"diagnosis_dns_try_dyndns_update_force": "This domain's DNS configuration should automatically be managed by YunoHost. If that's not the case, you can try to force an update using <cmd>yunohost dyndns update --force</cmd>.",
"diagnosis_domain_expiration_error": "Some domains will expire VERY SOON!",
"diagnosis_domain_expiration_not_found": "Unable to check the expiration date for some domains", "diagnosis_domain_expiration_not_found": "Unable to check the expiration date for some domains",
"diagnosis_domain_not_found_details": "The domain {domain} doesn't exist in WHOIS database or is expired!",
"diagnosis_domain_expiration_not_found_details": "The WHOIS information for domain {domain} doesn't seem to contain the information about the expiration date?", "diagnosis_domain_expiration_not_found_details": "The WHOIS information for domain {domain} doesn't seem to contain the information about the expiration date?",
"diagnosis_domain_expiration_success": "Your domains are registered and not going to expire anytime soon.", "diagnosis_domain_expiration_success": "Your domains are registered and not going to expire anytime soon.",
"diagnosis_domain_expiration_warning": "Some domains will expire soon!", "diagnosis_domain_expiration_warning": "Some domains will expire soon!",
"diagnosis_domain_expiration_error": "Some domains will expire VERY SOON!",
"diagnosis_domain_expires_in": "{domain} expires in {days} days.", "diagnosis_domain_expires_in": "{domain} expires in {days} days.",
"diagnosis_services_running": "Service {service} is running!", "diagnosis_domain_not_found_details": "The domain {domain} doesn't exist in WHOIS database or is expired!",
"diagnosis_services_conf_broken": "Configuration is broken for service {service}!", "diagnosis_everything_ok": "Everything looks good for {category}!",
"diagnosis_services_bad_status": "Service {service} is {status} :(", "diagnosis_failed": "Failed to fetch diagnosis result for category '{category}': {error}",
"diagnosis_services_bad_status_tip": "You can try to <a href='#/services/{service}'>restart the service</a>, and if it doesn't work, have a look at <a href='#/services/{service}'>the service logs in the webadmin</a> (from the command line, you can do this with <cmd>yunohost service restart {service}</cmd> and <cmd>yunohost service log {service}</cmd>).", "diagnosis_failed_for_category": "Diagnosis failed for category '{category}': {error}",
"diagnosis_diskusage_verylow": "Storage <code>{mountpoint}</code> (on device <code>{device}</code>) has only {free} ({free_percent}%) space remaining (out of {total}). You should really consider cleaning up some space!", "diagnosis_found_errors": "Found {errors} significant issue(s) related to {category}!",
"diagnosis_diskusage_low": "Storage <code>{mountpoint}</code> (on device <code>{device}</code>) has only {free} ({free_percent}%) space remaining (out of {total}). Be careful.", "diagnosis_found_errors_and_warnings": "Found {errors} significant issue(s) (and {warnings} warning(s)) related to {category}!",
"diagnosis_diskusage_ok": "Storage <code>{mountpoint}</code> (on device <code>{device}</code>) still has {free} ({free_percent}%) space left (out of {total})!", "diagnosis_found_warnings": "Found {warnings} item(s) that could be improved for {category}.",
"diagnosis_ram_verylow": "The system has only {available} ({available_percent}%) RAM available! (out of {total})", "diagnosis_high_number_auth_failures": "There's been a suspiciously high number of authentication failures recently. You may want to make sure that fail2ban is running and is correctly configured, or use a custom port for SSH as explained in https://yunohost.org/security.",
"diagnosis_http_bad_status_code": "It looks like another machine (maybe your internet router) answered instead of your server.<br>1. The most common cause for this issue is that port 80 (and 443) <a href='https://yunohost.org/isp_box_config'>are not correctly forwarded to your server</a>.<br>2. On more complex setups: make sure that no firewall or reverse-proxy is interfering.",
"diagnosis_http_connection_error": "Connection error: could not connect to the requested domain, it's very likely unreachable.",
"diagnosis_http_could_not_diagnose": "Could not diagnose if domains are reachable from outside in IPv{ipversion}.",
"diagnosis_http_could_not_diagnose_details": "Error: {error}",
"diagnosis_http_hairpinning_issue": "Your local network does not seem to have hairpinning enabled.",
"diagnosis_http_hairpinning_issue_details": "This is probably because of your ISP box / router. As a result, people from outside your local network will be able to access your server as expected, but not people from inside the local network (like you, probably?) when using the domain name or global IP. You may be able to improve the situation by having a look at <a href='https://yunohost.org/dns_local_network'>https://yunohost.org/dns_local_network</a>",
"diagnosis_http_localdomain": "Domain {domain}, with a .local TLD, is not expected to be exposed outside the local network.",
"diagnosis_http_nginx_conf_not_up_to_date": "This domain's nginx configuration appears to have been modified manually, and prevents YunoHost from diagnosing if it's reachable on HTTP.",
"diagnosis_http_nginx_conf_not_up_to_date_details": "To fix the situation, inspect the difference with the command line using <cmd>yunohost tools regen-conf nginx --dry-run --with-diff</cmd> and if you're ok, apply the changes with <cmd>yunohost tools regen-conf nginx --force</cmd>.",
"diagnosis_http_ok": "Domain {domain} is reachable through HTTP from outside the local network.",
"diagnosis_http_partially_unreachable": "Domain {domain} appears unreachable through HTTP from outside the local network in IPv{failed}, though it works in IPv{passed}.",
"diagnosis_http_timeout": "Timed-out while trying to contact your server from outside. It appears to be unreachable.<br>1. The most common cause for this issue is that port 80 (and 443) <a href='https://yunohost.org/isp_box_config'>are not correctly forwarded to your server</a>.<br>2. You should also make sure that the service nginx is running<br>3. On more complex setups: make sure that no firewall or reverse-proxy is interfering.",
"diagnosis_http_unreachable": "Domain {domain} appears unreachable through HTTP from outside the local network.",
"diagnosis_ignored_issues": "(+ {nb_ignored} ignored issue(s))",
"diagnosis_ip_broken_dnsresolution": "Domain name resolution seems to be broken for some reason... Is a firewall blocking DNS requests ?",
"diagnosis_ip_broken_resolvconf": "Domain name resolution seems to be broken on your server, which seems related to <code>/etc/resolv.conf</code> not pointing to <code>127.0.0.1</code>.",
"diagnosis_ip_connected_ipv4": "The server is connected to the Internet through IPv4!",
"diagnosis_ip_connected_ipv6": "The server is connected to the Internet through IPv6!",
"diagnosis_ip_dnsresolution_working": "Domain name resolution is working!",
"diagnosis_ip_global": "Global IP: <code>{global}</code>",
"diagnosis_ip_local": "Local IP: <code>{local}</code>",
"diagnosis_ip_no_ipv4": "The server does not have working IPv4.",
"diagnosis_ip_no_ipv6": "The server does not have working IPv6.",
"diagnosis_ip_no_ipv6_tip": "Having a working IPv6 is not mandatory for your server to work, but it is better for the health of the Internet as a whole. IPv6 should usually be automatically configured by the system or your provider if it's available. Otherwise, you might need to configure a few things manually as explained in the documentation here: <a href='https://yunohost.org/#/ipv6'>https://yunohost.org/#/ipv6</a>. If you cannot enable IPv6 or if it seems too technical for you, you can also safely ignore this warning.",
"diagnosis_ip_not_connected_at_all": "The server does not seem to be connected to the Internet at all!?",
"diagnosis_ip_weird_resolvconf": "DNS resolution seems to be working, but it looks like you're using a custom <code>/etc/resolv.conf</code>.",
"diagnosis_ip_weird_resolvconf_details": "The file <code>/etc/resolv.conf</code> should be a symlink to <code>/etc/resolvconf/run/resolv.conf</code> itself pointing to <code>127.0.0.1</code> (dnsmasq). If you want to manually configure DNS resolvers, please edit <code>/etc/resolv.dnsmasq.conf</code>.",
"diagnosis_mail_blacklist_listed_by": "Your IP or domain <code>{item}</code> is blacklisted on {blacklist_name}",
"diagnosis_mail_blacklist_ok": "The IPs and domains used by this server do not appear to be blacklisted",
"diagnosis_mail_blacklist_reason": "The blacklist reason is: {reason}",
"diagnosis_mail_blacklist_website": "After identifying why you are listed and fixed it, feel free to ask for your IP or domaine to be removed on {blacklist_website}",
"diagnosis_mail_ehlo_bad_answer": "A non-SMTP service answered on port 25 on IPv{ipversion}",
"diagnosis_mail_ehlo_bad_answer_details": "It could be due to an other machine answering instead of your server.",
"diagnosis_mail_ehlo_could_not_diagnose": "Could not diagnose if postfix mail server is reachable from outside in IPv{ipversion}.",
"diagnosis_mail_ehlo_could_not_diagnose_details": "Error: {error}",
"diagnosis_mail_ehlo_ok": "The SMTP mail server is reachable from the outside and therefore is able to receive emails!",
"diagnosis_mail_ehlo_unreachable": "The SMTP mail server is unreachable from the outside on IPv{ipversion}. It won't be able to receive emails.",
"diagnosis_mail_ehlo_unreachable_details": "Could not open a connection on port 25 to your server in IPv{ipversion}. It appears to be unreachable.<br>1. The most common cause for this issue is that port 25 <a href='https://yunohost.org/isp_box_config'>is not correctly forwarded to your server</a>.<br>2. You should also make sure that service postfix is running.<br>3. On more complex setups: make sure that no firewall or reverse-proxy is interfering.",
"diagnosis_mail_ehlo_wrong": "A different SMTP mail server answers on IPv{ipversion}. Your server will probably not be able to receive emails.",
"diagnosis_mail_ehlo_wrong_details": "The EHLO received by the remote diagnoser in IPv{ipversion} is different from your server's domain.<br>Received EHLO: <code>{wrong_ehlo}</code><br>Expected: <code>{right_ehlo}</code><br>The most common cause for this issue is that port 25 <a href='https://yunohost.org/isp_box_config'>is not correctly forwarded to your server</a>. Alternatively, make sure that no firewall or reverse-proxy is interfering.",
"diagnosis_mail_fcrdns_different_from_ehlo_domain": "The reverse DNS is not correctly configured in IPv{ipversion}. Some emails may fail to get delivered or may get flagged as spam.",
"diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "Current reverse DNS: <code>{rdns_domain}</code><br>Expected value: <code>{ehlo_domain}</code>",
"diagnosis_mail_fcrdns_dns_missing": "No reverse DNS is defined in IPv{ipversion}. Some emails may fail to get delivered or may get flagged as spam.",
"diagnosis_mail_fcrdns_nok_alternatives_4": "Some providers won't let you configure your reverse DNS (or their feature might be broken...). If you are experiencing issues because of this, consider the following solutions:<br> - Some ISP provide the alternative of <a href='https://yunohost.org/#/email_configure_relay'>using a mail server relay</a> though it implies that the relay will be able to spy on your email traffic.<br>- A privacy-friendly alternative is to use a VPN *with a dedicated public IP* to bypass this kind of limits. See <a href='https://yunohost.org/#/vpn_advantage'>https://yunohost.org/#/vpn_advantage</a><br>- Or it's possible to <a href='https://yunohost.org/#/isp'>switch to a different provider</a>",
"diagnosis_mail_fcrdns_nok_alternatives_6": "Some providers won't let you configure your reverse DNS (or their feature might be broken...). If your reverse DNS is correctly configured for IPv4, you can try disabling the use of IPv6 when sending emails by running <cmd>yunohost settings set smtp.allow_ipv6 -v off</cmd>. Note: this last solution means that you won't be able to send or receive emails from the few IPv6-only servers out there.",
"diagnosis_mail_fcrdns_nok_details": "You should first try to configure the reverse DNS with <code>{ehlo_domain}</code> in your internet router interface or your hosting provider interface. (Some hosting provider may require you to send them a support ticket for this).",
"diagnosis_mail_fcrdns_ok": "Your reverse DNS is correctly configured!",
"diagnosis_mail_outgoing_port_25_blocked": "The SMTP mail server cannot send emails to other servers because outgoing port 25 is blocked in IPv{ipversion}.",
"diagnosis_mail_outgoing_port_25_blocked_details": "You should first try to unblock outgoing port 25 in your internet router interface or your hosting provider interface. (Some hosting provider may require you to send them a support ticket for this).",
"diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Some providers won't let you unblock outgoing port 25 because they don't care about Net Neutrality.<br> - Some of them provide the alternative of <a href='https://yunohost.org/#/email_configure_relay'>using a mail server relay</a> though it implies that the relay will be able to spy on your email traffic.<br>- A privacy-friendly alternative is to use a VPN *with a dedicated public IP* to bypass this kind of limits. See <a href='https://yunohost.org/#/vpn_advantage'>https://yunohost.org/#/vpn_advantage</a><br>- You can also consider switching to <a href='https://yunohost.org/#/isp'>a more net neutrality-friendly provider</a>",
"diagnosis_mail_outgoing_port_25_ok": "The SMTP mail server is able to send emails (outgoing port 25 is not blocked).",
"diagnosis_mail_queue_ok": "{nb_pending} pending emails in the mail queues",
"diagnosis_mail_queue_too_big": "Too many pending emails in mail queue ({nb_pending} emails)",
"diagnosis_mail_queue_unavailable": "Can not consult number of pending emails in queue",
"diagnosis_mail_queue_unavailable_details": "Error: {error}",
"diagnosis_never_ran_yet": "It looks like this server was setup recently and there's no diagnosis report to show yet. You should start by running a full diagnosis, either from the webadmin or using 'yunohost diagnosis run' from the command line.",
"diagnosis_no_cache": "No diagnosis cache yet for category '{category}'",
"diagnosis_package_installed_from_sury": "Some system packages should be downgraded",
"diagnosis_package_installed_from_sury_details": "Some packages were inadvertendly installed from a third-party repository called Sury. The YunoHost team improved the strategy that handle these packages, but it's expected that some setups that installed PHP7.3 apps while still on Stretch have some remaining inconsistencies. To fix this situation, you should try running the following command: <cmd>{cmd_to_fix}</cmd>",
"diagnosis_ports_could_not_diagnose": "Could not diagnose if ports are reachable from outside in IPv{ipversion}.",
"diagnosis_ports_could_not_diagnose_details": "Error: {error}",
"diagnosis_ports_forwarding_tip": "To fix this issue, you most probably need to configure port forwarding on your internet router as described in <a href='https://yunohost.org/isp_box_config'>https://yunohost.org/isp_box_config</a>",
"diagnosis_ports_needed_by": "Exposing this port is needed for {category} features (service {service})",
"diagnosis_ports_ok": "Port {port} is reachable from outside.",
"diagnosis_ports_partially_unreachable": "Port {port} is not reachable from outside in IPv{failed}.",
"diagnosis_ports_unreachable": "Port {port} is not reachable from outside.",
"diagnosis_processes_killed_by_oom_reaper": "Some processes were recently killed by the system because it ran out of memory. This is typically symptomatic of a lack of memory on the system or of a process that ate up to much memory. Summary of the processes killed:\n{kills_summary}",
"diagnosis_ram_low": "The system has {available} ({available_percent}%) RAM available (out of {total}). Be careful.", "diagnosis_ram_low": "The system has {available} ({available_percent}%) RAM available (out of {total}). Be careful.",
"diagnosis_ram_ok": "The system still has {available} ({available_percent}%) RAM available out of {total}.", "diagnosis_ram_ok": "The system still has {available} ({available_percent}%) RAM available out of {total}.",
"diagnosis_ram_verylow": "The system has only {available} ({available_percent}%) RAM available! (out of {total})",
"diagnosis_regenconf_allgood": "All configurations files are in line with the recommended configuration!",
"diagnosis_regenconf_manually_modified": "Configuration file <code>{file}</code> appears to have been manually modified.",
"diagnosis_regenconf_manually_modified_details": "This is probably OK if you know what you're doing! YunoHost will stop updating this file automatically... But beware that YunoHost upgrades could contain important recommended changes. If you want to, you can inspect the differences with <cmd>yunohost tools regen-conf {category} --dry-run --with-diff</cmd> and force the reset to the recommended configuration with <cmd>yunohost tools regen-conf {category} --force</cmd>",
"diagnosis_rootfstotalspace_critical": "The root filesystem only has a total of {space} which is quite worrisome! You will likely run out of disk space very quickly! It's recommended to have at least 16 GB for the root filesystem.",
"diagnosis_rootfstotalspace_warning": "The root filesystem only has a total of {space}. This may be okay, but be careful because ultimately you may run out of disk space quickly... It's recommended to have at least 16 GB for the root filesystem.",
"diagnosis_security_vulnerable_to_meltdown": "You appear vulnerable to the Meltdown criticial security vulnerability",
"diagnosis_security_vulnerable_to_meltdown_details": "To fix this, you should upgrade your system and reboot to load the new linux kernel (or contact your server provider if this doesn't work). See https://meltdownattack.com/ for more infos.",
"diagnosis_services_bad_status": "Service {service} is {status} :(",
"diagnosis_services_bad_status_tip": "You can try to <a href='#/services/{service}'>restart the service</a>, and if it doesn't work, have a look at <a href='#/services/{service}'>the service logs in the webadmin</a> (from the command line, you can do this with <cmd>yunohost service restart {service}</cmd> and <cmd>yunohost service log {service}</cmd>).",
"diagnosis_services_conf_broken": "Configuration is broken for service {service}!",
"diagnosis_services_running": "Service {service} is running!",
"diagnosis_sshd_config_inconsistent": "It looks like the SSH port was manually modified in /etc/ssh/sshd_config. Since YunoHost 4.2, a new global setting 'security.ssh.port' is available to avoid manually editing the configuration.",
"diagnosis_sshd_config_inconsistent_details": "Please run <cmd>yunohost settings set security.ssh.port -v YOUR_SSH_PORT</cmd> to define the SSH port, and check <cmd>yunohost tools regen-conf ssh --dry-run --with-diff</cmd> and <cmd>yunohost tools regen-conf ssh --force</cmd> to reset your conf to the YunoHost recommendation.",
"diagnosis_sshd_config_insecure": "The SSH configuration appears to have been manually modified, and is insecure because it contains no 'AllowGroups' or 'AllowUsers' directive to limit access to authorized users.",
"diagnosis_swap_none": "The system has no swap at all. You should consider adding at least {recommended} of swap to avoid situations where the system runs out of memory.", "diagnosis_swap_none": "The system has no swap at all. You should consider adding at least {recommended} of swap to avoid situations where the system runs out of memory.",
"diagnosis_swap_notsomuch": "The system has only {total} swap. You should consider having at least {recommended} to avoid situations where the system runs out of memory.", "diagnosis_swap_notsomuch": "The system has only {total} swap. You should consider having at least {recommended} to avoid situations where the system runs out of memory.",
"diagnosis_swap_ok": "The system has {total} of swap!", "diagnosis_swap_ok": "The system has {total} of swap!",
"diagnosis_swap_tip": "Please be careful and aware that if the server is hosting swap on an SD card or SSD storage, it may drastically reduce the life expectancy of the device`.", "diagnosis_swap_tip": "Please be careful and aware that if the server is hosting swap on an SD card or SSD storage, it may drastically reduce the life expectancy of the device`.",
"diagnosis_mail_outgoing_port_25_ok": "The SMTP mail server is able to send emails (outgoing port 25 is not blocked).",
"diagnosis_mail_outgoing_port_25_blocked": "The SMTP mail server cannot send emails to other servers because outgoing port 25 is blocked in IPv{ipversion}.",
"diagnosis_mail_outgoing_port_25_blocked_details": "You should first try to unblock outgoing port 25 in your internet router interface or your hosting provider interface. (Some hosting provider may require you to send them a support ticket for this).",
"diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Some providers won't let you unblock outgoing port 25 because they don't care about Net Neutrality.<br> - Some of them provide the alternative of <a href='https://yunohost.org/#/email_configure_relay'>using a mail server relay</a> though it implies that the relay will be able to spy on your email traffic.<br>- A privacy-friendly alternative is to use a VPN *with a dedicated public IP* to bypass this kind of limits. See <a href='https://yunohost.org/#/vpn_advantage'>https://yunohost.org/#/vpn_advantage</a><br>- You can also consider switching to <a href='https://yunohost.org/#/isp'>a more net neutrality-friendly provider</a>",
"diagnosis_mail_ehlo_ok": "The SMTP mail server is reachable from the outside and therefore is able to receive emails!",
"diagnosis_mail_ehlo_unreachable": "The SMTP mail server is unreachable from the outside on IPv{ipversion}. It won't be able to receive emails.",
"diagnosis_mail_ehlo_unreachable_details": "Could not open a connection on port 25 to your server in IPv{ipversion}. It appears to be unreachable.<br>1. The most common cause for this issue is that port 25 <a href='https://yunohost.org/isp_box_config'>is not correctly forwarded to your server</a>.<br>2. You should also make sure that service postfix is running.<br>3. On more complex setups: make sure that no firewall or reverse-proxy is interfering.",
"diagnosis_mail_ehlo_bad_answer": "A non-SMTP service answered on port 25 on IPv{ipversion}",
"diagnosis_mail_ehlo_bad_answer_details": "It could be due to an other machine answering instead of your server.",
"diagnosis_mail_ehlo_wrong": "A different SMTP mail server answers on IPv{ipversion}. Your server will probably not be able to receive emails.",
"diagnosis_mail_ehlo_wrong_details": "The EHLO received by the remote diagnoser in IPv{ipversion} is different from your server's domain.<br>Received EHLO: <code>{wrong_ehlo}</code><br>Expected: <code>{right_ehlo}</code><br>The most common cause for this issue is that port 25 <a href='https://yunohost.org/isp_box_config'>is not correctly forwarded to your server</a>. Alternatively, make sure that no firewall or reverse-proxy is interfering.",
"diagnosis_mail_ehlo_could_not_diagnose": "Could not diagnose if postfix mail server is reachable from outside in IPv{ipversion}.",
"diagnosis_mail_ehlo_could_not_diagnose_details": "Error: {error}",
"diagnosis_mail_fcrdns_ok": "Your reverse DNS is correctly configured!",
"diagnosis_mail_fcrdns_dns_missing": "No reverse DNS is defined in IPv{ipversion}. Some emails may fail to get delivered or may get flagged as spam.",
"diagnosis_mail_fcrdns_nok_details": "You should first try to configure the reverse DNS with <code>{ehlo_domain}</code> in your internet router interface or your hosting provider interface. (Some hosting provider may require you to send them a support ticket for this).",
"diagnosis_mail_fcrdns_nok_alternatives_4": "Some providers won't let you configure your reverse DNS (or their feature might be broken...). If you are experiencing issues because of this, consider the following solutions:<br> - Some ISP provide the alternative of <a href='https://yunohost.org/#/email_configure_relay'>using a mail server relay</a> though it implies that the relay will be able to spy on your email traffic.<br>- A privacy-friendly alternative is to use a VPN *with a dedicated public IP* to bypass this kind of limits. See <a href='https://yunohost.org/#/vpn_advantage'>https://yunohost.org/#/vpn_advantage</a><br>- Or it's possible to <a href='https://yunohost.org/#/isp'>switch to a different provider</a>",
"diagnosis_mail_fcrdns_nok_alternatives_6": "Some providers won't let you configure your reverse DNS (or their feature might be broken...). If your reverse DNS is correctly configured for IPv4, you can try disabling the use of IPv6 when sending emails by running <cmd>yunohost settings set smtp.allow_ipv6 -v off</cmd>. Note: this last solution means that you won't be able to send or receive emails from the few IPv6-only servers out there.",
"diagnosis_mail_fcrdns_different_from_ehlo_domain": "The reverse DNS is not correctly configured in IPv{ipversion}. Some emails may fail to get delivered or may get flagged as spam.",
"diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "Current reverse DNS: <code>{rdns_domain}</code><br>Expected value: <code>{ehlo_domain}</code>",
"diagnosis_mail_blacklist_ok": "The IPs and domains used by this server do not appear to be blacklisted",
"diagnosis_mail_blacklist_listed_by": "Your IP or domain <code>{item}</code> is blacklisted on {blacklist_name}",
"diagnosis_mail_blacklist_reason": "The blacklist reason is: {reason}",
"diagnosis_mail_blacklist_website": "After identifying why you are listed and fixed it, feel free to ask for your IP or domaine to be removed on {blacklist_website}",
"diagnosis_mail_queue_ok": "{nb_pending} pending emails in the mail queues",
"diagnosis_mail_queue_unavailable": "Can not consult number of pending emails in queue",
"diagnosis_mail_queue_unavailable_details": "Error: {error}",
"diagnosis_mail_queue_too_big": "Too many pending emails in mail queue ({nb_pending} emails)",
"diagnosis_regenconf_allgood": "All configurations files are in line with the recommended configuration!",
"diagnosis_regenconf_manually_modified": "Configuration file <code>{file}</code> appears to have been manually modified.",
"diagnosis_regenconf_manually_modified_details": "This is probably OK if you know what you're doing! YunoHost will stop updating this file automatically... But beware that YunoHost upgrades could contain important recommended changes. If you want to, you can inspect the differences with <cmd>yunohost tools regen-conf {category} --dry-run --with-diff</cmd> and force the reset to the recommended configuration with <cmd>yunohost tools regen-conf {category} --force</cmd>",
"diagnosis_rootfstotalspace_warning": "The root filesystem only has a total of {space}. This may be okay, but be careful because ultimately you may run out of disk space quickly... It's recommended to have at least 16 GB for the root filesystem.",
"diagnosis_rootfstotalspace_critical": "The root filesystem only has a total of {space} which is quite worrisome! You will likely run out of disk space very quickly! It's recommended to have at least 16 GB for the root filesystem.",
"diagnosis_security_vulnerable_to_meltdown": "You appear vulnerable to the Meltdown criticial security vulnerability",
"diagnosis_security_vulnerable_to_meltdown_details": "To fix this, you should upgrade your system and reboot to load the new linux kernel (or contact your server provider if this doesn't work). See https://meltdownattack.com/ for more infos.",
"diagnosis_description_basesystem": "Base system",
"diagnosis_description_ip": "Internet connectivity",
"diagnosis_description_dnsrecords": "DNS records",
"diagnosis_description_services": "Services status check",
"diagnosis_description_systemresources": "System resources",
"diagnosis_description_ports": "Ports exposure",
"diagnosis_description_web": "Web",
"diagnosis_description_mail": "Email",
"diagnosis_description_regenconf": "System configurations",
"diagnosis_description_apps": "Applications",
"diagnosis_apps_allgood": "All installed apps respect basic packaging practices",
"diagnosis_apps_issue": "An issue was found for app {app}",
"diagnosis_apps_not_in_app_catalog": "This application is not in YunoHost's application catalog. If it was in the past and got removed, you should consider uninstalling this app as it won't receive upgrade, and may compromise the integrity and security of your system.",
"diagnosis_apps_broken": "This application is currently flagged as broken on YunoHost's application catalog. This may be a temporary issue while the maintainers attempt to fix the issue. In the meantime, upgrading this app is disabled.",
"diagnosis_apps_bad_quality": "This application is currently flagged as broken on YunoHost's application catalog. This may be a temporary issue while the maintainers attempt to fix the issue. In the meantime, upgrading this app is disabled.",
"diagnosis_apps_outdated_ynh_requirement": "This app's installed version only requires yunohost >= 2.x, which tends to indicate that it's not up to date with recommended packaging practices and helpers. You should really consider upgrading it.",
"diagnosis_apps_deprecated_practices": "This app's installed version still uses some super-old deprecated packaging practices. You should really consider upgrading it.",
"diagnosis_ports_could_not_diagnose": "Could not diagnose if ports are reachable from outside in IPv{ipversion}.",
"diagnosis_ports_could_not_diagnose_details": "Error: {error}",
"diagnosis_ports_unreachable": "Port {port} is not reachable from outside.",
"diagnosis_ports_partially_unreachable": "Port {port} is not reachable from outside in IPv{failed}.",
"diagnosis_ports_ok": "Port {port} is reachable from outside.",
"diagnosis_ports_needed_by": "Exposing this port is needed for {category} features (service {service})",
"diagnosis_ports_forwarding_tip": "To fix this issue, you most probably need to configure port forwarding on your internet router as described in <a href='https://yunohost.org/isp_box_config'>https://yunohost.org/isp_box_config</a>",
"diagnosis_http_hairpinning_issue": "Your local network does not seem to have hairpinning enabled.",
"diagnosis_http_hairpinning_issue_details": "This is probably because of your ISP box / router. As a result, people from outside your local network will be able to access your server as expected, but not people from inside the local network (like you, probably?) when using the domain name or global IP. You may be able to improve the situation by having a look at <a href='https://yunohost.org/dns_local_network'>https://yunohost.org/dns_local_network</a>",
"diagnosis_http_could_not_diagnose": "Could not diagnose if domains are reachable from outside in IPv{ipversion}.",
"diagnosis_http_could_not_diagnose_details": "Error: {error}",
"diagnosis_http_localdomain": "Domain {domain}, with a .local TLD, is not expected to be reached from outside the local network.",
"diagnosis_http_ok": "Domain {domain} is reachable through HTTP from outside the local network.",
"diagnosis_http_timeout": "Timed-out while trying to contact your server from outside. It appears to be unreachable.<br>1. The most common cause for this issue is that port 80 (and 443) <a href='https://yunohost.org/isp_box_config'>are not correctly forwarded to your server</a>.<br>2. You should also make sure that the service nginx is running<br>3. On more complex setups: make sure that no firewall or reverse-proxy is interfering.",
"diagnosis_http_connection_error": "Connection error: could not connect to the requested domain, it's very likely unreachable.",
"diagnosis_http_bad_status_code": "It looks like another machine (maybe your internet router) answered instead of your server.<br>1. The most common cause for this issue is that port 80 (and 443) <a href='https://yunohost.org/isp_box_config'>are not correctly forwarded to your server</a>.<br>2. On more complex setups: make sure that no firewall or reverse-proxy is interfering.",
"diagnosis_http_unreachable": "Domain {domain} appears unreachable through HTTP from outside the local network.",
"diagnosis_http_partially_unreachable": "Domain {domain} appears unreachable through HTTP from outside the local network in IPv{failed}, though it works in IPv{passed}.",
"diagnosis_http_nginx_conf_not_up_to_date": "This domain's nginx configuration appears to have been modified manually, and prevents YunoHost from diagnosing if it's reachable on HTTP.",
"diagnosis_http_nginx_conf_not_up_to_date_details": "To fix the situation, inspect the difference with the command line using <cmd>yunohost tools regen-conf nginx --dry-run --with-diff</cmd> and if you're ok, apply the changes with <cmd>yunohost tools regen-conf nginx --force</cmd>.",
"diagnosis_unknown_categories": "The following categories are unknown: {categories}", "diagnosis_unknown_categories": "The following categories are unknown: {categories}",
"diagnosis_never_ran_yet": "It looks like this server was setup recently and there's no diagnosis report to show yet. You should start by running a full diagnosis, either from the webadmin or using 'yunohost diagnosis run' from the command line.",
"diagnosis_processes_killed_by_oom_reaper": "Some processes were recently killed by the system because it ran out of memory. This is typically symptomatic of a lack of memory on the system or of a process that ate up to much memory. Summary of the processes killed:\n{kills_summary}",
"diagnosis_sshd_config_insecure": "The SSH configuration appears to have been manually modified, and is insecure because it contains no 'AllowGroups' or 'AllowUsers' directive to limit access to authorized users.",
"diagnosis_sshd_config_inconsistent": "It looks like the SSH port was manually modified in /etc/ssh/sshd_config. Since YunoHost 4.2, a new global setting 'security.ssh.port' is available to avoid manually editing the configuration.",
"diagnosis_sshd_config_inconsistent_details": "Please run <cmd>yunohost settings set security.ssh.port -v YOUR_SSH_PORT</cmd> to define the SSH port, and check <cmd>yunohost tools regen-conf ssh --dry-run --with-diff</cmd> and <cmd>yunohost tools regen-conf ssh --force</cmd> to reset your conf to the YunoHost recommendation.",
"disk_space_not_sufficient_install": "There is not enough disk space left to install this application", "disk_space_not_sufficient_install": "There is not enough disk space left to install this application",
"disk_space_not_sufficient_update": "There is not enough disk space left to update this application", "disk_space_not_sufficient_update": "There is not enough disk space left to update this application",
"domain_cannot_remove_main": "You cannot remove '{domain}' since it's the main domain, you first need to set another domain as the main domain using 'yunohost domain main-domain -n <another-domain>'; here is the list of candidate domains: {other_domains}",
"domain_cannot_add_xmpp_upload": "You cannot add domains starting with 'xmpp-upload.'. This kind of name is reserved for the XMPP upload feature integrated in YunoHost.", "domain_cannot_add_xmpp_upload": "You cannot add domains starting with 'xmpp-upload.'. This kind of name is reserved for the XMPP upload feature integrated in YunoHost.",
"domain_cannot_remove_main": "You cannot remove '{domain}' since it's the main domain, you first need to set another domain as the main domain using 'yunohost domain main-domain -n <another-domain>'; here is the list of candidate domains: {other_domains}",
"domain_cannot_remove_main_add_new_one": "You cannot remove '{domain}' since it's the main domain and your only domain, you need to first add another domain using 'yunohost domain add <another-domain.com>', then set is as the main domain using 'yunohost domain main-domain -n <another-domain.com>' and then you can remove the domain '{domain}' using 'yunohost domain remove {domain}'.'", "domain_cannot_remove_main_add_new_one": "You cannot remove '{domain}' since it's the main domain and your only domain, you need to first add another domain using 'yunohost domain add <another-domain.com>', then set is as the main domain using 'yunohost domain main-domain -n <another-domain.com>' and then you can remove the domain '{domain}' using 'yunohost domain remove {domain}'.'",
"domain_cert_gen_failed": "Could not generate certificate", "domain_cert_gen_failed": "Could not generate certificate",
"domain_created": "Domain created", "domain_created": "Domain created",
@ -298,17 +299,18 @@
"domain_dyndns_root_unknown": "Unknown DynDNS root domain", "domain_dyndns_root_unknown": "Unknown DynDNS root domain",
"domain_exists": "The domain already exists", "domain_exists": "The domain already exists",
"domain_hostname_failed": "Unable to set new hostname. This might cause an issue later (it might be fine).", "domain_hostname_failed": "Unable to set new hostname. This might cause an issue later (it might be fine).",
"domain_name_unknown": "Domain '{domain}' unknown",
"domain_remove_confirm_apps_removal": "Removing this domain will remove those applications:\n{apps}\n\nAre you sure you want to do that? [{answers}]", "domain_remove_confirm_apps_removal": "Removing this domain will remove those applications:\n{apps}\n\nAre you sure you want to do that? [{answers}]",
"domain_uninstall_app_first": "Those applications are still installed on your domain:\n{apps}\n\nPlease uninstall them using 'yunohost app remove the_app_id' or move them to another domain using 'yunohost app change-url the_app_id' before proceeding to domain removal", "domain_uninstall_app_first": "Those applications are still installed on your domain:\n{apps}\n\nPlease uninstall them using 'yunohost app remove the_app_id' or move them to another domain using 'yunohost app change-url the_app_id' before proceeding to domain removal",
"domain_name_unknown": "Domain '{domain}' unknown",
"domain_unknown": "Unknown domain", "domain_unknown": "Unknown domain",
"domains_available": "Available domains:", "domains_available": "Available domains:",
"done": "Done", "done": "Done",
"downloading": "Downloading", "downloading": "Downloading...",
"dpkg_is_broken": "You cannot do this right now because dpkg/APT (the system package managers) seems to be in a broken state You can try to solve this issue by connecting through SSH and running `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a`.", "dpkg_is_broken": "You cannot do this right now because dpkg/APT (the system package managers) seems to be in a broken state... You can try to solve this issue by connecting through SSH and running `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a`.",
"dpkg_lock_not_available": "This command can't be run right now because another program seems to be using the lock of dpkg (the system package manager)", "dpkg_lock_not_available": "This command can't be run right now because another program seems to be using the lock of dpkg (the system package manager)",
"dyndns_could_not_check_provide": "Could not check if {provider} can provide {domain}.",
"dyndns_could_not_check_available": "Could not check if {domain} is available on {provider}.", "dyndns_could_not_check_available": "Could not check if {domain} is available on {provider}.",
"dyndns_could_not_check_provide": "Could not check if {provider} can provide {domain}.",
"dyndns_domain_not_provided": "DynDNS provider {provider} cannot provide domain {domain}.",
"dyndns_ip_update_failed": "Could not update IP address to DynDNS", "dyndns_ip_update_failed": "Could not update IP address to DynDNS",
"dyndns_ip_updated": "Updated your IP on DynDNS", "dyndns_ip_updated": "Updated your IP on DynDNS",
"dyndns_key_generating": "Generating DNS key... It may take a while.", "dyndns_key_generating": "Generating DNS key... It may take a while.",
@ -317,10 +319,9 @@
"dyndns_provider_unreachable": "Unable to reach DynDNS provider {provider}: either your YunoHost is not correctly connected to the internet or the dynette server is down.", "dyndns_provider_unreachable": "Unable to reach DynDNS provider {provider}: either your YunoHost is not correctly connected to the internet or the dynette server is down.",
"dyndns_registered": "DynDNS domain registered", "dyndns_registered": "DynDNS domain registered",
"dyndns_registration_failed": "Could not register DynDNS domain: {error}", "dyndns_registration_failed": "Could not register DynDNS domain: {error}",
"dyndns_domain_not_provided": "DynDNS provider {provider} cannot provide domain {domain}.",
"dyndns_unavailable": "The domain '{domain}' is unavailable.", "dyndns_unavailable": "The domain '{domain}' is unavailable.",
"extracting": "Extracting...",
"experimental_feature": "Warning: This feature is experimental and not considered stable, you should not use it unless you know what you are doing.", "experimental_feature": "Warning: This feature is experimental and not considered stable, you should not use it unless you know what you are doing.",
"extracting": "Extracting...",
"field_invalid": "Invalid field '{}'", "field_invalid": "Invalid field '{}'",
"file_does_not_exist": "The file {path} does not exist.", "file_does_not_exist": "The file {path} does not exist.",
"firewall_reload_failed": "Could not reload the firewall", "firewall_reload_failed": "Could not reload the firewall",
@ -333,42 +334,43 @@
"global_settings_cant_write_settings": "Could not save settings file, reason: {reason}", "global_settings_cant_write_settings": "Could not save settings file, reason: {reason}",
"global_settings_key_doesnt_exists": "The key '{settings_key}' does not exist in the global settings, you can see all the available keys by running 'yunohost settings list'", "global_settings_key_doesnt_exists": "The key '{settings_key}' does not exist in the global settings, you can see all the available keys by running 'yunohost settings list'",
"global_settings_reset_success": "Previous settings now backed up to {path}", "global_settings_reset_success": "Previous settings now backed up to {path}",
"global_settings_setting_backup_compress_tar_archives": "When creating new backups, compress the archives (.tar.gz) instead of uncompressed archives (.tar). N.B. : enabling this option means create lighter backup archives, but the initial backup procedure will be significantly longer and heavy on CPU.",
"global_settings_setting_pop3_enabled": "Enable the POP3 protocol for the mail server", "global_settings_setting_pop3_enabled": "Enable the POP3 protocol for the mail server",
"global_settings_setting_security_experimental_enabled": "Enable experimental security features (don't enable this if you don't know what you're doing!)",
"global_settings_setting_security_nginx_redirect_to_https": "Redirect HTTP requests to HTTPs by default (DO NOT TURN OFF unless you really know what you're doing!)",
"global_settings_setting_security_nginx_compatibility": "Compatibility vs. security tradeoff for the web server NGINX. Affects the ciphers (and other security-related aspects)", "global_settings_setting_security_nginx_compatibility": "Compatibility vs. security tradeoff for the web server NGINX. Affects the ciphers (and other security-related aspects)",
"global_settings_setting_security_password_admin_strength": "Admin password strength", "global_settings_setting_security_password_admin_strength": "Admin password strength",
"global_settings_setting_security_password_user_strength": "User password strength", "global_settings_setting_security_password_user_strength": "User password strength",
"global_settings_setting_security_ssh_compatibility": "Compatibility vs. security tradeoff for the SSH server. Affects the ciphers (and other security-related aspects)",
"global_settings_setting_security_postfix_compatibility": "Compatibility vs. security tradeoff for the Postfix server. Affects the ciphers (and other security-related aspects)", "global_settings_setting_security_postfix_compatibility": "Compatibility vs. security tradeoff for the Postfix server. Affects the ciphers (and other security-related aspects)",
"global_settings_setting_security_ssh_compatibility": "Compatibility vs. security tradeoff for the SSH server. Affects the ciphers (and other security-related aspects)",
"global_settings_setting_security_ssh_port": "SSH port", "global_settings_setting_security_ssh_port": "SSH port",
"global_settings_unknown_setting_from_settings_file": "Unknown key in settings: '{setting_key}', discard it and save it in /etc/yunohost/settings-unknown.json", "global_settings_setting_security_webadmin_allowlist": "IP adresses allowed to access the webadmin. Comma-separated.",
"global_settings_setting_security_webadmin_allowlist_enabled": "Allow only some IPs to access the webadmin.",
"global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Allow the use of (deprecated) DSA hostkey for the SSH daemon configuration", "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Allow the use of (deprecated) DSA hostkey for the SSH daemon configuration",
"global_settings_setting_ssowat_panel_overlay_enabled": "Enable SSOwat panel overlay",
"global_settings_setting_smtp_allow_ipv6": "Allow the use of IPv6 to receive and send mail", "global_settings_setting_smtp_allow_ipv6": "Allow the use of IPv6 to receive and send mail",
"global_settings_setting_smtp_relay_host": "SMTP relay host to use in order to send mail instead of this yunohost instance. Useful if you are in one of this situation: your 25 port is blocked by your ISP or VPS provider, you have a residential IP listed on DUHL, you are not able to configure reverse DNS or this server is not directly exposed on the internet and you want use an other one to send mails.", "global_settings_setting_smtp_relay_host": "SMTP relay host to use in order to send mail instead of this yunohost instance. Useful if you are in one of this situation: your 25 port is blocked by your ISP or VPS provider, you have a residential IP listed on DUHL, you are not able to configure reverse DNS or this server is not directly exposed on the internet and you want use an other one to send mails.",
"global_settings_setting_smtp_relay_password": "SMTP relay host password",
"global_settings_setting_smtp_relay_port": "SMTP relay port", "global_settings_setting_smtp_relay_port": "SMTP relay port",
"global_settings_setting_smtp_relay_user": "SMTP relay user account", "global_settings_setting_smtp_relay_user": "SMTP relay user account",
"global_settings_setting_smtp_relay_password": "SMTP relay host password", "global_settings_setting_ssowat_panel_overlay_enabled": "Enable SSOwat panel overlay",
"global_settings_setting_security_webadmin_allowlist_enabled": "Allow only some IPs to access the webadmin.", "global_settings_unknown_setting_from_settings_file": "Unknown key in settings: '{setting_key}', discard it and save it in /etc/yunohost/settings-unknown.json",
"global_settings_setting_security_webadmin_allowlist": "IP adresses allowed to access the webadmin. Comma-separated.",
"global_settings_setting_security_experimental_enabled": "Enable experimental security features (don't enable this if you don't know what you're doing!)",
"global_settings_setting_backup_compress_tar_archives": "When creating new backups, compress the archives (.tar.gz) instead of uncompressed archives (.tar). N.B. : enabling this option means create lighter backup archives, but the initial backup procedure will be significantly longer and heavy on CPU.",
"global_settings_unknown_type": "Unexpected situation, the setting {setting} appears to have the type {unknown_type} but it is not a type supported by the system.", "global_settings_unknown_type": "Unexpected situation, the setting {setting} appears to have the type {unknown_type} but it is not a type supported by the system.",
"good_practices_about_admin_password": "You are now about to define a new administration password. The password should be at least 8 characters long—though it is good practice to use a longer password (i.e. a passphrase) and/or to use a variation of characters (uppercase, lowercase, digits and special characters).", "good_practices_about_admin_password": "You are now about to define a new administration password. The password should be at least 8 characters long—though it is good practice to use a longer password (i.e. a passphrase) and/or to use a variation of characters (uppercase, lowercase, digits and special characters).",
"good_practices_about_user_password": "You are now about to define a new user password. The password should be at least 8 characters long—though it is good practice to use a longer password (i.e. a passphrase) and/or to a variation of characters (uppercase, lowercase, digits and special characters).", "good_practices_about_user_password": "You are now about to define a new user password. The password should be at least 8 characters long—though it is good practice to use a longer password (i.e. a passphrase) and/or to a variation of characters (uppercase, lowercase, digits and special characters).",
"group_already_exist": "Group {group} already exists", "group_already_exist": "Group {group} already exists",
"group_already_exist_on_system": "Group {group} already exists in the system groups", "group_already_exist_on_system": "Group {group} already exists in the system groups",
"group_already_exist_on_system_but_removing_it": "Group {group} already exists in the system groups, but YunoHost will remove it...", "group_already_exist_on_system_but_removing_it": "Group {group} already exists in the system groups, but YunoHost will remove it...",
"group_cannot_be_deleted": "The group {group} cannot be deleted manually.",
"group_cannot_edit_all_users": "The group 'all_users' cannot be edited manually. It is a special group meant to contain all users registered in YunoHost",
"group_cannot_edit_primary_group": "The group '{group}' cannot be edited manually. It is the primary group meant to contain only one specific user.",
"group_cannot_edit_visitors": "The group 'visitors' cannot be edited manually. It is a special group representing anonymous visitors",
"group_created": "Group '{group}' created", "group_created": "Group '{group}' created",
"group_creation_failed": "Could not create the group '{group}': {error}", "group_creation_failed": "Could not create the group '{group}': {error}",
"group_cannot_edit_all_users": "The group 'all_users' cannot be edited manually. It is a special group meant to contain all users registered in YunoHost",
"group_cannot_edit_visitors": "The group 'visitors' cannot be edited manually. It is a special group representing anonymous visitors",
"group_cannot_edit_primary_group": "The group '{group}' cannot be edited manually. It is the primary group meant to contain only one specific user.",
"group_cannot_be_deleted": "The group {group} cannot be deleted manually.",
"group_deleted": "Group '{group}' deleted", "group_deleted": "Group '{group}' deleted",
"group_deletion_failed": "Could not delete the group '{group}': {error}", "group_deletion_failed": "Could not delete the group '{group}': {error}",
"group_unknown": "The group '{group}' is unknown", "group_unknown": "The group '{group}' is unknown",
"group_updated": "Group '{group}' updated",
"group_update_failed": "Could not update the group '{group}': {error}", "group_update_failed": "Could not update the group '{group}': {error}",
"group_updated": "Group '{group}' updated",
"group_user_already_in_group": "User {user} is already in group {group}", "group_user_already_in_group": "User {user} is already in group {group}",
"group_user_not_in_group": "User {user} is not in group {group}", "group_user_not_in_group": "User {user} is not in group {group}",
"hook_exec_failed": "Could not run script: {path}", "hook_exec_failed": "Could not run script: {path}",
@ -377,72 +379,90 @@
"hook_list_by_invalid": "This property can not be used to list hooks", "hook_list_by_invalid": "This property can not be used to list hooks",
"hook_name_unknown": "Unknown hook name '{name}'", "hook_name_unknown": "Unknown hook name '{name}'",
"installation_complete": "Installation completed", "installation_complete": "Installation completed",
"invalid_number": "Must be a number",
"invalid_password": "Invalid password",
"invalid_regex": "Invalid regex:'{regex}'", "invalid_regex": "Invalid regex:'{regex}'",
"ip6tables_unavailable": "You cannot play with ip6tables here. You are either in a container or your kernel does not support it", "ip6tables_unavailable": "You cannot play with ip6tables here. You are either in a container or your kernel does not support it",
"iptables_unavailable": "You cannot play with iptables here. You are either in a container or your kernel does not support it", "iptables_unavailable": "You cannot play with iptables here. You are either in a container or your kernel does not support it",
"ldap_server_down": "Unable to reach LDAP server", "ldap_server_down": "Unable to reach LDAP server",
"ldap_server_is_down_restart_it": "The LDAP service is down, attempt to restart it...", "ldap_server_is_down_restart_it": "The LDAP service is down, attempt to restart it...",
"log_corrupted_md_file": "The YAML metadata file associated with logs is damaged: '{md_file}\nError: {error}'", "log_app_action_run": "Run action of the '{}' app",
"log_link_to_log": "Full log of this operation: '<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\">{desc}</a>'",
"log_help_to_get_log": "To view the log of the operation '{desc}', use the command 'yunohost log show {name}{name}'",
"log_link_to_failed_log": "Could not complete the operation '{desc}'. Please provide the full log of this operation by <a href=\"#/tools/logs/{name}\">clicking here</a> to get help",
"log_help_to_get_failed_log": "The operation '{desc}' could not be completed. Please share the full log of this operation using the command 'yunohost log share {name}' to get help",
"log_does_exists": "There is no operation log with the name '{log}', use 'yunohost log list' to see all available operation logs",
"log_operation_unit_unclosed_properly": "Operation unit has not been closed properly",
"log_app_change_url": "Change the URL of the '{}' app", "log_app_change_url": "Change the URL of the '{}' app",
"log_app_config_apply": "Apply config to the '{}' app",
"log_app_config_show_panel": "Show the config panel of the '{}' app",
"log_app_install": "Install the '{}' app", "log_app_install": "Install the '{}' app",
"log_app_makedefault": "Make '{}' the default app",
"log_app_remove": "Remove the '{}' app", "log_app_remove": "Remove the '{}' app",
"log_app_upgrade": "Upgrade the '{}' app", "log_app_upgrade": "Upgrade the '{}' app",
"log_app_makedefault": "Make '{}' the default app",
"log_app_action_run": "Run action of the '{}' app",
"log_app_config_show_panel": "Show the config panel of the '{}' app",
"log_app_config_apply": "Apply config to the '{}' app",
"log_available_on_yunopaste": "This log is now available via {url}", "log_available_on_yunopaste": "This log is now available via {url}",
"log_backup_create": "Create a backup archive", "log_backup_create": "Create a backup archive",
"log_backup_restore_system": "Restore system from a backup archive",
"log_backup_restore_app": "Restore '{}' from a backup archive", "log_backup_restore_app": "Restore '{}' from a backup archive",
"log_remove_on_failed_restore": "Remove '{}' after a failed restore from a backup archive", "log_backup_restore_system": "Restore system from a backup archive",
"log_remove_on_failed_install": "Remove '{}' after a failed installation", "log_corrupted_md_file": "The YAML metadata file associated with logs is damaged: '{md_file}\nError: {error}'",
"log_does_exists": "There is no operation log with the name '{log}', use 'yunohost log list' to see all available operation logs",
"log_domain_add": "Add '{}' domain into system configuration", "log_domain_add": "Add '{}' domain into system configuration",
"log_domain_main_domain": "Make '{}' the main domain",
"log_domain_remove": "Remove '{}' domain from system configuration", "log_domain_remove": "Remove '{}' domain from system configuration",
"log_dyndns_subscribe": "Subscribe to a YunoHost subdomain '{}'", "log_dyndns_subscribe": "Subscribe to a YunoHost subdomain '{}'",
"log_dyndns_update": "Update the IP associated with your YunoHost subdomain '{}'", "log_dyndns_update": "Update the IP associated with your YunoHost subdomain '{}'",
"log_help_to_get_failed_log": "The operation '{desc}' could not be completed. Please share the full log of this operation using the command 'yunohost log share {name}' to get help",
"log_help_to_get_log": "To view the log of the operation '{desc}', use the command 'yunohost log show {name}{name}'",
"log_letsencrypt_cert_install": "Install a Let's Encrypt certificate on '{}' domain", "log_letsencrypt_cert_install": "Install a Let's Encrypt certificate on '{}' domain",
"log_letsencrypt_cert_renew": "Renew '{}' Let's Encrypt certificate",
"log_link_to_failed_log": "Could not complete the operation '{desc}'. Please provide the full log of this operation by <a href=\"#/tools/logs/{name}\">clicking here</a> to get help",
"log_link_to_log": "Full log of this operation: '<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\">{desc}</a>'",
"log_operation_unit_unclosed_properly": "Operation unit has not been closed properly",
"log_permission_create": "Create permission '{}'", "log_permission_create": "Create permission '{}'",
"log_permission_delete": "Delete permission '{}'", "log_permission_delete": "Delete permission '{}'",
"log_permission_url": "Update URL related to permission '{}'", "log_permission_url": "Update URL related to permission '{}'",
"log_selfsigned_cert_install": "Install self-signed certificate on '{}' domain",
"log_letsencrypt_cert_renew": "Renew '{}' Let's Encrypt certificate",
"log_regen_conf": "Regenerate system configurations '{}'", "log_regen_conf": "Regenerate system configurations '{}'",
"log_remove_on_failed_install": "Remove '{}' after a failed installation",
"log_remove_on_failed_restore": "Remove '{}' after a failed restore from a backup archive",
"log_selfsigned_cert_install": "Install self-signed certificate on '{}' domain",
"log_tools_migrations_migrate_forward": "Run migrations",
"log_tools_postinstall": "Postinstall your YunoHost server",
"log_tools_reboot": "Reboot your server",
"log_tools_shutdown": "Shutdown your server",
"log_tools_upgrade": "Upgrade system packages",
"log_user_create": "Add '{}' user", "log_user_create": "Add '{}' user",
"log_user_delete": "Delete '{}' user", "log_user_delete": "Delete '{}' user",
"log_user_group_create": "Create '{}' group", "log_user_group_create": "Create '{}' group",
"log_user_group_delete": "Delete '{}' group", "log_user_group_delete": "Delete '{}' group",
"log_user_group_update": "Update '{}' group", "log_user_group_update": "Update '{}' group",
"log_user_update": "Update info for user '{}'", "log_user_import": "Import users",
"log_user_permission_update": "Update accesses for permission '{}'",
"log_user_permission_reset": "Reset permission '{}'", "log_user_permission_reset": "Reset permission '{}'",
"log_domain_main_domain": "Make '{}' the main domain", "log_user_permission_update": "Update accesses for permission '{}'",
"log_tools_migrations_migrate_forward": "Run migrations", "log_user_update": "Update info for user '{}'",
"log_tools_postinstall": "Postinstall your YunoHost server",
"log_tools_upgrade": "Upgrade system packages",
"log_tools_shutdown": "Shutdown your server",
"log_tools_reboot": "Reboot your server",
"mail_alias_remove_failed": "Could not remove e-mail alias '{mail}'", "mail_alias_remove_failed": "Could not remove e-mail alias '{mail}'",
"mail_domain_unknown": "Invalid e-mail address for domain '{domain}'. Please, use a domain administrated by this server.", "mail_domain_unknown": "Invalid e-mail address for domain '{domain}'. Please, use a domain administrated by this server.",
"mail_forward_remove_failed": "Could not remove e-mail forwarding '{mail}'", "mail_forward_remove_failed": "Could not remove e-mail forwarding '{mail}'",
"mail_unavailable": "This e-mail address is reserved and shall be automatically allocated to the very first user",
"mailbox_disabled": "E-mail turned off for user {user}", "mailbox_disabled": "E-mail turned off for user {user}",
"mailbox_used_space_dovecot_down": "The Dovecot mailbox service needs to be up if you want to fetch used mailbox space", "mailbox_used_space_dovecot_down": "The Dovecot mailbox service needs to be up if you want to fetch used mailbox space",
"mail_unavailable": "This e-mail address is reserved and shall be automatically allocated to the very first user",
"main_domain_change_failed": "Unable to change the main domain", "main_domain_change_failed": "Unable to change the main domain",
"main_domain_changed": "The main domain has been changed", "main_domain_changed": "The main domain has been changed",
"migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x", "migrating_legacy_permission_settings": "Migrating legacy permission settings...",
"migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4", "migration_0015_cleaning_up": "Cleaning up cache and packages not useful anymore...",
"migration_description_0023_postgresql_11_to_13": "Migrate databases from PostgreSQL 11 to 13", "migration_0015_general_warning": "Please note that this migration is a delicate operation. The YunoHost team did its best to review and test it, but the migration might still break parts of the system or its apps.\n\nTherefore, it is recommended to:\n - Perform a backup of any critical data or app. More info on https://yunohost.org/backup;\n - Be patient after launching the migration: Depending on your Internet connection and hardware, it might take up to a few hours for everything to upgrade.",
"migration_ldap_backup_before_migration": "Creating a backup of LDAP database and apps settings prior to the actual migration.", "migration_0015_main_upgrade": "Starting main upgrade...",
"migration_ldap_can_not_backup_before_migration": "The backup of the system could not be completed before the migration failed. Error: {error}", "migration_0015_modified_files": "Please note that the following files were found to be manually modified and might be overwritten following the upgrade: {manually_modified_files}",
"migration_ldap_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.", "migration_0015_not_enough_free_space": "Free space is pretty low in /var/! You should have at least 1GB free to run this migration.",
"migration_ldap_rollback_success": "System rolled back.", "migration_0015_not_stretch": "The current Debian distribution is not Stretch!",
"migration_0015_patching_sources_list": "Patching the sources.lists...",
"migration_0015_problematic_apps_warning": "Please note that the following possibly problematic installed apps were detected. It looks like those were not installed from the YunoHost app catalog, or are not flagged as 'working'. Consequently, it cannot be guaranteed that they will still work after the upgrade: {problematic_apps}",
"migration_0015_specific_upgrade": "Starting upgrade of system packages that needs to be upgrade independently...",
"migration_0015_start": "Starting migration to Buster",
"migration_0015_still_on_stretch_after_main_upgrade": "Something went wrong during the main upgrade, the system appears to still be on Debian Stretch",
"migration_0015_system_not_fully_up_to_date": "Your system is not fully up-to-date. Please perform a regular upgrade before running the migration to Buster.",
"migration_0015_weak_certs": "The following certificates were found to still use weak signature algorithms and have to be upgraded to be compatible with the next version of nginx: {certs}",
"migration_0015_yunohost_upgrade": "Starting YunoHost core upgrade...",
"migration_0017_not_enough_space": "Make sufficient space available in {path} to run the migration.",
"migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 is installed, but not postgresql 11‽ Something weird might have happened on your system :(...",
"migration_0017_postgresql_96_not_installed": "PostgreSQL was not installed on your system. Nothing to do.",
"migration_0018_failed_to_migrate_iptables_rules": "Failed to migrate legacy iptables rules to nftables: {error}",
"migration_0018_failed_to_reset_legacy_rules": "Failed to reset legacy iptables rules: {error}",
"migration_0019_add_new_attributes_in_ldap": "Add new attributes for permissions in LDAP database",
"migration_0019_slapd_config_will_be_overwritten": "It looks like you manually edited the slapd configuration. For this critical migration, YunoHost needs to force the update of the slapd configuration. The original files will be backuped in {conf_backup_folder}.",
"migration_0021_start" : "Starting migration to Bullseye", "migration_0021_start" : "Starting migration to Bullseye",
"migration_0021_patching_sources_list": "Patching the sources.lists...", "migration_0021_patching_sources_list": "Patching the sources.lists...",
"migration_0021_main_upgrade": "Starting main upgrade...", "migration_0021_main_upgrade": "Starting main upgrade...",
@ -459,11 +479,25 @@
"migration_0023_postgresql_11_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", "migration_0023_postgresql_11_not_installed": "PostgreSQL was not installed on your system. Nothing to do.",
"migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not postgresql 13!? Something weird might have happened on your system :(...", "migration_0023_postgresql_13_not_installed": "PostgreSQL 11 is installed, but not postgresql 13!? Something weird might have happened on your system :(...",
"migration_0023_not_enough_space": "Make sufficient space available in {path} to run the migration.", "migration_0023_not_enough_space": "Make sufficient space available in {path} to run the migration.",
"migration_description_0015_migrate_to_buster": "Upgrade the system to Debian Buster and YunoHost 4.x",
"migration_description_0016_php70_to_php73_pools": "Migrate php7.0-fpm 'pool' conf files to php7.3",
"migration_description_0017_postgresql_9p6_to_11": "Migrate databases from PostgreSQL 9.6 to 11",
"migration_description_0018_xtable_to_nftable": "Migrate old network traffic rules to the new nftable system",
"migration_description_0019_extend_permissions_features": "Extend/rework the app permission management system",
"migration_description_0020_ssh_sftp_permissions": "Add SSH and SFTP permissions support",
"migration_description_0021_migrate_to_bullseye": "Upgrade the system to Debian Bullseye and YunoHost 11.x",
"migration_description_0022_php73_to_php74_pools": "Migrate php7.3-fpm 'pool' conf files to php7.4",
"migration_description_0023_postgresql_11_to_13": "Migrate databases from PostgreSQL 11 to 13",
"migration_ldap_backup_before_migration": "Creating a backup of LDAP database and apps settings prior to the actual migration.",
"migration_ldap_can_not_backup_before_migration": "The backup of the system could not be completed before the migration failed. Error: {error}",
"migration_ldap_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.",
"migration_ldap_rollback_success": "System rolled back.",
"migration_update_LDAP_schema": "Updating LDAP schema...",
"migrations_already_ran": "Those migrations are already done: {ids}", "migrations_already_ran": "Those migrations are already done: {ids}",
"migrations_cant_reach_migration_file": "Could not access migrations files at the path '%s'", "migrations_cant_reach_migration_file": "Could not access migrations files at the path '%s'",
"migrations_dependencies_not_satisfied": "Run these migrations: '{dependencies_id}', before migration {id}.", "migrations_dependencies_not_satisfied": "Run these migrations: '{dependencies_id}', before migration {id}.",
"migrations_failed_to_load_migration": "Could not load migration {id}: {error}",
"migrations_exclusive_options": "'--auto', '--skip', and '--force-rerun' are mutually exclusive options.", "migrations_exclusive_options": "'--auto', '--skip', and '--force-rerun' are mutually exclusive options.",
"migrations_failed_to_load_migration": "Could not load migration {id}: {error}",
"migrations_list_conflict_pending_done": "You cannot use both '--previous' and '--done' at the same time.", "migrations_list_conflict_pending_done": "You cannot use both '--previous' and '--done' at the same time.",
"migrations_loading_migration": "Loading migration {id}...", "migrations_loading_migration": "Loading migration {id}...",
"migrations_migration_has_failed": "Migration {id} did not complete, aborting. Error: {exception}", "migrations_migration_has_failed": "Migration {id} did not complete, aborting. Error: {exception}",
@ -478,8 +512,6 @@
"migrations_success_forward": "Migration {id} completed", "migrations_success_forward": "Migration {id} completed",
"migrations_to_be_ran_manually": "Migration {id} has to be run manually. Please go to Tools → Migrations on the webadmin page, or run `yunohost tools migrations run`.", "migrations_to_be_ran_manually": "Migration {id} has to be run manually. Please go to Tools → Migrations on the webadmin page, or run `yunohost tools migrations run`.",
"not_enough_disk_space": "Not enough free space on '{path}'", "not_enough_disk_space": "Not enough free space on '{path}'",
"invalid_number": "Must be a number",
"invalid_password": "Invalid password",
"operation_interrupted": "The operation was manually interrupted?", "operation_interrupted": "The operation was manually interrupted?",
"packages_upgrade_failed": "Could not upgrade all the packages", "packages_upgrade_failed": "Could not upgrade all the packages",
"password_listed": "This password is among the most used passwords in the world. Please choose something more unique.", "password_listed": "This password is among the most used passwords in the world. Please choose something more unique.",
@ -489,35 +521,37 @@
"password_too_simple_4": "The password needs to be at least 12 characters long and contain a digit, upper, lower and special characters", "password_too_simple_4": "The password needs to be at least 12 characters long and contain a digit, upper, lower and special characters",
"pattern_backup_archive_name": "Must be a valid filename with max 30 characters, alphanumeric and -_. characters only", "pattern_backup_archive_name": "Must be a valid filename with max 30 characters, alphanumeric and -_. characters only",
"pattern_domain": "Must be a valid domain name (e.g. my-domain.org)", "pattern_domain": "Must be a valid domain name (e.g. my-domain.org)",
"pattern_email_forward": "Must be a valid e-mail address, '+' symbol accepted (e.g. someone+tag@example.com)",
"pattern_email": "Must be a valid e-mail address, without '+' symbol (e.g. someone@example.com)", "pattern_email": "Must be a valid e-mail address, without '+' symbol (e.g. someone@example.com)",
"pattern_email_forward": "Must be a valid e-mail address, '+' symbol accepted (e.g. someone+tag@example.com)",
"pattern_firstname": "Must be a valid first name", "pattern_firstname": "Must be a valid first name",
"pattern_lastname": "Must be a valid last name", "pattern_lastname": "Must be a valid last name",
"pattern_mailbox_quota": "Must be a size with b/k/M/G/T suffix or 0 to not have a quota", "pattern_mailbox_quota": "Must be a size with b/k/M/G/T suffix or 0 to not have a quota",
"pattern_password": "Must be at least 3 characters long", "pattern_password": "Must be at least 3 characters long",
"pattern_password_app": "Sorry, passwords can not contain the following characters: {forbidden_chars}",
"pattern_port_or_range": "Must be a valid port number (i.e. 0-65535) or range of ports (e.g. 100:200)", "pattern_port_or_range": "Must be a valid port number (i.e. 0-65535) or range of ports (e.g. 100:200)",
"pattern_positive_number": "Must be a positive number", "pattern_positive_number": "Must be a positive number",
"pattern_username": "Must be lower-case alphanumeric and underscore characters only", "pattern_username": "Must be lower-case alphanumeric and underscore characters only",
"pattern_password_app": "Sorry, passwords can not contain the following characters: {forbidden_chars}",
"permission_already_allowed": "Group '{group}' already has permission '{permission}' enabled", "permission_already_allowed": "Group '{group}' already has permission '{permission}' enabled",
"permission_already_disallowed": "Group '{group}' already has permission '{permission}' disabled", "permission_already_disallowed": "Group '{group}' already has permission '{permission}' disabled",
"permission_already_exist": "Permission '{permission}' already exists", "permission_already_exist": "Permission '{permission}' already exists",
"permission_already_up_to_date": "The permission was not updated because the addition/removal requests already match the current state.", "permission_already_up_to_date": "The permission was not updated because the addition/removal requests already match the current state.",
"permission_cannot_remove_main": "Removing a main permission is not allowed", "permission_cannot_remove_main": "Removing a main permission is not allowed",
"permission_cant_add_to_all_users": "The permission {permission} can not be added to all users.",
"permission_created": "Permission '{permission}' created", "permission_created": "Permission '{permission}' created",
"permission_creation_failed": "Could not create permission '{permission}': {error}", "permission_creation_failed": "Could not create permission '{permission}': {error}",
"permission_currently_allowed_for_all_users": "This permission is currently granted to all users in addition to other groups. You probably want to either remove the 'all_users' permission or remove the other groups it is currently granted to.", "permission_currently_allowed_for_all_users": "This permission is currently granted to all users in addition to other groups. You probably want to either remove the 'all_users' permission or remove the other groups it is currently granted to.",
"permission_cant_add_to_all_users": "The permission {permission} can not be added to all users.",
"permission_deleted": "Permission '{permission}' deleted", "permission_deleted": "Permission '{permission}' deleted",
"permission_deletion_failed": "Could not delete permission '{permission}': {error}", "permission_deletion_failed": "Could not delete permission '{permission}': {error}",
"permission_not_found": "Permission '{permission}' not found", "permission_not_found": "Permission '{permission}' not found",
"permission_update_failed": "Could not update permission '{permission}': {error}",
"permission_updated": "Permission '{permission}' updated",
"permission_protected": "Permission {permission} is protected. You cannot add or remove the visitors group to/from this permission.", "permission_protected": "Permission {permission} is protected. You cannot add or remove the visitors group to/from this permission.",
"permission_require_account": "Permission {permission} only makes sense for users having an account, and therefore cannot be enabled for visitors.", "permission_require_account": "Permission {permission} only makes sense for users having an account, and therefore cannot be enabled for visitors.",
"port_already_closed": "Port {port:d} is already closed for {ip_version} connections", "permission_update_failed": "Could not update permission '{permission}': {error}",
"port_already_opened": "Port {port:d} is already opened for {ip_version} connections", "permission_updated": "Permission '{permission}' updated",
"port_already_closed": "Port {port} is already closed for {ip_version} connections",
"port_already_opened": "Port {port} is already opened for {ip_version} connections",
"postinstall_low_rootfsspace": "The root filesystem has a total space less than 10 GB, which is quite worrisome! You will likely run out of disk space very quickly! It's recommended to have at least 16GB for the root filesystem. If you want to install YunoHost despite this warning, re-run the postinstall with --force-diskspace", "postinstall_low_rootfsspace": "The root filesystem has a total space less than 10 GB, which is quite worrisome! You will likely run out of disk space very quickly! It's recommended to have at least 16GB for the root filesystem. If you want to install YunoHost despite this warning, re-run the postinstall with --force-diskspace",
"regenconf_dry_pending_applying": "Checking pending configuration which would have been applied for category '{category}'...",
"regenconf_failed": "Could not regenerate the configuration for category(s): {categories}",
"regenconf_file_backed_up": "Configuration file '{conf}' backed up to '{backup}'", "regenconf_file_backed_up": "Configuration file '{conf}' backed up to '{backup}'",
"regenconf_file_copy_failed": "Could not copy the new configuration file '{new}' to '{conf}'", "regenconf_file_copy_failed": "Could not copy the new configuration file '{new}' to '{conf}'",
"regenconf_file_kept_back": "The configuration file '{conf}' is expected to be deleted by regen-conf (category {category}) but was kept back.", "regenconf_file_kept_back": "The configuration file '{conf}' is expected to be deleted by regen-conf (category {category}) but was kept back.",
@ -526,14 +560,12 @@
"regenconf_file_remove_failed": "Could not remove the configuration file '{conf}'", "regenconf_file_remove_failed": "Could not remove the configuration file '{conf}'",
"regenconf_file_removed": "Configuration file '{conf}' removed", "regenconf_file_removed": "Configuration file '{conf}' removed",
"regenconf_file_updated": "Configuration file '{conf}' updated", "regenconf_file_updated": "Configuration file '{conf}' updated",
"regenconf_need_to_explicitly_specify_ssh": "The ssh configuration has been manually modified, but you need to explicitly specify category 'ssh' with --force to actually apply the changes.",
"regenconf_now_managed_by_yunohost": "The configuration file '{conf}' is now managed by YunoHost (category {category}).", "regenconf_now_managed_by_yunohost": "The configuration file '{conf}' is now managed by YunoHost (category {category}).",
"regenconf_pending_applying": "Applying pending configuration for category '{category}'...",
"regenconf_up_to_date": "The configuration is already up-to-date for category '{category}'", "regenconf_up_to_date": "The configuration is already up-to-date for category '{category}'",
"regenconf_updated": "Configuration updated for '{category}'", "regenconf_updated": "Configuration updated for '{category}'",
"regenconf_would_be_updated": "The configuration would have been updated for category '{category}'", "regenconf_would_be_updated": "The configuration would have been updated for category '{category}'",
"regenconf_dry_pending_applying": "Checking pending configuration which would have been applied for category '{category}'…",
"regenconf_failed": "Could not regenerate the configuration for category(s): {categories}",
"regenconf_pending_applying": "Applying pending configuration for category '{category}'...",
"regenconf_need_to_explicitly_specify_ssh": "The ssh configuration has been manually modified, but you need to explicitly specify category 'ssh' with --force to actually apply the changes.",
"regex_incompatible_with_tile": "/!\\ Packagers! Permission '{permission}' has show_tile set to 'true' and you therefore cannot define a regex URL as the main URL", "regex_incompatible_with_tile": "/!\\ Packagers! Permission '{permission}' has show_tile set to 'true' and you therefore cannot define a regex URL as the main URL",
"regex_with_only_domain": "You can't use a regex for domain, only for path", "regex_with_only_domain": "You can't use a regex for domain, only for path",
"restore_already_installed_app": "An app with the ID '{app}' is already installed", "restore_already_installed_app": "An app with the ID '{app}' is already installed",
@ -542,28 +574,27 @@
"restore_cleaning_failed": "Could not clean up the temporary restoration directory", "restore_cleaning_failed": "Could not clean up the temporary restoration directory",
"restore_complete": "Restoration completed", "restore_complete": "Restoration completed",
"restore_confirm_yunohost_installed": "Do you really want to restore an already installed system? [{answers}]", "restore_confirm_yunohost_installed": "Do you really want to restore an already installed system? [{answers}]",
"restore_extracting": "Extracting needed files from the archive", "restore_extracting": "Extracting needed files from the archive...",
"restore_failed": "Could not restore system", "restore_failed": "Could not restore system",
"restore_hook_unavailable": "Restoration script for '{part}' not available on your system and not in the archive either", "restore_hook_unavailable": "Restoration script for '{part}' not available on your system and not in the archive either",
"restore_may_be_not_enough_disk_space": "Your system does not seem to have enough space (free: {free_space:d} B, needed space: {needed_space:d} B, security margin: {margin:d} B)", "restore_may_be_not_enough_disk_space": "Your system does not seem to have enough space (free: {free_space} B, needed space: {needed_space} B, security margin: {margin} B)",
"restore_not_enough_disk_space": "Not enough space (space: {free_space:d} B, needed space: {needed_space:d} B, security margin: {margin:d} B)", "restore_not_enough_disk_space": "Not enough space (space: {free_space} B, needed space: {needed_space} B, security margin: {margin} B)",
"restore_nothings_done": "Nothing was restored", "restore_nothings_done": "Nothing was restored",
"restore_removing_tmp_dir_failed": "Could not remove an old temporary directory", "restore_removing_tmp_dir_failed": "Could not remove an old temporary directory",
"restore_running_app_script": "Restoring the app '{app}'", "restore_running_app_script": "Restoring the app '{app}'...",
"restore_running_hooks": "Running restoration hooks", "restore_running_hooks": "Running restoration hooks...",
"restore_system_part_failed": "Could not restore the '{part}' system part", "restore_system_part_failed": "Could not restore the '{part}' system part",
"root_password_desynchronized": "The admin password was changed, but YunoHost could not propagate this to the root password!", "root_password_desynchronized": "The admin password was changed, but YunoHost could not propagate this to the root password!",
"root_password_replaced_by_admin_password": "Your root password have been replaced by your admin password.", "root_password_replaced_by_admin_password": "Your root password have been replaced by your admin password.",
"server_shutdown": "The server will shut down",
"server_shutdown_confirm": "The server will shutdown immediatly, are you sure? [{answers}]",
"server_reboot": "The server will reboot", "server_reboot": "The server will reboot",
"server_reboot_confirm": "The server will reboot immediatly, are you sure? [{answers}]", "server_reboot_confirm": "The server will reboot immediatly, are you sure? [{answers}]",
"server_shutdown": "The server will shut down",
"server_shutdown_confirm": "The server will shutdown immediatly, are you sure? [{answers}]",
"service_add_failed": "Could not add the service '{service}'", "service_add_failed": "Could not add the service '{service}'",
"service_added": "The service '{service}' was added", "service_added": "The service '{service}' was added",
"service_already_started": "The service '{service}' is running already", "service_already_started": "The service '{service}' is running already",
"service_already_stopped": "The service '{service}' has already been stopped", "service_already_stopped": "The service '{service}' has already been stopped",
"service_cmd_exec_failed": "Could not execute the command '{command}'", "service_cmd_exec_failed": "Could not execute the command '{command}'",
"service_description_yunomdns": "Allows you to reach your server using 'yunohost.local' in your local network",
"service_description_dnsmasq": "Handles domain name resolution (DNS)", "service_description_dnsmasq": "Handles domain name resolution (DNS)",
"service_description_dovecot": "Allows e-mail clients to access/fetch email (via IMAP and POP3)", "service_description_dovecot": "Allows e-mail clients to access/fetch email (via IMAP and POP3)",
"service_description_fail2ban": "Protects against brute-force and other kinds of attacks from the Internet", "service_description_fail2ban": "Protects against brute-force and other kinds of attacks from the Internet",
@ -578,37 +609,39 @@
"service_description_ssh": "Allows you to connect remotely to your server via a terminal (SSH protocol)", "service_description_ssh": "Allows you to connect remotely to your server via a terminal (SSH protocol)",
"service_description_yunohost-api": "Manages interactions between the YunoHost web interface and the system", "service_description_yunohost-api": "Manages interactions between the YunoHost web interface and the system",
"service_description_yunohost-firewall": "Manages open and close connection ports to services", "service_description_yunohost-firewall": "Manages open and close connection ports to services",
"service_description_yunomdns": "Allows you to reach your server using 'yunohost.local' in your local network",
"service_disable_failed": "Could not make the service '{service}' not start at boot.\n\nRecent service logs:{logs}", "service_disable_failed": "Could not make the service '{service}' not start at boot.\n\nRecent service logs:{logs}",
"service_disabled": "The service '{service}' will not be started anymore when system boots.", "service_disabled": "The service '{service}' will not be started anymore when system boots.",
"service_enable_failed": "Could not make the service '{service}' automatically start at boot.\n\nRecent service logs:{logs}", "service_enable_failed": "Could not make the service '{service}' automatically start at boot.\n\nRecent service logs:{logs}",
"service_enabled": "The service '{service}' will now be automatically started during system boots.", "service_enabled": "The service '{service}' will now be automatically started during system boots.",
"service_regen_conf_is_deprecated": "'yunohost service regen-conf' is deprecated! Please use 'yunohost tools regen-conf' instead.",
"service_reload_failed": "Could not reload the service '{service}'\n\nRecent service logs:{logs}",
"service_reload_or_restart_failed": "Could not reload or restart the service '{service}'\n\nRecent service logs:{logs}",
"service_reloaded": "Service '{service}' reloaded",
"service_reloaded_or_restarted": "The service '{service}' was reloaded or restarted",
"service_remove_failed": "Could not remove the service '{service}'", "service_remove_failed": "Could not remove the service '{service}'",
"service_removed": "Service '{service}' removed", "service_removed": "Service '{service}' removed",
"service_reload_failed": "Could not reload the service '{service}'\n\nRecent service logs:{logs}",
"service_reloaded": "Service '{service}' reloaded",
"service_restart_failed": "Could not restart the service '{service}'\n\nRecent service logs:{logs}", "service_restart_failed": "Could not restart the service '{service}'\n\nRecent service logs:{logs}",
"service_restarted": "Service '{service}' restarted", "service_restarted": "Service '{service}' restarted",
"service_reload_or_restart_failed": "Could not reload or restart the service '{service}'\n\nRecent service logs:{logs}",
"service_reloaded_or_restarted": "The service '{service}' was reloaded or restarted",
"service_start_failed": "Could not start the service '{service}'\n\nRecent service logs:{logs}", "service_start_failed": "Could not start the service '{service}'\n\nRecent service logs:{logs}",
"service_started": "Service '{service}' started", "service_started": "Service '{service}' started",
"service_stop_failed": "Unable to stop the service '{service}'\n\nRecent service logs:{logs}", "service_stop_failed": "Unable to stop the service '{service}'\n\nRecent service logs:{logs}",
"service_stopped": "Service '{service}' stopped", "service_stopped": "Service '{service}' stopped",
"service_unknown": "Unknown service '{service}'", "service_unknown": "Unknown service '{service}'",
"show_tile_cant_be_enabled_for_url_not_defined": "You cannot enable 'show_tile' right now, because you must first define an URL for the permission '{permission}'",
"show_tile_cant_be_enabled_for_regex": "You cannot enable 'show_tile' right no, because the URL for the permission '{permission}' is a regex", "show_tile_cant_be_enabled_for_regex": "You cannot enable 'show_tile' right no, because the URL for the permission '{permission}' is a regex",
"show_tile_cant_be_enabled_for_url_not_defined": "You cannot enable 'show_tile' right now, because you must first define an URL for the permission '{permission}'",
"ssowat_conf_generated": "SSOwat configuration regenerated", "ssowat_conf_generated": "SSOwat configuration regenerated",
"ssowat_conf_updated": "SSOwat configuration updated", "ssowat_conf_updated": "SSOwat configuration updated",
"system_upgraded": "System upgraded", "system_upgraded": "System upgraded",
"system_username_exists": "Username already exists in the list of system users", "system_username_exists": "Username already exists in the list of system users",
"this_action_broke_dpkg": "This action broke dpkg/APT (the system package managers)... You can try to solve this issue by connecting through SSH and running `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a`.", "this_action_broke_dpkg": "This action broke dpkg/APT (the system package managers)... You can try to solve this issue by connecting through SSH and running `sudo apt install --fix-broken` and/or `sudo dpkg --configure -a`.",
"tools_upgrade_cant_hold_critical_packages": "Could not hold critical packages", "tools_upgrade_cant_hold_critical_packages": "Could not hold critical packages...",
"tools_upgrade_cant_unhold_critical_packages": "Could not unhold critical packages", "tools_upgrade_cant_unhold_critical_packages": "Could not unhold critical packages...",
"tools_upgrade_regular_packages": "Now upgrading 'regular' (non-yunohost-related) packages", "tools_upgrade_regular_packages": "Now upgrading 'regular' (non-yunohost-related) packages...",
"tools_upgrade_regular_packages_failed": "Could not upgrade packages: {packages_list}", "tools_upgrade_regular_packages_failed": "Could not upgrade packages: {packages_list}",
"tools_upgrade_special_packages": "Now upgrading 'special' (yunohost-related) packages…", "tools_upgrade_special_packages": "Now upgrading 'special' (yunohost-related) packages...",
"tools_upgrade_special_packages_explanation": "The special upgrade will continue in the background. Please don't start any other actions on your server for the next ~10 minutes (depending on hardware speed). After this, you may have to re-log in to the webadmin. The upgrade log will be available in Tools → Log (in the webadmin) or using 'yunohost log list' (from the command-line).",
"tools_upgrade_special_packages_completed": "YunoHost package upgrade completed.\nPress [Enter] to get the command line back", "tools_upgrade_special_packages_completed": "YunoHost package upgrade completed.\nPress [Enter] to get the command line back",
"tools_upgrade_special_packages_explanation": "The special upgrade will continue in the background. Please don't start any other actions on your server for the next ~10 minutes (depending on hardware speed). After this, you may have to re-log in to the webadmin. The upgrade log will be available in Tools → Log (in the webadmin) or using 'yunohost log list' (from the command-line).",
"unbackup_app": "{app} will not be saved", "unbackup_app": "{app} will not be saved",
"unexpected_error": "Something unexpected went wrong: {error}", "unexpected_error": "Something unexpected went wrong: {error}",
"unknown_main_domain_path": "Unknown domain or path for '{app}'. You need to specify a domain and a path to be able to specify a URL for permission.", "unknown_main_domain_path": "Unknown domain or path for '{app}'. You need to specify a domain and a path to be able to specify a URL for permission.",
@ -628,7 +661,14 @@
"user_creation_failed": "Could not create user {user}: {error}", "user_creation_failed": "Could not create user {user}: {error}",
"user_deleted": "User deleted", "user_deleted": "User deleted",
"user_deletion_failed": "Could not delete user {user}: {error}", "user_deletion_failed": "Could not delete user {user}: {error}",
"user_home_creation_failed": "Could not create 'home' folder for user", "user_home_creation_failed": "Could not create home folder '{home}' for user",
"user_import_bad_file": "Your CSV file is not correctly formatted it will be ignored to avoid potential data loss",
"user_import_bad_line": "Incorrect line {line}: {details}",
"user_import_failed": "The users import operation completely failed",
"user_import_missing_columns": "The following columns are missing: {columns}",
"user_import_nothing_to_do": "No user needs to be imported",
"user_import_partial_failed": "The users import operation partially failed",
"user_import_success": "Users successfully imported",
"user_unknown": "Unknown user: {user}", "user_unknown": "Unknown user: {user}",
"user_update_failed": "Could not update user {user}: {error}", "user_update_failed": "Could not update user {user}: {error}",
"user_updated": "User info changed", "user_updated": "User info changed",

View file

@ -155,7 +155,7 @@
"permission_deleted": "Permesita \"{permission}\" forigita", "permission_deleted": "Permesita \"{permission}\" forigita",
"permission_deletion_failed": "Ne povis forigi permeson '{permission}': {error}", "permission_deletion_failed": "Ne povis forigi permeson '{permission}': {error}",
"permission_not_found": "Permesita \"{permission}\" ne trovita", "permission_not_found": "Permesita \"{permission}\" ne trovita",
"restore_not_enough_disk_space": "Ne sufiĉa spaco (spaco: {free_space:d} B, necesa spaco: {needed_space:d} B, sekureca marĝeno: {margin:d} B)", "restore_not_enough_disk_space": "Ne sufiĉa spaco (spaco: {free_space} B, necesa spaco: {needed_space} B, sekureca marĝeno: {margin} B)",
"tools_upgrade_regular_packages": "Nun ĝisdatigi 'regulajn' (ne-yunohost-rilatajn) pakojn …", "tools_upgrade_regular_packages": "Nun ĝisdatigi 'regulajn' (ne-yunohost-rilatajn) pakojn …",
"tools_upgrade_special_packages_explanation": "La speciala ĝisdatigo daŭros en la fono. Bonvolu ne komenci aliajn agojn en via servilo dum la sekvaj ~ 10 minutoj (depende de la aparata rapideco). Post tio, vi eble devos re-ensaluti al la retadreso. La ĝisdatiga registro estos havebla en Iloj → Ensaluto (en la retadreso) aŭ uzante 'yunohost logliston' (el la komandlinio).", "tools_upgrade_special_packages_explanation": "La speciala ĝisdatigo daŭros en la fono. Bonvolu ne komenci aliajn agojn en via servilo dum la sekvaj ~ 10 minutoj (depende de la aparata rapideco). Post tio, vi eble devos re-ensaluti al la retadreso. La ĝisdatiga registro estos havebla en Iloj → Ensaluto (en la retadreso) aŭ uzante 'yunohost logliston' (el la komandlinio).",
"unrestore_app": "App '{app}' ne restarigos", "unrestore_app": "App '{app}' ne restarigos",
@ -182,7 +182,7 @@
"service_added": "La servo '{service}' estis aldonita", "service_added": "La servo '{service}' estis aldonita",
"upnp_disabled": "UPnP malŝaltis", "upnp_disabled": "UPnP malŝaltis",
"service_started": "Servo '{service}' komenciĝis", "service_started": "Servo '{service}' komenciĝis",
"port_already_opened": "Haveno {port:d} estas jam malfermita por {ip_version} rilatoj", "port_already_opened": "Haveno {port} estas jam malfermita por {ip_version} rilatoj",
"upgrading_packages": "Ĝisdatigi pakojn…", "upgrading_packages": "Ĝisdatigi pakojn…",
"custom_app_url_required": "Vi devas provizi URL por altgradigi vian kutimon app {app}", "custom_app_url_required": "Vi devas provizi URL por altgradigi vian kutimon app {app}",
"service_reload_failed": "Ne povis reŝargi la servon '{service}'\n\nLastatempaj servaj protokoloj: {logs}", "service_reload_failed": "Ne povis reŝargi la servon '{service}'\n\nLastatempaj servaj protokoloj: {logs}",
@ -244,7 +244,7 @@
"upnp_port_open_failed": "Ne povis malfermi havenon per UPnP", "upnp_port_open_failed": "Ne povis malfermi havenon per UPnP",
"log_app_upgrade": "Ĝisdatigu la aplikon '{}'", "log_app_upgrade": "Ĝisdatigu la aplikon '{}'",
"log_help_to_get_failed_log": "La operacio '{desc}' ne povis finiĝi. Bonvolu dividi la plenan ŝtipon de ĉi tiu operacio per la komando 'yunohost log share {name}' por akiri helpon", "log_help_to_get_failed_log": "La operacio '{desc}' ne povis finiĝi. Bonvolu dividi la plenan ŝtipon de ĉi tiu operacio per la komando 'yunohost log share {name}' por akiri helpon",
"port_already_closed": "Haveno {port:d} estas jam fermita por {ip_version} rilatoj", "port_already_closed": "Haveno {port} estas jam fermita por {ip_version} rilatoj",
"hook_name_unknown": "Nekonata hoko-nomo '{name}'", "hook_name_unknown": "Nekonata hoko-nomo '{name}'",
"dyndns_could_not_check_provide": "Ne povis kontroli ĉu {provider} povas provizi {domain}.", "dyndns_could_not_check_provide": "Ne povis kontroli ĉu {provider} povas provizi {domain}.",
"restore_nothings_done": "Nenio estis restarigita", "restore_nothings_done": "Nenio estis restarigita",
@ -254,7 +254,7 @@
"root_password_replaced_by_admin_password": "Via radika pasvorto estis anstataŭigita per via administra pasvorto.", "root_password_replaced_by_admin_password": "Via radika pasvorto estis anstataŭigita per via administra pasvorto.",
"domain_unknown": "Nekonata domajno", "domain_unknown": "Nekonata domajno",
"global_settings_setting_security_password_user_strength": "Uzanto pasvorta forto", "global_settings_setting_security_password_user_strength": "Uzanto pasvorta forto",
"restore_may_be_not_enough_disk_space": "Via sistemo ne ŝajnas havi sufiĉe da spaco (libera: {free_space:d} B, necesa spaco: {needed_space:d} B, sekureca marĝeno: {margin:d} B)", "restore_may_be_not_enough_disk_space": "Via sistemo ne ŝajnas havi sufiĉe da spaco (libera: {free_space} B, necesa spaco: {needed_space} B, sekureca marĝeno: {margin} B)",
"log_corrupted_md_file": "La YAD-metadata dosiero asociita kun protokoloj estas damaĝita: '{md_file}\nEraro: {error} '", "log_corrupted_md_file": "La YAD-metadata dosiero asociita kun protokoloj estas damaĝita: '{md_file}\nEraro: {error} '",
"downloading": "Elŝutante …", "downloading": "Elŝutante …",
"user_deleted": "Uzanto forigita", "user_deleted": "Uzanto forigita",

View file

@ -93,8 +93,8 @@
"pattern_port_or_range": "Debe ser un número de puerto válido (es decir entre 0-65535) o un intervalo de puertos (por ejemplo 100:200)", "pattern_port_or_range": "Debe ser un número de puerto válido (es decir entre 0-65535) o un intervalo de puertos (por ejemplo 100:200)",
"pattern_positive_number": "Deber ser un número positivo", "pattern_positive_number": "Deber ser un número positivo",
"pattern_username": "Solo puede contener caracteres alfanuméricos o el guión bajo", "pattern_username": "Solo puede contener caracteres alfanuméricos o el guión bajo",
"port_already_closed": "El puerto {port:d} ya está cerrado para las conexiones {ip_version}", "port_already_closed": "El puerto {port} ya está cerrado para las conexiones {ip_version}",
"port_already_opened": "El puerto {port:d} ya está abierto para las conexiones {ip_version}", "port_already_opened": "El puerto {port} ya está abierto para las conexiones {ip_version}",
"restore_already_installed_app": "Una aplicación con el ID «{app}» ya está instalada", "restore_already_installed_app": "Una aplicación con el ID «{app}» ya está instalada",
"app_restore_failed": "No se pudo restaurar la aplicación «{app}»: {error}", "app_restore_failed": "No se pudo restaurar la aplicación «{app}»: {error}",
"restore_cleaning_failed": "No se pudo limpiar el directorio temporal de restauración", "restore_cleaning_failed": "No se pudo limpiar el directorio temporal de restauración",
@ -246,8 +246,8 @@
"root_password_desynchronized": "La contraseña de administración ha sido cambiada pero ¡YunoHost no pudo propagar esto a la contraseña de root!", "root_password_desynchronized": "La contraseña de administración ha sido cambiada pero ¡YunoHost no pudo propagar esto a la contraseña de root!",
"restore_system_part_failed": "No se pudo restaurar la parte del sistema «{part}»", "restore_system_part_failed": "No se pudo restaurar la parte del sistema «{part}»",
"restore_removing_tmp_dir_failed": "No se pudo eliminar un directorio temporal antiguo", "restore_removing_tmp_dir_failed": "No se pudo eliminar un directorio temporal antiguo",
"restore_not_enough_disk_space": "Espacio insuficiente (espacio: {free_space:d} B, espacio necesario: {needed_space:d} B, margen de seguridad: {margin:d} B)", "restore_not_enough_disk_space": "Espacio insuficiente (espacio: {free_space} B, espacio necesario: {needed_space} B, margen de seguridad: {margin} B)",
"restore_may_be_not_enough_disk_space": "Parece que su sistema no tiene suficiente espacio libre (libre: {free_space:d} B, espacio necesario: {needed_space:d} B, margen de seguridad: {margin:d} B)", "restore_may_be_not_enough_disk_space": "Parece que su sistema no tiene suficiente espacio libre (libre: {free_space} B, espacio necesario: {needed_space} B, margen de seguridad: {margin} B)",
"restore_extracting": "Extrayendo los archivos necesarios para el archivo…", "restore_extracting": "Extrayendo los archivos necesarios para el archivo…",
"regenconf_pending_applying": "Aplicando la configuración pendiente para la categoría «{category}»…", "regenconf_pending_applying": "Aplicando la configuración pendiente para la categoría «{category}»…",
"regenconf_failed": "No se pudo regenerar la configuración para la(s) categoría(s): {categories}", "regenconf_failed": "No se pudo regenerar la configuración para la(s) categoría(s): {categories}",

View file

@ -601,8 +601,8 @@
"restore_running_app_script": "ترمیم و بازیابی برنامه '{app}'…", "restore_running_app_script": "ترمیم و بازیابی برنامه '{app}'…",
"restore_removing_tmp_dir_failed": "پوشه موقت قدیمی حذف نشد", "restore_removing_tmp_dir_failed": "پوشه موقت قدیمی حذف نشد",
"restore_nothings_done": "هیچ چیز ترمیم و بازسازی نشد", "restore_nothings_done": "هیچ چیز ترمیم و بازسازی نشد",
"restore_not_enough_disk_space": "فضای کافی موجود نیست (فضا: {free_space:d} B ، فضای مورد نیاز: {needed_space:d} B ، حاشیه امنیتی: {margin:d} B)", "restore_not_enough_disk_space": "فضای کافی موجود نیست (فضا: {free_space} B ، فضای مورد نیاز: {needed_space} B ، حاشیه امنیتی: {margin} B)",
"restore_may_be_not_enough_disk_space": "به نظر می رسد سیستم شما فضای کافی ندارد (فضای آزاد: {free_space:d} B ، فضای مورد نیاز: {needed_space:d} B ، حاشیه امنیتی: {margin:d} B)", "restore_may_be_not_enough_disk_space": "به نظر می رسد سیستم شما فضای کافی ندارد (فضای آزاد: {free_space} B ، فضای مورد نیاز: {needed_space} B ، حاشیه امنیتی: {margin} B)",
"restore_hook_unavailable": "اسکریپت ترمیم و بازسازی برای '{part}' در سیستم شما در دسترس نیست و همچنین در بایگانی نیز وجود ندارد", "restore_hook_unavailable": "اسکریپت ترمیم و بازسازی برای '{part}' در سیستم شما در دسترس نیست و همچنین در بایگانی نیز وجود ندارد",
"restore_failed": "سیستم بازیابی نشد", "restore_failed": "سیستم بازیابی نشد",
"restore_extracting": "استخراج فایل های مورد نیاز از بایگانی…", "restore_extracting": "استخراج فایل های مورد نیاز از بایگانی…",
@ -631,8 +631,8 @@
"regenconf_file_copy_failed": "فایل پیکربندی جدید '{new}' در '{conf}' کپی نشد", "regenconf_file_copy_failed": "فایل پیکربندی جدید '{new}' در '{conf}' کپی نشد",
"regenconf_file_backed_up": "فایل پیکربندی '{conf}' در '{backup}' پشتیبان گیری شد", "regenconf_file_backed_up": "فایل پیکربندی '{conf}' در '{backup}' پشتیبان گیری شد",
"postinstall_low_rootfsspace": "فضای فایل سیستم اصلی کمتر از 10 گیگابایت است که بسیار نگران کننده است! به احتمال زیاد خیلی زود فضای دیسک شما تمام می شود! توصیه می شود حداقل 16 گیگابایت برای سیستم فایل ریشه داشته باشید. اگر می خواهید YunoHost را با وجود این هشدار نصب کنید ، فرمان نصب را مجدد با این آپشن --force-diskspace اجرا کنید", "postinstall_low_rootfsspace": "فضای فایل سیستم اصلی کمتر از 10 گیگابایت است که بسیار نگران کننده است! به احتمال زیاد خیلی زود فضای دیسک شما تمام می شود! توصیه می شود حداقل 16 گیگابایت برای سیستم فایل ریشه داشته باشید. اگر می خواهید YunoHost را با وجود این هشدار نصب کنید ، فرمان نصب را مجدد با این آپشن --force-diskspace اجرا کنید",
"port_already_opened": "پورت {port:d} قبلاً برای اتصالات {ip_version} باز شده است", "port_already_opened": "پورت {port} قبلاً برای اتصالات {ip_version} باز شده است",
"port_already_closed": "پورت {port:d} قبلاً برای اتصالات {ip_version} بسته شده است", "port_already_closed": "پورت {port} قبلاً برای اتصالات {ip_version} بسته شده است",
"permission_require_account": "مجوز {permission} فقط برای کاربران دارای حساب کاربری منطقی است و بنابراین نمی تواند برای بازدیدکنندگان فعال شود.", "permission_require_account": "مجوز {permission} فقط برای کاربران دارای حساب کاربری منطقی است و بنابراین نمی تواند برای بازدیدکنندگان فعال شود.",
"permission_protected": "مجوز {permission} محافظت می شود. شما نمی توانید گروه بازدیدکنندگان را از/به این مجوز اضافه یا حذف کنید.", "permission_protected": "مجوز {permission} محافظت می شود. شما نمی توانید گروه بازدیدکنندگان را از/به این مجوز اضافه یا حذف کنید.",
"permission_updated": "مجوز '{permission}' به روز شد", "permission_updated": "مجوز '{permission}' به روز شد",

View file

@ -1,46 +1,46 @@
{ {
"action_invalid": "Action '{action}' incorrecte", "action_invalid": "Action '{action}' incorrecte",
"admin_password": "Mot de passe dadministration", "admin_password": "Mot de passe d'administration",
"admin_password_change_failed": "Impossible de changer le mot de passe", "admin_password_change_failed": "Impossible de changer le mot de passe",
"admin_password_changed": "Le mot de passe dadministration a été modifié", "admin_password_changed": "Le mot de passe d'administration a été modifié",
"app_already_installed": "{app} est déjà installé", "app_already_installed": "{app} est déjà installé",
"app_argument_choice_invalid": "Choix invalide pour le paramètre '{name}', il doit être lun de {choices}", "app_argument_choice_invalid": "Choix invalide pour le paramètre '{name}', il doit être l'un de {choices}",
"app_argument_invalid": "Valeur invalide pour le paramètre '{name}' : {error}", "app_argument_invalid": "Valeur invalide pour le paramètre '{name}' : {error}",
"app_argument_required": "Le paramètre '{name}' est requis", "app_argument_required": "Le paramètre '{name}' est requis",
"app_extraction_failed": "Impossible dextraire les fichiers dinstallation", "app_extraction_failed": "Impossible d'extraire les fichiers d'installation",
"app_id_invalid": "Identifiant dapplication invalide", "app_id_invalid": "Identifiant d'application invalide",
"app_install_files_invalid": "Fichiers dinstallation incorrects", "app_install_files_invalid": "Fichiers d'installation incorrects",
"app_manifest_invalid": "Manifeste dapplication incorrect : {error}", "app_manifest_invalid": "Manifeste d'application incorrect : {error}",
"app_not_correctly_installed": "{app} semble être mal installé", "app_not_correctly_installed": "{app} semble être mal installé",
"app_not_installed": "Nous navons pas trouvé {app} dans la liste des applications installées : {all_apps}", "app_not_installed": "Nous n'avons pas trouvé {app} dans la liste des applications installées : {all_apps}",
"app_not_properly_removed": "{app} na pas été supprimé correctement", "app_not_properly_removed": "{app} n'a pas été supprimé correctement",
"app_removed": "{app} désinstallé", "app_removed": "{app} désinstallé",
"app_requirements_checking": "Vérification des paquets requis pour {app}...", "app_requirements_checking": "Vérification des paquets requis pour {app}...",
"app_requirements_unmeet": "Les pré-requis de {app} ne sont pas satisfaits, le paquet {pkgname} ({version}) doit être {spec}", "app_requirements_unmeet": "Les pré-requis de {app} ne sont pas satisfaits, le paquet {pkgname} ({version}) doit être {spec}",
"app_sources_fetch_failed": "Impossible de récupérer les fichiers sources, lURL est-elle correcte ?", "app_sources_fetch_failed": "Impossible de récupérer les fichiers sources, l'URL est-elle correcte ?",
"app_unknown": "Application inconnue", "app_unknown": "Application inconnue",
"app_unsupported_remote_type": "Ce type de commande à distance utilisé pour cette application nest pas supporté", "app_unsupported_remote_type": "Ce type de commande à distance utilisé pour cette application n'est pas supporté",
"app_upgrade_failed": "Impossible de mettre à jour {app} : {error}", "app_upgrade_failed": "Impossible de mettre à jour {app} : {error}",
"app_upgraded": "{app} mis à jour", "app_upgraded": "{app} mis à jour",
"ask_firstname": "Prénom", "ask_firstname": "Prénom",
"ask_lastname": "Nom", "ask_lastname": "Nom",
"ask_main_domain": "Domaine principal", "ask_main_domain": "Domaine principal",
"ask_new_admin_password": "Nouveau mot de passe dadministration", "ask_new_admin_password": "Nouveau mot de passe d'administration",
"ask_password": "Mot de passe", "ask_password": "Mot de passe",
"backup_app_failed": "Impossible de sauvegarder {app}", "backup_app_failed": "Impossible de sauvegarder {app}",
"backup_archive_app_not_found": "{app} na pas été trouvée dans larchive de la sauvegarde", "backup_archive_app_not_found": "{app} n'a pas été trouvée dans l'archive de la sauvegarde",
"backup_archive_name_exists": "Une archive de sauvegarde avec ce nom existe déjà.", "backup_archive_name_exists": "Une archive de sauvegarde avec ce nom existe déjà.",
"backup_archive_name_unknown": "Larchive locale de sauvegarde nommée '{name}' est inconnue", "backup_archive_name_unknown": "L'archive locale de sauvegarde nommée '{name}' est inconnue",
"backup_archive_open_failed": "Impossible douvrir larchive de la sauvegarde", "backup_archive_open_failed": "Impossible d'ouvrir l'archive de la sauvegarde",
"backup_cleaning_failed": "Impossible de nettoyer le dossier temporaire de sauvegarde", "backup_cleaning_failed": "Impossible de nettoyer le dossier temporaire de sauvegarde",
"backup_created": "Sauvegarde terminée", "backup_created": "Sauvegarde terminée",
"backup_creation_failed": "Impossible de créer larchive de la sauvegarde", "backup_creation_failed": "Impossible de créer l'archive de la sauvegarde",
"backup_delete_error": "Impossible de supprimer '{path}'", "backup_delete_error": "Impossible de supprimer '{path}'",
"backup_deleted": "La sauvegarde a été supprimée", "backup_deleted": "La sauvegarde a été supprimée",
"backup_hook_unknown": "Script de sauvegarde '{hook}' inconnu", "backup_hook_unknown": "Script de sauvegarde '{hook}' inconnu",
"backup_nothings_done": "Il ny a rien à sauvegarder", "backup_nothings_done": "Il n'y a rien à sauvegarder",
"backup_output_directory_forbidden": "Choisissez un répertoire de destination différent. Les sauvegardes ne peuvent pas être créées dans les sous-dossiers /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var ou /home/yunohost.backup/archives", "backup_output_directory_forbidden": "Choisissez un répertoire de destination différent. Les sauvegardes ne peuvent pas être créées dans les sous-dossiers /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var ou /home/yunohost.backup/archives",
"backup_output_directory_not_empty": "Le répertoire de destination nest pas vide", "backup_output_directory_not_empty": "Le répertoire de destination n'est pas vide",
"backup_output_directory_required": "Vous devez spécifier un dossier de destination pour la sauvegarde", "backup_output_directory_required": "Vous devez spécifier un dossier de destination pour la sauvegarde",
"backup_running_hooks": "Exécution des scripts de sauvegarde...", "backup_running_hooks": "Exécution des scripts de sauvegarde...",
"custom_app_url_required": "Vous devez spécifier une URL pour mettre à jour votre application personnalisée {app}", "custom_app_url_required": "Vous devez spécifier une URL pour mettre à jour votre application personnalisée {app}",
@ -57,33 +57,33 @@
"domain_uninstall_app_first": "Ces applications sont toujours installées sur votre domaine :\n{apps}\n\nVeuillez les désinstaller avec la commande 'yunohost app remove nom-de-l-application' ou les déplacer vers un autre domaine avec la commande 'yunohost app change-url nom-de-l-application' avant de procéder à la suppression du domaine", "domain_uninstall_app_first": "Ces applications sont toujours installées sur votre domaine :\n{apps}\n\nVeuillez les désinstaller avec la commande 'yunohost app remove nom-de-l-application' ou les déplacer vers un autre domaine avec la commande 'yunohost app change-url nom-de-l-application' avant de procéder à la suppression du domaine",
"domain_unknown": "Domaine inconnu", "domain_unknown": "Domaine inconnu",
"done": "Terminé", "done": "Terminé",
"downloading": "Téléchargement en cours", "downloading": "Téléchargement en cours...",
"dyndns_ip_update_failed": "Impossible de mettre à jour ladresse IP sur le domaine DynDNS", "dyndns_ip_update_failed": "Impossible de mettre à jour l'adresse IP sur le domaine DynDNS",
"dyndns_ip_updated": "Mise à jour de votre IP pour le domaine DynDNS", "dyndns_ip_updated": "Mise à jour de votre IP pour le domaine DynDNS",
"dyndns_key_generating": "Génération de la clé DNS..., cela peut prendre un certain temps.", "dyndns_key_generating": "Génération de la clé DNS..., cela peut prendre un certain temps.",
"dyndns_key_not_found": "Clé DNS introuvable pour le domaine", "dyndns_key_not_found": "Clé DNS introuvable pour le domaine",
"dyndns_no_domain_registered": "Aucun domaine n'a été enregistré avec DynDNS", "dyndns_no_domain_registered": "Aucun domaine n'a été enregistré avec DynDNS",
"dyndns_registered": "Domaine DynDNS enregistré", "dyndns_registered": "Domaine DynDNS enregistré",
"dyndns_registration_failed": "Impossible denregistrer le domaine DynDNS : {error}", "dyndns_registration_failed": "Impossible d'enregistrer le domaine DynDNS : {error}",
"dyndns_unavailable": "Le domaine {domain} est indisponible.", "dyndns_unavailable": "Le domaine {domain} est indisponible.",
"extracting": "Extraction en cours...", "extracting": "Extraction en cours...",
"field_invalid": "Champ incorrect : '{}'", "field_invalid": "Champ incorrect : '{}'",
"firewall_reload_failed": "Impossible de recharger le pare-feu", "firewall_reload_failed": "Impossible de recharger le pare-feu",
"firewall_reloaded": "Pare-feu rechargé", "firewall_reloaded": "Pare-feu rechargé",
"firewall_rules_cmd_failed": "Certaines commandes de règles de pare-feu ont échoué. Plus d'informations dans le journal.", "firewall_rules_cmd_failed": "Certaines commandes de règles de pare-feu ont échoué. Plus d'informations dans le journal.",
"hook_exec_failed": "Échec de lexécution du script : {path}", "hook_exec_failed": "Échec de l'exécution du script : {path}",
"hook_exec_not_terminated": "Lexécution du script {path} ne sest pas terminée correctement", "hook_exec_not_terminated": "L'exécution du script {path} ne s'est pas terminée correctement",
"hook_list_by_invalid": "Propriété invalide pour lister les actions par celle-ci", "hook_list_by_invalid": "Propriété invalide pour lister les actions par celle-ci",
"hook_name_unknown": "Nom de laction '{name}' inconnu", "hook_name_unknown": "Nom de l'action '{name}' inconnu",
"installation_complete": "Installation terminée", "installation_complete": "Installation terminée",
"ip6tables_unavailable": "Vous ne pouvez pas jouer avec ip6tables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le prend pas en charge", "ip6tables_unavailable": "Vous ne pouvez pas jouer avec ip6tables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le prend pas en charge",
"iptables_unavailable": "Vous ne pouvez pas jouer avec iptables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le prend pas en charge", "iptables_unavailable": "Vous ne pouvez pas jouer avec iptables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le prend pas en charge",
"mail_alias_remove_failed": "Impossible de supprimer lalias de courriel '{mail}'", "mail_alias_remove_failed": "Impossible de supprimer l'alias mail '{mail}'",
"mail_domain_unknown": "Le domaine '{domain}' de cette adresse email nest pas valide. Merci dutiliser un domaine administré par ce serveur.", "mail_domain_unknown": "Le domaine '{domain}' de cette adresse email n'est pas valide. Merci d'utiliser un domaine administré par ce serveur.",
"mail_forward_remove_failed": "Impossible de supprimer l'email de transfert '{mail}'", "mail_forward_remove_failed": "Impossible de supprimer l'email de transfert '{mail}'",
"main_domain_change_failed": "Impossible de modifier le domaine principal", "main_domain_change_failed": "Impossible de modifier le domaine principal",
"main_domain_changed": "Le domaine principal a été modifié", "main_domain_changed": "Le domaine principal a été modifié",
"not_enough_disk_space": "Lespace disque est insuffisant sur '{path}'", "not_enough_disk_space": "L'espace disque est insuffisant sur '{path}'",
"packages_upgrade_failed": "Impossible de mettre à jour tous les paquets", "packages_upgrade_failed": "Impossible de mettre à jour tous les paquets",
"pattern_backup_archive_name": "Doit être un nom de fichier valide avec un maximum de 30 caractères, et composé de caractères alphanumériques et -_. uniquement", "pattern_backup_archive_name": "Doit être un nom de fichier valide avec un maximum de 30 caractères, et composé de caractères alphanumériques et -_. uniquement",
"pattern_domain": "Doit être un nom de domaine valide (ex : mon-domaine.fr)", "pattern_domain": "Doit être un nom de domaine valide (ex : mon-domaine.fr)",
@ -91,42 +91,42 @@
"pattern_firstname": "Doit être un prénom valide", "pattern_firstname": "Doit être un prénom valide",
"pattern_lastname": "Doit être un nom valide", "pattern_lastname": "Doit être un nom valide",
"pattern_mailbox_quota": "Doit avoir une taille suffixée avec b/k/M/G/T ou 0 pour désactiver le quota", "pattern_mailbox_quota": "Doit avoir une taille suffixée avec b/k/M/G/T ou 0 pour désactiver le quota",
"pattern_password": "Doit être composé dau moins 3 caractères", "pattern_password": "Doit être composé d'au moins 3 caractères",
"pattern_port_or_range": "Doit être un numéro de port valide compris entre 0 et 65535, ou une gamme de ports (exemple : 100:200)", "pattern_port_or_range": "Doit être un numéro de port valide compris entre 0 et 65535, ou une gamme de ports (exemple : 100:200)",
"pattern_positive_number": "Doit être un nombre positif", "pattern_positive_number": "Doit être un nombre positif",
"pattern_username": "Doit être composé uniquement de caractères alphanumériques minuscules et de tirets bas (aussi appelé tiret du 8 ou underscore)", "pattern_username": "Doit être composé uniquement de caractères alphanumériques minuscules et de tirets bas (aussi appelé tiret du 8 ou underscore)",
"port_already_closed": "Le port {port:d} est déjà fermé pour les connexions {ip_version}", "port_already_closed": "Le port {port} est déjà fermé pour les connexions {ip_version}",
"port_already_opened": "Le port {port:d} est déjà ouvert pour les connexions {ip_version}", "port_already_opened": "Le port {port} est déjà ouvert pour les connexions {ip_version}",
"restore_already_installed_app": "Une application est déjà installée avec lidentifiant '{app}'", "restore_already_installed_app": "Une application est déjà installée avec l'identifiant '{app}'",
"app_restore_failed": "Impossible de restaurer {app}: {error}", "app_restore_failed": "Impossible de restaurer {app} : {error}",
"restore_cleaning_failed": "Impossible de nettoyer le dossier temporaire de restauration", "restore_cleaning_failed": "Impossible de nettoyer le dossier temporaire de restauration",
"restore_complete": "Restauration terminée", "restore_complete": "Restauration terminée",
"restore_confirm_yunohost_installed": "Voulez-vous vraiment restaurer un système déjà installé ? [{answers}]", "restore_confirm_yunohost_installed": "Voulez-vous vraiment restaurer un système déjà installé ? [{answers}]",
"restore_failed": "Impossible de restaurer le système", "restore_failed": "Impossible de restaurer le système",
"restore_hook_unavailable": "Le script de restauration '{part}' nest pas disponible sur votre système, et ne lest pas non plus dans larchive", "restore_hook_unavailable": "Le script de restauration '{part}' n'est pas disponible sur votre système, et ne l'est pas non plus dans l'archive",
"restore_nothings_done": "Rien na été restauré", "restore_nothings_done": "Rien n'a été restauré",
"restore_running_app_script": "Exécution du script de restauration de lapplication '{app}'…", "restore_running_app_script": "Exécution du script de restauration de l'application '{app}'...",
"restore_running_hooks": "Exécution des scripts de restauration", "restore_running_hooks": "Exécution des scripts de restauration...",
"service_add_failed": "Impossible dajouter le service '{service}'", "service_add_failed": "Impossible d'ajouter le service '{service}'",
"service_added": "Le service '{service}' a été ajouté", "service_added": "Le service '{service}' a été ajouté",
"service_already_started": "Le service '{service}' est déjà en cours dexécution", "service_already_started": "Le service '{service}' est déjà en cours d'exécution",
"service_already_stopped": "Le service '{service}' est déjà arrêté", "service_already_stopped": "Le service '{service}' est déjà arrêté",
"service_cmd_exec_failed": "Impossible dexécuter la commande '{command}'", "service_cmd_exec_failed": "Impossible d'exécuter la commande '{command}'",
"service_disable_failed": "Impossible de ne pas lancer le service « {service} » au démarrage.\n\nJournaux récents du service : {logs}", "service_disable_failed": "Impossible de ne pas lancer le service '{service}' au démarrage.\n\nJournaux récents du service : {logs}",
"service_disabled": "Le service « {service} » ne sera plus lancé au démarrage du système.", "service_disabled": "Le service '{service}' ne sera plus lancé au démarrage du système.",
"service_enable_failed": "Impossible de lancer automatiquement le service « {service} » au démarrage.\n\nJournaux récents du service : {logs}", "service_enable_failed": "Impossible de lancer automatiquement le service '{service}' au démarrage.\n\nJournaux récents du service : {logs}",
"service_enabled": "Le service « {service} » sera désormais lancé automatiquement au démarrage du système.", "service_enabled": "Le service '{service}' sera désormais lancé automatiquement au démarrage du système.",
"service_remove_failed": "Impossible de supprimer le service '{service}'", "service_remove_failed": "Impossible de supprimer le service '{service}'",
"service_removed": "Le service « {service} » a été supprimé", "service_removed": "Le service '{service}' a été supprimé",
"service_start_failed": "Impossible de démarrer le service '{service}'\n\nJournaux historisés récents : {logs}", "service_start_failed": "Impossible de démarrer le service '{service}'\n\nJournaux historisés récents : {logs}",
"service_started": "Le service « {service} » a été démarré", "service_started": "Le service '{service}' a été démarré",
"service_stop_failed": "Impossible darrêter le service '{service}'\n\nJournaux récents de service : {logs}", "service_stop_failed": "Impossible d'arrêter le service '{service}'\n\nJournaux récents de service : {logs}",
"service_stopped": "Le service « {service} » a été arrêté", "service_stopped": "Le service '{service}' a été arrêté",
"service_unknown": "Le service '{service}' est inconnu", "service_unknown": "Le service '{service}' est inconnu",
"ssowat_conf_generated": "La configuration de SSOwat a été regénérée", "ssowat_conf_generated": "La configuration de SSOwat a été regénérée",
"ssowat_conf_updated": "La configuration de SSOwat a été mise à jour", "ssowat_conf_updated": "La configuration de SSOwat a été mise à jour",
"system_upgraded": "Système mis à jour", "system_upgraded": "Système mis à jour",
"system_username_exists": "Ce nom dutilisateur existe déjà dans les utilisateurs système", "system_username_exists": "Ce nom d'utilisateur existe déjà dans les utilisateurs système",
"unbackup_app": "'{app}' ne sera pas sauvegardée", "unbackup_app": "'{app}' ne sera pas sauvegardée",
"unexpected_error": "Une erreur inattendue est survenue : {error}", "unexpected_error": "Une erreur inattendue est survenue : {error}",
"unlimit": "Pas de quota", "unlimit": "Pas de quota",
@ -134,7 +134,7 @@
"updating_apt_cache": "Récupération des mises à jour disponibles pour les paquets du système...", "updating_apt_cache": "Récupération des mises à jour disponibles pour les paquets du système...",
"upgrade_complete": "Mise à jour terminée", "upgrade_complete": "Mise à jour terminée",
"upgrading_packages": "Mise à jour des paquets en cours...", "upgrading_packages": "Mise à jour des paquets en cours...",
"upnp_dev_not_found": "Aucun périphérique compatible UPnP na été trouvé", "upnp_dev_not_found": "Aucun périphérique compatible UPnP n'a été trouvé",
"upnp_disabled": "L'UPnP est désactivé", "upnp_disabled": "L'UPnP est désactivé",
"upnp_enabled": "L'UPnP est activé", "upnp_enabled": "L'UPnP est activé",
"upnp_port_open_failed": "Impossible douvrir les ports UPnP", "upnp_port_open_failed": "Impossible douvrir les ports UPnP",
@ -142,125 +142,125 @@
"user_creation_failed": "Impossible de créer lutilisateur {user} : {error}", "user_creation_failed": "Impossible de créer lutilisateur {user} : {error}",
"user_deleted": "Lutilisateur a été supprimé", "user_deleted": "Lutilisateur a été supprimé",
"user_deletion_failed": "Impossible de supprimer lutilisateur {user} : {error}", "user_deletion_failed": "Impossible de supprimer lutilisateur {user} : {error}",
"user_home_creation_failed": "Impossible de créer le dossier personnel de lutilisateur", "user_home_creation_failed": "Impossible de créer le dossier personnel '{home}' de lutilisateur",
"user_unknown": "Lutilisateur {user} est inconnu", "user_unknown": "Lutilisateur {user} est inconnu",
"user_update_failed": "Impossible de mettre à jour lutilisateur {user} : {error}", "user_update_failed": "Impossible de mettre à jour lutilisateur {user} : {error}",
"user_updated": "Lutilisateur a été modifié", "user_updated": "Lutilisateur a été modifié",
"yunohost_already_installed": "YunoHost est déjà installé", "yunohost_already_installed": "YunoHost est déjà installé",
"yunohost_configured": "YunoHost est maintenant configuré", "yunohost_configured": "YunoHost est maintenant configuré",
"yunohost_installing": "Linstallation de YunoHost est en cours...", "yunohost_installing": "L'installation de YunoHost est en cours...",
"yunohost_not_installed": "YunoHost nest pas correctement installé. Veuillez exécuter 'yunohost tools postinstall'", "yunohost_not_installed": "YunoHost n'est pas correctement installé. Veuillez exécuter 'yunohost tools postinstall'",
"certmanager_attempt_to_replace_valid_cert": "Vous êtes en train de vouloir remplacer un certificat correct et valide pour le domaine {domain} ! (Utilisez --force pour contourner cela)", "certmanager_attempt_to_replace_valid_cert": "Vous êtes en train de vouloir remplacer un certificat correct et valide pour le domaine {domain} ! (Utilisez --force pour contourner cela)",
"certmanager_domain_cert_not_selfsigned": "Le certificat du domaine {domain} nest pas auto-signé. Voulez-vous vraiment le remplacer ? (Utilisez --force pour cela)", "certmanager_domain_cert_not_selfsigned": "Le certificat du domaine {domain} n'est pas auto-signé. Voulez-vous vraiment le remplacer ? (Utilisez --force pour cela)",
"certmanager_certificate_fetching_or_enabling_failed": "Il semble que lactivation du nouveau certificat pour {domain} a échoué...", "certmanager_certificate_fetching_or_enabling_failed": "Il semble que l'activation du nouveau certificat pour {domain} a échoué...",
"certmanager_attempt_to_renew_nonLE_cert": "Le certificat pour le domaine {domain} nest pas émis par Lets Encrypt. Impossible de le renouveler automatiquement !", "certmanager_attempt_to_renew_nonLE_cert": "Le certificat pour le domaine {domain} n'est pas émis par Let's Encrypt. Impossible de le renouveler automatiquement !",
"certmanager_attempt_to_renew_valid_cert": "Le certificat pour le domaine {domain} nest pas sur le point dexpirer ! (Vous pouvez utiliser --force si vous savez ce que vous faites)", "certmanager_attempt_to_renew_valid_cert": "Le certificat pour le domaine {domain} n'est pas sur le point d'expirer ! (Vous pouvez utiliser --force si vous savez ce que vous faites)",
"certmanager_domain_http_not_working": "Le domaine {domain} ne semble pas être accessible via HTTP. Merci de vérifier la catégorie 'Web' dans le diagnostic pour plus d'informations. (Ou si vous savez ce que vous faites, utilisez '--no-checks' pour désactiver la vérification.)", "certmanager_domain_http_not_working": "Le domaine {domain} ne semble pas être accessible via HTTP. Merci de vérifier la catégorie 'Web' dans le diagnostic pour plus d'informations. (Ou si vous savez ce que vous faites, utilisez '--no-checks' pour désactiver la vérification.)",
"certmanager_domain_dns_ip_differs_from_public_ip": "Les enregistrements DNS du domaine '{domain}' sont différents de ladresse IP de ce serveur. Pour plus d'informations, veuillez consulter la catégorie \"Enregistrements DNS\" dans la section diagnostic. Si vous avez récemment modifié votre enregistrement A, veuillez attendre sa propagation (des vérificateurs de propagation DNS sont disponibles en ligne). (Si vous savez ce que vous faites, utilisez '--no-checks' pour désactiver ces contrôles)", "certmanager_domain_dns_ip_differs_from_public_ip": "Les enregistrements DNS du domaine '{domain}' sont différents de l'adresse IP de ce serveur. Pour plus d'informations, veuillez consulter la catégorie \"Enregistrements DNS\" dans la section diagnostic. Si vous avez récemment modifié votre enregistrement A, veuillez attendre sa propagation (des vérificateurs de propagation DNS sont disponibles en ligne). (Si vous savez ce que vous faites, utilisez '--no-checks' pour désactiver ces contrôles)",
"certmanager_cannot_read_cert": "Quelque chose sest mal passé lors de la tentative douverture du certificat actuel pour le domaine {domain} (fichier : {file}), la cause est : {reason}", "certmanager_cannot_read_cert": "Quelque chose s'est mal passé lors de la tentative d'ouverture du certificat actuel pour le domaine {domain} (fichier : {file}), la cause est : {reason}",
"certmanager_cert_install_success_selfsigned": "Le certificat auto-signé est maintenant installé pour le domaine '{domain}'", "certmanager_cert_install_success_selfsigned": "Le certificat auto-signé est maintenant installé pour le domaine '{domain}'",
"certmanager_cert_install_success": "Le certificat Lets Encrypt est maintenant installé pour le domaine '{domain}'", "certmanager_cert_install_success": "Le certificat Let's Encrypt est maintenant installé pour le domaine '{domain}'",
"certmanager_cert_renew_success": "Certificat Lets Encrypt renouvelé pour le domaine '{domain}'", "certmanager_cert_renew_success": "Certificat Let's Encrypt renouvelé pour le domaine '{domain}'",
"certmanager_cert_signing_failed": "Impossible de signer le nouveau certificat", "certmanager_cert_signing_failed": "Impossible de signer le nouveau certificat",
"certmanager_no_cert_file": "Impossible de lire le fichier du certificat pour le domaine {domain} (fichier : {file})", "certmanager_no_cert_file": "Impossible de lire le fichier du certificat pour le domaine {domain} (fichier : {file})",
"certmanager_hit_rate_limit": "Trop de certificats ont déjà été émis récemment pour ce même ensemble de domaines {domain}. Veuillez réessayer plus tard. Lisez https://letsencrypt.org/docs/rate-limits/ pour obtenir plus de détails sur les ratios et limitations", "certmanager_hit_rate_limit": "Trop de certificats ont déjà été émis récemment pour ce même ensemble de domaines {domain}. Veuillez réessayer plus tard. Lisez https://letsencrypt.org/docs/rate-limits/ pour obtenir plus de détails sur les ratios et limitations",
"domain_cannot_remove_main": "Vous ne pouvez pas supprimer '{domain}' car il sagit du domaine principal. Vous devez dabord définir un autre domaine comme domaine principal à laide de 'yunohost domain main-domain -n <another-domain>', voici la liste des domaines candidats : {other_domains}", "domain_cannot_remove_main": "Vous ne pouvez pas supprimer '{domain}' car il s'agit du domaine principal. Vous devez d'abord définir un autre domaine comme domaine principal à l'aide de 'yunohost domain main-domain -n <another-domain>', voici la liste des domaines candidats : {other_domains}",
"certmanager_self_ca_conf_file_not_found": "Le fichier de configuration pour lautorité du certificat auto-signé est introuvable (fichier : {file})", "certmanager_self_ca_conf_file_not_found": "Le fichier de configuration pour l'autorité du certificat auto-signé est introuvable (fichier : {file})",
"certmanager_unable_to_parse_self_CA_name": "Impossible danalyser le nom de lautorité du certificat auto-signé (fichier : {file})", "certmanager_unable_to_parse_self_CA_name": "Impossible d'analyser le nom de l'autorité du certificat auto-signé (fichier : {file})",
"mailbox_used_space_dovecot_down": "Le service de courriel Dovecot doit être démarré si vous souhaitez voir lespace disque occupé par la messagerie", "mailbox_used_space_dovecot_down": "Le service Dovecot doit être démarré si vous souhaitez voir l'espace disque occupé par la messagerie",
"domains_available": "Domaines disponibles :", "domains_available": "Domaines disponibles :",
"backup_archive_broken_link": "Impossible daccéder à larchive de sauvegarde (lien invalide vers {path})", "backup_archive_broken_link": "Impossible daccéder à larchive de sauvegarde (lien invalide vers {path})",
"certmanager_acme_not_configured_for_domain": "Le challenge ACME n'a pas pu être validé pour le domaine {domain} pour le moment car le code de la configuration NGINX est manquant... Merci de vérifier que votre configuration NGINX est à jour avec la commande : `yunohost tools regen-conf nginx --dry-run --with-diff`.", "certmanager_acme_not_configured_for_domain": "Le challenge ACME n'a pas pu être validé pour le domaine {domain} pour le moment car le code de la configuration NGINX est manquant... Merci de vérifier que votre configuration NGINX est à jour avec la commande : `yunohost tools regen-conf nginx --dry-run --with-diff`.",
"domain_hostname_failed": "Échec de lutilisation dun nouveau nom dhôte. Cela pourrait causer des soucis plus tard (cela nen causera peut-être pas).", "domain_hostname_failed": "Échec de lutilisation dun nouveau nom d'hôte. Cela pourrait causer des soucis plus tard (cela n'en causera peut-être pas).",
"app_already_installed_cant_change_url": "Cette application est déjà installée. LURL ne peut pas être changé simplement par cette fonction. Vérifiez si cela est disponible avec `app changeurl`.", "app_already_installed_cant_change_url": "Cette application est déjà installée. LURL ne peut pas être changé simplement par cette fonction. Vérifiez si cela est disponible avec `app changeurl`.",
"app_change_url_failed_nginx_reload": "Le redémarrage de NGINX a échoué. Voici la sortie de 'nginx -t' :\n{nginx_errors}", "app_change_url_failed_nginx_reload": "Le redémarrage de NGINX a échoué. Voici la sortie de 'nginx -t' :\n{nginx_errors}",
"app_change_url_identical_domains": "Lancien et le nouveau couple domaine/chemin_de_lURL sont identiques pour ('{domain}{path}'), rien à faire.", "app_change_url_identical_domains": "L'ancien et le nouveau couple domaine/chemin_de_l'URL sont identiques pour ('{domain}{path}'), rien à faire.",
"app_change_url_no_script": "Lapplication '{app_name}' ne prend pas encore en charge le changement dURL. Vous devriez peut-être la mettre à jour.", "app_change_url_no_script": "L'application '{app_name}' ne prend pas encore en charge le changement d'URL. Vous devriez peut-être la mettre à jour.",
"app_change_url_success": "LURL de lapplication {app} a été changée en {domain}{path}", "app_change_url_success": "L'URL de l'application {app} a été changée en {domain}{path}",
"app_location_unavailable": "Cette URL nest pas disponible ou est en conflit avec une application existante :\n{apps}", "app_location_unavailable": "Cette URL n'est pas disponible ou est en conflit avec une application existante :\n{apps}",
"app_already_up_to_date": "{app} est déjà à jour", "app_already_up_to_date": "{app} est déjà à jour",
"global_settings_bad_choice_for_enum": "Valeur du paramètre {setting} incorrecte. Reçu : {choice}, mais les valeurs possibles sont : {available_choices}", "global_settings_bad_choice_for_enum": "Valeur du paramètre {setting} incorrecte. Reçu : {choice}, mais les valeurs possibles sont : {available_choices}",
"global_settings_bad_type_for_setting": "Le type du paramètre {setting} est incorrect. Reçu {received_type} alors que {expected_type} était attendu", "global_settings_bad_type_for_setting": "Le type du paramètre {setting} est incorrect. Reçu {received_type} alors que {expected_type} était attendu",
"global_settings_cant_open_settings": "Échec de louverture du ficher de configurations car : {reason}", "global_settings_cant_open_settings": "Échec de l'ouverture du ficher de configurations car : {reason}",
"global_settings_cant_write_settings": "Échec décriture du fichier de configurations car : {reason}", "global_settings_cant_write_settings": "Échec d'écriture du fichier de configurations car : {reason}",
"global_settings_key_doesnt_exists": "La clef '{settings_key}' nexiste pas dans les configurations générales, vous pouvez voir toutes les clefs disponibles en saisissant 'yunohost settings list'", "global_settings_key_doesnt_exists": "La clef '{settings_key}' n'existe pas dans les configurations générales, vous pouvez voir toutes les clefs disponibles en saisissant 'yunohost settings list'",
"global_settings_reset_success": "Vos configurations précédentes ont été sauvegardées dans {path}", "global_settings_reset_success": "Vos configurations précédentes ont été sauvegardées dans {path}",
"global_settings_unknown_type": "Situation inattendue : la configuration {setting} semble avoir le type {unknown_type} mais celui-ci nest pas pris en charge par le système.", "global_settings_unknown_type": "Situation inattendue : la configuration {setting} semble avoir le type {unknown_type} mais celui-ci n'est pas pris en charge par le système.",
"global_settings_unknown_setting_from_settings_file": "Clé inconnue dans les paramètres : '{setting_key}', rejet de cette clé et sauvegarde de celle-ci dans /etc/yunohost/unkown_settings.json", "global_settings_unknown_setting_from_settings_file": "Clé inconnue dans les paramètres : '{setting_key}', rejet de cette clé et sauvegarde de celle-ci dans /etc/yunohost/unkown_settings.json",
"backup_abstract_method": "Cette méthode de sauvegarde reste à implémenter", "backup_abstract_method": "Cette méthode de sauvegarde reste à implémenter",
"backup_applying_method_tar": "Création de larchive TAR de la sauvegarde...", "backup_applying_method_tar": "Création de l'archive TAR de la sauvegarde...",
"backup_applying_method_copy": "Copie de tous les fichiers à sauvegarder...", "backup_applying_method_copy": "Copie de tous les fichiers à sauvegarder...",
"backup_applying_method_custom": "Appel de la méthode de sauvegarde personnalisée '{method}'...", "backup_applying_method_custom": "Appel de la méthode de sauvegarde personnalisée '{method}'...",
"backup_archive_system_part_not_available": "La partie '{part}' du système nest pas disponible dans cette sauvegarde", "backup_archive_system_part_not_available": "La partie '{part}' du système n'est pas disponible dans cette sauvegarde",
"backup_archive_writing_error": "Impossible dajouter des fichiers '{source}' (nommés dans larchive : '{dest}') à sauvegarder dans larchive compressée '{archive}'", "backup_archive_writing_error": "Impossible d'ajouter des fichiers '{source}' (nommés dans l'archive : '{dest}') à sauvegarder dans l'archive compressée '{archive}'",
"backup_ask_for_copying_if_needed": "Voulez-vous effectuer la sauvegarde en utilisant {size}Mo temporairement ? (Cette méthode est utilisée car certains fichiers nont pas pu être préparés avec une méthode plus efficace.)", "backup_ask_for_copying_if_needed": "Voulez-vous effectuer la sauvegarde en utilisant {size}Mo temporairement ? (Cette méthode est utilisée car certains fichiers n'ont pas pu être préparés avec une méthode plus efficace.)",
"backup_cant_mount_uncompress_archive": "Impossible de monter en lecture seule le dossier de larchive décompressée", "backup_cant_mount_uncompress_archive": "Impossible de monter en lecture seule le dossier de l'archive décompressée",
"backup_copying_to_organize_the_archive": "Copie de {size} Mo pour organiser larchive", "backup_copying_to_organize_the_archive": "Copie de {size} Mo pour organiser l'archive",
"backup_csv_creation_failed": "Impossible de créer le fichier CSV nécessaire à la restauration", "backup_csv_creation_failed": "Impossible de créer le fichier CSV nécessaire à la restauration",
"backup_csv_addition_failed": "Impossible dajouter des fichiers à sauvegarder dans le fichier CSV", "backup_csv_addition_failed": "Impossible d'ajouter des fichiers à sauvegarder dans le fichier CSV",
"backup_custom_backup_error": "Échec de la méthode de sauvegarde personnalisée à létape 'backup'", "backup_custom_backup_error": "Échec de la méthode de sauvegarde personnalisée à l'étape 'backup'",
"backup_custom_mount_error": "Échec de la méthode de sauvegarde personnalisée à létape 'mount'", "backup_custom_mount_error": "Échec de la méthode de sauvegarde personnalisée à l'étape 'mount'",
"backup_no_uncompress_archive_dir": "Ce dossier darchive décompressée nexiste pas", "backup_no_uncompress_archive_dir": "Ce dossier d'archive décompressée n'existe pas",
"backup_method_tar_finished": "Larchive TAR de la sauvegarde a été créée", "backup_method_tar_finished": "L'archive TAR de la sauvegarde a été créée",
"backup_method_copy_finished": "La copie de la sauvegarde est terminée", "backup_method_copy_finished": "La copie de la sauvegarde est terminée",
"backup_method_custom_finished": "La méthode de sauvegarde personnalisée '{method}' est terminée", "backup_method_custom_finished": "La méthode de sauvegarde personnalisée '{method}' est terminée",
"backup_system_part_failed": "Impossible de sauvegarder la partie '{part}' du système", "backup_system_part_failed": "Impossible de sauvegarder la partie '{part}' du système",
"backup_unable_to_organize_files": "Impossible dutiliser la méthode rapide pour organiser les fichiers dans larchive", "backup_unable_to_organize_files": "Impossible d'utiliser la méthode rapide pour organiser les fichiers dans l'archive",
"backup_with_no_backup_script_for_app": "Lapplication {app} na pas de script de sauvegarde. Ignorer.", "backup_with_no_backup_script_for_app": "L'application {app} n'a pas de script de sauvegarde. Ignorer.",
"backup_with_no_restore_script_for_app": "{app} na pas de script de restauration, vous ne pourrez pas restaurer automatiquement la sauvegarde de cette application.", "backup_with_no_restore_script_for_app": "{app} n'a pas de script de restauration, vous ne pourrez pas restaurer automatiquement la sauvegarde de cette application.",
"global_settings_cant_serialize_settings": "Échec de la sérialisation des données de paramétrage car : {reason}", "global_settings_cant_serialize_settings": "Échec de la sérialisation des données de paramétrage car : {reason}",
"restore_removing_tmp_dir_failed": "Impossible de sauvegarder un ancien dossier temporaire", "restore_removing_tmp_dir_failed": "Impossible de sauvegarder un ancien dossier temporaire",
"restore_extracting": "Extraction des fichiers nécessaires depuis larchive…", "restore_extracting": "Extraction des fichiers nécessaires depuis l'archive...",
"restore_may_be_not_enough_disk_space": "Votre système ne semble pas avoir suffisamment despace (libre : {free_space:d} B, espace nécessaire : {needed_space:d} B, marge de sécurité : {margin:d} B)", "restore_may_be_not_enough_disk_space": "Votre système ne semble pas avoir suffisamment d'espace (libre : {free_space} B, espace nécessaire : {needed_space} B, marge de sécurité : {margin} B)",
"restore_not_enough_disk_space": "Espace disponible insuffisant (Lespace libre est de {free_space:d} octets. Le besoin despace nécessaire est de {needed_space:d} octets. En appliquant une marge de sécurité, la quantité despace nécessaire est de {margin:d} octets)", "restore_not_enough_disk_space": "Espace disponible insuffisant (L'espace libre est de {free_space} octets. Le besoin d'espace nécessaire est de {needed_space} octets. En appliquant une marge de sécurité, la quantité d'espace nécessaire est de {margin} octets)",
"restore_system_part_failed": "Impossible de restaurer la partie '{part}' du système", "restore_system_part_failed": "Impossible de restaurer la partie '{part}' du système",
"backup_couldnt_bind": "Impossible de lier {src} avec {dest}.", "backup_couldnt_bind": "Impossible de lier {src} avec {dest}.",
"domain_dns_conf_is_just_a_recommendation": "Cette commande vous montre la configuration *recommandée*. Elle ne configure pas le DNS pour vous. Il est de votre ressort de configurer votre zone DNS chez votre registrar/fournisseur conformément à cette recommandation.", "domain_dns_conf_is_just_a_recommendation": "Cette commande vous montre la configuration *recommandée*. Elle ne configure pas le DNS pour vous. Il est de votre ressort de configurer votre zone DNS chez votre registrar/fournisseur conformément à cette recommandation.",
"migrations_cant_reach_migration_file": "Impossible daccéder aux fichiers de migration via le chemin '%s'", "migrations_cant_reach_migration_file": "Impossible d'accéder aux fichiers de migration via le chemin '%s'",
"migrations_loading_migration": "Chargement de la migration {id}...", "migrations_loading_migration": "Chargement de la migration {id}...",
"migrations_migration_has_failed": "La migration {id} a échoué avec lexception {exception} : annulation", "migrations_migration_has_failed": "La migration {id} a échoué avec l'exception {exception} : annulation",
"migrations_no_migrations_to_run": "Aucune migration à lancer", "migrations_no_migrations_to_run": "Aucune migration à lancer",
"migrations_skip_migration": "Ignorer et passer la migration {id}...", "migrations_skip_migration": "Ignorer et passer la migration {id}...",
"server_shutdown": "Le serveur va séteindre", "server_shutdown": "Le serveur va s'éteindre",
"server_shutdown_confirm": "Le serveur va être éteint immédiatement, le voulez-vous vraiment ? [{answers}]", "server_shutdown_confirm": "Le serveur va être éteint immédiatement, le voulez-vous vraiment ? [{answers}]",
"server_reboot": "Le serveur va redémarrer", "server_reboot": "Le serveur va redémarrer",
"server_reboot_confirm": "Le serveur va redémarrer immédiatement, le voulez-vous vraiment ? [{answers}]", "server_reboot_confirm": "Le serveur va redémarrer immédiatement, le voulez-vous vraiment ? [{answers}]",
"app_upgrade_some_app_failed": "Certaines applications nont pas été mises à jour", "app_upgrade_some_app_failed": "Certaines applications n'ont pas été mises à jour",
"dyndns_could_not_check_provide": "Impossible de vérifier si {provider} peut fournir {domain}.", "dyndns_could_not_check_provide": "Impossible de vérifier si {provider} peut fournir {domain}.",
"dyndns_domain_not_provided": "Le fournisseur DynDNS {provider} ne peut pas fournir le domaine {domain}.", "dyndns_domain_not_provided": "Le fournisseur DynDNS {provider} ne peut pas fournir le domaine {domain}.",
"app_make_default_location_already_used": "Impossible de configurer lapplication '{app}' par défaut pour le domaine '{domain}' car il est déjà utilisé par l'application '{other_app}'", "app_make_default_location_already_used": "Impossible de configurer l'application '{app}' par défaut pour le domaine '{domain}' car il est déjà utilisé par l'application '{other_app}'",
"app_upgrade_app_name": "Mise à jour de {app}...", "app_upgrade_app_name": "Mise à jour de {app}...",
"backup_output_symlink_dir_broken": "Votre répertoire darchivage '{path}' est un lien symbolique brisé. Peut-être avez-vous oublié de re/monter ou de brancher le support de stockage sur lequel il pointe.", "backup_output_symlink_dir_broken": "Votre répertoire d'archivage '{path}' est un lien symbolique brisé. Peut-être avez-vous oublié de re/monter ou de brancher le support de stockage sur lequel il pointe.",
"migrations_list_conflict_pending_done": "Vous ne pouvez pas utiliser --previous et --done simultanément.", "migrations_list_conflict_pending_done": "Vous ne pouvez pas utiliser --previous et --done simultanément.",
"migrations_to_be_ran_manually": "La migration {id} doit être lancée manuellement. Veuillez aller dans Outils > Migrations dans linterface admin, ou lancer `yunohost tools migrations run`.", "migrations_to_be_ran_manually": "La migration {id} doit être lancée manuellement. Veuillez aller dans Outils > Migrations dans la webadmin, ou lancer `yunohost tools migrations run`.",
"migrations_need_to_accept_disclaimer": "Pour lancer la migration {id}, vous devez accepter cet avertissement :\n---\n{disclaimer}\n---\nSi vous acceptez de lancer la migration, veuillez relancer la commande avec loption --accept-disclaimer.", "migrations_need_to_accept_disclaimer": "Pour lancer la migration {id}, vous devez accepter cet avertissement :\n---\n{disclaimer}\n---\nSi vous acceptez de lancer la migration, veuillez relancer la commande avec l'option --accept-disclaimer.",
"service_description_yunomdns": "Vous permet datteindre votre serveur en utilisant « yunohost.local » sur votre réseau local", "service_description_yunomdns": "Vous permet d'atteindre votre serveur en utilisant 'yunohost.local' sur votre réseau local",
"service_description_dnsmasq": "Gère la résolution des noms de domaine (DNS)", "service_description_dnsmasq": "Gère la résolution des noms de domaine (DNS)",
"service_description_dovecot": "Permet aux clients de messagerie daccéder/récupérer les emails (via IMAP et POP3)", "service_description_dovecot": "Permet aux clients de messagerie d'accéder/récupérer les emails (via IMAP et POP3)",
"service_description_fail2ban": "Protège contre les attaques brute-force et autres types dattaques venant dInternet", "service_description_fail2ban": "Protège contre les attaques brute-force et autres types d'attaques venant d'Internet",
"service_description_metronome": "Gère les comptes de messagerie instantanée XMPP", "service_description_metronome": "Gère les comptes de messagerie instantanée XMPP",
"service_description_mysql": "Stocke les données des applications (bases de données SQL)", "service_description_mysql": "Stocke les données des applications (bases de données SQL)",
"service_description_nginx": "Sert ou permet laccès à tous les sites web hébergés sur votre serveur", "service_description_nginx": "Sert ou permet l'accès à tous les sites web hébergés sur votre serveur",
"service_description_postfix": "Utilisé pour envoyer et recevoir des emails", "service_description_postfix": "Utilisé pour envoyer et recevoir des emails",
"service_description_redis-server": "Une base de données spécialisée utilisée pour laccès rapide aux données, les files dattentes et la communication entre les programmes", "service_description_redis-server": "Une base de données spécialisée utilisée pour l'accès rapide aux données, les files d'attentes et la communication entre les programmes",
"service_description_rspamd": "Filtre le pourriel, et dautres fonctionnalités liées aux emails", "service_description_rspamd": "Filtre le pourriel, et d'autres fonctionnalités liées aux emails",
"service_description_slapd": "Stocke les utilisateurs, domaines et leurs informations liées", "service_description_slapd": "Stocke les utilisateurs, domaines et leurs informations liées",
"service_description_ssh": "Vous permet de vous connecter à distance à votre serveur via un terminal (protocole SSH)", "service_description_ssh": "Vous permet de vous connecter à distance à votre serveur via un terminal (protocole SSH)",
"service_description_yunohost-api": "Permet les interactions entre linterface web de YunoHost et le système", "service_description_yunohost-api": "Permet les interactions entre l'interface web de YunoHost et le système",
"service_description_yunohost-firewall": "Gère louverture et la fermeture des ports de connexion aux services", "service_description_yunohost-firewall": "Gère l'ouverture et la fermeture des ports de connexion aux services",
"experimental_feature": "Attention : cette fonctionnalité est expérimentale et ne doit pas être considérée comme stable, vous ne devriez pas lutiliser à moins que vous ne sachiez ce que vous faites.", "experimental_feature": "Attention : cette fonctionnalité est expérimentale et ne doit pas être considérée comme stable, vous ne devriez pas l'utiliser à moins que vous ne sachiez ce que vous faites.",
"log_corrupted_md_file": "Le fichier YAML de métadonnées associé aux logs est corrompu : '{md_file}'\nErreur : {error}", "log_corrupted_md_file": "Le fichier YAML de métadonnées associé aux logs est corrompu : '{md_file}'\nErreur : {error}",
"log_link_to_log": "Journal complet de cette opération : '<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\"> {desc} </a>'", "log_link_to_log": "Journal complet de cette opération : '<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\"> {desc} </a>'",
"log_help_to_get_log": "Pour voir le journal de cette opération '{desc}', utilisez la commande 'yunohost log show {name}{name}'", "log_help_to_get_log": "Pour voir le journal de cette opération '{desc}', utilisez la commande 'yunohost log show {name}{name}'",
"log_link_to_failed_log": "Lopération '{desc}' a échoué ! Pour obtenir de laide, merci de partager le journal de lopération en <a href=\"#/tools/logs/{name}\">cliquant ici</a>", "log_link_to_failed_log": "L'opération '{desc}' a échoué ! Pour obtenir de l'aide, merci de partager le journal de l'opération en <a href=\"#/tools/logs/{name}\">cliquant ici</a>",
"log_help_to_get_failed_log": "Lopération '{desc}' a échoué ! Pour obtenir de laide, merci de partager le journal de lopération en utilisant la commande 'yunohost log share {name}'", "log_help_to_get_failed_log": "L'opération '{desc}' a échoué ! Pour obtenir de l'aide, merci de partager le journal de l'opération en utilisant la commande 'yunohost log share {name}'",
"log_does_exists": "Il ny a pas de journal des opérations avec le nom '{log}', utilisez 'yunohost log list' pour voir tous les journaux dopérations disponibles", "log_does_exists": "Il n'y a pas de journal des opérations avec le nom '{log}', utilisez 'yunohost log list' pour voir tous les journaux d'opérations disponibles",
"log_operation_unit_unclosed_properly": "Lopération ne sest pas terminée correctement", "log_operation_unit_unclosed_properly": "L'opération ne s'est pas terminée correctement",
"log_app_change_url": "Changer lURL de lapplication '{}'", "log_app_change_url": "Changer l'URL de l'application '{}'",
"log_app_install": "Installer lapplication '{}'", "log_app_install": "Installer l'application '{}'",
"log_app_remove": "Enlever lapplication '{}'", "log_app_remove": "Enlever l'application '{}'",
"log_app_upgrade": "Mettre à jour lapplication '{}'", "log_app_upgrade": "Mettre à jour l'application '{}'",
"log_app_makedefault": "Faire de '{}' lapplication par défaut", "log_app_makedefault": "Faire de '{}' l'application par défaut",
"log_available_on_yunopaste": "Le journal est désormais disponible via {url}", "log_available_on_yunopaste": "Le journal est désormais disponible via {url}",
"log_backup_restore_system": "Restaurer le système depuis une archive de sauvegarde", "log_backup_restore_system": "Restaurer le système depuis une archive de sauvegarde",
"log_backup_restore_app": "Restaurer '{}' depuis une sauvegarde", "log_backup_restore_app": "Restaurer '{}' depuis une sauvegarde",
@ -269,13 +269,13 @@
"log_domain_add": "Ajouter le domaine '{}' dans la configuration du système", "log_domain_add": "Ajouter le domaine '{}' dans la configuration du système",
"log_domain_remove": "Enlever le domaine '{}' de la configuration du système", "log_domain_remove": "Enlever le domaine '{}' de la configuration du système",
"log_dyndns_subscribe": "Souscrire au sous-domaine YunoHost '{}'", "log_dyndns_subscribe": "Souscrire au sous-domaine YunoHost '{}'",
"log_dyndns_update": "Mettre à jour ladresse IP associée à votre sous-domaine YunoHost '{}'", "log_dyndns_update": "Mettre à jour l'adresse IP associée à votre sous-domaine YunoHost '{}'",
"log_letsencrypt_cert_install": "Installer le certificat Lets Encrypt sur le domaine '{}'", "log_letsencrypt_cert_install": "Installer le certificat Let's Encrypt sur le domaine '{}'",
"log_selfsigned_cert_install": "Installer un certificat auto-signé sur le domaine '{}'", "log_selfsigned_cert_install": "Installer un certificat auto-signé sur le domaine '{}'",
"log_letsencrypt_cert_renew": "Renouveler le certificat Lets Encrypt de '{}'", "log_letsencrypt_cert_renew": "Renouveler le certificat Let's Encrypt de '{}'",
"log_user_create": "Ajouter lutilisateur '{}'", "log_user_create": "Ajouter l'utilisateur '{}'",
"log_user_delete": "Supprimer lutilisateur '{}'", "log_user_delete": "Supprimer l'utilisateur '{}'",
"log_user_update": "Mettre à jour les informations de lutilisateur '{}'", "log_user_update": "Mettre à jour les informations de l'utilisateur '{}'",
"log_domain_main_domain": "Faire de '{}' le domaine principal", "log_domain_main_domain": "Faire de '{}' le domaine principal",
"log_tools_migrations_migrate_forward": "Exécuter les migrations", "log_tools_migrations_migrate_forward": "Exécuter les migrations",
"log_tools_postinstall": "Faire la post-installation de votre serveur YunoHost", "log_tools_postinstall": "Faire la post-installation de votre serveur YunoHost",
@ -290,9 +290,9 @@
"password_too_simple_2": "Le mot de passe doit comporter au moins 8 caractères et contenir des chiffres, des majuscules et des minuscules", "password_too_simple_2": "Le mot de passe doit comporter au moins 8 caractères et contenir des chiffres, des majuscules et des minuscules",
"password_too_simple_3": "Le mot de passe doit comporter au moins 8 caractères et contenir des chiffres, des majuscules, des minuscules et des caractères spéciaux", "password_too_simple_3": "Le mot de passe doit comporter au moins 8 caractères et contenir des chiffres, des majuscules, des minuscules et des caractères spéciaux",
"password_too_simple_4": "Le mot de passe doit comporter au moins 12 caractères et contenir des chiffres, des majuscules, des minuscules et des caractères spéciaux", "password_too_simple_4": "Le mot de passe doit comporter au moins 12 caractères et contenir des chiffres, des majuscules, des minuscules et des caractères spéciaux",
"root_password_desynchronized": "Le mot de passe administrateur a été changé, mais YunoHost na pas pu le propager au mot de passe root !", "root_password_desynchronized": "Le mot de passe administrateur a été changé, mais YunoHost n'a pas pu le propager au mot de passe root !",
"aborting": "Annulation en cours.", "aborting": "Annulation en cours.",
"app_not_upgraded": "Lapplication {failed_app} na pas été mise à jour et par conséquence les applications suivantes nont pas été mises à jour : {apps}", "app_not_upgraded": "L'application {failed_app} n'a pas été mise à jour et par conséquence les applications suivantes n'ont pas été mises à jour : {apps}",
"app_start_install": "Installation de {app}...", "app_start_install": "Installation de {app}...",
"app_start_remove": "Suppression de {app}...", "app_start_remove": "Suppression de {app}...",
"app_start_backup": "Collecte des fichiers devant être sauvegardés pour {app}...", "app_start_backup": "Collecte des fichiers devant être sauvegardés pour {app}...",
@ -300,28 +300,28 @@
"app_upgrade_several_apps": "Les applications suivantes seront mises à jour : {apps}", "app_upgrade_several_apps": "Les applications suivantes seront mises à jour : {apps}",
"ask_new_domain": "Nouveau domaine", "ask_new_domain": "Nouveau domaine",
"ask_new_path": "Nouveau chemin", "ask_new_path": "Nouveau chemin",
"backup_actually_backuping": "Création dune archive de sauvegarde à partir des fichiers collectés...", "backup_actually_backuping": "Création d'une archive de sauvegarde à partir des fichiers collectés...",
"backup_mount_archive_for_restore": "Préparation de larchive pour restauration...", "backup_mount_archive_for_restore": "Préparation de l'archive pour restauration...",
"confirm_app_install_warning": "Avertissement : cette application peut fonctionner mais nest pas bien intégrée dans YunoHost. Certaines fonctionnalités telles que lauthentification unique et la sauvegarde/restauration peuvent ne pas être disponibles. Linstaller quand même ? [{answers}] ", "confirm_app_install_warning": "Avertissement : cette application peut fonctionner mais n'est pas bien intégrée dans YunoHost. Certaines fonctionnalités telles que l'authentification unique et la sauvegarde/restauration peuvent ne pas être disponibles. L'installer quand même ? [{answers}] ",
"confirm_app_install_danger": "DANGER ! Cette application est connue pour être encore expérimentale (si elle ne fonctionne pas explicitement) ! Vous ne devriez probablement PAS linstaller à moins de savoir ce que vous faites. AUCUN SUPPORT ne sera fourni si cette application ne fonctionne pas ou casse votre système... Si vous êtes prêt à prendre ce risque de toute façon, tapez '{answers}'", "confirm_app_install_danger": "DANGER ! Cette application est connue pour être encore expérimentale (si elle ne fonctionne pas explicitement) ! Vous ne devriez probablement PAS l'installer à moins de savoir ce que vous faites. AUCUN SUPPORT ne sera fourni si cette application ne fonctionne pas ou casse votre système... Si vous êtes prêt à prendre ce risque de toute façon, tapez '{answers}'",
"confirm_app_install_thirdparty": "DANGER ! Cette application ne fait pas partie du catalogue d'applications de YunoHost. L'installation d'applications tierces peut compromettre l'intégrité et la sécurité de votre système. Vous ne devriez probablement PAS l'installer à moins de savoir ce que vous faites. AUCUN SUPPORT ne sera fourni si cette application ne fonctionne pas ou casse votre système... Si vous êtes prêt à prendre ce risque de toute façon, tapez '{answers}'", "confirm_app_install_thirdparty": "DANGER ! Cette application ne fait pas partie du catalogue d'applications de YunoHost. L'installation d'applications tierces peut compromettre l'intégrité et la sécurité de votre système. Vous ne devriez probablement PAS l'installer à moins de savoir ce que vous faites. AUCUN SUPPORT ne sera fourni si cette application ne fonctionne pas ou casse votre système... Si vous êtes prêt à prendre ce risque de toute façon, tapez '{answers}'",
"dpkg_is_broken": "Vous ne pouvez pas faire ça maintenant car dpkg/apt (le gestionnaire de paquets du système) semble avoir laissé des choses non configurées. Vous pouvez essayer de résoudre ce problème en vous connectant via SSH et en exécutant `sudo apt install --fix-broken` et/ou `sudo dpkg --configure -a'.", "dpkg_is_broken": "Vous ne pouvez pas faire ça maintenant car dpkg/apt (le gestionnaire de paquets du système) semble avoir laissé des choses non configurées. Vous pouvez essayer de résoudre ce problème en vous connectant via SSH et en exécutant `sudo apt install --fix-broken` et/ou `sudo dpkg --configure -a'.",
"dyndns_could_not_check_available": "Impossible de vérifier si {domain} est disponible chez {provider}.", "dyndns_could_not_check_available": "Impossible de vérifier si {domain} est disponible chez {provider}.",
"file_does_not_exist": "Le fichier dont le chemin est {path} nexiste pas.", "file_does_not_exist": "Le fichier dont le chemin est {path} n'existe pas.",
"global_settings_setting_security_password_admin_strength": "Qualité du mot de passe administrateur", "global_settings_setting_security_password_admin_strength": "Qualité du mot de passe administrateur",
"global_settings_setting_security_password_user_strength": "Qualité du mot de passe de lutilisateur", "global_settings_setting_security_password_user_strength": "Qualité du mot de passe de l'utilisateur",
"global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Autoriser lutilisation de la clé hôte DSA (obsolète) pour la configuration du service SSH", "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Autoriser l'utilisation de la clé hôte DSA (obsolète) pour la configuration du service SSH",
"hook_json_return_error": "Échec de la lecture au retour du script {path}. Erreur : {msg}. Contenu brut : {raw_content}", "hook_json_return_error": "Échec de la lecture au retour du script {path}. Erreur : {msg}. Contenu brut : {raw_content}",
"pattern_password_app": "Désolé, les mots de passe ne peuvent pas contenir les caractères suivants : {forbidden_chars}", "pattern_password_app": "Désolé, les mots de passe ne peuvent pas contenir les caractères suivants : {forbidden_chars}",
"root_password_replaced_by_admin_password": "Votre mot de passe root a été remplacé par votre mot de passe administrateur.", "root_password_replaced_by_admin_password": "Votre mot de passe root a été remplacé par votre mot de passe administrateur.",
"service_reload_failed": "Impossible de recharger le service '{service}'.\n\nJournaux historisés récents de ce service : {logs}", "service_reload_failed": "Impossible de recharger le service '{service}'.\n\nJournaux historisés récents de ce service : {logs}",
"service_reloaded": "Le service « {service} » a été rechargé", "service_reloaded": "Le service '{service}' a été rechargé",
"service_restart_failed": "Impossible de redémarrer le service '{service}'\n\nJournaux historisés récents de ce service : {logs}", "service_restart_failed": "Impossible de redémarrer le service '{service}'\n\nJournaux historisés récents de ce service : {logs}",
"service_restarted": "Le service « {service} » a été redémarré", "service_restarted": "Le service '{service}' a été redémarré",
"service_reload_or_restart_failed": "Impossible de recharger ou de redémarrer le service '{service}'\n\nJournaux historisés récents de ce service : {logs}", "service_reload_or_restart_failed": "Impossible de recharger ou de redémarrer le service '{service}'\n\nJournaux historisés récents de ce service : {logs}",
"service_reloaded_or_restarted": "Le service « {service} » a été rechargé ou redémarré", "service_reloaded_or_restarted": "Le service '{service}' a été rechargé ou redémarré",
"this_action_broke_dpkg": "Cette action a laissé des paquets non configurés par dpkg/apt (les gestionnaires de paquets du système) Vous pouvez essayer de résoudre ce problème en vous connectant via SSH et en exécutant `sudo apt install --fix-broken` et/ou `sudo dpkg --configure -a`.", "this_action_broke_dpkg": "Cette action a laissé des paquets non configurés par dpkg/apt (les gestionnaires de paquets du système) ... Vous pouvez essayer de résoudre ce problème en vous connectant via SSH et en exécutant `sudo apt install --fix-broken` et/ou `sudo dpkg --configure -a`.",
"app_action_cannot_be_ran_because_required_services_down": "Ces services requis doivent être en cours dexécution pour exécuter cette action : {services}. Essayez de les redémarrer pour continuer (et éventuellement rechercher pourquoi ils sont en panne).", "app_action_cannot_be_ran_because_required_services_down": "Ces services requis doivent être en cours d'exécution pour exécuter cette action : {services}. Essayez de les redémarrer pour continuer (et éventuellement rechercher pourquoi ils sont en panne).",
"admin_password_too_long": "Veuillez choisir un mot de passe comportant moins de 127 caractères", "admin_password_too_long": "Veuillez choisir un mot de passe comportant moins de 127 caractères",
"log_regen_conf": "Régénérer les configurations du système '{}'", "log_regen_conf": "Régénérer les configurations du système '{}'",
"regenconf_file_backed_up": "Le fichier de configuration '{conf}' a été sauvegardé sous '{backup}'", "regenconf_file_backed_up": "Le fichier de configuration '{conf}' a été sauvegardé sous '{backup}'",
@ -333,26 +333,26 @@
"regenconf_file_updated": "Le fichier de configuration '{conf}' a été mis à jour", "regenconf_file_updated": "Le fichier de configuration '{conf}' a été mis à jour",
"regenconf_now_managed_by_yunohost": "Le fichier de configuration '{conf}' est maintenant géré par YunoHost (catégorie {category}).", "regenconf_now_managed_by_yunohost": "Le fichier de configuration '{conf}' est maintenant géré par YunoHost (catégorie {category}).",
"regenconf_up_to_date": "La configuration est déjà à jour pour la catégorie '{category}'", "regenconf_up_to_date": "La configuration est déjà à jour pour la catégorie '{category}'",
"already_up_to_date": "Il ny a rien à faire. Tout est déjà à jour.", "already_up_to_date": "Il n'y a rien à faire. Tout est déjà à jour.",
"global_settings_setting_security_nginx_compatibility": "Compatibilité versus compromis sécuritaire pour le serveur web Nginx. Affecte les cryptogrammes (et dautres aspects liés à la sécurité)", "global_settings_setting_security_nginx_compatibility": "Compatibilité versus compromis sécuritaire pour le serveur web Nginx. Affecte les cryptogrammes (et d'autres aspects liés à la sécurité)",
"global_settings_setting_security_ssh_compatibility": "Compatibilité versus compromis sécuritaire pour le serveur SSH. Affecte les cryptogrammes (et dautres aspects liés à la sécurité)", "global_settings_setting_security_ssh_compatibility": "Compatibilité versus compromis sécuritaire pour le serveur SSH. Affecte les cryptogrammes (et d'autres aspects liés à la sécurité)",
"global_settings_setting_security_postfix_compatibility": "Compatibilité versus compromis sécuritaire pour le serveur Postfix. Affecte les cryptogrammes (et dautres aspects liés à la sécurité)", "global_settings_setting_security_postfix_compatibility": "Compatibilité versus compromis sécuritaire pour le serveur Postfix. Affecte les cryptogrammes (et d'autres aspects liés à la sécurité)",
"regenconf_file_kept_back": "Le fichier de configuration '{conf}' devait être supprimé par « regen-conf » (catégorie {category}) mais a été conservé.", "regenconf_file_kept_back": "Le fichier de configuration '{conf}' devait être supprimé par 'regen-conf' (catégorie {category}) mais a été conservé.",
"regenconf_updated": "La configuration a été mise à jour pour '{category}'", "regenconf_updated": "La configuration a été mise à jour pour '{category}'",
"regenconf_would_be_updated": "La configuration aurait dû être mise à jour pour la catégorie '{category}'", "regenconf_would_be_updated": "La configuration aurait dû être mise à jour pour la catégorie '{category}'",
"regenconf_dry_pending_applying": "Vérification de la configuration en attente qui aurait été appliquée pour la catégorie '{category}'", "regenconf_dry_pending_applying": "Vérification de la configuration en attente qui aurait été appliquée pour la catégorie '{category}'...",
"regenconf_failed": "Impossible de régénérer la configuration pour la ou les catégorie(s) : '{categories}'", "regenconf_failed": "Impossible de régénérer la configuration pour la ou les catégorie(s) : '{categories}'",
"regenconf_pending_applying": "Applique la configuration en attente pour la catégorie '{category}'...", "regenconf_pending_applying": "Applique la configuration en attente pour la catégorie '{category}'...",
"service_regen_conf_is_deprecated": "'yunohost service regen-conf' est obsolète ! Veuillez plutôt utiliser 'yunohost tools regen-conf' à la place.", "service_regen_conf_is_deprecated": "'yunohost service regen-conf' est obsolète ! Veuillez plutôt utiliser 'yunohost tools regen-conf' à la place.",
"tools_upgrade_at_least_one": "Veuillez spécifier '--apps' ou '--system'", "tools_upgrade_at_least_one": "Veuillez spécifier '--apps' ou '--system'",
"tools_upgrade_cant_both": "Impossible de mettre à niveau le système et les applications en même temps", "tools_upgrade_cant_both": "Impossible de mettre à niveau le système et les applications en même temps",
"tools_upgrade_cant_hold_critical_packages": "Impossibilité d'ajouter le drapeau 'hold' pour les paquets critiques", "tools_upgrade_cant_hold_critical_packages": "Impossibilité d'ajouter le drapeau 'hold' pour les paquets critiques...",
"tools_upgrade_regular_packages": "Mise à jour des paquets du système (non liés a YunoHost)", "tools_upgrade_regular_packages": "Mise à jour des paquets du système (non liés a YunoHost)...",
"tools_upgrade_regular_packages_failed": "Impossible de mettre à jour les paquets suivants : {packages_list}", "tools_upgrade_regular_packages_failed": "Impossible de mettre à jour les paquets suivants : {packages_list}",
"tools_upgrade_special_packages": "Mise à jour des paquets 'spécifiques' (liés a YunoHost)", "tools_upgrade_special_packages": "Mise à jour des paquets 'spécifiques' (liés a YunoHost)...",
"tools_upgrade_special_packages_completed": "La mise à jour des paquets de YunoHost est finie !\nPressez [Entrée] pour revenir à la ligne de commande", "tools_upgrade_special_packages_completed": "La mise à jour des paquets de YunoHost est finie !\nPressez [Entrée] pour revenir à la ligne de commande",
"dpkg_lock_not_available": "Cette commande ne peut pas être exécutée pour le moment car un autre programme semble utiliser le verrou de dpkg (le gestionnaire de package système)", "dpkg_lock_not_available": "Cette commande ne peut pas être exécutée pour le moment car un autre programme semble utiliser le verrou de dpkg (le gestionnaire de package système)",
"tools_upgrade_cant_unhold_critical_packages": "Impossible d'enlever le drapeau 'hold' pour les paquets critiques", "tools_upgrade_cant_unhold_critical_packages": "Impossible d'enlever le drapeau 'hold' pour les paquets critiques...",
"tools_upgrade_special_packages_explanation": "La mise à niveau spécifique à YunoHost se poursuivra en arrière-plan. Veuillez ne pas lancer d'autres actions sur votre serveur pendant les 10 prochaines minutes (selon la vitesse du matériel). Après cela, vous devrez peut-être vous reconnecter à la webadmin. Le journal de mise à niveau sera disponible dans Outils → Journal (dans le webadmin) ou en utilisant 'yunohost log list' (à partir de la ligne de commande).", "tools_upgrade_special_packages_explanation": "La mise à niveau spécifique à YunoHost se poursuivra en arrière-plan. Veuillez ne pas lancer d'autres actions sur votre serveur pendant les 10 prochaines minutes (selon la vitesse du matériel). Après cela, vous devrez peut-être vous reconnecter à la webadmin. Le journal de mise à niveau sera disponible dans Outils → Journal (dans le webadmin) ou en utilisant 'yunohost log list' (à partir de la ligne de commande).",
"update_apt_cache_failed": "Impossible de mettre à jour le cache APT (gestionnaire de paquets Debian). Voici un extrait du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}", "update_apt_cache_failed": "Impossible de mettre à jour le cache APT (gestionnaire de paquets Debian). Voici un extrait du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}",
"update_apt_cache_warning": "Des erreurs se sont produites lors de la mise à jour du cache APT (gestionnaire de paquets Debian). Voici un extrait des lignes du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}", "update_apt_cache_warning": "Des erreurs se sont produites lors de la mise à jour du cache APT (gestionnaire de paquets Debian). Voici un extrait des lignes du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}",
@ -366,62 +366,62 @@
"group_deletion_failed": "Échec de la suppression du groupe '{group}' : {error}", "group_deletion_failed": "Échec de la suppression du groupe '{group}' : {error}",
"log_user_group_delete": "Supprimer le groupe '{}'", "log_user_group_delete": "Supprimer le groupe '{}'",
"log_user_group_update": "Mettre à jour '{}' pour le groupe", "log_user_group_update": "Mettre à jour '{}' pour le groupe",
"mailbox_disabled": "La boîte aux lettres est désactivée pour lutilisateur {user}", "mailbox_disabled": "La boîte aux lettres est désactivée pour l'utilisateur {user}",
"app_action_broke_system": "Cette action semble avoir cassé des services importants : {services}", "app_action_broke_system": "Cette action semble avoir cassé des services importants : {services}",
"apps_already_up_to_date": "Toutes les applications sont déjà à jour", "apps_already_up_to_date": "Toutes les applications sont déjà à jour",
"migrations_must_provide_explicit_targets": "Vous devez fournir des cibles explicites lorsque vous utilisez '--skip' ou '--force-rerun'", "migrations_must_provide_explicit_targets": "Vous devez fournir des cibles explicites lorsque vous utilisez '--skip' ou '--force-rerun'",
"migrations_no_such_migration": "Il ny a pas de migration appelée '{id}'", "migrations_no_such_migration": "Il n'y a pas de migration appelée '{id}'",
"migrations_pending_cant_rerun": "Ces migrations étant toujours en attente, vous ne pouvez pas les exécuter à nouveau : {ids}", "migrations_pending_cant_rerun": "Ces migrations étant toujours en attente, vous ne pouvez pas les exécuter à nouveau : {ids}",
"migrations_exclusive_options": "'auto', '--skip' et '--force-rerun' sont des options mutuellement exclusives.", "migrations_exclusive_options": "'auto', '--skip' et '--force-rerun' sont des options mutuellement exclusives.",
"migrations_not_pending_cant_skip": "Ces migrations ne sont pas en attente et ne peuvent donc pas être ignorées : {ids}", "migrations_not_pending_cant_skip": "Ces migrations ne sont pas en attente et ne peuvent donc pas être ignorées : {ids}",
"permission_not_found": "Permission '{permission}' introuvable", "permission_not_found": "Permission '{permission}' introuvable",
"permission_update_failed": "Impossible de mettre à jour la permission '{permission}' : {error}", "permission_update_failed": "Impossible de mettre à jour la permission '{permission}' : {error}",
"permission_updated": "Permission '{permission}' mise à jour", "permission_updated": "Permission '{permission}' mise à jour",
"dyndns_provider_unreachable": "Impossible datteindre le fournisseur DynDNS {provider} : votre YunoHost nest pas correctement connecté à Internet ou le serveur Dynette est en panne.", "dyndns_provider_unreachable": "Impossible d'atteindre le fournisseur DynDNS {provider} : votre YunoHost n'est pas correctement connecté à Internet ou le serveur Dynette est en panne.",
"migrations_already_ran": "Ces migrations sont déjà effectuées : {ids}", "migrations_already_ran": "Ces migrations sont déjà effectuées : {ids}",
"migrations_dependencies_not_satisfied": "Exécutez ces migrations : '{dependencies_id}', avant migration {id}.", "migrations_dependencies_not_satisfied": "Exécutez ces migrations : '{dependencies_id}', avant migration {id}.",
"migrations_failed_to_load_migration": "Impossible de charger la migration {id} : {error}", "migrations_failed_to_load_migration": "Impossible de charger la migration {id} : {error}",
"migrations_running_forward": "Exécution de la migration {id}...", "migrations_running_forward": "Exécution de la migration {id}...",
"migrations_success_forward": "Migration {id} terminée", "migrations_success_forward": "Migration {id} terminée",
"operation_interrupted": "L'opération a-t-elle été interrompue manuellement ?", "operation_interrupted": "L'opération a-t-elle été interrompue manuellement ?",
"permission_already_exist": "Lautorisation '{permission}' existe déjà", "permission_already_exist": "L'autorisation '{permission}' existe déjà",
"permission_created": "Permission '{permission}' créée", "permission_created": "Permission '{permission}' créée",
"permission_creation_failed": "Impossible de créer lautorisation '{permission}' : {error}", "permission_creation_failed": "Impossible de créer l'autorisation '{permission}' : {error}",
"permission_deleted": "Permission '{permission}' supprimée", "permission_deleted": "Permission '{permission}' supprimée",
"permission_deletion_failed": "Impossible de supprimer la permission '{permission}' : {error}", "permission_deletion_failed": "Impossible de supprimer la permission '{permission}' : {error}",
"group_already_exist": "Le groupe {group} existe déjà", "group_already_exist": "Le groupe {group} existe déjà",
"group_already_exist_on_system": "Le groupe {group} existe déjà dans les groupes système", "group_already_exist_on_system": "Le groupe {group} existe déjà dans les groupes système",
"group_cannot_be_deleted": "Le groupe {group} ne peut pas être supprimé manuellement.", "group_cannot_be_deleted": "Le groupe {group} ne peut pas être supprimé manuellement.",
"group_user_already_in_group": "Lutilisateur {user} est déjà dans le groupe {group}", "group_user_already_in_group": "L'utilisateur {user} est déjà dans le groupe {group}",
"group_user_not_in_group": "Lutilisateur {user} nest pas dans le groupe {group}", "group_user_not_in_group": "L'utilisateur {user} n'est pas dans le groupe {group}",
"log_permission_create": "Créer permission '{}'", "log_permission_create": "Créer permission '{}'",
"log_permission_delete": "Supprimer permission '{}'", "log_permission_delete": "Supprimer permission '{}'",
"log_user_group_create": "Créer le groupe '{}'", "log_user_group_create": "Créer le groupe '{}'",
"log_user_permission_update": "Mise à jour des accès pour la permission '{}'", "log_user_permission_update": "Mise à jour des accès pour la permission '{}'",
"log_user_permission_reset": "Réinitialiser la permission '{}'", "log_user_permission_reset": "Réinitialiser la permission '{}'",
"permission_already_allowed": "Le groupe '{group}' a déjà lautorisation '{permission}' activée", "permission_already_allowed": "Le groupe '{group}' a déjà l'autorisation '{permission}' activée",
"permission_already_disallowed": "Le groupe '{group}' a déjà lautorisation '{permission}' désactivé", "permission_already_disallowed": "Le groupe '{group}' a déjà l'autorisation '{permission}' désactivé",
"permission_cannot_remove_main": "Supprimer une autorisation principale nest pas autorisé", "permission_cannot_remove_main": "Supprimer une autorisation principale n'est pas autorisé",
"user_already_exists": "Lutilisateur '{user}' existe déjà", "user_already_exists": "L'utilisateur '{user}' existe déjà",
"app_full_domain_unavailable": "Désolé, cette application doit être installée sur un domaine qui lui est propre, mais dautres applications sont déjà installées sur le domaine '{domain}'. Vous pouvez utiliser un sous-domaine dédié à cette application à la place.", "app_full_domain_unavailable": "Désolé, cette application doit être installée sur un domaine qui lui est propre, mais d'autres applications sont déjà installées sur le domaine '{domain}'. Vous pouvez utiliser un sous-domaine dédié à cette application à la place.",
"group_cannot_edit_all_users": "Le groupe 'all_users' ne peut pas être édité manuellement. Cest un groupe spécial destiné à contenir tous les utilisateurs enregistrés dans YunoHost", "group_cannot_edit_all_users": "Le groupe 'all_users' ne peut pas être édité manuellement. C'est un groupe spécial destiné à contenir tous les utilisateurs enregistrés dans YunoHost",
"group_cannot_edit_visitors": "Le groupe 'visiteurs' ne peut pas être édité manuellement. Cest un groupe spécial représentant les visiteurs anonymes", "group_cannot_edit_visitors": "Le groupe 'visiteurs' ne peut pas être édité manuellement. C'est un groupe spécial représentant les visiteurs anonymes",
"group_cannot_edit_primary_group": "Le groupe '{group}' ne peut pas être édité manuellement. Cest le groupe principal destiné à ne contenir quun utilisateur spécifique.", "group_cannot_edit_primary_group": "Le groupe '{group}' ne peut pas être édité manuellement. C'est le groupe principal destiné à ne contenir qu'un utilisateur spécifique.",
"log_permission_url": "Mise à jour de lURL associée à lautorisation '{}'", "log_permission_url": "Mise à jour de l'URL associée à l'autorisation '{}'",
"permission_already_up_to_date": "Lautorisation na pas été mise à jour car les demandes dajout/suppression correspondent déjà à létat actuel.", "permission_already_up_to_date": "L'autorisation n'a pas été mise à jour car les demandes d'ajout/suppression correspondent déjà à l'état actuel.",
"permission_currently_allowed_for_all_users": "Cette autorisation est actuellement accordée à tous les utilisateurs en plus des autres groupes. Vous voudrez probablement soit supprimer lautorisation 'all_users', soit supprimer les autres groupes auxquels il est actuellement autorisé.", "permission_currently_allowed_for_all_users": "Cette autorisation est actuellement accordée à tous les utilisateurs en plus des autres groupes. Vous voudrez probablement soit supprimer l'autorisation 'all_users', soit supprimer les autres groupes auxquels il est actuellement autorisé.",
"app_install_failed": "Impossible dinstaller {app} : {error}", "app_install_failed": "Impossible d'installer {app} : {error}",
"app_install_script_failed": "Une erreur est survenue dans le script dinstallation de lapplication", "app_install_script_failed": "Une erreur est survenue dans le script d'installation de l'application",
"permission_require_account": "Permission {permission} na de sens que pour les utilisateurs ayant un compte et ne peut donc pas être activé pour les visiteurs.", "permission_require_account": "Permission {permission} n'a de sens que pour les utilisateurs ayant un compte et ne peut donc pas être activé pour les visiteurs.",
"app_remove_after_failed_install": "Supprimer lapplication après léchec de linstallation...", "app_remove_after_failed_install": "Supprimer l'application après l'échec de l'installation...",
"diagnosis_cant_run_because_of_dep": "Impossible dexécuter le diagnostic pour {category} alors quil existe des problèmes importants liés à {dep}.", "diagnosis_cant_run_because_of_dep": "Impossible d'exécuter le diagnostic pour {category} alors qu'il existe des problèmes importants liés à {dep}.",
"diagnosis_found_errors": "Trouvé {errors} problème(s) significatif(s) lié(s) à {category} !", "diagnosis_found_errors": "Trouvé {errors} problème(s) significatif(s) lié(s) à {category} !",
"diagnosis_found_errors_and_warnings": "Trouvé {errors} problème(s) significatif(s) (et {warnings} (avertissement(s)) en relation avec {category} !", "diagnosis_found_errors_and_warnings": "Trouvé {errors} problème(s) significatif(s) (et {warnings} (avertissement(s)) en relation avec {category} !",
"diagnosis_ip_not_connected_at_all": "Le serveur ne semble pas du tout connecté à Internet !?", "diagnosis_ip_not_connected_at_all": "Le serveur ne semble pas du tout connecté à Internet !?",
"diagnosis_ip_weird_resolvconf": "La résolution DNS semble fonctionner, mais il semble que vous utilisez un <code>/etc/resolv.conf</code> personnalisé.", "diagnosis_ip_weird_resolvconf": "La résolution DNS semble fonctionner, mais il semble que vous utilisez un <code>/etc/resolv.conf</code> personnalisé.",
"diagnosis_ip_weird_resolvconf_details": "Le fichier <code>/etc/resolv.conf</code> doit être un lien symbolique vers <code>/etc/resolvconf/run/resolv.conf</code> lui-même pointant vers <code>127.0.0.1</code> (dnsmasq). Si vous souhaitez configurer manuellement les résolveurs DNS, veuillez modifier <code>/etc/resolv.dnsmasq.conf</code>.", "diagnosis_ip_weird_resolvconf_details": "Le fichier <code>/etc/resolv.conf</code> doit être un lien symbolique vers <code>/etc/resolvconf/run/resolv.conf</code> lui-même pointant vers <code>127.0.0.1</code> (dnsmasq). Si vous souhaitez configurer manuellement les résolveurs DNS, veuillez modifier <code>/etc/resolv.dnsmasq.conf</code>.",
"diagnosis_dns_missing_record": "Selon la configuration DNS recommandée, vous devez ajouter un enregistrement DNS<br>Type : <code>{type}</code><br>Nom : <code>{name}</code><br>Valeur : <code>{value}</code>", "diagnosis_dns_missing_record": "Selon la configuration DNS recommandée, vous devez ajouter un enregistrement DNS<br>Type : <code>{type}</code><br>Nom : <code>{name}</code><br>Valeur : <code>{value}</code>",
"diagnosis_diskusage_ok": "Lespace de stockage <code>{mountpoint}</code> (sur le périphérique <code>{device}</code>) a encore {free} ({free_percent}%) espace restant (sur {total}) !", "diagnosis_diskusage_ok": "L'espace de stockage <code>{mountpoint}</code> (sur le périphérique <code>{device}</code>) a encore {free} ({free_percent}%) espace restant (sur {total}) !",
"diagnosis_ram_ok": "Le système dispose encore de {available} ({available_percent}%) de RAM sur {total}.", "diagnosis_ram_ok": "Le système dispose encore de {available} ({available_percent}%) de RAM sur {total}.",
"diagnosis_regenconf_allgood": "Tous les fichiers de configuration sont conformes à la configuration recommandée !", "diagnosis_regenconf_allgood": "Tous les fichiers de configuration sont conformes à la configuration recommandée !",
"diagnosis_security_vulnerable_to_meltdown": "Vous semblez vulnérable à la vulnérabilité de sécurité critique de Meltdown", "diagnosis_security_vulnerable_to_meltdown": "Vous semblez vulnérable à la vulnérabilité de sécurité critique de Meltdown",
@ -429,7 +429,7 @@
"diagnosis_basesystem_kernel": "Le serveur utilise le noyau Linux {kernel_version}", "diagnosis_basesystem_kernel": "Le serveur utilise le noyau Linux {kernel_version}",
"diagnosis_basesystem_ynh_single_version": "{package} version : {version} ({repo})", "diagnosis_basesystem_ynh_single_version": "{package} version : {version} ({repo})",
"diagnosis_basesystem_ynh_main_version": "Le serveur utilise YunoHost {main_version} ({repo})", "diagnosis_basesystem_ynh_main_version": "Le serveur utilise YunoHost {main_version} ({repo})",
"diagnosis_basesystem_ynh_inconsistent_versions": "Vous exécutez des versions incohérentes des packages YunoHost ... très probablement en raison dune mise à niveau échouée ou partielle.", "diagnosis_basesystem_ynh_inconsistent_versions": "Vous exécutez des versions incohérentes des packages YunoHost ... très probablement en raison d'une mise à niveau échouée ou partielle.",
"diagnosis_failed_for_category": "Échec du diagnostic pour la catégorie '{category}': {error}", "diagnosis_failed_for_category": "Échec du diagnostic pour la catégorie '{category}': {error}",
"diagnosis_cache_still_valid": "(Le cache est encore valide pour le diagnostic {category}. Il ne sera pas re-diagnostiqué pour le moment !)", "diagnosis_cache_still_valid": "(Le cache est encore valide pour le diagnostic {category}. Il ne sera pas re-diagnostiqué pour le moment !)",
"diagnosis_ignored_issues": "(+ {nb_ignored} problème(s) ignoré(s))", "diagnosis_ignored_issues": "(+ {nb_ignored} problème(s) ignoré(s))",
@ -437,30 +437,30 @@
"diagnosis_everything_ok": "Tout semble bien pour {category} !", "diagnosis_everything_ok": "Tout semble bien pour {category} !",
"diagnosis_failed": "Échec de la récupération du résultat du diagnostic pour la catégorie '{category}' : {error}", "diagnosis_failed": "Échec de la récupération du résultat du diagnostic pour la catégorie '{category}' : {error}",
"diagnosis_ip_connected_ipv4": "Le serveur est connecté à Internet en IPv4 !", "diagnosis_ip_connected_ipv4": "Le serveur est connecté à Internet en IPv4 !",
"diagnosis_ip_no_ipv4": "Le serveur ne dispose pas dune adresse IPv4.", "diagnosis_ip_no_ipv4": "Le serveur ne dispose pas d'une adresse IPv4.",
"diagnosis_ip_connected_ipv6": "Le serveur est connecté à Internet en IPv6 !", "diagnosis_ip_connected_ipv6": "Le serveur est connecté à Internet en IPv6 !",
"diagnosis_ip_no_ipv6": "Le serveur ne dispose pas dune adresse IPv6.", "diagnosis_ip_no_ipv6": "Le serveur ne dispose pas d'une adresse IPv6.",
"diagnosis_ip_dnsresolution_working": "La résolution de nom de domaine fonctionne !", "diagnosis_ip_dnsresolution_working": "La résolution de nom de domaine fonctionne !",
"diagnosis_ip_broken_dnsresolution": "La résolution du nom de domaine semble interrompue pour une raison quelconque Un pare-feu bloque-t-il les requêtes DNS ?", "diagnosis_ip_broken_dnsresolution": "La résolution du nom de domaine semble interrompue pour une raison quelconque ... Un pare-feu bloque-t-il les requêtes DNS ?",
"diagnosis_ip_broken_resolvconf": "La résolution du nom de domaine semble être cassée sur votre serveur, ce qui semble lié au fait que <code>/etc/resolv.conf</code> ne pointe pas vers <code>127.0.0.1</code>.", "diagnosis_ip_broken_resolvconf": "La résolution du nom de domaine semble être cassée sur votre serveur, ce qui semble lié au fait que <code>/etc/resolv.conf</code> ne pointe pas vers <code>127.0.0.1</code>.",
"diagnosis_dns_good_conf": "Les enregistrements DNS sont correctement configurés pour le domaine {domain} (catégorie {category})", "diagnosis_dns_good_conf": "Les enregistrements DNS sont correctement configurés pour le domaine {domain} (catégorie {category})",
"diagnosis_dns_bad_conf": "Certains enregistrements DNS sont manquants ou incorrects pour le domaine {domain} (catégorie {category})", "diagnosis_dns_bad_conf": "Certains enregistrements DNS sont manquants ou incorrects pour le domaine {domain} (catégorie {category})",
"diagnosis_dns_discrepancy": "Cet enregistrement DNS ne semble pas correspondre à la configuration recommandée : <br>Type : <code>{type}</code><br>Nom : <code>{name}</code><br> La valeur actuelle est : <code>{current}</code><br> La valeur attendue est : <code>{value}</code>", "diagnosis_dns_discrepancy": "Cet enregistrement DNS ne semble pas correspondre à la configuration recommandée : <br>Type : <code>{type}</code><br>Nom : <code>{name}</code><br> La valeur actuelle est : <code>{current}</code><br> La valeur attendue est : <code>{value}</code>",
"diagnosis_services_bad_status": "Le service {service} est {status} :-(", "diagnosis_services_bad_status": "Le service {service} est {status} :-(",
"diagnosis_diskusage_verylow": "L'espace de stockage <code>{mountpoint}</code> (sur lappareil <code>{device}</code>) ne dispose que de {free} ({free_percent}%) espace restant (sur {total}). Vous devriez vraiment envisager de nettoyer de lespace !", "diagnosis_diskusage_verylow": "L'espace de stockage <code>{mountpoint}</code> (sur l'appareil <code>{device}</code>) ne dispose que de {free} ({free_percent}%) espace restant (sur {total}). Vous devriez vraiment envisager de nettoyer de l'espace !",
"diagnosis_diskusage_low": "L'espace de stockage <code>{mountpoint}</code> (sur l'appareil <code>{device}</code>) ne dispose que de {free} ({free_percent}%) espace restant (sur {total}). Faites attention.", "diagnosis_diskusage_low": "L'espace de stockage <code>{mountpoint}</code> (sur l'appareil <code>{device}</code>) ne dispose que de {free} ({free_percent}%) espace restant (sur {total}). Faites attention.",
"diagnosis_ram_verylow": "Le système ne dispose plus que de {available} ({available_percent}%)! (sur {total})", "diagnosis_ram_verylow": "Le système ne dispose plus que de {available} ({available_percent}%)! (sur {total})",
"diagnosis_ram_low": "Le système na plus de {available} ({available_percent}%) RAM sur {total}. Faites attention.", "diagnosis_ram_low": "Le système n'a plus de {available} ({available_percent}%) RAM sur {total}. Faites attention.",
"diagnosis_swap_none": "Le système na aucun espace de swap. Vous devriez envisager dajouter au moins {recommended} de swap pour éviter les situations où le système manque de mémoire.", "diagnosis_swap_none": "Le système n'a aucun espace de swap. Vous devriez envisager d'ajouter au moins {recommended} de swap pour éviter les situations où le système manque de mémoire.",
"diagnosis_swap_notsomuch": "Le système ne dispose que de {total} de swap. Vous devez envisager davoir au moins {recommended} pour éviter les situations où le système manque de mémoire.", "diagnosis_swap_notsomuch": "Le système ne dispose que de {total} de swap. Vous devez envisager d'avoir au moins {recommended} pour éviter les situations où le système manque de mémoire.",
"diagnosis_swap_ok": "Le système dispose de {total} de swap !", "diagnosis_swap_ok": "Le système dispose de {total} de swap !",
"diagnosis_regenconf_manually_modified": "Le fichier de configuration <code>{file}</code> semble avoir été modifié manuellement.", "diagnosis_regenconf_manually_modified": "Le fichier de configuration <code>{file}</code> semble avoir été modifié manuellement.",
"diagnosis_regenconf_manually_modified_details": "Cest probablement OK si vous savez ce que vous faites ! YunoHost cessera de mettre à jour ce fichier automatiquement ... Mais attention, les mises à jour de YunoHost pourraient contenir dimportantes modifications recommandées. Si vous le souhaitez, vous pouvez inspecter les différences avec <cmd>yunohost tools regen-conf {category} --dry-run --with-diff</cmd> et forcer la réinitialisation à la configuration recommandée avec <cmd>yunohost tools regen-conf {category} --force</cmd>", "diagnosis_regenconf_manually_modified_details": "C'est probablement OK si vous savez ce que vous faites ! YunoHost cessera de mettre à jour ce fichier automatiquement ... Mais attention, les mises à jour de YunoHost pourraient contenir d'importantes modifications recommandées. Si vous le souhaitez, vous pouvez inspecter les différences avec <cmd>yunohost tools regen-conf {category} --dry-run --with-diff</cmd> et forcer la réinitialisation à la configuration recommandée avec <cmd>yunohost tools regen-conf {category} --force</cmd>",
"apps_catalog_init_success": "Système de catalogue dapplications initialisé !", "apps_catalog_init_success": "Système de catalogue d'applications initialisé !",
"apps_catalog_failed_to_download": "Impossible de télécharger le catalogue des applications {apps_catalog} : {error}", "apps_catalog_failed_to_download": "Impossible de télécharger le catalogue des applications {apps_catalog} : {error}",
"diagnosis_mail_outgoing_port_25_blocked": "Le port sortant 25 semble être bloqué. Vous devriez essayer de le débloquer dans le panneau de configuration de votre fournisseur de services Internet (ou hébergeur). En attendant, le serveur ne pourra pas envoyer des courriels à dautres serveurs.", "diagnosis_mail_outgoing_port_25_blocked": "Le port sortant 25 semble être bloqué. Vous devriez essayer de le débloquer dans le panneau de configuration de votre fournisseur de services Internet (ou hébergeur). En attendant, le serveur ne pourra pas envoyer des emails à d'autres serveurs.",
"domain_cannot_remove_main_add_new_one": "Vous ne pouvez pas supprimer '{domain}' car il sagit du domaine principal et de votre seul domaine. Vous devez dabord ajouter un autre domaine à laide de 'yunohost domain add <another-domain.com>', puis définir comme domaine principal à laide de 'yunohost domain main-domain -n <nom-dun-autre-domaine.com>' et vous pouvez ensuite supprimer le domaine '{domain}' à laide de 'yunohost domain remove {domain}'.'", "domain_cannot_remove_main_add_new_one": "Vous ne pouvez pas supprimer '{domain}' car il s'agit du domaine principal et de votre seul domaine. Vous devez d'abord ajouter un autre domaine à l'aide de 'yunohost domain add <another-domain.com>', puis définir comme domaine principal à l'aide de 'yunohost domain main-domain -n <nom-d'un-autre-domaine.com>' et vous pouvez ensuite supprimer le domaine '{domain}' à l'aide de 'yunohost domain remove {domain}'.'",
"diagnosis_security_vulnerable_to_meltdown_details": "Pour résoudre ce problème, vous devez mettre à niveau votre système et redémarrer pour charger le nouveau noyau Linux (ou contacter votre fournisseur de serveur si cela ne fonctionne pas). Voir https://meltdownattack.com/ pour plus dinformations.", "diagnosis_security_vulnerable_to_meltdown_details": "Pour résoudre ce problème, vous devez mettre à niveau votre système et redémarrer pour charger le nouveau noyau Linux (ou contacter votre fournisseur de serveur si cela ne fonctionne pas). Voir https://meltdownattack.com/ pour plus d'informations.",
"diagnosis_description_basesystem": "Système de base", "diagnosis_description_basesystem": "Système de base",
"diagnosis_description_ip": "Connectivité Internet", "diagnosis_description_ip": "Connectivité Internet",
"diagnosis_description_dnsrecords": "Enregistrements DNS", "diagnosis_description_dnsrecords": "Enregistrements DNS",
@ -470,76 +470,76 @@
"diagnosis_description_regenconf": "Configurations système", "diagnosis_description_regenconf": "Configurations système",
"diagnosis_ports_could_not_diagnose": "Impossible de diagnostiquer si les ports sont accessibles de l'extérieur.", "diagnosis_ports_could_not_diagnose": "Impossible de diagnostiquer si les ports sont accessibles de l'extérieur.",
"diagnosis_ports_could_not_diagnose_details": "Erreur : {error}", "diagnosis_ports_could_not_diagnose_details": "Erreur : {error}",
"apps_catalog_updating": "Mise à jour du catalogue dapplications…", "apps_catalog_updating": "Mise à jour du catalogue d'applications...",
"apps_catalog_obsolete_cache": "Le cache du catalogue d'applications est vide ou obsolète.", "apps_catalog_obsolete_cache": "Le cache du catalogue d'applications est vide ou obsolète.",
"apps_catalog_update_success": "Le catalogue des applications a été mis à jour !", "apps_catalog_update_success": "Le catalogue des applications a été mis à jour !",
"diagnosis_description_mail": "Email", "diagnosis_description_mail": "Email",
"diagnosis_ports_unreachable": "Le port {port} nest pas accessible de lextérieur.", "diagnosis_ports_unreachable": "Le port {port} n'est pas accessible de l'extérieur.",
"diagnosis_ports_ok": "Le port {port} est accessible de lextérieur.", "diagnosis_ports_ok": "Le port {port} est accessible de l'extérieur.",
"diagnosis_http_could_not_diagnose": "Impossible de diagnostiquer si le domaine est accessible de lextérieur.", "diagnosis_http_could_not_diagnose": "Impossible de diagnostiquer si le domaine est accessible de l'extérieur.",
"diagnosis_http_could_not_diagnose_details": "Erreur : {error}", "diagnosis_http_could_not_diagnose_details": "Erreur : {error}",
"diagnosis_http_ok": "Le domaine {domain} est accessible en HTTP depuis lextérieur.", "diagnosis_http_ok": "Le domaine {domain} est accessible en HTTP depuis l'extérieur.",
"diagnosis_http_unreachable": "Le domaine {domain} est inaccessible en HTTP depuis lextérieur.", "diagnosis_http_unreachable": "Le domaine {domain} est inaccessible en HTTP depuis l'extérieur.",
"diagnosis_unknown_categories": "Les catégories suivantes sont inconnues : {categories}", "diagnosis_unknown_categories": "Les catégories suivantes sont inconnues : {categories}",
"app_upgrade_script_failed": "Une erreur sest produite durant lexécution du script de mise à niveau de lapplication", "app_upgrade_script_failed": "Une erreur s'est produite durant l'exécution du script de mise à niveau de l'application",
"diagnosis_services_running": "Le service {service} est en cours de fonctionnement !", "diagnosis_services_running": "Le service {service} est en cours de fonctionnement !",
"diagnosis_services_conf_broken": "La configuration est cassée pour le service {service} !", "diagnosis_services_conf_broken": "La configuration est cassée pour le service {service} !",
"diagnosis_ports_needed_by": "Rendre ce port accessible est nécessaire pour les fonctionnalités de type {category} (service {service})", "diagnosis_ports_needed_by": "Rendre ce port accessible est nécessaire pour les fonctionnalités de type {category} (service {service})",
"diagnosis_ports_forwarding_tip": "Pour résoudre ce problème, vous devez probablement configurer la redirection de port sur votre routeur Internet comme décrit dans <a href='https://yunohost.org/isp_box_config'>https://yunohost.org/isp_box_config</a>", "diagnosis_ports_forwarding_tip": "Pour résoudre ce problème, vous devez probablement configurer la redirection de port sur votre routeur Internet comme décrit dans <a href='https://yunohost.org/isp_box_config'>https://yunohost.org/isp_box_config</a>",
"diagnosis_http_connection_error": "Erreur de connexion : impossible de se connecter au domaine demandé, il est probablement injoignable.", "diagnosis_http_connection_error": "Erreur de connexion : impossible de se connecter au domaine demandé, il est probablement injoignable.",
"diagnosis_no_cache": "Pas encore de cache de diagnostique pour la catégorie « {category} »", "diagnosis_no_cache": "Pas encore de cache de diagnostique pour la catégorie '{category}'",
"yunohost_postinstall_end_tip": "La post-installation terminée ! Pour finaliser votre configuration, il est recommandé de :\n- ajouter un premier utilisateur depuis la section \"Utilisateurs\" de linterface web (ou 'yunohost user create <nom dutilisateur>' en ligne de commande) ;\n- diagnostiquer les potentiels problèmes dans la section \"Diagnostic\" de l'interface web (ou 'yunohost diagnosis run' en ligne de commande) ;\n- lire les parties 'Finalisation de votre configuration' et 'Découverte de YunoHost' dans le guide de ladministrateur : https://yunohost.org/admindoc.", "yunohost_postinstall_end_tip": "La post-installation terminée ! Pour finaliser votre configuration, il est recommandé de :\n- ajouter un premier utilisateur depuis la section \"Utilisateurs\" de l'interface web (ou 'yunohost user create <nom d'utilisateur>' en ligne de commande) ;\n- diagnostiquer les potentiels problèmes dans la section \"Diagnostic\" de l'interface web (ou 'yunohost diagnosis run' en ligne de commande) ;\n- lire les parties 'Finalisation de votre configuration' et 'Découverte de YunoHost' dans le guide de l'administrateur : https://yunohost.org/admindoc.",
"diagnosis_services_bad_status_tip": "Vous pouvez essayer de <a href='#/services/{service}'>redémarrer le service</a>, et si cela ne fonctionne pas, consultez <a href='#/services/{service}'>les journaux de service dans le webadmin</a> (à partir de la ligne de commande, vous pouvez le faire avec <cmd>yunohost service restart {service}</cmd> et <cmd>yunohost service log {service}</cmd> ).", "diagnosis_services_bad_status_tip": "Vous pouvez essayer de <a href='#/services/{service}'>redémarrer le service</a>, et si cela ne fonctionne pas, consultez <a href='#/services/{service}'>les journaux de service dans le webadmin</a> (à partir de la ligne de commande, vous pouvez le faire avec <cmd>yunohost service restart {service}</cmd> et <cmd>yunohost service log {service}</cmd> ).",
"diagnosis_http_bad_status_code": "Le système de diagnostique na pas réussi à contacter votre serveur. Il se peut quune autre machine réponde à la place de votre serveur. Vérifiez que le port 80 est correctement redirigé, que votre configuration Nginx est à jour et quun reverse-proxy ninterfère pas.", "diagnosis_http_bad_status_code": "Le système de diagnostique n'a pas réussi à contacter votre serveur. Il se peut qu'une autre machine réponde à la place de votre serveur. Vérifiez que le port 80 est correctement redirigé, que votre configuration Nginx est à jour et qu'un reverse-proxy n'interfère pas.",
"diagnosis_http_timeout": "Expiration du délai en essayant de contacter votre serveur de lextérieur. Il semble être inaccessible. Vérifiez que vous transférez correctement le port 80, que Nginx est en cours dexécution et quun pare-feu ninterfère pas.", "diagnosis_http_timeout": "Expiration du délai en essayant de contacter votre serveur de l'extérieur. Il semble être inaccessible. Vérifiez que vous transférez correctement le port 80, que Nginx est en cours d'exécution et qu'un pare-feu n'interfère pas.",
"global_settings_setting_pop3_enabled": "Activer le protocole POP3 pour le serveur de messagerie", "global_settings_setting_pop3_enabled": "Activer le protocole POP3 pour le serveur de messagerie",
"log_app_action_run": "Lancer laction de lapplication '{}'", "log_app_action_run": "Lancer l'action de l'application '{}'",
"log_app_config_show_panel": "Montrer le panneau de configuration de lapplication '{}'", "log_app_config_show_panel": "Montrer le panneau de configuration de l'application '{}'",
"log_app_config_apply": "Appliquer la configuration à lapplication '{}'", "log_app_config_apply": "Appliquer la configuration à l'application '{}'",
"diagnosis_never_ran_yet": "Il apparaît que le serveur a été installé récemment et quil ny a pas encore eu de diagnostic. Vous devriez en lancer un depuis la web-admin ou en utilisant 'yunohost diagnosis run' depuis la ligne de commande.", "diagnosis_never_ran_yet": "Il apparaît que le serveur a été installé récemment et qu'il n'y a pas encore eu de diagnostic. Vous devriez en lancer un depuis la webadmin ou en utilisant 'yunohost diagnosis run' depuis la ligne de commande.",
"diagnosis_description_web": "Web", "diagnosis_description_web": "Web",
"diagnosis_basesystem_hardware": "Larchitecture du serveur est {virt} {arch}", "diagnosis_basesystem_hardware": "L'architecture du serveur est {virt} {arch}",
"group_already_exist_on_system_but_removing_it": "Le groupe {group} est déjà présent dans les groupes du système, mais YunoHost va le supprimer...", "group_already_exist_on_system_but_removing_it": "Le groupe {group} est déjà présent dans les groupes du système, mais YunoHost va le supprimer...",
"certmanager_warning_subdomain_dns_record": "Le sous-domaine '{subdomain}' ne résout pas vers la même adresse IP que '{domain}'. Certaines fonctionnalités seront indisponibles tant que vous naurez pas corrigé cela et regénéré le certificat.", "certmanager_warning_subdomain_dns_record": "Le sous-domaine '{subdomain}' ne résout pas vers la même adresse IP que '{domain}'. Certaines fonctionnalités seront indisponibles tant que vous n'aurez pas corrigé cela et regénéré le certificat.",
"domain_cannot_add_xmpp_upload": "Vous ne pouvez pas ajouter de domaine commençant par 'xmpp-upload.'. Ce type de nom est réservé à la fonctionnalité dupload XMPP intégrée dans YunoHost.", "domain_cannot_add_xmpp_upload": "Vous ne pouvez pas ajouter de domaine commençant par 'xmpp-upload.'. Ce type de nom est réservé à la fonctionnalité d'upload XMPP intégrée dans YunoHost.",
"diagnosis_mail_outgoing_port_25_ok": "Le serveur de messagerie SMTP peut envoyer des courriels (le port sortant 25 n'est pas bloqué).", "diagnosis_mail_outgoing_port_25_ok": "Le serveur de messagerie SMTP peut envoyer des emails (le port sortant 25 n'est pas bloqué).",
"diagnosis_mail_outgoing_port_25_blocked_details": "Vous devez dabord essayer de débloquer le port sortant 25 dans votre interface de routeur Internet ou votre interface dhébergement. (Certains hébergeurs peuvent vous demander de leur envoyer un ticket de support pour cela).", "diagnosis_mail_outgoing_port_25_blocked_details": "Vous devez d'abord essayer de débloquer le port sortant 25 dans votre interface de routeur Internet ou votre interface d'hébergement. (Certains hébergeurs peuvent vous demander de leur envoyer un ticket de support pour cela).",
"diagnosis_mail_ehlo_bad_answer": "Un service non SMTP a répondu sur le port 25 en IPv{ipversion}", "diagnosis_mail_ehlo_bad_answer": "Un service non SMTP a répondu sur le port 25 en IPv{ipversion}",
"diagnosis_mail_ehlo_bad_answer_details": "Cela peut être dû à une autre machine qui répond au lieu de votre serveur.", "diagnosis_mail_ehlo_bad_answer_details": "Cela peut être dû à une autre machine qui répond au lieu de votre serveur.",
"diagnosis_mail_ehlo_wrong": "Un autre serveur de messagerie SMTP répond sur IPv{ipversion}. Votre serveur ne sera probablement pas en mesure de recevoir des courriel.", "diagnosis_mail_ehlo_wrong": "Un autre serveur de messagerie SMTP répond sur IPv{ipversion}. Votre serveur ne sera probablement pas en mesure de recevoir des email.",
"diagnosis_mail_ehlo_could_not_diagnose": "Impossible de diagnostiquer si le serveur de messagerie postfix est accessible de lextérieur en IPv{ipversion}.", "diagnosis_mail_ehlo_could_not_diagnose": "Impossible de diagnostiquer si le serveur de messagerie postfix est accessible de l'extérieur en IPv{ipversion}.",
"diagnosis_mail_ehlo_could_not_diagnose_details": "Erreur : {error}", "diagnosis_mail_ehlo_could_not_diagnose_details": "Erreur : {error}",
"diagnosis_mail_fcrdns_dns_missing": "Aucun DNS inverse nest défini pour IPv{ipversion}. Certains emails seront peut-être refusés ou considérés comme des spam.", "diagnosis_mail_fcrdns_dns_missing": "Aucun DNS inverse n'est défini pour IPv{ipversion}. Certains emails seront peut-être refusés ou considérés comme des spam.",
"diagnosis_mail_fcrdns_ok": "Votre DNS inverse est correctement configuré !", "diagnosis_mail_fcrdns_ok": "Votre DNS inverse est correctement configuré !",
"diagnosis_mail_fcrdns_nok_details": "Vous devez dabord essayer de configurer le DNS inverse avec <code>{ehlo_domain}</code> dans votre interface de routeur Internet ou votre interface dhébergement. (Certains hébergeurs peuvent vous demander de leur envoyer un ticket de support pour cela).", "diagnosis_mail_fcrdns_nok_details": "Vous devez d'abord essayer de configurer le DNS inverse avec <code>{ehlo_domain}</code> dans votre interface de routeur Internet ou votre interface d'hébergement. (Certains hébergeurs peuvent vous demander de leur envoyer un ticket de support pour cela).",
"diagnosis_mail_fcrdns_different_from_ehlo_domain": "Le DNS inverse n'est pas correctement configuré en IPv{ipversion}. Certains emails seront peut-être refusés ou considérés comme des spam.", "diagnosis_mail_fcrdns_different_from_ehlo_domain": "Le DNS inverse n'est pas correctement configuré en IPv{ipversion}. Certains emails seront peut-être refusés ou considérés comme des spam.",
"diagnosis_mail_blacklist_ok": "Les adresses IP et les domaines utilisés par ce serveur ne semblent pas être sur liste noire", "diagnosis_mail_blacklist_ok": "Les adresses IP et les domaines utilisés par ce serveur ne semblent pas être sur liste noire",
"diagnosis_mail_blacklist_reason": "La raison de la liste noire est : {reason}", "diagnosis_mail_blacklist_reason": "La raison de la liste noire est : {reason}",
"diagnosis_mail_blacklist_website": "Après avoir identifié la raison pour laquelle vous êtes répertorié et l'avoir corrigé, nhésitez pas à demander le retrait de votre IP ou domaine sur {blacklist_website}", "diagnosis_mail_blacklist_website": "Après avoir identifié la raison pour laquelle vous êtes répertorié et l'avoir corrigé, n'hésitez pas à demander le retrait de votre IP ou domaine sur {blacklist_website}",
"diagnosis_mail_queue_ok": "{nb_pending} emails en attente dans les files d'attente de messagerie", "diagnosis_mail_queue_ok": "{nb_pending} emails en attente dans les files d'attente de messagerie",
"diagnosis_mail_queue_unavailable_details": "Erreur : {error}", "diagnosis_mail_queue_unavailable_details": "Erreur : {error}",
"diagnosis_mail_queue_too_big": "Trop demails en attente dans la file d'attente ({nb_pending} e-mails)", "diagnosis_mail_queue_too_big": "Trop d'emails en attente dans la file d'attente ({nb_pending} emails)",
"global_settings_setting_smtp_allow_ipv6": "Autoriser l'utilisation dIPv6 pour recevoir et envoyer du courrier", "global_settings_setting_smtp_allow_ipv6": "Autoriser l'utilisation d'IPv6 pour recevoir et envoyer du courrier",
"diagnosis_display_tip": "Pour voir les problèmes détectés, vous pouvez accéder à la section Diagnostic du webadmin ou exécuter « yunohost diagnosis show --issues --human-readable» à partir de la ligne de commande.", "diagnosis_display_tip": "Pour voir les problèmes détectés, vous pouvez accéder à la section Diagnostic du webadmin ou exécuter 'yunohost diagnosis show --issues --human-readable' à partir de la ligne de commande.",
"diagnosis_ip_global": "IP globale : <code>{global}</code>", "diagnosis_ip_global": "IP globale : <code>{global}</code>",
"diagnosis_ip_local": "IP locale : <code>{local}</code>", "diagnosis_ip_local": "IP locale : <code>{local}</code>",
"diagnosis_dns_point_to_doc": "Veuillez consulter la documentation sur <a href='https://yunohost.org/dns_config'>https://yunohost.org/dns_config</a> si vous avez besoin daide pour configurer les enregistrements DNS.", "diagnosis_dns_point_to_doc": "Veuillez consulter la documentation sur <a href='https://yunohost.org/dns_config'>https://yunohost.org/dns_config</a> si vous avez besoin d'aide pour configurer les enregistrements DNS.",
"diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Certains fournisseurs ne vous laisseront pas débloquer le port sortant 25 parce quils ne se soucient pas de la neutralité du Net. <br> - Certains dentre eux offrent lalternative d'<a href='https://yunohost.org/#/email_configure_relay'>utiliser un serveur de messagerie relai</a> bien que cela implique que le relai sera en mesure despionner votre trafic de messagerie. <br> - Une alternative respectueuse de la vie privée consiste à utiliser un VPN *avec une IP publique dédiée* pour contourner ce type de limites. Voir <a href='https://yunohost.org/#/vpn_advantage'>https://yunohost.org/#/vpn_advantage</a> <br> - Vous pouvez également envisager de passer à <a href='https://yunohost.org/#/isp'>un fournisseur plus respectueux de la neutralité du net</a>", "diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Certains fournisseurs ne vous laisseront pas débloquer le port sortant 25 parce qu'ils ne se soucient pas de la neutralité du Net. <br> - Certains d'entre eux offrent l'alternative d'<a href='https://yunohost.org/#/email_configure_relay'>utiliser un serveur de messagerie relai</a> bien que cela implique que le relai sera en mesure d'espionner votre trafic de messagerie. <br> - Une alternative respectueuse de la vie privée consiste à utiliser un VPN *avec une IP publique dédiée* pour contourner ce type de limites. Voir <a href='https://yunohost.org/#/vpn_advantage'>https://yunohost.org/#/vpn_advantage</a> <br> - Vous pouvez également envisager de passer à <a href='https://yunohost.org/#/isp'>un fournisseur plus respectueux de la neutralité du net</a>",
"diagnosis_mail_ehlo_ok": "Le serveur de messagerie SMTP est accessible de l'extérieur et peut donc recevoir des courriels !", "diagnosis_mail_ehlo_ok": "Le serveur de messagerie SMTP est accessible de l'extérieur et peut donc recevoir des emails !",
"diagnosis_mail_ehlo_unreachable": "Le serveur de messagerie SMTP est inaccessible de lextérieur en IPv{ipversion}. Il ne pourra pas recevoir des courriels.", "diagnosis_mail_ehlo_unreachable": "Le serveur de messagerie SMTP est inaccessible de l'extérieur en IPv{ipversion}. Il ne pourra pas recevoir des emails.",
"diagnosis_mail_ehlo_unreachable_details": "Impossible d'ouvrir une connexion sur le port 25 à votre serveur en IPv{ipversion}. Il semble inaccessible. <br> 1. La cause la plus courante de ce problème est que le port 25 <a href='https://yunohost.org/isp_box_config'>n'est pas correctement redirigé vers votre serveur</a>. <br> 2. Vous devez également vous assurer que le service postfix est en cours d'exécution. <br> 3. Sur les configurations plus complexes: assurez-vous qu'aucun pare-feu ou proxy inversé n'interfère.", "diagnosis_mail_ehlo_unreachable_details": "Impossible d'ouvrir une connexion sur le port 25 à votre serveur en IPv{ipversion}. Il semble inaccessible. <br> 1. La cause la plus courante de ce problème est que le port 25 <a href='https://yunohost.org/isp_box_config'>n'est pas correctement redirigé vers votre serveur</a>. <br> 2. Vous devez également vous assurer que le service postfix est en cours d'exécution. <br> 3. Sur les configurations plus complexes: assurez-vous qu'aucun pare-feu ou proxy inversé n'interfère.",
"diagnosis_mail_ehlo_wrong_details": "Le EHLO reçu par le serveur de diagnostique distant en IPv{ipversion} est différent du domaine de votre serveur. <br> EHLO reçu: <code>{wrong_ehlo}</code> <br> Attendu : <code>{right_ehlo}</code> <br> La cause la plus courante ce problème est que le port 25 <a href='https://yunohost.org/isp_box_config'> nest pas correctement redirigé vers votre serveur </a>. Vous pouvez également vous assurer quaucun pare-feu ou proxy inversé ninterfère.", "diagnosis_mail_ehlo_wrong_details": "Le EHLO reçu par le serveur de diagnostique distant en IPv{ipversion} est différent du domaine de votre serveur. <br> EHLO reçu: <code>{wrong_ehlo}</code> <br> Attendu : <code>{right_ehlo}</code> <br> La cause la plus courante ce problème est que le port 25 <a href='https://yunohost.org/isp_box_config'> n'est pas correctement redirigé vers votre serveur </a>. Vous pouvez également vous assurer qu'aucun pare-feu ou proxy inversé n'interfère.",
"diagnosis_mail_fcrdns_nok_alternatives_4": "Certains fournisseurs ne vous laisseront pas configurer votre DNS inversé (ou leur fonctionnalité pourrait être cassée...). Si vous rencontrez des problèmes à cause de cela, envisagez les solutions suivantes : <br> - Certains FAI fournissent lalternative de <a href='https://yunohost.org/#/email_configure_relay'>à laide dun relais de serveur de messagerie</a> bien que cela implique que le relais pourra espionner votre trafic de messagerie. <br> - Une alternative respectueuse de la vie privée consiste à utiliser un VPN *avec une IP publique dédiée* pour contourner ce type de limites. Voir <a href='https://yunohost.org/#/vpn_advantage'>https://yunohost.org/#/vpn_advantage</a> <br> - Enfin, il est également possible de <a href='https://yunohost.org/#/isp'>changer de fournisseur</a>", "diagnosis_mail_fcrdns_nok_alternatives_4": "Certains fournisseurs ne vous laisseront pas configurer votre DNS inversé (ou leur fonctionnalité pourrait être cassée...). Si vous rencontrez des problèmes à cause de cela, envisagez les solutions suivantes : <br> - Certains FAI fournissent l'alternative de <a href='https://yunohost.org/#/email_configure_relay'>à l'aide d'un relais de serveur de messagerie</a> bien que cela implique que le relais pourra espionner votre trafic de messagerie. <br> - Une alternative respectueuse de la vie privée consiste à utiliser un VPN *avec une IP publique dédiée* pour contourner ce type de limites. Voir <a href='https://yunohost.org/#/vpn_advantage'>https://yunohost.org/#/vpn_advantage</a> <br> - Enfin, il est également possible de <a href='https://yunohost.org/#/isp'>changer de fournisseur</a>",
"diagnosis_mail_fcrdns_nok_alternatives_6": "Certains fournisseurs ne vous laisseront pas configurer votre DNS inversé (ou leur fonctionnalité pourrait être cassée...). Si votre DNS inversé est correctement configuré en IPv4, vous pouvez essayer de désactiver l'utilisation d'IPv6 lors de l'envoi d'emails en exécutant <cmd>yunohost settings set smtp.allow_ipv6 -v off</cmd>. Remarque : cette dernière solution signifie que vous ne pourrez pas envoyer ou recevoir de courriels avec les quelques serveurs qui ont uniquement de l'IPv6.", "diagnosis_mail_fcrdns_nok_alternatives_6": "Certains fournisseurs ne vous laisseront pas configurer votre DNS inversé (ou leur fonctionnalité pourrait être cassée...). Si votre DNS inversé est correctement configuré en IPv4, vous pouvez essayer de désactiver l'utilisation d'IPv6 lors de l'envoi d'emails en exécutant <cmd>yunohost settings set smtp.allow_ipv6 -v off</cmd>. Remarque : cette dernière solution signifie que vous ne pourrez pas envoyer ou recevoir de emails avec les quelques serveurs qui ont uniquement de l'IPv6.",
"diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "DNS inverse actuel : <code>{rdns_domain}</code> <br> Valeur attendue : <code>{ehlo_domain}</code>", "diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "DNS inverse actuel : <code>{rdns_domain}</code> <br> Valeur attendue : <code>{ehlo_domain}</code>",
"diagnosis_mail_blacklist_listed_by": "Votre IP ou domaine <code>{item}</code> est sur liste noire sur {blacklist_name}", "diagnosis_mail_blacklist_listed_by": "Votre IP ou domaine <code>{item}</code> est sur liste noire sur {blacklist_name}",
"diagnosis_mail_queue_unavailable": "Impossible de consulter le nombre demails en attente dans la file d'attente", "diagnosis_mail_queue_unavailable": "Impossible de consulter le nombre d'emails en attente dans la file d'attente",
"diagnosis_ports_partially_unreachable": "Le port {port} n'est pas accessible de l'extérieur en IPv{failed}.", "diagnosis_ports_partially_unreachable": "Le port {port} n'est pas accessible de l'extérieur en IPv{failed}.",
"diagnosis_http_hairpinning_issue": "Votre réseau local ne semble pas supporter l'hairpinning.", "diagnosis_http_hairpinning_issue": "Votre réseau local ne semble pas supporter l'hairpinning.",
"diagnosis_http_hairpinning_issue_details": "C'est probablement à cause de la box/routeur de votre fournisseur d'accès internet. Par conséquent, les personnes extérieures à votre réseau local pourront accéder à votre serveur comme prévu, mais pas les personnes internes au réseau local (comme vous, probablement ?) si elles utilisent le nom de domaine ou l'IP globale. Vous pourrez peut-être améliorer la situation en consultant <a href='https://yunohost.org/dns_local_network'>https://yunohost.org/dns_local_network</a>", "diagnosis_http_hairpinning_issue_details": "C'est probablement à cause de la box/routeur de votre fournisseur d'accès internet. Par conséquent, les personnes extérieures à votre réseau local pourront accéder à votre serveur comme prévu, mais pas les personnes internes au réseau local (comme vous, probablement ?) si elles utilisent le nom de domaine ou l'IP globale. Vous pourrez peut-être améliorer la situation en consultant <a href='https://yunohost.org/dns_local_network'>https://yunohost.org/dns_local_network</a>",
"diagnosis_http_partially_unreachable": "Le domaine {domain} semble inaccessible en HTTP depuis lextérieur du réseau local en IPv{failed}, bien quil fonctionne en IPv{passed}.", "diagnosis_http_partially_unreachable": "Le domaine {domain} semble inaccessible en HTTP depuis l'extérieur du réseau local en IPv{failed}, bien qu'il fonctionne en IPv{passed}.",
"diagnosis_http_nginx_conf_not_up_to_date": "La configuration Nginx de ce domaine semble avoir été modifiée manuellement et empêche YunoHost de diagnostiquer si elle est accessible en HTTP.", "diagnosis_http_nginx_conf_not_up_to_date": "La configuration Nginx de ce domaine semble avoir été modifiée manuellement et empêche YunoHost de diagnostiquer si elle est accessible en HTTP.",
"diagnosis_http_nginx_conf_not_up_to_date_details": "Pour corriger la situation, inspectez la différence avec la ligne de commande en utilisant les outils <cmd>yunohost tools regen-conf nginx --dry-run --with-diff</cmd> et si vous êtes daccord, appliquez les modifications avec <cmd>yunohost tools regen-conf nginx --force</cmd>.", "diagnosis_http_nginx_conf_not_up_to_date_details": "Pour corriger la situation, inspectez la différence avec la ligne de commande en utilisant les outils <cmd>yunohost tools regen-conf nginx --dry-run --with-diff</cmd> et si vous êtes d'accord, appliquez les modifications avec <cmd>yunohost tools regen-conf nginx --force</cmd>.",
"backup_archive_cant_retrieve_info_json": "Impossible d'avoir des informations sur l'archive '{archive}'... Le fichier info.json ne peut pas être trouvé (ou n'est pas un fichier json valide).", "backup_archive_cant_retrieve_info_json": "Impossible d'avoir des informations sur l'archive '{archive}'... Le fichier info.json ne peut pas être trouvé (ou n'est pas un fichier json valide).",
"backup_archive_corrupted": "Il semble que l'archive de la sauvegarde '{archive}' est corrompue : {error}", "backup_archive_corrupted": "Il semble que l'archive de la sauvegarde '{archive}' est corrompue : {error}",
"diagnosis_ip_no_ipv6_tip": "L'utilisation de IPv6 n'est pas obligatoire pour le fonctionnement de votre serveur, mais cela contribue à la santé d'Internet dans son ensemble. IPv6 généralement configuré automatiquement par votre système ou votre FAI s'il est disponible. Autrement, vous devrez prendre quelque minutes pour le configurer manuellement à l'aide de cette documentation : <a href='https://yunohost.org/#/ipv6'>https://yunohost.org/#/ipv6</a>. Si vous ne pouvez pas activer IPv6 ou si c'est trop technique pour vous, vous pouvez aussi ignorer cet avertissement sans que cela pose problème.", "diagnosis_ip_no_ipv6_tip": "L'utilisation de IPv6 n'est pas obligatoire pour le fonctionnement de votre serveur, mais cela contribue à la santé d'Internet dans son ensemble. IPv6 généralement configuré automatiquement par votre système ou votre FAI s'il est disponible. Autrement, vous devrez prendre quelque minutes pour le configurer manuellement à l'aide de cette documentation : <a href='https://yunohost.org/#/ipv6'>https://yunohost.org/#/ipv6</a>. Si vous ne pouvez pas activer IPv6 ou si c'est trop technique pour vous, vous pouvez aussi ignorer cet avertissement sans que cela pose problème.",
@ -551,14 +551,14 @@
"diagnosis_domain_expiration_error": "Certains domaines vont expirer TRÈS PROCHAINEMENT !", "diagnosis_domain_expiration_error": "Certains domaines vont expirer TRÈS PROCHAINEMENT !",
"diagnosis_domain_expires_in": "{domain} expire dans {days} jours.", "diagnosis_domain_expires_in": "{domain} expire dans {days} jours.",
"certmanager_domain_not_diagnosed_yet": "Il n'y a pas encore de résultat de diagnostic pour le domaine {domain}. Merci de relancer un diagnostic pour les catégories 'Enregistrements DNS' et 'Web' dans la section Diagnostique pour vérifier si le domaine est prêt pour Let's Encrypt. (Ou si vous savez ce que vous faites, utilisez '--no-checks' pour désactiver la vérification.)", "certmanager_domain_not_diagnosed_yet": "Il n'y a pas encore de résultat de diagnostic pour le domaine {domain}. Merci de relancer un diagnostic pour les catégories 'Enregistrements DNS' et 'Web' dans la section Diagnostique pour vérifier si le domaine est prêt pour Let's Encrypt. (Ou si vous savez ce que vous faites, utilisez '--no-checks' pour désactiver la vérification.)",
"diagnosis_swap_tip": "Merci d'être prudent et conscient que si vous hébergez une partition SWAP sur une carte SD ou un disque SSD, cela risque de réduire drastiquement lespérance de vie du périphérique.", "diagnosis_swap_tip": "Merci d'être prudent et conscient que si vous hébergez une partition SWAP sur une carte SD ou un disque SSD, cela risque de réduire drastiquement l'espérance de vie du périphérique.",
"restore_already_installed_apps": "Les applications suivantes ne peuvent pas être restaurées car elles sont déjà installées : {apps}", "restore_already_installed_apps": "Les applications suivantes ne peuvent pas être restaurées car elles sont déjà installées : {apps}",
"regenconf_need_to_explicitly_specify_ssh": "La configuration de ssh a été modifiée manuellement. Vous devez explicitement indiquer la mention --force à \"ssh\" pour appliquer les changements.", "regenconf_need_to_explicitly_specify_ssh": "La configuration de ssh a été modifiée manuellement. Vous devez explicitement indiquer la mention --force à \"ssh\" pour appliquer les changements.",
"migration_0015_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus nécessaires ...", "migration_0015_cleaning_up": "Nettoyage du cache et des paquets qui ne sont plus nécessaires ...",
"migration_0015_specific_upgrade": "Démarrage de la mise à jour des paquets du système qui doivent être mis à jour séparément...", "migration_0015_specific_upgrade": "Démarrage de la mise à jour des paquets du système qui doivent être mis à jour séparément...",
"migration_0015_modified_files": "Veuillez noter que les fichiers suivants ont été modifiés manuellement et pourraient être écrasés à la suite de la mise à niveau : {manually_modified_files}", "migration_0015_modified_files": "Veuillez noter que les fichiers suivants ont été modifiés manuellement et pourraient être écrasés à la suite de la mise à niveau : {manually_modified_files}",
"migration_0015_problematic_apps_warning": "Veuillez noter que des applications qui peuvent poser problèmes ont été détectées. Il semble qu'elles n'aient pas été installées à partir du catalogue d'applications YunoHost, ou bien qu'elles ne soient pas signalées comme \"fonctionnelles\". Par conséquent, il n'est pas possible de garantir que les applications suivantes fonctionneront encore après la mise à niveau : {problematic_apps}", "migration_0015_problematic_apps_warning": "Veuillez noter que des applications qui peuvent poser problèmes ont été détectées. Il semble qu'elles n'aient pas été installées à partir du catalogue d'applications YunoHost, ou bien qu'elles ne soient pas signalées comme \"fonctionnelles\". Par conséquent, il n'est pas possible de garantir que les applications suivantes fonctionneront encore après la mise à niveau : {problematic_apps}",
"migration_0015_general_warning": "Veuillez noter que cette migration est une opération délicate. L'équipe YunoHost a fait de son mieux pour la revérifier et la tester, mais la migration pourrait quand même casser des éléments du système ou de ses applications.\n\nIl est donc recommandé :\n- de faire une sauvegarde de toute donnée ou application critique. Plus d'informations ici https://yunohost.org/backup ;\n- d'être patient après le lancement de la migration. Selon votre connexion internet et votre matériel, la mise à niveau peut prendre jusqu'à quelques heures.", "migration_0015_general_warning": "Veuillez noter que cette migration est une opération délicate. L'équipe YunoHost a fait de son mieux pour la revérifier et la tester, mais la migration pourrait quand même casser des éléments du système ou de ses applications.\n\nIl est donc recommandé :\n...- de faire une sauvegarde de toute donnée ou application critique. Plus d'informations ici https://yunohost.org/backup ;\n...- d'être patient après le lancement de la migration. Selon votre connexion internet et votre matériel, la mise à niveau peut prendre jusqu'à quelques heures.",
"migration_0015_system_not_fully_up_to_date": "Votre système n'est pas entièrement à jour. Veuillez effectuer une mise à jour normale avant de lancer la migration vers Buster.", "migration_0015_system_not_fully_up_to_date": "Votre système n'est pas entièrement à jour. Veuillez effectuer une mise à jour normale avant de lancer la migration vers Buster.",
"migration_0015_not_enough_free_space": "L'espace libre est très faible dans /var/ ! Vous devriez avoir au moins 1 Go de libre pour effectuer cette migration.", "migration_0015_not_enough_free_space": "L'espace libre est très faible dans /var/ ! Vous devriez avoir au moins 1 Go de libre pour effectuer cette migration.",
"migration_0015_not_stretch": "La distribution Debian actuelle n'est pas Stretch !", "migration_0015_not_stretch": "La distribution Debian actuelle n'est pas Stretch !",
@ -615,9 +615,9 @@
"diagnosis_basesystem_hardware_model": "Le modèle/architecture du serveur est {model}", "diagnosis_basesystem_hardware_model": "Le modèle/architecture du serveur est {model}",
"diagnosis_backports_in_sources_list": "Il semble qu'apt (le gestionnaire de paquets) soit configuré pour utiliser le dépôt des rétroportages (backports). A moins que vous ne sachiez vraiment ce que vous faites, nous vous déconseillons fortement d'installer des paquets provenant des rétroportages, car cela risque de créer des instabilités ou des conflits sur votre système.", "diagnosis_backports_in_sources_list": "Il semble qu'apt (le gestionnaire de paquets) soit configuré pour utiliser le dépôt des rétroportages (backports). A moins que vous ne sachiez vraiment ce que vous faites, nous vous déconseillons fortement d'installer des paquets provenant des rétroportages, car cela risque de créer des instabilités ou des conflits sur votre système.",
"postinstall_low_rootfsspace": "Le système de fichiers a une taille totale inférieure à 10 Go, ce qui est préoccupant et devrait attirer votre attention ! Vous allez certainement arriver à court d'espace disque (très) rapidement ! Il est recommandé d'avoir au moins 16 Go à la racine pour ce système de fichiers. Si vous voulez installer YunoHost malgré cet avertissement, relancez la post-installation avec --force-diskspace", "postinstall_low_rootfsspace": "Le système de fichiers a une taille totale inférieure à 10 Go, ce qui est préoccupant et devrait attirer votre attention ! Vous allez certainement arriver à court d'espace disque (très) rapidement ! Il est recommandé d'avoir au moins 16 Go à la racine pour ce système de fichiers. Si vous voulez installer YunoHost malgré cet avertissement, relancez la post-installation avec --force-diskspace",
"domain_remove_confirm_apps_removal": "Le retrait de ce domaine retirera aussi ces applications :\n{apps}\n\nÊtes vous sûr de vouloir cela ? [{answers}]", "domain_remove_confirm_apps_removal": "Le retrait de ce domaine retirera aussi ces applications :\n{apps}\n\nÊtes vous sûr de vouloir cela ? [{answers}]",
"diagnosis_rootfstotalspace_critical": "Le système de fichiers racine ne fait que {space} ! Vous allez certainement le remplir très rapidement ! Il est recommandé d'avoir au moins 16 GB pour ce système de fichiers.", "diagnosis_rootfstotalspace_critical": "Le système de fichiers racine ne fait que {space} ! Vous allez certainement le remplir très rapidement ! Il est recommandé d'avoir au moins 16 GB pour ce système de fichiers.",
"diagnosis_rootfstotalspace_warning": "Le système de fichiers racine n'est que de {space}. Cela peut suffire, mais faites attention car vous risquez de les remplir rapidement... Il est recommandé d'avoir au moins 16 GB pour ce système de fichiers.", "diagnosis_rootfstotalspace_warning": "Le système de fichiers racine n'est que de {space}. Cela peut suffire, mais faites attention car vous risquez de les remplir rapidement... Il est recommandé d'avoir au moins 16 GB pour ce système de fichiers.",
"app_restore_script_failed": "Une erreur s'est produite dans le script de restauration de l'application", "app_restore_script_failed": "Une erreur s'est produite dans le script de restauration de l'application",
"restore_backup_too_old": "Cette sauvegarde ne peut pas être restaurée car elle provient d'une version trop ancienne de YunoHost.", "restore_backup_too_old": "Cette sauvegarde ne peut pas être restaurée car elle provient d'une version trop ancienne de YunoHost.",
"migration_update_LDAP_schema": "Mise à jour du schéma LDAP...", "migration_update_LDAP_schema": "Mise à jour du schéma LDAP...",
@ -626,7 +626,7 @@
"migration_ldap_rollback_success": "Système rétabli dans son état initial.", "migration_ldap_rollback_success": "Système rétabli dans son état initial.",
"permission_cant_add_to_all_users": "L'autorisation {permission} ne peut pas être ajoutée à tous les utilisateurs.", "permission_cant_add_to_all_users": "L'autorisation {permission} ne peut pas être ajoutée à tous les utilisateurs.",
"migration_ldap_migration_failed_trying_to_rollback": "Impossible de migrer... tentative de restauration du système.", "migration_ldap_migration_failed_trying_to_rollback": "Impossible de migrer... tentative de restauration du système.",
"migration_ldap_can_not_backup_before_migration": "La sauvegarde du système n'a pas pu être terminée avant l'échec de la migration. Erreur : {error}", "migration_ldap_can_not_backup_before_migration": "La sauvegarde du système n'a pas pu être terminée avant l'échec de la migration. Erreur : {error }",
"migration_ldap_backup_before_migration": "Création d'une sauvegarde de la base de données LDAP et des paramètres des applications avant la migration proprement dite.", "migration_ldap_backup_before_migration": "Création d'une sauvegarde de la base de données LDAP et des paramètres des applications avant la migration proprement dite.",
"migration_description_0020_ssh_sftp_permissions": "Ajouter la prise en charge des autorisations SSH et SFTP", "migration_description_0020_ssh_sftp_permissions": "Ajouter la prise en charge des autorisations SSH et SFTP",
"global_settings_setting_security_ssh_port": "Port SSH", "global_settings_setting_security_ssh_port": "Port SSH",
@ -634,9 +634,9 @@
"diagnosis_sshd_config_inconsistent": "Il semble que le port SSH a été modifié manuellement dans /etc/ssh/sshd_config. Depuis YunoHost 4.2, un nouveau paramètre global 'security.ssh.port' est disponible pour éviter de modifier manuellement la configuration.", "diagnosis_sshd_config_inconsistent": "Il semble que le port SSH a été modifié manuellement dans /etc/ssh/sshd_config. Depuis YunoHost 4.2, un nouveau paramètre global 'security.ssh.port' est disponible pour éviter de modifier manuellement la configuration.",
"diagnosis_sshd_config_insecure": "La configuration SSH semble avoir été modifiée manuellement et n'est pas sécurisée car elle ne contient aucune directive 'AllowGroups' ou 'AllowUsers' pour limiter l'accès aux utilisateurs autorisés.", "diagnosis_sshd_config_insecure": "La configuration SSH semble avoir été modifiée manuellement et n'est pas sécurisée car elle ne contient aucune directive 'AllowGroups' ou 'AllowUsers' pour limiter l'accès aux utilisateurs autorisés.",
"backup_create_size_estimation": "L'archive contiendra environ {size} de données.", "backup_create_size_estimation": "L'archive contiendra environ {size} de données.",
"global_settings_setting_security_webadmin_allowlist": "Adresses IP autorisées à accéder à la page web du portail d'administration (webadmin). Elles doivent être séparées par une virgule.", "global_settings_setting_security_webadmin_allowlist": "Adresses IP autorisées à accéder à la webadmin. Elles doivent être séparées par une virgule.",
"global_settings_setting_security_webadmin_allowlist_enabled": "Autorisez seulement certaines IP à accéder à la page web du portail d'administration (webadmin).", "global_settings_setting_security_webadmin_allowlist_enabled": "Autoriser seulement certaines IP à accéder à la webadmin.",
"diagnosis_http_localdomain": "Le domaine {domain}, avec un TLD .local, ne devrait pas être atteint depuis l'extérieur du réseau local.", "diagnosis_http_localdomain": "Le domaine {domain}, avec un TLD .local, ne devrait pas être exposé en dehors du réseau local.",
"diagnosis_dns_specialusedomain": "Le domaine {domain} est basé sur un domaine de premier niveau (TLD) à usage spécial et ne devrait donc pas avoir d'enregistrements DNS réels.", "diagnosis_dns_specialusedomain": "Le domaine {domain} est basé sur un domaine de premier niveau (TLD) à usage spécial et ne devrait donc pas avoir d'enregistrements DNS réels.",
"invalid_password": "Mot de passe incorrect", "invalid_password": "Mot de passe incorrect",
"ldap_server_is_down_restart_it": "Le service LDAP est en panne, essayez de le redémarrer...", "ldap_server_is_down_restart_it": "Le service LDAP est en panne, essayez de le redémarrer...",
@ -649,5 +649,13 @@
"diagnosis_apps_not_in_app_catalog": "Cette application est absente ou ne figure plus dans le catalogue d'applications de YunoHost. Vous devriez envisager de la désinstaller car elle ne recevra pas de mise à jour et pourrait compromettre l'intégrité et la sécurité de votre système.", "diagnosis_apps_not_in_app_catalog": "Cette application est absente ou ne figure plus dans le catalogue d'applications de YunoHost. Vous devriez envisager de la désinstaller car elle ne recevra pas de mise à jour et pourrait compromettre l'intégrité et la sécurité de votre système.",
"diagnosis_apps_issue": "Un problème a été détecté pour l'application {app}", "diagnosis_apps_issue": "Un problème a été détecté pour l'application {app}",
"diagnosis_apps_allgood": "Toutes les applications installées respectent les pratiques de packaging de base", "diagnosis_apps_allgood": "Toutes les applications installées respectent les pratiques de packaging de base",
"diagnosis_description_apps": "Applications" "diagnosis_description_apps": "Applications",
"user_import_success": "Utilisateurs importés avec succès",
"user_import_nothing_to_do": "Aucun utilisateur n'a besoin d'être importé",
"user_import_failed": "L'opération d'importation des utilisateurs a totalement échoué",
"user_import_partial_failed": "L'opération d'importation des utilisateurs a partiellement échoué",
"user_import_missing_columns": "Les colonnes suivantes sont manquantes : {columns}",
"user_import_bad_file": "Votre fichier CSV n'est pas correctement formaté, il sera ignoré afin d'éviter une potentielle perte de données",
"user_import_bad_line": "Ligne incorrecte {line} : {details}",
"log_user_import": "Importer des utilisateurs"
} }

View file

@ -512,8 +512,8 @@
"regenconf_file_copy_failed": "Non se puido copiar o novo ficheiro de configuración '{new}' a '{conf}'", "regenconf_file_copy_failed": "Non se puido copiar o novo ficheiro de configuración '{new}' a '{conf}'",
"regenconf_file_backed_up": "Ficheiro de configuración '{conf}' copiado a '{backup}'", "regenconf_file_backed_up": "Ficheiro de configuración '{conf}' copiado a '{backup}'",
"postinstall_low_rootfsspace": "O sistema de ficheiros raiz ten un espazo total menor de 10GB, que é pouco! Probablemente vas quedar sen espazo moi pronto! É recomendable ter polo menos 16GB para o sistema raíz. Se queres instalar YunoHost obviando este aviso, volve a executar a postinstalación con --force-diskspace", "postinstall_low_rootfsspace": "O sistema de ficheiros raiz ten un espazo total menor de 10GB, que é pouco! Probablemente vas quedar sen espazo moi pronto! É recomendable ter polo menos 16GB para o sistema raíz. Se queres instalar YunoHost obviando este aviso, volve a executar a postinstalación con --force-diskspace",
"port_already_opened": "O porto {port:d} xa está aberto para conexións {ip_version}", "port_already_opened": "O porto {port} xa está aberto para conexións {ip_version}",
"port_already_closed": "O porto {port:d} xa está pechado para conexións {ip_version}", "port_already_closed": "O porto {port} xa está pechado para conexións {ip_version}",
"permission_require_account": "O permiso {permission} só ten sentido para usuarias cunha conta, e por tanto non pode concederse a visitantes.", "permission_require_account": "O permiso {permission} só ten sentido para usuarias cunha conta, e por tanto non pode concederse a visitantes.",
"permission_protected": "O permiso {permission} está protexido. Non podes engadir ou eliminar o grupo visitantes a/de este permiso.", "permission_protected": "O permiso {permission} está protexido. Non podes engadir ou eliminar o grupo visitantes a/de este permiso.",
"permission_updated": "Permiso '{permission}' actualizado", "permission_updated": "Permiso '{permission}' actualizado",
@ -578,8 +578,8 @@
"restore_running_app_script": "Restablecendo a app '{app}'…", "restore_running_app_script": "Restablecendo a app '{app}'…",
"restore_removing_tmp_dir_failed": "Non se puido eliminar o directorio temporal antigo", "restore_removing_tmp_dir_failed": "Non se puido eliminar o directorio temporal antigo",
"restore_nothings_done": "Nada foi restablecido", "restore_nothings_done": "Nada foi restablecido",
"restore_not_enough_disk_space": "Non hai espazo abondo (espazo: {free_space.d} B, espazo necesario: {needed_space} B, marxe de seguridade: {margin:d} B)", "restore_not_enough_disk_space": "Non hai espazo abondo (espazo: {free_space.d} B, espazo necesario: {needed_space} B, marxe de seguridade: {margin} B)",
"restore_may_be_not_enough_disk_space": "O teu sistema semella que non ten espazo abondo (libre: {free_space:d} B, espazo necesario: {needed_space:d} B, marxe de seguridade {margin:d} B)", "restore_may_be_not_enough_disk_space": "O teu sistema semella que non ten espazo abondo (libre: {free_space} B, espazo necesario: {needed_space} B, marxe de seguridade {margin} B)",
"restore_hook_unavailable": "O script de restablecemento para '{part}' non está dispoñible no teu sistema nin no arquivo", "restore_hook_unavailable": "O script de restablecemento para '{part}' non está dispoñible no teu sistema nin no arquivo",
"invalid_password": "Contrasinal non válido", "invalid_password": "Contrasinal non válido",
"ldap_server_is_down_restart_it": "O servidor LDAP está caído, intenta reinicialo...", "ldap_server_is_down_restart_it": "O servidor LDAP está caído, intenta reinicialo...",

View file

@ -11,7 +11,7 @@
"domain_exists": "Il dominio esiste già", "domain_exists": "Il dominio esiste già",
"pattern_email": "L'indirizzo email deve essere valido, senza simboli '+' (es. tizio@dominio.com)", "pattern_email": "L'indirizzo email deve essere valido, senza simboli '+' (es. tizio@dominio.com)",
"pattern_mailbox_quota": "La dimensione deve avere un suffisso b/k/M/G/T o 0 per disattivare la quota", "pattern_mailbox_quota": "La dimensione deve avere un suffisso b/k/M/G/T o 0 per disattivare la quota",
"port_already_opened": "La porta {port:d} è già aperta per {ip_version} connessioni", "port_already_opened": "La porta {port} è già aperta per {ip_version} connessioni",
"service_add_failed": "Impossibile aggiungere il servizio '{service}'", "service_add_failed": "Impossibile aggiungere il servizio '{service}'",
"service_cmd_exec_failed": "Impossibile eseguire il comando '{command}'", "service_cmd_exec_failed": "Impossibile eseguire il comando '{command}'",
"service_disabled": "Il servizio '{service}' non partirà più al boot di sistema.", "service_disabled": "Il servizio '{service}' non partirà più al boot di sistema.",
@ -106,7 +106,7 @@
"pattern_port_or_range": "Deve essere un numero di porta valido (es. 0-65535) o una fascia di porte valida (es. 100:200)", "pattern_port_or_range": "Deve essere un numero di porta valido (es. 0-65535) o una fascia di porte valida (es. 100:200)",
"pattern_positive_number": "Deve essere un numero positivo", "pattern_positive_number": "Deve essere un numero positivo",
"pattern_username": "Caratteri minuscoli alfanumerici o trattini bassi soli", "pattern_username": "Caratteri minuscoli alfanumerici o trattini bassi soli",
"port_already_closed": "La porta {port:d} è già chiusa per le connessioni {ip_version}", "port_already_closed": "La porta {port} è già chiusa per le connessioni {ip_version}",
"restore_already_installed_app": "Un'applicazione con l'ID '{app}' è già installata", "restore_already_installed_app": "Un'applicazione con l'ID '{app}' è già installata",
"app_restore_failed": "Impossibile ripristinare l'applicazione '{app}': {error}", "app_restore_failed": "Impossibile ripristinare l'applicazione '{app}': {error}",
"restore_cleaning_failed": "Impossibile pulire la directory temporanea di ripristino", "restore_cleaning_failed": "Impossibile pulire la directory temporanea di ripristino",
@ -436,8 +436,8 @@
"root_password_desynchronized": "La password d'amministratore è stata cambiata, ma YunoHost non ha potuto propagarla alla password di root!", "root_password_desynchronized": "La password d'amministratore è stata cambiata, ma YunoHost non ha potuto propagarla alla password di root!",
"restore_system_part_failed": "Impossibile ripristinare la sezione di sistema '{part}'", "restore_system_part_failed": "Impossibile ripristinare la sezione di sistema '{part}'",
"restore_removing_tmp_dir_failed": "Impossibile rimuovere una vecchia directory temporanea", "restore_removing_tmp_dir_failed": "Impossibile rimuovere una vecchia directory temporanea",
"restore_not_enough_disk_space": "Spazio libero insufficiente (spazio: {free_space:d}B, necessario: {needed_space:d}B, margine di sicurezza: {margin:d}B)", "restore_not_enough_disk_space": "Spazio libero insufficiente (spazio: {free_space}B, necessario: {needed_space}B, margine di sicurezza: {margin}B)",
"restore_may_be_not_enough_disk_space": "Il tuo sistema non sembra avere abbastanza spazio (libero: {free_space:d}B, necessario: {needed_space:d}B, margine di sicurezza: {margin:d}B)", "restore_may_be_not_enough_disk_space": "Il tuo sistema non sembra avere abbastanza spazio (libero: {free_space}B, necessario: {needed_space}B, margine di sicurezza: {margin}B)",
"restore_extracting": "Sto estraendo i file necessari dall'archivio…", "restore_extracting": "Sto estraendo i file necessari dall'archivio…",
"restore_already_installed_apps": "Le seguenti app non possono essere ripristinate perché sono già installate: {apps}", "restore_already_installed_apps": "Le seguenti app non possono essere ripristinate perché sono già installate: {apps}",
"regex_with_only_domain": "Non puoi usare una regex per il dominio, solo per i percorsi", "regex_with_only_domain": "Non puoi usare una regex per il dominio, solo per i percorsi",

View file

@ -45,8 +45,8 @@
"pattern_email": "Moet een geldig emailadres bevatten (bv. abc@example.org)", "pattern_email": "Moet een geldig emailadres bevatten (bv. abc@example.org)",
"pattern_mailbox_quota": "Mailbox quota moet een waarde bevatten met b/k/M/G/T erachter of 0 om geen quota in te stellen", "pattern_mailbox_quota": "Mailbox quota moet een waarde bevatten met b/k/M/G/T erachter of 0 om geen quota in te stellen",
"pattern_password": "Wachtwoord moet tenminste 3 karakters lang zijn", "pattern_password": "Wachtwoord moet tenminste 3 karakters lang zijn",
"port_already_closed": "Poort {port:d} is al gesloten voor {ip_version} verbindingen", "port_already_closed": "Poort {port} is al gesloten voor {ip_version} verbindingen",
"port_already_opened": "Poort {port:d} is al open voor {ip_version} verbindingen", "port_already_opened": "Poort {port} is al open voor {ip_version} verbindingen",
"app_restore_failed": "De app '{app}' kon niet worden terug gezet: {error}", "app_restore_failed": "De app '{app}' kon niet worden terug gezet: {error}",
"restore_hook_unavailable": "De herstel-hook '{part}' is niet beschikbaar op dit systeem", "restore_hook_unavailable": "De herstel-hook '{part}' is niet beschikbaar op dit systeem",
"service_add_failed": "Kan service '{service}' niet toevoegen", "service_add_failed": "Kan service '{service}' niet toevoegen",

View file

@ -142,8 +142,8 @@
"pattern_password": "Deu conténer almens 3 caractèrs", "pattern_password": "Deu conténer almens 3 caractèrs",
"pattern_port_or_range": "Deu èsser un numèro de pòrt valid (ex: 0-65535) o un interval de pòrt (ex: 100:200)", "pattern_port_or_range": "Deu èsser un numèro de pòrt valid (ex: 0-65535) o un interval de pòrt (ex: 100:200)",
"pattern_positive_number": "Deu èsser un nombre positiu", "pattern_positive_number": "Deu èsser un nombre positiu",
"port_already_closed": "Lo pòrt {port:d} es ja tampat per las connexions {ip_version}", "port_already_closed": "Lo pòrt {port} es ja tampat per las connexions {ip_version}",
"port_already_opened": "Lo pòrt {port:d} es ja dubèrt per las connexions {ip_version}", "port_already_opened": "Lo pòrt {port} es ja dubèrt per las connexions {ip_version}",
"restore_already_installed_app": "Una aplicacion es ja installada amb lid « {app} »", "restore_already_installed_app": "Una aplicacion es ja installada amb lid « {app} »",
"app_restore_failed": "Impossible de restaurar laplicacion « {app} »: {error}", "app_restore_failed": "Impossible de restaurar laplicacion « {app} »: {error}",
"backup_ask_for_copying_if_needed": "Volètz far una salvagarda en utilizant {size} Mo temporàriament? (Aqueste biais de far es emplegat perque unes fichièrs an pas pogut èsser preparats amb un metòde mai eficaç.)", "backup_ask_for_copying_if_needed": "Volètz far una salvagarda en utilizant {size} Mo temporàriament? (Aqueste biais de far es emplegat perque unes fichièrs an pas pogut èsser preparats amb un metòde mai eficaç.)",
@ -206,8 +206,8 @@
"restore_extracting": "Extraccions dels fichièrs necessaris dins de larchiu…", "restore_extracting": "Extraccions dels fichièrs necessaris dins de larchiu…",
"restore_failed": "Impossible de restaurar lo sistèma", "restore_failed": "Impossible de restaurar lo sistèma",
"restore_hook_unavailable": "Lo script de restauracion « {part} »es pas disponible sus vòstre sistèma e es pas tanpauc dins larchiu", "restore_hook_unavailable": "Lo script de restauracion « {part} »es pas disponible sus vòstre sistèma e es pas tanpauc dins larchiu",
"restore_may_be_not_enough_disk_space": "Lo sistèma sembla daver pas pro despaci disponible (liure: {free_space:d} octets, necessari: {needed_space:d} octets, marge de seguretat: {margin:d} octets)", "restore_may_be_not_enough_disk_space": "Lo sistèma sembla daver pas pro despaci disponible (liure: {free_space} octets, necessari: {needed_space} octets, marge de seguretat: {margin} octets)",
"restore_not_enough_disk_space": "Espaci disponible insufisent (liure: {free_space:d} octets, necessari: {needed_space:d} octets, marge de seguretat: {margin:d} octets)", "restore_not_enough_disk_space": "Espaci disponible insufisent (liure: {free_space} octets, necessari: {needed_space} octets, marge de seguretat: {margin} octets)",
"restore_nothings_done": "Res es pas estat restaurat", "restore_nothings_done": "Res es pas estat restaurat",
"restore_removing_tmp_dir_failed": "Impossible de levar u ancian repertòri temporari", "restore_removing_tmp_dir_failed": "Impossible de levar u ancian repertòri temporari",
"restore_running_app_script": "Lançament del script de restauracion per laplicacion « {app} »…", "restore_running_app_script": "Lançament del script de restauracion per laplicacion « {app} »…",

File diff suppressed because it is too large Load diff

View file

@ -161,8 +161,8 @@
"app_action_cannot_be_ran_because_required_services_down": "这些必需的服务应该正在运行以执行以下操作:{services},尝试重新启动它们以继续操作(考虑调查为什么它们出现故障)。", "app_action_cannot_be_ran_because_required_services_down": "这些必需的服务应该正在运行以执行以下操作:{services},尝试重新启动它们以继续操作(考虑调查为什么它们出现故障)。",
"already_up_to_date": "无事可做。一切都已经是最新的了。", "already_up_to_date": "无事可做。一切都已经是最新的了。",
"postinstall_low_rootfsspace": "根文件系统的总空间小于10 GB这非常令人担忧您可能很快就会用完磁盘空间建议根文件系统至少有16GB, 如果尽管出现此警告仍要安装YunoHost请使用--force-diskspace重新运行postinstall", "postinstall_low_rootfsspace": "根文件系统的总空间小于10 GB这非常令人担忧您可能很快就会用完磁盘空间建议根文件系统至少有16GB, 如果尽管出现此警告仍要安装YunoHost请使用--force-diskspace重新运行postinstall",
"port_already_opened": "{ip_version}个连接的端口 {port:d} 已打开", "port_already_opened": "{ip_version}个连接的端口 {port} 已打开",
"port_already_closed": "{ip_version}个连接的端口 {port:d} 已关闭", "port_already_closed": "{ip_version}个连接的端口 {port} 已关闭",
"permission_require_account": "权限{permission}只对有账户的用户有意义,因此不能对访客启用。", "permission_require_account": "权限{permission}只对有账户的用户有意义,因此不能对访客启用。",
"permission_protected": "权限{permission}是受保护的。你不能向/从这个权限添加或删除访问者组。", "permission_protected": "权限{permission}是受保护的。你不能向/从这个权限添加或删除访问者组。",
"permission_updated": "权限 '{permission}' 已更新", "permission_updated": "权限 '{permission}' 已更新",
@ -185,7 +185,7 @@
"regenconf_file_manually_modified": "配置文件'{conf}' 已被手动修改,不会被更新", "regenconf_file_manually_modified": "配置文件'{conf}' 已被手动修改,不会被更新",
"regenconf_need_to_explicitly_specify_ssh": "ssh配置已被手动修改但是您需要使用--force明确指定类别“ ssh”才能实际应用更改。", "regenconf_need_to_explicitly_specify_ssh": "ssh配置已被手动修改但是您需要使用--force明确指定类别“ ssh”才能实际应用更改。",
"restore_nothings_done": "什么都没有恢复", "restore_nothings_done": "什么都没有恢复",
"restore_may_be_not_enough_disk_space": "您的系统似乎没有足够的空间(可用空间: {free_space:d} B所需空间: {needed_space:d} B安全系数: {margin:d} B)", "restore_may_be_not_enough_disk_space": "您的系统似乎没有足够的空间(可用空间: {free_space} B所需空间: {needed_space} B安全系数: {margin} B)",
"restore_hook_unavailable": "'{part}'的恢复脚本在您的系统上和归档文件中均不可用", "restore_hook_unavailable": "'{part}'的恢复脚本在您的系统上和归档文件中均不可用",
"restore_failed": "无法还原系统", "restore_failed": "无法还原系统",
"restore_extracting": "正在从存档中提取所需文件…", "restore_extracting": "正在从存档中提取所需文件…",
@ -467,7 +467,7 @@
"diagnosis_package_installed_from_sury_details": "一些软件包被无意中从一个名为Sury的第三方仓库安装。YunoHost团队改进了处理这些软件包的策略但预计一些安装了PHP7.3应用程序的设置在仍然使用Stretch的情况下还有一些不一致的地方。为了解决这种情况你应该尝试运行以下命令:<cmd>{cmd_to_fix}</cmd>", "diagnosis_package_installed_from_sury_details": "一些软件包被无意中从一个名为Sury的第三方仓库安装。YunoHost团队改进了处理这些软件包的策略但预计一些安装了PHP7.3应用程序的设置在仍然使用Stretch的情况下还有一些不一致的地方。为了解决这种情况你应该尝试运行以下命令:<cmd>{cmd_to_fix}</cmd>",
"app_not_installed": "在已安装的应用列表中找不到 {app}:{all_apps}", "app_not_installed": "在已安装的应用列表中找不到 {app}:{all_apps}",
"app_already_installed_cant_change_url": "这个应用程序已经被安装。URL不能仅仅通过这个函数来改变。在`app changeurl`中检查是否可用。", "app_already_installed_cant_change_url": "这个应用程序已经被安装。URL不能仅仅通过这个函数来改变。在`app changeurl`中检查是否可用。",
"restore_not_enough_disk_space": "没有足够的空间(空间: {free_space:d} B需要的空间: {needed_space:d} B,安全系数: {margin:d} B)", "restore_not_enough_disk_space": "没有足够的空间(空间: {free_space} B需要的空间: {needed_space} B,安全系数: {margin} B)",
"regenconf_pending_applying": "正在为类别'{category}'应用挂起的配置..", "regenconf_pending_applying": "正在为类别'{category}'应用挂起的配置..",
"regenconf_up_to_date": "类别'{category}'的配置已经是最新的", "regenconf_up_to_date": "类别'{category}'的配置已经是最新的",
"regenconf_file_kept_back": "配置文件'{conf}'预计将被regen-conf类别{category})删除,但被保留了下来。", "regenconf_file_kept_back": "配置文件'{conf}'预计将被regen-conf类别{category})删除,但被保留了下来。",

View file

@ -32,6 +32,7 @@ import psutil
from datetime import datetime, timedelta from datetime import datetime, timedelta
from logging import FileHandler, getLogger, Formatter from logging import FileHandler, getLogger, Formatter
from io import IOBase
from moulinette import m18n, Moulinette from moulinette import m18n, Moulinette
from moulinette.core import MoulinetteError from moulinette.core import MoulinetteError
@ -370,6 +371,18 @@ def is_unit_operation(
for field in exclude: for field in exclude:
if field in context: if field in context:
context.pop(field, None) context.pop(field, None)
# Context is made from args given to main function by argparse
# This context will be added in extra parameters in yml file, so this context should
# be serializable and short enough (it will be displayed in webadmin)
# Argparse can provide some File or Stream, so here we display the filename or
# the IOBase, if we have no name.
for field, value in context.items():
if isinstance(value, IOBase):
try:
context[field] = value.name
except:
context[field] = "IOBase"
operation_logger = OperationLogger(op_key, related_to, args=context) operation_logger = OperationLogger(op_key, related_to, args=context)
try: try:

View file

@ -76,6 +76,13 @@ DEFAULTS = OrderedDict(
"security.ssh.port", "security.ssh.port",
{"type": "int", "default": 22}, {"type": "int", "default": 22},
), ),
(
"security.nginx.redirect_to_https",
{
"type": "bool",
"default": True,
},
),
( (
"security.nginx.compatibility", "security.nginx.compatibility",
{ {
@ -392,6 +399,7 @@ def trigger_post_change_hook(setting_name, old_value, new_value):
@post_change_hook("ssowat.panel_overlay.enabled") @post_change_hook("ssowat.panel_overlay.enabled")
@post_change_hook("security.nginx.redirect_to_https")
@post_change_hook("security.nginx.compatibility") @post_change_hook("security.nginx.compatibility")
@post_change_hook("security.webadmin.allowlist.enabled") @post_change_hook("security.webadmin.allowlist.enabled")
@post_change_hook("security.webadmin.allowlist") @post_change_hook("security.webadmin.allowlist")

View file

@ -132,7 +132,7 @@ def app_is_exposed_on_http(domain, path, message_in_page):
try: try:
r = requests.get( r = requests.get(
"http://127.0.0.1" + path + "/", "https://127.0.0.1" + path + "/",
headers={"Host": domain}, headers={"Host": domain},
timeout=10, timeout=10,
verify=False, verify=False,

View file

@ -8,6 +8,10 @@ from yunohost.user import (
user_create, user_create,
user_delete, user_delete,
user_update, user_update,
user_import,
user_export,
FIELDS_FOR_IMPORT,
FIRST_ALIASES,
user_group_list, user_group_list,
user_group_create, user_group_create,
user_group_delete, user_group_delete,
@ -22,7 +26,7 @@ maindomain = ""
def clean_user_groups(): def clean_user_groups():
for u in user_list()["users"]: for u in user_list()["users"]:
user_delete(u) user_delete(u, purge=True)
for g in user_group_list()["groups"]: for g in user_group_list()["groups"]:
if g not in ["all_users", "visitors"]: if g not in ["all_users", "visitors"]:
@ -110,6 +114,77 @@ def test_del_user(mocker):
assert "alice" not in group_res["all_users"]["members"] assert "alice" not in group_res["all_users"]["members"]
def test_import_user(mocker):
import csv
from io import StringIO
fieldnames = [
"username",
"firstname",
"lastname",
"password",
"mailbox-quota",
"mail",
"mail-alias",
"mail-forward",
"groups",
]
with StringIO() as csv_io:
writer = csv.DictWriter(csv_io, fieldnames, delimiter=";", quotechar='"')
writer.writeheader()
writer.writerow(
{
"username": "albert",
"firstname": "Albert",
"lastname": "Good",
"password": "",
"mailbox-quota": "1G",
"mail": "albert@" + maindomain,
"mail-alias": "albert2@" + maindomain,
"mail-forward": "albert@example.com",
"groups": "dev",
}
)
writer.writerow(
{
"username": "alice",
"firstname": "Alice",
"lastname": "White",
"password": "",
"mailbox-quota": "1G",
"mail": "alice@" + maindomain,
"mail-alias": "alice1@" + maindomain + ",alice2@" + maindomain,
"mail-forward": "",
"groups": "apps",
}
)
csv_io.seek(0)
with message(mocker, "user_import_success"):
user_import(csv_io, update=True, delete=True)
group_res = user_group_list()["groups"]
user_res = user_list(list(FIELDS_FOR_IMPORT.keys()))["users"]
assert "albert" in user_res
assert "alice" in user_res
assert "bob" not in user_res
assert len(user_res["alice"]["mail-alias"]) == 2
assert "albert" in group_res["dev"]["members"]
assert "alice" in group_res["apps"]["members"]
assert "alice" not in group_res["dev"]["members"]
def test_export_user(mocker):
result = user_export()
aliases = ",".join([alias + maindomain for alias in FIRST_ALIASES])
should_be = (
"username;firstname;lastname;password;mail;mail-alias;mail-forward;mailbox-quota;groups\r\n"
f"alice;Alice;White;;alice@{maindomain};{aliases};;0;dev\r\n"
f"bob;Bob;Snow;;bob@{maindomain};;;0;apps\r\n"
f"jack;Jack;Black;;jack@{maindomain};;;0;"
)
assert result == should_be
def test_create_group(mocker): def test_create_group(mocker):
with message(mocker, "group_created", group="adminsys"): with message(mocker, "group_created", group="adminsys"):

View file

@ -43,32 +43,71 @@ from yunohost.log import is_unit_operation
logger = getActionLogger("yunohost.user") logger = getActionLogger("yunohost.user")
FIELDS_FOR_IMPORT = {
"username": r"^[a-z0-9_]+$",
"firstname": r"^([^\W\d_]{1,30}[ ,.\'-]{0,3})+$",
"lastname": r"^([^\W\d_]{1,30}[ ,.\'-]{0,3})+$",
"password": r"^|(.{3,})$",
"mail": r"^([\w.-]+@([^\W_A-Z]+([-]*[^\W_A-Z]+)*\.)+((xn--)?[^\W_]{2,}))$",
"mail-alias": r"^|([\w.-]+@([^\W_A-Z]+([-]*[^\W_A-Z]+)*\.)+((xn--)?[^\W_]{2,}),?)+$",
"mail-forward": r"^|([\w\+.-]+@([^\W_A-Z]+([-]*[^\W_A-Z]+)*\.)+((xn--)?[^\W_]{2,}),?)+$",
"mailbox-quota": r"^(\d+[bkMGT])|0|$",
"groups": r"^|([a-z0-9_]+(,?[a-z0-9_]+)*)$",
}
FIRST_ALIASES = ["root@", "admin@", "webmaster@", "postmaster@", "abuse@"]
def user_list(fields=None): def user_list(fields=None):
from yunohost.utils.ldap import _get_ldap_interface from yunohost.utils.ldap import _get_ldap_interface
user_attrs = { ldap_attrs = {
"uid": "username", "username": "uid",
"cn": "fullname", "password": "", # We can't request password in ldap
"fullname": "cn",
"firstname": "givenName",
"lastname": "sn",
"mail": "mail", "mail": "mail",
"maildrop": "mail-forward", "mail-alias": "mail",
"homeDirectory": "home_path", "mail-forward": "maildrop",
"mailuserquota": "mailbox-quota", "mailbox-quota": "mailuserquota",
"groups": "memberOf",
"shell": "loginShell",
"home-path": "homeDirectory",
} }
attrs = ["uid"] def display_default(values, _):
return values[0] if len(values) == 1 else values
display = {
"password": lambda values, user: "",
"mail": lambda values, user: display_default(values[:1], user),
"mail-alias": lambda values, _: values[1:],
"mail-forward": lambda values, user: [
forward for forward in values if forward != user["uid"][0]
],
"groups": lambda values, user: [
group[3:].split(",")[0]
for group in values
if not group.startswith("cn=all_users,")
and not group.startswith("cn=" + user["uid"][0] + ",")
],
"shell": lambda values, _: len(values) > 0
and values[0].strip() == "/bin/false",
}
attrs = set(["uid"])
users = {} users = {}
if fields: if not fields:
keys = user_attrs.keys() fields = ["username", "fullname", "mail", "mailbox-quota"]
for attr in fields:
if attr in keys: for field in fields:
attrs.append(attr) if field in ldap_attrs:
attrs.add(ldap_attrs[field])
else: else:
raise YunohostError("field_invalid", attr) raise YunohostError("field_invalid", field)
else:
attrs = ["uid", "cn", "mail", "mailuserquota"]
ldap = _get_ldap_interface() ldap = _get_ldap_interface()
result = ldap.search( result = ldap.search(
@ -79,12 +118,13 @@ def user_list(fields=None):
for user in result: for user in result:
entry = {} entry = {}
for attr, values in user.items(): for field in fields:
if values: values = []
entry[user_attrs[attr]] = values[0] if ldap_attrs[field] in user:
values = user[ldap_attrs[field]]
entry[field] = display.get(field, display_default)(values, user)
uid = entry[user_attrs["uid"]] users[user["uid"][0]] = entry
users[uid] = entry
return {"users": users} return {"users": users}
@ -98,6 +138,7 @@ def user_create(
domain, domain,
password, password,
mailbox_quota="0", mailbox_quota="0",
from_import=False,
): ):
from yunohost.domain import domain_list, _get_maindomain from yunohost.domain import domain_list, _get_maindomain
@ -149,17 +190,12 @@ def user_create(
raise YunohostValidationError("system_username_exists") raise YunohostValidationError("system_username_exists")
main_domain = _get_maindomain() main_domain = _get_maindomain()
aliases = [ aliases = [alias + main_domain for alias in FIRST_ALIASES]
"root@" + main_domain,
"admin@" + main_domain,
"webmaster@" + main_domain,
"postmaster@" + main_domain,
"abuse@" + main_domain,
]
if mail in aliases: if mail in aliases:
raise YunohostValidationError("mail_unavailable") raise YunohostValidationError("mail_unavailable")
if not from_import:
operation_logger.start() operation_logger.start()
# Get random UID/GID # Get random UID/GID
@ -214,8 +250,9 @@ def user_create(
# Attempt to create user home folder # Attempt to create user home folder
subprocess.check_call(["mkhomedir_helper", username]) subprocess.check_call(["mkhomedir_helper", username])
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
if not os.path.isdir("/home/{0}".format(username)): home = f"/home/{username}"
logger.warning(m18n.n("user_home_creation_failed"), exc_info=1) if not os.path.isdir(home):
logger.warning(m18n.n("user_home_creation_failed", home=home), exc_info=1)
try: try:
subprocess.check_call( subprocess.check_call(
@ -240,13 +277,14 @@ def user_create(
hook_callback("post_user_create", args=[username, mail], env=env_dict) hook_callback("post_user_create", args=[username, mail], env=env_dict)
# TODO: Send a welcome mail to user # TODO: Send a welcome mail to user
if not from_import:
logger.success(m18n.n("user_created")) logger.success(m18n.n("user_created"))
return {"fullname": fullname, "username": username, "mail": mail} return {"fullname": fullname, "username": username, "mail": mail}
@is_unit_operation([("username", "user")]) @is_unit_operation([("username", "user")])
def user_delete(operation_logger, username, purge=False): def user_delete(operation_logger, username, purge=False, from_import=False):
""" """
Delete user Delete user
@ -261,6 +299,7 @@ def user_delete(operation_logger, username, purge=False):
if username not in user_list()["users"]: if username not in user_list()["users"]:
raise YunohostValidationError("user_unknown", user=username) raise YunohostValidationError("user_unknown", user=username)
if not from_import:
operation_logger.start() operation_logger.start()
user_group_update("all_users", remove=username, force=True, sync_perm=False) user_group_update("all_users", remove=username, force=True, sync_perm=False)
@ -293,6 +332,7 @@ def user_delete(operation_logger, username, purge=False):
hook_callback("post_user_delete", args=[username, purge]) hook_callback("post_user_delete", args=[username, purge])
if not from_import:
logger.success(m18n.n("user_deleted")) logger.success(m18n.n("user_deleted"))
@ -309,6 +349,7 @@ def user_update(
add_mailalias=None, add_mailalias=None,
remove_mailalias=None, remove_mailalias=None,
mailbox_quota=None, mailbox_quota=None,
from_import=False,
): ):
""" """
Update user informations Update user informations
@ -368,7 +409,7 @@ def user_update(
] ]
# change_password is None if user_update is not called to change the password # change_password is None if user_update is not called to change the password
if change_password is not None: if change_password is not None and change_password != "":
# when in the cli interface if the option to change the password is called # when in the cli interface if the option to change the password is called
# without a specified value, change_password will be set to the const 0. # without a specified value, change_password will be set to the const 0.
# In this case we prompt for the new password. # In this case we prompt for the new password.
@ -382,38 +423,40 @@ def user_update(
if mail: if mail:
main_domain = _get_maindomain() main_domain = _get_maindomain()
aliases = [ aliases = [alias + main_domain for alias in FIRST_ALIASES]
"root@" + main_domain,
"admin@" + main_domain, # If the requested mail address is already as main address or as an alias by this user
"webmaster@" + main_domain, if mail in user["mail"]:
"postmaster@" + main_domain, user["mail"].remove(mail)
] # Othewise, check that this mail address is not already used by this user
else:
try: try:
ldap.validate_uniqueness({"mail": mail}) ldap.validate_uniqueness({"mail": mail})
except Exception as e: except Exception as e:
raise YunohostValidationError("user_update_failed", user=username, error=e) raise YunohostError("user_update_failed", user=username, error=e)
if mail[mail.find("@") + 1 :] not in domains: if mail[mail.find("@") + 1 :] not in domains:
raise YunohostValidationError( raise YunohostError(
"mail_domain_unknown", domain=mail[mail.find("@") + 1 :] "mail_domain_unknown", domain=mail[mail.find("@") + 1 :]
) )
if mail in aliases: if mail in aliases:
raise YunohostValidationError("mail_unavailable") raise YunohostValidationError("mail_unavailable")
del user["mail"][0] new_attr_dict["mail"] = [mail] + user["mail"][1:]
new_attr_dict["mail"] = [mail] + user["mail"]
if add_mailalias: if add_mailalias:
if not isinstance(add_mailalias, list): if not isinstance(add_mailalias, list):
add_mailalias = [add_mailalias] add_mailalias = [add_mailalias]
for mail in add_mailalias: for mail in add_mailalias:
# (c.f. similar stuff as before)
if mail in user["mail"]:
user["mail"].remove(mail)
else:
try: try:
ldap.validate_uniqueness({"mail": mail}) ldap.validate_uniqueness({"mail": mail})
except Exception as e: except Exception as e:
raise YunohostValidationError( raise YunohostError("user_update_failed", user=username, error=e)
"user_update_failed", user=username, error=e
)
if mail[mail.find("@") + 1 :] not in domains: if mail[mail.find("@") + 1 :] not in domains:
raise YunohostValidationError( raise YunohostError(
"mail_domain_unknown", domain=mail[mail.find("@") + 1 :] "mail_domain_unknown", domain=mail[mail.find("@") + 1 :]
) )
user["mail"].append(mail) user["mail"].append(mail)
@ -458,6 +501,7 @@ def user_update(
new_attr_dict["mailuserquota"] = [mailbox_quota] new_attr_dict["mailuserquota"] = [mailbox_quota]
env_dict["YNH_USER_MAILQUOTA"] = mailbox_quota env_dict["YNH_USER_MAILQUOTA"] = mailbox_quota
if not from_import:
operation_logger.start() operation_logger.start()
try: try:
@ -468,8 +512,9 @@ def user_update(
# Trigger post_user_update hooks # Trigger post_user_update hooks
hook_callback("post_user_update", env=env_dict) hook_callback("post_user_update", env=env_dict)
logger.success(m18n.n("user_updated")) if not from_import:
app_ssowatconf() app_ssowatconf()
logger.success(m18n.n("user_updated"))
return user_info(username) return user_info(username)
@ -505,6 +550,8 @@ def user_info(username):
"firstname": user["givenName"][0], "firstname": user["givenName"][0],
"lastname": user["sn"][0], "lastname": user["sn"][0],
"mail": user["mail"][0], "mail": user["mail"][0],
"mail-aliases": [],
"mail-forward": [],
} }
if len(user["mail"]) > 1: if len(user["mail"]) > 1:
@ -559,6 +606,315 @@ def user_info(username):
return result_dict return result_dict
def user_export():
"""
Export users into CSV
Keyword argument:
csv -- CSV file with columns username;firstname;lastname;password;mailbox-quota;mail;mail-alias;mail-forward;groups
"""
import csv # CSV are needed only in this function
from io import StringIO
with StringIO() as csv_io:
writer = csv.DictWriter(
csv_io, list(FIELDS_FOR_IMPORT.keys()), delimiter=";", quotechar='"'
)
writer.writeheader()
users = user_list(list(FIELDS_FOR_IMPORT.keys()))["users"]
for username, user in users.items():
user["mail-alias"] = ",".join(user["mail-alias"])
user["mail-forward"] = ",".join(user["mail-forward"])
user["groups"] = ",".join(user["groups"])
writer.writerow(user)
body = csv_io.getvalue().rstrip()
if Moulinette.interface.type == "api":
# We return a raw bottle HTTPresponse (instead of serializable data like
# list/dict, ...), which is gonna be picked and used directly by moulinette
from bottle import HTTPResponse
response = HTTPResponse(
body=body,
headers={
"Content-Disposition": "attachment; filename=users.csv",
"Content-Type": "text/csv",
},
)
return response
else:
return body
@is_unit_operation()
def user_import(operation_logger, csvfile, update=False, delete=False):
"""
Import users from CSV
Keyword argument:
csvfile -- CSV file with columns username;firstname;lastname;password;mailbox_quota;mail;alias;forward;groups
"""
import csv # CSV are needed only in this function
from moulinette.utils.text import random_ascii
from yunohost.permission import permission_sync_to_user
from yunohost.app import app_ssowatconf
from yunohost.domain import domain_list
# Pre-validate data and prepare what should be done
actions = {"created": [], "updated": [], "deleted": []}
is_well_formatted = True
def to_list(str_list):
L = str_list.split(",") if str_list else []
L = [l.strip() for l in L]
return L
existing_users = user_list()["users"]
existing_groups = user_group_list()["groups"]
existing_domains = domain_list()["domains"]
reader = csv.DictReader(csvfile, delimiter=";", quotechar='"')
users_in_csv = []
missing_columns = [
key for key in FIELDS_FOR_IMPORT.keys() if key not in reader.fieldnames
]
if missing_columns:
raise YunohostValidationError(
"user_import_missing_columns", columns=", ".join(missing_columns)
)
for user in reader:
# Validate column values against regexes
format_errors = [
f"{key}: '{user[key]}' doesn't match the expected format"
for key, validator in FIELDS_FOR_IMPORT.items()
if user[key] is None or not re.match(validator, user[key])
]
# Check for duplicated username lines
if user["username"] in users_in_csv:
format_errors.append(f"username '{user['username']}' duplicated")
users_in_csv.append(user["username"])
# Validate that groups exist
user["groups"] = to_list(user["groups"])
unknown_groups = [g for g in user["groups"] if g not in existing_groups]
if unknown_groups:
format_errors.append(
f"username '{user['username']}': unknown groups %s"
% ", ".join(unknown_groups)
)
# Validate that domains exist
user["mail-alias"] = to_list(user["mail-alias"])
user["mail-forward"] = to_list(user["mail-forward"])
user["domain"] = user["mail"].split("@")[1]
unknown_domains = []
if user["domain"] not in existing_domains:
unknown_domains.append(user["domain"])
unknown_domains += [
mail.split("@", 1)[1]
for mail in user["mail-alias"]
if mail.split("@", 1)[1] not in existing_domains
]
unknown_domains = set(unknown_domains)
if unknown_domains:
format_errors.append(
f"username '{user['username']}': unknown domains %s"
% ", ".join(unknown_domains)
)
if format_errors:
logger.error(
m18n.n(
"user_import_bad_line",
line=reader.line_num,
details=", ".join(format_errors),
)
)
is_well_formatted = False
continue
# Choose what to do with this line and prepare data
user["mailbox-quota"] = user["mailbox-quota"] or "0"
# User creation
if user["username"] not in existing_users:
# Generate password if not exists
# This could be used when reset password will be merged
if not user["password"]:
user["password"] = random_ascii(70)
actions["created"].append(user)
# User update
elif update:
actions["updated"].append(user)
if delete:
actions["deleted"] = [
user for user in existing_users if user not in users_in_csv
]
if delete and not users_in_csv:
logger.error(
"You used the delete option with an empty csv file ... You probably did not really mean to do that, did you !?"
)
is_well_formatted = False
if not is_well_formatted:
raise YunohostValidationError("user_import_bad_file")
total = len(actions["created"] + actions["updated"] + actions["deleted"])
if total == 0:
logger.info(m18n.n("user_import_nothing_to_do"))
return
# Apply creation, update and deletion operation
result = {"created": 0, "updated": 0, "deleted": 0, "errors": 0}
def progress(info=""):
progress.nb += 1
width = 20
bar = int(progress.nb * width / total)
bar = "[" + "#" * bar + "." * (width - bar) + "]"
if info:
bar += " > " + info
if progress.old == bar:
return
progress.old = bar
logger.info(bar)
progress.nb = 0
progress.old = ""
def on_failure(user, exception):
result["errors"] += 1
logger.error(user + ": " + str(exception))
def update(new_infos, old_infos=False):
remove_alias = None
remove_forward = None
remove_groups = []
add_groups = new_infos["groups"]
if old_infos:
new_infos["mail"] = (
None if old_infos["mail"] == new_infos["mail"] else new_infos["mail"]
)
remove_alias = list(
set(old_infos["mail-alias"]) - set(new_infos["mail-alias"])
)
remove_forward = list(
set(old_infos["mail-forward"]) - set(new_infos["mail-forward"])
)
new_infos["mail-alias"] = list(
set(new_infos["mail-alias"]) - set(old_infos["mail-alias"])
)
new_infos["mail-forward"] = list(
set(new_infos["mail-forward"]) - set(old_infos["mail-forward"])
)
remove_groups = list(set(old_infos["groups"]) - set(new_infos["groups"]))
add_groups = list(set(new_infos["groups"]) - set(old_infos["groups"]))
for group, infos in existing_groups.items():
# Loop only on groups in 'remove_groups'
# Ignore 'all_users' and primary group
if (
group in ["all_users", new_infos["username"]]
or group not in remove_groups
):
continue
# If the user is in this group (and it's not the primary group),
# remove the member from the group
if new_infos["username"] in infos["members"]:
user_group_update(
group,
remove=new_infos["username"],
sync_perm=False,
from_import=True,
)
user_update(
new_infos["username"],
new_infos["firstname"],
new_infos["lastname"],
new_infos["mail"],
new_infos["password"],
mailbox_quota=new_infos["mailbox-quota"],
mail=new_infos["mail"],
add_mailalias=new_infos["mail-alias"],
remove_mailalias=remove_alias,
remove_mailforward=remove_forward,
add_mailforward=new_infos["mail-forward"],
from_import=True,
)
for group in add_groups:
if group in ["all_users", new_infos["username"]]:
continue
user_group_update(
group, add=new_infos["username"], sync_perm=False, from_import=True
)
users = user_list(list(FIELDS_FOR_IMPORT.keys()))["users"]
operation_logger.start()
# We do delete and update before to avoid mail uniqueness issues
for user in actions["deleted"]:
try:
user_delete(user, purge=True, from_import=True)
result["deleted"] += 1
except YunohostError as e:
on_failure(user, e)
progress(f"Deleting {user}")
for user in actions["updated"]:
try:
update(user, users[user["username"]])
result["updated"] += 1
except YunohostError as e:
on_failure(user["username"], e)
progress(f"Updating {user['username']}")
for user in actions["created"]:
try:
user_create(
user["username"],
user["firstname"],
user["lastname"],
user["domain"],
user["password"],
user["mailbox-quota"],
from_import=True,
)
update(user)
result["created"] += 1
except YunohostError as e:
on_failure(user["username"], e)
progress(f"Creating {user['username']}")
permission_sync_to_user()
app_ssowatconf()
if result["errors"]:
msg = m18n.n("user_import_partial_failed")
if result["created"] + result["updated"] + result["deleted"] == 0:
msg = m18n.n("user_import_failed")
logger.error(msg)
operation_logger.error(msg)
else:
logger.success(m18n.n("user_import_success"))
operation_logger.success()
return result
# #
# Group subcategory # Group subcategory
# #
@ -733,7 +1089,13 @@ def user_group_delete(operation_logger, groupname, force=False, sync_perm=True):
@is_unit_operation([("groupname", "group")]) @is_unit_operation([("groupname", "group")])
def user_group_update( def user_group_update(
operation_logger, groupname, add=None, remove=None, force=False, sync_perm=True operation_logger,
groupname,
add=None,
remove=None,
force=False,
sync_perm=True,
from_import=False,
): ):
""" """
Update user informations Update user informations
@ -803,6 +1165,7 @@ def user_group_update(
] ]
if set(new_group) != set(current_group): if set(new_group) != set(current_group):
if not from_import:
operation_logger.start() operation_logger.start()
ldap = _get_ldap_interface() ldap = _get_ldap_interface()
try: try:
@ -813,13 +1176,15 @@ def user_group_update(
except Exception as e: except Exception as e:
raise YunohostError("group_update_failed", group=groupname, error=e) raise YunohostError("group_update_failed", group=groupname, error=e)
if sync_perm:
permission_sync_to_user()
if not from_import:
if groupname != "all_users": if groupname != "all_users":
logger.success(m18n.n("group_updated", group=groupname)) logger.success(m18n.n("group_updated", group=groupname))
else: else:
logger.debug(m18n.n("group_updated", group=groupname)) logger.debug(m18n.n("group_updated", group=groupname))
if sync_perm:
permission_sync_to_user()
return user_group_info(groupname) return user_group_info(groupname)

193
tests/add_missing_keys.py Normal file
View file

@ -0,0 +1,193 @@
# -*- coding: utf-8 -*-
import os
import re
import glob
import json
import yaml
import subprocess
###############################################################################
# Find used keys in python code #
###############################################################################
def find_expected_string_keys():
# Try to find :
# m18n.n( "foo"
# YunohostError("foo"
# YunohostValidationError("foo"
# # i18n: foo
p1 = re.compile(r"m18n\.n\(\n*\s*[\"\'](\w+)[\"\']")
p2 = re.compile(r"YunohostError\(\n*\s*[\'\"](\w+)[\'\"]")
p3 = re.compile(r"YunohostValidationError\(\n*\s*[\'\"](\w+)[\'\"]")
p4 = re.compile(r"# i18n: [\'\"]?(\w+)[\'\"]?")
python_files = glob.glob("src/yunohost/*.py")
python_files.extend(glob.glob("src/yunohost/utils/*.py"))
python_files.extend(glob.glob("src/yunohost/data_migrations/*.py"))
python_files.extend(glob.glob("src/yunohost/authenticators/*.py"))
python_files.extend(glob.glob("data/hooks/diagnosis/*.py"))
python_files.append("bin/yunohost")
for python_file in python_files:
content = open(python_file).read()
for m in p1.findall(content):
if m.endswith("_"):
continue
yield m
for m in p2.findall(content):
if m.endswith("_"):
continue
yield m
for m in p3.findall(content):
if m.endswith("_"):
continue
yield m
for m in p4.findall(content):
yield m
# For each diagnosis, try to find strings like "diagnosis_stuff_foo" (c.f. diagnosis summaries)
# Also we expect to have "diagnosis_description_<name>" for each diagnosis
p3 = re.compile(r"[\"\'](diagnosis_[a-z]+_\w+)[\"\']")
for python_file in glob.glob("data/hooks/diagnosis/*.py"):
content = open(python_file).read()
for m in p3.findall(content):
if m.endswith("_"):
# Ignore some name fragments which are actually concatenated with other stuff..
continue
yield m
yield "diagnosis_description_" + os.path.basename(python_file)[:-3].split("-")[
-1
]
# For each migration, expect to find "migration_description_<name>"
for path in glob.glob("src/yunohost/data_migrations/*.py"):
if "__init__" in path:
continue
yield "migration_description_" + os.path.basename(path)[:-3]
# For each default service, expect to find "service_description_<name>"
for service, info in yaml.safe_load(
open("data/templates/yunohost/services.yml")
).items():
if info is None:
continue
yield "service_description_" + service
# For all unit operations, expect to find "log_<name>"
# A unit operation is created either using the @is_unit_operation decorator
# or using OperationLogger(
cmd = "grep -hr '@is_unit_operation' src/yunohost/ -A3 2>/dev/null | grep '^def' | sed -E 's@^def (\\w+)\\(.*@\\1@g'"
for funcname in (
subprocess.check_output(cmd, shell=True).decode("utf-8").strip().split("\n")
):
yield "log_" + funcname
p4 = re.compile(r"OperationLogger\(\n*\s*[\"\'](\w+)[\"\']")
for python_file in python_files:
content = open(python_file).read()
for m in ("log_" + match for match in p4.findall(content)):
yield m
# Global settings descriptions
# Will be on a line like : ("service.ssh.allow_deprecated_dsa_hostkey", {"type": "bool", ...
p5 = re.compile(r" \(\n*\s*[\"\'](\w[\w\.]+)[\"\'],")
content = open("src/yunohost/settings.py").read()
for m in (
"global_settings_setting_" + s.replace(".", "_") for s in p5.findall(content)
):
yield m
# Keys for the actionmap ...
for category in yaml.safe_load(open("data/actionsmap/yunohost.yml")).values():
if "actions" not in category.keys():
continue
for action in category["actions"].values():
if "arguments" not in action.keys():
continue
for argument in action["arguments"].values():
extra = argument.get("extra")
if not extra:
continue
if "password" in extra:
yield extra["password"]
if "ask" in extra:
yield extra["ask"]
if "comment" in extra:
yield extra["comment"]
if "pattern" in extra:
yield extra["pattern"][1]
if "help" in extra:
yield extra["help"]
# Hardcoded expected keys ...
yield "admin_password" # Not sure that's actually used nowadays...
for method in ["tar", "copy", "custom"]:
yield "backup_applying_method_%s" % method
yield "backup_method_%s_finished" % method
for level in ["danger", "thirdparty", "warning"]:
yield "confirm_app_install_%s" % level
for errortype in ["not_found", "error", "warning", "success", "not_found_details"]:
yield "diagnosis_domain_expiration_%s" % errortype
yield "diagnosis_domain_not_found_details"
for errortype in ["bad_status_code", "connection_error", "timeout"]:
yield "diagnosis_http_%s" % errortype
yield "password_listed"
for i in [1, 2, 3, 4]:
yield "password_too_simple_%s" % i
checks = [
"outgoing_port_25_ok",
"ehlo_ok",
"fcrdns_ok",
"blacklist_ok",
"queue_ok",
"ehlo_bad_answer",
"ehlo_unreachable",
"ehlo_bad_answer_details",
"ehlo_unreachable_details",
]
for check in checks:
yield "diagnosis_mail_%s" % check
###############################################################################
# Load en locale json keys #
###############################################################################
def keys_defined_for_en():
return json.loads(open("locales/en.json").read()).keys()
###############################################################################
# Compare keys used and keys defined #
###############################################################################
expected_string_keys = set(find_expected_string_keys())
keys_defined = set(keys_defined_for_en())
undefined_keys = expected_string_keys.difference(keys_defined)
undefined_keys = sorted(undefined_keys)
j = json.loads(open("locales/en.json").read())
for key in undefined_keys:
j[key] = "FIXME"
json.dump(
j,
open("locales/en.json", "w"),
indent=4,
ensure_ascii=False,
sort_keys=True,
)

View file

@ -0,0 +1,53 @@
import re
import json
import glob
# List all locale files (except en.json being the ref)
locale_folder = "locales/"
locale_files = glob.glob(locale_folder + "*.json")
locale_files = [filename.split("/")[-1] for filename in locale_files]
locale_files.remove("en.json")
reference = json.loads(open(locale_folder + "en.json").read())
def fix_locale(locale_file):
this_locale = json.loads(open(locale_folder + locale_file).read())
fixed_stuff = False
# We iterate over all keys/string in en.json
for key, string in reference.items():
# Ignore check if there's no translation yet for this key
if key not in this_locale:
continue
# Then we check that every "{stuff}" (for python's .format())
# should also be in the translated string, otherwise the .format
# will trigger an exception!
subkeys_in_ref = [k[0] for k in re.findall(r"{(\w+)(:\w)?}", string)]
subkeys_in_this_locale = [
k[0] for k in re.findall(r"{(\w+)(:\w)?}", this_locale[key])
]
if set(subkeys_in_ref) != set(subkeys_in_this_locale) and (
len(subkeys_in_ref) == len(subkeys_in_this_locale)
):
for i, subkey in enumerate(subkeys_in_ref):
this_locale[key] = this_locale[key].replace(
"{%s}" % subkeys_in_this_locale[i], "{%s}" % subkey
)
fixed_stuff = True
if fixed_stuff:
json.dump(
this_locale,
open(locale_folder + locale_file, "w"),
indent=4,
ensure_ascii=False,
)
for locale_file in locale_files:
fix_locale(locale_file)

60
tests/reformat_locales.py Normal file
View file

@ -0,0 +1,60 @@
import re
def reformat(lang, transformations):
locale = open(f"locales/{lang}.json").read()
for pattern, replace in transformations.items():
locale = re.compile(pattern).sub(replace, locale)
open(f"locales/{lang}.json", "w").write(locale)
######################################################
godamn_spaces_of_hell = [
"\u00a0",
"\u2000",
"\u2001",
"\u2002",
"\u2003",
"\u2004",
"\u2005",
"\u2006",
"\u2007",
"\u2008",
"\u2009",
"\u200A",
"\u202f",
"\u202F",
"\u3000",
]
transformations = {s: " " for s in godamn_spaces_of_hell}
transformations.update(
{
"": "...",
}
)
reformat("en", transformations)
######################################################
transformations.update(
{
"courriel": "email",
"e-mail": "email",
"Courriel": "Email",
"E-mail": "Email",
"« ": "'",
"«": "'",
" »": "'",
"»": "'",
"": "'",
# r"$(\w{1,2})'|( \w{1,2})'": r"\1\2",
}
)
reformat("fr", transformations)