From 8c79600728b4505c4c42d7ce7cfa099c3bad35dd Mon Sep 17 00:00:00 2001 From: Christian Wehrli Date: Sat, 23 Jan 2021 16:53:23 +0000 Subject: [PATCH 01/37] Translated using Weblate (German) Currently translated at 77.8% (312 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/ --- app/src/i18n/locales/de.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/app/src/i18n/locales/de.json b/app/src/i18n/locales/de.json index 52c26076..74b04a20 100644 --- a/app/src/i18n/locales/de.json +++ b/app/src/i18n/locales/de.json @@ -303,5 +303,24 @@ "diagnosis_explanation": "Die Diagnose Funktion wird versuchen, gängige Probleme in verschiedenen Teilen deines Servers zu finden, damit alles reibungslos läuft. Die Diagnose wird auch automatisch zweimal täglich ausgeführt, falls Fehler gefunden werden, bekommt der Administrator ein E-Mail. Beachte, dass einige tests nicht relevant sind, wenn du einzelne Features (zum Beispiel XMPP) nicht benutzt oder du ein komplexes Setup hast. In diesem Fall und wenn du weisst was du tust ist es in Ordnung die dazugehoerigen Warnungen und Hinweise zu ignorieren.", "pending_migrations": "Es gibt einige ausstehende Migrationen, die darauf warten, ausgeführt zu werden. Bitte gehen Sie auf Werkzeuge > Migrationen um diese auszuführen.", "tip_about_user_email": "Benutzer*innen werden mit einer verknüpften eMail-Adresse (und XMPP Account) erstellt im Format username@domain.tld. Zusätzliche eMail-Aliasse and eMail-Weiterleitungen können später durch den/die Admin und User*in hinzugefügt werden.", - "logs_suboperations": "Unter-Operationen" + "logs_suboperations": "Unter-Operationen", + "api_errors_titles": { + "APIBadRequestError": "Yunohost ist ein Fehler widerfahren", + "APIError": "Yunohost ist ein unerwarteter Fehler widerfahren" + }, + "api_error": { + "sorry": "Tut uns wirklich leid.", + "info": "Die folgenden Informationen könnten nützlich sein für die Person, die Ihnen hilft:", + "help": "Sie sollten für Hilfe im Forum oder im Chat nachschauen, um das Problem zu beheben, oder einen Bug melden im Bugtracker>." + }, + "address": { + "local_part_description": { + "email": "Wählen Sie einen lokalen Teil für Ihre E-Mail.", + "domain": "Wählen Sie eine Subdomain." + }, + "domain_description": { + "email": "Wählen Sie eine Domäne für Ihre E-Mail.", + "domain": "Wählen Sie eine Domäne." + } + } } From d7e388331994fa5731df226d626bf2aa6dab9d52 Mon Sep 17 00:00:00 2001 From: Yasss Gurl Date: Sat, 23 Jan 2021 23:15:34 +0000 Subject: [PATCH 02/37] Translated using Weblate (German) Currently translated at 81.5% (327 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/ --- app/src/i18n/locales/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/i18n/locales/de.json b/app/src/i18n/locales/de.json index 74b04a20..37fb6e59 100644 --- a/app/src/i18n/locales/de.json +++ b/app/src/i18n/locales/de.json @@ -294,7 +294,7 @@ "all": "Alle", "confirm_service_restart": "Bist du sicher, dass du {name} neustarten möchtest?", "run_first_diagnosis": "Initiale Diagnose läuft", - "diagnosis_first_run": "Die Diagnosefunktion versucht, häufige Probleme in den verschiedenen Bereichen Ihres Servers zu identifizieren, um sicherzustellen, dass alles reibungslos läuft. Bitte geraten Sie nicht in Panik, wenn Sie direkt nach dem Einrichten Ihres Servers einen Haufen Fehler sehen: es soll Ihnen genau dabei helfen, Probleme zu identifizieren und Sie zur Behebung dieser Probleme anleiten. Die Diagnose läuft auch automatisch zweimal täglich, und wenn Probleme gefunden werden, wird eine E-Mail an den Administrator geschickt.", + "diagnosis_first_run": "Die Diagnose Funktion wird versuchen, gängige Probleme in verschiedenen Teilen deines Servers zu finden, damit alles reibungslos läuft. Hab keine Angst, wenn du ein paar Fehlermeldungen siehst nachdem du deinen Server aufgesetzt hast: es soll versuchen dir zu helfen, Probleme zu identifizieren und Tipps für Lösungen zu zeigen. Die Diagnose wird auch automatisch zweimal täglich ausgeführt, falls Fehler gefunden werden, bekommt der Administrator ein E-Mail.", "unmaintained_details": "Diese Anwendung wurde seit einiger Zeit nicht gewartet und der frühere Wart hat die Anwendung aufgegeben oder hat keine Zeit mehr für die Wartung. Du bist herzlich eingeladen dir die Quellen und Unterlagen anzusehen und Hilfe zu leisten", "group_explain_visitors_needed_for_external_client": "Sei vorsichtig und beachte, dass du manche Anwendungen für externe Besucher*innen freigeben musst, falls du beabsichtigst, diese mit externen Clients aufzurufen. Zum Beispiel trifft das auf Nextcloud zu, wenn du eine Synchronisation auf dem Smartphone oder Desktop PC haben möchtest.", "issues": "{count} Probleme", From 1f5d49a873674398df41bac336eaa092633e741a Mon Sep 17 00:00:00 2001 From: Manu Bu Date: Sat, 23 Jan 2021 23:13:43 +0000 Subject: [PATCH 03/37] Translated using Weblate (German) Currently translated at 81.5% (327 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/ --- app/src/i18n/locales/de.json | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/app/src/i18n/locales/de.json b/app/src/i18n/locales/de.json index 37fb6e59..559825c0 100644 --- a/app/src/i18n/locales/de.json +++ b/app/src/i18n/locales/de.json @@ -23,7 +23,7 @@ "confirm_change_maindomain": "Möchtest du wirklich die Hauptdomain ändern?", "confirm_delete": "Möchtest du wirklich {name} löschen?", "confirm_install_custom_app": "WARNUNG! Die Installation von Drittanbieter Apps könnte die Sicherheit und Integrität deines Systems gefährden. Du solltest sie nicht installieren außer du weißt was du tust. Willst du das Risiko eingehen?", - "confirm_install_domain_root": "Du wirst keine weiteren Apps auf {domain} installieren können. Dennoch fortfahren?", + "confirm_install_domain_root": "Bist du sicher das du die Anwendung '/'? installieren willst? Du kann keine andere App auf der Domäne {domain} installieren", "confirm_postinstall": "Du bist dabei, den Konfigurationsprozess für die Domain {domain} starten. Dies wird ein paar Minuten dauern, *die Ausführung nicht unterbrechen*.", "confirm_restore": "Möchtest du wirklich {name} wiederherstellen?", "confirm_uninstall": "Möchtest du wirklich {name} deinstallieren?", @@ -231,7 +231,7 @@ "logs_system": "Kernel-Logs und andere Ereignisse auf niederer Ebene", "select_none": "Wähle keine", "skip": "Überspringe", - "logs_share_with_yunopaste": "Teile mit YunoPaste", + "logs_share_with_yunopaste": "Logs teilen mit YunoPaste", "migrations_pending": "Ausstehende Migrationen", "logs_operation": "Operationen, die auf dem System mit YunoHost durchgeführt wurden", "logs_history": "Historie der Befehlsausführung auf dem System", @@ -306,12 +306,15 @@ "logs_suboperations": "Unter-Operationen", "api_errors_titles": { "APIBadRequestError": "Yunohost ist ein Fehler widerfahren", - "APIError": "Yunohost ist ein unerwarteter Fehler widerfahren" + "APIError": "Yunohost ist ein unerwarteter Fehler widerfahren", + "APIConnexionError": "Yunohost hat ein Verbindungsfehler festgestellt", + "APINotRespondingError": "Die Yunohost API antwortet nicht", + "APIInternalError": "Im Yunohost ist ein interner Fehler aufgetreten" }, "api_error": { "sorry": "Tut uns wirklich leid.", "info": "Die folgenden Informationen könnten nützlich sein für die Person, die Ihnen hilft:", - "help": "Sie sollten für Hilfe im Forum oder im Chat nachschauen, um das Problem zu beheben, oder einen Bug melden im Bugtracker>." + "help": "Sie sollten für Hilfe im Forum oder im Chat nachschauen, um das Problem zu beheben, oder einen Bug melden im Bugtracker." }, "address": { "local_part_description": { @@ -322,5 +325,17 @@ "email": "Wählen Sie eine Domäne für Ihre E-Mail.", "domain": "Wählen Sie eine Domäne." } - } + }, + "permission_show_tile_enabled": "Sichtbar als Kachel im Benutzerportal", + "permission_main": "Hauptrechte", + "permission_corresponding_url": "Entsprechender URL", + "cancel": "Abbrechen", + "app_show_categories": "Kategorien anzeigen", + "app_manage_label_and_tiles": "Etiketten und Kacheln verwalten", + "app_config_panel_no_panel": "Für diese Anwendung ist keine Konfiguration verfügbar", + "app_config_panel_label": "Konfigurieren dieser App", + "app_config_panel": "Konfigurationsfenster", + "app_choose_category": "Kategorie auswählen", + "app_actions_label": "Aktionen ausführen", + "api_waiting": "Warten auf Server Antwort..." } From 1452a01260ac436a2050a66cc49fd75c24bf49aa Mon Sep 17 00:00:00 2001 From: Manu Bu Date: Sat, 23 Jan 2021 23:32:40 +0000 Subject: [PATCH 04/37] Translated using Weblate (German) Currently translated at 99.7% (400 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/ --- app/src/i18n/locales/de.json | 97 ++++++++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 3 deletions(-) diff --git a/app/src/i18n/locales/de.json b/app/src/i18n/locales/de.json index 559825c0..c178ea5b 100644 --- a/app/src/i18n/locales/de.json +++ b/app/src/i18n/locales/de.json @@ -262,7 +262,8 @@ "unignore": "Unignorieren", "warnings": "{count} Warnungen", "words": { - "default": "Vorgabe" + "default": "Vorgabe", + "collapse": "Zusammenbruch" }, "group": "Gruppe", "details": "Details", @@ -294,7 +295,7 @@ "all": "Alle", "confirm_service_restart": "Bist du sicher, dass du {name} neustarten möchtest?", "run_first_diagnosis": "Initiale Diagnose läuft", - "diagnosis_first_run": "Die Diagnose Funktion wird versuchen, gängige Probleme in verschiedenen Teilen deines Servers zu finden, damit alles reibungslos läuft. Hab keine Angst, wenn du ein paar Fehlermeldungen siehst nachdem du deinen Server aufgesetzt hast: es soll versuchen dir zu helfen, Probleme zu identifizieren und Tipps für Lösungen zu zeigen. Die Diagnose wird auch automatisch zweimal täglich ausgeführt, falls Fehler gefunden werden, bekommt der Administrator ein E-Mail.", + "diagnosis_first_run": "Die Diagnose Funktion wird versuchen, gängige Probleme in verschiedenen Teilen deines Servers zu finden, damit alles reibungslos läuft. Hab keine Angst, wenn du ein paar Fehlermeldungen siehst nachdem du deinen Server aufgesetzt hast: es soll versuchen dir zu helfen, Probleme zu identifizieren und Tipps für Lösungen zu zeigen. Die Diagnose wird auch automatisch zweimal täglich ausgeführt, falls Fehler gefunden werden, bekommt der Administrator ein E-Mail.", "unmaintained_details": "Diese Anwendung wurde seit einiger Zeit nicht gewartet und der frühere Wart hat die Anwendung aufgegeben oder hat keine Zeit mehr für die Wartung. Du bist herzlich eingeladen dir die Quellen und Unterlagen anzusehen und Hilfe zu leisten", "group_explain_visitors_needed_for_external_client": "Sei vorsichtig und beachte, dass du manche Anwendungen für externe Besucher*innen freigeben musst, falls du beabsichtigst, diese mit externen Clients aufzurufen. Zum Beispiel trifft das auf Nextcloud zu, wenn du eine Synchronisation auf dem Smartphone oder Desktop PC haben möchtest.", "issues": "{count} Probleme", @@ -337,5 +338,95 @@ "app_config_panel": "Konfigurationsfenster", "app_choose_category": "Kategorie auswählen", "app_actions_label": "Aktionen ausführen", - "api_waiting": "Warten auf Server Antwort..." + "api_waiting": "Warten auf Server Antwort...", + "user_emailforward_add": "Fügen Sie eine Mail-Weiterleitung hinzu", + "user_emailaliases_add": "Fügen Sie einen Mail-Alias hinzu", + "unknown": "Unbekannt", + "traceback": "Zurück verfolgen", + "tools_webadmin_settings": "Webadministratoreinstellungen", + "tools_webadmin": { + "transitions": "Seitenübergangsanimationen", + "experimental_description": "Ermöglicht den Zugriff auf experimentelle Funktionen. Diese gelten als instabil und können Ihr System beschädigen.
Nur aktivieren, wenn Sie wissen, was Sie tun.", + "experimental": "Experimenteller Modus", + "cache_description": "Deaktivieren Sie den Cache, wenn Sie mit der CLI arbeiten möchten, während Sie gleichzeitig in diesem Webadministrator navigieren.", + "cache": "Zwischenspeicher", + "fallback_language_description": "Sprache, die verwendet wird, falls die Übersetzung nicht in der Hauptsprache verfügbar ist.", + "language": "Sprache" + }, + "tools_power_up": "Ihr Server scheint zugänglich zu sein. Sie können jetzt versuchen, sich anzumelden.", + "search": { + "not_found": "Es gibt {Elemente}, die Ihren Kriterien entsprechen.", + "for": "Suche nach {items} ..." + }, + "readme": "Readme", + "postinstall_set_password": "Legen Sie das Administrationskennwort fest", + "postinstall_set_domain": "Hauptdomäne festlegen", + "placeholder": { + "domain": "my-domain.de", + "groupname": "Mein Gruppenname", + "lastname": "Mustermann", + "firstname": "Max", + "username": "maxmustermann" + }, + "perform": "Ausführen", + "migrations_disclaimer_not_checked": "Für diese Migration müssen Sie den Haftungsausschluss bestätigen, bevor Sie sie ausführen.", + "migrations_disclaimer_check_message": "Ich habe diesen Haftungsausschluss gelesen und verstanden", + "mailbox_quota_example": "700M ist eine CD, 4700M ist eine DVD", + "items_verbose_count": "Es gibt {items}.", + "items": { + "users": "keine Benutzer | Benutzer | {c} Benutzer", + "services": "keine Dienste | Dienst | {c} Dienste", + "logs": "keine Protokolle | Protokoll | {c} Protokolle", + "installed_apps": "keine installierten Apps | installierte App | {c} installierte Apps", + "groups": "keine Gruppen | Gruppe | {c} Gruppen", + "domains": "keine Domains | Domain | {c} Domains", + "backups": "keine Backups | Backup | {c} Backups", + "apps": "keine Apps | App | {c} Apps" + }, + "history": { + "methods": { + "DELETE": "entfernen", + "PUT": "bearbeiten", + "POST": "erstellen/ausführen" + }, + "last_action": "Letzte Aktion:", + "title": "Historie" + }, + "form_errors": { + "required": "Feld ist erforderlich.", + "passwordMatch": "Passwörter stimmen nicht überein.", + "passwordLenght": "Das Passwort muss mindestens 8 Zeichen lang sein.", + "number": "Wert muss eine Zahl sein.", + "notInUsers": "Der Benutzer '{value}' existiert bereits.", + "minValue": "Der Wert muss eine Zahl sein, die gleich oder größer als {min} ist.", + "name": "Namen dürfen keine Sonderzeichen außer , .'- enthalten", + "githubLink": "Die URL muss ein gültiger Github-Link zu einem Repository sein", + "emailForward": "Ungültige E-Mail-Weiterleitung: Sie darf nur aus alphanumerischen Zeichen und _.-+ bestehen (z. B. jemand+tag@example.com, s0me-1+tag@example.com)", + "email": "Ungültige E-Mail: Sie darf nur aus alphanumerischen Zeichen und _.- bestehen (z. B. jemand@example.com, s0me-1@example.com)", + "dynDomain": "Ungültiger Domainname: Er darf nur aus alphanumerischen Kleinbuchstaben und Bindestrichen bestehen", + "domain": "Ungültiger Domainname: Er darf nur aus alphanumerischen Kleinbuchstaben, Punkt- und Strichzeichen bestehen", + "between": "Der Wert muss zwischen {min} und {max} liegen.", + "alphalownum_": "Der Wert darf nur aus alphanumerischen Kleinbuchstaben und Unterstrichen bestehen.", + "alpha": "Der Wert darf nur aus alphabetischen Zeichen bestehen." + }, + "footer": { + "donate": "Spenden", + "help": "Brauchen Sie Hilfe?", + "documentation": "Dokumentation" + }, + "experimental": "Experimentell", + "error": "Fehler", + "enabled": "Aktiviert", + "domain_delete_forbidden_desc": "Sie können '{domain}' nicht entfernen, da es sich um die Standarddomäne handelt. Sie müssen eine andere Domäne auswählen (oder eine neue hinzufügen ) und diese als Standarddomäne festlegen um die aktuelle entfernen zu können.", + "domain_add_dyndns_forbidden": "Sie haben bereits eine DynDNS-Domain abonniert. Sie können Ihre aktuelle DynDNS-Domain im Forum im dedizierten Thread .", + "disabled": "Deaktiviert", + "dead": "Inaktiv", + "day_validity": " Abgelaufen seit | einem Tag | {count} Tage", + "confirm_app_install": "Möchtest du diese Anwendung wirklich installieren?", + "common": { + "lastname": "Nachname", + "firstname": "Vorname" + }, + "code": "Code", + "app_actions": "Aktionen" } From 2bc85ecae3dbfbd00842971fd94970287a125236 Mon Sep 17 00:00:00 2001 From: ppr Date: Thu, 21 Jan 2021 19:09:53 +0000 Subject: [PATCH 05/37] Translated using Weblate (French) Currently translated at 87.5% (351 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/ --- app/src/i18n/locales/fr.json | 126 ++++++++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 2 deletions(-) diff --git a/app/src/i18n/locales/fr.json b/app/src/i18n/locales/fr.json index 30d7907f..99cf2e97 100644 --- a/app/src/i18n/locales/fr.json +++ b/app/src/i18n/locales/fr.json @@ -283,7 +283,8 @@ "unignore": "Cesser d'ignorer", "warnings": "{count} avertissements", "words": { - "default": "Défaut" + "default": "Défaut", + "collapse": "Effondrement/éboulement" }, "configuration": "Configuration", "since": "depuis", @@ -307,5 +308,126 @@ "permission_show_tile_enabled": "Montrer la tuile dans le portail utilisateur", "permission_main": "Permission principale", "permission_corresponding_url": "URL correspondante", - "app_manage_label_and_tiles": "Gérer les étiquettes et les tuiles" + "app_manage_label_and_tiles": "Gérer les étiquettes et les tuiles", + "user_emailforward_add": "Ajouter une adresse mail de redirection", + "user_emailaliases_add": "Ajouter un alias de courrier électronique (mail)", + "unknown": "Inconnu", + "traceback": "Traçage/Traçabilité", + "tools_webadmin_settings": "Paramètres de l'administration web", + "tools_webadmin": { + "transitions": "Animations de transition entre les pages", + "experimental_description": "Cela vous donne accès à des fonctionnalités expérimentales. Celles-ci sont considérées comme instables et peuvent casser votre système.
Ne les activez uniquement si vous savez ce que vous faites.", + "experimental": "Mode expérimental", + "cache_description": "Pensez à désactiver le cache si vous prévoyez de travailler avec l'interface en ligne de commande (CLI) tout en naviguant dans l'administration web (web-admin/panel web).", + "cache": "Cache", + "fallback_language_description": "La langue qui sera utilisée au cas où la traduction ne serait pas disponible dans la langue principale.", + "fallback_language": "Langue de secours", + "language": "Langue" + }, + "tools_power_up": "Votre serveur semble être accessible, vous pouvez maintenant essayer de vous connecter.", + "search": { + "not_found": "Il y a des {items} qui correspondent à vos critères.", + "for": "Recherche de {items} ..." + }, + "readme": "Lisez-moi", + "postinstall_set_password": "Définir le mot de passe d'administration (de l'administrateur de l'instance YunoHost)", + "postinstall_set_domain": "Définir le domaine principal", + "placeholder": { + "domain": "mon-domaine.fr", + "groupname": "Le nom de mon groupe", + "lastname": "Dupont", + "firstname": "Jean", + "username": "jeandupont" + }, + "perform": "Exécute", + "migrations_disclaimer_not_checked": "Cette migration nécessite que vous preniez connaissance de sa décharge de responsabilité avant de l'exécuter.", + "migrations_disclaimer_check_message": "J'ai lu et compris cette décharge de responsabilité", + "mailbox_quota_example": "700 M correspond à un CD, 4 700 M correspond à un DVD", + "items_verbose_count": "Il y a {items}.", + "items": { + "users": "aucun utilistauer | user | {c} users", + "services": "aucun service | service | {c} services", + "logs": "aucun historique/log | log | {c} logs", + "installed_apps": "aucune application installée | installed app | {c} installed apps", + "groups": "aucun groupe | group | {c} groups", + "domains": "aucun domaine | domain | {c} domains", + "backups": "aucune sauvegarde | backup | {c} backups", + "apps": "aucune application | app | {c} apps" + }, + "history": { + "methods": { + "DELETE": "effacer", + "PUT": "modifier", + "POST": "créer/exécuter" + }, + "last_action": "Dernière action :", + "title": "Historique" + }, + "form_errors": { + "required": "Ce champ est obligatoire.", + "passwordMatch": "Les mots de passe ne correspondent pas.", + "passwordLenght": "Le mot de passe doit comporter au moins 8 caractères.", + "number": "La valeur doit être un nombre.", + "notInUsers": "L'utilisateur '{value}' existe déjà.", + "minValue": "La valeur doit être un nombre égal ou supérieur à {min}.", + "name": "Les noms ne peuvent pas comporter de caractères spéciaux, sauf ,.'-", + "githubLink": "L'adresse web (URL) doit être un lien Github valide vers un dépôt", + "emailForward": "Adresse de transfert de courrier électronique non valide : elle doit être alphanumérique et ne comporter que des caractères _.-+ (par exemple, someone+tag@example.com, s0me-1+tag@example.com)", + "email": "Adresse de courriel non valide : elle doit être alphanumérique et ne comporter que des caractères _.- (par exemple someone@example.com, s0me-1@example.com)", + "dynDomain": "Nom de domaine invalide : il doit être composé de minuscules alphanumériques et de tirets du 6 uniquement", + "domain": "Nom de domaine invalide : il doit être composé de minuscules alphanumériques, de points et de tirets du 6 uniquement", + "between": "La valeur doit être comprise entre {min} et {max}.", + "alpha": "La chaîne de caractères ne doit contenir que des lettres.", + "alphalownum_": "La chaîne de caractères doit être en minuscules alphanumériques et avec le tiret du 8 uniquement." + }, + "footer": { + "donate": "Faire un don", + "help": "Besoin d'aide ?", + "documentation": "Documentation" + }, + "experimental": "Expérimental", + "error": "Erreur", + "enabled": "Activé", + "domain_delete_forbidden_desc": "Vous ne pouvez pas supprimer '{domain}' car c'est le domaine par défaut, vous devez choisir un autre domaine (ou ajoutez en un nouveau) et le définir comme le domaine par défaut pour pouvoir supprimer celui-ci.", + "domain_add_dyndns_forbidden": "Vous avez déjà souscrit à un domaine DynDNS, vous pouvez demander la suppression de votre domaine DynDNS actuel sur le forum dans le fil de discussion dédié.", + "disabled": "Désactivé", + "dead": "Inactif", + "day_validity": " Expiré | 1 jour | {count} jours", + "confirm_app_install": "Êtes-vous sûr de vouloir installer cette application ?", + "common": { + "lastname": "Nom de famille", + "firstname": "Prénom" + }, + "code": "Code", + "cancel": "Annulation", + "app_show_categories": "Afficher les catégories", + "app_config_panel_no_panel": "Cette application n'a pas de configuration de disponible", + "app_config_panel_label": "Configurez cette application", + "app_config_panel": "Panneau de configuration", + "app_choose_category": "Choisissez une catégorie", + "app_actions_label": "Exécuter les actions", + "app_actions": "Actions", + "api_waiting": "Attente de la réponse du serveur ...", + "api_errors_titles": { + "APIConnexionError": "Yunohost a rencontré une erreur de connexion", + "APINotRespondingError": "L'API Yunohost ne répond pas", + "APIInternalError": "Yunohost a rencontré une erreur interne", + "APIBadRequestError": "Yunohost a rencontré une erreur", + "APIError": "Yunohost a rencontré une erreur inattendue" + }, + "api_error": { + "sorry": "Vraiment désolé de cela.", + "info": "Les informations suivantes peuvent être utiles à la personne qui vous aide :", + "help": "Vous devez chercher de l'aide sur le forum ou le chat pour corriger la situation, ou signaler le bug sur le bugtracker." + }, + "address": { + "local_part_description": { + "email": "Choisissez une section locale pour votre courriel.", + "domain": "Choisissez un sous-domaine." + }, + "domain_description": { + "email": "Choisissez un domaine pour votre courrier électronique.", + "domain": "Choisissez un domaine." + } + } } From a6ac39b6b56ffe9222574b1f14e6fffe02d415fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Kroul=C3=ADk?= Date: Sat, 23 Jan 2021 20:51:55 +0000 Subject: [PATCH 06/37] Translated using Weblate (Czech) Currently translated at 3.2% (13 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/cs/ --- app/src/i18n/locales/cs.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/i18n/locales/cs.json b/app/src/i18n/locales/cs.json index 748b546e..fc827797 100644 --- a/app/src/i18n/locales/cs.json +++ b/app/src/i18n/locales/cs.json @@ -9,5 +9,7 @@ "administration_password": "Heslo administrátora", "add": "Přidat", "active": "Aktivní", - "action": "Akce" + "action": "Akce", + "cancel": "Storno", + "ok": "OK" } From 3b54c31cde172b957f1810ae4061e4863c068f62 Mon Sep 17 00:00:00 2001 From: Christian Wehrli Date: Mon, 25 Jan 2021 19:17:08 +0000 Subject: [PATCH 07/37] Translated using Weblate (German) Currently translated at 100.0% (401 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/ --- app/src/i18n/locales/de.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/i18n/locales/de.json b/app/src/i18n/locales/de.json index c178ea5b..885f59f3 100644 --- a/app/src/i18n/locales/de.json +++ b/app/src/i18n/locales/de.json @@ -351,7 +351,8 @@ "cache_description": "Deaktivieren Sie den Cache, wenn Sie mit der CLI arbeiten möchten, während Sie gleichzeitig in diesem Webadministrator navigieren.", "cache": "Zwischenspeicher", "fallback_language_description": "Sprache, die verwendet wird, falls die Übersetzung nicht in der Hauptsprache verfügbar ist.", - "language": "Sprache" + "language": "Sprache", + "fallback_language": "Fallback Sprache" }, "tools_power_up": "Ihr Server scheint zugänglich zu sein. Sie können jetzt versuchen, sich anzumelden.", "search": { From 77f25deaf9a85802900b20a883d974ba7a0b8ad5 Mon Sep 17 00:00:00 2001 From: Mathieu Massaviol Date: Thu, 28 Jan 2021 09:45:55 +0000 Subject: [PATCH 08/37] Translated using Weblate (French) Currently translated at 99.5% (399 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/fr/ --- app/src/i18n/locales/fr.json | 58 ++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/app/src/i18n/locales/fr.json b/app/src/i18n/locales/fr.json index 99cf2e97..5eb75755 100644 --- a/app/src/i18n/locales/fr.json +++ b/app/src/i18n/locales/fr.json @@ -26,7 +26,7 @@ "confirm_change_maindomain": "Voulez-vous vraiment changer le domaine principal ?", "confirm_delete": "Voulez-vous vraiment supprimer {name} ?", "confirm_install_custom_app": "ATTENTION ! L’installation d’applications tierces peut compromettre l’intégrité et la sécurité de votre système. Vous ne devriez probablement PAS l’installer si vous ne savez pas ce que vous faites. Prenez-vous ce risque ?", - "confirm_install_domain_root": "Vous ne pourrez pas installer d'autres applications sur {domain}. Continuer ?", + "confirm_install_domain_root": "Êtes-vous sûr de vouloir installer cette application sur '/' ? Vous ne pourrez installer aucune autre application sur {domain}", "confirm_postinstall": "Vous êtes sur le point de lancer le processus de post-installation sur le domaine {domain}. Cela peut prendre du temps, *n'interrompez pas l'opération avant la fin*.", "confirm_restore": "Voulez-vous vraiment restaurer {name} ?", "confirm_uninstall": "Voulez-vous vraiment désinstaller {name} ?", @@ -87,7 +87,7 @@ "local_archives": "Archives locales", "login": "Connexion", "logout": "Déconnexion", - "mailbox_quota_description": "Par exemple, 700M est un CD, 4700M est un DVD.", + "mailbox_quota_description": "Définissez une taille limite de stockage pour vos courriels.
Mettre 0 pour la désactiver.", "mailbox_quota_placeholder": "Laissez vide ou à zéro pour désactiver.", "manage_apps": "Gérer les applications", "manage_domains": "Gérer les domaines", @@ -155,8 +155,8 @@ "yes": "Oui", "form_input_example": "Exemple : {example}", "footer_version": "Propulsé par YunoHost {version} ({repo}).", - "certificate_alert_not_valid": "CRITIQUE : le certificat actuel n’est pas valide ! Le HTTPS ne fonctionnera pas du tout !", - "certificate_alert_selfsigned": "AVERTISSEMENT : le certificat actuel est auto-signé. Les navigateurs afficheront un avertissement effrayant pour les nouveaux visiteurs !", + "certificate_alert_not_valid": "CRITIQUE : Le certificat actuel est invalide ! HTTPS ne fonctionnera pas du tout !", + "certificate_alert_selfsigned": "AVERTISSEMENT : Le certificat actuel est auto-signé. Les navigateurs afficheront un avertissement effrayant pour les nouveaux visiteurs !", "certificate_alert_letsencrypt_about_to_expire": "Le certificat actuel est sur le point d’expirer. Il devrait bientôt être renouvelé automatiquement.", "certificate_alert_about_to_expire": "AVERTISSEMENT : le certificat actuel est sur le point d’expirer ! Il ne sera PAS renouvelé automatiquement !", "certificate_alert_good": "Bien, le certificat actuel a l’air correct !", @@ -199,7 +199,7 @@ "tools_reboot": "Redémarrer votre serveur", "tools_reboot_btn": "Redémarrer", "tools_reboot_done": "Redémarrage…", - "tools_rebooting": "Votre serveur redémarre. Pour retourner sur l’interface d'administration vous devez attendre que votre serveur soit démarré. Vous pouvez le vérifier en actualisant cette page (F5).", + "tools_rebooting": "Votre serveur redémarre. Pour retourner sur l’interface d'administration vous devez attendre que votre serveur soit démarré. Vous pouvez attendre que le formulaire de connexion apparaisse ou vous pouvez actualiser cette page (F5).", "tools_shutdown": "Éteindre votre serveur", "tools_shutdown_btn": "Éteindre", "tools_shutdown_done": "Extinction…", @@ -220,7 +220,7 @@ "app_no_actions": "Cette application ne possède aucune action", "confirm_install_app_lowquality": "Avertissement : cette application peut fonctionner mais n’est pas bien intégrée dans YunoHost. Certaines fonctionnalités telles que l’authentification unique et la sauvegarde/restauration pourraient ne pas être disponibles.", "confirm_install_app_inprogress": "AVERTISSEMENT ! Cette application est encore expérimentale et risque de casser votre système ! Vous ne devriez probablement PAS l’installer si vous ne savez pas ce que vous faites. Voulez-vous vraiment prendre ce risque ?", - "error_connection_interrupted": "Le serveur a fermé la connexion au lieu d’y répondre. Est-ce que NGINX ou l'API YunoHost aurait été redémarré ou arrêté ?", + "error_connection_interrupted": "Le serveur a fermé la connexion au lieu d’y répondre. Est-ce que nginx ou yunohost-api ont été redémarrés ou arrêtés pour une raison quelconque?", "experimental_warning": "Attention : cette fonctionnalité est expérimentale et ne doit pas être considérée comme stable, vous ne devriez pas l’utiliser à moins que vous ne sachiez ce que vous faites...", "good_practices_about_admin_password": "Vous êtes maintenant sur le point de définir un nouveau mot de passe administrateur. Le mot de passe doit comporter au moins 8 caractères — bien qu’il soit recommandé d’utiliser un mot de passe plus long (c’est-à-dire une phrase secrète) et/ou d’utiliser différents types de caractères (majuscules, minuscules, chiffres et caractères spéciaux).", "good_practices_about_user_password": "Vous êtes maintenant sur le point de définir un nouveau mot de passe pour l'utilisateur. Le mot de passe doit comporter au moins 8 caractères - bien qu’il soit recommandé d’utiliser un mot de passe plus long (c’est-à-dire une phrase secrète) et/ou d’utiliser différents types de caractères tels que : majuscules, minuscules, chiffres et caractères spéciaux.", @@ -239,10 +239,10 @@ "logs_started_at": "Début", "logs_path": "Chemin", "logs_context": "Contexte", - "logs_share_with_yunopaste": "Partager avec YunoPaste", + "logs_share_with_yunopaste": "Partager les logs avec YunoPaste", "logs_more": "Afficher plus de lignes", "unmaintained": "Non maintenue", - "purge_user_data_checkbox": "Purger les données de l'utilisateur %s ? (Cela supprimera le contenu du dossier personnel de %s ainsi que tous les courriers électroniques de %s .)", + "purge_user_data_checkbox": "Purger les données de {name}? (Cela supprimera toutes les données de son répertoire ainsi que ses courriels)", "purge_user_data_warning": "La purge des données de l’utilisateur n’est pas réversible. Assurez-vous de savoir ce que vous faites !", "version": "Version", "confirm_update_system": "Voulez-vous vraiment mettre à jour tous les paquets système ?", @@ -263,7 +263,7 @@ "group": "Groupe", "group_all_users": "Tous les utilisateurs", "group_visitors": "Visiteurs", - "group_format_name_help": "Vous pouvez utiliser des caractères alphanumériques et des espaces", + "group_format_name_help": "Vous pouvez utiliser des caractères alphanumériques et des tirets bas", "group_add_member": "Ajouter un utilisateur", "group_add_permission": "Ajouter une permission", "group_new": "Nouveau groupe", @@ -305,14 +305,14 @@ "pending_migrations": "Il y a des migrations en suspens qui attentent d'être exécutées. Veuillez aller dans Outils > Migrations pour les exécuter.", "tip_about_user_email": "Les utilisateurs sont créés avec une adresse e-mail associée (et un compte XMPP) au format username@domain.tld. Des alias d'email et des transferts d'emails supplémentaires peuvent être ajoutés ultérieurement par l'administrateur et l'utilisateur.", "logs_suboperations": "Sous-opérations", - "permission_show_tile_enabled": "Montrer la tuile dans le portail utilisateur", + "permission_show_tile_enabled": "Visible en tuile dans le portail utilisateur", "permission_main": "Permission principale", "permission_corresponding_url": "URL correspondante", "app_manage_label_and_tiles": "Gérer les étiquettes et les tuiles", "user_emailforward_add": "Ajouter une adresse mail de redirection", - "user_emailaliases_add": "Ajouter un alias de courrier électronique (mail)", + "user_emailaliases_add": "Ajouter un alias de courriel", "unknown": "Inconnu", - "traceback": "Traçage/Traçabilité", + "traceback": "Trace", "tools_webadmin_settings": "Paramètres de l'administration web", "tools_webadmin": { "transitions": "Animations de transition entre les pages", @@ -320,17 +320,17 @@ "experimental": "Mode expérimental", "cache_description": "Pensez à désactiver le cache si vous prévoyez de travailler avec l'interface en ligne de commande (CLI) tout en naviguant dans l'administration web (web-admin/panel web).", "cache": "Cache", - "fallback_language_description": "La langue qui sera utilisée au cas où la traduction ne serait pas disponible dans la langue principale.", + "fallback_language_description": "Langue qui sera utilisée au cas où la traduction ne serait pas disponible dans la langue principale.", "fallback_language": "Langue de secours", "language": "Langue" }, "tools_power_up": "Votre serveur semble être accessible, vous pouvez maintenant essayer de vous connecter.", "search": { "not_found": "Il y a des {items} qui correspondent à vos critères.", - "for": "Recherche de {items} ..." + "for": "Rechercher {items} ..." }, "readme": "Lisez-moi", - "postinstall_set_password": "Définir le mot de passe d'administration (de l'administrateur de l'instance YunoHost)", + "postinstall_set_password": "Définir le mot de passe d'administration", "postinstall_set_domain": "Définir le domaine principal", "placeholder": { "domain": "mon-domaine.fr", @@ -339,19 +339,19 @@ "firstname": "Jean", "username": "jeandupont" }, - "perform": "Exécute", + "perform": "Exécuter", "migrations_disclaimer_not_checked": "Cette migration nécessite que vous preniez connaissance de sa décharge de responsabilité avant de l'exécuter.", "migrations_disclaimer_check_message": "J'ai lu et compris cette décharge de responsabilité", "mailbox_quota_example": "700 M correspond à un CD, 4 700 M correspond à un DVD", "items_verbose_count": "Il y a {items}.", "items": { - "users": "aucun utilistauer | user | {c} users", + "users": "aucun utilisateur | utilisateur | {c} utilisateurs", "services": "aucun service | service | {c} services", "logs": "aucun historique/log | log | {c} logs", - "installed_apps": "aucune application installée | installed app | {c} installed apps", - "groups": "aucun groupe | group | {c} groups", - "domains": "aucun domaine | domain | {c} domains", - "backups": "aucune sauvegarde | backup | {c} backups", + "installed_apps": "aucune application installée | application installée | {c} applications installées", + "groups": "aucun groupe | groupe | {c} groupes", + "domains": "aucun domaine | domaine | {c} domaines", + "backups": "aucune sauvegarde | sauvegarde | {c} sauvegardes", "apps": "aucune application | app | {c} apps" }, "history": { @@ -371,14 +371,14 @@ "notInUsers": "L'utilisateur '{value}' existe déjà.", "minValue": "La valeur doit être un nombre égal ou supérieur à {min}.", "name": "Les noms ne peuvent pas comporter de caractères spéciaux, sauf ,.'-", - "githubLink": "L'adresse web (URL) doit être un lien Github valide vers un dépôt", - "emailForward": "Adresse de transfert de courrier électronique non valide : elle doit être alphanumérique et ne comporter que des caractères _.-+ (par exemple, someone+tag@example.com, s0me-1+tag@example.com)", - "email": "Adresse de courriel non valide : elle doit être alphanumérique et ne comporter que des caractères _.- (par exemple someone@example.com, s0me-1@example.com)", - "dynDomain": "Nom de domaine invalide : il doit être composé de minuscules alphanumériques et de tirets du 6 uniquement", - "domain": "Nom de domaine invalide : il doit être composé de minuscules alphanumériques, de points et de tirets du 6 uniquement", + "githubLink": "L'URL doit être un lien Github valide vers un dépôt", + "emailForward": "Adresse de transfert de courrier électronique invalide : elle doit être composée de caractères alphanumérique et de _.-+ seulement (par exemple, someone+tag@example.com, s0me-1+tag@example.com)", + "email": "Adresse de courriel invalide : elle doit être composée de caractères alphanumérique et des caractères _.- seulement (par exemple someone@example.com, s0me-1@example.com)", + "dynDomain": "Nom de domaine invalide : Il doit être composé de minuscules alphanumériques et de tirets uniquement", + "domain": "Nom de domaine invalide : Il doit être composé de minuscules alphanumériques, de points et de tirets uniquement", "between": "La valeur doit être comprise entre {min} et {max}.", "alpha": "La chaîne de caractères ne doit contenir que des lettres.", - "alphalownum_": "La chaîne de caractères doit être en minuscules alphanumériques et avec le tiret du 8 uniquement." + "alphalownum_": "La chaîne de caractères doit être composé uniquement de caractères alphanumériques minuscules et de tirets bas (aussi appelé tiret du 8 ou underscore)." }, "footer": { "donate": "Faire un don", @@ -399,9 +399,9 @@ "firstname": "Prénom" }, "code": "Code", - "cancel": "Annulation", + "cancel": "Annuler", "app_show_categories": "Afficher les catégories", - "app_config_panel_no_panel": "Cette application n'a pas de configuration de disponible", + "app_config_panel_no_panel": "Cette application n'a aucune configuration disponible", "app_config_panel_label": "Configurez cette application", "app_config_panel": "Panneau de configuration", "app_choose_category": "Choisissez une catégorie", From 03143318c14504d64a1f3941c6e43d0daf4ce039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Sat, 30 Jan 2021 15:50:35 +0000 Subject: [PATCH 09/37] Translated using Weblate (Occitan) Currently translated at 77.0% (309 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/oc/ --- app/src/i18n/locales/oc.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/i18n/locales/oc.json b/app/src/i18n/locales/oc.json index 44646572..f18ba4ec 100644 --- a/app/src/i18n/locales/oc.json +++ b/app/src/i18n/locales/oc.json @@ -307,5 +307,13 @@ "app_manage_label_and_tiles": "Gestion de las apelacions e títols", "permission_corresponding_url": "URL correspondenta", "permission_main": "Permission principala", - "permission_show_tile_enabled": "Afichar lo teule al portal utilizaire" + "permission_show_tile_enabled": "Afichar lo teule al portal utilizaire", + "address": { + "local_part_description": { + "domain": "Causissètz un jos-domeni." + }, + "domain_description": { + "domain": "Causissètz un domeni." + } + } } From 17913cef3204a55631cf82da936454971bd875e0 Mon Sep 17 00:00:00 2001 From: Yifei Ding Date: Sun, 31 Jan 2021 09:30:06 +0000 Subject: [PATCH 10/37] Translated using Weblate (Chinese (Simplified)) Currently translated at 32.1% (129 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/zh_Hans/ --- app/src/i18n/locales/zh_Hans.json | 117 +++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 2 deletions(-) diff --git a/app/src/i18n/locales/zh_Hans.json b/app/src/i18n/locales/zh_Hans.json index 66bd211f..07650c0d 100644 --- a/app/src/i18n/locales/zh_Hans.json +++ b/app/src/i18n/locales/zh_Hans.json @@ -26,9 +26,122 @@ "app_info_uninstall_desc": "删除此应用程序。", "app_info_default_desc": "重定向域根到这个应用({domain})。", "unignore": "取消忽略", - "last_ran": "最近一次运行:", + "last_ran": "上次运行:", "app_info_change_url_disabled_tooltip": "此应用尚未实现该功能", "archive_empty": "空存档", "app_state_lowquality": "低质量", - "app_state_inprogress": "暂不工作" + "app_state_inprogress": "暂不工作", + "ports": "端口", + "port": "端口", + "logs_more": "显示更多行", + "logs_path": "路径", + "logs_started_at": "开始", + "logs_ended_at": "结束", + "logs_error": "错误", + "logs_app": "应用日志", + "logs_service": "服务日志", + "logs": "日志", + "path": "路径", + "migrations_done": "上次迁移", + "migrations_pending": "待定迁移", + "migrations": "迁移", + "manage_users": "管理用户", + "manage_domains": "管理域", + "manage_apps": "管理应用", + "logout": "登出", + "login": "登录", + "local_archives": "本地档案", + "license": "许可", + "label": "标签", + "ipv6": "IPv6", + "ipv4": "IPv4", + "installed": "已安装", + "installation_complete": "安装完成", + "install_time": "安装时间", + "install_name": "安装{id}", + "install": "安装", + "infos": "信息", + "ignore": "忽略", + "id": "ID", + "hook_data_mail": "邮件", + "hook_data_home": "用户密码", + "hook_conf_ynh_mysql": "MySQL密码", + "hook_conf_ynh_firewall": "防火墙", + "hook_conf_nginx": "Nginx", + "hook_conf_ssh": "SSH", + "hook_conf_ssowat": "SSOwat", + "hook_conf_xmpp": "XMPP", + "hook_conf_ynh_certs": "SSL证书", + "hook_conf_ldap": "LDAP数据库", + "hook_conf_ynh_currenthost": "当前主域", + "hook_conf_cron": "自动化任务", + "hook_adminjs_group_configuration": "系统配置", + "home": "家", + "history": { + "methods": { + "DELETE": "删除", + "PUT": "修改", + "POST": "创建/执行" + }, + "title": "历史" + }, + "permissions": "权限", + "group_new": "新群组", + "group_add_member": "添加一个用户", + "group_visitors": "访客", + "group_all_users": "所有用户", + "form_errors": { + "passwordLenght": "密码至少需要是8个字符长。" + }, + "footer": { + "donate": "赞助", + "help": "需要帮助?", + "documentation": "文档" + }, + "firewall": "防火墙", + "experimental": "实验性", + "error_server_unexpected": "未知服务器错误", + "error": "错误", + "enabled": "已启用", + "enable": "启用", + "download": "下载", + "domains": "域", + "domain_visit_url": "访问 {url}", + "domain_visit": "访问", + "domain_name": "域名", + "domain_dns_longdesc": "显示DNS配置", + "domain_dns_config": "DNS配置", + "domain_delete_longdesc": "删除这个域", + "domain_add_panel_without_domain": "我没有一个域名……", + "domain_default_longdesc": "这是你的默认域。", + "domain_add": "添加域", + "dns": "DNS", + "disabled": "已禁用", + "disable": "禁用", + "run_first_diagnosis": "运行初始诊断", + "diagnosis": "诊断", + "details": "详情", + "description": "介绍", + "delete": "删除", + "dead": "不活跃", + "custom_app_install": "安装自定义应用", + "connection": "连接", + "confirm_app_change_url": "你确定你希望修改这个应用的访问URL?", + "common": { + "lastname": "姓", + "firstname": "名" + }, + "api_waiting": "正在等待服务器响应……", + "app_actions_label": "执行动作", + "app_actions": "动作", + "address": { + "domain_description": { + "email": "为你的邮箱选择一个网域。", + "domain": "选择一个网域。" + }, + "local_part_description": { + "domain": "选择一个子网域。" + } + }, + "cancel": "取消" } From a7c99c68626ebaf70cb2f957349fd95678ca6463 Mon Sep 17 00:00:00 2001 From: Christian Wehrli Date: Tue, 2 Feb 2021 10:38:36 +0000 Subject: [PATCH 11/37] Translated using Weblate (German) Currently translated at 100.0% (401 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/de/ --- app/src/i18n/locales/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/i18n/locales/de.json b/app/src/i18n/locales/de.json index 885f59f3..03b3a281 100644 --- a/app/src/i18n/locales/de.json +++ b/app/src/i18n/locales/de.json @@ -60,7 +60,7 @@ "hook_data_home": "Benutzerdaten", "hook_data_home_desc": "Die Daten des Benutzers werden gespeichert unter /home/USER", "hook_data_mail": "E-Mail", - "hook_data_mail_desc": "Roth-E-Mails auf dem Server gespeichert", + "hook_data_mail_desc": "Rohdaten-E-Mails auf dem Server gespeichert", "id": "ID", "infos": "Informationen", "install": "Installieren", From 2c0267bd250cf125b985183f035ac23ada86bb01 Mon Sep 17 00:00:00 2001 From: xaloc33 Date: Mon, 8 Feb 2021 19:28:49 +0000 Subject: [PATCH 12/37] Translated using Weblate (Catalan) Currently translated at 90.7% (364 of 401 strings) Translation: YunoHost/admin Translate-URL: https://translate.yunohost.org/projects/yunohost/admin/ca/ --- app/src/i18n/locales/ca.json | 81 +++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/app/src/i18n/locales/ca.json b/app/src/i18n/locales/ca.json index 79d6f0c6..fcdee420 100644 --- a/app/src/i18n/locales/ca.json +++ b/app/src/i18n/locales/ca.json @@ -307,5 +307,84 @@ "permission_show_tile_enabled": "Mostrar la «tile» en el portal de l'usuari", "permission_main": "Permís principal", "permission_corresponding_url": "URL corresponent", - "app_manage_label_and_tiles": "Gestionar etiquetes i «tiles»" + "app_manage_label_and_tiles": "Gestionar etiquetes i «tiles»", + "items": { + "backups": "cap còpia de seguretat | còpia de seguretat | {c} còpies de seguretat", + "apps": "cap aplicació | app | {c} aplicacions" + }, + "history": { + "methods": { + "DELETE": "eliminar", + "PUT": "modificar", + "POST": "crear/executar" + }, + "last_action": "Última acció:", + "title": "Historial" + }, + "form_errors": { + "required": "Aquest camp és obligatori.", + "passwordMatch": "Les contrasenyes no són iguals.", + "passwordLenght": "La contrasenya ha de tenir 8 caràcters com a mínim.", + "number": "El valor ha de ser un nombre.", + "notInUsers": "L'usuari «{value}» ja existeix.", + "minValue": "El valor ha de ser un nombre superior o igual a {min}.", + "name": "Els noms no poden incloure caràcters especials ha excepció de ,.'-", + "githubLink": "L'URL ha de ser un enllaç vàlid a un repositori Github", + "email": "Correu electrònic no vàlid: ha de ser caràcters alfanumèrics i _. exclusivament (per exemple someone@example.com, s0me-1@example.com)", + "dynDomain": "Nom de domini no vàlid: Ha de contenir caràcters alfanumèrics en minúscules i guionets exclusivament", + "domain": "Nom de domini no vàlid: Ha de contenir caràcters alfanumèrics en minúscules, punts i guionets exclusivament", + "between": "El valor ha d'estar entre {min} i {max}.", + "alphalownum_": "Només pot contenir caràcters alfanumèrics en minúscules i la barra baixa.", + "alpha": "Només pot contenir caràcters alfanumèrics." + }, + "footer": { + "donate": "Fer una donació", + "help": "Necessiteu ajuda?", + "documentation": "Documentació" + }, + "experimental": "Experimental", + "error": "Error", + "enabled": "Activat", + "domain_delete_forbidden_desc": "No podeu eliminar «{domain}» ja que és el domini principal, heu d'escollir un altre domini (o afegir-ne un de nou) i fer-lo el domini principal per a poder eliminar aquest.", + "domain_add_dyndns_forbidden": "Ja us heu subscrit a un domini DynDNS, podeu demanar que eliminin el domini DynDNS actual al fòrum en el fil dedicat.", + "disabled": "Desactivat", + "dead": "Inactiu", + "day_validity": " Expirat | 1 dia | {count} dies", + "confirm_app_install": "Esteu segurs de voler instal·lar aquesta aplicació?", + "common": { + "lastname": "Cognom", + "firstname": "Nom" + }, + "code": "Codi", + "cancel": "Cancel·lar", + "app_show_categories": "Mostrar les categories", + "app_config_panel_no_panel": "Aquesta aplicació no té cap configuració diponible", + "app_config_panel_label": "Configurar aquesta aplicació", + "app_config_panel": "Panell de configuració", + "app_choose_category": "Escolliu una categoria", + "app_actions_label": "Executar les accions", + "app_actions": "Accions", + "api_waiting": "Esperant la resposta del servidor…", + "api_errors_titles": { + "APIConnexionError": "YunoHost ha tingut un error de connexió", + "APINotRespondingError": "L'API de YunoHost no respon", + "APIInternalError": "YunoHost ha trobat un error intern", + "APIBadRequestError": "YunoHost ha trobat un error", + "APIError": "YunoHost ha trobat un error inesperat" + }, + "api_error": { + "sorry": "Ens sap molt greu això.", + "info": "La informació següent pot ser útil per a la persona que us ajudi:", + "help": "Podeu buscar ajuda al fòrum o al chat per arreglar la situació, o reportar l'error al bugtracker." + }, + "address": { + "local_part_description": { + "email": "Escolliu una part local per al vostre correu electrònic.", + "domain": "Escolliu un subdomini." + }, + "domain_description": { + "email": "Escolliu un domini per al correu electrònic.", + "domain": "Escolliu un domini." + } + } } From bdde8b39c0b4e496f5031980a47d387273a56d22 Mon Sep 17 00:00:00 2001 From: axolotle Date: Thu, 11 Feb 2021 15:22:42 +0100 Subject: [PATCH 13/37] Rework error handling allow full control of error handling with global fallback handler add 404 error add websocket opening control for get methods --- app/src/api/api.js | 19 +++-- app/src/api/errors.js | 108 +++++++++++++++----------- app/src/api/handlers.js | 72 ++++++++++------- app/src/api/index.js | 2 +- app/src/components/ApiWaitOverlay.vue | 10 ++- app/src/i18n/locales/en.json | 9 ++- app/src/main.js | 10 +++ app/src/store/info.js | 26 ++++--- app/src/views/ErrorPage.vue | 2 +- 9 files changed, 162 insertions(+), 96 deletions(-) diff --git a/app/src/api/api.js b/app/src/api/api.js index 90aada73..3c40d1f9 100644 --- a/app/src/api/api.js +++ b/app/src/api/api.js @@ -51,20 +51,23 @@ export default { * * @param {string} method - a method between 'GET', 'POST', 'PUT' and 'DELETE'. * @param {string} uri - * @param {string} [data={}] - data to send as body for 'POST', 'PUT' and 'DELETE' methods. + * @param {Object} [data={}] - data to send as body for 'POST', 'PUT' and 'DELETE' methods. + * @param {Object} [options={}] + * @param {Boolean} [options.websocket=true] - Open a websocket before this request. * @return {Promise} Promise that resolve a fetch `Response`. */ - async fetch (method, uri, data = {}) { + async fetch (method, uri, data = {}, { websocket = true } = {}) { // Open a websocket connection that will dispatch messages received. - // FIXME add ability to do not open it - await this.openWebSocket() + if (websocket) { + await this.openWebSocket() + store.dispatch('WAITING_FOR_RESPONSE', [uri, method]) + } if (method === 'GET') { const localeQs = `${uri.includes('?') ? '&' : '?'}locale=${store.getters.locale}` return fetch('/yunohost/api/' + uri + localeQs, this.options) } - store.dispatch('WAITING_FOR_RESPONSE', [uri, method]) return fetch('/yunohost/api/' + uri, { ...this.options, method, @@ -76,10 +79,12 @@ export default { * Api get helper function. * * @param {string} uri - the uri to call. + * @param {Object} [options={}] + * @param {Boolean} [options.websocket=false] - Open a websocket before this request. * @return {Promise} Promise that resolve the api response as an object, a string or as an error. */ - get (uri) { - return this.fetch('GET', uri).then(response => handleResponse(response, 'GET')) + get (uri, { websocket = false } = {}) { + return this.fetch('GET', uri, null, { websocket }).then(response => handleResponse(response, 'GET')) }, /** diff --git a/app/src/api/errors.js b/app/src/api/errors.js index 7763015f..28f061cf 100644 --- a/app/src/api/errors.js +++ b/app/src/api/errors.js @@ -5,82 +5,100 @@ import i18n from '@/i18n' + class APIError extends Error { - constructor (method, { url, status, statusText }, message) { - super(message || i18n.t('error_server_unexpected')) - this.uri = new URL(url).pathname.replace('/yunohost', '') - this.method = method + constructor (method, { url, status, statusText }, errorData) { + super(errorData.error || i18n.t('error_server_unexpected')) + const urlObj = new URL(url) + this.name = 'APIError' this.code = status this.status = statusText - this.name = 'APIError' + this.method = method + this.path = urlObj.pathname + urlObj.search + this.logRef = errorData.log_ref || null } - print () { + log () { console.error(`${this.name} (${this.code}): ${this.uri}\n${this.message}`) } } -// 401 — Unauthorized -class APIUnauthorizedError extends APIError { - constructor (method, response, message) { - super(method, response, i18n.t('unauthorized')) - this.name = 'APIUnauthorizedError' - } -} - -// 400 — Bad Request -class APIBadRequestError extends APIError { - constructor (method, response, message) { - super(method, response, message) - this.name = 'APIBadRequestError' - } -} - -// 500 — Server Internal Error -class APIInternalError extends APIError { - constructor (method, response, data) { - // not tested (message should be json but in ) - const traceback = typeof data === 'object' ? data.traceback : null - super(method, response, 'none') - if (traceback) { - this.traceback = traceback - } - this.name = 'APIInternalError' - } -} - -// 502 — Bad gateway (means API is down) -class APINotRespondingError extends APIError { - constructor (method, response) { - super(method, response, i18n.t('api_not_responding')) - this.name = 'APINotRespondingError' - } -} // 0 — (means "the connexion has been closed" apparently) class APIConnexionError extends APIError { constructor (method, response) { - super(method, response, i18n.t('error_connection_interrupted')) + super(method, response, { error: i18n.t('error_connection_interrupted') }) this.name = 'APIConnexionError' } } + +// 400 — Bad Request +class APIBadRequestError extends APIError { + constructor (method, response, errorData) { + super(method, response, errorData) + this.name = 'APIBadRequestError' + } +} + + +// 401 — Unauthorized +class APIUnauthorizedError extends APIError { + constructor (method, response, errorData) { + super(method, response, { error: i18n.t('unauthorized') }) + this.name = 'APIUnauthorizedError' + } +} + + +// 404 — Not Found +class APINotFoundError extends APIError { + constructor (method, response, errorData) { + errorData.error = i18n.t('api_not_found') + super(method, response, errorData) + this.name = 'APINotFoundError' + } +} + + +// 500 — Server Internal Error +class APIInternalError extends APIError { + constructor (method, response, errorData) { + super(method, response, errorData) + this.traceback = errorData.traceback || null + this.name = 'APIInternalError' + } +} + + +// 502 — Bad gateway (means API is down) +class APINotRespondingError extends APIError { + constructor (method, response) { + super(method, response, { error: i18n.t('api_not_responding') }) + this.name = 'APINotRespondingError' + } +} + + // Temp factory const errors = { [undefined]: APIError, 0: APIConnexionError, 400: APIBadRequestError, 401: APIUnauthorizedError, + 404: APINotFoundError, 500: APIInternalError, 502: APINotRespondingError } + export { errors as default, APIError, - APIUnauthorizedError, APIBadRequestError, + APIConnexionError, APIInternalError, + APINotFoundError, APINotRespondingError, - APIConnexionError + APIUnauthorizedError } diff --git a/app/src/api/handlers.js b/app/src/api/handlers.js index 8efe146a..bad9c258 100644 --- a/app/src/api/handlers.js +++ b/app/src/api/handlers.js @@ -4,8 +4,8 @@ */ import store from '@/store' -import errors from './errors' -import router from '@/router' +import errors, { APIError } from './errors' + /** * Try to get response content as json and if it's not as text. @@ -13,8 +13,7 @@ import router from '@/router' * @param {Response} response - A fetch `Response` object. * @return {(Object|String)} Parsed response's json or response's text. */ - -async function _getResponseContent (response) { +async function _getResponseData (response) { // FIXME the api should always return json as response const responseText = await response.text() try { @@ -24,43 +23,64 @@ async function _getResponseContent (response) { } } + /** * Handler for API responses. * * @param {Response} response - A fetch `Response` object. * @return {(Object|String)} Parsed response's json, response's text or an error. */ -export function handleResponse (response, method) { - if (method !== 'GET') { - store.dispatch('SERVER_RESPONDED', response.ok) - } - if (!response.ok) return handleError(response, method) - // FIXME the api should always return json objects - return _getResponseContent(response) +export async function handleResponse (response, method) { + const responseData = await _getResponseData(response) + store.dispatch('SERVER_RESPONDED') + return response.ok ? responseData : handleError(response, responseData, method) } + /** * Handler for API errors. * * @param {Response} response - A fetch `Response` object. * @throws Will throw a custom error with response data. */ -export async function handleError (response, method) { - const message = await _getResponseContent(response) +export async function handleError (response, errorData, method) { const errorCode = response.status in errors ? response.status : undefined - const error = new errors[errorCode](method, response, message.error || message) - - if (error.code === 401) { - store.dispatch('DISCONNECT') - } else if (error.code === 400) { - if (typeof message !== 'string' && 'log_ref' in message) { - router.push({ name: 'tool-log', params: { name: message.log_ref } }) - } - // Hide the waiting screen - store.dispatch('SERVER_RESPONDED', true) - } else { - store.dispatch('DISPATCH_ERROR', error) + // FIXME API: Patching errors that are plain text or html. + if (typeof errorData === 'string') { + errorData = { error: errorData } } - throw error + // This error can be catched by a view otherwise it will be catched by the `onUnhandledAPIError` handler. + throw new errors[errorCode](method, response, errorData) +} + + +export function onUnhandledAPIError (error) { + // In 'development', Babel seems to also catch the error so there's no need to log it twice. + if (process.env.NODE_ENV !== 'development') { + error.log() + } + store.dispatch('HANDLE_ERROR', error) +} + + +export function registerGlobalErrorHandlers () { + // Global catching of unhandled promise's rejections. + // Those errors (thrown or rejected from inside a promise) can't be catched by `window.onerror`. + window.addEventListener('unhandledrejection', e => { + const error = e.reason + if (error instanceof APIError) { + onUnhandledAPIError(error) + // Seems like there's a bug in Firefox and the error logging in not prevented. + e.preventDefault() + } + }) + + // Keeping this in case it is needed. + + // Global catching of errors occuring inside vue components. + // Vue.config.errorHandler = (err, vm, info) => {} + + // Global catching of regular js errors. + // window.onerror = (message, source, lineno, colno, error) => {} } diff --git a/app/src/api/index.js b/app/src/api/index.js index 80f2a2f4..3e4bc332 100644 --- a/app/src/api/index.js +++ b/app/src/api/index.js @@ -1,2 +1,2 @@ export { default } from './api' -export { handleResponse, handleError } from './handlers' +export { handleResponse, handleError, registerGlobalErrorHandlers } from './handlers' diff --git a/app/src/components/ApiWaitOverlay.vue b/app/src/components/ApiWaitOverlay.vue index be7b6eb6..9cf749c3 100644 --- a/app/src/components/ApiWaitOverlay.vue +++ b/app/src/components/ApiWaitOverlay.vue @@ -2,13 +2,13 @@ @@ -48,6 +48,10 @@ export default { computed: { ...mapGetters(['waiting', 'lastAction', 'error', 'spinner']), + show () { + return this.waiting || this.error !== null + }, + progress () { if (!this.lastAction) return null const progress = this.lastAction.progress diff --git a/app/src/i18n/locales/en.json b/app/src/i18n/locales/en.json index 36f4efce..1f9bf178 100644 --- a/app/src/i18n/locales/en.json +++ b/app/src/i18n/locales/en.json @@ -22,10 +22,12 @@ "APIError": "Yunohost encountered an unexpected error", "APIBadRequestError": "Yunohost encountered an error", "APIInternalError": "Yunohost encountered an internal error", + "APINotFoundError": "Yunohost API could not find a route", "APINotRespondingError": "Yunohost API is not responding", - "APIConnexionError": "Yunohost encountered an connexion error" + "APIConnexionError": "Yunohost encountered a connexion error" }, "all_apps": "All apps", + "api_not_found": "Seems like the web-admin tryed to query something that doesn't exist.", "api_not_responding": "The YunoHost API is not responding. Maybe 'yunohost-api' is down or got restarted?", "api_waiting": "Waiting for the server's response...", "app_actions": "Actions", @@ -189,9 +191,10 @@ "title": "History", "last_action": "Last action:", "methods": { + "DELETE": "delete", + "GET": "read", "POST": "create/execute", - "PUT": "modify", - "DELETE": "delete" + "PUT": "modify" } }, "home": "Home", diff --git a/app/src/main.js b/app/src/main.js index 8328d90e..24cd8b6e 100644 --- a/app/src/main.js +++ b/app/src/main.js @@ -6,8 +6,12 @@ import i18n from './i18n' import router from './router' import store from './store' +import { registerGlobalErrorHandlers } from './api' + + Vue.config.productionTip = false + // Styles are imported in `src/App.vue` From 1944c7cc2f31b4144f6e77a7e988db847497ce78 Mon Sep 17 00:00:00 2001 From: axolotle Date: Mon, 15 Feb 2021 15:18:40 +0100 Subject: [PATCH 18/37] add QueryHeader component to display api query infos --- app/src/components/QueryHeader.vue | 125 +++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 app/src/components/QueryHeader.vue diff --git a/app/src/components/QueryHeader.vue b/app/src/components/QueryHeader.vue new file mode 100644 index 00000000..0cf6b831 --- /dev/null +++ b/app/src/components/QueryHeader.vue @@ -0,0 +1,125 @@ + + + + + From 56a3b29f65cc4fb9954db5aeda2614c01c918aa8 Mon Sep 17 00:00:00 2001 From: axolotle Date: Mon, 15 Feb 2021 15:21:26 +0100 Subject: [PATCH 19/37] add status prop to store's history entries --- app/src/api/handlers.js | 2 +- app/src/store/info.js | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/src/api/handlers.js b/app/src/api/handlers.js index bad9c258..c8a48d3d 100644 --- a/app/src/api/handlers.js +++ b/app/src/api/handlers.js @@ -32,7 +32,7 @@ async function _getResponseData (response) { */ export async function handleResponse (response, method) { const responseData = await _getResponseData(response) - store.dispatch('SERVER_RESPONDED') + store.dispatch('SERVER_RESPONDED', response.ok) return response.ok ? responseData : handleError(response, responseData, method) } diff --git a/app/src/store/info.js b/app/src/store/info.js index ac664773..5c19075c 100644 --- a/app/src/store/info.js +++ b/app/src/store/info.js @@ -28,7 +28,11 @@ export default { }, 'ADD_HISTORY_ENTRY' (state, [uri, method, date]) { - state.history.push({ uri, method, date, messages: [] }) + state.history.push({ uri, method, date, status: 'pending', messages: [] }) + }, + + 'UPDATE_LAST_HISTORY_ENTRY' (state, [key, value]) { + Vue.set(state.history[state.history.length - 1], key, value) }, 'ADD_MESSAGE' (state, message) { @@ -109,7 +113,15 @@ export default { commit('ADD_HISTORY_ENTRY', [uri, method, Date.now()]) }, - 'SERVER_RESPONDED' ({ commit }) { + 'SERVER_RESPONDED' ({ state, commit }, success) { + const action = state.history.length ? state.history[state.history.length - 1] : null + if (action) { + let status = success ? 'success' : 'error' + if (status === 'success' && action.messages.some(msg => msg.type === 'danger' || msg.type === 'warning')) { + status = 'warning' + } + commit('UPDATE_LAST_HISTORY_ENTRY', ['status', status]) + } commit('UPDATE_WAITING', false) }, From 957ca17b8410a60e6c1383fcbb06fd723867a15a Mon Sep 17 00:00:00 2001 From: axolotle Date: Mon, 15 Feb 2021 15:33:41 +0100 Subject: [PATCH 20/37] use new components in history, remove automatic toggling, adapt scrolling behavior --- app/src/views/_partials/HistoryConsole.vue | 285 +++++++++++---------- 1 file changed, 150 insertions(+), 135 deletions(-) diff --git a/app/src/views/_partials/HistoryConsole.vue b/app/src/views/_partials/HistoryConsole.vue index 32bc9161..546bf396 100644 --- a/app/src/views/_partials/HistoryConsole.vue +++ b/app/src/views/_partials/HistoryConsole.vue @@ -1,66 +1,82 @@ From 9c85c42b986a41a56b850d21a19d280cbddb5fc4 Mon Sep 17 00:00:00 2001 From: axolotle Date: Mon, 15 Feb 2021 15:37:34 +0100 Subject: [PATCH 21/37] rework Waiting/Error display and Overlay --- app/src/components/QueryHeader.vue | 2 +- app/src/views/_partials/ErrorDisplay.vue | 90 +++++++++++--- app/src/views/_partials/ViewLockOverlay.vue | 128 +++++--------------- app/src/views/_partials/WaitingDisplay.vue | 107 ++++++++++++++++ app/src/views/_partials/index.js | 3 + 5 files changed, 211 insertions(+), 119 deletions(-) create mode 100644 app/src/views/_partials/WaitingDisplay.vue diff --git a/app/src/components/QueryHeader.vue b/app/src/components/QueryHeader.vue index 0cf6b831..ce47c558 100644 --- a/app/src/components/QueryHeader.vue +++ b/app/src/components/QueryHeader.vue @@ -27,7 +27,7 @@ class="error-btn ml-auto py-0" variant="danger" > - View error + diff --git a/app/src/views/_partials/ErrorDisplay.vue b/app/src/views/_partials/ErrorDisplay.vue index 3fbea8ea..1eef7c25 100644 --- a/app/src/views/_partials/ErrorDisplay.vue +++ b/app/src/views/_partials/ErrorDisplay.vue @@ -1,38 +1,90 @@ + + diff --git a/app/src/views/_partials/ViewLockOverlay.vue b/app/src/views/_partials/ViewLockOverlay.vue index 3da3acfc..587db2de 100644 --- a/app/src/views/_partials/ViewLockOverlay.vue +++ b/app/src/views/_partials/ViewLockOverlay.vue @@ -1,38 +1,18 @@ - @@ -53,8 +54,13 @@ export default { ::v-deep { .card-body { padding: 1.5rem; + padding-bottom: 0; max-height: 60vh; overflow-y: auto; + + & > :last-child { + margin-bottom: 1.5rem; + } } .card-footer { diff --git a/app/src/views/_partials/WaitingDisplay.vue b/app/src/views/_partials/WaitingDisplay.vue index 986718da..e98e0edd 100644 --- a/app/src/views/_partials/WaitingDisplay.vue +++ b/app/src/views/_partials/WaitingDisplay.vue @@ -16,7 +16,7 @@
@@ -35,28 +35,28 @@ export default { }, props: { - action: { type: Object, required: true } + request: { type: Object, required: true } }, computed: { ...mapGetters(['spinner']), hasMessages () { - return this.action && this.action.messages.length > 0 + return this.request.messages && this.request.messages.length > 0 }, progress () { - const progress = this.action.progress + const progress = this.request.progress if (!progress) return null return { - values: progress, max: progress.reduce((sum, value) => (sum + value), 0) + values: progress, + max: progress.reduce((sum, value) => (sum + value), 0) } } } } - diff --git a/app/src/helpers/yunohostArguments.js b/app/src/helpers/yunohostArguments.js index fd9dc687..42bd3c53 100644 --- a/app/src/helpers/yunohostArguments.js +++ b/app/src/helpers/yunohostArguments.js @@ -88,7 +88,11 @@ export function formatYunoHostArgument (arg) { // Checkbox } else if (arg.type === 'boolean') { field.component = 'CheckboxItem' - value = arg.default || false + if (typeof arg.default === 'number') { + value = arg.default === 1 + } else { + value = arg.default || false + } // Special (store related) } else if (['user', 'domain'].includes(arg.type)) { field.component = 'SelectItem' @@ -106,8 +110,8 @@ export function formatYunoHostArgument (arg) { if (field.component !== 'CheckboxItem' && arg.optional !== true) { validation.required = validators.required } - // Default value - if (arg.default) { + // Default value if still `null` + if (value === null && arg.default) { value = arg.default } // Help message diff --git a/app/src/views/app/AppConfigPanel.vue b/app/src/views/app/AppConfigPanel.vue index e9a706cd..3edc1672 100644 --- a/app/src/views/app/AppConfigPanel.vue +++ b/app/src/views/app/AppConfigPanel.vue @@ -5,37 +5,26 @@ {{ $t('experimental_warning') }} - - - - -

{{ panel.name }} {{ panel.help }}

+ + -
- - {{ $t('words.collapse') }} - -
-
+
+ {{ section.name }} {{ section.help }} - - - {{ section.name }} {{ section.help }} - - - - - - - - - - - - + +
+ @@ -46,14 +35,18 @@