Some checks failed
CD / Build and push images (push) Successful in 3m16s
CI / Lint, typecheck, test (push) Successful in 3m5s
CD / Deploy to Test (push) Successful in 13s
CD / Smoke tests against Test (push) Failing after 3m35s
CD / Promote to Int (push) Has been skipped
CI / Auth e2e pack (push) Successful in 5m6s
CI / Import/export fidelity gate (push) Successful in 43s
CI / Build container images (push) Has been skipped
When the api runs against a database without the setup.completedAt marker, a global SetupGuard answers every non-exempt route with 503 setup_required; only /setup/*, health probes, and the session routes stay reachable. The wizard steps (POST /setup/admin|instance|smtp| registration|complete) write straight to their production homes; the Site Admin step signs its creator in, later steps require that session. Completing sets the marker and locks every step permanently (410, also across restarts, and not reopenable via PATCH /admin/settings). SMTP entered in the wizard is verified with a live delivery test first (failure blocks the step with the transport error as detail) and then persisted to the new env-backed secret store: a mode-600 dotenv file on the new `secrets` volume (SECRETS_FILE). Explicit container env always wins over the store; empty compose-passed strings count as unset. The mail transport now resolves lazily through SmtpConfigService so wizard changes apply without a restart. SETUP_ADMIN_* env pre-seeds the whole wizard at boot for automated deploys; a backfill migration marks instances that already have a Site Admin as completed, and seed/vitest global-setup do the same for fixture databases. The setup e2e suite provisions its own fresh database (CREATE DATABASE + migrate deploy) per run. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EwZ4jR4KFAPvpjWevfUGX1
95 lines
6.3 KiB
JSON
95 lines
6.3 KiB
JSON
{
|
|
"bad_request": "Die Anfrage ist ungültig.",
|
|
"unauthorized": "Bitte melde dich an, um fortzufahren.",
|
|
"forbidden": "Dir fehlt die Berechtigung für diese Aktion.",
|
|
"not_found": "Die angeforderte Ressource existiert nicht.",
|
|
"conflict": "Die Anfrage steht im Widerspruch zum aktuellen Zustand.",
|
|
"gone": "Diese Ressource ist nicht mehr verfügbar.",
|
|
"payload_too_large": "Die übermittelten Daten sind zu groß.",
|
|
"rate_limited": "Zu viele Anfragen — bitte versuche es später erneut.",
|
|
"internal_error": "Interner Serverfehler.",
|
|
"registration_closed": "Die Registrierung ist auf dieser Instanz derzeit geschlossen.",
|
|
"token_invalid": "Dieser Link ist ungültig oder abgelaufen.",
|
|
"login_failed": "Benutzername/E-Mail oder Passwort ist falsch.",
|
|
"login_backoff": "Zu viele Fehlversuche — bitte warte ein paar Minuten.",
|
|
"email_unverified": "Bitte bestätige zuerst deine E-Mail-Adresse.",
|
|
"account_disabled": "Dieses Konto wurde deaktiviert.",
|
|
"password_incorrect": "Das aktuelle Passwort ist falsch.",
|
|
"csrf_origin_mismatch": "Die Anfrage kam von einer unerwarteten Herkunft.",
|
|
"cannot_revoke_current_session": "Beende deine aktuelle Sitzung über die Abmeldung.",
|
|
"personal_pond_undeletable": "Der persönliche Teich kann nicht gelöscht werden.",
|
|
"quota_exceeded": "Das Kontingent ist erreicht (Limit: {{limit}}).",
|
|
"slug_taken": "Dieser Adressname ist in diesem Teich bereits vergeben.",
|
|
"page_document_too_large": "Die Seite ist zu groß (Limit: {{limitBytes}} Bytes).",
|
|
"invalid_page_state": "Der übermittelte Seiteninhalt ist ungültig.",
|
|
"page_trashed": "Diese Seite wurde in den Papierkorb verschoben.",
|
|
"label_name_taken": "Ein Label mit diesem Namen existiert auf dieser Ebene bereits.",
|
|
"label_cycle": "Ein Label kann nicht in seinen eigenen Teilbaum verschoben werden.",
|
|
"label_depth_exceeded": "Labels lassen sich höchstens {{max}} Ebenen tief verschachteln.",
|
|
"label_has_pages": "Diesem Label sind noch Seiten zugeordnet; bitte bestätigen, um sie zu lösen.",
|
|
"label_wrong_pond": "Dieses Label gehört zu einem anderen Teich.",
|
|
"unsupported_file_type": "Dieser Dateityp wird nicht unterstützt.",
|
|
"upload_type_not_allowed": "Dieser Dateityp ist auf dieser Instanz nicht erlaubt.",
|
|
"file_too_large": "Die Datei ist zu groß (Limit: {{limitBytes}} Bytes).",
|
|
"converter_unavailable": "Der Dokument-Konverter ist derzeit nicht verfügbar. Bitte versuche es später erneut.",
|
|
"converter_timeout": "Die Konvertierung hat zu lange gedauert und wurde abgebrochen.",
|
|
"conversion_failed": "Dieses Dokument konnte nicht konvertiert werden.",
|
|
"renderer_unavailable": "Der PDF-Renderer ist derzeit nicht verfügbar. Bitte versuche es später erneut.",
|
|
"render_failed": "Diese Seite konnte nicht als PDF gerendert werden.",
|
|
"import_unsupported_format": "Nur Word- (.docx) und OpenDocument-Dokumente (.odt) können importiert werden.",
|
|
"network": "Der Server war nicht erreichbar.",
|
|
"grant_exists": "Diese Berechtigung existiert bereits.",
|
|
"plugin_invalid_zip": "Die hochgeladene Datei ist kein gültiges ZIP-Archiv.",
|
|
"plugin_bad_structure": "Das Plugin-Paket hat eine ungültige Struktur.",
|
|
"plugin_invalid_manifest": "Das Plugin-Manifest ist ungültig.",
|
|
"plugin_api_incompatible": "Dieses Plugin benötigt eine nicht unterstützte Plugin-API-Version.",
|
|
"plugin_too_large": "Das Plugin-Paket ist zu groß (Limit: {{limitBytes}} Bytes).",
|
|
"plugin_missing_bundle": "Ein Code-Plugin muss ein plugin.js-Bundle enthalten.",
|
|
"plugin_missing_styles": "Ein Style-Plugin muss eine styles.css-Datei enthalten.",
|
|
"plugin_css_unsafe": "Das Plugin-Stylesheet verwendet nicht erlaubte Konstrukte.",
|
|
"plugin_version_not_higher": "Ein Update muss eine höhere Version als das installierte haben.",
|
|
"plugin_required_cannot_uninstall": "Ein erforderliches Plugin kann nicht deinstalliert werden.",
|
|
"plugin_not_found": "Dieses Plugin ist nicht installiert.",
|
|
"plugin_not_optional": "Nur optionale Plugins können pro Teich aktiviert werden.",
|
|
"grant_pond_admin_scope": "Eine Teich-Admin-Berechtigung muss für den ganzen Teich und eine bestimmte Person gelten.",
|
|
"grant_pond_admin_personal_pond": "Der einzige Administrator eines persönlichen Teichs ist dessen Eigentümer.",
|
|
"grant_subject_id_mismatch": "Das Subjekt der Berechtigung ist widersprüchlich.",
|
|
"grant_scope_id_mismatch": "Der Geltungsbereich der Berechtigung ist widersprüchlich.",
|
|
"grant_scope_not_found": "Das Label oder die Seite, auf die sich diese Berechtigung bezieht, existiert in diesem Teich nicht.",
|
|
"grant_subject_not_found": "Diese Person existiert nicht.",
|
|
"grant_last_admin": "Die letzte Teich-Admin-Berechtigung kann nicht entfernt werden.",
|
|
"member_not_found": "Es existiert keine Person mit diesem Benutzernamen oder dieser E-Mail.",
|
|
"member_exists": "Diese Person ist bereits Mitglied dieses Teichs.",
|
|
"member_not_a_member": "Diese Person ist kein Mitglied dieses Teichs.",
|
|
"member_is_owner": "Die Mitgliedschaft des Teich-Eigentümers kann hier nicht geändert werden.",
|
|
"cannot_modify_self": "Du kannst diese Aktion nicht auf dein eigenes Konto anwenden.",
|
|
"last_site_admin": "Der letzte Site-Admin kann nicht entfernt werden.",
|
|
"setup_required": "Diese Instanz ist noch nicht eingerichtet. Bitte führe zuerst die Ersteinrichtung aus.",
|
|
"setup_locked": "Die Ersteinrichtung ist bereits abgeschlossen.",
|
|
"setup_admin_exists": "Es existiert bereits ein Site-Admin-Konto.",
|
|
"setup_admin_missing": "Lege zuerst das Site-Admin-Konto an.",
|
|
"smtp_test_failed": "Der SMTP-Test ist fehlgeschlagen. Bitte prüfe die Verbindungsdaten.",
|
|
"validation": {
|
|
"required": "Dieses Feld ist erforderlich.",
|
|
"taken": "Dieser Wert ist bereits vergeben.",
|
|
"username": {
|
|
"tooShort": "Der Benutzername braucht mindestens 3 Zeichen.",
|
|
"tooLong": "Der Benutzername darf höchstens 32 Zeichen haben.",
|
|
"charset": "Erlaubt sind nur Buchstaben, Ziffern und Bindestriche."
|
|
},
|
|
"password": {
|
|
"tooShort": "Das Passwort braucht mindestens 10 Zeichen.",
|
|
"tooLong": "Das Passwort darf höchstens 128 Zeichen haben.",
|
|
"tooCommon": "Dieses Passwort ist zu verbreitet."
|
|
},
|
|
"email": {
|
|
"invalid": "Bitte gib eine gültige E-Mail-Adresse ein."
|
|
},
|
|
"displayName": {
|
|
"required": "Bitte gib einen Anzeigenamen ein."
|
|
},
|
|
"labelColor": "Bitte gib eine Farbe wie #a1b2c3 ein.",
|
|
"tooLong": "Die Eingabe ist zu lang."
|
|
}
|
|
}
|