Merge branch 'dev' into migrate_to_bullseye

This commit is contained in:
Alexandre Aubin 2021-10-19 19:48:54 +02:00
commit b2ebcda6fb
18 changed files with 587 additions and 137 deletions

View file

@ -26,15 +26,7 @@ mypy:
script:
- tox -e py37-mypy
format-check:
stage: lint
image: "before-install"
allow_failure: true
needs: []
script:
- tox -e py37-black-check
format-run:
black:
stage: lint
image: "before-install"
needs: []
@ -49,9 +41,9 @@ format-run:
- git checkout -b "ci-format-${CI_COMMIT_REF_NAME}" --no-track
- tox -e py37-black-run
- '[ $(git diff | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit
- git commit -am "[CI] Format code" || true
- git commit -am "[CI] Format code with Black" || true
- git push -f origin "ci-format-${CI_COMMIT_REF_NAME}":"ci-format-${CI_COMMIT_REF_NAME}"
- hub pull-request -m "[CI] Format code" -b Yunohost:dev -p || true # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd
- hub pull-request -m "[CI] Format code with Black" -b Yunohost:dev -p || true # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd
only:
refs:
- dev

View file

@ -193,7 +193,7 @@ _ynh_app_config_validate() {
if [ -z ${!short_setting+x} ]; then
# Assign the var with the old value in order to allows multiple
# args validation
declare "$short_setting"="${old[$short_setting]}"
declare -g "$short_setting"="${old[$short_setting]}"
continue
fi
if [ ! -z "${file_hash[${short_setting}]}" ]; then

View file

@ -105,8 +105,16 @@ EOF
if ls -l /etc/yunohost/dyndns/K*.private 2>/dev/null; then
cat >$pending_dir/etc/cron.d/yunohost-dyndns <<EOF
SHELL=/bin/bash
*/10 * * * * root : YunoHost DynDNS update; sleep \$((RANDOM\\%60)); test -e /var/run/moulinette_yunohost.lock || yunohost dyndns update >> /dev/null
# Every 10 minutes,
# - (sleep random 60 is here to spread requests over a 1-min window)
# - if ip.yunohost.org answers ping (basic check to validate that we're connected to the internet and yunohost infra aint down)
# - and if lock ain't already taken by another command
# - trigger yunohost dyndns update
*/10 * * * * root : YunoHost DynDNS update; sleep \$((RANDOM\\%60)); ! ping -q -W5 -c1 ip.yunohost.org >/dev/null 2>&1 || test -e /var/run/moulinette_yunohost.lock || yunohost dyndns update >> /dev/null
EOF
else
# (Delete cron if no dyndns domain found)
touch $pending_dir/etc/cron.d/yunohost-dyndns
fi
# legacy stuff to avoid yunohost reporting etckeeper as manually modified

View file

@ -42,9 +42,13 @@ do_post_regen() {
systemctl daemon-reload
fi
systemctl disable avahi-daemon.socket --now 2>&1|| true
systemctl disable avahi-daemon --now 2>&1 || true
# Legacy stuff to enable the new yunomdns service on legacy systems
if [[ -e /etc/avahi/avahi-daemon.conf ]] && grep -q 'yunohost' /etc/avahi/avahi-daemon.conf; then
systemctl enable yunomdns
systemctl enable yunomdns --now
sleep 2
fi
[[ -z "$regen_conf_files" ]] \

41
debian/changelog vendored
View file

@ -1,3 +1,44 @@
yunohost (4.3.1.7) testing; urgency=low
- [fix] configpanel: Misc technical fixes ... (341059d0, 9c22329e)
- [i18n] Translations updated for Basque, French
Thanks to all contributors <3 ! (ljf, ppr, punkrockgirl)
-- Alexandre Aubin <alex.aubin@mailoo.org> Tue, 19 Oct 2021 15:30:50 +0200
yunohost (4.3.1.6) testing; urgency=low
- [fix] configpanel: Various technical fixes (07c1ddce, eae826b2, ff69067d)
- [i18n] Translations updated for Basque, Galician, German, Russian, Ukrainian
Thanks to all contributors <3 ! (Colin Wawrik, Daniel, José M, ljf, punkrockgirl, Semen Turchikhin, Tymofii-Lytvynenko)
-- Alexandre Aubin <alex.aubin@mailoo.org> Mon, 18 Oct 2021 18:50:00 +0200
yunohost (4.3.1.5) testing; urgency=low
- [enh] configpanel: Add hook mecanism between questions (9f7fb61b)
- [fix] configpanel: Issue with visible-if context missing between section
- [mod] Force-disable old avahi-daemon (af3d6dd7, 3a07a780)
Thanks to all contributors <3 ! (ljf)
-- Alexandre Aubin <alex.aubin@mailoo.org> Sun, 17 Oct 2021 20:44:33 +0200
yunohost (4.3.1.4) testing; urgency=low
- [mod] codequality: Safer, clearer ynh_secure_remove ([#1357](https://github.com/YunoHost/yunohost/pull/1357))
- [mod] codequality: Lint/autoformat helpers, hooks and debian scripts ([#1356](https://github.com/YunoHost/yunohost/pull/1356))
- [mod] helpers: Flag ynh_print_ON/OFF as internal to not advertise them in the doc (fe959bd7)
- [fix] helpers: Eval mecanism in ynh_exec_* lead to epic bugs ([#1358](https://github.com/YunoHost/yunohost/pull/1358))
- [enh] dyndns: validate that we're connected to the internet before triggering yunohost dyndns update (55bacd74)
- [enh] regenconf/dyndns: Delete dyndns cron in regenconf if no dyndns domain found (cb835a2d)
- [fix] regenconf/dovecot: add conf snippet to get rid of stupid stats-writer errors in mail.log (dab3dc6f)
- [enh] regenconf/dnsmasq: Don't generate dnsmasq conf for .local domains (df02f898)
-- Alexandre Aubin <alex.aubin@mailoo.org> Wed, 13 Oct 2021 15:41:21 +0200
yunohost (4.3.1.3) testing; urgency=low
- [fix] app: repo url branch names may contain dots (38cff4a9)

View file

@ -124,13 +124,13 @@
"upnp_disabled": "UPnP deaktiviert",
"upnp_enabled": "UPnP aktiviert",
"upnp_port_open_failed": "Port konnte nicht via UPnP geöffnet werden",
"user_created": "Benutzer erstellt",
"user_creation_failed": "Benutzer konnte nicht erstellt werden {user}: {error}",
"user_deleted": "Benutzer gelöscht",
"user_deletion_failed": "Benutzer konnte nicht gelöscht werden {user}: {error}",
"user_created": "Benutzer:in erstellt",
"user_creation_failed": "Benutzer:in konnte nicht erstellt werden {user}: {error}",
"user_deleted": "Benutzer:in gelöscht",
"user_deletion_failed": "Benutzer:in konnte nicht gelöscht werden {user}: {error}",
"user_home_creation_failed": "Persönlicher Ordner des Benutzers konnte nicht erstellt werden",
"user_unknown": "Unbekannter Benutzer: {user}",
"user_update_failed": "Benutzer konnte nicht aktualisiert werden {user}: {error}",
"user_unknown": "Unbekannte:r Benutzer:in : {user}",
"user_update_failed": "Benutzer:in konnte nicht aktualisiert werden {user}: {error}",
"user_updated": "Benutzerinformationen wurden aktualisiert",
"yunohost_already_installed": "YunoHost ist bereits installiert",
"yunohost_configured": "YunoHost ist nun konfiguriert",
@ -290,13 +290,13 @@
"diagnosis_ip_no_ipv6": "Der Server hat kein funktionierendes IPv6.",
"diagnosis_ip_not_connected_at_all": "Der Server scheint überhaupt nicht mit dem Internet verbunden zu sein!?",
"diagnosis_failed_for_category": "Diagnose fehlgeschlagen für die Kategorie '{category}': {error}",
"diagnosis_cache_still_valid": "(Der Cache für die Diagnose {category} ist immer noch gültig . Es wird momentan keine neue Diagnose durchgeführt!)",
"diagnosis_cache_still_valid": "(Der Cache für die Diagnose {category} ist immer noch gültig. Es wird momentan keine neue Diagnose durchgeführt!)",
"diagnosis_cant_run_because_of_dep": "Kann Diagnose für {category} nicht ausführen während wichtige Probleme zu {dep} noch nicht behoben sind.",
"diagnosis_found_errors_and_warnings": "Habe {errors} erhebliche(s) Problem(e) (und {warnings} Warnung(en)) in Verbindung mit {category} gefunden!",
"diagnosis_ip_broken_dnsresolution": "Domänen-Namens-Auflösung scheint aus einem bestimmten Grund nicht zu funktionieren... Blockiert eine Firewall die DNS Anfragen?",
"diagnosis_ip_broken_resolvconf": "Domänen-Namensauflösung scheint nicht zu funktionieren, was daran liegen könnte, dass in <code>/etc/resolv.conf</code> kein Eintrag auf <code>127.0.0.1</code> zeigt.",
"diagnosis_ip_weird_resolvconf_details": "Die Datei <code>/etc/resolv.conf</code> muss ein Symlink auf <code>/etc/resolvconf/run/resolv.conf</code> sein, welcher auf <code>127.0.0.1</code> (dnsmasq) zeigt. Falls Sie die DNS-Resolver manuell konfigurieren möchten, bearbeiten Sie bitte <code>/etc/resolv.dnsmasq.conf</code>.",
"diagnosis_dns_good_conf": "Die DNS-Einträge für die Domäne {domain} (Kategorie {category}) sind korrekt konfiguriert",
"diagnosis_dns_good_conf": "DNS Einträge korrekt konfiguriert für die Domäne {domain} (Kategorie {category})",
"diagnosis_ignored_issues": "(+ {nb_ignored} ignorierte(s) Problem(e))",
"diagnosis_basesystem_hardware": "Server Hardware Architektur ist {virt} {arch}",
"diagnosis_found_errors": "Habe {errors} erhebliche(s) Problem(e) in Verbindung mit {category} gefunden!",
@ -311,7 +311,7 @@
"migration_0015_patching_sources_list": "sources.lists wird repariert...",
"migration_0015_start": "Start der Migration auf Buster",
"migration_description_0015_migrate_to_buster": "Auf Debian Buster und YunoHost 4.x upgraden",
"mail_unavailable": "Diese E-Mail Adresse ist reserviert und wird dem ersten Benutzer automatisch zugewiesen",
"mail_unavailable": "Diese E-Mail Adresse ist reserviert und wird dem/der ersten Benutzer:in automatisch zugewiesen",
"diagnosis_services_conf_broken": "Die Konfiguration für den Dienst {service} ist fehlerhaft!",
"diagnosis_services_running": "Dienst {service} läuft!",
"diagnosis_domain_expires_in": "{domain} läuft in {days} Tagen ab.",
@ -319,11 +319,11 @@
"diagnosis_domain_expiration_success": "Ihre Domänen sind registriert und werden in nächster Zeit nicht ablaufen.",
"diagnosis_domain_not_found_details": "Die Domäne {domain} existiert nicht in der WHOIS-Datenbank oder sie ist abgelaufen!",
"diagnosis_domain_expiration_not_found": "Das Ablaufdatum einiger Domains kann nicht überprüft werden",
"diagnosis_dns_try_dyndns_update_force": "Die DNS-Konfiguration dieser Domain sollte automatisch von YunoHost verwaltet werden. Andernfalls können Sie mittels <cmd>yunohost dyndns update --force</cmd> ein Update erzwingen.",
"diagnosis_dns_point_to_doc": "Bitte schauen Sie in die Dokumentation unter <a href='https://yunohost.org/dns_config'>https://yunohost.org/dns_config</a> wenn Sie Hilfe bei der Konfiguration der DNS-Einträge brauchen.",
"diagnosis_dns_discrepancy": "Der folgende DNS-Eintrag scheint nicht den empfohlenen Einstellungen zu entsprechen: <br>Typ: <code>{type}</code><br>Name: <code>{name}</code><br> Aktueller Wert: <code>{current}</code><br> Erwarteter Wert: <code>{value}</code>",
"diagnosis_dns_try_dyndns_update_force": "Die DNS Konfiguration der Domäne sollte von Yunohost kontrolliert werden. Andernfalls, kannst du mit <cmd>yunohost dyndns update --force</cmd> ein Update erzwingen.",
"diagnosis_dns_point_to_doc": "Bitte schaue in die Dokumentation unter <a href='https://yunohost.org/dns_config'>https://yunohost.org/dns_config</a> wenn du hilfe bei der Konfiguration der DNS Einträge brauchst.",
"diagnosis_dns_discrepancy": "Der folgende DNS Eintrag scheint nicht den empfohlenen Einstellungen zu entsprechen:<br>Typ: <code>{type}</code><br>Name: <code>{name}</code><br>Aktueller Wert: <code>{current}</code><br>Erwarteter Wert: <code>{value}</code>",
"diagnosis_dns_missing_record": "Gemäß der empfohlenen DNS-Konfiguration sollten Sie einen DNS-Eintrag mit den folgenden Informationen hinzufügen.<br>Typ: <code>{type}</code><br>Name: <code>{name}</code><br>Wert: <code>{value}</code>",
"diagnosis_dns_bad_conf": "Einige DNS-Einträge für die Domäne {domain} fehlen oder sind nicht korrekt (Kategorie {category})",
"diagnosis_dns_bad_conf": "Einige DNS Einträge für die Domäne {domain} fehlen oder sind nicht korrekt (Kategorie {category})",
"diagnosis_ip_local": "Lokale IP: <code>{local}</code>",
"diagnosis_ip_global": "Globale IP: <code>{global}</code>",
"diagnosis_ip_no_ipv6_tip": "Die Verwendung von IPv6 ist nicht Voraussetzung für das Funktionieren Ihres Servers, trägt aber zur Gesundheit des Internet als Ganzes bei. IPv6 sollte normalerweise automatisch von Ihrem Server oder Ihrem Provider konfiguriert werden, sofern verfügbar. Andernfalls müßen Sie einige Dinge manuell konfigurieren. Weitere Informationen finden Sie hier: <a href='https://yunohost.org/#/ipv6'>https://yunohost.org/#/ipv6</a>. Wenn Sie IPv6 nicht aktivieren können oder Ihnen das zu technisch ist, können Sie diese Warnung gefahrlos ignorieren.",
@ -351,8 +351,8 @@
"diagnosis_diskusage_low": "Der Speicher <code>{mountpoint}</code> (auf Gerät <code>{device}</code>) hat nur noch {free} ({free_percent}%) freien Speicherplatz (von insgesamt {total}). Seien Sie vorsichtig.",
"diagnosis_ram_low": "Das System hat nur {available} ({available_percent}%) RAM zur Verfügung! (von insgesamt {total}). Seien Sie vorsichtig.",
"service_reload_or_restart_failed": "Der Dienst '{service}' konnte nicht erneut geladen oder gestartet werden.\n\nKürzlich erstellte Logs des Dienstes: {logs}",
"diagnosis_domain_expiration_not_found_details": "Die WHOIS-Informationen für die Domäne {domain} scheint keine Informationen über das Ablaufdatum zu enthalten?",
"diagnosis_domain_expiration_warning": "Einige Domänen werden bald ablaufen!",
"diagnosis_domain_expiration_not_found_details": "Die WHOIS Informationen für die Domäne {domain} scheinen keine Informationen über das Ablaufdatum zu enthalten.",
"diagnosis_domain_expiration_warning": "Einige Domänen werden bald ablaufen.",
"diagnosis_diskusage_ok": "Der Speicher <code>{mountpoint}</code> (auf Gerät <code>{device}</code>) hat immer noch {free} ({free_percent}%) freien Speicherplatz übrig(von insgesamt {total})!",
"diagnosis_ram_ok": "Das System hat immer noch {available} ({available_percent}%) RAM zu Verfügung von {total}.",
"diagnosis_swap_none": "Das System hat gar keinen Swap. Sie sollten sich überlegen mindestens {recommended} an Swap einzurichten, um Situationen zu verhindern, in welchen der RAM des Systems knapp wird.",
@ -424,7 +424,7 @@
"group_cannot_be_deleted": "Die Gruppe {group} kann nicht manuell entfernt werden.",
"group_cannot_edit_primary_group": "Die Gruppe '{group}' kann nicht manuell bearbeitet werden. Es ist die primäre Gruppe, welche dazu gedacht ist, nur einen spezifischen Benutzer zu enthalten.",
"diagnosis_processes_killed_by_oom_reaper": "Das System hat einige Prozesse beendet, weil ihm der Arbeitsspeicher ausgegangen ist. Das passiert normalerweise, wenn das System ingesamt nicht genügend Arbeitsspeicher zur Verfügung hat oder wenn ein einzelner Prozess zu viel Speicher verbraucht. Zusammenfassung der beendeten Prozesse: \n{kills_summary}",
"diagnosis_description_ports": "Offene Ports",
"diagnosis_description_ports": "Geöffnete Ports",
"additional_urls_already_added": "Zusätzliche URL '{url}' bereits hinzugefügt in der zusätzlichen URL für Berechtigung '{permission}'",
"additional_urls_already_removed": "Zusätzliche URL '{url}' bereits entfernt in der zusätzlichen URL für Berechtigung '{permission}'",
"app_label_deprecated": "Dieser Befehl ist veraltet! Bitte nutzen Sie den neuen Befehl 'yunohost user permission update' um das Applabel zu verwalten.",
@ -436,8 +436,8 @@
"diagnosis_backports_in_sources_list": "Sie haben anscheinend apt (den Paketmanager) für das Backports-Repository konfiguriert. Wir raten strikte davon ab, Pakete aus dem Backports-Repository zu installieren. Diese würden wahrscheinlich zu Instabilitäten und Konflikten führen. Es sei denn, Sie wissen was Sie tun.",
"diagnosis_basesystem_hardware_model": "Das Servermodell ist {model}",
"domain_name_unknown": "Domäne '{domain}' unbekannt",
"group_user_not_in_group": "Der Benutzer {user} ist nicht in der Gruppe {group}",
"group_user_already_in_group": "Der Benutzer {user} ist bereits in der Gruppe {group}",
"group_user_not_in_group": "Benutzer:in {user} ist nicht in der Gruppe {group}",
"group_user_already_in_group": "Benutzer:in {user} ist bereits in der Gruppe {group}",
"group_cannot_edit_visitors": "Die Gruppe \"Besucher\" kann nicht manuell editiert werden. Sie ist eine Sondergruppe und repräsentiert anonyme Besucher",
"group_cannot_edit_all_users": "Die Gruppe \"all_users\" kann nicht manuell editiert werden. Sie ist eine Sondergruppe die dafür gedacht ist alle Benutzer in YunoHost zu halten",
"group_already_exist_on_system_but_removing_it": "Die Gruppe {group} existiert bereits in den Systemgruppen, aber YunoHost wird sie entfernen...",
@ -460,7 +460,7 @@
"log_app_action_run": "Führe Aktion der Applikation '{}' aus",
"invalid_regex": "Ungültige Regex:'{regex}'",
"migration_description_0016_php70_to_php73_pools": "Migrieren der php7.0-fpm-Konfigurationsdateien zu php7.3",
"mailbox_disabled": "E-Mail für Benutzer {user} deaktiviert",
"mailbox_disabled": "E-Mail für Benutzer:in {user} deaktiviert",
"log_tools_reboot": "Server neustarten",
"log_tools_shutdown": "Server ausschalten",
"log_tools_upgrade": "Systempakete aktualisieren",
@ -469,12 +469,12 @@
"log_domain_main_domain": "Mache '{}' zur Hauptdomäne",
"log_user_permission_reset": "Zurücksetzen der Berechtigung '{}'",
"log_user_permission_update": "Aktualisiere Zugriffe für Berechtigung '{}'",
"log_user_update": "Aktualisiere Information für Benutzer '{}'",
"log_user_update": "Aktualisiere Information für Benutzer:in '{}'",
"log_user_group_update": "Aktualisiere Gruppe '{}'",
"log_user_group_delete": "Lösche Gruppe '{}'",
"log_user_group_create": "Erstelle Gruppe '{}'",
"log_user_delete": "Lösche Benutzer '{}'",
"log_user_create": "Füge Benutzer '{}' hinzu",
"log_user_delete": "Lösche Benutzer:in '{}'",
"log_user_create": "Füge Benutzer:in '{}' hinzu",
"log_permission_url": "Aktualisiere URL, die mit der Berechtigung '{}' verknüpft ist",
"log_permission_delete": "Lösche Berechtigung '{}'",
"log_permission_create": "Erstelle Berechtigung '{}'",
@ -541,14 +541,14 @@
"regenconf_file_kept_back": "Die Konfigurationsdatei '{conf}' sollte von \"regen-conf\" (Kategorie {category}) gelöscht werden, wurde aber beibehalten.",
"regenconf_file_copy_failed": "Die neue Konfigurationsdatei '{new}' kann nicht nach '{conf}' kopiert werden",
"regenconf_file_backed_up": "Die Konfigurationsdatei '{conf}' wurde unter '{backup}' gespeichert",
"permission_require_account": "Berechtigung {permission} ist nur für Benutzer mit einem Konto sinnvoll und kann daher nicht für Besucher aktiviert werden.",
"permission_require_account": "Berechtigung {permission} ist nur für Benutzer:innen mit einem Konto sinnvoll und kann daher nicht für Besucher:innen aktiviert werden.",
"permission_protected": "Die Berechtigung ist geschützt. Sie können die Besuchergruppe nicht zu dieser Berechtigung hinzufügen oder daraus entfernen.",
"permission_updated": "Berechtigung '{permission}' aktualisiert",
"permission_update_failed": "Die Berechtigung '{permission}' kann nicht aktualisiert werden : {error}",
"permission_not_found": "Berechtigung '{permission}' nicht gefunden",
"permission_deletion_failed": "Entfernung der Berechtigung nicht möglich '{permission}': {error}",
"permission_deleted": "Berechtigung '{permission}' gelöscht",
"permission_currently_allowed_for_all_users": "Diese Berechtigung wird derzeit allen Benutzern zusätzlich zu anderen Gruppen erteilt. Möglicherweise möchten Sie entweder die Berechtigung 'all_users' entfernen oder die anderen Gruppen entfernen, für die sie derzeit zulässig sind.",
"permission_currently_allowed_for_all_users": "Diese Berechtigung wird derzeit allen Benutzer:innen zusätzlich zu anderen Gruppen erteilt. Möglicherweise möchten Sie entweder die Berechtigung 'all_users' entfernen oder die anderen Gruppen entfernen, für die sie derzeit zulässig sind.",
"permission_creation_failed": "Berechtigungserstellung nicht möglich '{permission}' : {error}",
"permission_created": "Berechtigung '{permission}' erstellt",
"permission_cannot_remove_main": "Entfernung einer Hauptberechtigung nicht genehmigt",
@ -587,13 +587,13 @@
"global_settings_setting_security_ssh_port": "SSH-Port",
"diagnosis_sshd_config_inconsistent_details": "Bitte führen Sie <cmd>yunohost settings set security.ssh.port -v YOUR_SSH_PORT</cmd> aus, um den SSH-Port festzulegen, und prüfen Sie <cmd> yunohost tools regen-conf ssh --dry-run --with-diff</cmd> und <cmd>yunohost tools regen-conf ssh --force</cmd> um Ihre conf auf die YunoHost-Empfehlung zurückzusetzen.",
"regex_incompatible_with_tile": "/!\\ Packagers! Für Berechtigung '{permission}' ist show_tile auf 'true' gesetzt und deshalb können Sie keine regex-URL als Hauptdomäne setzen",
"permission_cant_add_to_all_users": "Die Berechtigung {permission} konnte nicht allen Benutzern gegeben werden.",
"permission_cant_add_to_all_users": "Die Berechtigung {permission} konnte nicht allen Benutzer:innen gegeben werden.",
"migration_ldap_can_not_backup_before_migration": "Das System-Backup konnte nicht abgeschlossen werden, bevor die Migration fehlschlug. Fehler: {error}",
"service_description_fail2ban": "Schützt gegen Brute-Force-Angriffe und andere Angriffe aus dem Internet",
"service_description_dovecot": "Ermöglicht es E-Mail-Clients auf Konten zuzugreifen (IMAP und POP3)",
"service_description_dnsmasq": "Verarbeitet die Auflösung des Domainnamens (DNS)",
"restore_backup_too_old": "Dieses Backup kann nicht wieder hergestellt werden, weil es von einer zu alten YunoHost Version stammt.",
"service_description_slapd": "Speichert Benutzer, Domains und verbundene Informationen",
"service_description_slapd": "Speichert Benutzer:innen, Domains und verbundene Informationen",
"service_description_rspamd": "Spamfilter und andere E-Mail-Merkmale",
"service_description_redis-server": "Eine spezialisierte Datenbank für den schnellen Datenzugriff, die Aufgabenwarteschlange und die Kommunikation zwischen Programmen",
"service_description_postfix": "Wird benutzt, um E-Mails zu senden und zu empfangen",
@ -623,12 +623,23 @@
"tools_upgrade_special_packages_explanation": "Das Upgrade \"special\" wird im Hintergrund ausgeführt. Bitte starten Sie keine anderen Aktionen auf Ihrem Server für die nächsten ~10 Minuten. Die Dauer ist abhängig von der Geschwindigkeit Ihres Servers. Nach dem Upgrade müssen Sie sich eventuell erneut in das Adminportal einloggen. Upgrade-Logs sind im Adminbereich unter Tools → Log verfügbar. Alternativ können Sie in der Befehlszeile 'yunohost log list' eingeben.",
"tools_upgrade_special_packages": "\"special\" (YunoHost-bezogene) Pakete werden jetzt aktualisiert...",
"unknown_main_domain_path": "Unbekannte:r Domain oder Pfad für '{app}'. Du musst eine Domain und einen Pfad setzen, um die URL für Berechtigungen zu setzen.",
"yunohost_postinstall_end_tip": "Post-install ist fertig! Um das Setup abzuschliessen, wird empfohlen:\n - einen ersten Benutzer über den Bereich 'Benutzer*in' im Adminbereich hinzuzufügen (oder mit 'yunohost user create <username>' in der Kommandezeile);\n - mögliche Fehler zu diagnostizieren über den Bereich 'Diagnose' im Adminbereich (oder mit 'yunohost diagnosis run' in der Kommandozeile;\n - Die Abschnitte 'Install YunoHost' und 'Geführte Tour' im Administratorenhandbuch zu lesen: https://yunohost.org/admindoc.",
"user_already_exists": "Der Benutzer '{user}' ist bereits vorhanden",
"yunohost_postinstall_end_tip": "Post-install ist fertig! Um das Setup abzuschliessen, wird empfohlen:\n - einen ersten Benutzer über den Bereich 'Benutzer:in' im Adminbereich hinzuzufügen (oder mit 'yunohost user create <username>' in der Kommandezeile);\n - mögliche Fehler zu diagnostizieren über den Bereich 'Diagnose' im Adminbereich (oder mit 'yunohost diagnosis run' in der Kommandozeile;\n - Die Abschnitte 'Install YunoHost' und 'Geführte Tour' im Administratorenhandbuch zu lesen: https://yunohost.org/admindoc.",
"user_already_exists": "Benutzer:in '{user}' ist bereits vorhanden",
"update_apt_cache_warning": "Beim Versuch den Cache für APT (Debians Paketmanager) zu aktualisieren, ist etwas schief gelaufen. Hier ist ein Dump der Zeilen aus sources.list, die Ihnen vielleicht dabei helfen, das Problem zu identifizieren:\n{sourceslist}",
"global_settings_setting_security_webadmin_allowlist": "IP-Adressen, die auf die Verwaltungsseite zugreifen dürfen. Kommasepariert.",
"global_settings_setting_security_webadmin_allowlist_enabled": "Erlaube nur bestimmten IP-Adressen den Zugriff auf die Verwaltungsseite.",
"disk_space_not_sufficient_update": "Es ist nicht genügend Speicherplatz frei, um diese Applikation zu aktuallisieren",
"disk_space_not_sufficient_install": "Es ist nicht genügend Speicherplatz frei, um diese Applikation zu installieren",
"danger": "Warnung:"
}
"danger": "Warnung:",
"diagnosis_apps_bad_quality": "Diese App ist im YunoHost App Katalog momentan als kaputt gekennzeichnet. Dies mag ein temporäres Problem darstellen, das von den Maintainern versucht wird zu beheben. In der Zwischenzeit ist das Upgrade dieser App nicht möglich.",
"config_apply_failed": "Die neue Konfiguration umzusetzen ist fehlgeschlagen: {error}",
"config_validate_date": "Sollte ein zulässiges Datum in folgendem Format sein: YYYY-MM-DD",
"config_validate_email": "Sollte eine zulässige eMail sein",
"config_forbidden_keyword": "Das Keyword '{keyword}' ist reserviert. Mit dieser id kannst du keine Konfigurationspanel erstellen",
"config_no_panel": "Kein Konfigurationspanel gefunden.",
"config_validate_color": "Sollte eine zulässige RGB hexadezimal Farbe sein",
"diagnosis_apps_issue": "Ein Problem für die App {app} ist aufgetreten",
"config_validate_time": "Sollte eine zulässige Zeit wie HH:MM sein",
"config_validate_url": "Sollte eine zulässige web URL sein",
"config_version_not_supported": "Konfigurationspanel Versionen '{version}' sind nicht unterstützt."
}

View file

@ -312,7 +312,7 @@
"domain_dyndns_root_unknown": "Unknown DynDNS root domain",
"domain_exists": "The domain already exists",
"domain_hostname_failed": "Unable to set new hostname. This might cause an issue later (it might be fine).",
"domain_name_unknown": "Domain '{domain}' unknown",
"domain_unknown": "Domain '{domain}' unknown",
"domain_remove_confirm_apps_removal": "Removing this domain will remove those applications:\n{apps}\n\nAre you sure you want to do that? [{answers}]",
"domain_uninstall_app_first": "Those applications are still installed on your domain:\n{apps}\n\nPlease uninstall them using 'yunohost app remove the_app_id' or move them to another domain using 'yunohost app change-url the_app_id' before proceeding to domain removal",
"domain_registrar_is_not_configured": "The registrar is not yet configured for domain {domain}.",

View file

@ -1,3 +1,248 @@
{
"password_too_simple_1": "Pasahitzak gutxienez 8 karaktere izan behar ditu"
}
"password_too_simple_1": "Pasahitzak gutxienez 8 karaktere izan behar ditu",
"action_invalid": "'{action}' ekintza baliogabea",
"aborting": "Bertan behera uzten.",
"admin_password_changed": "Administrazio-pasahitza aldatu da",
"admin_password_change_failed": "Ezinezkoa izan da pasahitza aldatzea",
"additional_urls_already_added": "'{url}' URL gehigarria '{permission}' baimenerako gehitu da dagoeneko",
"additional_urls_already_removed": "'{url}' URL gehigarriari '{permission}' baimena kendu zaio dagoeneko",
"admin_password": "Administrazio-pasahitza",
"diagnosis_ip_global": "IP orokorra: <code>{global}</code>",
"app_argument_password_no_default": "Errorea egon da '{name}' pasahitzaren argumentua ikuskatzean: pasahitzaren argumentuak ezin du balio hori izan segurtasun urria duela-eta",
"app_extraction_failed": "Ezinezkoa izan da instalazio fitxategiak ateratzea",
"app_requirements_unmeet": "{app}(e)k behar dituen baldintzak ez dira betetzen, {pkgname} ({version}) paketea {spec} izan behar da",
"backup_deleted": "Babeskopia ezabatuta",
"app_argument_required": "'{name}' argumentua beharrezkoa da",
"certmanager_acme_not_configured_for_domain": "Ezin da ACME azterketa {domain} domeinurako burutu une honetan nginx konfigurazioak ez duelako beharrezko kodea… Baieztatu nginx-en konfigurazioa egunean dagoela 'yunohost tools regen-conf nginx --dry-run --with-diff' komandoa exekutatuz.",
"certmanager_domain_dns_ip_differs_from_public_ip": "'{domain}' domeinurako DNS balioak ez datoz bat zerbitzariaren IParekin. Mesedez, egiaztatu 'DNS balioak' (oinarrizkoa) kategoria diagnostikoen atalean. A balioak duela gutxi aldatu badituzu, itxaron hedatu daitezen (badaude DNSen hedapena ikusteko erramintak interneten). (Zertan ari zeren baldin badakizu, erabili '--no-checks' egiaztapen horiek desgaitzeko.)",
"confirm_app_install_thirdparty": "KONTUZ! Aplikazio hau ez da YunoHosten aplikazioen katalogokoa. Kanpoko aplikazioek sistemaren integritate eta segurtasuna arriskuan jarri dezakete. Ziur asko EZ zenuke instalatu beharko zertan ari zaren ez badakizu. Aplikazio hau ez badabil edo sistema hondatzen badu EZ DA LAGUNTZARIK EMANGO… aurrera jarraitu nahi duzu hala ere? Aukeratu '{answers}'",
"app_start_remove": "{app} ezabatzen…",
"diagnosis_http_hairpinning_issue_details": "Litekeena da erantzulea zure kable-modem / routerra izatea. Honen eraginez, saretik kanpo daudenek zerbitzaria arazorik gabe erabili ahal izango dute, baina sarean bertan daudenek (ziur asko zure kasua) ezingo dute kanpoko IPa edo domeinu izena erabili zerbitzarira konektatzeko. Egoera hobetu edo guztiz konpontzeko, irakurri <a href='https://yunohost.org/dns_local_network'>dokumentazioa</a>. [Itzultzailearen oharra: SBC merke batean Pi-Hole instalatu eta bertako Local DNS > DNS records baliatu arazo hau ekiditeko]",
"diagnosis_http_special_use_tld": "{domain} domeinua top-level domain (TLD) motakoa da .local edo .test bezala eta ez du sare lokaletik kanpo eskuragarri zertan egon.",
"diagnosis_ip_weird_resolvconf_details": "<code>/etc/resolv.conf</code> fitxategia symlink bat izan beharko litzateke <code>/etc/resolvconf/run/resolv.conf</code> fitxategira <code>127.0.0.1</code>ra adi dagoena (dnsmasq). DNS ebazleak eskuz konfiguratu nahi badituzu, mesedez aldatu <code>/etc/resolv.dnsmasq.conf</code> fitxategia.",
"diagnosis_ip_connected_ipv4": "Zerbitzaria IPv4 bidez dago internetera konektatuta!",
"diagnosis_basesystem_ynh_inconsistent_versions": "YunoHost paketeen bertsioak ez datoz bat… ziur asko noizbait eguneraketa batek kale egin edo erabat amaitu ez zuelako.",
"diagnosis_high_number_auth_failures": "Azken aldian kale egin duten saio-hasiera saiakera ugari egon dira. Egiaztatu fail2ban martxan dabilela eta egoki konfiguratuta dagoela, edo erabili beste ataka bat SSHrako <a href=\"https://yunohost.org/security\">dokumentazioa</a>n azaldu bezala.",
"diagnosis_mail_ehlo_could_not_diagnose": "Ezin izan da egiaztatu postfix posta zerbitzaria IPv{ipversion}az kanpo eskuragarri dagoenik.",
"app_id_invalid": "Aplikazio ID okerra",
"app_install_files_invalid": "Fitxategi hauek ezin dira instalatu",
"diagnosis_description_ip": "Internet konexioa",
"diagnosis_description_dnsrecords": "DNS erregistroak",
"app_label_deprecated": "Komando hau zaharkitua dago! Mesedez erabili 'yunohost user permission update' komando berria aplikazioaren etiketa kudeatzeko.",
"confirm_app_install_danger": "KONTUZ! Aplikazio hau esperimentala da (edo ez dabil)! Ez zenuke instalatu beharko zertan ari zaren ez badakizu. Aplikazio hau ez badabil edo sistema hondatzen badu, EZ DA LAGUNTZARIK EMANGO… aurrera jarraitu nahi al duzu hala ere? Aukeratu '{answers}'",
"diagnosis_description_systemresources": "Sistemaren baliabideak",
"backup_csv_addition_failed": "Ezin izan dira fitxategiak CSV fitxategira kopiatu",
"backup_no_uncompress_archive_dir": "Ez dago horrelako deskonprimatutako fitxategi katalogorik",
"danger": "Arriskua:",
"diagnosis_dns_discrepancy": "Ez dirudi ondorengo DNS balioak bat datozenik proposatutako konfigurazioarekin:<br>Mota: <code>{type}</code><br>Izena: <code>{name}</code><br>Oraingo balioa: <code>{current}</code><br>Proposatutako balioa: <code>{value}</code>",
"diagnosis_dns_specialusedomain": "{domain} domeinua top-level domain (TLD) erabilera berezikoa da .local edo .test bezala eta horregatik ez du DNS erregistrorik erabiltzen.",
"diagnosis_http_bad_status_code": "Badirudi zerbitzaria ez den beste gailu batek erantzun diola eskaerari (agian routerrak).<br>1. Honen arrazoi ohikoena 80 (eta 443) ataka <a href='https://yunohost.org/isp_box_config'>zerbitzarira ondo birbidaltzen ez dela</a> da.<br>2. Konfigurazio konplexua badarabilzu, egiaztatu suebakiak edo reverse-proxyk oztopatzen ez dutela.",
"diagnosis_http_timeout": "Denbora agortu da sare lokaletik kanpo zure zerbitzarira konexioa gauzatzeko ahaleginean. Eskuragarri ez dagoela dirudi.<br>1. 80 (eta 443) ataka <a href='https://yunohost.org/isp_box_config'>zerbitzarira modu egokian birbidaltzen ez direla da</a> ohiko arrazoia.<br>2. Badaezpada egiaztatu nginx martxan dagoela.<br>3. Konfigurazio konplexuetan, egiaztatu suebakiak edo reverse-proxyk konexioa oztopatzen ez dutela.",
"app_sources_fetch_failed": "Ezin izan dira fitxategiak eskuratu, zuzena al da URLa?",
"app_make_default_location_already_used": "Ezinezkoa izan da '{app}' domeinuko aplikazio nagusi ezartzea, '{other_app}'(e)k dagoeneko '{domain}' erabiltzen duelako",
"app_already_installed_cant_change_url": "Aplikazio hau instalatuta dago dagoeneko. URLa ezin da aldatu aukera honekin. Markatu `app changeurl` markatzeko moduan badago.",
"diagnosis_ip_not_connected_at_all": "Badirudi zerbitzaria ez dagoela internetera konektatuta!?",
"app_already_up_to_date": "{app} aplikazioa egunean da dagoeneko",
"app_change_url_success": "{app} aplikazioaren URLa {domain}{path} da orain",
"admin_password_too_long": "Mesedez aukeratu 127 karaktere baino laburragoa den pasahitz bat",
"app_action_broke_system": "Ekintza honek {services} zerbitzu garrantzitsuak hondatu dituela dirudi",
"diagnosis_basesystem_hardware_model": "Zerbitzariaren modeloa {model} da",
"already_up_to_date": "Ez dago egiteko ezer. Guztia dago egunean.",
"backup_permission": "{app}(r)entzat babeskopia baimena",
"config_validate_date": "UUUU-HH-EE formatua duen data bat izan behar da",
"config_validate_email": "Benetazko posta elektronikoa izan behar da",
"config_validate_time": "OO:MM formatua duen ordu bat izan behar da",
"config_validate_url": "Benetazko URL bat izan behar da",
"config_version_not_supported": "Ezin da konfigurazio-panelaren '{version}' bertsioa erabili.",
"app_restore_script_failed": "Errorea gertatu da aplikazioa lehengoratzeko aginduan",
"app_upgrade_some_app_failed": "Ezin izan dira aplikazio batzuk eguneratu",
"app_install_failed": "Ezinezkoa izan da {app} instalatzea: {error}",
"diagnosis_basesystem_kernel": "Zerbitzariak Linuxen {kernel_version} kernela darabil",
"app_argument_invalid": "Aukeratu balio onargarri bat {name}' argumenturako: {error}",
"app_already_installed": "{app} instalatuta dago dagoeneko",
"app_config_unable_to_apply": "Ezinezkoa izan da konfigurazio aukerak ezartzea.",
"app_config_unable_to_read": "Ezinezkoa izan da konfigurazio aukerak irakurtzea.",
"config_apply_failed": "Ezin izan da konfigurazio berria ezarri: {error}",
"config_cant_set_value_on_section": "Ezin da balio bakar bat ezarri konfigurazio atal oso batean.",
"config_no_panel": "Ez da konfigurazio-panelik aurkitu.",
"diagnosis_found_errors_and_warnings": "{category} atalari dago(z)kion {errors} arazoa(k) (eta {warnings} abisua(k)) aurkitu d(ir)a!",
"diagnosis_description_regenconf": "Sistemaren ezarpenak",
"app_upgrade_script_failed": "Errore bat gertatu da aplikazioaren eguneratze aginduan",
"diagnosis_basesystem_hardware": "Zerbitzariaren arkitektura {virt} {arch} da",
"diagnosis_mail_ehlo_ok": "SMTP posta zerbitzaria eskuragarri dago kanpoko saretik eta beraz, posta elektronikoa jasotzeko gai da!",
"app_unknown": "Aplikazio ezezaguna",
"diagnosis_mail_ehlo_bad_answer": "SMTP ez den zerbitzu batek erantzun du IPv{ipversion}ko 25. atakan",
"diagnosis_mail_ehlo_could_not_diagnose_details": "Errorea: {error}",
"diagnosis_mail_blacklist_ok": "Zerbitzari honek darabiltzan IPak eta domeinuak ez dirudi inolako zerrenda beltzetan daudenik",
"diagnosis_domain_expiration_error": "Domeinu batzuk IRAUNGITZEAR daude!",
"diagnosis_domain_expiration_success": "Domeinuak erregistratuta daude eta ez dira oraingoz iraungiko.",
"app_manifest_install_ask_is_public": "Saiorik hasi gabeko bisitarientzat ikusgai egon beharko litzateke aplikazio hau?",
"diagnosis_domain_expires_in": "{domain} {days} egun barru iraungiko da.",
"app_manifest_install_ask_domain": "Aukeratu zein domeinutan instalatu nahi duzun aplikazio hau",
"custom_app_url_required": "URL bat zehaztu behar duzu {app} eguneratzeko",
"app_change_url_identical_domains": "Domeinu zahar eta berriaren bidea bera dira: ('{domain}{path}'), ez dago ezer egitekorik.",
"app_upgrade_failed": "Ezinezkoa {app} eguneratzea: {error}",
"app_upgrade_app_name": "Orain {app} eguneratzen…",
"app_upgraded": "{app} eguneratu da",
"ask_firstname": "Izena",
"ask_lastname": "Abizena",
"ask_main_domain": "Domeinu nagusia",
"config_forbidden_keyword": "'{keyword}' etiketa sistemak bakarrik erabil dezake; ezin da ID hau daukan baliorik sortu edo erabili.",
"config_unknown_filter_key": "'{filter_key}' filtroaren kakoa ez da zuzena.",
"config_validate_color": "RGB hamaseitar kolore bat izan behar da",
"diagnosis_cant_run_because_of_dep": "Ezin da diagnosia abiarazi {category} atalerako {dep}(r)i lotutako arazo garrantzitsuek dirauen artean.",
"diagnosis_dns_missing_record": "Proposatutako DNS konfigurazioaren arabera, ondorengo informazioa gehitu beharko zenuke DNS erregistroan:<br>Mota: <code>{type}</code><br>Izena: <code>{name}</code><br>Balioa: <code>{value}</code>",
"diagnosis_http_nginx_conf_not_up_to_date": "Domeinu honen nginx konfigurazioa eskuz moldatu dela dirudi eta YunoHostek ezin du egiaztatu HTTP bidez eskuragarri dagoen.",
"ask_new_admin_password": "Administrazio-pasahitz berria",
"ask_new_domain": "Domeinu berria",
"ask_new_path": "Bide berria",
"ask_password": "Pasahitza",
"backup_abstract_method": "Babeskopia modu hau oraindik ez da go erabilgarri",
"backup_applying_method_custom": "'{method}' neurrira egindako babeskopia sortzen…",
"backup_applying_method_copy": "Babeskopiarako fitxategi guztiak kopiatzen…",
"backup_archive_app_not_found": "Ezin izan da {app} aurkitu babeskopia fitxategian",
"backup_applying_method_tar": "Babeskopiaren TAR fitxategia sortzen…",
"backup_archive_broken_link": "Ezin izan da babeskopiaren fitxategia eskuratu ({path}ra esteka okerra)",
"backup_creation_failed": "Ezin izan da babeskopiaren fitxategia sortu",
"backup_csv_creation_failed": "Ezin izan da lehengoratzeko beharrezkoak diren CSV fitxategiak sortu",
"backup_custom_mount_error": "Neurrira egindako babeskopiak ezin izan du 'muntatu' urratsetik haratago egin",
"backup_delete_error": "Ezin izan da '{path}' ezabatu",
"backup_method_copy_finished": "Babeskopiak amaitu du",
"backup_hook_unknown": "Babeskopiaren '{hook}' kakoa ez da ezagutzen",
"backup_method_custom_finished": "'{method}' neurrira egindako babeskopiak amaitu du",
"backup_method_tar_finished": "TAR babeskopia artxiboa sortu da",
"backup_mount_archive_for_restore": "Lehengoratzeko fitxategoak prestatzen…",
"backup_nothings_done": "Ez dago gordetzeko ezer",
"backup_output_directory_required": "Babeskopia non gorde nahi duzun zehaztu behar duzu",
"backup_system_part_failed": "Ezin izan da sistemaren '{part}' atalaren babeskopia egin",
"apps_catalog_updating": "Aplikazioen katalogoa eguneratzen…",
"certmanager_cert_signing_failed": "Ezin izan da ziurtagiri berria sinatu",
"certmanager_cert_renew_success": "Let's Encrypt ziurtagiria berriztu da '{domain}' domeinurako",
"app_requirements_checking": "{app}(e)k behar dituen paketeak ikuskatzen…",
"certmanager_unable_to_parse_self_CA_name": "Ezin izan da norberak sinatutako ziurtagiriaren izena prozesatu (fitxategia: {file})",
"app_remove_after_failed_install": "Aplikazioa ezabatzen instalatzerakoan errorea dela-eta…",
"diagnosis_basesystem_ynh_single_version": "{package} bertsioa: {version} ({repo})",
"diagnosis_failed_for_category": "'{category}' ataleko diagnostikoak kale egin du: {error}",
"diagnosis_cache_still_valid": "(Cachea oraindik baliogarria da {category} (ar)en diagnosirako. Ez da berrabiaraziko!)",
"diagnosis_found_errors": "{category} atalari dago(z)kion {errors} arazoa(k) aurkitu d(ir)a!",
"diagnosis_found_warnings": "{category} atalari dagokion eta hobetu daite(z)keen {warnings} abisua(k) aurkitu d(ir)a.",
"diagnosis_ip_connected_ipv6": "Zerbitzaria IPv6 bidez dago internetera konektatuta!",
"diagnosis_everything_ok": "Itxura ona dauka {category} atalak!",
"diagnosis_ip_no_ipv4": "Zerbitzariak ez du dabilen IPv4rik.",
"diagnosis_ip_no_ipv6": "Zerbitzariak ez du dabilen IPv6rik.",
"diagnosis_ip_broken_dnsresolution": "Domeinu izenaren ebazpena hondatuta dagoela dirudi… Suebakiren bat ote dago DNS eskaerak oztopatzen?",
"diagnosis_diskusage_low": "<code>{mountpoint}</code> euskarriak (<code>{device}</code> gailuan) edukieraren {free} ({free_percent}%) bakarrik du erabilgarri ({total} orotara). Kontuz ibili.",
"diagnosis_dns_good_conf": "DNS ezarpenak zuzen konfiguratuta daude {domain} domeinurako ({category} atala)",
"diagnosis_diskusage_verylow": "<code>{mountpoint}</code> euskarriak (<code>{device}</code> gailuan) edukieraren {free} ({free_percent}%) bakarrik du erabilgarri ({total} orotara). Zertxobait hustu beharko zenuke!",
"diagnosis_description_basesystem": "Sistemaren oinarria",
"diagnosis_description_services": "Zerbitzuen egoeraren egiaztapena",
"diagnosis_http_could_not_diagnose": "Ezin izan da egiaztatu domeinuak IPv{ipversion} kanpotik eskuragarri daudenik.",
"diagnosis_http_ok": "Ezin da {domain} domeinua HTTP bidez bisitatu sare lokaletik kanpo.",
"diagnosis_http_unreachable": "Badirudi {domain} domeinua ez dagoela eskuragarri HTTP bidez sare lokaletik kanpo.",
"apps_catalog_failed_to_download": "Ezinezkoa izan da {apps_catalog} aplikazioen zerrenda eskuratzea: {error}",
"apps_catalog_init_success": "Abiarazi da aplikazioen katalogo sistema!",
"apps_catalog_obsolete_cache": "Aplikazioen katalogoaren cachea hutsik edo zaharkituta dago.",
"diagnosis_description_mail": "Posta elektronikoa",
"diagnosis_http_connection_error": "Arazoa konexioan: ezin izan da domeinu horretara konektatu, litekeena da eskuragaitza izatea.",
"diagnosis_description_web": "Weba",
"diagnosis_display_tip": "Aurkitu diren arazoak ikusteko joan Diagnosien atalera administrazio-webgunean, edo exekutatu 'yunohost diagnosis show --issues --human-readable' komandoak nahiago badituzu.",
"diagnosis_dns_point_to_doc": "Mesedez, irakurri <a href='https://yunohost.org/dns_config'>dokumentazioa</a> DNS erregistroekin laguntza behar baduzu.",
"diagnosis_mail_ehlo_unreachable": "SMTP posta zerbitzaria ez dago eskuragarri IPv{ipversion}ko sare lokaletik kanpo eta beraz, ez da posta elektronikoa jasotzeko gai.",
"diagnosis_mail_ehlo_bad_answer_details": "Litekeena da zure zerbitzaria ez den beste gailu batek erantzun izana.",
"diagnosis_mail_blacklist_listed_by": "Zure IP edo <code>{item}</code> domeinua {blacklist_name} zerrenda beltzean ageri da",
"diagnosis_mail_blacklist_website": "Zerrenda beltzean zergatik zauden ulertu eta konpondu ondoren, {blacklist_website} webgunean zure IP edo domeinua bertatik atera dezatela eska dezakezu",
"diagnosis_http_could_not_diagnose_details": "Errorea: {error}",
"diagnosis_http_hairpinning_issue": "Dirudienez zure sareak ez du hairpinninga gaituta.",
"diagnosis_http_partially_unreachable": "Badirudi {domain} domeinua ezin dela bisitatu HTTP bidez IPv{failed} sare lokaletik kanpo, bai ordea IPv{passed} erabiliz.",
"backup_archive_cant_retrieve_info_json": "Ezin izan da '{archive}' fitxategiko informazioa eskuratu… info.json ezin izan da eskuratu (edo ez da baliozko jsona).",
"diagnosis_domain_expiration_not_found": "Ezin izan da domeinu batzuen iraungitze data egiaztatu",
"diagnosis_domain_expiration_not_found_details": "Dirudienez {domain} domeinuari buruzko WHOIS informazioak ez du zehazten noiz iraungiko den.",
"certmanager_domain_not_diagnosed_yet": "Oraindik ez dago {domain} domeinurako diagnostikorik. Mesedez, berrabiarazi diagnostikoak 'DNS balioak' eta 'Web' ataletarako diagnostikoen gunean Let's Encrypt ziurtagirirako prest ote dagoen egiaztatzeko. (Edo zertan ari zaren baldin badakizu, erabili '--no-checks' egiaztatzea desgaitzeko.)",
"diagnosis_domain_expiration_warning": "Domeinu batzuk iraungitzear daude!",
"app_packaging_format_not_supported": "Aplikazio hau ezin da instalatu YunoHostek ez duelako paketea ezagutzen. Sistema eguneratzea hausnartu beharko zenuke ziur asko.",
"diagnosis_dns_try_dyndns_update_force": "Domeinu honen DNS konfigurazioa YunoHostek kudeatu beharko luke automatikoki. Gertatuko ez balitz, eguneratzera behartu zenezake <cmd>yunohost dyndns update --force</cmd> erabiliz.",
"app_manifest_install_ask_path": "Aukeratu aplikazio hau instalatzeko URLaren bidea (domeinuaren atzeko aldean)",
"app_manifest_install_ask_admin": "Aukeratu administrati bat aplikazio honetarako",
"app_manifest_install_ask_password": "Aukeratu administrazio-pasahitz bat aplikazio honetarako",
"ask_user_domain": "Erabiltzailearen posta elektroniko eta XMPP konturako erabiliko den domeinua",
"app_action_cannot_be_ran_because_required_services_down": "{services} zerbitzuak martxan egon beharko lirateke ekintza hau gauzatu ahal izateko. Saia zaitez zerbitzuok berrabiarazten (eta ikertu zergatik abiarazi ez diren).",
"apps_already_up_to_date": "Egunean daude dagoeneko aplikazio guztiak",
"app_full_domain_unavailable": "Aplikazio honek bere domeinu propioa behar du, baina beste aplikazio batzuk daude dagoeneko instalatuta '{domain}' domeinuan. Azpidomeinu bat erabil zenezake instalatu nahi duzun aplikaziorako.",
"app_install_script_failed": "Errore bat gertatu da aplikazioaren instalatzailearen aginduetan",
"diagnosis_basesystem_host": "Zerbitzariak Debian {debian_version} darabil",
"diagnosis_ignored_issues": "(kontuan hartu ez d(ir)en + {nb_ignored} arazoa(k))",
"diagnosis_ip_dnsresolution_working": "Domeinu izenaren ebazpena badabil!",
"diagnosis_failed": "Ezin izan da '{category}' ataleko diagnostikoa lortu: {error}",
"diagnosis_ip_weird_resolvconf": "DNS ebazpena badabilela dirudi, baina antza denez moldatutako <code>/etc/resolv.conf</code> fitxategia erabiltzen ari zara.",
"diagnosis_dns_bad_conf": "DNS balio batzuk falta dira edo ez dira zuzenak {domain} domeinurako ({category} atala)",
"diagnosis_diskusage_ok": "<code>{mountpoint}</code> euskarriak (<code>{device}</code> gailuan) edukieraren {free} ({free_percent}%) du erabilgarri oraindik ({total} orotara)!",
"apps_catalog_update_success": "Aplikazioen katalogoa eguneratu da!",
"certmanager_warning_subdomain_dns_record": "'{subdomain}' azpidomeinuak ez dauka '{domain}'(e)k duen IP bera. Ezaugarri batzuk ez dira erabilgarri egongo hau zuzendu arte eta ziurtagiri bat birsortu arte.",
"app_argument_choice_invalid": "Aukeratu ({choices}) aukeretako bat '{name}' argumenturako: '{value}' ez dago aukera horien artean",
"backup_create_size_estimation": "Fitxategiak {size} datu inguru izango ditu.",
"diagnosis_basesystem_ynh_main_version": "Zerbitzariak YunoHosten {main_version} ({repo}) darabil",
"backup_custom_backup_error": "Neurrira egindako babeskopiak ezin izan du 'babeskopia egin' urratsetik haratago egin",
"diagnosis_ip_broken_resolvconf": "Zure zerbitzarian domeinu izenaren ebazpena hondatuta dagoela dirudi, antza denez <code>/etc/resolv.conf</code> fitxategia ez dago <code>127.0.0.1</code>ra adi.",
"diagnosis_ip_no_ipv6_tip": "Dabilen IPv6 izatea ez da derrigorrezkoa zerbitzariaren funtzionamendurako, baina egokiena da interneten osasunerako. IPv6 automatikoki konfiguratu beharko luke sistemak edo telefono-konpainiak. Bestela, eskuz konfiguratu beharko zenituzke hainbat gauza <a href='https://yunohost.org/#/ipv6'>dokumentazioa</a>n azaltzen den bezala. Ezin baduzu edo IPv6 gaitzea zuretzat kontu teknikoegia baldin bada, ez duzu abisu hau zertan kontutan hartu.",
"diagnosis_http_nginx_conf_not_up_to_date_details": "Egoera konpontzeko, ikuskatu desberdintasunak <cmd> yunohost tools regen-conf nginx --dry-run --with-diff</cmd> komandoren bidez eta, proposatutako aldaketak onartzen badituzu, ezarri itzazu <cmd>yunohost tools regen-conf nginx --force</cmd> erabiliz.",
"diagnosis_domain_not_found_details": "{domain} domeinua ez da WHOISen datubasean existitzen edo iraungi da!",
"app_start_backup": "{app}(r)en babes-kopia egiteko fitxategiak hartzen…",
"app_change_url_no_script": "'{app_name}' aplikazioak ez du URLa moldatzerik onartzen momentuz. Agian eguneratu beharko zenuke.",
"app_location_unavailable": "URL hau ez dago erabilgarri edota dagoeneko instalatutako aplikazioren batekin talka egiten du:\n{apps}",
"app_not_upgraded": "'{failed_app}' aplikazioa ezin izan da eguneratu, eta horregatik ondorengo aplikazioen eguneraketak bertan behera utzi dira: {apps}",
"app_not_correctly_installed": "Ez dirudi {app} ondo instalatuta dagoenik",
"app_not_installed": "Ezinezkoa izan da {app} aurkitzea instalatutako aplikazioen zerrendan: {all_apps}",
"app_not_properly_removed": "Ezinezkoa izan da {app} guztiz ezabatzea",
"app_start_install": "{app} instalatzen…",
"app_start_restore": "{app} lehengoratzen…",
"app_unsupported_remote_type": "Aplikazioak darabilen urruneko motak ez du babesik",
"app_upgrade_several_apps": "Ondorengo aplikazioak eguneratuko dira: {apps}",
"backup_app_failed": "Ezinezkoa izan da {app}(r)en babeskopia egitea",
"backup_actually_backuping": "Bildutako fitxategiekin babeskopia sortzen…",
"backup_archive_name_exists": "Dagoeneko existitzen da izen bera duen babeskopia fitxategi bat.",
"backup_archive_name_unknown": "Ez da '{name}' izeneko babeskopia ezagutzen",
"backup_archive_open_failed": "Ezin izan da babeskopien fitxategia ireki",
"backup_archive_system_part_not_available": "'{part}' sistemaren atala ez dago erabilgarri babeskopia honetan",
"backup_archive_writing_error": "Ezin izan da '{source}' ('{dest}' fitxategiak eskatu dituenak) fitxategia '{archive}' konprimatutako babeskopian sartu",
"backup_ask_for_copying_if_needed": "Denbora batez {size}MB erabili nahi dituzu babeskopia gauzatu ahal izateko? (Horrela egiten da fitxategi batzuk ezin direlako modu eraginkorragoan prestatu.)",
"backup_cant_mount_uncompress_archive": "Ezin izan da deskonprimatutako fitxategia muntatu idazketa-babesa duelako",
"backup_created": "Egin da babeskopia",
"backup_copying_to_organize_the_archive": "{size}MB kopiatzen fitxategia antolatzeko",
"backup_couldnt_bind": "Ezin izan da {src} {dest}-ra lotu.",
"backup_output_directory_forbidden": "Aukeratu beste katalogo bat emaitza gordetzeko. Babeskopiak ezin dira sortu /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var or /home/yunohost.backup/archives azpi-katalogoetan",
"backup_output_directory_not_empty": "Aukeratu hutsik dagoen katalogo bat",
"backup_running_hooks": "Babeskopien kakoak exekutatzen…",
"backup_unable_to_organize_files": "Ezin izan da modu azkarra erabili fitxategiko artxiboak prestatzeko",
"backup_output_symlink_dir_broken": "'{path}' fitxategi-katalogoaren symlink-a ez dabil. Agian [ber]muntatzea ahaztu zaizu edo euskarria atakara konektatzea ahaztu duzu.",
"backup_with_no_backup_script_for_app": "'{app}' aplikazioak ez du babeskopia egiteko agindurik. Ez da kontutan hartuko.",
"backup_with_no_restore_script_for_app": "{app}(e)k ez du lehengoratzeko agindurik, ezingo duzu aplikazio hau automatikoki lehengoratu.",
"certmanager_attempt_to_renew_nonLE_cert": "'{domain}' domeinurako ziurtagiria ez da Let's Encryptek jaulkitakoa. Ezin da automatikoki berriztu!",
"certmanager_attempt_to_renew_valid_cert": "'{domain}' domeinurako ziurtagiria iraungitzear dago! (Zertan ari zaren baldin badakizu, --force erabil dezakezu)",
"certmanager_cannot_read_cert": "Arazoren bat egon da {domain} (fitxategia: {file}) domeinurako oraingo ziurtagiria irekitzen saiatzerakoan, arrazoia: {reason}",
"certmanager_cert_install_success": "Let's Encrypt ziurtagiria instalatu da '{domain}' domeinurako",
"certmanager_cert_install_success_selfsigned": "Norberak sinatutako ziurtagiria instalatu da '{domain}' domeinurako",
"certmanager_domain_cert_not_selfsigned": "{domain} domeinurako ziurtagiria ez da norberak sinatutakoa. Ziur al zaude ordezkatzeaz? (Erabili '--force' hori egiteko.)",
"certmanager_certificate_fetching_or_enabling_failed": "{domain} domeinurako ziurtagiri berriak kale egin du…",
"certmanager_domain_http_not_working": "Ez dirudi {domain} domeinua HTTP bidez ikusgai dagoenik. Mesedez, egiaztatu 'Web' kategoria diagnosien gunean informazio gehiagorako. (zertan ari zaren baldin badakizu, erabili '--no-checks' egiaztapen horiek desgaitzeko.)",
"certmanager_hit_rate_limit": "{domain} domeinu-multzurako ziurtagiri gehiegi jaulki dira dagoeneko. Mesedez, saia saitez geroago. Ikus https://letsencrypt.org/docs/rate-limits/ xehetasun gehiagorako",
"certmanager_no_cert_file": "Ezin izan da ziurtagiri fitxategia irakurri {domain} (fitxategia: {file}) domeinurako",
"certmanager_self_ca_conf_file_not_found": "Ezin izan da konfigurazio-fitxategia aurkitu norberak sinatutako ziurtagirirako (fitxategia: {file})",
"confirm_app_install_warning": "Adi: litekeena da aplikazio hau ibiltzea baina ez dago YunoHostera egina. Ezaugarri batzuk, SSO edo babeskopia/lehengoratzea esaterako, desgaituta egon daitezke. Instalatu hala ere? [{answers}] ",
"diagnosis_description_ports": "Ataken irisgarritasuna",
"backup_archive_corrupted": "Badirudi '{archive}' babeskopia fitxategia hondatuta dagoela: {error}",
"diagnosis_ip_local": "IP lokala: <code>{local}</code>",
"diagnosis_mail_blacklist_reason": "Zerrenda beltzean egotearen arrazoia zera da: {reason}",
"app_removed": "{app} desinstalatu da",
"backup_cleaning_failed": "Ezin izan da behin-behineko babeskopien karpeta hustu",
"certmanager_attempt_to_replace_valid_cert": "{domain} domeinurako egokia eta baliogarria den ziurtagiri bat ordezkatzen saiatzen ari zara! (Erabili --force mezu hau deuseztatu eta ziurtagiria ordezkatzeko)",
"diagnosis_backports_in_sources_list": "Dirudienez apt (pakete kudeatzailea) backports biltegia erabiltzeko konfiguratuta dago. Zertan ari zaren ez badakizu, ez zenuke backports biltegietako aplikaziorik instalatu beharko, ezegonkortasun eta gatazkak eragin ditzaketelako sistemarekin.",
"app_restore_failed": "Ezinezkoa izan da {app} lehengoratzea: {error}",
"diagnosis_apps_allgood": "Instalatutako aplikazioek oinarrizko pakete-jarraibideekin bat egiten dute",
"diagnosis_apps_bad_quality": "Aplikazio hau hondatuta dagoela dio YunoHosten aplikazioen katalogoak. Agian behin-behineko kontua da arduradunak arazoa konpondu bitartean. Momentuz, ezin da aplikazioa eguneratu.",
"diagnosis_apps_broken": "Aplikazio hau hondatuta dagoela ageri da YunoHosten aplikazioen katalogoan. Agian, behin-behineko kontua da arduradunak konpondu bitartean. Momentuz, ezin da aplikazioa eguneratu.",
"diagnosis_apps_deprecated_practices": "Instalatutako aplikazio honen bertsioak oraindik darabil zaharkitutako pakete-jarraibideak. Eguneratzea hausnartu beharko zenuke.",
"diagnosis_apps_issue": "Arazo bat dago {app} aplikazioarekin",
"diagnosis_apps_not_in_app_catalog": "Aplikazio hau ez da YunoHosten aplikazioen katalogokoa. Iraganean egon bazen eta ezabatu izan balitz, desinstalatzea litzateke onena, ez baitu eguneraketarik jasoko eta sistemaren integritate eta segurtasuna arriskuan jarri lezake.",
"diagnosis_apps_outdated_ynh_requirement": "Instalatutako aplikazio honen bertsioak yunohost >= 2.x baino ez du behar, eta horrek egungo pakete-jardunbideekin bat ez datorrela iradokitzen du. Eguneratzen saiatu beharko zinateke.",
"diagnosis_description_apps": "Aplikazioak"
}

View file

@ -685,7 +685,7 @@
"domain_dns_registrar_managed_in_parent_domain": "Ce domaine est un sous-domaine de {parent_domain_link}. La configuration du registrar DNS doit être gérée dans le panneau de configuration de {parent_domain}.",
"domain_dns_registrar_not_supported": "YunoHost n'a pas pu détecter automatiquement le bureau d'enregistrement gérant ce domaine. Vous devez configurer manuellement vos enregistrements DNS en suivant la documentation sur https://yunohost.org/dns.",
"domain_dns_registrar_experimental": "Jusqu'à présent, l'interface avec l'API de **{registrar}** n'a pas été correctement testée et revue par la communauté YunoHost. L'assistance est **très expérimentale** - soyez prudent !",
"domain_dns_push_failed_to_authenticate": "Échec de l'authentification sur l'API du bureau d'enregistrement pour le domaine « {domain} ». Très probablement les informations d'identification sont incorrectes? (Erreur: {error})",
"domain_dns_push_failed_to_authenticate": "Échec de l'authentification sur l'API du registrar gérant la réservation de votre nom de domaine internet pour '{domain}'. Il est très probable que les informations d'identification soient incorrectes ? (Erreur : {error})",
"domain_dns_push_failed_to_list": "Échec de la liste des enregistrements actuels à l'aide de l'API du registraire : {error}",
"domain_dns_push_already_up_to_date": "Dossiers déjà à jour.",
"domain_dns_pushing": "Transmission des enregistrements DNS...",
@ -709,5 +709,6 @@
"diagnosis_http_special_use_tld": "Le domaine {domain} est basé sur un domaine de premier niveau (TLD) à usage spécial tel que .local ou .test et n'est donc pas censé être exposé en dehors du réseau local.",
"domain_dns_conf_special_use_tld": "Ce domaine est basé sur un domaine de premier niveau (TLD) à usage spécial tel que .local ou .test et ne devrait donc pas avoir d'enregistrements DNS réels.",
"other_available_options": "... et {n} autres options disponibles non affichées",
"domain_config_auth_consumer_key": "Consumer key"
"domain_config_auth_consumer_key": "Consumer key",
"domain_unknown": "Domaine '{domain}' inconnu"
}

View file

@ -709,5 +709,6 @@
"domain_dns_push_not_applicable": "A función de rexistro DNS automático non é aplicable ao dominio {domain}. Debes configurar manualmente os teus rexistros DNS seguindo a documentación de https://yunohost.org/dns_config.",
"domain_dns_push_managed_in_parent_domain": "A función de rexistro DNS automático está xestionada polo dominio nai {parent_domain}.",
"ldap_attribute_already_exists": "Xa existe o atributo LDAP '{attribute}' con valor '{value}'",
"log_domain_config_set": "Actualizar configuración para o dominio '{}'"
"log_domain_config_set": "Actualizar configuración para o dominio '{}'",
"domain_unknown": "Dominio '{domain}' descoñecido"
}

View file

@ -5,29 +5,74 @@
"admin_password_changed": "Пароль администратора был изменен",
"app_already_installed": "{app} уже установлено",
"app_already_installed_cant_change_url": "Это приложение уже установлено. URL не может быть изменен только с помощью этой функции. Изучите `app changeurl`, если это доступно.",
"app_argument_choice_invalid": "Неверный выбор для аргумента '{name}', Это должно быть '{choices}'",
"app_argument_invalid": "Недопустимое значение аргумента '{name}': {error}'",
"app_argument_choice_invalid": "Выберите корректное значение аргумента '{name}'; '{value}' не входит в число возможных вариантов: '{choices}'",
"app_argument_invalid": "Недопустимое значение аргумента '{name}': {error}",
"app_already_up_to_date": "{app} уже обновлено",
"app_argument_required": "Аргумент '{name}' необходим",
"app_change_url_identical_domains": "Старый и новый domain/url_path идентичны ('{domain}{path}'), ничего делать не надо.",
"app_change_url_no_script": "Приложение '{app_name}' не поддерживает изменение url. Наверное, вам нужно обновить приложение.",
"app_change_url_success": "Успешно изменён {app} url на {domain}{path}",
"app_extraction_failed": "Невозможно извлечь файлы для инсталляции",
"app_id_invalid": "Неправильный id приложения",
"app_install_files_invalid": "Неправильные файлы инсталляции",
"app_location_unavailable": "Этот url отсутствует или конфликтует с уже установленным приложением или приложениями: {apps}",
"app_change_url_no_script": "Приложение '{app_name}' не поддерживает изменение URL. Возможно, вам нужно обновить приложение.",
"app_change_url_success": "Успешно изменён URL {app} на {domain}{path}",
"app_extraction_failed": "Невозможно извлечь файлы для установки",
"app_id_invalid": "Неправильный ID приложения",
"app_install_files_invalid": "Эти файлы не могут быть установлены",
"app_location_unavailable": "Этот URL отсутствует или конфликтует с уже установленным приложением или приложениями:\n{apps}",
"app_manifest_invalid": "Недопустимый манифест приложения: {error}",
"app_not_correctly_installed": "{app} , кажется, установлены неправильно",
"app_not_installed": "{app} не установлены",
"app_not_installed": "{app} не найдено в списке установленных приложений: {all_apps}",
"app_not_properly_removed": "{app} удалены неправильно",
"app_removed": "{app} удалено",
"app_requirements_checking": "Проверяю необходимые пакеты для {app}...",
"app_sources_fetch_failed": "Невозможно получить исходные файлы",
"app_requirements_checking": "Проверка необходимых пакетов для {app}...",
"app_sources_fetch_failed": "Невозможно получить исходные файлы, проверьте правильность URL",
"app_unknown": "Неизвестное приложение",
"app_upgrade_app_name": "Обновление приложения {app}...",
"app_upgrade_failed": "Невозможно обновить {app}",
"app_upgrade_some_app_failed": "Невозможно обновить некоторые приложения",
"app_upgrade_app_name": "Обновление {app}...",
"app_upgrade_failed": "Невозможно обновить {app}: {error}",
"app_upgrade_some_app_failed": "Некоторые приложения не удалось обновить",
"app_upgraded": "{app} обновлено",
"installation_complete": "Установка завершена",
"password_too_simple_1": "Пароль должен быть не менее 8 символов"
}
"password_too_simple_1": "Пароль должен быть не менее 8 символов",
"admin_password_too_long": "Пожалуйста, выберите пароль короче 127 символов",
"password_listed": "Этот пароль является одним из наиболее часто используемых паролей в мире. Пожалуйста, выберите что-то более уникальное.",
"backup_applying_method_copy": "Копирование всех файлов в резервную копию...",
"domain_dns_conf_is_just_a_recommendation": "Эта страница показывает вам *рекомендуемую* конфигурацию. Она *не* создаёт для вас конфигурацию DNS. Вы должны сами конфигурировать зону вашего DNS у вашего регистратора в соответствии с этой рекомендацией.",
"good_practices_about_user_password": "Выберите пароль пользователя длиной не менее 8 символов, хотя рекомендуется использовать более длинные (например, парольную фразу) и / или использовать символы различного типа (прописные, строчные буквы, цифры и специальные символы).",
"password_too_simple_3": "Пароль должен содержать не менее 8 символов и содержать цифры, заглавные и строчные буквы и специальные символы",
"upnp_enabled": "UPnP включён",
"user_deleted": "Пользователь удалён",
"ask_lastname": "Фамилия",
"app_action_broke_system": "Это действие, по-видимому, нарушило эти важные службы: {services}",
"already_up_to_date": "Ничего делать не требуется. Всё уже обновлено.",
"operation_interrupted": "Действие было прервано вручную?",
"user_created": "Пользователь создан",
"aborting": "Прерывание.",
"ask_firstname": "Имя",
"ask_main_domain": "Основной домен",
"ask_new_admin_password": "Новый пароль администратора",
"ask_new_domain": "Новый домен",
"ask_new_path": "Новый путь",
"ask_password": "Пароль",
"app_remove_after_failed_install": "Удаление приложения после сбоя установки...",
"app_upgrade_script_failed": "Внутри скрипта обновления приложения произошла ошибка",
"upnp_disabled": "UPnP отключён",
"app_manifest_install_ask_domain": "Выберите домен, в котором должно быть установлено это приложение",
"app_manifest_install_ask_path": "Выберите URL путь (часть после домена), по которому должно быть установлено это приложение",
"app_manifest_install_ask_admin": "Выберите пользователя администратора для этого приложения",
"app_manifest_install_ask_password": "Выберите пароль администратора для этого приложения",
"app_manifest_install_ask_is_public": "Должно ли это приложение быть открыто для анонимных посетителей?",
"apps_already_up_to_date": "Все приложения уже обновлены",
"app_full_domain_unavailable": "Извините, это приложение должно быть установлено в собственном домене, но другие приложения уже установлены в домене '{domain}'. Вместо этого вы можете использовать отдельный поддомен для этого приложения.",
"app_install_script_failed": "Произошла ошибка в скрипте установки приложения",
"apps_catalog_update_success": "Каталог приложений был обновлён!",
"apps_catalog_updating": "Обновление каталога приложений...",
"yunohost_installing": "Установка YunoHost...",
"app_start_remove": "Удаление {app}...",
"app_label_deprecated": "Эта команда устарела! Пожалуйста, используйте новую команду 'yunohost user permission update', чтобы управлять ярлыком приложения.",
"app_start_restore": "Восстановление {app}...",
"app_upgrade_several_apps": "Будут обновлены следующие приложения: {apps}",
"password_too_simple_2": "Пароль должен содержать не менее 8 символов и включать цифры, заглавные и строчные буквы",
"password_too_simple_4": "Пароль должен содержать не менее 12 символов и включать цифры, заглавные и строчные буквы и специальные символы",
"upgrade_complete": "Обновление завершено",
"user_unknown": "Неизвестный пользователь: {user}",
"yunohost_already_installed": "YunoHost уже установлен",
"yunohost_configured": "Теперь YunoHost настроен",
"upgrading_packages": "Обновление пакетов..."
}

1
locales/sl.json Normal file
View file

@ -0,0 +1 @@
{}

View file

@ -709,5 +709,6 @@
"other_available_options": "...і {n} інших доступних опцій, які не показано",
"domain_dns_pushing": "Передання записів DNS...",
"ldap_attribute_already_exists": "Атрибут LDAP '{attribute}' вже існує зі значенням '{value}'",
"domain_dns_push_already_up_to_date": "Записи вже оновлені, нічого не потрібно робити."
"domain_dns_push_already_up_to_date": "Записи вже оновлені, нічого не потрібно робити.",
"domain_unknown": "Домен '{domain}' є невідомим"
}

View file

@ -1608,14 +1608,9 @@ def app_config_set(
class AppConfigPanel(ConfigPanel):
def __init__(self, app):
# Check app is installed
_assert_is_installed(app)
self.app = app
config_path = os.path.join(APPS_SETTING_PATH, app, "config_panel.toml")
super().__init__(config_path=config_path)
entity_type = "app"
save_path_tpl = os.path.join(APPS_SETTING_PATH, "{entity}/settings.yml")
config_path_tpl = os.path.join(APPS_SETTING_PATH, "{entity}/config_panel.toml")
def _load_current_values(self):
self.values = self._call_config_script("show")
@ -1639,7 +1634,9 @@ class AppConfigPanel(ConfigPanel):
from yunohost.hook import hook_exec
# Add default config script if needed
config_script = os.path.join(APPS_SETTING_PATH, self.app, "scripts", "config")
config_script = os.path.join(
APPS_SETTING_PATH, self.entity, "scripts", "config"
)
if not os.path.exists(config_script):
logger.debug("Adding a default config script")
default_script = """#!/bin/bash
@ -1651,15 +1648,15 @@ ynh_app_config_run $1
# Call config script to extract current values
logger.debug(f"Calling '{action}' action from config script")
app_id, app_instance_nb = _parse_app_instance_name(self.app)
app_id, app_instance_nb = _parse_app_instance_name(self.entity)
settings = _get_app_settings(app_id)
env.update(
{
"app_id": app_id,
"app": self.app,
"app": self.entity,
"app_instance_nb": str(app_instance_nb),
"final_path": settings.get("final_path", ""),
"YNH_APP_BASEDIR": os.path.join(APPS_SETTING_PATH, self.app),
"YNH_APP_BASEDIR": os.path.join(APPS_SETTING_PATH, self.entity),
}
)

View file

@ -102,7 +102,7 @@ def domain_list(exclude_subdomains=False):
def _assert_domain_exists(domain):
if domain not in domain_list()["domains"]:
raise YunohostValidationError("domain_name_unknown", domain=domain)
raise YunohostValidationError("domain_unknown", domain=domain)
def _list_subdomains_of(parent_domain):
@ -452,14 +452,9 @@ def domain_config_set(
class DomainConfigPanel(ConfigPanel):
def __init__(self, domain):
_assert_domain_exists(domain)
self.domain = domain
self.save_mode = "diff"
super().__init__(
config_path=DOMAIN_CONFIG_PATH,
save_path=f"{DOMAIN_SETTINGS_DIR}/{domain}.yml",
)
entity_type = "domain"
save_path_tpl = f"{DOMAIN_SETTINGS_DIR}/{{entity}}.yml"
save_mode = "diff"
def _get_toml(self):
from yunohost.dns import _get_registrar_config_section
@ -467,9 +462,9 @@ class DomainConfigPanel(ConfigPanel):
toml = super()._get_toml()
toml["feature"]["xmpp"]["xmpp"]["default"] = (
1 if self.domain == _get_maindomain() else 0
1 if self.entity == _get_maindomain() else 0
)
toml["dns"]["registrar"] = _get_registrar_config_section(self.domain)
toml["dns"]["registrar"] = _get_registrar_config_section(self.entity)
# FIXME: Ugly hack to save the registar id/value and reinject it in _load_current_values ...
self.registar_id = toml["dns"]["registrar"]["registrar"]["value"]

View file

@ -3,7 +3,7 @@ import os
from moulinette.core import MoulinetteError
from yunohost.utils.error import YunohostValidationError
from yunohost.utils.error import YunohostError, YunohostValidationError
from yunohost.domain import (
DOMAIN_SETTINGS_DIR,
_get_maindomain,
@ -114,5 +114,5 @@ def test_domain_config_set():
def test_domain_configs_unknown():
with pytest.raises(YunohostValidationError):
with pytest.raises(YunohostError):
domain_config_get(TEST_DOMAINS[2], "feature.xmpp.xmpp.xmpp")

View file

@ -221,7 +221,7 @@ def test_create_user_already_exists(mocker):
def test_create_user_with_domain_that_doesnt_exists(mocker):
with raiseYunohostError(mocker, "domain_name_unknown"):
with raiseYunohostError(mocker, "domain_unknown"):
user_create("alice", "Alice", "White", "doesnt.exists", "test123Ynh")

View file

@ -19,6 +19,7 @@
"""
import glob
import os
import re
import urllib.parse
@ -27,7 +28,7 @@ import shutil
import ast
import operator as op
from collections import OrderedDict
from typing import Optional, Dict, List, Union, Any, Mapping
from typing import Optional, Dict, List, Union, Any, Mapping, Callable
from moulinette.interfaces.cli import colorize
from moulinette import Moulinette, m18n
@ -189,13 +190,64 @@ def evaluate_simple_js_expression(expr, context={}):
class ConfigPanel:
def __init__(self, config_path, save_path=None):
entity_type = "config"
save_path_tpl = None
config_path_tpl = "/usr/share/yunohost/other/config_{entity_type}.toml"
save_mode = "full"
@classmethod
def list(cls):
"""
List available config panel
"""
try:
entities = [
re.match(
"^" + cls.save_path_tpl.format(entity="(?p<entity>)") + "$", f
).group("entity")
for f in glob.glob(cls.save_path_tpl.format(entity="*"))
if os.path.isfile(f)
]
except FileNotFoundError:
entities = []
return entities
def __init__(self, entity, config_path=None, save_path=None, creation=False):
self.entity = entity
self.config_path = config_path
if not config_path:
self.config_path = self.config_path_tpl.format(
entity=entity, entity_type=self.entity_type
)
self.save_path = save_path
if not save_path and self.save_path_tpl:
self.save_path = self.save_path_tpl.format(entity=entity)
self.config = {}
self.values = {}
self.new_values = {}
if (
self.save_path
and self.save_mode != "diff"
and not creation
and not os.path.exists(self.save_path)
):
raise YunohostValidationError(
f"{self.entity_type}_unknown", **{self.entity_type: entity}
)
if self.save_path and creation and os.path.exists(self.save_path):
raise YunohostValidationError(
f"{self.entity_type}_exists", **{self.entity_type: entity}
)
# Search for hooks in the config panel
self.hooks = {
func: getattr(self, func)
for func in dir(self)
if callable(getattr(self, func))
and re.match("^(validate|post_ask)__", func)
}
def get(self, key="", mode="classic"):
self.filter_key = key or ""
@ -274,19 +326,12 @@ class ConfigPanel:
# Import and parse pre-answered options
logger.debug("Import and parse pre-answered options")
args = urllib.parse.parse_qs(args or "", keep_blank_values=True)
self.args = {key: ",".join(value_) for key, value_ in args.items()}
if args_file:
# Import YAML / JSON file but keep --args values
self.args = {**read_yaml(args_file), **self.args}
if value is not None:
self.args = {self.filter_key.split(".")[-1]: value}
self._parse_pre_answered(args, value, args_file)
# Read or get values and hydrate the config
self._load_current_values()
self._hydrate()
Question.operation_logger = operation_logger
self._ask()
if operation_logger:
@ -525,7 +570,15 @@ class ConfigPanel:
display_header(f"\n# {name}")
# Check and ask unanswered questions
questions = ask_questions_and_parse_answers(section["options"], self.args)
prefilled_answers = self.args.copy()
prefilled_answers.update(self.new_values)
questions = ask_questions_and_parse_answers(
section["options"],
prefilled_answers=prefilled_answers,
current_values=self.values,
hooks=self.hooks,
)
self.new_values.update(
{
question.name: question.value
@ -543,20 +596,42 @@ class ConfigPanel:
if "default" in option
}
@property
def future_values(self): # TODO put this in ConfigPanel ?
return {**self.values, **self.new_values}
def __getattr__(self, name):
if "new_values" in self.__dict__ and name in self.new_values:
return self.new_values[name]
if "values" in self.__dict__ and name in self.values:
return self.values[name]
return self.__dict__[name]
def _load_current_values(self):
"""
Retrieve entries in YAML file
And set default values if needed
"""
# Retrieve entries in the YAML
on_disk_settings = {}
if os.path.exists(self.save_path) and os.path.isfile(self.save_path):
on_disk_settings = read_yaml(self.save_path) or {}
# Inject defaults if needed (using the magic .update() ;))
self.values = self._get_default_values()
self.values.update(on_disk_settings)
# Retrieve entries in the YAML
if os.path.exists(self.save_path) and os.path.isfile(self.save_path):
self.values.update(read_yaml(self.save_path) or {})
def _parse_pre_answered(self, args, value, args_file):
args = urllib.parse.parse_qs(args or "", keep_blank_values=True)
self.args = {key: ",".join(value_) for key, value_ in args.items()}
if args_file:
# Import YAML / JSON file but keep --args values
self.args = {**read_yaml(args_file), **self.args}
if value is not None:
self.args = {self.filter_key.split(".")[-1]: value}
def _apply(self):
logger.info("Saving the new configuration...")
@ -564,7 +639,7 @@ class ConfigPanel:
if not os.path.exists(dir_path):
mkdir(dir_path, mode=0o700)
values_to_save = {**self.values, **self.new_values}
values_to_save = self.future_values
if self.save_mode == "diff":
defaults = self._get_default_values()
values_to_save = {
@ -587,8 +662,8 @@ class ConfigPanel:
if services_to_reload:
logger.info("Reloading services...")
for service in services_to_reload:
if hasattr(self, "app"):
service = service.replace("__APP__", self.app)
if hasattr(self, "entity"):
service = service.replace("__APP__", self.entity)
service_reload_or_restart(service)
def _iterate(self, trigger=["option"]):
@ -607,13 +682,19 @@ class Question(object):
hide_user_input_in_prompt = False
pattern: Optional[Dict] = None
def __init__(self, question: Dict[str, Any], context: Mapping[str, Any] = {}):
def __init__(
self,
question: Dict[str, Any],
context: Mapping[str, Any] = {},
hooks: Dict[str, Callable] = {},
):
self.name = question["name"]
self.context = context
self.hooks = hooks
self.type = question.get("type", "string")
self.default = question.get("default", None)
self.optional = question.get("optional", False)
self.visible = question.get("visible", None)
self.context = context
self.choices = question.get("choices", [])
self.pattern = question.get("pattern", self.pattern)
self.ask = question.get("ask", {"en": self.name})
@ -623,6 +704,8 @@ class Question(object):
self.current_value = question.get("current_value")
# .value is the "proposed" value which we got from the user
self.value = question.get("value")
# Use to return several values in case answer is in mutipart
self.values = {}
# Empty value is parsed as empty string
if self.default == "":
@ -663,8 +746,8 @@ class Question(object):
# - we doesn't want to give a specific value
# - we want to keep the previous value
# - we want the default value
self.value = None
return self.value
self.value = self.values[self.name] = None
return self.values
for i in range(5):
# Display question if no value filled or if it's a readonly message
@ -698,9 +781,14 @@ class Question(object):
break
self.value = self._post_parse_value()
self.value = self.values[self.name] = self._post_parse_value()
return self.value
# Search for post actions in hooks
post_hook = f"post_ask__{self.name}"
if post_hook in self.hooks:
self.values.update(self.hooks[post_hook](self))
return self.values
def _prevalidate(self):
if self.value in [None, ""] and not self.optional:
@ -864,8 +952,10 @@ class PasswordQuestion(Question):
default_value = ""
forbidden_chars = "{}"
def __init__(self, question, context: Mapping[str, Any] = {}):
super().__init__(question, context)
def __init__(
self, question, context: Mapping[str, Any] = {}, hooks: Dict[str, Callable] = {}
):
super().__init__(question, context, hooks)
self.redact = True
if self.default is not None:
raise YunohostValidationError(
@ -983,8 +1073,10 @@ class BooleanQuestion(Question):
choices="yes/no",
)
def __init__(self, question, context: Mapping[str, Any] = {}):
super().__init__(question, context)
def __init__(
self, question, context: Mapping[str, Any] = {}, hooks: Dict[str, Callable] = {}
):
super().__init__(question, context, hooks)
self.yes = question.get("yes", 1)
self.no = question.get("no", 0)
if self.default is None:
@ -1004,10 +1096,12 @@ class BooleanQuestion(Question):
class DomainQuestion(Question):
argument_type = "domain"
def __init__(self, question, context: Mapping[str, Any] = {}):
def __init__(
self, question, context: Mapping[str, Any] = {}, hooks: Dict[str, Callable] = {}
):
from yunohost.domain import domain_list, _get_maindomain
super().__init__(question, context)
super().__init__(question, context, hooks)
if self.default is None:
self.default = _get_maindomain()
@ -1030,11 +1124,13 @@ class DomainQuestion(Question):
class UserQuestion(Question):
argument_type = "user"
def __init__(self, question, context: Mapping[str, Any] = {}):
def __init__(
self, question, context: Mapping[str, Any] = {}, hooks: Dict[str, Callable] = {}
):
from yunohost.user import user_list, user_info
from yunohost.domain import _get_maindomain
super().__init__(question, context)
super().__init__(question, context, hooks)
self.choices = list(user_list()["users"].keys())
if not self.choices:
@ -1056,8 +1152,10 @@ class NumberQuestion(Question):
argument_type = "number"
default_value = None
def __init__(self, question, context: Mapping[str, Any] = {}):
super().__init__(question, context)
def __init__(
self, question, context: Mapping[str, Any] = {}, hooks: Dict[str, Callable] = {}
):
super().__init__(question, context, hooks)
self.min = question.get("min", None)
self.max = question.get("max", None)
self.step = question.get("step", None)
@ -1108,8 +1206,10 @@ class DisplayTextQuestion(Question):
argument_type = "display_text"
readonly = True
def __init__(self, question, context: Mapping[str, Any] = {}):
super().__init__(question, context)
def __init__(
self, question, context: Mapping[str, Any] = {}, hooks: Dict[str, Callable] = {}
):
super().__init__(question, context, hooks)
self.optional = True
self.style = question.get(
@ -1143,8 +1243,10 @@ class FileQuestion(Question):
if os.path.exists(upload_dir):
shutil.rmtree(upload_dir)
def __init__(self, question, context: Mapping[str, Any] = {}):
super().__init__(question, context)
def __init__(
self, question, context: Mapping[str, Any] = {}, hooks: Dict[str, Callable] = {}
):
super().__init__(question, context, hooks)
self.accept = question.get("accept", "")
def _prevalidate(self):
@ -1214,7 +1316,10 @@ ARGUMENTS_TYPE_PARSERS = {
def ask_questions_and_parse_answers(
raw_questions: Dict, prefilled_answers: Union[str, Mapping[str, Any]] = {}
raw_questions: Dict,
prefilled_answers: Union[str, Mapping[str, Any]] = {},
current_values: Union[str, Mapping[str, Any]] = {},
hooks: Dict[str, Callable[[], None]] = {},
) -> List[Question]:
"""Parse arguments store in either manifest.json or actions.json or from a
config panel against the user answers when they are present.
@ -1241,13 +1346,16 @@ def ask_questions_and_parse_answers(
else:
answers = {}
context = {**current_values, **answers}
out = []
for raw_question in raw_questions:
question_class = ARGUMENTS_TYPE_PARSERS[raw_question.get("type", "string")]
raw_question["value"] = answers.get(raw_question["name"])
question = question_class(raw_question, context=answers)
answers[question.name] = question.ask_if_needed()
question = question_class(raw_question, context=context, hooks=hooks)
new_values = question.ask_if_needed()
answers.update(new_values)
context.update(new_values)
out.append(question)
return out