From 8a92727fb1b625faa0d5e150291c6aa3bae57f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Sat, 7 Sep 2019 13:01:45 +0200 Subject: [PATCH 01/47] Check that exist before the calculate the checksum --- data/helpers.d/backup | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/helpers.d/backup b/data/helpers.d/backup index dcf306085..d3ffffcd3 100644 --- a/data/helpers.d/backup +++ b/data/helpers.d/backup @@ -339,7 +339,7 @@ ynh_backup_if_checksum_is_different () { backup_file_checksum="" if [ -n "$checksum_value" ] then # Proceed only if a value was stored into the app settings - if ! echo "$checksum_value $file" | sudo md5sum -c --status + if [ -e $file ] && ! echo "$checksum_value $file" | sudo md5sum -c --status then # If the checksum is now different backup_file_checksum="/home/yunohost.conf/backup/$file.backup.$(date '+%Y%m%d.%H%M%S')" sudo mkdir -p "$(dirname "$backup_file_checksum")" From 6599ae1ad00e4b499e03340e0badba4ba635c2b8 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Tue, 10 Sep 2019 11:24:28 +0000 Subject: [PATCH 02/47] Translated using Weblate (Arabic) Currently translated at 65.5% (382 of 583 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ar/ --- locales/ar.json | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/locales/ar.json b/locales/ar.json index 285a0f819..c8a1bba7c 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -301,7 +301,7 @@ "service_add_failed": "تعذرت إضافة خدمة '{service:s}'", "service_added": "The service '{service:s}' has been added", "service_already_started": "Service '{service:s}' has already been started", - "service_already_stopped": "Service '{service:s}' has already been stopped", + "service_already_stopped": "إنّ خدمة '{service:s}' متوقفة مِن قبلُ", "service_cmd_exec_failed": "Unable to execute command '{command:s}'", "service_conf_file_backed_up": "The configuration file '{conf}' has been backed up to '{backup}'", "service_conf_file_copy_failed": "Unable to copy the new configuration file '{new}' to '{conf}'", @@ -329,7 +329,7 @@ "service_started": "تم إطلاق تشغيل خدمة '{service:s}'", "service_status_failed": "Unable to determine status of service '{service:s}'", "service_stop_failed": "", - "service_stopped": "The service '{service:s}' has been stopped", + "service_stopped": "تمّ إيقاف خدمة '{service:s}'", "service_unknown": "Unknown service '{service:s}'", "ssowat_conf_generated": "The SSOwat configuration has been generated", "ssowat_conf_updated": "The SSOwat configuration has been updated", @@ -343,7 +343,7 @@ "unlimit": "دون تحديد الحصة", "unrestore_app": "App '{app:s}' will not be restored", "update_cache_failed": "Unable to update APT cache", - "updating_apt_cache": "جارٍ تحديث قائمة الحُزم المتوفرة …", + "updating_apt_cache": "جارٍ جلب قائمة حُزم النظام المحدّثة المتوفرة…", "upgrade_complete": "إكتملت عملية الترقية و التحديث", "upgrading_packages": "عملية ترقية الحُزم جارية …", "upnp_dev_not_found": "No UPnP device found", @@ -412,7 +412,7 @@ "service_description_dnsmasq": "مُكلَّف بتحليل أسماء النطاقات (DNS)", "service_description_mysql": "يقوم بتخزين بيانات التطبيقات (قواعد بيانات SQL)", "service_description_rspamd": "يقوم بتصفية البريد المزعج و إدارة ميزات أخرى للبريد", - "service_description_yunohost-firewall": "يريد فتح و غلق منافذ الإتصال إلى الخدمات", + "service_description_yunohost-firewall": "يُدير فتح وإغلاق منافذ الإتصال إلى الخدمات", "users_available": "المستخدمون المتوفرون:", "aborting": "إلغاء.", "admin_password_too_long": "يرجى اختيار كلمة سرية أقصر مِن 127 حرف", @@ -426,5 +426,8 @@ "global_settings_setting_security_password_admin_strength": "قوة الكلمة السرية الإدارية", "global_settings_setting_security_password_user_strength": "قوة الكلمة السرية للمستخدم", "log_app_addaccess": "إضافة ترخيص بالنفاذ إلى '{}'", - "password_too_simple_1": "يجب أن يكون طول الكلمة السرية على الأقل 8 حروف" + "password_too_simple_1": "يجب أن يكون طول الكلمة السرية على الأقل 8 حروف", + "service_description_php7.0-fpm": "يُشغّل التطبيقات المكتوبة بلغة الـ PHP على Nginx", + "updating_app_lists": "جارٍ جلب التحديثات المتوفرة الخاصة بالتطبيقات…", + "already_up_to_date": "كل شيء على ما يرام! ليس هناك ما يتطلّب تحديثًا!" } From 4204f418900dcc09deae4cc721f4be142ca04310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carles=20Sadurn=C3=AD=20Anguita?= Date: Sun, 8 Sep 2019 09:07:26 +0000 Subject: [PATCH 03/47] Translated using Weblate (Catalan) Currently translated at 100.0% (583 of 583 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ca/ --- locales/ca.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/ca.json b/locales/ca.json index a9a0c2e0f..f5c040670 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -198,7 +198,7 @@ "executing_script": "Execució de l'script « {script:s} »…", "extracting": "Extracció en curs…", "dyndns_cron_installed": "S'ha instal·lat la tasca cron pel DynDNS", - "dyndns_cron_remove_failed": "No s'ha pogut eliminar la tasca cron pel DynDNS", + "dyndns_cron_remove_failed": "No s'ha pogut eliminar la tasca cron per a DynDNS: {error}", "dyndns_cron_removed": "S'ha eliminat la tasca cron pel DynDNS", "experimental_feature": "Atenció: aquesta funcionalitat és experimental i no es considera estable, no s'ha d'utilitzar a excepció de saber el que esteu fent.", "field_invalid": "Camp incorrecte « {:s} »", @@ -581,5 +581,6 @@ "system_groupname_exists": "El nom de grup ja existeix en el sistema de grups", "tools_update_failed_to_app_fetchlist": "No s'ha pogut actualitzar la llista d'aplicacions de YunoHost a causa de: {error}", "user_already_in_group": "L'usuari {user:s} ja és en el grup {group:s}", - "user_not_in_group": "L'usuari {user:s} no és en el grup {group:s}" + "user_not_in_group": "L'usuari {user:s} no és en el grup {group:s}", + "migration_description_0012_postgresql_password_to_md5_authentication": "Força l'autenticació postgresql a fer servir md5 per a les connexions locals" } From 8de950a4369baa812e0954dac73e937ab293b663 Mon Sep 17 00:00:00 2001 From: Aksel Kiesling Date: Tue, 3 Sep 2019 06:29:42 +0000 Subject: [PATCH 04/47] Translated using Weblate (German) Currently translated at 55.6% (324 of 583 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 55 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/locales/de.json b/locales/de.json index a4a6c236b..cef591411 100644 --- a/locales/de.json +++ b/locales/de.json @@ -301,5 +301,58 @@ "backup_archive_writing_error": "Die Dateien konnten nicht in der komprimierte Archiv-Backup hinzugefügt werden", "app_change_url_success": "Erfolgreiche Änderung der URL von {app:s} zu {domain:s}{path:s}", "backup_applying_method_borg": "Sende alle Dateien zur Sicherung ins borg-backup repository...", - "invalid_url_format": "ungültiges URL Format" + "invalid_url_format": "ungültiges URL Format", + "global_settings_bad_type_for_setting": "Falscher Typ für Einstellung {setting: s}. Empfangen: {receive_type: s}, aber erwartet: {expected_type: s}", + "global_settings_bad_choice_for_enum": "Falsche Wahl für die Einstellung {setting: s}. Habe '{choice: s}' erhalten, aber es stehen nur folgende Auswahlmöglichkeiten zur Verfügung: {available_choices: s}", + "file_does_not_exist": "Die Datei {path: s} existiert nicht.", + "experimental_feature": "Warnung: Diese Funktion ist experimentell und gilt nicht als stabil. Sie sollten sie nur verwenden, wenn Sie wissen, was Sie tun.", + "error_when_removing_sftpuser_group": "Fehler beim Versuch, die Gruppe sftpusers zu entfernen", + "edit_permission_with_group_all_users_not_allowed": "Sie dürfen die Berechtigung für die Gruppe \"all_users\" nicht bearbeiten. Verwenden Sie stattdessen \"yunohost user permission clear APP\" oder \"yunohost user permission add APP -u USER\".", + "edit_group_not_allowed": "Du bist nicht berechtigt zum Bearbeiten der Gruppe {group: s}", + "dyndns_domain_not_provided": "Der Dyndns-Anbieter {provider: s} kann die Domain(s) {domain: s} nicht bereitstellen.", + "dyndns_could_not_check_available": "Konnte nicht überprüfen, ob {domain: s} auf {provider: s} verfügbar ist.", + "dyndns_could_not_check_provide": "Konnte nicht überprüft, ob {provider: s} die Domain(s) {domain: s} bereitstellen kann.", + "domain_dyndns_dynette_is_unreachable": "YunoHost dynette kann nicht erreicht werden, entweder ist Ihr YunoHost nicht korrekt mit dem Internet verbunden oder der dynette-Server ist inaktiv. Fehler: {error}", + "domain_dns_conf_is_just_a_recommendation": "Dieser Befehl zeigt Ihnen, was die * empfohlene * Konfiguration ist. Die DNS-Konfiguration wird NICHT für Sie eingerichtet. Es liegt in Ihrer Verantwortung, Ihre DNS-Zone in Ihrem Registrar gemäß dieser Empfehlung zu konfigurieren.", + "dpkg_lock_not_available": "Dieser Befehl kann momentan nicht ausgeführt werden, da anscheinend ein anderes Programm die Sperre von dpkg (dem Systempaket-Manager) verwendet", + "confirm_app_install_thirdparty": "WARNUNG! Das Installieren von Anwendungen von Drittanbietern kann die Integrität und Sicherheit Deines Systems beeinträchtigen. Du solltest es wahrscheinlich NICHT installieren, es sei denn, Du weisst, was Du tust. Bist du bereit, dieses Risiko einzugehen? [{answers: s}] ", + "confirm_app_install_danger": "WARNUNG! Diese Anwendung ist noch experimentell (wenn nicht ausdrücklich \"not working\"/\"funktioniert nicht\") und es ist wahrscheinlich, dass Dein System Schaden nimmt! Du solltest es wahrscheinlich NICHT installieren, es sei denn, Du weisst, was Du tust. Bist du bereit, dieses Risiko einzugehen? [{answers: s}] ", + "confirm_app_install_warning": "Warnung: Diese Anwendung funktioniert möglicherweise, ist jedoch nicht gut in YunoHost integriert. Einige Funktionen wie Single Sign-On und Backup / Restore sind möglicherweise nicht verfügbar. Trotzdem installieren? [{answers: s}] ", + "backup_with_no_restore_script_for_app": "App {app: s} hat kein Wiederherstellungsskript. Das Backup dieser App kann nicht automatisch wiederhergestellt werden.", + "backup_with_no_backup_script_for_app": "App {app: s} hat kein Sicherungsskript. Ignoriere es.", + "backup_unable_to_organize_files": "Dateien im Archiv können mit der schnellen Methode nicht organisiert werden", + "backup_system_part_failed": "Der Systemteil '{part: s}' kann nicht gesichert werden", + "backup_permission": "Sicherungsberechtigung für App {app: s}", + "backup_output_symlink_dir_broken": "Sie haben einen fehlerhaften Symlink anstelle Ihres Archivverzeichnisses '{path: s}'. Möglicherweise haben Sie ein spezielles Setup, um Ihre Daten auf einem anderen Dateisystem zu sichern. In diesem Fall haben Sie wahrscheinlich vergessen, Ihre Festplatte oder Ihren USB-Schlüssel erneut einzuhängen oder anzuschließen.", + "backup_mount_archive_for_restore": "Archiv für Wiederherstellung vorbereiten…", + "backup_method_tar_finished": "Sicherungs-Tar-Archiv erstellt", + "backup_method_custom_finished": "Benutzerdefinierte Sicherungsmethode '{method: s}' beendet", + "backup_method_copy_finished": "Sicherungskopie beendet", + "backup_method_borg_finished": "Backup in Borg beendet", + "backup_custom_need_mount_error": "Bei der benutzerdefinierten Sicherungsmethode ist beim Arbeitsschritt \"Braucht ein Einhängen/Verbinden\" (need_mount) ein Fehler aufgetreten", + "backup_custom_mount_error": "Bei der benutzerdefinierten Sicherungsmethode ist beim Arbeitsschritt \"Einhängen/Verbinden\" ein Fehler aufgetreten", + "backup_custom_backup_error": "Bei der benutzerdefinierten Sicherungsmethode ist beim Arbeitsschritt \"Sicherung\" ein Fehler aufgetreten", + "backup_csv_creation_failed": "Die CSV-Datei, die für zukünftige Wiederherstellungsvorgänge erforderlich ist, kann nicht erstellt werden", + "backup_couldnt_bind": "{Src: s} konnte nicht an {dest: s} angebunden werden.", + "backup_borg_not_implemented": "Die Borg-Sicherungsmethode ist noch nicht implementiert", + "backup_ask_for_copying_if_needed": "Einige Dateien konnten mit der Methode, die es vermeidet vorübergehend Speicherplatz auf dem System zu verschwenden, nicht gesichert werden. Zur Durchführung der Sicherung sollten vorübergehend {size: s} MB verwendet werden. Sind Sie einverstanden?", + "backup_actually_backuping": "Erstelle nun ein Backup-Archiv aus den gesammelten Dateien …", + "ask_path": "Pfad", + "ask_new_path": "Neuer Pfad", + "ask_new_domain": "Neue Domain", + "apps_permission_restoration_failed": "Die Berechtigung '{permission: s}' für die Wiederherstellung der App {app: s} ist fehlgeschlagen", + "apps_permission_not_found": "Keine Berechtigung für die installierten Apps gefunden", + "app_upgrade_some_app_failed": "Einige Anwendungen können nicht aktualisiert werden", + "app_upgrade_app_name": "App {App} wird jetzt aktualisiert…", + "app_upgrade_several_apps": "Die folgenden Apps werden aktualisiert: {apps}", + "app_start_restore": "Anwendung {app} wird wiederhergestellt…", + "app_start_backup": "Sammeln von Dateien, die für {app} gesichert werden sollen…", + "app_start_remove": "Anwendung {app} wird entfernt…", + "app_start_install": "Anwendung {app} wird installiert…", + "app_not_upgraded": "Die folgenden Apps wurden nicht aktualisiert: {apps}", + "app_make_default_location_already_used": "Die App \"{app}\" kann nicht als Standard für die Domain \"{domain}\" festgelegt werden. Sie wird bereits von der anderen App \"{other_app}\" verwendet", + "aborting": "Breche ab.", + "app_action_cannot_be_ran_because_required_services_down": "Diese App erfordert einige Dienste, die derzeit nicht verfügbar sind. Bevor Sie fortfahren, sollten Sie versuchen, die folgenden Dienste neu zu starten (und möglicherweise untersuchen, warum sie nicht verfügbar sind): {services}", + "already_up_to_date": "Nichts zu tun! Alles ist bereits auf dem neusten Stand!", + "admin_password_too_long": "Bitte ein Passwort kürzer als 127 Zeichen wählen." } From ad417057270e1d547444822e6bd4f1e051840915 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Wed, 4 Sep 2019 18:47:59 +0000 Subject: [PATCH 05/47] Translated using Weblate (Occitan) Currently translated at 99.8% (582 of 583 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/oc/ --- locales/oc.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/locales/oc.json b/locales/oc.json index 8981fbadd..2cb33f4bd 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -157,7 +157,7 @@ "downloading": "Telecargament…", "dyndns_could_not_check_provide": "Impossible de verificar se {provider:s} pòt provesir {domain:s}.", "dyndns_cron_installed": "La tasca cron pel domeni DynDNS es installada", - "dyndns_cron_remove_failed": "Impossible de levar la tasca cron pel domeni DynDNS", + "dyndns_cron_remove_failed": "Impossible de levar la tasca cron pel domeni DynDNS a causa de {error}", "dyndns_cron_removed": "La tasca cron pel domeni DynDNS es levada", "dyndns_ip_update_failed": "Impossible d’actualizar l’adreça IP sul domeni DynDNS", "dyndns_ip_updated": "Vòstra adreça IP es estada actualizada pel domeni DynDNS", @@ -604,5 +604,7 @@ "edit_permission_with_group_all_users_not_allowed": "Podètz pas modificar las permissions del grop « all_users », utilizatz « yunohost user permission clear APP » o « yunohost user permission add APP -u USER ».", "mailbox_disabled": "La bóstia de las letras es desactivada per l’utilizaire {user:s}", "migration_0011_LDAP_config_dirty": "Sembla qu’avètz modificat manualament la configuracion LDAP. Per far aquesta migracion cal actualizar la configuracion LDAP.\nSalvagardatz la configuracion actuala, reïnicializatz la configuracion originala amb la comanda « yunohost tools regen-conf -f » e tornatz ensajar la migracion", - "need_define_permission_before": "Vos cal tornar definir las permission en utilizant « yunohost user permission add -u USER » abans de suprimir un grop permés" + "need_define_permission_before": "Vos cal tornar definir las permission en utilizant « yunohost user permission add -u USER » abans de suprimir un grop permés", + "permission_already_clear": "La permission « {permission:s} » ja levada per l’aplicacion {app:s}", + "migration_description_0012_postgresql_password_to_md5_authentication": "Forçar l’autentificacion postgresql a utilizar md5 per las connexions localas" } From d1c54fc2ca4e52e5dcaf714d051c0487be46649d Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Wed, 11 Sep 2019 10:04:08 +0000 Subject: [PATCH 06/47] Translated using Weblate (Arabic) Currently translated at 67.6% (394 of 583 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ar/ --- locales/ar.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/locales/ar.json b/locales/ar.json index c8a1bba7c..52e86d90b 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -429,5 +429,17 @@ "password_too_simple_1": "يجب أن يكون طول الكلمة السرية على الأقل 8 حروف", "service_description_php7.0-fpm": "يُشغّل التطبيقات المكتوبة بلغة الـ PHP على Nginx", "updating_app_lists": "جارٍ جلب التحديثات المتوفرة الخاصة بالتطبيقات…", - "already_up_to_date": "كل شيء على ما يرام! ليس هناك ما يتطلّب تحديثًا!" + "already_up_to_date": "كل شيء على ما يرام! ليس هناك ما يتطلّب تحديثًا!", + "service_description_nslcd": "يدير اتصال متسخدمي واي يونوهوست عبر طرفية سطر الأوامر", + "service_description_slapd": "يخزّن المستخدمين والنطاقات والمعلومات المتعلقة بها", + "service_reloaded": "تم إعادة تحميل خدمة '{service:s}'", + "service_restarted": "تم إعادة تشغيل خدمة '{service:s}'", + "group_unknown": "الفريق {group:s} مجهول", + "group_deletion_failed": "فشلت عملية حذف الفريق '{group}'", + "group_deleted": "تم حذف الفريق '{group}'", + "group_created": "تم إنشاء الفريق '{group}' بنجاح", + "group_name_already_exist": "الفريق {name:s} موجود بالفعل", + "error_when_removing_sftpuser_group": "حدث خطأ أثناء محاولة حذف فريق sftpusers", + "dyndns_could_not_check_available": "لا يمكن التحقق مِن أنّ {domain:s} متوفر على {provider:s}.", + "backup_mount_archive_for_restore": "جارٍ تهيئة النسخة الاحتياطية للاسترجاع…" } From 777b7248cc4c3de88d97da32946ea1088bfea048 Mon Sep 17 00:00:00 2001 From: Emmanuel Date: Wed, 11 Sep 2019 12:20:30 +0000 Subject: [PATCH 07/47] Translated using Weblate (French) Currently translated at 93.8% (547 of 583 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 2f22f1397..c94406a07 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -89,7 +89,7 @@ "done": "Terminé", "downloading": "Téléchargement en cours …", "dyndns_cron_installed": "La tâche cron pour le domaine DynDNS a été installée", - "dyndns_cron_remove_failed": "Impossible de supprimer la tâche cron pour le domaine DynDNS", + "dyndns_cron_remove_failed": "Impossible de supprimer la tâche cron DynDNS parce que: {error}", "dyndns_cron_removed": "La tâche cron pour le domaine DynDNS a été enlevée", "dyndns_ip_update_failed": "Impossible de mettre à jour l’adresse IP sur le domaine DynDNS", "dyndns_ip_updated": "Votre adresse IP a été mise à jour pour le domaine DynDNS", @@ -579,7 +579,7 @@ "group_name_already_exist": "Le groupe {name:s} existe déjà", "group_creation_failed": "Échec de la création du groupe '{group}'", "group_deletion_failed": "Échec de la suppression du groupe '{group}'", - "edit_permission_with_group_all_users_not_allowed": "Vous n'êtes pas autorisé à modifier les permissions pour le groupe 'all_users', utilisez'yunohost user permission clear APP' ou 'yunohost user permission add APP -u USER'.", + "edit_permission_with_group_all_users_not_allowed": "Vous n'êtes pas autorisé à modifier les permissions pour le groupe 'all_users', utilisez 'yunohost user permission clear APP' ou 'yunohost user permission add APP -u USER' à la place.", "log_permission_add": "Ajouter l'autorisation '{}' pour l'application '{}'", "log_permission_remove": "Supprimer l'autorisation '{}'", "log_permission_update": "Mise à jour de l'autorisation '{}' pour l'application '{}'", From 930b8378a1d39bfd158e1da6c192e3d3c8a34f9e Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Wed, 7 Aug 2019 02:16:43 +0200 Subject: [PATCH 08/47] [mod] remove unused variable --- src/yunohost/app.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 4a14c5e4b..1bab5eb31 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -590,9 +590,6 @@ def app_upgrade(app=[], url=None, file=None): from yunohost.hook import hook_add, hook_remove, hook_exec, hook_callback from yunohost.permission import permission_sync_to_user - # Retrieve interface - is_api = msettings.get('interface') == 'api' - try: app_list() except YunohostError: From 3130bb59ace5fa2ffdbe8ad275e2c76be55ea74d Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Wed, 7 Aug 2019 02:28:37 +0200 Subject: [PATCH 09/47] [mod] stop apps upgrade if one upgrade fail --- locales/en.json | 3 ++- src/yunohost/app.py | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/locales/en.json b/locales/en.json index be00d5b1e..cf15bb6f5 100644 --- a/locales/en.json +++ b/locales/en.json @@ -28,7 +28,8 @@ "app_location_unavailable": "This url is not available or conflicts with the already installed app(s):\n{apps:s}", "app_manifest_invalid": "Invalid app manifest: {error}", "app_no_upgrade": "No apps to upgrade", - "app_not_upgraded": "The following apps were not upgraded: {apps}", + "app_not_upgraded": "The following apps were not upgraded because a the app '{app}' failed to upgrade: {apps}", + "app_upgrade_stoped": "The upgrade of alls applications has been stopped to prevent possible dommages because the previous application failed to upgrade", "app_not_correctly_installed": "{app:s} seems to be incorrectly installed", "app_not_installed": "The application '{app:s}' is not installed. Here is the list of all installed apps: {all_apps}", "app_not_properly_removed": "{app:s} has not been properly removed", diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 1bab5eb31..a45766907 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -618,7 +618,7 @@ def app_upgrade(app=[], url=None, file=None): if len(apps) > 1: logger.info(m18n.n("app_upgrade_several_apps", apps=", ".join(apps))) - for app_instance_name in apps: + for number, app_instance_name in enumerate(apps): logger.info(m18n.n('app_upgrade_app_name', app=app_instance_name)) app_dict = app_info(app_instance_name, raw=True) @@ -672,9 +672,19 @@ def app_upgrade(app=[], url=None, file=None): if hook_exec(extracted_app_folder + '/scripts/upgrade', args=args_list, env=env_dict)[0] != 0: msg = m18n.n('app_upgrade_failed', app=app_instance_name) - not_upgraded_apps.append(app_instance_name) - logger.error(msg) operation_logger.error(msg) + + # display this is there are remaining apps + if apps[number + 1:]: + logger.error(m18n.n('app_upgrade_stoped')) + not_upgraded_apps = apps[number:] + # we don't want to continue upgrading apps here in case that breaks + # everything + raise YunohostError('app_not_upgraded', + failed_app=app_instance_name, + apps=', '.join(not_upgraded_apps)) + else: + raise YunohostError(msg) else: now = int(time.time()) # TODO: Move install_time away from app_setting @@ -709,9 +719,6 @@ def app_upgrade(app=[], url=None, file=None): hook_callback('post_app_upgrade', args=args_list, env=env_dict) operation_logger.success() - if not_upgraded_apps: - raise YunohostError('app_not_upgraded', apps=', '.join(not_upgraded_apps)) - permission_sync_to_user() logger.success(m18n.n('upgrade_complete')) From 889e34888dede81aa5532ebbccdedb055a86ab3b Mon Sep 17 00:00:00 2001 From: Bram Date: Wed, 7 Aug 2019 13:04:56 +0200 Subject: [PATCH 10/47] [mod] typo Co-Authored-By: decentral1se --- src/yunohost/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index a45766907..0ada585c3 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -674,7 +674,7 @@ def app_upgrade(app=[], url=None, file=None): msg = m18n.n('app_upgrade_failed', app=app_instance_name) operation_logger.error(msg) - # display this is there are remaining apps + # display this if there are remaining apps if apps[number + 1:]: logger.error(m18n.n('app_upgrade_stoped')) not_upgraded_apps = apps[number:] From 22be1a320b357c0ce652124d46bb369e1049f324 Mon Sep 17 00:00:00 2001 From: Bram Date: Wed, 7 Aug 2019 13:05:13 +0200 Subject: [PATCH 11/47] [mod] typo Co-Authored-By: decentral1se --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index cf15bb6f5..c8bee8610 100644 --- a/locales/en.json +++ b/locales/en.json @@ -29,7 +29,7 @@ "app_manifest_invalid": "Invalid app manifest: {error}", "app_no_upgrade": "No apps to upgrade", "app_not_upgraded": "The following apps were not upgraded because a the app '{app}' failed to upgrade: {apps}", - "app_upgrade_stoped": "The upgrade of alls applications has been stopped to prevent possible dommages because the previous application failed to upgrade", + "app_upgrade_stoped": "The upgrade of all applications has been stopped to prevent possible damage because the previous application failed to upgrade", "app_not_correctly_installed": "{app:s} seems to be incorrectly installed", "app_not_installed": "The application '{app:s}' is not installed. Here is the list of all installed apps: {all_apps}", "app_not_properly_removed": "{app:s} has not been properly removed", From 7926b761fd9abea76ff843778a81ec643d84f45e Mon Sep 17 00:00:00 2001 From: Bram Date: Wed, 7 Aug 2019 13:05:50 +0200 Subject: [PATCH 12/47] [mod] typo Co-Authored-By: decentral1se --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index c8bee8610..741af8c6a 100644 --- a/locales/en.json +++ b/locales/en.json @@ -28,7 +28,7 @@ "app_location_unavailable": "This url is not available or conflicts with the already installed app(s):\n{apps:s}", "app_manifest_invalid": "Invalid app manifest: {error}", "app_no_upgrade": "No apps to upgrade", - "app_not_upgraded": "The following apps were not upgraded because a the app '{app}' failed to upgrade: {apps}", + "app_not_upgraded": "The following apps were not upgraded because the app '{app}' failed to upgrade: {apps}", "app_upgrade_stoped": "The upgrade of all applications has been stopped to prevent possible damage because the previous application failed to upgrade", "app_not_correctly_installed": "{app:s} seems to be incorrectly installed", "app_not_installed": "The application '{app:s}' is not installed. Here is the list of all installed apps: {all_apps}", From a283b436e173f16bd84e46da4669753f4f7c8bbb Mon Sep 17 00:00:00 2001 From: Bram Date: Sun, 18 Aug 2019 18:50:20 +0200 Subject: [PATCH 13/47] [mod] typo Co-Authored-By: Alexandre Aubin --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 741af8c6a..22dd59bb2 100644 --- a/locales/en.json +++ b/locales/en.json @@ -29,7 +29,7 @@ "app_manifest_invalid": "Invalid app manifest: {error}", "app_no_upgrade": "No apps to upgrade", "app_not_upgraded": "The following apps were not upgraded because the app '{app}' failed to upgrade: {apps}", - "app_upgrade_stoped": "The upgrade of all applications has been stopped to prevent possible damage because the previous application failed to upgrade", + "app_upgrade_stopped": "The upgrade of all applications has been stopped to prevent possible damage because the previous application failed to upgrade", "app_not_correctly_installed": "{app:s} seems to be incorrectly installed", "app_not_installed": "The application '{app:s}' is not installed. Here is the list of all installed apps: {all_apps}", "app_not_properly_removed": "{app:s} has not been properly removed", From ef38f5e7b5f2a893f416baca7fccf164cf2fed81 Mon Sep 17 00:00:00 2001 From: Bram Date: Sun, 18 Aug 2019 18:51:16 +0200 Subject: [PATCH 14/47] [mod] typo Co-Authored-By: Alexandre Aubin --- src/yunohost/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 0ada585c3..684d83569 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -676,7 +676,7 @@ def app_upgrade(app=[], url=None, file=None): # display this if there are remaining apps if apps[number + 1:]: - logger.error(m18n.n('app_upgrade_stoped')) + logger.error(m18n.n('app_upgrade_stopped')) not_upgraded_apps = apps[number:] # we don't want to continue upgrading apps here in case that breaks # everything From fc85ae010229ac3f8efee0ab5c16f12133edabfc Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 15 Sep 2019 01:42:04 +0200 Subject: [PATCH 15/47] Key mismatch was causing an error + ended up reworking the sentence --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 22dd59bb2..e520c442d 100644 --- a/locales/en.json +++ b/locales/en.json @@ -28,7 +28,7 @@ "app_location_unavailable": "This url is not available or conflicts with the already installed app(s):\n{apps:s}", "app_manifest_invalid": "Invalid app manifest: {error}", "app_no_upgrade": "No apps to upgrade", - "app_not_upgraded": "The following apps were not upgraded because the app '{app}' failed to upgrade: {apps}", + "app_not_upgraded": "The app '{failed_app}' failed to upgrade, and as a consequence the following apps upgrades have been cancelled: {apps}", "app_upgrade_stopped": "The upgrade of all applications has been stopped to prevent possible damage because the previous application failed to upgrade", "app_not_correctly_installed": "{app:s} seems to be incorrectly installed", "app_not_installed": "The application '{app:s}' is not installed. Here is the list of all installed apps: {all_apps}", From 8e6ebd7979f4aa133ad477228a777417dc086e04 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 24 Aug 2019 01:31:17 +0200 Subject: [PATCH 16/47] Iteration on sanity checks for app operations --- locales/en.json | 1 + src/yunohost/app.py | 52 +++++++++++++++++++++++++++++++-------------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/locales/en.json b/locales/en.json index e520c442d..cc7955204 100644 --- a/locales/en.json +++ b/locales/en.json @@ -7,6 +7,7 @@ "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!", "app_action_cannot_be_ran_because_required_services_down": "This app requires some services which are currently down. Before continuing, you should try to restart the following services (and possibly investigate why they are down) : {services}", + "app_action_broke_system": "This action seem to have broke these important services: {services}", "app_already_installed": "{app:s} is already installed", "app_already_installed_cant_change_url": "This app is already installed. The url cannot be changed just by this function. Look into `app changeurl` if it's available.", "app_already_up_to_date": "{app:s} is already up to date", diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 684d83569..785613283 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -584,9 +584,6 @@ def app_upgrade(app=[], url=None, file=None): url -- Git url to fetch for upgrade """ - if packages.dpkg_is_broken(): - raise YunohostError("dpkg_is_broken") - from yunohost.hook import hook_add, hook_remove, hook_exec, hook_callback from yunohost.permission import permission_sync_to_user @@ -638,7 +635,7 @@ def app_upgrade(app=[], url=None, file=None): # Check requirements _check_manifest_requirements(manifest, app_instance_name=app_instance_name) - _check_services_status_for_app(manifest.get("services", [])) + _assert_system_is_sane_for_app(manifest, "pre") app_setting_path = APPS_SETTING_PATH + '/' + app_instance_name @@ -716,6 +713,7 @@ def app_upgrade(app=[], url=None, file=None): # So much win logger.success(m18n.n('app_upgraded', app=app_instance_name)) + _assert_system_is_sane_for_app(manifest, "post") hook_callback('post_app_upgrade', args=args_list, env=env_dict) operation_logger.success() @@ -736,8 +734,6 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu no_remove_on_failure -- Debug option to avoid removing the app on a failed installation force -- Do not ask for confirmation when installing experimental / low-quality apps """ - if packages.dpkg_is_broken(): - raise YunohostError("dpkg_is_broken") from yunohost.utils.ldap import _get_ldap_interface from yunohost.hook import hook_add, hook_remove, hook_exec, hook_callback @@ -801,7 +797,7 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu # Check requirements _check_manifest_requirements(manifest, app_id) - _check_services_status_for_app(manifest.get("services", [])) + _assert_system_is_sane_for_app(manifest, "pre") # Check if app can be forked instance_number = _installed_instance_number(app_id, last=True) + 1 @@ -894,8 +890,17 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu import traceback logger.exception(m18n.n('unexpected_error', error=u"\n" + traceback.format_exc())) finally: + try: + broke_the_system = False + _assert_system_is_sane_for_app(manifest, "post") + except Exception as e: + broke_the_system = True + error_msg = operation_logger.error(str(e)) + if install_retcode != 0: error_msg = operation_logger.error(m18n.n('unexpected_error', error='shell command return code: %s' % install_retcode)) + + if install_retcode != 0 or broke_the_system: if not no_remove_on_failure: # Setup environment for remove script env_dict_remove = {} @@ -926,6 +931,7 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu logger.warning(msg) operation_logger_remove.error(msg) else: + _assert_system_is_sane_for_app(manifest, "post") operation_logger_remove.success() # Clean tmp folders @@ -934,9 +940,6 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu app_ssowatconf() - if packages.dpkg_is_broken(): - logger.error(m18n.n("this_action_broke_dpkg")) - if install_retcode == -1: msg = m18n.n('operation_interrupted') + " " + error_msg raise YunohostError(msg, raw_msg=True) @@ -1004,6 +1007,8 @@ def app_remove(operation_logger, app): # script might date back from jessie install) _patch_php5(app_setting_path) + manifest = _get_manifest_of_app(app_setting_path) + os.system('cp -a %s /tmp/yunohost_remove && chown -hR admin: /tmp/yunohost_remove' % app_setting_path) os.system('chown -R admin: /tmp/yunohost_remove') os.system('chmod -R u+rX /tmp/yunohost_remove') @@ -1038,9 +1043,7 @@ def app_remove(operation_logger, app): permission_remove(app, l.split('.')[0], force=True, sync_perm=False) permission_sync_to_user() - - if packages.dpkg_is_broken(): - raise YunohostError("this_action_broke_dpkg") + _assert_system_is_sane_for_app(manifest, "post") @is_unit_operation(['permission','app']) @@ -2910,10 +2913,12 @@ def unstable_apps(): return output -def _check_services_status_for_app(services): +def _assert_system_is_sane_for_app(manifest, when): logger.debug("Checking that required services are up and running...") + services = manifest.get("services", []) + # Some apps use php-fpm or php5-fpm which is now php7.0-fpm def replace_alias(service): if service in ["php-fpm", "php5-fpm"]: @@ -2928,11 +2933,26 @@ def _check_services_status_for_app(services): service_filter = ["nginx", "php7.0-fpm", "mysql", "postfix"] services = [str(s) for s in services if s in service_filter] + if "nginx" not in services: + services = ["nginx"] + services + if "fail2ban" not in services: + services.append("fail2ban") + # List services currently down and raise an exception if any are found faulty_services = [s for s in services if service_status(s)["active"] != "active"] if faulty_services: - raise YunohostError('app_action_cannot_be_ran_because_required_services_down', - services=', '.join(faulty_services)) + if when == "pre": + raise YunohostError('app_action_cannot_be_ran_because_required_services_down', + services=', '.join(faulty_services)) + elif when == "post": + raise YunohostError('app_action_broke_system', + services=', '.join(faulty_services)) + + if packages.dpkg_is_broken(): + if when == "pre": + raise YunohostError("dpkg_is_broken") + elif when == "post": + raise YunohostError("this_action_broke_dpkg") def _patch_php5(app_folder): From 08ecace5ec1eddd048e890a9800068e7d9c605d1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 15 Sep 2019 02:21:26 +0200 Subject: [PATCH 17/47] Here we keep need to keep going and only display an error, otherwise the rest of the file ain't properly cleaned up --- src/yunohost/app.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 785613283..833d67402 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -931,8 +931,12 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu logger.warning(msg) operation_logger_remove.error(msg) else: - _assert_system_is_sane_for_app(manifest, "post") - operation_logger_remove.success() + try: + _assert_system_is_sane_for_app(manifest, "post") + except Exception as e: + operation_logger_remove.error(e) + else: + operation_logger_remove.success() # Clean tmp folders shutil.rmtree(app_setting_path) From c530325e293379f685a44e88a95abb7d2e5fce7e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 15 Sep 2019 02:22:29 +0200 Subject: [PATCH 18/47] Properly handle the sanity checks right after upgrades (in combination with managing the regular error code...). This is similar to what's done for app_install --- src/yunohost/app.py | 107 +++++++++++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 41 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 833d67402..0784f1ecc 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -666,56 +666,81 @@ def app_upgrade(app=[], url=None, file=None): # Execute App upgrade script os.system('chown -hR admin: %s' % INSTALL_TMP) - if hook_exec(extracted_app_folder + '/scripts/upgrade', - args=args_list, env=env_dict)[0] != 0: - msg = m18n.n('app_upgrade_failed', app=app_instance_name) - operation_logger.error(msg) - # display this if there are remaining apps - if apps[number + 1:]: - logger.error(m18n.n('app_upgrade_stopped')) - not_upgraded_apps = apps[number:] - # we don't want to continue upgrading apps here in case that breaks - # everything - raise YunohostError('app_not_upgraded', - failed_app=app_instance_name, - apps=', '.join(not_upgraded_apps)) + + try: + upgrade_retcode = hook_exec(extracted_app_folder + '/scripts/upgrade', + args=args_list, env=env_dict)[0] + except (KeyboardInterrupt, EOFError): + upgrade_retcode = -1 + except Exception: + import traceback + logger.exception(m18n.n('unexpected_error', error=u"\n" + traceback.format_exc())) + finally: + + # Did the script succeed ? + if upgrade_retcode != 0: + error_msg = m18n.n('app_upgrade_failed', app=app_instance_name) + operation_logger.error(error_msg) + + # Did it broke the system ? + try: + broke_the_system = False + _assert_system_is_sane_for_app(manifest, "post") + except Exception as e: + broke_the_system = True + error_msg = operation_logger.error(str(e)) + + # If upgrade failed or broke the system, + # raise an error and interrupt all other pending upgrades + if upgrade_retcode != 0 or broke_the_system: + + # display this if there are remaining apps + if apps[number + 1:]: + logger.error(m18n.n('app_upgrade_stopped')) + not_upgraded_apps = apps[number:] + # we don't want to continue upgrading apps here in case that breaks + # everything + raise YunohostError('app_not_upgraded', + failed_app=app_instance_name, + apps=', '.join(not_upgraded_apps)) + else: + raise YunohostError(error_msg, raw_msg=True) + + # Otherwise we're good and keep going ! else: - raise YunohostError(msg) - else: - now = int(time.time()) - # TODO: Move install_time away from app_setting - app_setting(app_instance_name, 'update_time', now) - status['upgraded_at'] = now + now = int(time.time()) + # TODO: Move install_time away from app_setting + app_setting(app_instance_name, 'update_time', now) + status['upgraded_at'] = now - # Clean hooks and add new ones - hook_remove(app_instance_name) - if 'hooks' in os.listdir(extracted_app_folder): - for hook in os.listdir(extracted_app_folder + '/hooks'): - hook_add(app_instance_name, extracted_app_folder + '/hooks/' + hook) + # Clean hooks and add new ones + hook_remove(app_instance_name) + if 'hooks' in os.listdir(extracted_app_folder): + for hook in os.listdir(extracted_app_folder + '/hooks'): + hook_add(app_instance_name, extracted_app_folder + '/hooks/' + hook) - # Store app status - with open(app_setting_path + '/status.json', 'w+') as f: - json.dump(status, f) + # Store app status + with open(app_setting_path + '/status.json', 'w+') as f: + json.dump(status, f) - # Replace scripts and manifest and conf (if exists) - os.system('rm -rf "%s/scripts" "%s/manifest.toml %s/manifest.json %s/conf"' % (app_setting_path, app_setting_path, app_setting_path, app_setting_path)) + # Replace scripts and manifest and conf (if exists) + os.system('rm -rf "%s/scripts" "%s/manifest.toml %s/manifest.json %s/conf"' % (app_setting_path, app_setting_path, app_setting_path, app_setting_path)) - if os.path.exists(os.path.join(extracted_app_folder, "manifest.json")): - os.system('mv "%s/manifest.json" "%s/scripts" %s' % (extracted_app_folder, extracted_app_folder, app_setting_path)) - if os.path.exists(os.path.join(extracted_app_folder, "manifest.toml")): - os.system('mv "%s/manifest.toml" "%s/scripts" %s' % (extracted_app_folder, extracted_app_folder, app_setting_path)) + if os.path.exists(os.path.join(extracted_app_folder, "manifest.json")): + os.system('mv "%s/manifest.json" "%s/scripts" %s' % (extracted_app_folder, extracted_app_folder, app_setting_path)) + if os.path.exists(os.path.join(extracted_app_folder, "manifest.toml")): + os.system('mv "%s/manifest.toml" "%s/scripts" %s' % (extracted_app_folder, extracted_app_folder, app_setting_path)) - for file_to_copy in ["actions.json", "actions.toml", "config_panel.json", "config_panel.toml", "conf"]: - if os.path.exists(os.path.join(extracted_app_folder, file_to_copy)): - os.system('cp -R %s/%s %s' % (extracted_app_folder, file_to_copy, app_setting_path)) + for file_to_copy in ["actions.json", "actions.toml", "config_panel.json", "config_panel.toml", "conf"]: + if os.path.exists(os.path.join(extracted_app_folder, file_to_copy)): + os.system('cp -R %s/%s %s' % (extracted_app_folder, file_to_copy, app_setting_path)) - # So much win - logger.success(m18n.n('app_upgraded', app=app_instance_name)) + # So much win + logger.success(m18n.n('app_upgraded', app=app_instance_name)) - _assert_system_is_sane_for_app(manifest, "post") - hook_callback('post_app_upgrade', args=args_list, env=env_dict) - operation_logger.success() + hook_callback('post_app_upgrade', args=args_list, env=env_dict) + operation_logger.success() permission_sync_to_user() From 488275422148a9fc79338c1a16bf22117178da4b Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Wed, 7 Aug 2019 02:28:37 +0200 Subject: [PATCH 19/47] [mod] stop apps upgrade if one upgrade fail --- src/yunohost/app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 0784f1ecc..d64baeaa3 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -667,7 +667,6 @@ def app_upgrade(app=[], url=None, file=None): # Execute App upgrade script os.system('chown -hR admin: %s' % INSTALL_TMP) - try: upgrade_retcode = hook_exec(extracted_app_folder + '/scripts/upgrade', args=args_list, env=env_dict)[0] From 3eb089ffc062b3f3cccd833103b3b218bb35e3ea Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 18 Aug 2019 01:41:34 +0200 Subject: [PATCH 20/47] Add unit/functional tests for apps --- src/yunohost/tests/test_apps.py | 248 ++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 src/yunohost/tests/test_apps.py diff --git a/src/yunohost/tests/test_apps.py b/src/yunohost/tests/test_apps.py new file mode 100644 index 000000000..3407c4f39 --- /dev/null +++ b/src/yunohost/tests/test_apps.py @@ -0,0 +1,248 @@ +import glob +import os +import pytest +import shutil +import requests + +from moulinette import m18n +from moulinette.utils.filesystem import mkdir + +from yunohost.app import app_install, app_remove, app_ssowatconf, _is_installed +from yunohost.domain import _get_maindomain, domain_add, domain_remove, domain_list +from yunohost.utils.error import YunohostError +from yunohost.tests.test_permission import check_LDAP_db_integrity, check_permission_for_apps + + +MAIN_DOMAIN = _get_maindomain() + + +def setup_function(function): + + clean() + +def teardown_function(function): + + clean() + +def clean(): + + # Make sure we have a ssowat + os.system("mkdir -p /etc/ssowat/") + app_ssowatconf() + + if _is_installed("legacy_app"): + app_remove("legacy_app") + + to_remove = [] + to_remove += glob.glob("/etc/nginx/conf.d/*.d/*legacy*") + for filepath in to_remove: + os.remove(filepath) + + to_remove = [] + to_remove += glob.glob("/etc/yunohost/apps/*legacy_app*") + to_remove += glob.glob("/var/www/*legacy*") + for folderpath in to_remove: + shutil.rmtree(folderpath, ignore_errors=True) + + +@pytest.fixture(autouse=True) +def check_LDAP_db_integrity_call(): + check_LDAP_db_integrity() + yield + check_LDAP_db_integrity() + + +@pytest.fixture(autouse=True) +def check_permission_for_apps_call(): + check_permission_for_apps() + yield + check_permission_for_apps() + +@pytest.fixture(scope="session") +def secondary_domain(request): + + if "example.test" not in domain_list()["domains"]: + domain_add("example.test") + + def remove_example_domain(): + domain_remove("example.test") + request.addfinalizer(remove_example_domain) + + return "example.test" + + +# +# Helpers # +# + +def app_expected_files(domain, app): + + yield "/etc/nginx/conf.d/%s.d/%s.conf" % (domain, app) + yield "/var/www/%s/index.html" % app + yield "/etc/yunohost/apps/%s/settings.yml" % app + yield "/etc/yunohost/apps/%s/manifest.json" % app + yield "/etc/yunohost/apps/%s/scripts/install" % app + yield "/etc/yunohost/apps/%s/scripts/remove" % app + yield "/etc/yunohost/apps/%s/scripts/backup" % app + yield "/etc/yunohost/apps/%s/scripts/restore" % app + + +def app_is_installed(domain, app): + + return _is_installed(app) and all(os.path.exists(f) for f in app_expected_files(domain, app)) + + +def app_is_not_installed(domain, app): + + return not _is_installed(app) and not all(os.path.exists(f) for f in app_expected_files(domain, app)) + + +def app_is_exposed_on_http(domain, path, message_in_page): + + try: + r = requests.get("http://127.0.0.1" + path + "/", headers={"Host": domain}, timeout=10) + return r.status_code == 200 and message_in_page in r.text + except Exception: + return False + + +def install_legacy_app(domain, path): + + app_install("./tests/apps/legacy_app_ynh", + args="domain=%s&path=%s" % (domain, path), + force=True) + + +def test_legacy_app_install_main_domain(): + + install_legacy_app(MAIN_DOMAIN, "/legacy") + + assert app_is_installed(MAIN_DOMAIN, "legacy_app") + assert app_is_exposed_on_http(MAIN_DOMAIN, "/legacy", "This is a dummy app") + + app_remove("legacy_app") + + assert app_is_not_installed(MAIN_DOMAIN, "legacy_app") + + +def test_legacy_app_install_secondary_domain(secondary_domain): + + install_legacy_app(secondary_domain, "/legacy") + + assert app_is_installed(secondary_domain, "legacy_app") + assert app_is_exposed_on_http(secondary_domain, "/legacy", "This is a dummy app") + + app_remove("legacy_app") + + assert app_is_not_installed(secondary_domain, "legacy_app") + + +def test_legacy_app_install_secondary_domain_on_root(secondary_domain): + + install_legacy_app(secondary_domain, "/") + + assert app_is_installed(secondary_domain, "legacy_app") + assert app_is_exposed_on_http(secondary_domain, "/", "This is a dummy app") + + app_remove("legacy_app") + + assert app_is_not_installed(secondary_domain, "legacy_app") + + +def test_legacy_app_install_private(secondary_domain): + + install_legacy_app(secondary_domain, "/legacy") + + settings = open("/etc/yunohost/apps/legacy_app/settings.yml", "r").read() + new_settings = settings.replace("\nunprotected_uris: /", "") + assert new_settings != settings + open("/etc/yunohost/apps/legacy_app/settings.yml", "w").write(new_settings) + app_ssowatconf() + + assert app_is_installed(secondary_domain, "legacy_app") + assert not app_is_exposed_on_http(secondary_domain, "/legacy", "This is a dummy app") + + app_remove("legacy_app") + + assert app_is_not_installed(secondary_domain, "legacy_app") + + +def test_legacy_app_install_unknown_domain(): + + with pytest.raises(YunohostError): + install_legacy_app("whatever.nope", "/legacy") + # TODO check error message + + assert app_is_not_installed("whatever.nope", "legacy_app") + + +def test_legacy_app_install_multiple_instances(secondary_domain): + + install_legacy_app(secondary_domain, "/foo") + install_legacy_app(secondary_domain, "/bar") + + assert app_is_installed(secondary_domain, "legacy_app") + assert app_is_exposed_on_http(secondary_domain, "/foo", "This is a dummy app") + + assert app_is_installed(secondary_domain, "legacy_app__2") + assert app_is_exposed_on_http(secondary_domain, "/bar", "This is a dummy app") + + app_remove("legacy_app") + + assert app_is_not_installed(secondary_domain, "legacy_app") + assert app_is_installed(secondary_domain, "legacy_app__2") + + app_remove("legacy_app__2") + + assert app_is_not_installed(secondary_domain, "legacy_app") + assert app_is_not_installed(secondary_domain, "legacy_app__2") + + +def test_legacy_app_install_path_unavailable(secondary_domain): + + # These will be removed in teardown + install_legacy_app(secondary_domain, "/legacy") + + with pytest.raises(YunohostError): + install_legacy_app(secondary_domain, "/") + # TODO check error message + + assert app_is_installed(secondary_domain, "legacy_app") + assert app_is_not_installed(secondary_domain, "legacy_app__2") + + +def test_legacy_app_failed_install(secondary_domain): + + mkdir("/var/www/legacy_app/", 0o750) + + with pytest.raises(YunohostError): + install_legacy_app(secondary_domain, "/legacy") + # TODO check error message + + assert app_is_not_installed(secondary_domain, "legacy_app") + + +def test_legacy_app_install_with_nginx_down(secondary_domain): + + os.system("systemctl stop nginx") + + with pytest.raises(YunohostError): + install_legacy_app(secondary_domain, "/legacy") + + os.system("systemctl start nginx") + + +def test_legacy_app_failed_remove(): + + # FIXME What's supposed to happen lol + raise NotImplementedError + + +def test_legacy_app_install_fucksup_nginx(): + + # FIXME What's supposed to happen lol + raise NotImplementedError + +def test_legacy_app_install_with_dpkg_fuckedup(): + + raise NotImplementedError From 799c68f1a88faa1036c874007c09c6e3e8d40620 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 24 Aug 2019 00:15:42 +0200 Subject: [PATCH 21/47] Moar tests for apps breaking the system --- src/yunohost/tests/test_apps.py | 119 +++++++++++++++++++++++++------- 1 file changed, 94 insertions(+), 25 deletions(-) diff --git a/src/yunohost/tests/test_apps.py b/src/yunohost/tests/test_apps.py index 3407c4f39..1dcffbf0e 100644 --- a/src/yunohost/tests/test_apps.py +++ b/src/yunohost/tests/test_apps.py @@ -13,9 +13,6 @@ from yunohost.utils.error import YunohostError from yunohost.tests.test_permission import check_LDAP_db_integrity, check_permission_for_apps -MAIN_DOMAIN = _get_maindomain() - - def setup_function(function): clean() @@ -33,17 +30,24 @@ def clean(): if _is_installed("legacy_app"): app_remove("legacy_app") + if _is_installed("break_yo_system"): + app_remove("break_yo_system") + to_remove = [] to_remove += glob.glob("/etc/nginx/conf.d/*.d/*legacy*") + to_remove += glob.glob("/etc/nginx/conf.d/*.d/*break_yo_system*") for filepath in to_remove: os.remove(filepath) to_remove = [] to_remove += glob.glob("/etc/yunohost/apps/*legacy_app*") + to_remove += glob.glob("/etc/yunohost/apps/*break_yo_system*") to_remove += glob.glob("/var/www/*legacy*") for folderpath in to_remove: shutil.rmtree(folderpath, ignore_errors=True) + os.system("systemctl start nginx") + @pytest.fixture(autouse=True) def check_LDAP_db_integrity_call(): @@ -78,13 +82,12 @@ def secondary_domain(request): def app_expected_files(domain, app): yield "/etc/nginx/conf.d/%s.d/%s.conf" % (domain, app) - yield "/var/www/%s/index.html" % app + if app.startswith("legacy_app"): + yield "/var/www/%s/index.html" % app yield "/etc/yunohost/apps/%s/settings.yml" % app yield "/etc/yunohost/apps/%s/manifest.json" % app yield "/etc/yunohost/apps/%s/scripts/install" % app yield "/etc/yunohost/apps/%s/scripts/remove" % app - yield "/etc/yunohost/apps/%s/scripts/backup" % app - yield "/etc/yunohost/apps/%s/scripts/restore" % app def app_is_installed(domain, app): @@ -113,16 +116,25 @@ def install_legacy_app(domain, path): force=True) +def install_break_yo_system(domain, breakwhat): + + app_install("./tests/apps/break_yo_system_ynh", + args="domain=%s&breakwhat=%s" % (domain, breakwhat), + force=True) + + def test_legacy_app_install_main_domain(): - install_legacy_app(MAIN_DOMAIN, "/legacy") + main_domain = _get_maindomain() - assert app_is_installed(MAIN_DOMAIN, "legacy_app") - assert app_is_exposed_on_http(MAIN_DOMAIN, "/legacy", "This is a dummy app") + install_legacy_app(main_domain, "/legacy") + + assert app_is_installed(main_domain, "legacy_app") + assert app_is_exposed_on_http(main_domain, "/legacy", "This is a dummy app") app_remove("legacy_app") - assert app_is_not_installed(MAIN_DOMAIN, "legacy_app") + assert app_is_not_installed(main_domain, "legacy_app") def test_legacy_app_install_secondary_domain(secondary_domain): @@ -211,15 +223,10 @@ def test_legacy_app_install_path_unavailable(secondary_domain): assert app_is_not_installed(secondary_domain, "legacy_app__2") -def test_legacy_app_failed_install(secondary_domain): - - mkdir("/var/www/legacy_app/", 0o750) +def test_legacy_app_install_bad_args(): with pytest.raises(YunohostError): - install_legacy_app(secondary_domain, "/legacy") - # TODO check error message - - assert app_is_not_installed(secondary_domain, "legacy_app") + install_legacy_app("this.domain.does.not.exists", "/legacy") def test_legacy_app_install_with_nginx_down(secondary_domain): @@ -229,20 +236,82 @@ def test_legacy_app_install_with_nginx_down(secondary_domain): with pytest.raises(YunohostError): install_legacy_app(secondary_domain, "/legacy") - os.system("systemctl start nginx") + +def test_legacy_app_failed_install(secondary_domain): + + # This will conflict with the folder that the app + # attempts to create, making the install fail + mkdir("/var/www/legacy_app/", 0o750) + + with pytest.raises(YunohostError): + install_legacy_app(secondary_domain, "/legacy") + # TODO check error message + + assert app_is_not_installed(secondary_domain, "legacy_app") -def test_legacy_app_failed_remove(): +def test_legacy_app_failed_remove(secondary_domain): - # FIXME What's supposed to happen lol - raise NotImplementedError + install_legacy_app(secondary_domain, "/legacy") + + # The remove script runs with set -eu and attempt to remove this + # file without -f, so will fail if it's not there ;) + os.remove("/etc/nginx/conf.d/%s.d/%s.conf" % (secondary_domain, "legacy_app")) + with pytest.raises(YunohostError): + app_remove("legacy") + + # + # Well here, we hit the classical issue where if an app removal script + # fails, so far there's no obvious way to make sure that all files related + # to this app got removed ... + # + assert app_is_not_installed(secondary_domain, "legacy") -def test_legacy_app_install_fucksup_nginx(): +def test_systemfuckedup_during_app_install(secondary_domain): - # FIXME What's supposed to happen lol - raise NotImplementedError + with pytest.raises(YunohostError): + install_break_yo_system(secondary_domain, breakwhat="install") + os.system("nginx -t") + os.system("systemctl status nginx") -def test_legacy_app_install_with_dpkg_fuckedup(): + assert app_is_not_installed(secondary_domain, "break_yo_system") + + +def test_systemfuckedup_during_app_remove(secondary_domain): + + install_break_yo_system(secondary_domain, breakwhat="remove") + + with pytest.raises(YunohostError): + app_remove("break_yo_system") + os.system("nginx -t") + os.system("systemctl status nginx") + + assert app_is_not_installed(secondary_domain, "break_yo_system") + + +def test_systemfuckedup_during_app_install_and_remove(secondary_domain): + + with pytest.raises(YunohostError): + install_break_yo_system(secondary_domain, breakwhat="everything") + + assert app_is_not_installed(secondary_domain, "break_yo_system") + + +def test_systemfuckedup_during_app_upgrade(secondary_domain): raise NotImplementedError + + install_break_yo_system(secondary_domain, breakwhat="upgrade") + + #app_upgrade("break_yo_system", ...) + + +def test_failed_multiple_app_upgrade(secondary_domain): + + raise NotImplementedError + + install_legacy_app(secondary_domain, "/legacy") + install_break_yo_system(secondary_domain, breakwhat="upgrade") + + app_upgrade(["break_yo_system", "legacy"]) From 28c73cb336aeef910f460308eb89465078ea2aab Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 15 Sep 2019 02:11:37 +0200 Subject: [PATCH 22/47] Implement those remaining tests --- src/yunohost/tests/test_apps.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/yunohost/tests/test_apps.py b/src/yunohost/tests/test_apps.py index 1dcffbf0e..9c85df1e9 100644 --- a/src/yunohost/tests/test_apps.py +++ b/src/yunohost/tests/test_apps.py @@ -7,7 +7,7 @@ import requests from moulinette import m18n from moulinette.utils.filesystem import mkdir -from yunohost.app import app_install, app_remove, app_ssowatconf, _is_installed +from yunohost.app import app_install, app_remove, app_ssowatconf, _is_installed, app_upgrade from yunohost.domain import _get_maindomain, domain_add, domain_remove, domain_list from yunohost.utils.error import YunohostError from yunohost.tests.test_permission import check_LDAP_db_integrity, check_permission_for_apps @@ -27,12 +27,15 @@ def clean(): os.system("mkdir -p /etc/ssowat/") app_ssowatconf() - if _is_installed("legacy_app"): - app_remove("legacy_app") - + # Gotta first remove break yo system + # because some remaining stuff might + # make the other app_remove crashs ;P if _is_installed("break_yo_system"): app_remove("break_yo_system") + if _is_installed("legacy_app"): + app_remove("legacy_app") + to_remove = [] to_remove += glob.glob("/etc/nginx/conf.d/*.d/*legacy*") to_remove += glob.glob("/etc/nginx/conf.d/*.d/*break_yo_system*") @@ -46,6 +49,7 @@ def clean(): for folderpath in to_remove: shutil.rmtree(folderpath, ignore_errors=True) + os.system("systemctl reset-failed nginx") # Reset failed quota for service to avoid running into start-limit rate ? os.system("systemctl start nginx") @@ -300,18 +304,18 @@ def test_systemfuckedup_during_app_install_and_remove(secondary_domain): def test_systemfuckedup_during_app_upgrade(secondary_domain): - raise NotImplementedError - install_break_yo_system(secondary_domain, breakwhat="upgrade") - #app_upgrade("break_yo_system", ...) + with pytest.raises(YunohostError): + app_upgrade("break_yo_system", file="./tests/apps/break_yo_system_ynh") def test_failed_multiple_app_upgrade(secondary_domain): - raise NotImplementedError - install_legacy_app(secondary_domain, "/legacy") install_break_yo_system(secondary_domain, breakwhat="upgrade") - app_upgrade(["break_yo_system", "legacy"]) + with pytest.raises(YunohostError): + app_upgrade(["break_yo_system", "legacy_app"], + file={"break_yo_system": "./tests/apps/break_yo_system_ynh", + "legacy": "./tests/apps/legacy_app_ynh"}) From a476deb7fbeb73b23d6282b869e07cbf23f316be Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 15 Sep 2019 02:11:53 +0200 Subject: [PATCH 23/47] Tweak test conf for easier debugging --- src/yunohost/tests/conftest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yunohost/tests/conftest.py b/src/yunohost/tests/conftest.py index a2dc585bd..ce321933c 100644 --- a/src/yunohost/tests/conftest.py +++ b/src/yunohost/tests/conftest.py @@ -41,11 +41,11 @@ def pytest_cmdline_main(config): root_handlers = set(handlers) # Define loggers level - level = 'INFO' + level = 'DEBUG' if config.option.yunodebug: tty_level = 'DEBUG' else: - tty_level = 'SUCCESS' + tty_level = 'INFO' # Custom logging configuration logging = { From aa3687ba029abae89f9a01d6e45df3ab843e93ea Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 15 Sep 2019 02:13:02 +0200 Subject: [PATCH 24/47] Small trick needed to be able to test chained app upgrades --- src/yunohost/app.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index d64baeaa3..6b75d82d0 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -620,7 +620,10 @@ def app_upgrade(app=[], url=None, file=None): app_dict = app_info(app_instance_name, raw=True) - if file: + if file and isinstance(file, dict): + # We use this dirty hack to test chained upgrades in unit/functional tests + manifest, extracted_app_folder = _extract_app_from_file(file[app_instance_name]) + elif file: manifest, extracted_app_folder = _extract_app_from_file(file) elif url: manifest, extracted_app_folder = _fetch_app_from_git(url) From 875c570c6dbcf406025478054ba09e98b6e09e81 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 16 Sep 2019 00:13:41 +0200 Subject: [PATCH 25/47] Check if the upgrade got manually interrupted, c.f. same stuff in app_install --- locales/en.json | 1 + src/yunohost/app.py | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index cc7955204..d584d80d9 100644 --- a/locales/en.json +++ b/locales/en.json @@ -409,6 +409,7 @@ "no_ipv6_connectivity": "IPv6 connectivity is not available", "no_restore_script": "No restore script found for the app '{app:s}'", "not_enough_disk_space": "Not enough free disk space on '{path:s}'", + "operation_interrupted": "The operation was manually interrupted?", "package_not_installed": "Package '{pkgname}' is not installed", "package_unexpected_error": "An unexpected error occurred processing the package '{pkgname}'", "package_unknown": "Unknown package '{pkgname}'", diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 0784f1ecc..41c3faed6 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -679,7 +679,10 @@ def app_upgrade(app=[], url=None, file=None): finally: # Did the script succeed ? - if upgrade_retcode != 0: + if upgrade_retcode == -1: + error_msg = m18n.n('operation_interrupted') + operation_logger.error(error_msg) + elif upgrade_retcode != 0: error_msg = m18n.n('app_upgrade_failed', app=app_instance_name) operation_logger.error(error_msg) From a2813bd774c35a7cb89403f86d5251c3a92d653d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Tue, 17 Sep 2019 20:23:36 +0200 Subject: [PATCH 26/47] Language reworked --- locales/en.json | 746 ++++++++++++++++++++++++------------------------ 1 file changed, 373 insertions(+), 373 deletions(-) diff --git a/locales/en.json b/locales/en.json index be00d5b1e..cab2afff8 100644 --- a/locales/en.json +++ b/locales/en.json @@ -2,67 +2,67 @@ "aborting": "Aborting.", "action_invalid": "Invalid action '{action:s}'", "admin_password": "Administration password", - "admin_password_change_failed": "Unable to change password", - "admin_password_changed": "The administration password has been changed", + "admin_password_change_failed": "Cannot change password", + "admin_password_changed": "The administration password now changed", "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!", - "app_action_cannot_be_ran_because_required_services_down": "This app requires some services which are currently down. Before continuing, you should try to restart the following services (and possibly investigate why they are down) : {services}", + "already_up_to_date": "Nothing to do. Everything is already up-to-date.", + "app_action_cannot_be_ran_because_required_services_down": "This app requires some services which are currently down. Before continuing, you should try to restart the following services (and possibly investigate why they are down): {services}", "app_already_installed": "{app:s} is already installed", - "app_already_installed_cant_change_url": "This app is already installed. The url cannot be changed just by this function. Look into `app changeurl` if it's available.", - "app_already_up_to_date": "{app:s} is already up to date", - "app_argument_choice_invalid": "Invalid choice for argument '{name:s}', it must be one of {choices:s}", - "app_argument_invalid": "Invalid value for argument '{name:s}': {error:s}", + "app_already_installed_cant_change_url": "This app is already installed. The URL cannot be changed just by this function. Look into `app changeurl` if it's available.", + "app_already_up_to_date": "{app:s} is already up-to-date", + "app_argument_choice_invalid": "Use one of these choices '{choices:s}' for the argument '{name:s}'", + "app_argument_invalid": "Pick a valid value for the argument '{name:s}': {error:s}", "app_argument_required": "Argument '{name:s}' is required", - "app_change_no_change_url_script": "The application {app_name:s} doesn't support changing it's URL yet, you might need to upgrade it.", - "app_change_url_failed_nginx_reload": "Failed to reload nginx. Here is the output of 'nginx -t':\n{nginx_errors:s}", + "app_change_no_change_url_script": "The application {app_name:s} doesn't support changing its URL yet, you might need to upgrade it.", + "app_change_url_failed_nginx_reload": "Could not reload NGINX. Here is the output of 'nginx -t':\n{nginx_errors:s}", "app_change_url_identical_domains": "The old and new domain/url_path are identical ('{domain:s}{path:s}'), nothing to do.", - "app_change_url_no_script": "This application '{app_name:s}' doesn't support url modification yet. Maybe you should upgrade the application.", - "app_change_url_success": "Successfully changed {app:s} url to {domain:s}{path:s}", - "app_extraction_failed": "Unable to extract installation files", - "app_id_invalid": "Invalid app id", + "app_change_url_no_script": "This application '{app_name:s}' doesn't support URL modification yet. Maybe you should upgrade it.", + "app_change_url_success": "{app:s} URL is now {domain:s}{path:s}", + "app_extraction_failed": "Could not extract the installation files", + "app_id_invalid": "Invalid app ID", "app_incompatible": "The app {app} is incompatible with your YunoHost version", - "app_install_files_invalid": "Invalid installation files", - "app_location_already_used": "The app '{app}' is already installed on that location ({path})", - "app_make_default_location_already_used": "Can't make the app '{app}' the default on the domain {domain} is already used by the other app '{other_app}'", - "app_location_install_failed": "Unable to install the app in this location because it conflit with the app '{other_app}' already installed on '{other_path}'", - "app_location_unavailable": "This url is not available or conflicts with the already installed app(s):\n{apps:s}", - "app_manifest_invalid": "Invalid app manifest: {error}", - "app_no_upgrade": "No apps to upgrade", - "app_not_upgraded": "The following apps were not upgraded: {apps}", + "app_install_files_invalid": "These files cannot be installed", + "app_location_already_used": "The app '{app}' is already installed in ({path})", + "app_make_default_location_already_used": "Can't make the app '{app}' the default on the domain, {domain} is already in use by the other app '{other_app}'", + "app_location_install_failed": "Cannot install the app there because it conflicts with the app '{other_app}' already installed in '{other_path}'", + "app_location_unavailable": "This URL is either unavailable, or conflicts with the already installed app(s):\n{apps:s}", + "app_manifest_invalid": "Something is wrong with the app manifest: {error}", + "app_no_upgrade": "Everything is up-to-date", + "app_not_upgraded": "These apps were not upgraded: {apps}", "app_not_correctly_installed": "{app:s} seems to be incorrectly installed", - "app_not_installed": "The application '{app:s}' is not installed. Here is the list of all installed apps: {all_apps}", + "app_not_installed": "The application '{app:s}' is not to be found among all installed apps: {all_apps}", "app_not_properly_removed": "{app:s} has not been properly removed", "app_package_need_update": "The app {app} package needs to be updated to follow YunoHost changes", - "app_removed": "{app:s} has been removed", + "app_removed": "{app:s} removed", "app_requirements_checking": "Checking required packages for {app}…", - "app_requirements_failed": "Unable to meet requirements for {app}: {error}", + "app_requirements_failed": "Did not meet requirements for {app}: {error}", "app_requirements_unmeet": "Requirements are not met for {app}, the package {pkgname} ({version}) must be {spec}", - "app_sources_fetch_failed": "Unable to fetch sources files, is the url correct?", + "app_sources_fetch_failed": "Could not fetch sources files, is the URL correct?", "app_start_install": "Installing application {app}…", "app_start_remove": "Removing application {app}…", - "app_start_backup": "Collecting files to be backuped for {app}…", + "app_start_backup": "Collecting files to be backed up for {app}…", "app_start_restore": "Restoring application {app}…", "app_unknown": "Unknown 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}…", - "app_upgrade_failed": "Unable to upgrade {app:s}", - "app_upgrade_some_app_failed": "Unable to upgrade some applications", - "app_upgraded": "{app:s} has been upgraded", + "app_upgrade_several_apps": "The following apps will be upgraded: {apps}", + "app_upgrade_app_name": "Now upgrading {app}…", + "app_upgrade_failed": "Could not upgrade {app:s}", + "app_upgrade_some_app_failed": "Some applications could not be upgraded", + "app_upgraded": "{app:s} upgraded", "apps_permission_not_found": "No permission found for the installed apps", - "apps_permission_restoration_failed": "Permission '{permission:s}' for app {app:s} restoration has failed", - "appslist_corrupted_json": "Could not load the application lists. It looks like {filename:s} is corrupted.", - "appslist_could_not_migrate": "Could not migrate app list {appslist:s}! Unable to parse the url… The old cron job has been kept in {bkp_file:s}.", - "appslist_fetched": "The application list {appslist:s} has been fetched", + "apps_permission_restoration_failed": "Grant the permission permission '{permission:s}' to restore {app:s}", + "appslist_corrupted_json": "Could not load the application lists. It looks like {filename:s} is damaged.", + "appslist_could_not_migrate": "Could not migrate the app list {appslist:s}! Could not parse the URL… The old cron job was kept kept in {bkp_file:s}.", + "appslist_fetched": "Updated application list {appslist:s} fetched", "appslist_migrating": "Migrating application list {appslist:s}…", - "appslist_name_already_tracked": "There is already a registered application list with name {name:s}.", - "appslist_removed": "The application list {appslist:s} has been removed", - "appslist_retrieve_bad_format": "Retrieved file for application list {appslist:s} is not valid", - "appslist_retrieve_error": "Unable to retrieve the remote application list {appslist:s}: {error:s}", + "appslist_name_already_tracked": "A registered application list with name {name:s} already exists.", + "appslist_removed": "{appslist:s} application list removed", + "appslist_retrieve_bad_format": "Could not read the fetched application list {appslist:s}", + "appslist_retrieve_error": "Cannot retrieve the remote application list {appslist:s}: {error:s}", "appslist_unknown": "Application list {appslist:s} unknown.", - "appslist_url_already_tracked": "There is already a registered application list with url {url:s}.", + "appslist_url_already_tracked": "There is already a registered application list with the URL {url:s}.", "ask_current_admin_password": "Current administration password", - "ask_email": "Email address", + "ask_email": "E-mail address", "ask_firstname": "First name", "ask_lastname": "Last name", "ask_list_to_remove": "List to remove", @@ -72,109 +72,109 @@ "ask_new_path": "New path", "ask_password": "Password", "ask_path": "Path", - "backup_abstract_method": "This backup method hasn't yet been implemented", + "backup_abstract_method": "This backup method has yet to be implemented", "backup_action_required": "You must specify something to save", - "backup_actually_backuping": "Now creating a backup archive from the files collected…", - "backup_app_failed": "Unable to back up the app '{app:s}'", + "backup_actually_backuping": "Creating a backup archive from the collected files…", + "backup_app_failed": "Could not back up the app '{app:s}'", "backup_applying_method_borg": "Sending all files to backup into borg-backup repository…", "backup_applying_method_copy": "Copying all files to backup…", "backup_applying_method_custom": "Calling the custom backup method '{method:s}'…", - "backup_applying_method_tar": "Creating the backup tar archive…", - "backup_archive_app_not_found": "App '{app:s}' not found in the backup archive", - "backup_archive_broken_link": "Unable to access backup archive (broken link to {path:s})", - "backup_archive_mount_failed": "Mounting the backup archive failed", - "backup_archive_name_exists": "The backup's archive name already exists", + "backup_applying_method_tar": "Creating the backup TAR archive…", + "backup_archive_app_not_found": "Could not find the app '{app:s}' in the backup archive", + "backup_archive_broken_link": "Could not access the backup archive (broken link to {path:s})", + "backup_archive_mount_failed": "Could not mounting the backup archive", + "backup_archive_name_exists": "A backup archive with this name already exists.", "backup_archive_name_unknown": "Unknown local backup archive named '{name:s}'", - "backup_archive_open_failed": "Unable to open the backup archive", - "backup_archive_system_part_not_available": "System part '{part:s}' not available in this backup", - "backup_archive_writing_error": "Unable to add files '{source:s}' (named in the archive: '{dest:s}') to backup into the compressed archive '{archive:s}'", - "backup_ask_for_copying_if_needed": "Some files couldn't be prepared to be backuped using the method that avoid to temporarily waste space on the system. To perform the backup, {size:s}MB should be used temporarily. Do you agree?", - "backup_borg_not_implemented": "Borg backup method is not yet implemented", - "backup_cant_mount_uncompress_archive": "Unable to mount in readonly mode the uncompress archive directory", - "backup_cleaning_failed": "Unable to clean-up the temporary backup directory", + "backup_archive_open_failed": "Could not open the backup archive", + "backup_archive_system_part_not_available": "System part '{part:s}' unavailable in this backup", + "backup_archive_writing_error": "Could not add the add files '{source:s}' (named in the archive: '{dest:s}') to be backed up into the compressed archive '{archive:s}'", + "backup_ask_for_copying_if_needed": "Some files could not be prepared for bacup using the method that avoids temporarily wasting space on the system. To perform the backup, {size:s}MB will be temporarily. Do you agree?", + "backup_borg_not_implemented": "The Borg backup method is not yet implemented", + "backup_cant_mount_uncompress_archive": "Could not mount the uncompressed archive write protected", + "backup_cleaning_failed": "Could not clean-up the temporary backup folder", "backup_copying_to_organize_the_archive": "Copying {size:s}MB to organize the archive", - "backup_couldnt_bind": "Couldn't bind {src:s} to {dest:s}.", + "backup_couldnt_bind": "Could not bind {src:s} to {dest:s}.", "backup_created": "Backup created", "backup_creating_archive": "Creating the backup archive…", - "backup_creation_failed": "Backup creation failed", - "backup_csv_addition_failed": "Unable to add files to backup into the CSV file", - "backup_csv_creation_failed": "Unable to create the CSV file needed for future restore operations", - "backup_custom_backup_error": "Custom backup method failure on 'backup' step", - "backup_custom_mount_error": "Custom backup method failure on 'mount' step", - "backup_custom_need_mount_error": "Custom backup method failure on 'need_mount' step", - "backup_delete_error": "Unable to delete '{path:s}'", - "backup_deleted": "The backup has been deleted", - "backup_extracting_archive": "Extracting the backup archive…", - "backup_hook_unknown": "Backup hook '{hook:s}' unknown", - "backup_invalid_archive": "Invalid backup archive", - "backup_method_borg_finished": "Backup into borg finished", - "backup_method_copy_finished": "Backup copy finished", + "backup_creation_failed": "Could not create the backup creation", + "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_custom_backup_error": "Custom backup method could not get past the 'backup' step", + "backup_custom_mount_error": "Custom backup method could not get past the 'mount' step", + "backup_custom_need_mount_error": "Custom backup method could not get past 'need_mount' step", + "backup_delete_error": "Could not delete '{path:s}'", + "backup_deleted": "Backup deleted", + "backup_extracting_archive": "Extracting backup archive…", + "backup_hook_unknown": "The backup hook '{hook:s}' is unknown", + "backup_invalid_archive": "This is not a backup archive", + "backup_method_borg_finished": "Backup into Borg finished", + "backup_method_copy_finished": "Backup copy finalized", "backup_method_custom_finished": "Custom backup method '{method:s}' finished", - "backup_method_tar_finished": "Backup tar archive created", + "backup_method_tar_finished": "TAR backup archive created", "backup_mount_archive_for_restore": "Preparing archive for restoration…", - "backup_no_uncompress_archive_dir": "Uncompress archive directory doesn't exist", - "backup_nothings_done": "There is nothing to save", - "backup_output_directory_forbidden": "Forbidden output directory. Backups can't be created in /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var or /home/yunohost.backup/archives sub-folders", - "backup_output_directory_not_empty": "The output directory is not empty", + "backup_no_uncompress_archive_dir": "There is no such uncompressed archive directory", + "backup_nothings_done": "Nothing to save", + "backup_output_directory_forbidden": "Pick a different output directory. Backups can not be created in /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var or /home/yunohost.backup/archives sub-folders", + "backup_output_directory_not_empty": "You should pick an empty output directory", "backup_output_directory_required": "You must provide an output directory for the backup", - "backup_output_symlink_dir_broken": "You have a broken symlink instead of your archives directory '{path:s}'. You may have a specific setup to backup your data on an other filesystem, in this case you probably forgot to remount or plug your hard dirve or usb key.", + "backup_output_symlink_dir_broken": "You have a broken symlink in place of your archive directory '{path:s}'. You may have a specific setup to backup your data on another filesystem, in this case you probably forgot to remount or plug in your hard-drive or USB key.", "backup_permission": "Backup permission for app {app:s}", - "backup_php5_to_php7_migration_may_fail": "Could not convert your archive to support php7, your php apps may fail to restore (reason: {error:s})", + "backup_php5_to_php7_migration_may_fail": "Could not convert your archive to support PHP 7, you may be unable to restore your PHP apps (reason: {error:s})", "backup_running_hooks": "Running backup hooks…", - "backup_system_part_failed": "Unable to backup the '{part:s}' system part", - "backup_unable_to_organize_files": "Unable to organize files in the archive with the quick method", - "backup_with_no_backup_script_for_app": "App {app:s} has no backup script. Ignoring.", - "backup_with_no_restore_script_for_app": "App {app:s} has no restore script, you won't be able to automatically restore the backup of this app.", - "certmanager_acme_not_configured_for_domain": "Certificate for domain {domain:s} does not appear to be correctly installed. Please run cert-install for this domain first.", - "certmanager_attempt_to_renew_nonLE_cert": "The certificate for domain {domain:s} is not issued by Let's Encrypt. Cannot renew it automatically!", - "certmanager_attempt_to_renew_valid_cert": "The certificate for domain {domain:s} is not about to expire! (You may use --force if you know what you're doing)", + "backup_system_part_failed": "Could not backup the '{part:s}' system part", + "backup_unable_to_organize_files": "Could not use the quick method to organize files in the archive", + "backup_with_no_backup_script_for_app": "The app '{app:s}' has no backup script. Ignoring.", + "backup_with_no_restore_script_for_app": "The '{app:s}' has no restoration script, you will not be able to automatically restore the backup of this app.", + "certmanager_acme_not_configured_for_domain": "Certificate for the domain '{domain:s}' does not appear to be correctly installed. Please run 'cert-install' for this domain first.", + "certmanager_attempt_to_renew_nonLE_cert": "The certificate for the domain '{domain:s}' is not issued by Let's Encrypt. Cannot renew it automatically!", + "certmanager_attempt_to_renew_valid_cert": "The certificate for the domain '{domain:s}' is not about to expire! (You may use --force if you know what you're doing)", "certmanager_attempt_to_replace_valid_cert": "You are attempting to overwrite a good and valid certificate for domain {domain:s}! (Use --force to bypass)", "certmanager_cannot_read_cert": "Something wrong happened when trying to open current certificate for domain {domain:s} (file: {file:s}), reason: {reason:s}", - "certmanager_cert_install_success": "Successfully installed Let's Encrypt certificate for domain {domain:s}!", - "certmanager_cert_install_success_selfsigned": "Successfully installed a self-signed certificate for domain {domain:s}!", - "certmanager_cert_renew_success": "Successfully renewed Let's Encrypt certificate for domain {domain:s}!", - "certmanager_cert_signing_failed": "Signing the new certificate failed", - "certmanager_certificate_fetching_or_enabling_failed": "Sounds like enabling the new certificate for {domain:s} failed somehow…", - "certmanager_conflicting_nginx_file": "Unable to prepare domain for ACME challenge: the nginx configuration file {filepath:s} is conflicting and should be removed first", - "certmanager_couldnt_fetch_intermediate_cert": "Timed out when trying to fetch intermediate certificate from Let's Encrypt. Certificate installation/renewal aborted - please try again later.", - "certmanager_domain_cert_not_selfsigned": "The certificate for domain {domain:s} is not self-signed. Are you sure you want to replace it? (Use --force)", - "certmanager_domain_dns_ip_differs_from_public_ip": "The DNS 'A' record for domain {domain:s} is different from this server IP. 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 disable those checks.)", - "certmanager_domain_http_not_working": "It seems that the domain {domain:s} cannot be accessed through HTTP. Please check your DNS and nginx configuration is okay", - "certmanager_domain_not_resolved_locally": "The domain {domain:s} cannot be resolved from inside your Yunohost server. This might happen if you recently modified your DNS record. If so, please wait a few hours for it to propagate. If the issue persists, consider adding {domain:s} to /etc/hosts. (If you know what you are doing, use --no-checks to disable those checks.)", - "certmanager_domain_unknown": "Unknown domain {domain:s}", - "certmanager_error_no_A_record": "No DNS 'A' record found for {domain:s}. You need to make your domain name point to your machine to be able to install a Let's Encrypt certificate! (If you know what you are doing, use --no-checks to disable those checks.)", - "certmanager_hit_rate_limit": "Too many certificates already issued for exact set of domains {domain:s} recently. Please try again later. See https://letsencrypt.org/docs/rate-limits/ for more details", - "certmanager_http_check_timeout": "Timed out when server tried to contact itself through HTTP using public IP address (domain {domain:s} with ip {ip:s}). You may be experiencing hairpinning issue or the firewall/router ahead of your server is misconfigured.", - "certmanager_no_cert_file": "Unable to read certificate file for domain {domain:s} (file: {file:s})", - "certmanager_self_ca_conf_file_not_found": "Configuration file not found for self-signing authority (file: {file:s})", - "certmanager_unable_to_parse_self_CA_name": "Unable to parse name of self-signing authority (file: {file:s})", - "confirm_app_install_warning": "Warning: this application 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:s}] ", + "certmanager_cert_install_success": "Let's Encrypt certificate now installed for the domain '{domain:s}'", + "certmanager_cert_install_success_selfsigned": "Self-signed certificate now installed for the domain '{domain:s}'", + "certmanager_cert_renew_success": "Let's Encrypt certificate renewed for the domain '{domain:s}'", + "certmanager_cert_signing_failed": "Could not sign the new certificate", + "certmanager_certificate_fetching_or_enabling_failed": "It seems actually using the new certificate for {domain:s} did not work…", + "certmanager_conflicting_nginx_file": "Could not prepare domain for ACME challenge: the NGINX configuration file {filepath:s} is conflicting and should be removed first", + "certmanager_couldnt_fetch_intermediate_cert": "Timed out when trying to fetch intermediate certificate from Let's Encrypt. Certificate installation/renewal aborted—please try again later.", + "certmanager_domain_cert_not_selfsigned": "The certificate for domain {domain:s} 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 'A' record for the domain '{domain:s}' is different from this server IP. 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": "It seems the domain {domain:s} cannot be accessed through HTTP. Check that your DNS and NGINX configuration is correct", + "certmanager_domain_not_resolved_locally": "The domain {domain:s} cannot be resolved from inside your YunoHost server. This might happen if you recently modified your DNS record. If so, please wait a few hours for it to propagate. If the issue persists, consider adding {domain:s} to /etc/hosts. (If you know what you are doing, use '--no-checks' to turn off those checks.)", + "certmanager_domain_unknown": "Unknown domain '{domain:s}'", + "certmanager_error_no_A_record": "No DNS 'A' record found for '{domain:s}'. You need to make your domain name point to your machine to be able to install a Let's Encrypt certificate. (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:s} recently. Please try again later. See https://letsencrypt.org/docs/rate-limits/ for more details", + "certmanager_http_check_timeout": "Timed out when server tried to contact itself through HTTP using a public IP address (domain '{domain:s}' with IP '{ip:s}'). You may be experiencing a hairpinning issue, or the firewall/router ahead of your server is misconfigured.", + "certmanager_no_cert_file": "Could not read the certificate file for the domain {domain:s} (file: {file:s})", + "certmanager_self_ca_conf_file_not_found": "Could not find configuration file for self-signing authority (file: {file:s})", + "certmanager_unable_to_parse_self_CA_name": "Could not parse name of self-signing authority (file: {file:s})", + "confirm_app_install_warning": "Warning: This application 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:s}] ", "confirm_app_install_danger": "WARNING! This application is still experimental (if not explicitly not working) and it is likely to break your system! You should probably NOT install it unless you know what you are doing. Are you willing to take that risk? [{answers:s}] ", - "confirm_app_install_thirdparty": "WARNING! Installing 3rd party applications may compromise the integrity and security of your system. You should probably NOT install it unless you know what you are doing. Are you willing to take that risk? [{answers:s}] ", + "confirm_app_install_thirdparty": "WARNING! Installing third-party applications may compromise the integrity and security of your system. You should probably NOT install it unless you know what you are doing. Are you willing to take that risk? [{answers:s}] ", "custom_app_url_required": "You must provide a URL to upgrade your custom app {app:s}", "custom_appslist_name_required": "You must provide a name for your custom app list", - "diagnosis_debian_version_error": "Can't retrieve the Debian version: {error}", - "diagnosis_kernel_version_error": "Can't retrieve kernel version: {error}", - "diagnosis_monitor_disk_error": "Can't monitor disks: {error}", - "diagnosis_monitor_network_error": "Can't monitor network: {error}", - "diagnosis_monitor_system_error": "Can't monitor system: {error}", + "diagnosis_debian_version_error": "Could not retrieve the Debian version: {error}", + "diagnosis_kernel_version_error": "Could not retrieve kernel version: {error}", + "diagnosis_monitor_disk_error": "Could not monitor disks: {error}", + "diagnosis_monitor_network_error": "Could not monitor network: {error}", + "diagnosis_monitor_system_error": "Could not monitor system: {error}", "diagnosis_no_apps": "No installed application", - "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 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 dpkg --configure -a`.", "dpkg_lock_not_available": "This command can't be ran right now because another program seems to be using the lock of dpkg (the system package manager)", - "dnsmasq_isnt_installed": "dnsmasq does not seem to be installed, please run 'apt-get remove bind9 && apt-get install dnsmasq'", - "domain_cannot_remove_main": "Cannot remove main domain. Set a new main domain first", - "domain_cert_gen_failed": "Unable to generate certificate", - "domain_created": "The domain has been created", - "domain_creation_failed": "Unable to create domain", - "domain_deleted": "The domain has been deleted", - "domain_deletion_failed": "Unable to delete domain", - "domain_dns_conf_is_just_a_recommendation": "This command shows you what is the *recommended* configuration. It does not actually set up the DNS configuration for you. It is your responsability to configure your DNS zone in your registrar according to this recommendation.", - "domain_dyndns_already_subscribed": "You've already subscribed to a DynDNS domain", - "domain_dyndns_dynette_is_unreachable": "Unable to reach YunoHost dynette, either your YunoHost is not correctly connected to the internet or the dynette server is down. Error: {error}", - "domain_dyndns_invalid": "Invalid domain to use with DynDNS", + "dnsmasq_isnt_installed": "Dnsmasq does not seem to be installed, please run 'apt-get remove bind9 && apt-get install it'", + "domain_cannot_remove_main": "Cannot remove main domain. Set one first", + "domain_cert_gen_failed": "Could not generate certificate", + "domain_created": "Domain created", + "domain_creation_failed": "Could not create domain", + "domain_deleted": "Domain deleted", + "domain_deletion_failed": "Could not delete domain", + "domain_dns_conf_is_just_a_recommendation": "This command shows you the *recommended* configuration. It does not actually set up the DNS configuration for you. It is your responsability to configure your DNS zone in your registrar according to this recommendation.", + "domain_dyndns_already_subscribed": "You have already subscribed to a DynDNS domain", + "domain_dyndns_dynette_is_unreachable": "Could not reach YunoHost dynette, either your YunoHost is not correctly connected to the Internet, or the dynette server is down. Error: {error}", + "domain_dyndns_invalid": "This domain can not be used with DynDNS", "domain_dyndns_root_unknown": "Unknown DynDNS root domain", - "domain_exists": "Domain already exists", - "domain_hostname_failed": "Failed to set new hostname. This might cause issue later (not sure about it... it might be fine).", + "domain_exists": "The domain already exists", + "domain_hostname_failed": "Could not set new hostname. This might cause an issue later (it might be fine).", "domain_uninstall_app_first": "One or more apps are installed on this domain. Please uninstall them before proceeding to domain removal", "domain_unknown": "Unknown domain", "domain_zone_exists": "DNS zone file already exists", @@ -184,80 +184,80 @@ "downloading": "Downloading…", "dyndns_could_not_check_provide": "Could not check if {provider:s} can provide {domain:s}.", "dyndns_could_not_check_available": "Could not check if {domain:s} is available on {provider:s}.", - "dyndns_cron_installed": "The DynDNS cron job has been installed", - "dyndns_cron_remove_failed": "Unable to remove the DynDNS cron job because: {error}", - "dyndns_cron_removed": "The DynDNS cron job has been removed", - "dyndns_ip_update_failed": "Unable to update IP address on DynDNS", - "dyndns_ip_updated": "Your IP address has been updated on DynDNS", - "dyndns_key_generating": "DNS key is being generated, it may take a while…", + "dyndns_cron_installed": "DynDNS cron job created", + "dyndns_cron_remove_failed": "Could not remove the DynDNS cron job because: {error}", + "dyndns_cron_removed": "DynDNS cron job removed", + "dyndns_ip_update_failed": "Could not update IP address to DynDNS", + "dyndns_ip_updated": "Updated your IP on DynDNS", + "dyndns_key_generating": "Generating DNS key… It may take a while.", "dyndns_key_not_found": "DNS key not found for the domain", - "dyndns_no_domain_registered": "No domain has been registered with DynDNS", - "dyndns_registered": "The DynDNS domain has been registered", - "dyndns_registration_failed": "Unable to register DynDNS domain: {error:s}", - "dyndns_domain_not_provided": "Dyndns provider {provider:s} cannot provide domain {domain:s}.", - "dyndns_unavailable": "Domain {domain:s} is not available.", + "dyndns_no_domain_registered": "No domain registered with DynDNS", + "dyndns_registered": "DynDNS domain registered", + "dyndns_registration_failed": "Could not register DynDNS domain: {error:s}", + "dyndns_domain_not_provided": "DynDNS provider {provider:s} cannot provide domain {domain:s}.", + "dyndns_unavailable": "The domain '{domain:s}' is unavailable.", "edit_group_not_allowed": "You are not allowed to edit the group {group:s}", - "edit_permission_with_group_all_users_not_allowed": "You are not allowed to edit permission for group 'all_users', use 'yunohost user permission clear APP' or 'yunohost user permission add APP -u USER' instead.", - "error_when_removing_sftpuser_group": "Error when trying remove sftpusers group", + "edit_permission_with_group_all_users_not_allowed": "You are not allowed to edit permission for the group 'all_users', use 'yunohost user permission clear APP' or 'yunohost user permission add APP -u USER' instead.", + "error_when_removing_sftpuser_group": "Could not remove the sftpusers group", "executing_command": "Executing command '{command:s}'…", "executing_script": "Executing script '{script:s}'…", "extracting": "Extracting…", - "experimental_feature": "Warning: this feature is experimental and not consider stable, you shouldn't be using it except if 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.", "field_invalid": "Invalid field '{:s}'", - "file_does_not_exist": "The file {path:s} does not exists.", - "firewall_reload_failed": "Unable to reload the firewall", - "firewall_reloaded": "The firewall has been reloaded", - "firewall_rules_cmd_failed": "Some firewall rules commands have failed. For more information, see the log.", + "file_does_not_exist": "The file {path:s} does not exist.", + "firewall_reload_failed": "Could not reload the firewall", + "firewall_reloaded": "Firewall reloaded", + "firewall_rules_cmd_failed": "Some firewall rules commands have failed. More info in log.", "format_datetime_short": "%m/%d/%Y %I:%M %p", - "global_settings_bad_choice_for_enum": "Bad choice for setting {setting:s}, received '{choice:s}' but available choices are : {available_choices:s}", - "global_settings_bad_type_for_setting": "Bad type for setting {setting:s}, received {received_type:s}, except {expected_type:s}", - "global_settings_cant_open_settings": "Failed to open settings file, reason: {reason:s}", - "global_settings_cant_serialize_settings": "Failed to serialize settings data, reason: {reason:s}", - "global_settings_cant_write_settings": "Failed to write settings file, reason: {reason:s}", - "global_settings_key_doesnt_exists": "The key '{settings_key:s}' doesn't exists in the global settings, you can see all the available keys by doing 'yunohost settings list'", - "global_settings_reset_success": "Success. Your previous settings have been backuped in {path:s}", + "global_settings_bad_choice_for_enum": "Bad choice for setting {setting:s}, received '{choice:s}', but available choices are: {available_choices:s}", + "global_settings_bad_type_for_setting": "Bad type for setting {setting:s}, received {received_type:s}, expected {expected_type:s}", + "global_settings_cant_open_settings": "Could not open settings file, reason: {reason:s}", + "global_settings_cant_serialize_settings": "Could not serialize settings data, reason: {reason:s}", + "global_settings_cant_write_settings": "Could not save settings file, reason: {reason:s}", + "global_settings_key_doesnt_exists": "The key '{settings_key:s}' 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:s}", "global_settings_setting_example_bool": "Example boolean option", "global_settings_setting_example_enum": "Example enum option", "global_settings_setting_example_int": "Example int option", "global_settings_setting_example_string": "Example string option", - "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_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_unknown_setting_from_settings_file": "Unknown key in settings: '{setting_key:s}', discarding it and save it in /etc/yunohost/settings-unknown.json", + "global_settings_unknown_setting_from_settings_file": "Unknown key in settings: '{setting_key:s}', discard it and save it in /etc/yunohost/settings-unknown.json", "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Allow the use of (deprecated) DSA hostkey for the SSH daemon configuration", - "global_settings_unknown_type": "Unexpected situation, the setting {setting:s} appears to have the type {unknown_type:s} but it's 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 - though it is good practice to use longer password (i.e. a passphrase) and/or to use various kind 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 - though it is good practice to use longer password (i.e. a passphrase) and/or to use various kind of characters (uppercase, lowercase, digits and special characters).", - "group_already_allowed": "Group '{group:s}' already has permission '{permission:s}' enabled for app '{app:s}'", - "group_already_disallowed": "Group '{group:s}' already has permissions '{permission:s}' disabled for app '{app:s}'", + "global_settings_unknown_type": "Unexpected situation, the setting {setting:s} appears to have the type {unknown_type:s} 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—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—though it is good practice to use longer password (i.e. a passphrase) and/or to a variation of characters (uppercase, lowercase, digits and special characters).", + "group_already_allowed": "Group '{group:s}' already has permission '{permission:s}' turned on for the app '{app:s}'", + "group_already_disallowed": "Group '{group:s}' already has permissions '{permission:s}' turned off for the app '{app:s}'", "group_name_already_exist": "Group {name:s} already exist", - "group_created": "Group '{group}' successfully created", - "group_creation_failed": "Group creation failed for group '{group}'", + "group_created": "Group '{group}' created", + "group_creation_failed": "Could not create the group '{group}'", "group_deleted": "Group '{group}' deleted", - "group_deletion_failed": "Group '{group} 'deletion failed", + "group_deletion_failed": "Could not delete the group '{group}'", "group_deletion_not_allowed": "The group {group:s} cannot be deleted manually.", - "group_info_failed": "Group info failed", - "group_unknown": "Group {group:s} unknown", + "group_info_failed": "Could not present group info", + "group_unknown": "The group '{group:s}' is unknown", "group_updated": "Group '{group}' updated", - "group_update_failed": "Group update failed for group '{group}'", - "hook_exec_failed": "Script execution failed: {path:s}", - "hook_exec_not_terminated": "Script execution did not finish properly: {path:s}", - "hook_json_return_error": "Failed to read return from hook {path:s}. Error: {msg:s}. Raw content: {raw_content}", - "hook_list_by_invalid": "Invalid property to list hook by", + "group_update_failed": "Could not update the group '{group}'", + "hook_exec_failed": "Could not run script: {path:s}", + "hook_exec_not_terminated": "Script did not finish properly: {path:s}", + "hook_json_return_error": "Could not read return from hook {path:s}. Error: {msg:s}. Raw content: {raw_content}", + "hook_list_by_invalid": "This property can not be used to list hooks", "hook_name_unknown": "Unknown hook name '{name:s}'", "installation_complete": "Installation complete", - "installation_failed": "Installation failed", - "invalid_url_format": "Invalid URL format", + "installation_failed": "Something went wrong with the installation", + "invalid_url_format": "Something is wrong with the URL", "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", - "log_corrupted_md_file": "The yaml metadata file associated with logs is corrupted: '{md_file}\nError: {error}'", + "log_corrupted_md_file": "The YAML metadata file associated with logs is damaged: '{md_file}\nError: {error}'", "log_category_404": "The log category '{category}' does not exist", "log_link_to_log": "Full log of this operation: '{desc}'", "log_help_to_get_log": "To view the log of the operation '{desc}', use the command 'yunohost log display {name}'", - "log_link_to_failed_log": "The operation '{desc}' has failed! To get help, please provide the full log of this operation by clicking here", - "log_help_to_get_failed_log": "The operation '{desc}' has failed! To get help, please share the full log of this operation using the command 'yunohost log display {name} --share'", + "log_link_to_failed_log": "Could not complete the operation '{desc}'. Please provide the full log of this operation by clicking here 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 display {name} --share' to get help", "log_does_exists": "There is not 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_addaccess": "Add access to '{}'", @@ -265,11 +265,11 @@ "log_app_clearaccess": "Remove all access to '{}'", "log_app_fetchlist": "Add an application list", "log_app_removelist": "Remove an application list", - "log_app_change_url": "Change the url of '{}' application", - "log_app_install": "Install '{}' application", - "log_app_remove": "Remove '{}' application", - "log_app_upgrade": "Upgrade '{}' application", - "log_app_makedefault": "Make '{}' as default application", + "log_app_change_url": "Change the URL of '{}' application", + "log_app_install": "Install the '{}' application", + "log_app_remove": "Remove the '{}' application", + "log_app_upgrade": "Upgrade the '{}' application", + "log_app_makedefault": "Make '{}' the default application", "log_available_on_yunopaste": "This log is now available via {url}", "log_backup_restore_system": "Restore system from a backup archive", "log_backup_restore_app": "Restore '{}' from a backup archive", @@ -278,9 +278,9 @@ "log_domain_add": "Add '{}' domain into system configuration", "log_domain_remove": "Remove '{}' domain from system configuration", "log_dyndns_subscribe": "Subscribe to a YunoHost subdomain '{}'", - "log_dyndns_update": "Update the ip associated with your YunoHost subdomain '{}'", - "log_letsencrypt_cert_install": "Install Let's encrypt certificate on '{}' domain", - "log_permission_add": "Add permission '{}' for app '{}'", + "log_dyndns_update": "Update the IP associated with your YunoHost subdomain '{}'", + "log_letsencrypt_cert_install": "Install a Let's encrypt certificate on '{}' domain", + "log_permission_add": "Add the '{}' permission for the app '{}'", "log_permission_remove": "Remove permission '{}'", "log_permission_update": "Update permission '{}' for app '{}'", "log_selfsigned_cert_install": "Install self signed certificate on '{}' domain", @@ -291,104 +291,104 @@ "log_user_group_add": "Add '{}' group", "log_user_group_delete": "Delete '{}' group", "log_user_group_update": "Update '{}' group", - "log_user_update": "Update information of '{}' user", + "log_user_update": "Update info of '{}' user", "log_user_permission_add": "Update '{}' permission", "log_user_permission_remove": "Update '{}' permission", - "log_tools_maindomain": "Make '{}' as main domain", + "log_tools_maindomain": "Make '{}' the main domain", "log_tools_migrations_migrate_forward": "Migrate forward", "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", - "ldap_init_failed_to_create_admin": "LDAP initialization failed to create admin user", - "ldap_initialized": "LDAP has been initialized", + "ldap_init_failed_to_create_admin": "LDAP initialization could not create admin user", + "ldap_initialized": "LDAP initialized", "license_undefined": "undefined", - "mail_alias_remove_failed": "Unable to remove mail alias '{mail:s}'", - "mail_domain_unknown": "Unknown mail address domain '{domain:s}'", - "mail_forward_remove_failed": "Unable to remove mail forward '{mail:s}'", - "mailbox_disabled": "Mailbox disabled for user {user:s}", - "mailbox_used_space_dovecot_down": "Dovecot mailbox service need to be up, if you want to get mailbox used space", - "mail_unavailable": "This email address is reserved and shall be automatically allocated to the very first user", - "maindomain_change_failed": "Unable to change the main domain", - "maindomain_changed": "The main domain has been changed", - "migrate_tsig_end": "Migration to hmac-sha512 finished", - "migrate_tsig_failed": "Migrating the dyndns domain {domain} to hmac-sha512 failed, rolling back. Error: {error_code} - {error}", - "migrate_tsig_start": "Not secure enough key algorithm detected for TSIG signature of domain '{domain}', initiating migration to the more secure one hmac-sha512", - "migrate_tsig_wait": "Let's wait 3min for the dyndns server to take the new key into account…", + "mail_alias_remove_failed": "Could not remove e-mail alias '{mail:s}'", + "mail_domain_unknown": "Unknown e-mail address for domain '{domain:s}'", + "mail_forward_remove_failed": "Could not remove e-mail forwarding '{mail:s}'", + "mailbox_disabled": "E-mail turned off for user {user:s}", + "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", + "maindomain_change_failed": "Could not change the main domain", + "maindomain_changed": "The main domain now changed", + "migrate_tsig_end": "Migration to HMAC-SHA-512 finished", + "migrate_tsig_failed": "Could not migrate the DynDNS domain '{domain}' to HMAC-SHA-512, rolling back. Error: {error_code}, {error}", + "migrate_tsig_start": "Insufficiently secure key algorithm detected for TSIG signature of the domain '{domain}', initiating migration to the more secure HMAC-SHA-512", + "migrate_tsig_wait": "Waiting three minutes for the DynDNS server to take the new key into account…", "migrate_tsig_wait_2": "2min…", "migrate_tsig_wait_3": "1min…", - "migrate_tsig_wait_4": "30 secondes…", - "migrate_tsig_not_needed": "You do not appear to use a dyndns domain, so no migration is needed!", + "migrate_tsig_wait_4": "30 seconds…", + "migrate_tsig_not_needed": "You do not appear to use a DynDNS domain, so no migration is needed.", "migration_description_0001_change_cert_group_to_sslcert": "Change certificates group permissions from 'metronome' to 'ssl-cert'", - "migration_description_0002_migrate_to_tsig_sha256": "Improve security of dyndns TSIG by using SHA512 instead of MD5", + "migration_description_0002_migrate_to_tsig_sha256": "Improve security of DynDNS TSIG updates by using SHA-512 instead of MD5", "migration_description_0003_migrate_to_stretch": "Upgrade the system to Debian Stretch and YunoHost 3.0", "migration_description_0004_php5_to_php7_pools": "Reconfigure the PHP pools to use PHP 7 instead of 5", - "migration_description_0005_postgresql_9p4_to_9p6": "Migrate databases from postgresql 9.4 to 9.6", + "migration_description_0005_postgresql_9p4_to_9p6": "Migrate databases from PostgreSQL 9.4 to 9.6", "migration_description_0006_sync_admin_and_root_passwords": "Synchronize admin and root passwords", "migration_description_0007_ssh_conf_managed_by_yunohost_step1": "Let the SSH configuration be managed by YunoHost (step 1, automatic)", "migration_description_0008_ssh_conf_managed_by_yunohost_step2": "Let the SSH configuration be managed by YunoHost (step 2, manual)", "migration_description_0009_decouple_regenconf_from_services": "Decouple the regen-conf mechanism from services", - "migration_description_0010_migrate_to_apps_json": "Remove deprecated appslists and use the new unified 'apps.json' list instead", - "migration_description_0011_setup_group_permission": "Setup user group and setup permission for apps and services", - "migration_description_0012_postgresql_password_to_md5_authentication": "Force postgresql authentication to use md5 for local connections", + "migration_description_0010_migrate_to_apps_json": "Remove deprecated applists and use the new unified 'apps.json' list instead", + "migration_description_0011_setup_group_permission": "Set up user group and set up permission for apps and services", + "migration_description_0012_postgresql_password_to_md5_authentication": "Force PostgreSQL authentication to use MD5 for local connections", "migration_0003_start": "Starting migration to Stretch. The logs will be available in {logfile}.", "migration_0003_patching_sources_list": "Patching the sources.lists…", "migration_0003_main_upgrade": "Starting main upgrade…", - "migration_0003_fail2ban_upgrade": "Starting the fail2ban upgrade…", - "migration_0003_restoring_origin_nginx_conf": "Your file /etc/nginx/nginx.conf was edited somehow. The migration is going to reset back to its original state first… The previous file will be available as {backup_dest}.", - "migration_0003_yunohost_upgrade": "Starting the yunohost package upgrade… The migration will end, but the actual upgrade will happen right after. After the operation is complete, you might have to re-log on the webadmin.", - "migration_0003_not_jessie": "The current debian distribution is not Jessie!", - "migration_0003_system_not_fully_up_to_date": "Your system is not fully up to date. Please perform a regular upgrade before running the migration to stretch.", - "migration_0003_still_on_jessie_after_main_upgrade": "Something wrong happened during the main upgrade: system is still on Jessie!? To investigate the issue, please look at {log}:s…", - "migration_0003_general_warning": "Please note that this migration is a delicate operation. While the YunoHost team did its best to review and test it, the migration might still break parts of the system or apps.\n\nTherefore, we recommend you to:\n - Perform a backup of any critical data or app. More infos 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.\n\nAdditionally, the port for SMTP, used by external email clients (like Thunderbird or K9-Mail) was changed from 465 (SSL/TLS) to 587 (STARTTLS). The old port 465 will automatically be closed and the new port 587 will be opened in the firewall. You and your users *will* have to adapt the configuration of your email clients accordingly!", - "migration_0003_problematic_apps_warning": "Please note that the following possibly problematic installed apps were detected. It looks like those were not installed from an applist or are not flagged as 'working'. Consequently, we cannot guarantee that they will still work after the upgrade: {problematic_apps}", - "migration_0003_modified_files": "Please note that the following files were found to be manually modified and might be overwritten at the end of the upgrade: {manually_modified_files}", - "migration_0005_postgresql_94_not_installed": "Postgresql was not installed on your system. Nothing to do!", - "migration_0005_postgresql_96_not_installed": "Postgresql 9.4 has been found to be installed, but not postgresql 9.6!? Something weird might have happened on your system:(…", - "migration_0005_not_enough_space": "Not enough space is available in {path} to run the migration right now:(.", + "migration_0003_fail2ban_upgrade": "Starting the Fail2Ban upgrade…", + "migration_0003_restoring_origin_nginx_conf": "Your file /etc/nginx/nginx.conf was edited somehow. The migration is going to reset to its original state first… The previous file will be available as {backup_dest}.", + "migration_0003_yunohost_upgrade": "Starting the YunoHost package upgrade… The migration will end, but the actual upgrade will happen immediately afterwards. After the operation is complete, you might have to log in on the webadmin page again.", + "migration_0003_not_jessie": "The current Debian distribution is not Jessie!", + "migration_0003_system_not_fully_up_to_date": "Your system is not fully up-to-date. Please perform a regular upgrade before running the migration to Stretch.", + "migration_0003_still_on_jessie_after_main_upgrade": "Something went wrong during the main upgrade: Is the system still on Jessie‽ To investigate the issue, please look at {log}:s…", + "migration_0003_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.\n\nAdditionally, the port for SMTP, used by external e-mail clients (like Thunderbird or K9-Mail) was changed from 465 (SSL/TLS) to 587 (STARTTLS). The old port (465) will automatically be closed, and the new port (587) will be opened in the firewall. You and your users *will* have to adapt the configuration of your e-mail clients accordingly.", + "migration_0003_problematic_apps_warning": "Please note that the following possibly problematic installed apps were detected. It looks like those were not installed from an applist, or are not flagged as 'working'. Consequently, it cannot be guaranteed that they will still work after the upgrade: {problematic_apps}", + "migration_0003_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_0005_postgresql_94_not_installed": "PostgreSQL was not installed on your system. Nothing to do.", + "migration_0005_postgresql_96_not_installed": "PostgreSQL 9.4 is installed, but not postgresql 9.6‽ Something weird might have happened on your system:(…", + "migration_0005_not_enough_space": "Make sufficient space available in {path} to run the migration.", "migration_0006_disclaimer": "YunoHost now expects admin and root passwords to be synchronized. By running this migration, your root password is going to be replaced by the admin password.", "migration_0007_cancelled": "YunoHost has failed to improve the way your SSH conf is managed.", "migration_0007_cannot_restart": "SSH can't be restarted after trying to cancel migration number 6.", - "migration_0008_general_disclaimer": "To improve the security of your server, it is recommended to let YunoHost manage the SSH configuration. Your current SSH configuration differs from the recommended configuration. If you let YunoHost reconfigure it, the way you connect to your server through SSH will change in the following way:", - "migration_0008_port": " - you will have to connect using port 22 instead of your current custom SSH port. Feel free to reconfigure it;", - "migration_0008_root": " - you will not be able to connect as root through SSH. Instead you should use the admin user;", - "migration_0008_dsa": " - the DSA key will be disabled. Hence, you might need to invalidate a spooky warning from your SSH client, and recheck the fingerprint of your server;", + "migration_0008_general_disclaimer": "To improve the security of your server, it is recommended to let YunoHost manage the SSH configuration. Your current SSH setup differs from the recommendation. If you let YunoHost reconfigure it, the way you connect to your server through SSH will change thusly:", + "migration_0008_port": "• You will have to connect using port 22 instead of your current custom SSH port. Feel free to reconfigure it;", + "migration_0008_root": "• You will not be able to connect as root through SSH. Instead you should use the admin user;", + "migration_0008_dsa": "• The DSA key will be turned off. Hence, you might need to invalidate a spooky warning from your SSH client, and recheck the fingerprint of your server;", "migration_0008_warning": "If you understand those warnings and agree to let YunoHost override your current configuration, run the migration. Otherwise, you can also skip the migration - though it is not recommended.", - "migration_0008_no_warning": "No major risk has been indentified about overriding your SSH configuration - but we can't be absolutely sure ;)! If you agree to let YunoHost override your current configuration, run the migration. Otherwise, you can also skip the migration - though it is not recommended.", - "migration_0009_not_needed": "This migration already happened somehow ? Skipping.", + "migration_0008_no_warning": "No major risk indentified concerning overriding your SSH configuration—one can however not be absolutely sure ;)! Run the migration to override it. Otherwise, you can also skip the migration - though it is not recommended.", + "migration_0009_not_needed": "This migration already happened somehow… (?) Skipping.", "migration_0011_backup_before_migration": "Creating a backup of LDAP database and apps settings prior to the actual migration.", - "migration_0011_can_not_backup_before_migration": "The backup of the system before the migration failed. Migration failed. Error: {error:s}", - "migration_0011_create_group": "Creating a group for each user...", - "migration_0011_done": "Migration successful. You are now able to manage groups of users.", - "migration_0011_LDAP_config_dirty": "It look like that you customized your LDAP configuration. For this migration the LDAP configuration need to be updated.\nYou need to save your actual configuration, reintialize the original configuration by the command 'yunohost tools regen-conf -f' and after retry the migration", - "migration_0011_LDAP_update_failed": "LDAP update failed. Error: {error:s}", - "migration_0011_migrate_permission": "Migrating permissions from apps settings to LDAP...", - "migration_0011_migration_failed_trying_to_rollback": "Migration failed ... trying to rollback the system.", - "migration_0011_rollback_success": "Rollback succeeded.", - "migration_0011_update_LDAP_database": "Updating LDAP database...", - "migration_0011_update_LDAP_schema": "Updating LDAP schema...", - "migrations_already_ran": "Those migrations have already been ran: {ids}", - "migrations_cant_reach_migration_file": "Can't access migrations files at path %s", - "migrations_dependencies_not_satisfied": "Can't run migration {id} because first you need to run these migrations: {dependencies_id}", - "migrations_failed_to_load_migration": "Failed to load migration {id} : {error}", - "migrations_exclusive_options": "--auto, --skip, and --force-rerun are exclusive options.", - "migrations_list_conflict_pending_done": "You cannot use both --previous and --done at the same time.", + "migration_0011_can_not_backup_before_migration": "Could not back up the system prior to migration. Error: {error:s}", + "migration_0011_create_group": "Creating a group for each user…", + "migration_0011_done": "Migration successful. You are now able to manage usergroups.", + "migration_0011_LDAP_config_dirty": "It look like that you customized your LDAP configuration. For this migration the LDAP configuration needs to be updated.\nYou need to save your actual configuration, reintialize the original configuration by running 'yunohost tools regen-conf -f' and retry the migration", + "migration_0011_LDAP_update_failed": "Could not update LDAP. Error: {error:s}", + "migration_0011_migrate_permission": "Migrating permissions from apps settings to LDAP…", + "migration_0011_migration_failed_trying_to_rollback": "Migration failed… trying to roll back the system.", + "migration_0011_rollback_success": "System rolled back.", + "migration_0011_update_LDAP_database": "Updating LDAP database…", + "migration_0011_update_LDAP_schema": "Updating LDAP schema…", + "migrations_already_ran": "Those migrations are already done: {ids}", + "migrations_cant_reach_migration_file": "Could not access migrations files at path %s", + "migrations_dependencies_not_satisfied": "Cannot run migration {id} because first you need to run these migrations: {dependencies_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_list_conflict_pending_done": "You cannot use both '--previous' and '--done' at the same time.", "migrations_loading_migration": "Loading migration {id}…", - "migrations_migration_has_failed": "Migration {id} has failed, aborting. Error: {exception}", - "migrations_must_provide_explicit_targets": "You must provide explicit targets when using --skip or --force-rerun", - "migrations_need_to_accept_disclaimer": "To run the migration {id}, your must accept the following disclaimer:\n---\n{disclaimer}\n---\nIf you accept to run the migration, please re-run the command with the option --accept-disclaimer.", + "migrations_migration_has_failed": "Migration {id} did not complete, aborting. Error: {exception}", + "migrations_must_provide_explicit_targets": "You must provide explicit targets when using '--skip' or '--force-rerun'", + "migrations_need_to_accept_disclaimer": "To run the migration {id}, your must accept the following disclaimer:\n---\n{disclaimer}\n---\nIf you accept to run the migration, please re-run the command with the option '--accept-disclaimer'.", "migrations_no_migrations_to_run": "No migrations to run", - "migrations_no_such_migration": "No such migration called {id}", - "migrations_not_pending_cant_skip": "Those migrations are not pending so cannot be skipped: {ids}", - "migrations_pending_cant_rerun": "Those migrations are still pending so cannot be reran: {ids}", + "migrations_no_such_migration": "There is no migration called {id}", + "migrations_not_pending_cant_skip": "Those migrations are not pending, so cannot be skipped: {ids}", + "migrations_pending_cant_rerun": "Those migrations are still pending, so cannot be run again: {ids}", "migrations_running_forward": "Running migration {id}…", "migrations_skip_migration": "Skipping migration {id}…", - "migrations_success_forward": "Successfully ran migration {id}!", - "migrations_to_be_ran_manually": "Migration {id} has to be ran manually. Please go to Tools > Migrations on the webadmin, or run `yunohost tools migrations migrate`.", - "monitor_disabled": "The server monitoring has been disabled", - "monitor_enabled": "The server monitoring has been enabled", - "monitor_glances_con_failed": "Unable to connect to Glances server", - "monitor_not_enabled": "Server monitoring is not enabled", + "migrations_success_forward": "Ran migration {id}", + "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 migrate`.", + "monitor_disabled": "Server monitoring now turned off", + "monitor_enabled": "Server monitoring now turned on", + "monitor_glances_con_failed": "Could not connect to Glances server", + "monitor_not_enabled": "Server monitoring is off", "monitor_period_invalid": "Invalid time period", "monitor_stats_file_not_found": "Statistics file not found", "monitor_stats_no_update": "No monitoring statistics to update", @@ -396,190 +396,190 @@ "mountpoint_unknown": "Unknown mountpoint", "mysql_db_creation_failed": "MySQL database creation failed", "mysql_db_init_failed": "MySQL database init failed", - "mysql_db_initialized": "The MySQL database has been initialized", - "need_define_permission_before": "You need to redefine the permission using 'yunohost user permission add -u USER' before removing an allowed group", + "mysql_db_initialized": "The MySQL database now initialized", + "need_define_permission_before": "Redefine the permission using 'yunohost user permission add -u USER' before removing an allowed group", "network_check_mx_ko": "DNS MX record is not set", - "network_check_smtp_ko": "Outbound mail (SMTP port 25) seems to be blocked by your network", - "network_check_smtp_ok": "Outbound mail (SMTP port 25) is not blocked", + "network_check_smtp_ko": "Outbound e-mail (SMTP port 25) seems to be blocked by your network", + "network_check_smtp_ok": "Outbound e-mail (SMTP port 25) is not blocked", "new_domain_required": "You must provide the new main domain", "no_appslist_found": "No app list found", - "no_internet_connection": "Server is not connected to the Internet", + "no_internet_connection": "Server not connected to the Internet", "no_ipv6_connectivity": "IPv6 connectivity is not available", "no_restore_script": "No restore script found for the app '{app:s}'", - "not_enough_disk_space": "Not enough free disk space on '{path:s}'", + "not_enough_disk_space": "Not enough free space on '{path:s}'", "package_not_installed": "Package '{pkgname}' is not installed", "package_unexpected_error": "An unexpected error occurred processing the package '{pkgname}'", "package_unknown": "Unknown package '{pkgname}'", "packages_upgrade_critical_later": "Critical packages ({packages:s}) will be upgraded later", - "packages_upgrade_failed": "Unable to upgrade all of the packages", - "password_listed": "This password is among the most used password in the world. Please choose something a bit more unique.", - "password_too_simple_1": "Password needs to be at least 8 characters long", - "password_too_simple_2": "Password needs to be at least 8 characters long and contains digit, upper and lower characters", - "password_too_simple_3": "Password needs to be at least 8 characters long and contains digit, upper, lower and special characters", - "password_too_simple_4": "Password needs to be at least 12 characters long and contains digit, upper, lower and special characters", - "path_removal_failed": "Unable to remove path {:s}", - "pattern_backup_archive_name": "Must be a valid filename with max 30 characters, and alphanumeric and -_. characters only", + "packages_upgrade_failed": "Could not upgrade all the packages", + "password_listed": "This password is among the most used password in the world. Please choose something more unique.", + "password_too_simple_1": "The password needs to be at least 8 characters long", + "password_too_simple_2": "The password needs to be at least 8 characters long and contain a digit, upper and lower characters", + "password_too_simple_3": "The password needs to be at least 8 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", + "path_removal_failed": "Could not remove path {:s}", + "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_email": "Must be a valid email address (e.g. someone@domain.org)", "pattern_firstname": "Must be a valid first name", "pattern_lastname": "Must be a valid last name", "pattern_listname": "Must be alphanumeric and underscore characters only", - "pattern_mailbox_quota": "Must be a size with b/k/M/G/T suffix or 0 to disable the quota", + "pattern_mailbox_quota": "Must be a size with b/k/M/G/T suffix or 0 to not havea quota", "pattern_password": "Must be at least 3 characters long", "pattern_port": "Must be a valid port number (i.e. 0-65535)", "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_username": "Must be lower-case alphanumeric and underscore characters only", - "pattern_password_app": "Sorry, passwords should not contain the following characters: {forbidden_chars}", + "pattern_password_app": "Sorry, passwords can not contain the following characters: {forbidden_chars}", "permission_already_clear": "Permission '{permission:s}' already clear for app {app:s}", "permission_already_exist": "Permission '{permission:s}' for app {app:s} already exist", "permission_created": "Permission '{permission:s}' for app {app:s} created", - "permission_creation_failed": "Permission creation failed", + "permission_creation_failed": "Could not grant permission", "permission_deleted": "Permission '{permission:s}' for app {app:s} deleted", - "permission_deletion_failed": "Permission '{permission:s}' for app {app:s} deletion failed", - "permission_not_found": "Permission '{permission:s}' not found for application {app:s}", - "permission_name_not_valid": "Permission name '{permission:s}' not valid", - "permission_update_failed": "Permission update failed", - "permission_generated": "The permission database has been updated", - "permission_updated": "Permission '{permission:s}' for app {app:s} updated", + "permission_deletion_failed": "Missing permission '{permission:s}' to delete the app '{app:s}'", + "permission_not_found": "Permission '{permission:s}' not found for the application '{app:s}'", + "permission_name_not_valid": "Pick an allowed permission name for '{permission:s}'", + "permission_update_failed": "Could not update permission", + "permission_generated": "Permission database updated", + "permission_updated": "Permission '{permission:s}' for the app '{app:s}' updated", "permission_update_nothing_to_do": "No permissions to update", "port_already_closed": "Port {port:d} is already closed for {ip_version:s} connections", "port_already_opened": "Port {port:d} is already opened for {ip_version:s} connections", "port_available": "Port {port:d} is available", "port_unavailable": "Port {port:d} is not available", - "recommend_to_add_first_user": "The post-install is finished but YunoHost needs at least one user to work correctly, you should add one using 'yunohost user create ' or the admin interface.", + "recommend_to_add_first_user": "The post-install is finished, but YunoHost needs at least one user to work correctly, you should add one using 'yunohost user create ' or do it from the admin interface.", "remove_main_permission_not_allowed": "Removing the main permission is not allowed", - "remove_user_of_group_not_allowed": "You are not allowed to remove the user {user:s} in the group {group:s}", - "regenconf_file_backed_up": "The configuration file '{conf}' has been backed up to '{backup}'", - "regenconf_file_copy_failed": "Unable to 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 has been kept back.", + "remove_user_of_group_not_allowed": "You are not allowed to remove the user '{user:s}' in the group '{group:s}'", + "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_kept_back": "The configuration file '{conf}' is expected to be deleted by regen-conf (category {category}) but was kept back.", "regenconf_file_manually_modified": "The configuration file '{conf}' has been manually modified and will not be updated", - "regenconf_file_manually_removed": "The configuration file '{conf}' has been manually removed and will not be created", - "regenconf_file_remove_failed": "Unable to remove the configuration file '{conf}'", - "regenconf_file_removed": "The configuration file '{conf}' has been removed", - "regenconf_file_updated": "The configuration file '{conf}' has been updated", + "regenconf_file_manually_removed": "The configuration file '{conf}' was removed manually, and will not be created", + "regenconf_file_remove_failed": "Could not remove the configuration file '{conf}'", + "regenconf_file_removed": "Configuration file '{conf}' removed", + "regenconf_file_updated": "Configuration file '{conf}' updated", "regenconf_now_managed_by_yunohost": "The configuration file '{conf}' is now managed by YunoHost (category {category}).", "regenconf_up_to_date": "The configuration is already up-to-date for category '{category}'", - "regenconf_updated": "The configuration has been updated for category '{category}'", + "regenconf_updated": "Configuration for category '{category}' updated", "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": "Unable to regenerate the configuration for category(s): {categories}", + "regenconf_failed": "Could not regenerate the configuration for category(s): {categories}", "regenconf_pending_applying": "Applying pending configuration for category '{category}'…", - "restore_action_required": "You must specify something to restore", - "restore_already_installed_app": "An app is already installed with the id '{app:s}'", - "restore_app_failed": "Unable to restore the app '{app:s}'", - "restore_cleaning_failed": "Unable to clean-up the temporary restoration directory", - "restore_complete": "Restore complete", + "restore_action_required": "You must pick something to restore", + "restore_already_installed_app": "An app with the ID '{app:s}' is already installed", + "restore_app_failed": "Could not restore the app '{app:s}'", + "restore_cleaning_failed": "Could not clean up the temporary restoration directory", + "restore_complete": "Restored", "restore_confirm_yunohost_installed": "Do you really want to restore an already installed system? [{answers:s}]", "restore_extracting": "Extracting needed files from the archive…", - "restore_failed": "Unable to restore the system", - "restore_hook_unavailable": "Restoration script for '{part:s}' not available on your system and not in the archive either", - "restore_may_be_not_enough_disk_space": "Your system seems not to have enough disk space (freespace: {free_space:d} B, needed space: {needed_space:d} B, security margin: {margin:d} B)", + "restore_failed": "Could not restore system", + "restore_hook_unavailable": "The restoration script for '{part:s}' not available on your system and not in the archive either", + "restore_may_be_not_enough_disk_space": "Your system seems does not have enough space (free: {free_space:d} B, needed space: {needed_space:d} B, security margin: {margin:d} B)", "restore_mounting_archive": "Mounting archive into '{path:s}'", - "restore_not_enough_disk_space": "Not enough disk space (freespace: {free_space:d} B, needed space: {needed_space:d} B, security margin: {margin:d} B)", - "restore_nothings_done": "Nothing has been restored", - "restore_removing_tmp_dir_failed": "Unable to remove an old temporary directory", - "restore_running_app_script": "Running restore script of app '{app:s}'…", + "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_nothings_done": "Nothing was restored", + "restore_removing_tmp_dir_failed": "Could not remove an old temporary directory", + "restore_running_app_script": "Restoring the app '{app:s}'…", "restore_running_hooks": "Running restoration hooks…", - "restore_system_part_failed": "Unable to restore the '{part:s}' system part", - "root_password_desynchronized": "The admin password has been changed, but YunoHost was unable to propagate this on the root password!", + "restore_system_part_failed": "Could not restore the '{part:s}' system part", + "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.", - "server_shutdown": "The server will shutdown", + "server_shutdown": "The server will shut down", "server_shutdown_confirm": "The server will shutdown immediatly, are you sure? [{answers:s}]", "server_reboot": "The server will reboot", "server_reboot_confirm": "The server will reboot immediatly, are you sure? [{answers:s}]", - "service_add_failed": "Unable to add service '{service:s}'", - "service_added": "The service '{service:s}' has been added", - "service_already_started": "Service '{service:s}' has already been started", - "service_already_stopped": "Service '{service:s}' has already been stopped", - "service_cmd_exec_failed": "Unable to execute command '{command:s}'", - "service_description_avahi-daemon": "allows to reach your server using yunohost.local on your local network", - "service_description_dnsmasq": "handles domain name resolution (DNS)", - "service_description_dovecot": "allows e-mail client to access/fetch email (via IMAP and POP3)", - "service_description_fail2ban": "protects against bruteforce and other kind of attacks from the Internet", - "service_description_glances": "monitors system information on your server", - "service_description_metronome": "manage XMPP instant messaging accounts", - "service_description_mysql": "stores applications data (SQL database)", - "service_description_nginx": "serves or provides access to all the websites hosted on your server", - "service_description_nslcd": "handles YunoHost user shell connection", - "service_description_php7.0-fpm": "runs applications written in PHP with nginx", - "service_description_postfix": "used to send and receive emails", - "service_description_redis-server": "a specialized database used for rapid data access, task queue and communication between programs", - "service_description_rmilter": "checks various parameters in emails", - "service_description_rspamd": "filters spam, and other email-related features", - "service_description_slapd": "stores users, domains and related information", - "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-firewall": "manages open and close connexion ports to services", - "service_disable_failed": "Unable to disable service '{service:s}'\n\nRecent service logs:{logs:s}", - "service_disabled": "The service '{service:s}' has been disabled", - "service_enable_failed": "Unable to enable service '{service:s}'\n\nRecent service logs:{logs:s}", - "service_enabled": "The service '{service:s}' has been enabled", + "service_add_failed": "Could not add the service '{service:s}'", + "service_added": "The service '{service:s}' added", + "service_already_started": "The service '{service:s}' has already been started", + "service_already_stopped": "The service '{service:s}' has already been stopped", + "service_cmd_exec_failed": "Could not execute the command '{command:s}'", + "service_description_avahi-daemon": "allows you to reach your server using 'yunohost.local' in your local network", + "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_fail2ban": "Protects against brute-force and other kinds of attacks from the Internet", + "service_description_glances": "Monitors system info on your server", + "service_description_metronome": "Manage XMPP instant messaging accounts", + "service_description_mysql": "Stores applications data (SQL database)", + "service_description_nginx": "Serves or provides access to all the websites hosted on your server", + "service_description_nslcd": "Handles YunoHost user shell connection", + "service_description_php7.0-fpm": "runs applications written in PHP with NGINX", + "service_description_postfix": "Used to send and receive e-mails", + "service_description_redis-server": "A specialized database used for rapid data access, task queue, and communication between programs", + "service_description_rmilter": "Checks various parameters in e-mails", + "service_description_rspamd": "Filters spam, and other e-mail related features", + "service_description_slapd": "Stores users, domains and related info", + "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-firewall": "Manages open and close connexion ports to services", + "service_disable_failed": "Could not turn off the service '{service:s}'\n\nRecent service logs:{logs:s}", + "service_disabled": "'{service:s}' service turned off", + "service_enable_failed": "Could not turn on the service '{service:s}'\n\nRecent service logs:{logs:s}", + "service_enabled": "'{service:s}' service turned off", "service_no_log": "No log to display for service '{service:s}'", "service_regen_conf_is_deprecated": "'yunohost service regen-conf' is deprecated! Please use 'yunohost tools regen-conf' instead.", - "service_remove_failed": "Unable to remove service '{service:s}'", - "service_removed": "The service '{service:s}' has been removed", - "service_reload_failed": "Unable to reload service '{service:s}'\n\nRecent service logs:{logs:s}", - "service_reloaded": "The service '{service:s}' has been reloaded", - "service_restart_failed": "Unable to restart service '{service:s}'\n\nRecent service logs:{logs:s}", - "service_restarted": "The service '{service:s}' has been restarted", - "service_reload_or_restart_failed": "Unable to reload or restart service '{service:s}'\n\nRecent service logs:{logs:s}", - "service_reloaded_or_restarted": "The service '{service:s}' has been reloaded or restarted", - "service_start_failed": "Unable to start service '{service:s}'\n\nRecent service logs:{logs:s}", - "service_started": "The service '{service:s}' has been started", - "service_status_failed": "Unable to determine status of service '{service:s}'", - "service_stop_failed": "Unable to stop service '{service:s}'\n\nRecent service logs:{logs:s}", - "service_stopped": "The service '{service:s}' has been stopped", + "service_remove_failed": "Could not remove the service '{service:s}'", + "service_removed": "'{service:s}' service removed", + "service_reload_failed": "Could not reload the service '{service:s}'\n\nRecent service logs:{logs:s}", + "service_reloaded": "'{service:s}' service reloaded", + "service_restart_failed": "Could not restart the service '{service:s}'\n\nRecent service logs:{logs:s}", + "service_restarted": "'{service:s}' service restarted", + "service_reload_or_restart_failed": "Could not reload or restart the service '{service:s}'\n\nRecent service logs:{logs:s}", + "service_reloaded_or_restarted": "'{service:s}' service reloaded or restarted", + "service_start_failed": "Could not start the service '{service:s}'\n\nRecent service logs:{logs:s}", + "service_started": "'{service:s}' service started", + "service_status_failed": "Could not determine status of the service '{service:s}'", + "service_stop_failed": "Could not stop the service '{service:s}'\n\nRecent service logs:{logs:s}", + "service_stopped": "'{service:s}' service stopped", "service_unknown": "Unknown service '{service:s}'", - "ssowat_conf_generated": "The SSOwat configuration has been generated", - "ssowat_conf_updated": "The SSOwat configuration has been updated", - "ssowat_persistent_conf_read_error": "Error while reading SSOwat persistent configuration: {error:s}. Edit /etc/ssowat/conf.json.persistent file to fix the JSON syntax", - "ssowat_persistent_conf_write_error": "Error while saving SSOwat persistent configuration: {error:s}. Edit /etc/ssowat/conf.json.persistent file to fix the JSON syntax", + "ssowat_conf_generated": "SSOwat configuration generated", + "ssowat_conf_updated": "SSOwat configuration updated", + "ssowat_persistent_conf_read_error": "Could not read persistent SSOwat configuration: {error:s}. Edit /etc/ssowat/conf.json.persistent file to fix the JSON syntax", + "ssowat_persistent_conf_write_error": "Could not save persistent SSOwat configuration: {error:s}. Edit /etc/ssowat/conf.json.persistent file to fix the JSON syntax", "system_groupname_exists": "Groupname already exists in the system group", - "system_upgraded": "The system has been upgraded", - "system_username_exists": "Username already exists in the 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 dpkg --configure -a`.", - "tools_update_failed_to_app_fetchlist": "Failed to update YunoHost's applists because: {error}", - "tools_upgrade_at_least_one": "Please specify --apps OR --system", + "system_upgraded": "System upgraded", + "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 dpkg --configure -a`.", + "tools_update_failed_to_app_fetchlist": "Could not update YunoHost's applists because: {error}", + "tools_upgrade_at_least_one": "Please specify '--apps', or '--system'", "tools_upgrade_cant_both": "Cannot upgrade both system and apps at the same time", - "tools_upgrade_cant_hold_critical_packages": "Unable to hold critical packages ...", - "tools_upgrade_cant_unhold_critical_packages": "Unable to unhold critical packages ...", - "tools_upgrade_regular_packages": "Now upgrading 'regular' (non-yunohost-related) packages ...", - "tools_upgrade_regular_packages_failed": "Unable to upgrade packages: {packages_list}", - "tools_upgrade_special_packages": "Now upgrading 'special' (yunohost-related) packages ...", - "tools_upgrade_special_packages_explanation": "This action will end but the actual special upgrade will continue in background. Please don't start any other action on your server in the next ~10 minutes (depending on your hardware speed). Once it's done, you may have to re-log on the webadmin. The upgrade log will be available in Tools > Log (in the webadmin) or through 'yunohost log list' (in command line).", - "tools_upgrade_special_packages_completed": "YunoHost package upgrade completed !\nPress [Enter] to get the command line back", + "tools_upgrade_cant_hold_critical_packages": "Could not hold critical packages…", + "tools_upgrade_cant_unhold_critical_packages": "Could not to unhold critical 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_special_packages": "Now upgrading 'special' (yunohost-related) packages…", + "tools_upgrade_special_packages_explanation": "This action will end, but the actual special upgrade will continue in background. Please don't start any other action on your server in the next ~10 minutes (depending on your hardware speed). Once it i done, you may have to log in on the webadmin page again. The upgrade log will be available in Tools → Log (on the webadmin page) or through 'yunohost log list' (from the command line).", + "tools_upgrade_special_packages_completed": "YunoHost package upgrade completed.\nPress [Enter] to get the command line back", "unbackup_app": "App '{app:s}' will not be saved", - "unexpected_error": "An unexpected error occured: {error}", + "unexpected_error": "Something unexpected went wrong: {error}", "unit_unknown": "Unknown unit '{unit:s}'", "unlimit": "No quota", "unrestore_app": "App '{app:s}' will not be restored", - "update_apt_cache_failed": "Unable to update the cache of APT (Debian's package manager). Here is a dump of the sources.list lines which might help to identify problematic lines : \n{sourceslist}", - "update_apt_cache_warning": "Some errors happened while updating the cache of APT (Debian's package manager). Here is a dump of the sources.list lines which might help to identify problematic lines : \n{sourceslist}", + "update_apt_cache_failed": "Could not to update the cache of APT (Debian's package manager). Here is a dump of the sources.list lines, which might help identify problematic lines: \n{sourceslist}", + "update_apt_cache_warning": "Something went wrong while updating the cache of APT (Debian's package manager). Here is a dump of the sources.list lines, which might help identify problematic lines: \n{sourceslist}", "updating_apt_cache": "Fetching available upgrades for system packages…", "updating_app_lists": "Fetching available upgrades for applications…", "upgrade_complete": "Upgrade complete", "upgrading_packages": "Upgrading packages…", "upnp_dev_not_found": "No UPnP device found", - "upnp_disabled": "UPnP has been disabled", - "upnp_enabled": "UPnP has been enabled", - "upnp_port_open_failed": "Unable to open UPnP ports", - "user_already_in_group": "User {user:} already in group {group:s}", - "user_created": "The user has been created", - "user_creation_failed": "Unable to create user", - "user_deleted": "The user has been deleted", - "user_deletion_failed": "Unable to delete user", - "user_home_creation_failed": "Unable to create user home folder", - "user_info_failed": "Unable to retrieve user information", - "user_not_in_group": "User {user:s} not in group {group:s}", + "upnp_disabled": "UPnP turned off", + "upnp_enabled": "UPnP turned on", + "upnp_port_open_failed": "Could not open port via UPnP", + "user_already_in_group": "The User '{user:}' already in the group {group:s}", + "user_created": "User created", + "user_creation_failed": "Could not create user", + "user_deleted": "User deleted", + "user_deletion_failed": "Could not delete user", + "user_home_creation_failed": "Could not create 'home' folder for user", + "user_info_failed": "Could not retrieve user info", + "user_not_in_group": "The user '{user:s}' is not in the group {group:s}", "user_unknown": "Unknown user: {user:s}", - "user_update_failed": "Unable to update user", - "user_updated": "The user has been updated", + "user_update_failed": "Could not change user info", + "user_updated": "User info changed", "users_available": "Available users:", "yunohost_already_installed": "YunoHost is already installed", - "yunohost_ca_creation_failed": "Unable to create certificate authority", - "yunohost_ca_creation_success": "The local certification authority has been created.", - "yunohost_configured": "YunoHost has been configured", + "yunohost_ca_creation_failed": "Could not create certificate authority", + "yunohost_ca_creation_success": "Local certification authority created.", + "yunohost_configured": "YunoHost now configured", "yunohost_installing": "Installing YunoHost…", - "yunohost_not_installed": "YunoHost is not or not correctly installed. Please execute 'yunohost tools postinstall'" + "yunohost_not_installed": "YunoHost is incorrectly or not correctly installed. Please run 'yunohost tools postinstall'" } From 16ea8f45d64b92e94af4eb3ffceec1341f16e662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Tue, 17 Sep 2019 20:32:57 +0200 Subject: [PATCH 27/47] Language reworked --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index d06e97c45..b860c27d7 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ -[![Build Status](https://travis-ci.org/YunoHost/yunohost.svg?branch=stretch-unstable)](https://travis-ci.org/YunoHost/yunohost) +[![Build status](https://travis-ci.org/YunoHost/yunohost.svg?branch=stretch-unstable)](https://travis-ci.org/YunoHost/yunohost) [![GitHub license](https://img.shields.io/github/license/YunoHost/yunohost)](https://github.com/YunoHost/yunohost/blob/stretch-unstable/LICENSE) # YunoHost core This repository is the core of YunoHost code. -- [YunoHost project website](https://yunohost.org) -- [Butracker](https://github.com/YunoHost/issues). +- [Project website](https://yunohost.org) +- [Bugtracker](https://github.com/YunoHost/issues). ## Contributing - You can develop on this repository using [ynh-dev](https://github.com/YunoHost/ynh-dev) with `use-git` sub-command. -- On this repository we are [following this workflow](https://yunohost.org/#/build_system_en): `stable <- testing <- unstable <- your_branch`. -- Note: if you modify python scripts, you will have to modifiy the actions map. -- You can help with translation on [our translation platform](https://translate.yunohost.org/engage/yunohost/?utm_source=widget) +- On this repository we are [following this workflow](https://yunohost.org/#/build_system_en): `stable ← testing ← unstable ← your_branch`. +- Note: If you modify Python scripts, you will have to modifiy the actions map. +- You can help translate YunoHost on our [translation platform](https://translate.yunohost.org/engage/yunohost/?utm_source=widget) Translation status @@ -34,7 +34,7 @@ This repository is the core of YunoHost code. - Python core scripts are accessible through two interfaces thanks to the [moulinette framework](https://github.com/YunoHost/moulinette): - [CLI](https://en.wikipedia.org/wiki/Command-line_interface) for `yunohost` command. - [API](https://en.wikipedia.org/wiki/Application_programming_interface) for [web administration module](https://github.com/YunoHost/yunohost-admin) (other modules could be implemented). -- You can find more details about how YunoHost works on this [documentation (in french)](https://yunohost.org/#/package_list_fr). +- You can find more details about how YunoHost works on this [documentation (in French)](https://yunohost.org/#/package_list_fr). ## Dependencies @@ -45,4 +45,4 @@ This repository is the core of YunoHost code. ## License -As [other components of YunoHost core code](https://yunohost.org/#/faq_en), this repository is under GNU AGPL v.3 license. +As [other components of YunoHost core code](https://yunohost.org/#/faq_en), this repository is licensed GNU AGPL v3. From 4f9b56c29917d501fd55b1a5a71e31948c7421bc Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Tue, 17 Sep 2019 14:33:24 +0000 Subject: [PATCH 28/47] Translated using Weblate (Arabic) Currently translated at 66.2% (386 of 583 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ar/ --- locales/ar.json | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/locales/ar.json b/locales/ar.json index 52e86d90b..b6f3ece23 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -23,7 +23,7 @@ "app_location_install_failed": "Unable to install the app in this location because it conflit with the app '{other_app}' already installed on '{other_path}'", "app_location_unavailable": "This url is not available or conflicts with an already installed app", "app_manifest_invalid": "Invalid app manifest: {error}", - "app_no_upgrade": "البرمجيات لا تحتاج إلى تحديث", + "app_no_upgrade": "ليس هناك أي تطبيق بحاجة إلى تحديث", "app_not_correctly_installed": "يبدو أن التطبيق {app:s} لم يتم تنصيبه بشكل صحيح", "app_not_installed": "إنّ التطبيق {app:s} غير مُنصَّب", "app_not_properly_removed": "لم يتم حذف تطبيق {app:s} بشكلٍ جيّد", @@ -37,17 +37,17 @@ "app_unsupported_remote_type": "Unsupported remote type used for the app", "app_upgrade_app_name": "جارٍ تحديث تطبيق {app}…", "app_upgrade_failed": "تعذرت عملية ترقية {app:s}", - "app_upgrade_some_app_failed": "تعذرت عملية ترقية بعض البرمجيات", + "app_upgrade_some_app_failed": "تعذرت عملية ترقية بعض التطبيقات", "app_upgraded": "تم تحديث التطبيق {app:s}", "appslist_corrupted_json": "Could not load the application lists. It looks like {filename:s} is corrupted.", "appslist_could_not_migrate": "Could not migrate app list {appslist:s} ! Unable to parse the url... The old cron job has been kept in {bkp_file:s}.", "appslist_fetched": "تم جلب قائمة تطبيقات {appslist:s}", "appslist_migrating": "Migrating application list {appslist:s} …", "appslist_name_already_tracked": "There is already a registered application list with name {name:s}.", - "appslist_removed": "تم حذف قائمة البرمجيات {appslist:s}", + "appslist_removed": "تم حذف قائمة التطبيقات {appslist:s}", "appslist_retrieve_bad_format": "Retrieved file for application list {appslist:s} is not valid", "appslist_retrieve_error": "Unable to retrieve the remote application list {appslist:s}: {error:s}", - "appslist_unknown": "قائمة البرمجيات {appslist:s} مجهولة.", + "appslist_unknown": "قائمة التطبيقات {appslist:s} مجهولة.", "appslist_url_already_tracked": "There is already a registered application list with url {url:s}.", "ask_current_admin_password": "كلمة السر الإدارية الحالية", "ask_email": "عنوان البريد الإلكتروني", @@ -114,7 +114,7 @@ "certmanager_attempt_to_replace_valid_cert": "You are attempting to overwrite a good and valid certificate for domain {domain:s}! (Use --force to bypass)", "certmanager_cannot_read_cert": "Something wrong happened when trying to open current certificate for domain {domain:s} (file: {file:s}), reason: {reason:s}", "certmanager_cert_install_success": "تمت عملية تنصيب شهادة Let's Encrypt بنجاح على النطاق {domain:s} !", - "certmanager_cert_install_success_selfsigned": "Successfully installed a self-signed certificate for domain {domain:s}!", + "certmanager_cert_install_success_selfsigned": "نجحت عملية تثبيت الشهادة الموقعة ذاتيا الخاصة بالنطاق {domain:s}!", "certmanager_cert_renew_success": "نجحت عملية تجديد شهادة Let's Encrypt الخاصة باسم النطاق {domain:s} !", "certmanager_cert_signing_failed": "فشل إجراء توقيع الشهادة الجديدة", "certmanager_certificate_fetching_or_enabling_failed": "Sounds like enabling the new certificate for {domain:s} failed somehow…", @@ -232,7 +232,7 @@ "migrations_no_migrations_to_run": "No migrations to run", "migrations_show_currently_running_migration": "Running migration {number} {name}…", "migrations_show_last_migration": "Last ran migration is {}", - "migrations_skip_migration": "جارٍ تجاهل التهجير {number} {name}…", + "migrations_skip_migration": "جارٍ تجاهل التهجير {id}…", "monitor_disabled": "The server monitoring has been disabled", "monitor_enabled": "The server monitoring has been enabled", "monitor_glances_con_failed": "Unable to connect to Glances server", @@ -316,7 +316,7 @@ "service_conf_updated": "The configuration has been updated for service '{service}'", "service_conf_would_be_updated": "The configuration would have been updated for service '{service}'", "service_disable_failed": "", - "service_disabled": "The service '{service:s}' has been disabled", + "service_disabled": "تم تعطيل خدمة '{service:s}'", "service_enable_failed": "", "service_enabled": "تم تنشيط خدمة '{service:s}'", "service_no_log": "ليس لخدمة '{service:s}' أي سِجلّ للعرض", @@ -347,7 +347,7 @@ "upgrade_complete": "إكتملت عملية الترقية و التحديث", "upgrading_packages": "عملية ترقية الحُزم جارية …", "upnp_dev_not_found": "No UPnP device found", - "upnp_disabled": "UPnP has been disabled", + "upnp_disabled": "تم تعطيل UPnP", "upnp_enabled": "UPnP has been enabled", "upnp_port_open_failed": "Unable to open UPnP ports", "user_created": "تم إنشاء المستخدم", @@ -441,5 +441,6 @@ "group_name_already_exist": "الفريق {name:s} موجود بالفعل", "error_when_removing_sftpuser_group": "حدث خطأ أثناء محاولة حذف فريق sftpusers", "dyndns_could_not_check_available": "لا يمكن التحقق مِن أنّ {domain:s} متوفر على {provider:s}.", - "backup_mount_archive_for_restore": "جارٍ تهيئة النسخة الاحتياطية للاسترجاع…" + "backup_mount_archive_for_restore": "جارٍ تهيئة النسخة الاحتياطية للاسترجاع…", + "root_password_replaced_by_admin_password": "لقد تم استبدال كلمة سر الجذر root بالكلمة الإدارية لـ admin." } From 60e602a35e4a587c96a57a46b9cc1e3bf5e7544f Mon Sep 17 00:00:00 2001 From: advocatux Date: Sun, 15 Sep 2019 12:23:09 +0000 Subject: [PATCH 29/47] Translated using Weblate (Spanish) Currently translated at 100.0% (583 of 583 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 334 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 307 insertions(+), 27 deletions(-) diff --git a/locales/es.json b/locales/es.json index 8861c15b8..c34a7e33c 100644 --- a/locales/es.json +++ b/locales/es.json @@ -16,15 +16,15 @@ "app_manifest_invalid": "El manifiesto de la aplicación no es válido: {error}", "app_no_upgrade": "No hay aplicaciones para actualizar", "app_not_correctly_installed": "La aplicación {app:s} 8 parece estar incorrectamente instalada", - "app_not_installed": "{app:s} 9 no está instalada", + "app_not_installed": "La aplicación «{app:s}» no está instalada. Esta es la lista de todas las aplicaciones instaladas: {all_apps}", "app_not_properly_removed": "La {app:s} 0 no ha sido desinstalada correctamente", "app_package_need_update": "El paquete de la aplicación {app} necesita ser actualizada debido a los cambios en YunoHost", "app_recent_version_required": "{:s} requiere una versión más reciente de moulinette ", "app_removed": "{app:s} ha sido eliminada", - "app_requirements_checking": "Comprobando los paquetes requeridos por {app}...", + "app_requirements_checking": "Comprobando los paquetes necesarios para {app}…", "app_requirements_failed": "No se cumplen los requisitos para {app}: {error}", "app_requirements_unmeet": "No se cumplen los requisitos para {app}, el paquete {pkgname} ({version}) debe ser {spec}", - "app_sources_fetch_failed": "No se pudieron descargar los archivos del código fuente", + "app_sources_fetch_failed": "No se pudo obtener los archivos con el código fuente, ¿es la URL correcta?", "app_unknown": "Aplicación desconocida", "app_unsupported_remote_type": "Tipo remoto no soportado por la aplicación", "app_upgrade_failed": "No se pudo actualizar la aplicación {app:s}", @@ -50,11 +50,11 @@ "backup_archive_open_failed": "No se pudo abrir la copia de seguridad", "backup_cleaning_failed": "No se puede limpiar el directorio temporal de copias de seguridad", "backup_created": "Se ha creado la copia de seguridad", - "backup_creating_archive": "Creando copia de seguridad...", + "backup_creating_archive": "Creando el archivo de copia de seguridad…", "backup_creation_failed": "No se pudo crear la copia de seguridad", "backup_delete_error": "No se puede eliminar '{path:s}'", "backup_deleted": "La copia de seguridad ha sido eliminada", - "backup_extracting_archive": "Extrayendo la copia de seguridad...", + "backup_extracting_archive": "Extrayendo el archivo de la copia de seguridad…", "backup_hook_unknown": "Hook de copia de seguridad desconocido '{hook:s}'", "backup_invalid_archive": "La copia de seguridad no es válida", "backup_nothings_done": "No hay nada que guardar", @@ -86,21 +86,21 @@ "domain_zone_exists": "El archivo de zona del DNS ya existe", "domain_zone_not_found": "No se ha encontrado el archivo de zona del DNS para el dominio [:s]", "done": "Hecho.", - "downloading": "Descargando...", + "downloading": "Descargando…", "dyndns_cron_installed": "La tarea cron para DynDNS ha sido instalada", - "dyndns_cron_remove_failed": "No se pudo eliminar la tarea cron DynDNS", + "dyndns_cron_remove_failed": "No se pudo eliminar la tarea cron de DynDNS por: {error}", "dyndns_cron_removed": "La tarea cron DynDNS ha sido eliminada", "dyndns_ip_update_failed": "No se pudo actualizar la dirección IP en el DynDNS", "dyndns_ip_updated": "Su dirección IP ha sido actualizada en el DynDNS", - "dyndns_key_generating": "Se está generando la clave del DNS. Esto podría tardar unos minutos...", + "dyndns_key_generating": "Generando la clave del DNS. Esto podría tardar un rato…", "dyndns_key_not_found": "No se ha encontrado la clave DNS para el dominio", "dyndns_no_domain_registered": "Ningún dominio ha sido registrado con DynDNS", "dyndns_registered": "El dominio DynDNS ha sido registrado", "dyndns_registration_failed": "No se pudo registrar el dominio DynDNS: {error:s}", "dyndns_unavailable": "El dominio {domain:s} no está disponible.", - "executing_command": "Ejecutando el comando '{command:s}'...", - "executing_script": "Ejecutando el script '{script:s}'...", - "extracting": "Extrayendo...", + "executing_command": "Ejecutando la orden «{command:s}»…", + "executing_script": "Ejecutando el guión «{script:s}»…", + "extracting": "Extrayendo…", "field_invalid": "Campo no válido '{:s}'", "firewall_reload_failed": "No se pudo recargar el cortafuegos", "firewall_reloaded": "El cortafuegos ha sido recargado", @@ -176,8 +176,8 @@ "restore_failed": "No se pudo restaurar el sistema", "restore_hook_unavailable": "El script de restauración '{part:s}' no está disponible en su sistema y tampoco en el archivo", "restore_nothings_done": "No se ha restaurado nada", - "restore_running_app_script": "Ejecutando el script de restauración de la aplicación '{app:s}'...", - "restore_running_hooks": "Ejecutando los hooks de restauración...", + "restore_running_app_script": "Ejecutando el guión de restauración de la aplicación «{app:s}»…", + "restore_running_hooks": "Ejecutando los ganchos de restauración…", "service_add_failed": "No se pudo añadir el servicio '{service:s}'", "service_added": "Servicio '{service:s}' ha sido añadido", "service_already_started": "El servicio '{service:s}' ya ha sido inicializado", @@ -220,9 +220,9 @@ "unlimit": "Sin cuota", "unrestore_app": "La aplicación '{app:s}' no será restaurada", "update_cache_failed": "No se pudo actualizar la caché de APT", - "updating_apt_cache": "Actualizando lista de paquetes disponibles...", + "updating_apt_cache": "Obteniendo las actualizaciones disponibles para los paquetes del sistema…", "upgrade_complete": "Actualización finalizada", - "upgrading_packages": "Actualizando paquetes...", + "upgrading_packages": "Actualizando paquetes…", "upnp_dev_not_found": "No se encontró ningún dispositivo UPnP", "upnp_disabled": "UPnP ha sido deshabilitado", "upnp_enabled": "UPnP ha sido habilitado", @@ -239,7 +239,7 @@ "yunohost_already_installed": "YunoHost ya está instalado", "yunohost_ca_creation_failed": "No se pudo crear el certificado de autoridad", "yunohost_configured": "YunoHost ha sido configurado", - "yunohost_installing": "Instalando YunoHost...", + "yunohost_installing": "Instalando YunoHost…", "yunohost_not_installed": "YunoHost no está instalado o ha habido errores en la instalación. Ejecute 'yunohost tools postinstall'", "ldap_init_failed_to_create_admin": "La inicialización de LDAP falló al crear el usuario administrador", "mailbox_used_space_dovecot_down": "El servicio de e-mail Dovecot debe estar funcionando si desea obtener el espacio utilizado por el buzón de correo", @@ -248,9 +248,9 @@ "certmanager_attempt_to_replace_valid_cert": "Está intentando sobrescribir un certificado correcto y válido para el dominio {domain:s}! (Use --force para omitir este mensaje)", "certmanager_domain_unknown": "Dominio desconocido {domain:s}", "certmanager_domain_cert_not_selfsigned": "El certificado para el dominio {domain:s} no es un certificado autofirmado. ¿Está seguro de que quiere reemplazarlo? (Use --force para omitir este mensaje)", - "certmanager_certificate_fetching_or_enabling_failed": "Parece que al habilitar el nuevo certificado para el dominio {domain:s} ha fallado de alguna manera...", + "certmanager_certificate_fetching_or_enabling_failed": "Suena como que habilitar el nuevo certificado para {domain:s} fallara de algún modo…", "certmanager_attempt_to_renew_nonLE_cert": "El certificado para el dominio {domain:s} no ha sido emitido por Let's Encrypt. ¡No se puede renovar automáticamente!", - "certmanager_attempt_to_renew_valid_cert": "El certificado para el dominio {domain:s} no está a punto de expirar! Utilice --force para omitir este mensaje", + "certmanager_attempt_to_renew_valid_cert": "¡El certificado para el dominio {domain:s} no está a punto de expirar! (Puede usar --force si sabe lo que está haciendo)", "certmanager_domain_http_not_working": "Parece que no se puede acceder al dominio {domain:s} a través de HTTP. Compruebe que la configuración del DNS y de nginx es correcta", "certmanager_error_no_A_record": "No se ha encontrado un registro DNS 'A' para el dominio {domain:s}. Debe hacer que su nombre de dominio apunte a su máquina para poder instalar un certificado Let's Encrypt. (Si sabe lo que está haciendo, use --no-checks para desactivar esas comprobaciones.)", "certmanager_domain_dns_ip_differs_from_public_ip": "El registro DNS 'A' para el dominio {domain:s} es diferente de la IP de este servidor. Si recientemente modificó su registro A, espere a que se propague (existen algunos controladores de propagación DNS disponibles en línea). (Si sabe lo que está haciendo, use --no-checks para desactivar esas comprobaciones.)", @@ -273,7 +273,7 @@ "certmanager_http_check_timeout": "Plazo expirado, el servidor no ha podido contactarse a si mismo a través de HTTP usando su dirección IP pública (dominio {domain:s} con ip {ip:s}). Puede ser debido a hairpinning o a una mala configuración del cortafuego/router al que está conectado su servidor.", "certmanager_couldnt_fetch_intermediate_cert": "Plazo expirado, no se ha podido descargar el certificado intermedio de Let's Encrypt. La instalación/renovación del certificado ha sido cancelada - vuelva a intentarlo más tarde.", "appslist_retrieve_bad_format": "El archivo obtenido para la lista de aplicaciones {appslist:s} no es válido", - "domain_hostname_failed": "Error al establecer nuevo nombre de host", + "domain_hostname_failed": "Error al establecer un nuevo nombre de host («hostname»). Esto podría causar problemas más tarde (no es seguro... podría ir bien).", "yunohost_ca_creation_success": "Se ha creado la autoridad de certificación local.", "app_already_installed_cant_change_url": "Esta aplicación ya está instalada. No se puede cambiar el URL únicamente mediante esta función. Compruebe si está disponible la opción 'app changeurl'.", "app_change_no_change_url_script": "La aplicacion {app_name:s} aún no permite cambiar su URL, es posible que deba actualizarla.", @@ -285,19 +285,19 @@ "app_already_up_to_date": "La aplicación {app:s} ya está actualizada", "appslist_name_already_tracked": "Ya existe una lista de aplicaciones registrada con el nombre {name:s}.", "appslist_url_already_tracked": "Ya existe una lista de aplicaciones registrada con el URL {url:s}.", - "appslist_migrating": "Migrando la lista de aplicaciones {appslist:s} ...", + "appslist_migrating": "Migrando la lista de aplicaciones {appslist:s}…", "appslist_could_not_migrate": "No se pudo migrar la lista de aplicaciones {appslist:s}! No se pudo analizar el URL ... El antiguo cronjob se ha mantenido en {bkp_file:s}.", "appslist_corrupted_json": "No se pudieron cargar las listas de aplicaciones. Parece que {filename:s} está dañado.", "invalid_url_format": "Formato de URL no válido", "app_upgrade_some_app_failed": "No se pudieron actualizar algunas aplicaciones", "app_make_default_location_already_used": "No puede hacer la aplicación '{app}' por defecto en el dominio {domain} dado que está siendo usado por otra aplicación '{other_app}'", - "app_upgrade_app_name": "Actualizando la aplicación {app}...", + "app_upgrade_app_name": "Actualizando la aplicación {app}…", "ask_path": "Camino", "backup_abstract_method": "Este método de backup no ha sido implementado aún", - "backup_applying_method_borg": "Enviando todos los ficheros al backup en el repositorio borg-backup...", - "backup_applying_method_copy": "Copiado todos los ficheros al backup...", - "backup_applying_method_custom": "Llamando el método de backup {method:s} ...", - "backup_applying_method_tar": "Creando el archivo tar de backup...", + "backup_applying_method_borg": "Enviando todos los archivos para la copia de seguridad al repositorio de borg-backup…", + "backup_applying_method_copy": "Copiando todos los archivos a la copia de seguridad…", + "backup_applying_method_custom": "Llamando al método de copia de seguridad personalizado «{method:s}»…", + "backup_applying_method_tar": "Creando el archivo tar de la copia de seguridad…", "backup_archive_mount_failed": "Fallo en el montado del archivo de backup", "backup_archive_system_part_not_available": "La parte del sistema {part:s} no está disponible en este backup", "backup_archive_writing_error": "No se pueden añadir archivos de backup en el archivo comprimido", @@ -305,7 +305,7 @@ "backup_borg_not_implemented": "Método de backup Borg no está implementado aún", "backup_cant_mount_uncompress_archive": "No se puede montar en modo solo lectura el directorio del archivo descomprimido", "backup_copying_to_organize_the_archive": "Copiando {size:s}MB para organizar el archivo", - "backup_couldnt_bind": "No puede enlazar {src:s} con {dest:s}", + "backup_couldnt_bind": "No puede enlazar {src:s} con {dest:s}.", "backup_csv_addition_failed": "No puede añadir archivos al backup en el archivo CSV", "backup_csv_creation_failed": "No se puede crear el archivo CSV necesario para futuras operaciones de restauración", "backup_custom_mount_error": "Fracaso del método de copia de seguridad personalizada en la etapa \"mount\"", @@ -323,5 +323,285 @@ "password_too_simple_1": "La contraseña debe tener al menos 8 caracteres de longitud", "password_too_simple_2": "La contraseña debe tener al menos 8 caracteres de longitud y contiene dígitos, mayúsculas y minúsculas", "password_too_simple_3": "La contraseña debe tener al menos 8 caracteres de longitud y contiene dígitos, mayúsculas, minúsculas y caracteres especiales", - "password_too_simple_4": "La contraseña debe tener al menos 12 caracteres de longitud y contiene dígitos, mayúsculas, minúsculas y caracteres especiales" + "password_too_simple_4": "La contraseña debe tener al menos 12 caracteres de longitud y contiene dígitos, mayúsculas, minúsculas y caracteres especiales", + "users_available": "Usuarios disponibles:", + "user_not_in_group": "Usuario {user:s} no está en el grupo {group:s}", + "user_already_in_group": "Usuario {user:} ya está en el grupo {group:s}", + "updating_app_lists": "Obteniendo actualizaciones disponibles para las aplicaciones…", + "update_apt_cache_warning": "Ocurrieron algunos errores durante la actualización de la caché de APT (gestor de paquetes de Debian). Aquí tiene un volcado de las líneas de sources.list que podría ayudarle a identificar las líneas problemáticas:\n{sourceslist}", + "update_apt_cache_failed": "No se puede actualizar la caché de APT (gestor de paquetes de Debian). Aquí tiene un volcado de las líneas de sources.list que podría ayudarle a identificar las líneas problemáticas:\n{sourceslist}", + "tools_upgrade_special_packages_completed": "¡Actualización de paquetes de YunoHost completada!\nPulse [Intro] para recuperar la línea de órdenes", + "tools_upgrade_special_packages_explanation": "Esta acción terminará pero la actualización especial real continuará en segundo plano. No inicie ninguna otra acción en su servidor en aproximadamente 10 minutos (dependiendo de la velocidad de su hardware). Una vez que esté hecho, podría tener que volver a iniciar sesión en la administración web. El registro de actualización estará disponible en Herramientas > Registro (en la administración web) o mediante «yunohost log list» (en la línea de órdenes).", + "tools_upgrade_special_packages": "Actualizando ahora paquetes «especiales» (relacionados con YunoHost)...", + "tools_upgrade_regular_packages_failed": "No se pueden actualizar los paquetes: {packages_list}", + "tools_upgrade_regular_packages": "Actualizando ahora paquetes «normales» (no relacionados con YunoHost)...", + "tools_upgrade_cant_unhold_critical_packages": "No se pueden liberar los paquetes críticos...", + "tools_upgrade_cant_hold_critical_packages": "No se pueden retener los paquetes críticos...", + "tools_upgrade_cant_both": "No se puede actualizar el sistema y las aplicaciones al mismo tiempo", + "tools_upgrade_at_least_one": "Especifique --apps O --system", + "tools_update_failed_to_app_fetchlist": "Error al actualizar la lista de aplicaciones de YunoHost porque: {error}", + "this_action_broke_dpkg": "Esta acción rompió dpkg/apt (los gestores de paquetes del sistema)... Puede tratar de solucionar este problema conectando mediante SSH y ejecutando `sudo dpkg --configure -a`.", + "system_groupname_exists": "El nombre de grupo ya existe en el grupo del sistema", + "service_reloaded_or_restarted": "El servicio «{service:s}» ha sido recargado o reiniciado", + "service_reload_or_restart_failed": "No se puede recargar o reiniciar el servicio «{service:s}»'\n\nRegistro de servicios reciente:{logs:s}", + "service_restarted": "El servicio «{service:s}» ha sido reiniciado", + "service_restart_failed": "No se puede reiniciar el servicio «{service:s}»'\n\nRegistro de servicios reciente:{logs:s}", + "service_reloaded": "El servicio «{service:s}» ha sido recargado", + "service_reload_failed": "No se puede recargar el servicio «{service:s}»'\n\nRegistro de servicios reciente:{logs:s}", + "service_regen_conf_is_deprecated": "¡«yunohost service regen-conf» está obsoleto! Use «yunohost tools regen-conf» en su lugar.", + "service_description_yunohost-firewall": "gestiona los puertos de conexiones abiertos y cerrados a los servicios", + "service_description_yunohost-api": "gestiona las interacciones entre la interfaz web de YunoHost y el sistema", + "service_description_ssh": "le permite conectar a su servidor remotamente mediante un terminal (protocolo SSH)", + "service_description_slapd": "almacena usuarios, dominios e información relacionada", + "service_description_rspamd": "filtra correo no deseado y otras características relacionadas con el correo", + "service_description_rmilter": "comprueba varios parámetros en el correo", + "service_description_redis-server": "una base de datos especializada usada para el acceso rápido de datos, cola de tareas y comunicación entre programas", + "service_description_postfix": "usado para enviar y recibir correos", + "service_description_php7.0-fpm": "ejecuta aplicaciones escritas en PHP con nginx", + "service_description_nslcd": "maneja la conexión del intérprete («shell») de usuario de YunoHost", + "service_description_nginx": "sirve o proporciona acceso a todos los sitios web alojados en su servidor", + "service_description_mysql": "almacena los datos de las aplicaciones (base de datos SQL)", + "service_description_metronome": "gestionar las cuentas XMPP de mensajería instantánea", + "service_description_glances": "supervisa la información del sistema en su servidor", + "service_description_fail2ban": "protege contra ataques de fuerza bruta y otra clase de ataques desde Internet", + "service_description_dovecot": "permite al cliente de correo acceder/traer correo (vía IMAP y POP3)", + "service_description_dnsmasq": "maneja la resolución de nombres de dominio (DNS)", + "service_description_avahi-daemon": "permite acceder a su servidor usando yunohost.local en su red local", + "server_reboot_confirm": "El servidor se reiniciará inmediatamente ¿está seguro? [{answers:s}]", + "server_reboot": "El servidor se reiniciará", + "server_shutdown_confirm": "El servidor se apagará inmediatamente ¿está seguro? [{answers:s}]", + "server_shutdown": "El servidor se apagará", + "root_password_replaced_by_admin_password": "Su contraseña de root ha sido sustituida por su contraseña de administración.", + "root_password_desynchronized": "La contraseña de administración ha sido cambiada pero ¡YunoHost no pudo propagar esto en la contraseña de root!", + "restore_system_part_failed": "No se puede restaurar la parte del sistema «{part:s}»", + "restore_removing_tmp_dir_failed": "No se puede eliminar un antiguo directorio temporal", + "restore_not_enough_disk_space": "Insuficiente espacio en disco (espacio libre: {free_space:d} B, espacio necesario: {needed_space:d} B, margen de seguridad: {margin:d} B)", + "restore_mounting_archive": "Montando archivo en «{path:s}»", + "restore_may_be_not_enough_disk_space": "Parece que su sistema no tiene suficiente espacio de disco libre (espacio libre: {free_space:d} B, espacio necesario: {needed_space:d} B, margen de seguridad: {margin:d} B)", + "restore_extracting": "Extrayendo los archivos necesarios para el archivo…", + "regenconf_pending_applying": "Aplicando la configuración pendiente para la categoría «{category}»…", + "regenconf_failed": "No se puede regenerar la configuración para la(s) categoría(s): {categories}", + "regenconf_dry_pending_applying": "Comprobando la configuración pendiente que habría sido aplicada para la categoría «{category}»…", + "regenconf_would_be_updated": "La configuración habría sido actualizada para la categoría «{category}»", + "regenconf_updated": "Ha sido actualizada la configuración para la categoría «{category}»", + "regenconf_up_to_date": "Ya está actualizada la configuración para la categoría «{category}»", + "regenconf_now_managed_by_yunohost": "El archivo de configuración «{conf}» está gestionado ahora por YunoHost (categoría {category}).", + "regenconf_file_updated": "El archivo de configuración «{conf}» ha sido actualizado", + "regenconf_file_removed": "El archivo de configuración «{conf}» ha sido eliminado", + "regenconf_file_remove_failed": "No se puede eliminar el archivo de configuración «{conf}»", + "regenconf_file_manually_removed": "El archivo de configuración «{conf}» ha sido eliminado manualmente y no se creará", + "regenconf_file_manually_modified": "El archivo de configuración «{conf}» ha sido modificado manualmente y no será actualizado", + "regenconf_file_kept_back": "Se espera que el archivo de configuración «{conf}» sea eliminado por regen-conf (categoría {category}) pero ha sido retenido.", + "regenconf_file_copy_failed": "No se puede copiar el nuevo archivo de configuración «{new}» a «{conf}»", + "regenconf_file_backed_up": "El archivo de configuración «{conf}» ha sido respaldado en «{backup}»", + "remove_user_of_group_not_allowed": "No tiene permiso para eliminar al usuario {user:s} en el grupo {group:s}", + "remove_main_permission_not_allowed": "No se permite eliminar el permiso principal", + "recommend_to_add_first_user": "La posinstalación ha terminado pero YunoHost necesita al menos un usuario para funcionar correctamente, debe añadir uno ejecutando «yunohost user create » o usando la interfaz de administración.", + "permission_update_nothing_to_do": "No hay permisos para actualizar", + "permission_updated": "Permiso «{permission:s}» para la aplicación {app:s} actualizado", + "permission_generated": "La base de datos de permisos se ha actualizado", + "permission_update_failed": "Actualización de permiso fallida", + "permission_name_not_valid": "Nombre de permiso «{permission:s}» no válido", + "permission_not_found": "Permiso «{permission:s}» no encontrado para la aplicación {app:s}", + "permission_deletion_failed": "Permiso «{permission:s}» para eliminar la aplicación «{app:s}» fallido", + "permission_deleted": "Eliminado el permiso «{permission:s}» para la aplicación {app:s}", + "permission_creation_failed": "Ha fallado la creación del permiso", + "permission_created": "Creado el permiso «{permission:s}» para la aplicación {app:s}", + "permission_already_exist": "El permiso «{permission:s}» para la aplicación {app:s} ya existe", + "permission_already_clear": "El permiso «{permission:s}» ya está definido para la aplicación {app:s}", + "pattern_password_app": "Las contraseñas no deben incluir los siguientes caracteres: {forbidden_chars}", + "need_define_permission_before": "Necesita redefinir los permisos ejecutando «yunohost user permission add -u USUARIO» antes de eliminar un grupo permitido", + "migrations_to_be_ran_manually": "La migración {id} hay que ejecutarla manualmente. Vaya a Herramientas > Migraciones en la web de administración o ejecute `yunohost tools migrations migrate`.", + "migrations_success_forward": "¡Migración {id} ejecutada correctamente!", + "migrations_skip_migration": "Omitiendo migración {id}…", + "migrations_running_forward": "Ejecutando migración {id}…", + "migrations_pending_cant_rerun": "Esas migraciones están aún pendientes así que no se pueden volver a ejecutar: {ids}", + "migrations_not_pending_cant_skip": "Esas migraciones no están pendientes así que no pueden ser omitidas: {ids}", + "migrations_no_such_migration": "No existe una migración llamada {id}", + "migrations_no_migrations_to_run": "No hay migraciones que ejecutar", + "migrations_need_to_accept_disclaimer": "Para ejecutar la migración {id} debe aceptar el siguiente descargo de responsabilidad:\n---\n{disclaimer}\n---\nSi acepta ejecutar la migración, vuelva a ejecutar la orden con la opción --accept-disclaimer.", + "migrations_must_provide_explicit_targets": "Necesita proporcionar objetivos explícitos al usar --skip o --force-rerun", + "migrations_migration_has_failed": "Migración {id} fallida, cancelando. Error: {exception}", + "migrations_loading_migration": "Cargando migración {id}…", + "migrations_list_conflict_pending_done": "No puede usar --previous y --done al mismo tiempo.", + "migrations_exclusive_options": "--auto, --skip, and --force-rerun son opciones excluyentes.", + "migrations_failed_to_load_migration": "Error al cargar la migración {id} : {error}", + "migrations_dependencies_not_satisfied": "No se puede ejecutar la migración {id} porque primero necesita ejecutar estas migraciones: {dependencies_id}", + "migrations_cant_reach_migration_file": "No se pueden acceder los archivos de migración en la ruta %s", + "migrations_already_ran": "Esas migraciones ya se han ejecutado: {ids}", + "migration_0011_update_LDAP_schema": "Actualizando el esquema de LDAP...", + "migration_0011_update_LDAP_database": "Actualizando la base de datos de LDAP...", + "migration_0011_rollback_success": "Revertido correctamente.", + "migration_0011_migration_failed_trying_to_rollback": "Migración fallida... intentando revertir el sistema.", + "migration_0011_migrate_permission": "Migrando permisos desde la configuración de las aplicaciones a LDAP...", + "migration_0011_LDAP_update_failed": "Actualización de LDAP fallida. Error: {error:s}", + "migration_0011_LDAP_config_dirty": "Parece que ha personalizado la configuración de LDAP. Para esta migración se necesita actualizar la configuración de LDAP.\nNecesita guardar su configuración actual, restaurar la configuración original con la orden «yunohost tools regen-conf -f» y reintentar después la migración", + "migration_0011_done": "Migración exitosa. Ahora puede gestionar los grupos de usuarios.", + "migration_0011_create_group": "Creando un grupo para cada usuario...", + "migration_0011_can_not_backup_before_migration": "Falló la copia de seguridad del sistema antes de la migración. Migración fallida. Error: {error:s}", + "migration_0011_backup_before_migration": "Creando un respaldo de la base de datos de LDAP y de la configuración de las aplicaciones antes de la migración real.", + "migration_0009_not_needed": "¿La migración ya ocurrió de algún modo? Omitiendo.", + "migration_0008_no_warning": "No se ha detectado ningún riesgo importante sobre la anulación de su configuración SSH ¡pero no existe una certeza absoluta ;)! Si permite a YunoHost anular su configuración actual, ejecute la migración. Por otra parte puede omitir la migración, aunque no se recomienda.", + "migration_0008_warning": "Si entiende esos avisos y permite a YunoHost anular su configuración actual, ejecute la migración. Por otra parte puede omitir la migración, aunque no se recomienda.", + "migration_0008_dsa": " - se desactivará la clave DSA. Así que podría tener que anular un aviso espeluznante de su cliente SSH y volver a comprobar la huella de su servidor;", + "migration_0008_root": " - no podrá conectarse como «root» a través de SSH. En su lugar debería usar el usuario de administración;", + "migration_0008_port": " - tendrá que conectarse usando el puerto 22 en vez de su actual puerto SSH personalizado. No dude en reconfigurarlo;", + "migration_0008_general_disclaimer": "Para mejorar la seguridad de su servidor, es recomendable permitir a YunoHost gestionar la configuración SSH. Su actual configuración SSH difiere de la configuración recomendada. Si permite a YunoHost reconfigurarla, la manera en la que conecta con su servidor a través de SSH cambiará en el siguiente modo:", + "migration_0007_cannot_restart": "No se puede reiniciar SSH después de intentar cancelar la migración número 6.", + "migration_0007_cancelled": "YunoHost no ha podido mejorar el modo en el que se gestiona su configuración de SSH.", + "migration_0006_disclaimer": "YunoHost espera ahora que las contraseñas de «admin» y «root» estén sincronizadas. Al ejecutar esta migración, su contraseña de «root» será reemplazada por la contraseña de administración.", + "migration_0005_not_enough_space": "No hay suficiente espacio libre disponible en {path} para ejecutar la migración en este momento:(.", + "migration_0005_postgresql_96_not_installed": "¿¡Se encontró postgresql 9.4 para ser instalado pero no postgresql 9.6!? Algo raro podría haber ocurrido en su sistema:(…", + "migration_0005_postgresql_94_not_installed": "Postgresql no estaba instalado en su sistema. ¡Nada que hacer!", + "migration_0003_modified_files": "Tenga en cuenta que se encontró que los siguientes archivos fueron modificados manualmente y podrían ser sobrescritos al final de la actualización: {manually_modified_files}", + "migration_0003_problematic_apps_warning": "Tenga en cuenta que se detectaron las siguientes aplicaciones instaladas posiblemente problemáticas. Parece que no fueron instaladas desde una lista de aplicaciones o no estaban etiquetadas como «funciona». Así que no hay garantía de que aún funcionen después de la actualización: {problematic_apps}", + "migration_0003_general_warning": "Tenga en cuenta que esta migración es una operación delicada. Aunque el equipo de YunoHost hizo todo lo posible para revisarla y probarla, la migración aún podría romper parte del sistema o de las aplicaciones.\n\nPor lo tanto le recomendamos que:\n - Realice una copia de seguridad de cualquier dato crítico o aplicación. Más información en https://yunohost.org/backup;\n - Tenga paciencia tras iniciar la migración: dependiendo de su conexión a internet y de su hardware, podría tardar unas cuantas horas hasta que todo se actualice.\n\nAdemás, el puerto para SMTP usado por los clientes de correo externos (como Thunderbird o K9-Mail) cambió de 465 (SSL/TLS) a 587 (STARTTLS). El antiguo puerto 465 se cerrará automáticamente y el nuevo puerto 587 se abrirá en el cortafuegos. ¡Todos los usuarios *tendrán* que adaptar la configuración de sus clientes de correo por lo tanto!", + "migration_0003_still_on_jessie_after_main_upgrade": "Algo fue mal durante la actualización principal: ¿¡el sistema está aún en Jessie!? Para investigar el problema, vea {log}:s…", + "migration_0003_system_not_fully_up_to_date": "Su sistema no está totalmente actualizado. Realice una actualización normal antes de ejecutar la migración a Stretch.", + "migration_0003_not_jessie": "¡La distribución de Debian actual no es Jessie!", + "migration_0003_yunohost_upgrade": "Iniciando la actualización del paquete «yunohost»… La migración finalizará pero la actualización real ocurrirá justo después. Después de que la operación esté completada, podría tener que reiniciar sesión en la administración web.", + "migration_0003_restoring_origin_nginx_conf": "Su archivo /etc/nginx/nginx.conf ha sido editado de algún modo. La migración lo devolverá a su estado original primero… El archivo anterior estará disponible como {backup_dest}.", + "migration_0003_fail2ban_upgrade": "Iniciando la actualización de «fail2ban»…", + "migration_0003_main_upgrade": "Iniciando la actualización principal…", + "migration_0003_patching_sources_list": "Corrigiendo «sources.lists»…", + "migration_0003_start": "Iniciando migración a Stretch. El registro estará disponible en {logfile}.", + "migration_description_0012_postgresql_password_to_md5_authentication": "Forzar a la autentificación de postgresql a usar md5 para las conexiones locales", + "migration_description_0011_setup_group_permission": "Configurar grupo de usuario y configurar permisos para aplicaciones y servicios", + "migration_description_0010_migrate_to_apps_json": "Eliminar la obsoleta «appslists» y usar la nueva lista unificada «apps.json»", + "migration_description_0009_decouple_regenconf_from_services": "Separar el mecanismo «regen-conf» de los servicios", + "migration_description_0008_ssh_conf_managed_by_yunohost_step2": "Permitir que la configuración de SSH la gestione YunoHost (paso 2, manual)", + "migration_description_0007_ssh_conf_managed_by_yunohost_step1": "Permitir que la configuración de SSH la gestione YunoHost (paso 1, automático)", + "migration_description_0006_sync_admin_and_root_passwords": "Sincronizar las contraseñas de «admin» y «root»", + "migration_description_0005_postgresql_9p4_to_9p6": "Migrar las bases de datos de postgresql 9.4 a 9.6", + "migration_description_0004_php5_to_php7_pools": "Reconfigurar los «pools» de PHP para usar PHP 7 en vez de 5", + "migration_description_0003_migrate_to_stretch": "Actualizar el sistema a Debian Stretch y YunoHost 3.0", + "migration_description_0002_migrate_to_tsig_sha256": "Mejorar la seguridad de la TSIG de dyndns usando SHA512 en vez de MD5", + "migration_description_0001_change_cert_group_to_sslcert": "Cambiar los permisos de grupo de certificados de «metronome» a «ssl-cert»", + "migrate_tsig_not_needed": "Parece que no usa un dominio dyndns ¡así que no es necesario migrar!", + "migrate_tsig_wait_4": "30 segundos…", + "migrate_tsig_wait_3": "1 min. …", + "migrate_tsig_wait_2": "2 min. …", + "migrate_tsig_wait": "Esperar 3 min. para que el servidor dyndns tenga en cuenta la nueva clave…", + "migrate_tsig_start": "Detectado algoritmo de clave insuficientemente seguro para la firma TSIG del dominio «{domain}», iniciando migración al más seguro hmac-sha512", + "migrate_tsig_failed": "Error al migrar el dominio de dyndns {domain} a hmac-sha512, revertiendo. Error: {error_code} - {error}", + "migrate_tsig_end": "Terminada la migración a hmac-sha512", + "mail_unavailable": "Esta dirección de correo está reservada y será asignada automáticamente al primer usuario", + "mailbox_disabled": "Mailbox desactivado para usuario {user:s}", + "log_tools_reboot": "Reiniciar el servidor", + "log_tools_shutdown": "Apagar el servidor", + "log_tools_upgrade": "Actualizar paquetes del sistema", + "log_tools_postinstall": "Posinstalación del servidor YunoHost", + "log_tools_migrations_migrate_forward": "Migrar hacia adelante", + "log_tools_maindomain": "Convertir «{}» en dominio principal", + "log_user_permission_remove": "Actualizar permiso «{}»", + "log_user_permission_add": "Actualizar permiso «{}»", + "log_user_update": "Actualizar información del usuario «{}»", + "log_user_group_update": "Actualizar grupo «{}»", + "log_user_group_delete": "Eliminar grupo «{}»", + "log_user_group_add": "Añadir grupo «{}»", + "log_user_delete": "Eliminar usuario «{}»", + "log_user_create": "Añadir usuario «{}»", + "log_regen_conf": "Regenerar la configuración del sistema «{}»", + "log_letsencrypt_cert_renew": "Renovar el certificado «{}» de Let's encrypt", + "log_selfsigned_cert_install": "Instalar certificado autofirmado en el dominio «{}»", + "log_permission_update": "Actualizar permiso «{}» para la aplicación «{}»", + "log_permission_remove": "Eliminar permiso «{}»", + "log_permission_add": "Añadir permiso «{}» para la aplicación «{}»", + "log_letsencrypt_cert_install": "Instalar certificado de Let's encrypt en el dominio «{}»", + "log_dyndns_update": "Actualizar la IP asociada con su subdominio de YunoHost «{}»", + "log_dyndns_subscribe": "Subscribirse a un subdomino de YunoHost «{}»", + "log_domain_remove": "Eliminar el dominio «{}» de la configuración del sistema", + "log_domain_add": "Añadir el dominio «{}» a la configuración del sistema", + "log_remove_on_failed_install": "Eliminar «{}» después de una instalación fallida", + "log_remove_on_failed_restore": "Eliminar «{}» después de una restauración fallida desde un archivo de respaldo", + "log_backup_restore_app": "Restaurar «{}» desde un archivo de respaldo", + "log_backup_restore_system": "Restaurar sistema desde un archivo de respaldo", + "log_available_on_yunopaste": "Este registro está ahora disponible vía {url}", + "log_app_makedefault": "Convertir «{}» en aplicación predeterminada", + "log_app_upgrade": "Actualizar la aplicación «{}»", + "log_app_remove": "Eliminar la aplicación «{}»", + "log_app_install": "Instalar la aplicación «{}»", + "log_app_change_url": "Cambiar la url de la aplicación «{}»", + "log_app_removelist": "Eliminar una lista de aplicaciones", + "log_app_fetchlist": "Añadir una lista de aplicaciones", + "log_app_clearaccess": "Eliminar todos los accesos a «{}»", + "log_app_removeaccess": "Eliminar acceso a «{}»", + "log_app_addaccess": "Añadir acceso a «{}»", + "log_operation_unit_unclosed_properly": "La unidad de operación no se ha cerrado correctamente", + "log_does_exists": "No existe ningún registro de actividades con el nombre «{log}», ejecute «yunohost log list» para ver todos los registros de actividades disponibles", + "log_help_to_get_failed_log": "¡La operación «{desc}» ha fallado! Para obtener ayuda, comparta el registro completo de esta operación ejecutando la orden «yunohost log display {name} --share»", + "log_link_to_failed_log": "¡La operación «{desc}» ha fallado! Para obtener ayuda, proporcione el registro completo de esta operación pulsando aquí", + "log_help_to_get_log": "Para ver el registro de la operación «{desc}», ejecute la orden «yunohost log display {name}»", + "log_link_to_log": "Registro completo de esta operación: «{desc}»", + "log_category_404": "La categoría de registro «{category}» no existe", + "log_corrupted_md_file": "El archivo de metadatos yaml asociado con el registro está dañado: «{md_file}\nError: {error}»", + "hook_json_return_error": "Error al leer la respuesta del gancho {path:s}. Error: {msg:s}. Contenido sin procesar: {raw_content}", + "group_update_failed": "Error en la actualización del grupo «{group}»", + "group_updated": "Grupo «{group}» actualizado", + "group_unknown": "Grupo {group:s} desconocido", + "group_info_failed": "Error en la información del grupo", + "group_deletion_not_allowed": "No se puede eliminar el grupo {group:s} manualmente.", + "group_deletion_failed": "Error al eliminar el grupo «{group}»", + "group_deleted": "Eliminado el grupo «{group}»", + "group_creation_failed": "Error al crear el grupo «{group}»", + "group_created": "Grupo «{group}» creado correctamente", + "group_name_already_exist": "El grupo {name:s} ya existe", + "group_already_disallowed": "El grupo '{group:s}' ya tiene desactivado el permiso «{permission:s}» para la aplicación «{app:s}»", + "group_already_allowed": "El grupo '{group:s}' ya tiene activado el permiso «{permission:s}» para la aplicación «{app:s}»", + "good_practices_about_admin_password": "Va a determinar una nueva contraseña de administración. La contraseña debería tener al menos 8 caracteres, aunque es una buena práctica usar contraseñas más extensas (esto es, una frase) y/o usar caracteres de varias clases (mayúsculas, minúsculas, números y caracteres especiales).", + "global_settings_unknown_type": "Situación imprevista, la configuración {setting:s} parece tener el tipo {unknown_type:s} pero no es un tipo compatible con el sistema.", + "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Permitir el uso de la llave (obsoleta) DSA para la configuración del demonio SSH", + "global_settings_unknown_setting_from_settings_file": "Clave desconocida en la configuración: «{setting_key:s}», desechada y guardada en /etc/yunohost/settings-unknown.json", + "global_settings_setting_security_postfix_compatibility": "Compromiso entre compatibilidad y seguridad para el servidor Postfix. Afecta al cifrado (y otros aspectos relacionados con la seguridad)", + "global_settings_setting_security_ssh_compatibility": "Compromiso entre compatibilidad y seguridad para el servidor SSH. Afecta al cifrado (y otros aspectos relacionados con la seguridad)", + "global_settings_setting_security_password_user_strength": "Seguridad de la contraseña de usuario", + "global_settings_setting_security_password_admin_strength": "Seguridad de la contraseña del administrador", + "global_settings_setting_security_nginx_compatibility": "Compromiso entre compatibilidad y seguridad para el servidor web nginx. Afecta al cifrado (y otros aspectos relacionados con la seguridad)", + "global_settings_setting_example_string": "Ejemplo de opción de cadena", + "global_settings_setting_example_int": "Ejemplo de opción «int»", + "global_settings_setting_example_enum": "Ejemplo de opción «enum»", + "global_settings_setting_example_bool": "Ejemplo de opción booleana", + "global_settings_reset_success": "Éxito. Se ha respaldado su configuración previa en {path:s}", + "global_settings_key_doesnt_exists": "La clave «{settings_key:s}» no existe en la configuración global, puede ver todas las claves disponibles ejecutando «yunohost settings list»", + "global_settings_cant_write_settings": "Error al escribir el archivo de configuración, motivo: {reason:s}", + "global_settings_cant_serialize_settings": "Error al seriar los datos de configuración, motivo: {reason:s}", + "global_settings_cant_open_settings": "Error al abrir el archivo de configuración, motivo: {reason:s}", + "global_settings_bad_type_for_setting": "Tipo erróneo para la configuración {setting:s}, obtuvo {received_type:s}, excepto {expected_type:s}", + "global_settings_bad_choice_for_enum": "Mala elección para la configuración {setting:s}, obtuvo «{choice:s}» pero las opciones disponibles son: {available_choices:s}", + "file_does_not_exist": "El archivo {path:s} no existe.", + "error_when_removing_sftpuser_group": "Error al probar «remove sftpusers group»", + "edit_permission_with_group_all_users_not_allowed": "No puede editar el permiso para el grupo «all_users», utilice «yunohost user permission clear APLICACIÓN» o «yunohost user permission add APLICACIÓN -u USUARIO».", + "edit_group_not_allowed": "No tiene permiso para editar el grupo {group:s}", + "dyndns_could_not_check_available": "No se pudo comprobar si {domain:s} está disponible en {provider:s}.", + "domain_dyndns_dynette_is_unreachable": "No se pudo conectar al dynette de YunoHost, o su YunoHost no está correctamente conectado a internet o el servidor dynette está caído. Error: {error}", + "domain_dns_conf_is_just_a_recommendation": "Esta orden muestra cuál es la configuración *recomendada*. No configura el DNS. Es su responsabilidad configurar la zona de DNS en su registrador según esta recomendación.", + "dpkg_lock_not_available": "Esta orden no se puede ejecutar en este momento porque otro programa parece que está usando el bloqueo de dpkg (el gestor de paquetes del sistema)", + "dpkg_is_broken": "No puede hacer esto en este momento porque dpkg/apt (los gestores de paquetes del sistema) parecen estar en un estado roto... Puede tratar de solucionar este problema conectando a través de SSH y ejecutando `sudo dpkg --configure -a`.", + "confirm_app_install_thirdparty": "¡AVISO! Instalar aplicaciones de terceros podría comprometer la integridad y seguridad de su sistema. Probablemente NO debería instalarlas salvo que sepa lo que está haciendo. ¿Está dispuesto a correr ese riesgo? [{answers:s}] ", + "confirm_app_install_danger": "¡AVISO! Esta aplicación es aún experimental (si no está funcionando expresamente) y ¡es probable que rompa su sistema! Probablemente NO debería instalarla salvo que sepa lo que está haciendo. ¿Está dispuesto a correr ese riesgo? [{answers:s}] ", + "confirm_app_install_warning": "Aviso: esta aplicación puede funcionar pero no está bien integrada en YunoHost. Algunas herramientas como la autentificación única y respaldo/restauración podrían no estar disponibles. ¿Instalar de todos modos? [{answers:s}] ", + "backup_unable_to_organize_files": "No se pueden organizar los archivos en el archivo con el método rápido", + "backup_permission": "Permiso de respaldo para la aplicación {app:s}", + "backup_output_symlink_dir_broken": "Tiene un enlace simbólico roto en vez del directorio «{path:s}» de sus archivos. Puede que tenga una configuración específica para respaldar sus datos en otro sistema de archivos, en este caso probablemente olvidó remontar o conectar su disco duro o clave usb.", + "backup_mount_archive_for_restore": "Preparando el archivo para la restauración…", + "backup_method_tar_finished": "Creado el archivo de respaldo tar", + "backup_method_custom_finished": "Terminado el método «{method:s}» de respaldo personalizado", + "backup_method_copy_finished": "Terminada la copia de seguridad", + "backup_method_borg_finished": "Terminado el respaldo en borg", + "backup_custom_backup_error": "Fallo del método de respaldo personalizado en el paso «copia de seguridad»", + "backup_actually_backuping": "Creando un archivo de respaldo de los archivos obtenidos…", + "ask_new_path": "Nueva ruta", + "ask_new_domain": "Nuevo dominio", + "apps_permission_restoration_failed": "El permiso «{permission:s}» para la restauración de la aplicación {app:s} ha fallado", + "apps_permission_not_found": "No se han encontrado permisos para las aplicaciones instaladas", + "app_upgrade_several_apps": "Las siguientes aplicaciones se actualizarán: {apps}", + "app_start_restore": "Restaurando aplicación {app}…", + "app_start_backup": "Obteniendo archivos de respaldo para {app}…", + "app_start_remove": "Eliminando aplicación {app}…", + "app_start_install": "Instalando aplicación {app}…", + "app_not_upgraded": "Las siguientes aplicaciones no se actualizaron: {apps}", + "app_action_cannot_be_ran_because_required_services_down": "Esta aplicación necesita algunos servicios que no están funcionando ahora. Antes de continuar, debería intentar reiniciar los siguientes servicios (y posiblemente investigar por qué no funcionan): {services}", + "already_up_to_date": "¡Nada que hacer! ¡Todo está actualizado!", + "admin_password_too_long": "Elija una contraseña de menos de 127 caracteres", + "aborting": "Cancelando." } From d11c76713a08c3174afb40b35d8834aa4643c408 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Tue, 17 Sep 2019 19:02:30 +0000 Subject: [PATCH 30/47] Translated using Weblate (Arabic) Currently translated at 66.1% (386 of 584 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ar/ --- locales/ar.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/ar.json b/locales/ar.json index b6f3ece23..46f9315af 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -442,5 +442,6 @@ "error_when_removing_sftpuser_group": "حدث خطأ أثناء محاولة حذف فريق sftpusers", "dyndns_could_not_check_available": "لا يمكن التحقق مِن أنّ {domain:s} متوفر على {provider:s}.", "backup_mount_archive_for_restore": "جارٍ تهيئة النسخة الاحتياطية للاسترجاع…", - "root_password_replaced_by_admin_password": "لقد تم استبدال كلمة سر الجذر root بالكلمة الإدارية لـ admin." + "root_password_replaced_by_admin_password": "لقد تم استبدال كلمة سر الجذر root بالكلمة الإدارية لـ admin.", + "app_upgrade_stopped": "لقد تم إلغاء تحديث كافة التطبيقات لتجنب حادث بسبب فشل تحديث التطبيق السابق" } From abe294079e9dfd838fc7e828ca91305410e8b3c5 Mon Sep 17 00:00:00 2001 From: advocatux Date: Tue, 17 Sep 2019 19:02:19 +0000 Subject: [PATCH 31/47] Translated using Weblate (Spanish) Currently translated at 100.0% (584 of 584 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/es.json b/locales/es.json index c34a7e33c..d028a7a8e 100644 --- a/locales/es.json +++ b/locales/es.json @@ -599,9 +599,10 @@ "app_start_backup": "Obteniendo archivos de respaldo para {app}…", "app_start_remove": "Eliminando aplicación {app}…", "app_start_install": "Instalando aplicación {app}…", - "app_not_upgraded": "Las siguientes aplicaciones no se actualizaron: {apps}", + "app_not_upgraded": "Error al actualizar la aplicación «{failed_app}» y como consecuencia se han cancelado las actualizaciones de las siguientes aplicaciones: {apps}", "app_action_cannot_be_ran_because_required_services_down": "Esta aplicación necesita algunos servicios que no están funcionando ahora. Antes de continuar, debería intentar reiniciar los siguientes servicios (y posiblemente investigar por qué no funcionan): {services}", "already_up_to_date": "¡Nada que hacer! ¡Todo está actualizado!", "admin_password_too_long": "Elija una contraseña de menos de 127 caracteres", - "aborting": "Cancelando." + "aborting": "Cancelando.", + "app_upgrade_stopped": "Se ha detenido la actualización de todas las aplicaciones para prevenir un posible daño porque la aplicación anterior no se pudo actualizar" } From 62e74d937e2a271ad1d56f70b00ce6e4be3b33d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Wed, 18 Sep 2019 02:01:20 +0200 Subject: [PATCH 32/47] Could not mount Co-Authored-By: decentral1se --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index cab2afff8..da5da0789 100644 --- a/locales/en.json +++ b/locales/en.json @@ -82,7 +82,7 @@ "backup_applying_method_tar": "Creating the backup TAR archive…", "backup_archive_app_not_found": "Could not find the app '{app:s}' in the backup archive", "backup_archive_broken_link": "Could not access the backup archive (broken link to {path:s})", - "backup_archive_mount_failed": "Could not mounting the backup archive", + "backup_archive_mount_failed": "Could not mount the backup archive", "backup_archive_name_exists": "A backup archive with this name already exists.", "backup_archive_name_unknown": "Unknown local backup archive named '{name:s}'", "backup_archive_open_failed": "Could not open the backup archive", From 2e05a04cb945b21a677e36292b963502b4936eb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Wed, 18 Sep 2019 02:04:57 +0200 Subject: [PATCH 33/47] for backup Co-Authored-By: decentral1se --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index da5da0789..29c5e0885 100644 --- a/locales/en.json +++ b/locales/en.json @@ -88,7 +88,7 @@ "backup_archive_open_failed": "Could not open the backup archive", "backup_archive_system_part_not_available": "System part '{part:s}' unavailable in this backup", "backup_archive_writing_error": "Could not add the add files '{source:s}' (named in the archive: '{dest:s}') to be backed up into the compressed archive '{archive:s}'", - "backup_ask_for_copying_if_needed": "Some files could not be prepared for bacup using the method that avoids temporarily wasting space on the system. To perform the backup, {size:s}MB will be temporarily. Do you agree?", + "backup_ask_for_copying_if_needed": "Some files could not be prepared for backup using the method that avoids temporarily wasting space on the system. To perform the backup, {size:s}MB will be temporarily. Do you agree?", "backup_borg_not_implemented": "The Borg backup method is not yet implemented", "backup_cant_mount_uncompress_archive": "Could not mount the uncompressed archive write protected", "backup_cleaning_failed": "Could not clean-up the temporary backup folder", From fa42efe557702a67db1b27bb87a9966760448623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Wed, 18 Sep 2019 02:08:01 +0200 Subject: [PATCH 34/47] The Dovecot Co-Authored-By: decentral1se --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 29c5e0885..77192e069 100644 --- a/locales/en.json +++ b/locales/en.json @@ -307,7 +307,7 @@ "mail_domain_unknown": "Unknown e-mail address for domain '{domain:s}'", "mail_forward_remove_failed": "Could not remove e-mail forwarding '{mail:s}'", "mailbox_disabled": "E-mail turned off for user {user:s}", - "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", "maindomain_change_failed": "Could not change the main domain", "maindomain_changed": "The main domain now changed", From adf2245c204f38807b49e43550063683e394926a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Wed, 18 Sep 2019 02:08:45 +0200 Subject: [PATCH 35/47] have a Co-Authored-By: decentral1se --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 77192e069..e1cc95e5a 100644 --- a/locales/en.json +++ b/locales/en.json @@ -424,7 +424,7 @@ "pattern_firstname": "Must be a valid first name", "pattern_lastname": "Must be a valid last name", "pattern_listname": "Must be alphanumeric and underscore characters only", - "pattern_mailbox_quota": "Must be a size with b/k/M/G/T suffix or 0 to not havea 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_port": "Must be a valid port number (i.e. 0-65535)", "pattern_port_or_range": "Must be a valid port number (i.e. 0-65535) or range of ports (e.g. 100:200)", From 01fa0939fd65a88d6652e26f215b91645e1c50e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Wed, 18 Sep 2019 02:13:43 +0200 Subject: [PATCH 36/47] Spelling: exists, 'yunohost log list' --- locales/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/en.json b/locales/en.json index e1cc95e5a..dc411c054 100644 --- a/locales/en.json +++ b/locales/en.json @@ -232,7 +232,7 @@ "good_practices_about_user_password": "You are now about to define a new user password. The password should be at least 8 characters—though it is good practice to use longer password (i.e. a passphrase) and/or to a variation of characters (uppercase, lowercase, digits and special characters).", "group_already_allowed": "Group '{group:s}' already has permission '{permission:s}' turned on for the app '{app:s}'", "group_already_disallowed": "Group '{group:s}' already has permissions '{permission:s}' turned off for the app '{app:s}'", - "group_name_already_exist": "Group {name:s} already exist", + "group_name_already_exist": "Group {name:s} already exists", "group_created": "Group '{group}' created", "group_creation_failed": "Could not create the group '{group}'", "group_deleted": "Group '{group}' deleted", @@ -258,7 +258,7 @@ "log_help_to_get_log": "To view the log of the operation '{desc}', use the command 'yunohost log display {name}'", "log_link_to_failed_log": "Could not complete the operation '{desc}'. Please provide the full log of this operation by clicking here 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 display {name} --share' to get help", - "log_does_exists": "There is not operation log with the name '{log}', use 'yunohost log list to see all available operation logs'", + "log_does_exists": "There is not 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_addaccess": "Add access to '{}'", "log_app_removeaccess": "Remove access to '{}'", From 6d0bf43aef152c6f5b4f4ff8f4d505aa37ef7819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 19 Sep 2019 03:51:24 +0200 Subject: [PATCH 37/47] Spelling: add the files, as write protected, trying to use --- locales/en.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locales/en.json b/locales/en.json index dc411c054..54bf5eaba 100644 --- a/locales/en.json +++ b/locales/en.json @@ -87,10 +87,10 @@ "backup_archive_name_unknown": "Unknown local backup archive named '{name:s}'", "backup_archive_open_failed": "Could not open the backup archive", "backup_archive_system_part_not_available": "System part '{part:s}' unavailable in this backup", - "backup_archive_writing_error": "Could not add the add files '{source:s}' (named in the archive: '{dest:s}') to be backed up into the compressed archive '{archive:s}'", + "backup_archive_writing_error": "Could not add the files '{source:s}' (named in the archive '{dest:s}') to be backed up into the compressed archive '{archive:s}'", "backup_ask_for_copying_if_needed": "Some files could not be prepared for backup using the method that avoids temporarily wasting space on the system. To perform the backup, {size:s}MB will be temporarily. Do you agree?", "backup_borg_not_implemented": "The Borg backup method is not yet implemented", - "backup_cant_mount_uncompress_archive": "Could not mount the uncompressed archive write protected", + "backup_cant_mount_uncompress_archive": "Could not mount the uncompressed archive as write protected", "backup_cleaning_failed": "Could not clean-up the temporary backup folder", "backup_copying_to_organize_the_archive": "Copying {size:s}MB to organize the archive", "backup_couldnt_bind": "Could not bind {src:s} to {dest:s}.", @@ -134,7 +134,7 @@ "certmanager_cert_install_success_selfsigned": "Self-signed certificate now installed for the domain '{domain:s}'", "certmanager_cert_renew_success": "Let's Encrypt certificate renewed for the domain '{domain:s}'", "certmanager_cert_signing_failed": "Could not sign the new certificate", - "certmanager_certificate_fetching_or_enabling_failed": "It seems actually using the new certificate for {domain:s} did not work…", + "certmanager_certificate_fetching_or_enabling_failed": "Trying to use the new certificate for {domain:s} did not work…", "certmanager_conflicting_nginx_file": "Could not prepare domain for ACME challenge: the NGINX configuration file {filepath:s} is conflicting and should be removed first", "certmanager_couldnt_fetch_intermediate_cert": "Timed out when trying to fetch intermediate certificate from Let's Encrypt. Certificate installation/renewal aborted—please try again later.", "certmanager_domain_cert_not_selfsigned": "The certificate for domain {domain:s} is not self-signed. Are you sure you want to replace it? (Use '--force' to do so.)", From 35df93bb865b5202deaa757678ae066a2d0b7c9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 19 Sep 2019 03:54:40 +0200 Subject: [PATCH 38/47] Spelling: user info --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 54bf5eaba..2f4e1aadc 100644 --- a/locales/en.json +++ b/locales/en.json @@ -291,7 +291,7 @@ "log_user_group_add": "Add '{}' group", "log_user_group_delete": "Delete '{}' group", "log_user_group_update": "Update '{}' group", - "log_user_update": "Update info of '{}' user", + "log_user_update": "Update user info of '{}'", "log_user_permission_add": "Update '{}' permission", "log_user_permission_remove": "Update '{}' permission", "log_tools_maindomain": "Make '{}' the main domain", From 7903fb27f7ffcdd8dc368509fae899357f865a65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 19 Sep 2019 19:10:09 +0200 Subject: [PATCH 39/47] All applications are already Co-Authored-By: Alexandre Aubin --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 2f4e1aadc..7f68ce3d5 100644 --- a/locales/en.json +++ b/locales/en.json @@ -27,7 +27,7 @@ "app_location_install_failed": "Cannot install the app there because it conflicts with the app '{other_app}' already installed in '{other_path}'", "app_location_unavailable": "This URL is either unavailable, or conflicts with the already installed app(s):\n{apps:s}", "app_manifest_invalid": "Something is wrong with the app manifest: {error}", - "app_no_upgrade": "Everything is up-to-date", + "app_no_upgrade": "All applications are already up-to-date", "app_not_upgraded": "These apps were not upgraded: {apps}", "app_not_correctly_installed": "{app:s} seems to be incorrectly installed", "app_not_installed": "The application '{app:s}' is not to be found among all installed apps: {all_apps}", From 98236ac839fe78d1596f3e4f7415cff4989d4f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 19 Sep 2019 19:11:27 +0200 Subject: [PATCH 40/47] Some requirements are not met Co-Authored-By: Alexandre Aubin --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 7f68ce3d5..35656cfd9 100644 --- a/locales/en.json +++ b/locales/en.json @@ -35,7 +35,7 @@ "app_package_need_update": "The app {app} package needs to be updated to follow YunoHost changes", "app_removed": "{app:s} removed", "app_requirements_checking": "Checking required packages for {app}…", - "app_requirements_failed": "Did not meet requirements for {app}: {error}", + "app_requirements_failed": "Some requirements are not met for {app}: {error}", "app_requirements_unmeet": "Requirements are not met for {app}, the package {pkgname} ({version}) must be {spec}", "app_sources_fetch_failed": "Could not fetch sources files, is the URL correct?", "app_start_install": "Installing application {app}…", From a8337f1bfd178d04c946428a3823af8b5886d19b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 19 Sep 2019 19:12:33 +0200 Subject: [PATCH 41/47] Allows you to reach Co-Authored-By: Alexandre Aubin --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 35656cfd9..15c8f5e4b 100644 --- a/locales/en.json +++ b/locales/en.json @@ -493,7 +493,7 @@ "service_already_started": "The service '{service:s}' has already been started", "service_already_stopped": "The service '{service:s}' has already been stopped", "service_cmd_exec_failed": "Could not execute the command '{command:s}'", - "service_description_avahi-daemon": "allows you to reach your server using 'yunohost.local' in your local network", + "service_description_avahi-daemon": "Allows you to reach your server using 'yunohost.local' in your local network", "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_fail2ban": "Protects against brute-force and other kinds of attacks from the Internet", From 8ad01c6093eec38915b09c9362133cdac97d6e8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 19 Sep 2019 19:12:50 +0200 Subject: [PATCH 42/47] Runs applications Co-Authored-By: Alexandre Aubin --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 15c8f5e4b..e4c41fc5b 100644 --- a/locales/en.json +++ b/locales/en.json @@ -502,7 +502,7 @@ "service_description_mysql": "Stores applications data (SQL database)", "service_description_nginx": "Serves or provides access to all the websites hosted on your server", "service_description_nslcd": "Handles YunoHost user shell connection", - "service_description_php7.0-fpm": "runs applications written in PHP with NGINX", + "service_description_php7.0-fpm": "Runs applications written in PHP with NGINX", "service_description_postfix": "Used to send and receive e-mails", "service_description_redis-server": "A specialized database used for rapid data access, task queue, and communication between programs", "service_description_rmilter": "Checks various parameters in e-mails", From 929421f81559deaacd861dfe0d60411816a884bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 19 Sep 2019 19:13:30 +0200 Subject: [PATCH 43/47] Migration {id} completed Co-Authored-By: Alexandre Aubin --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index e4c41fc5b..03a750aa5 100644 --- a/locales/en.json +++ b/locales/en.json @@ -383,7 +383,7 @@ "migrations_pending_cant_rerun": "Those migrations are still pending, so cannot be run again: {ids}", "migrations_running_forward": "Running migration {id}…", "migrations_skip_migration": "Skipping migration {id}…", - "migrations_success_forward": "Ran migration {id}", + "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 migrate`.", "monitor_disabled": "Server monitoring now turned off", "monitor_enabled": "Server monitoring now turned on", From 0015db83b9970012d5188bc22944358f1febb22e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 19 Sep 2019 19:14:17 +0200 Subject: [PATCH 44/47] create the backup archive Co-Authored-By: Alexandre Aubin --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 03a750aa5..5078e1026 100644 --- a/locales/en.json +++ b/locales/en.json @@ -96,7 +96,7 @@ "backup_couldnt_bind": "Could not bind {src:s} to {dest:s}.", "backup_created": "Backup created", "backup_creating_archive": "Creating the backup archive…", - "backup_creation_failed": "Could not create the backup creation", + "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_creation_failed": "Could not create the CSV file needed for restoration", "backup_custom_backup_error": "Custom backup method could not get past the 'backup' step", From 5a792fc6dbb72d834ccc8eee3a520339c9d1f9d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 19 Sep 2019 19:27:52 +0200 Subject: [PATCH 45/47] password got changed Co-Authored-By: Alexandre Aubin --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 5078e1026..c68141d97 100644 --- a/locales/en.json +++ b/locales/en.json @@ -3,7 +3,7 @@ "action_invalid": "Invalid action '{action:s}'", "admin_password": "Administration password", "admin_password_change_failed": "Cannot change password", - "admin_password_changed": "The administration password now changed", + "admin_password_changed": "The administration password got changed", "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.", "app_action_cannot_be_ran_because_required_services_down": "This app requires some services which are currently down. Before continuing, you should try to restart the following services (and possibly investigate why they are down): {services}", From d2e4a59a2506f56f463c1881afc02fe21d148312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 19 Sep 2019 19:31:03 +0200 Subject: [PATCH 46/47] The user, Could not find the, in the list of --- locales/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/en.json b/locales/en.json index c68141d97..5093d6e69 100644 --- a/locales/en.json +++ b/locales/en.json @@ -30,7 +30,7 @@ "app_no_upgrade": "All applications are already up-to-date", "app_not_upgraded": "These apps were not upgraded: {apps}", "app_not_correctly_installed": "{app:s} seems to be incorrectly installed", - "app_not_installed": "The application '{app:s}' is not to be found among all installed apps: {all_apps}", + "app_not_installed": "Could not find the application '{app:s}' in the list of installed apps: {all_apps}", "app_not_properly_removed": "{app:s} has not been properly removed", "app_package_need_update": "The app {app} package needs to be updated to follow YunoHost changes", "app_removed": "{app:s} removed", @@ -564,7 +564,7 @@ "upnp_disabled": "UPnP turned off", "upnp_enabled": "UPnP turned on", "upnp_port_open_failed": "Could not open port via UPnP", - "user_already_in_group": "The User '{user:}' already in the group {group:s}", + "user_already_in_group": "The user '{user:}' is already in the '{group:s}' group", "user_created": "User created", "user_creation_failed": "Could not create user", "user_deleted": "User deleted", From 52b59ff2a41b04107433caa7e1523a03aee8f4d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Wed, 18 Sep 2019 16:30:18 +0000 Subject: [PATCH 47/47] Translated using Weblate (Occitan) Currently translated at 99.0% (578 of 584 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/oc/ --- locales/oc.json | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/locales/oc.json b/locales/oc.json index 2cb33f4bd..320a18341 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -198,7 +198,7 @@ "migrations_current_target": "La cibla de migracion est {}", "migrations_error_failed_to_load_migration": "ERROR : fracàs del cargament de la migracion {number} {name}", "migrations_list_conflict_pending_done": "Podètz pas utilizar --previous e --done a l’encòp.", - "migrations_loading_migration": "Cargament de la migracion{number} {name}…", + "migrations_loading_migration": "Cargament de la migracion {id}…", "migrations_no_migrations_to_run": "Cap de migracion de lançar", "migrations_show_currently_running_migration": "Realizacion de la migracion {number} {name}…", "migrations_show_last_migration": "La darrièra migracion realizada es {}", @@ -376,10 +376,10 @@ "migration_0003_general_warning": "Notatz qu’aquesta migracion es una operacion delicata. Encara que la còla YunoHost aguèsse fach çò melhor per la tornar legir e provar, la migracion poiriá copar de parts del sistèma o de las aplicacions.\n\nEn consequéncia, vos recomandam :\n· · · · - de lançar una salvagarda de vòstras donadas o aplicacions criticas. Mai d’informacions a https://yunohost.org/backup ;\n· · · · - d’èsser pacient aprèp aver lançat la migracion : segon vòstra connexion Internet e material, pòt trigar qualques oras per que tot siá mes al nivèl.\n\nEn mai, lo pòrt per SMTP, utilizat pels clients de corrièls extèrns (coma Thunderbird o K9-Mail per exemple) foguèt cambiat de 465 (SSL/TLS) per 587 (STARTTLS). L’ancian pòrt 465 serà automaticament tampat e lo nòu pòrt 587 serà dobèrt dins lo parafuòc. Vosautres e vòstres utilizaires *auretz* d’adaptar la configuracion de vòstre client de corrièl segon aqueles cambiaments !", "migration_0003_problematic_apps_warning": "Notatz que las aplicacions seguentas, saique problematicas, son estadas desactivadas. Semblan d’aver estadas installadas d’una lista d’aplicacions o que son pas marcadas coma «working ». En consequéncia, podèm pas assegurar que tendràn de foncionar aprèp la mesa a nivèl : {problematic_apps}", "migrations_bad_value_for_target": "Nombre invalid pel paramètre « target », los numèros de migracion son 0 o {}", - "migrations_migration_has_failed": "La migracion {number} {name} a pas capitat amb l’excepcion {exception}, anullacion", - "migrations_skip_migration": "Passatge de la migracion {number} {name}…", - "migrations_to_be_ran_manually": "La migracion {number} {name} deu èsser lançada manualament. Mercés d’anar a Aisinas > Migracion dins l’interfàcia admin, o lançar « yunohost tools migrations migrate ».", - "migrations_need_to_accept_disclaimer": "Per lançar la migracion {number} {name} , avètz d’acceptar aquesta clausa de non-responsabilitat :\n---\n{disclaimer}\n---\nS’acceptatz de lançar la migracion, mercés de tornar executar la comanda amb l’opcion accept-disclaimer.", + "migrations_migration_has_failed": "La migracion {id} a pas capitat, abandon. Error : {exception}", + "migrations_skip_migration": "Passatge de la migracion {id}…", + "migrations_to_be_ran_manually": "La migracion {id} deu èsser lançada manualament. Mercés d’anar a Aisinas > Migracion dins l’interfàcia admin, o lançar « yunohost tools migrations migrate ».", + "migrations_need_to_accept_disclaimer": "Per lançar la migracion {id} , avètz d’acceptar aquesta clausa de non-responsabilitat :\n---\n{disclaimer}\n---\nS’acceptatz de lançar la migracion, mercés de tornar executar la comanda amb l’opcion accept-disclaimer.", "monitor_disabled": "La supervision del servidor es desactivada", "monitor_enabled": "La supervision del servidor es activada", "mysql_db_initialized": "La basa de donadas MySQL es estada inicializada", @@ -453,7 +453,7 @@ "migration_0005_postgresql_94_not_installed": "Postgresql es pas installat sul sistèma. Pas res de far !", "migration_0005_postgresql_96_not_installed": "Avèm trobat que Postgresql 9.4 es installat, mas cap de version de Postgresql 9.6 pas trobada !? Quicòm d’estranh a degut arribar a vòstre sistèma :( …", "migration_0005_not_enough_space": "I a pas pro d’espaci disponible sus {path} per lançar la migracion d’aquela passa :(.", - "recommend_to_add_first_user": "La post installacion es acabada, mas YunoHost fa besonh d’almens un utilizaire per foncionar coma cal. Vos cal n’ajustar un en utilizant la comanda « yunohost user create $username » o ben l’interfàcia d’administracion.", + "recommend_to_add_first_user": "La post installacion es acabada, mas YunoHost fa besonh d’almens un utilizaire per foncionar coma cal. Vos cal n’ajustar un en utilizant la comanda « yunohost user create