2026-02-04 23:31:53 +01:00
{
"Login" : "Login" ,
2026-03-07 21:21:47 +01:00
"Login credentials" : "Mit Zugangsdaten oder SSO anmelden" ,
2026-04-22 16:30:03 +02:00
"Login provider" : "Login-Anbieter" ,
2026-04-22 17:25:07 +02:00
"Open full page" : "Vollseite öffnen" ,
"Loading" : "Lädt" ,
"Failed to load" : "Laden fehlgeschlagen" ,
2026-02-04 23:31:53 +01:00
"Register" : "Registrieren" ,
"Password" : "Passwort" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Or" : "Oder" ,
2026-02-04 23:31:53 +01:00
"Forgot password" : "Passwort vergessen" ,
"Remember me" : "Angemeldet bleiben" ,
"Clear login tokens" : "Login-Tokens löschen" ,
"Clear all login tokens for this user?" : "Alle Login-Tokens für diesen Benutzer löschen?" ,
"Login tokens cleared" : "Login-Tokens gelöscht" ,
"Send access" : "Zugang versenden" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Access PDF" : "Zugangs-PDF" ,
"Download access PDFs" : "Zugangs-PDFs herunterladen" ,
"Generate access PDFs for selected users?" : "Zugangs-PDFs für ausgewählte Benutzer erstellen?" ,
"Too many users selected" : "Zu viele Benutzer ausgewählt" ,
"No valid users selected" : "Keine gültigen Benutzer ausgewählt" ,
"Failed to generate access PDF" : "Zugangs-PDF konnte nicht erstellt werden" ,
"ZIP support missing (ext-zip)" : "ZIP-Unterstützung fehlt (ext-zip)" ,
2026-02-04 23:31:53 +01:00
"Send access email to this user?" : "Zugangsdaten an diesen Benutzer senden?" ,
"Access email sent" : "Zugangsdaten gesendet" ,
"Access email failed" : "Zugangsdaten konnten nicht gesendet werden" ,
"Your access details" : "Deine Zugangsdaten" ,
"Reset password" : "Passwort zurücksetzen" ,
"Verification code" : "Bestätigungscode" ,
"Verify code" : "Code prüfen" ,
"Verify" : "Prüfen" ,
"Send code" : "Code senden" ,
"Send code again" : "Code erneut senden" ,
"Enter your email address and we will send you a verification code." : "Gib deine E-Mail-Adresse ein, wir senden dir einen Bestätigungscode." ,
"Enter the verification code we sent to your email." : "Gib den Bestätigungscode ein, den wir dir per E-Mail gesendet haben." ,
"Please enter a valid email address" : "Bitte gib eine gültige E-Mail-Adresse ein" ,
"Please enter the 6-digit code" : "Bitte gib den 6-stelligen Code ein" ,
"Invalid or expired code" : "Code ist ungültig oder abgelaufen" ,
"Code verified" : "Code bestätigt" ,
"Password reset code" : "Code zum Zurücksetzen des Passworts" ,
"If the email exists, a verification code has been sent." : "Falls die E-Mail existiert, wurde ein Bestätigungscode gesendet." ,
"Choose a new password for your account." : "Wähle ein neues Passwort für dein Konto." ,
"Password updated" : "Passwort aktualisiert" ,
"Password can not be updated" : "Passwort kann nicht aktualisiert werden" ,
2026-02-24 08:49:40 +01:00
"Profile can not be updated" : "Profil kann nicht aktualisiert werden" ,
2026-02-04 23:31:53 +01:00
"Reset request not found" : "Zurücksetz-Anfrage nicht gefunden" ,
"Reset request already used" : "Zurücksetz-Anfrage wurde bereits verwendet" ,
"Reset request expired" : "Zurücksetz-Anfrage ist abgelaufen" ,
"Username" : "Benutzername" ,
"Admin" : "Admin" ,
"Logout" : "Logout" ,
"Account" : "Konto" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Continue" : "Weiter" ,
2026-03-07 22:54:33 +01:00
"Show password" : "Passwort anzeigen" ,
"Hide password" : "Passwort verbergen" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Use different email" : "Andere E-Mail verwenden" ,
2026-03-07 14:10:36 +01:00
"Back to login" : "Zurück zum Login" ,
2026-03-06 21:59:41 +01:00
"Encrypted connection" : "Verschlüsselt" ,
"HTTPS/TLS 1.2+ in transit" : "HTTPS/TLS 1.2+ bei der Übertragung" ,
"Problems logging in" : "Probleme beim Login" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"We could not continue with these login details" : "Mit diesen Login-Daten konnte nicht fortgefahren werden" ,
"Cached" : "Cache" ,
2026-03-09 22:29:45 +01:00
"App identity" : "App-Identität" ,
"Configured" : "Konfiguriert" ,
"Not configured" : "Nicht konfiguriert" ,
"Theme policy" : "Theme-Richtlinie" ,
"Brand color" : "Markenfarbe" ,
"User override enabled" : "Benutzer-Override aktiviert" ,
"User override disabled" : "Benutzer-Override deaktiviert" ,
"Token lifetime policy" : "Token-Laufzeit-Richtlinie" ,
"Token operations" : "Token-Aktionen" ,
"CORS allowlist" : "CORS-Allowlist" ,
"Shared Microsoft credentials" : "Geteilte Microsoft-Zugangsdaten" ,
"Authority endpoint" : "Authority-Endpunkt" ,
"%d defaults configured" : "%d Standards konfiguriert" ,
"%d events enabled" : "%d Ereignisse aktiviert" ,
"%d origins configured" : "%d Origins konfiguriert" ,
"days" : "Tage" ,
"Leave empty to use the runtime default title." : "Leer lassen, um den Laufzeit-Standardtitel zu verwenden." ,
"Leave empty to keep the currently stored client secret." : "Leer lassen, um das aktuell gespeicherte Client-Secret beizubehalten." ,
"This setting controls the application name shown across the UI." : "Diese Einstellung steuert den in der gesamten UI angezeigten Anwendungsnamen." ,
"This setting controls the default language for users without a personal preference." : "Diese Einstellung steuert die Standardsprache für Benutzer ohne persönliche Präferenz." ,
"These defaults prefill tenant, department and role when new users are created." : "Diese Standards füllen Mandant, Abteilung und Rolle bei neu erstellten Benutzern vor." ,
"This setting controls the global default theme and whether users may choose their own theme." : "Diese Einstellung steuert das globale Standard-Theme und ob Benutzer ihr eigenes Theme wählen dürfen." ,
"This setting controls the primary UI accent color for the default app theme." : "Diese Einstellung steuert die primäre UI-Akzentfarbe des Standard-App-Themes." ,
"Telemetry helps detect recurring UI issues and failed requests in production." : "Telemetry hilft, wiederkehrende UI-Probleme und fehlgeschlagene Requests in Produktion zu erkennen." ,
"Limit which event types are collected to match your privacy and operations requirements." : "Begrenze die erfassten Ereignistypen passend zu Datenschutz- und Betriebsanforderungen." ,
"These limits define default and maximum lifetimes for newly issued API tokens." : "Diese Grenzwerte definieren Standard- und Maximallaufzeit für neu ausgestellte API-Tokens." ,
"Define which origins may call your API from browsers. Use one origin per line." : "Definiere, welche Origins deine API aus Browsern aufrufen dürfen. Eine Origin pro Zeile." ,
"This action revokes all active API tokens immediately across all users." : "Diese Aktion widerruft sofort alle aktiven API-Tokens über alle Benutzer hinweg." ,
"The authority URL defines the Microsoft identity tenant endpoint used for sign-in." : "Die Authority-URL definiert den Microsoft-Identity-Tenant-Endpunkt für die Anmeldung." ,
"This will expire all remember-me tokens immediately and force users to sign in again." : "Dadurch werden alle Remember-me-Tokens sofort abgelaufen und Benutzer müssen sich erneut anmelden." ,
2026-04-01 20:27:42 +02:00
"Global settings are stored in the database. storage/runtime/settings.php is only a runtime cache for selected app settings." : "Globale Einstellungen werden in der Datenbank gespeichert. storage/runtime/settings.php ist nur ein Laufzeit-Cache für ausgewählte App-Einstellungen." ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Too many login attempts. Please wait and try again." : "Zu viele Login-Versuche. Bitte warte kurz und versuche es erneut." ,
"No login method is available for this tenant" : "Für diesen Mandanten ist keine Login-Methode verfügbar" ,
2026-02-04 23:31:53 +01:00
"Create your account" : "Erstelle dein Konto" ,
"First name" : "Vorname" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Name" : "Name" ,
2026-02-04 23:31:53 +01:00
"Last name" : "Nachname" ,
"Email" : "E-Mail" ,
"Password (again)" : "Passwort bestätigen" ,
"Password requirements" : "Passwort-Anforderungen" ,
"At least %d characters" : "Mindestens %d Zeichen" ,
"At least one uppercase letter" : "Mindestens ein Großbuchstabe" ,
"At least one lowercase letter" : "Mindestens ein Kleinbuchstabe" ,
"At least one number" : "Mindestens eine Zahl" ,
"At least one symbol" : "Mindestens ein Sonderzeichen" ,
"Must not contain your email" : "Darf deine E-Mail nicht enthalten" ,
"Email/password not valid" : "E-Mail oder Passwort ist ungültig" ,
"First name cannot be empty" : "Vorname darf nicht leer sein" ,
"Last name cannot be empty" : "Nachname darf nicht leer sein" ,
"Email cannot be empty" : "E-Mail darf nicht leer sein" ,
"Email is not valid" : "E-Mail ist ungültig" ,
"Password cannot be empty" : "Passwort darf nicht leer sein" ,
"Passwords must match" : "Passwörter müssen übereinstimmen" ,
"Password must be at least %d characters" : "Passwort muss mindestens %d Zeichen haben" ,
"Password must include an uppercase letter" : "Passwort muss einen Großbuchstaben enthalten" ,
"Password must include a lowercase letter" : "Passwort muss einen Kleinbuchstaben enthalten" ,
"Password must include a number" : "Passwort muss eine Zahl enthalten" ,
"Password must include a symbol" : "Passwort muss ein Sonderzeichen enthalten" ,
"Password must not contain your email" : "Passwort darf deine E-Mail nicht enthalten" ,
"Email is already taken" : "E-Mail ist bereits vergeben" ,
"User can not be registered" : "Benutzer kann nicht registriert werden" ,
"Language not supported" : "Sprache wird nicht unterstützt" ,
"Language" : "Sprache" ,
"Sales" : "Vertrieb" ,
"Master data" : "Stammdaten" ,
"Organization" : "Organisation" ,
"Roles & permissions" : "Rollen & Rechte" ,
"Permissions" : "Berechtigungen" ,
"Permission key" : "Berechtigungs-Schlüssel" ,
"Create permission" : "Berechtigung erstellen" ,
"Edit permission" : "Berechtigung bearbeiten" ,
2026-03-22 22:28:19 +01:00
"View permission" : "Berechtigung anzeigen" ,
2026-02-04 23:31:53 +01:00
"Delete this permission?" : "Diese Berechtigung löschen?" ,
"Permission created" : "Berechtigung erstellt" ,
"Permission updated" : "Berechtigung aktualisiert" ,
"Permission deleted" : "Berechtigung gelöscht" ,
"Permission not found" : "Berechtigung nicht gefunden" ,
"Permission can not be created" : "Berechtigung kann nicht erstellt werden" ,
"Permission can not be updated" : "Berechtigung kann nicht aktualisiert werden" ,
"Permission key cannot be empty" : "Berechtigungs-Schlüssel darf nicht leer sein" ,
"Permission key is invalid" : "Berechtigungs-Schlüssel ist ungültig" ,
"Permission key already exists" : "Berechtigungs-Schlüssel existiert bereits" ,
"Assigned permissions" : "Zugewiesene Berechtigungen" ,
"Select permissions" : "Berechtigungen auswählen" ,
2026-03-13 09:49:11 +01:00
"No permissions available" : "Keine Berechtigungen verfügbar" ,
feat(ui): token-select primitive for large multi-selects
Adds tokenSelectForm() in core/Support/helpers/ui.php: an inline
typeahead combobox + flat alphabetical removable list, designed for
selections that outgrow the chip-header of the vendor MultiSelect
(roles, permissions, and similar admin pickers).
Contract:
- Hidden <select multiple name="<name>[]"> is the form submission source —
consumers read via $request->body() verbatim, no parsing
- Items are ['id' => int, <labelKey> => string, 'key' => string?]
where labelKeys default to ['description', 'label', 'name']; 'key' is
an invisible fuzzy-match hint
- $labelOverrides lets callers swap emptyState / removeTooltip /
noMatches / clearAll / countSuffix / errorMessage with domain copy
- $disabled renders pure-presentation list (no combobox, no remove)
Runtime:
- initTokenSelect in web/js/components/app-token-select.js is registered
as 'token-select' in app-init.js; destroy()/cleanupFns contract
- Syncs the hidden <select> on every mutation and dispatches 'change'
so dependent UI can react
Wired up: pages/admin/permissions/_form.phtml (assigned roles),
pages/admin/roles/_form.phtml (permissions + assignable roles).
Helper contract lives in tests/Support/Helpers/TokenSelectFormHelperTest.php;
runtime contract + entrypoint registration + host usage are enforced by
FrontendRuntime*ContractTest.php.
Coexists with multiSelectForm() — pick tokenSelectForm() when the
selected set can grow beyond ~10 items or typeahead is expected.
Docs in CLAUDE.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:52:32 +02:00
"No permissions selected" : "Keine Berechtigungen ausgewählt" ,
"Remove permission" : "Berechtigung entfernen" ,
"Search permissions…" : "Berechtigungen suchen…" ,
2026-03-13 09:49:11 +01:00
"No active permissions are configured yet." : "Es sind noch keine aktiven Berechtigungen konfiguriert." ,
2026-03-13 18:56:19 +01:00
"No active roles are configured yet." : "Es sind noch keine aktiven Rollen konfiguriert." ,
2026-02-04 23:31:53 +01:00
"Permission denied" : "Keine Berechtigung" ,
"No active tenant assigned" : "Kein aktiver Mandant zugewiesen" ,
"Please select at least one tenant" : "Bitte mindestens einen Mandanten auswählen" ,
"perm.users.view" : "Benutzer anzeigen" ,
"perm.users.create" : "Benutzer erstellen" ,
"perm.users.update" : "Benutzer bearbeiten" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"perm.users.access_pdf" : "Onboarding-PDFs erstellen" ,
2026-02-04 23:31:53 +01:00
"perm.users.delete" : "Benutzer löschen" ,
"perm.users.self_update" : "Eigenen Benutzer bearbeiten" ,
"perm.users.update_assignments" : "Benutzerzuweisungen bearbeiten" ,
"Permission origin" : "Herkunft der Berechtigung" ,
"perm.tenants.view" : "Mandanten anzeigen" ,
"perm.tenants.create" : "Mandanten erstellen" ,
"perm.tenants.update" : "Mandanten bearbeiten" ,
"perm.tenants.delete" : "Mandanten löschen" ,
"perm.departments.view" : "Abteilungen anzeigen" ,
"perm.departments.create" : "Abteilungen erstellen" ,
"perm.departments.update" : "Abteilungen bearbeiten" ,
"perm.departments.delete" : "Abteilungen löschen" ,
"perm.roles.view" : "Rollen anzeigen" ,
"perm.roles.create" : "Rollen erstellen" ,
"perm.roles.update" : "Rollen bearbeiten" ,
"perm.roles.delete" : "Rollen löschen" ,
2026-03-13 21:11:48 +01:00
"perm.roles.assign_all" : "Alle Rollen zuweisen" ,
2026-02-04 23:31:53 +01:00
"perm.permissions.view" : "Berechtigungen anzeigen" ,
"perm.permissions.create" : "Berechtigungen erstellen" ,
"perm.permissions.update" : "Berechtigungen bearbeiten" ,
"perm.permissions.delete" : "Berechtigungen löschen" ,
"perm.settings.view" : "Einstellungen anzeigen" ,
"perm.settings.update" : "Einstellungen bearbeiten" ,
"perm.mail_log.view" : "E-Mail-Protokolle anzeigen" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"perm.jobs.view" : "Geplante Aufgaben anzeigen" ,
"perm.jobs.manage" : "Geplante Aufgaben verwalten" ,
"perm.jobs.run_now" : "Geplante Aufgaben manuell ausführen" ,
2026-04-24 14:46:38 +02:00
"perm.audit.api.view" : "API-Protokolle anzeigen" ,
"perm.audit.api.purge" : "API-Protokolle bereinigen" ,
"perm.audit.system.view" : "System-Protokolle anzeigen" ,
"perm.audit.system.purge" : "System-Protokolle bereinigen" ,
"perm.audit.imports.view" : "Import-Protokolle anzeigen" ,
"perm.audit.imports.purge" : "Import-Protokolle bereinigen" ,
"perm.audit.user_lifecycle.view" : "Benutzer-Lifecycle-Protokolle anzeigen" ,
"perm.audit.user_lifecycle.restore" : "Benutzer aus Lifecycle-Protokoll wiederherstellen" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"perm.user_lifecycle_audit.view" : "Benutzer-Lifecycle-Protokolle anzeigen" ,
"perm.users.lifecycle_restore" : "Benutzer aus Lifecycle-Protokoll wiederherstellen" ,
2026-02-04 23:31:53 +01:00
"Select all" : "Alle auswählen" ,
"Activate" : "Aktivieren" ,
"Deactivate" : "Deaktivieren" ,
"Delete" : "Löschen" ,
"Activate users?" : "Benutzer aktivieren?" ,
"Deactivate users?" : "Benutzer deaktivieren?" ,
"Delete users?" : "Benutzer löschen?" ,
"Send access emails to selected users?" : "Zugangsdaten an ausgewählte Benutzer senden?" ,
"%d users activated" : "%d Benutzer aktiviert" ,
"%d users deactivated" : "%d Benutzer deaktiviert" ,
"%d users deleted" : "%d Benutzer gelöscht" ,
"Access emails sent to %d users" : "Zugangsdaten an %d Benutzer gesendet" ,
"Access emails sent to %d users, %f failed" : "Zugangsdaten an %d Benutzer gesendet, %f fehlgeschlagen" ,
"Failed to activate users" : "Benutzer konnten nicht aktiviert werden" ,
"Failed to deactivate users" : "Benutzer konnten nicht deaktiviert werden" ,
"Failed to delete users" : "Benutzer konnten nicht gelöscht werden" ,
"Failed to send access emails" : "Zugangsdaten konnten nicht gesendet werden" ,
"Home" : "Home" ,
2026-03-24 22:00:14 +01:00
"Exception" : "Ausnahme" ,
"An error occurred" : "Ein Fehler ist aufgetreten" ,
"in %s on line %s" : "in %s in Zeile %s" ,
"Copy request ID" : "Request-ID kopieren" ,
"Error details" : "Fehlerdetails" ,
"Request" : "Anfrage" ,
"Queries" : "Abfragen" ,
"An unexpected error occurred. If the problem persists, please contact support with the reference below." : "Ein unerwarteter Fehler ist aufgetreten. Wenn das Problem weiterhin besteht, kontaktiere bitte den Support mit der untenstehenden Referenz." ,
"Stack Trace" : "Stack-Trace" ,
"Caused by" : "Verursacht durch" ,
"URL" : "URL" ,
"User Agent" : "User-Agent" ,
"Headers" : "Header" ,
"GET Parameters" : "GET-Parameter" ,
"POST Parameters" : "POST-Parameter" ,
"Session (keys + types)" : "Session (Schlüssel + Typen)" ,
"Context" : "Kontext" ,
"PHP" : "PHP" ,
"SAPI" : "SAPI" ,
"Memory (current)" : "Speicher (aktuell)" ,
"Memory (peak)" : "Speicher (maximal)" ,
"Application" : "Anwendung" ,
"Active Modules" : "Aktive Module" ,
"Loaded Extensions (%d)" : "Geladene Erweiterungen (%d)" ,
"Query tracking is not available (Debugger disabled or not initialized)." : "Query-Tracking ist nicht verfügbar (Debugger deaktiviert oder nicht initialisiert)." ,
"No queries were executed before the error occurred." : "Vor dem Fehler wurden keine Abfragen ausgeführt." ,
"Queries (%d)" : "Abfragen (%d)" ,
"Bad Request" : "Ungültige Anfrage" ,
"Unauthorized" : "Nicht autorisiert" ,
"Forbidden" : "Verboten" ,
"Not Found" : "Nicht gefunden" ,
"Method Not Allowed" : "Methode nicht erlaubt" ,
"Request Timeout" : "Zeitüberschreitung der Anfrage" ,
"Unprocessable Entity" : "Nicht verarbeitbare Anfrage" ,
"Too Many Requests" : "Zu viele Anfragen" ,
"Internal Server Error" : "Interner Serverfehler" ,
"Bad Gateway" : "Fehlerhaftes Gateway" ,
"Service Unavailable" : "Dienst nicht verfügbar" ,
2026-02-04 23:31:53 +01:00
"Users" : "Benutzer" ,
"Avatar" : "Avatar" ,
"Theme" : "Theme" ,
"Light" : "Hell" ,
"Dark" : "Dunkel" ,
2026-03-24 14:12:49 +01:00
"Main menu" : "Hauptmenü" ,
2026-02-04 23:31:53 +01:00
"Toggle Sidebar" : "Sidebar umschalten" ,
"Toggle Detail Sidebar" : "Detail-Seitenleiste umschalten" ,
"%d selected" : "%d ausgewählt" ,
"Create user" : "Benutzer anlegen" ,
"Edit user" : "Benutzer bearbeiten" ,
2026-03-22 22:28:19 +01:00
"View user" : "Benutzer anzeigen" ,
2026-02-04 23:31:53 +01:00
"Create" : "Erstellen" ,
"Create & close" : "Erstellen & schließen" ,
"Save" : "Speichern" ,
"Save & close" : "Speichern & schließen" ,
"Cancel" : "Abbrechen" ,
2026-03-06 00:44:52 +01:00
"Close" : "Schließen" ,
"Confirm" : "Bestätigen" ,
"Please confirm" : "Bitte bestätigen" ,
"This action cannot be undone." : "Diese Aktion kann nicht rückgängig gemacht werden." ,
2026-02-04 23:31:53 +01:00
"Active" : "Aktiv" ,
"Actions" : "Aktionen" ,
"ID" : "ID" ,
"Created" : "Erstellt" ,
"Created by" : "Erstellt von" ,
"Modified by" : "Bearbeitet von" ,
"Modified" : "Aktualisiert" ,
2026-03-05 11:17:42 +01:00
"Open" : "Öffnen" ,
2026-03-05 12:51:53 +01:00
"Press Enter to open row" : "Drücke Enter, um die Zeile zu öffnen" ,
"Retry" : "Erneut versuchen" ,
2026-02-04 23:31:53 +01:00
"Yes" : "Ja" ,
"No" : "Nein" ,
"User created" : "Benutzer erstellt" ,
"User updated" : "Benutzer aktualisiert" ,
"User deleted" : "Benutzer gelöscht" ,
"User not found" : "Benutzer nicht gefunden" ,
"User can not be updated" : "Benutzer kann nicht aktualisiert werden" ,
"Avatar updated" : "Profilbild aktualisiert" ,
"Avatar removed" : "Profilbild entfernt" ,
"Upload failed" : "Upload fehlgeschlagen" ,
"File is too large" : "Datei ist zu groß" ,
"Invalid image file" : "Ungültige Bilddatei" ,
"No file uploaded" : "Keine Datei hochgeladen" ,
"You cannot delete your own account" : "Du kannst deinen eigenen Account nicht löschen" ,
"Login required" : "Login erforderlich" ,
"You cannot deactivate your own account" : "Du kannst dein eigenes Konto nicht deaktivieren" ,
"Welcome back" : "Willkommen zurück" ,
"New password (optional)" : "Neues Passwort (optional)" ,
"Account is inactive" : "Konto ist deaktiviert" ,
"Inactive" : "Inaktiv" ,
"Filter" : "Filter" ,
2026-03-04 15:56:58 +01:00
"Apply filters" : "Filter anwenden" ,
"Clear all filters" : "Alle Filter zurücksetzen" ,
"Close filters" : "Filter schließen" ,
"Remove filter" : "Filter entfernen" ,
"Filters applied" : "Filter angewendet" ,
"Filter removed" : "Filter entfernt" ,
"All filters cleared" : "Alle Filter entfernt" ,
2026-02-04 23:31:53 +01:00
"UUID" : "UUID" ,
"Profile image" : "Profilbild" ,
"Profile" : "Profil" ,
"Profile description" : "Profilbeschreibung" ,
"Search results" : "Suchergebnisse" ,
"Result" : "Ergebnis" ,
"Type" : "Typ" ,
"Page" : "Seite" ,
"Upload image" : "Bild hochladen" ,
"App logo" : "App-Logo" ,
"Upload logo" : "Logo hochladen" ,
"Logo updated" : "Logo aktualisiert" ,
"Logo removed" : "Logo entfernt" ,
feat(tenant): per-theme logos + file-upload + button UI polish
Replace the single tenant avatar with a pair of theme-scoped brand logos.
Render only the theme-matching <img> server-side and swap src on theme
toggle via a JS hook — no reload, no double request, no CSS tricks.
Tenant logos
- TenantLogoService (ImageUploadTrait) with theme whitelist and per-theme
storage storage/tenants/{uuid}/logo/{light|dark}/, SIZES 128/256/512
- Public serving endpoint auth/tenant-logo-file so login can show the
logo pre-auth; matching authenticated admin preview endpoint
- appTenantLogoUrl(?size, ?theme) with 4-step fallback cascade; PDF +
mail always request 'light'
- Admin tenant edit: avatar block replaced by "Tenant logos" details
block inside the Master-data tab, two side-by-side slots via Pico
.grid with the core app-file-upload partial
- Policy rename ABILITY_ADMIN_TENANTS_AVATAR_VIEW -> LOGO_VIEW, action
routes logo / logo-delete / logo-file with theme body/query param
- API endpoint path kept (backward compat), internals on new service
- CLI tenant:logo-migrate-avatars moves legacy avatar/ -> logo/light/
idempotently (--dry-run, --yes, --cleanup)
- i18n "Tenant image" removed, 12 new keys synced across de/en
File upload component
- Full-width preview + filename/actions below (3D stack layout)
- Fixed 16:9 aspect ratio with 1rem inner padding for consistent
preview size across any logo aspect
- Transparency checker pattern as background so black logos stay
visible on dark mode and white logos on light mode
- form="" + deleteFormId support so the partial works with barrier
forms inside another form
Buttons
- width:100% dropped from button[type="submit"]; scoped back via
.login-main for the auth-flow primary CTA
- .outline base rule now tints background via color-mix of --app-color
so secondary/primary/danger outlines all gain a subtle surface
- .outline.secondary restyled Stripe-style in both themes: solid white
chip with soft shadow in light, solid elevated dark chip with white
text in dark; neutral border replaces role-colored border
- .app-action-success/.app-action-danger outlines get color-mix bg +
theme-aware outline-text tokens for stronger contrast
- Filled .primary/.app-action-success/.app-action-danger get raised
box-shadow (inset highlight + drop) — opt-in via class so chrome
buttons stay flat
- Dropped the legacy .secondary utility that was clobbering the
custom-property cascade with a hardcoded muted color
Theme swap
- Logo img carries data-src-light + data-src-dark; theme-toggle JS
swaps src when data-theme changes, keeping the topbar/login logo in
sync without a page reload
Quality gates: PHPUnit (2045), PHPStan L5, CS-Fixer, docs link/drift,
codex skills sync — all green.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 20:25:53 +02:00
"Tenant logos" : "Mandanten-Logos" ,
"Light logo" : "Logo (hell)" ,
"Dark logo" : "Logo (dunkel)" ,
"Upload light logo" : "Helles Logo hochladen" ,
"Upload dark logo" : "Dunkles Logo hochladen" ,
"Delete light logo" : "Helles Logo löschen" ,
"Delete dark logo" : "Dunkles Logo löschen" ,
"No logo for this theme yet" : "Für dieses Theme wurde noch kein Logo hochgeladen" ,
"Delete this logo?" : "Dieses Logo löschen?" ,
"Invalid theme" : "Ungültiges Theme" ,
"Logo" : "Logo" ,
"Remove" : "Entfernen" ,
2026-02-04 23:31:53 +01:00
"Allowed file types: SVG, PNG, JPG, WEBP" : "Erlaubte Dateitypen: SVG, PNG, JPG, WEBP" ,
"Favicon" : "Favicon" ,
refactor(file-upload): SSR-first state, click-to-replace, cleaner preview
- Server renders initial file-upload state (src, alt, label text,
has-current class) so there is no flash of broken-image icon while
JS boots. JS no longer duplicates that work — it only reacts to
user input (select, clear, drag-and-drop) and uses data-current-src
solely to restore the server file after a blob preview.
- Clicking the current preview image now opens the file dialog, mirrors
the Replace button, with hover affordance (cursor + primary border).
- Drop the transparency checker pattern in the preview — the admin UI
does not need Figma-style transparency semantics. Preview is now a
flat theme-aware surface (--app-preview-bg) that keeps white or
black logos visible against a neutral gray.
- Move tenant favicon out of the aside into the Master-data tab as its
own details block next to the Tenant-logos section. Uses the same
barrier-form pattern (HTML5 form attribute + app-file-upload.phtml)
for a consistent instant-upload UX.
- Tenant-logo slot label is a native <label> element — picks up the
global form-label typography and spacing, no custom muted-color
class needed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 20:53:58 +02:00
"Tenant favicon" : "Mandanten-Favicon" ,
"Square PNG. Icons are center-cropped." : "Quadratisches PNG. Symbole werden mittig zugeschnitten." ,
"Delete this favicon?" : "Dieses Favicon löschen?" ,
2026-02-04 23:31:53 +01:00
"Upload favicon" : "Favicon hochladen" ,
"Favicon updated" : "Favicon aktualisiert" ,
"Favicon removed" : "Favicon entfernt" ,
"Allowed file types: PNG" : "Erlaubte Dateitypen: PNG" ,
"Square images are recommended (icons are center-cropped)." : "Quadratische Bilder empfohlen (Icons werden zentriert zugeschnitten)." ,
"Primary color" : "Primärfarbe" ,
"Primary color is invalid" : "Primärfarbe ist ungültig" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"The primary color affects buttons and accent elements across the app." : "Die Primärfarbe beeinflusst Buttons und Akzent-Elemente in der gesamten App." ,
2026-02-04 23:31:53 +01:00
"Export CSV" : "CSV exportieren" ,
feat(core): generic CSV export primitive + helpdesk domains consumer
Add a reusable CSV-export building block to the core so any Grid.js list
page can gain a filter/sort-aware download with two clicks of glue.
Core primitive:
- core/Service/Export/CsvExportService: flavor-aware writer (plain CSV
or Excel-compatible UTF-8+BOM+semicolon), with OWASP-aligned formula-
injection escape (=, @, +, -, TAB, CR) applied to both rows *and*
headers. Value objects for columns (ExportColumn) carry an extractor
closure and an allowSignedNumeric flag for phone-number-shaped cells.
- core/Support/helpers/export.php: thin HTTP layer (exportSendCsv,
exportCapLimit, exportResolveFlavor, exportRequireGetRequest) reusing
the requestInput() contract for GR-CORE-003 consistency. Filename is
sanitized and length-clamped; callers must still enforce auth.
- templates/partials/app-list-export-dropdown.phtml: zero-config
<details class="dropdown"> with CSV + Excel triggers.
- web/js/core/app-list-export.js: initListExport({ gridConfig, exportUrl })
mirrors the current grid filters + sort onto the export URL and
navigates, preserving session cookies for download.
First consumer — Helpdesk domains:
- DomainListService extracts the shared filter/enrich/sort logic from
domains-data so the grid endpoint and the new domains/export endpoint
cannot drift.
- domains/export endpoint delegates to DomainListService, declares
ExportColumns (with translated level labels), and exits via
exportSendCsv.
- domains-data now ~20 lines, delegating to DomainListService.
Tests:
- CsvExportServiceTest (10 cases): both flavors, BOM/no-BOM, formula
escapes incl. TAB/CR, header escape, signed-numeric allowlist,
quoting, multiline, empty columns, generator-compatible iterable.
- ExportHelpersTest (5 cases): exportCapLimit bounds.
- DomainListServiceTest (8 cases): filter, search, "all" sentinel,
sort, paging, enrichment, BC failure, tenant-scoped security filter.
Gates: PHPUnit green, PHPStan clean on touched files, module:sync ok.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 21:57:19 +02:00
"Export" : "Export" ,
"Export as CSV" : "Als CSV exportieren" ,
"Export for Excel" : "Für Excel exportieren" ,
2026-02-04 23:31:53 +01:00
"State" : "Status" ,
"Edit" : "Bearbeiten" ,
"Status" : "Status" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Visibility" : "Sichtbarkeit" ,
"Inactive entries are hidden in lists and selections." : "Inaktive Einträge werden in Listen und Auswahlen ausgeblendet." ,
2026-02-04 23:31:53 +01:00
"All" : "Alle" ,
"Explorer" : "Explorer" ,
"Search" : "Suche" ,
"Search..." : "Suchen..." ,
2026-04-01 20:27:42 +02:00
"Search users, tenants, pages..." : "Benutzer, Mandanten, Seiten durchsuchen..." ,
"Users, tenants, departments, roles and more" : "Benutzer, Mandanten, Abteilungen, Rollen und mehr" ,
2026-04-01 16:31:59 +02:00
"Searching..." : "Suche läuft..." ,
"Search failed. Please try again." : "Suche fehlgeschlagen. Bitte erneut versuchen." ,
"No results found" : "Keine Ergebnisse gefunden" ,
"View all results" : "Alle Ergebnisse anzeigen" ,
2026-04-01 20:27:42 +02:00
"navigate" : "navigieren" ,
"open" : "öffnen" ,
"close" : "schließen" ,
2026-02-04 23:31:53 +01:00
"Created from" : "Erstellt von" ,
"Created to" : "Erstellt bis" ,
"Settings" : "Einstellungen" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Documentation" : "Dokumentation" ,
"Documentation navigation" : "Dokumentationsnavigation" ,
"On this page" : "Auf dieser Seite" ,
"Getting started" : "Erste Schritte" ,
"Architecture & rules" : "Architektur & Regeln" ,
"Frontend" : "Frontend" ,
"Features" : "Features" ,
"API reference" : "API-Referenz" ,
"Operations" : "Betrieb" ,
"Automation & integrations" : "Automatisierung & Integrationen" ,
"Logs" : "Protokolle" ,
2026-02-04 23:31:53 +01:00
"System" : "System" ,
2026-02-11 19:28:12 +01:00
"System permission" : "Systemberechtigung" ,
"System permission can not be deleted" : "Systemberechtigung kann nicht gelöscht werden" ,
"System permissions are core and should rarely be disabled." : "Systemberechtigungen sind kernrelevant und sollten nur selten deaktiviert werden." ,
2026-02-04 23:31:53 +01:00
"Statistics" : "Statistiken" ,
"Active users" : "Aktive Benutzer" ,
"Inactive users" : "Inaktive Benutzer" ,
"Sent emails" : "Gesendete E-Mails" ,
"Primary navigation" : "Hauptnavigation" ,
2026-03-06 00:44:52 +01:00
"Footer navigation" : "Fußzeilen-Navigation" ,
2026-03-05 12:51:53 +01:00
"Language switcher" : "Sprachauswahl" ,
2026-02-04 23:31:53 +01:00
"Sort column ascending" : "Spalte aufsteigend sortieren" ,
"Sort column descending" : "Spalte absteigend sortieren" ,
"Previous" : "Zurück" ,
"Next" : "Weiter" ,
2026-03-05 12:51:53 +01:00
"Navigation" : "Navigation" ,
"Display" : "Anzeige" ,
"Session" : "Sitzung" ,
2026-02-04 23:31:53 +01:00
"Page %d of %d" : "Seite %d von %d" ,
"Page %d" : "Seite %d" ,
2026-03-05 12:51:53 +01:00
"Per page" : "Pro Seite" ,
"Skip to main content" : "Zum Hauptinhalt springen" ,
2026-03-05 11:17:42 +01:00
"Rows per page" : "Einträge pro Seite" ,
2026-02-04 23:31:53 +01:00
"Showing" : "Zeige" ,
"of" : "von" ,
"to" : "bis" ,
"results" : "Ergebnisse" ,
"Loading..." : "Lade..." ,
"No records found" : "Keine Einträge gefunden" ,
"An error happened while fetching the data" : "Fehler beim Laden der Daten" ,
"Delete this user?" : "Diesen Benutzer wirklich löschen?" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Delete user" : "Benutzer löschen" ,
"This will permanently delete this user." : "Dieser Benutzer wird dauerhaft gelöscht." ,
2026-02-04 23:31:53 +01:00
"Delete this tenant?" : "Diesen Mandanten wirklich löschen?" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Delete tenant" : "Mandant löschen" ,
"This will permanently delete this tenant." : "Dieser Mandant wird dauerhaft gelöscht." ,
2026-02-04 23:31:53 +01:00
"Tenant" : "Mandant" ,
"Default tenant" : "Standard-Mandant" ,
"Default role" : "Standard-Rolle" ,
"Default department" : "Standard-Abteilung" ,
"Default" : "Standard" ,
"Access & password" : "Zugang & Passwort" ,
"Security" : "Sicherheit" ,
"Preferences" : "Einstellungen" ,
"My account" : "Meine Benutzereinstellungen" ,
"None" : "Keine" ,
"Settings updated" : "Einstellungen gespeichert" ,
"setting.default_tenant" : "Standard-Mandant, wenn bei der Benutzeranlage keiner zugewiesen wird" ,
"setting.default_role" : "Standard-Rolle, wenn bei der Benutzeranlage keine Rolle zugewiesen wird" ,
"setting.default_department" : "Standard-Abteilung, wenn bei der Benutzeranlage keine Abteilung zugewiesen wird" ,
"setting.app_title" : "App-Titel für den Browser-Tab" ,
"setting.app_locale" : "Standard-Sprache, wenn keine Sprache gesetzt ist" ,
"Default language" : "Standard-Sprache" ,
2026-02-11 19:28:12 +01:00
"setting.app_registration" : "Öffentliche Selbstregistrierung erlauben" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"setting.api_token_default_ttl_days" : "Standard-Laufzeit für neue API-Tokens in Tagen (Default: 90)" ,
"setting.api_token_max_ttl_days" : "Maximale Laufzeit für API-Tokens in Tagen (Hard Cap)" ,
"setting.api_cors_allowed_origins" : "Erlaubte Browser-Origins für API-CORS (eine Origin pro Zeile)" ,
"API token default lifetime (days)" : "Standardlaufzeit für API-Tokens (Tage)" ,
"API token maximum lifetime (days)" : "Maximale Laufzeit für API-Tokens (Tage)" ,
"Allowed CORS origins" : "Erlaubte CORS-Origins" ,
"One origin per line, e.g. https://app.example.com" : "Eine Origin pro Zeile, z. B. https://app.example.com" ,
2026-02-04 23:31:53 +01:00
"Default theme" : "Standard-Theme" ,
"Allow user theme" : "Benutzer-Theme erlauben" ,
2026-02-11 19:28:12 +01:00
"Allow registration" : "Registrierung erlauben" ,
2026-02-04 23:31:53 +01:00
"Appearance" : "Darstellung" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"API docs" : "API-Doku" ,
"Can view API documentation" : "Kann API-Dokumentation anzeigen" ,
2026-04-22 23:10:44 +02:00
"Appearance is controlled per tenant. Every tenant carries its own primary color and default theme." : "Die Darstellung wird pro Mandant gesteuert. Jeder Mandant hat eine eigene Primärfarbe und ein eigenes Standard-Theme." ,
2026-04-22 22:49:50 +02:00
"The theme used for users in this tenant who have no personal preference." : "Das Theme für Nutzer dieses Mandanten, die keine persönliche Präferenz gesetzt haben." ,
2026-04-22 23:10:44 +02:00
"Users may choose their own theme" : "Benutzer dürfen ihr eigenes Theme wählen" ,
"Controls whether users in this tenant can override the tenant default with a personal theme preference." : "Steuert, ob Benutzer dieses Mandanten den Mandanten-Standard durch eine persönliche Theme-Präferenz überschreiben dürfen." ,
2026-02-11 19:28:12 +01:00
"Inactive tenants are excluded from user access and tenant-scoped data." : "Inaktive Mandanten werden vom Benutzerzugriff und mandantenspezifischen Daten ausgeschlossen." ,
2026-02-04 23:31:53 +01:00
"Status & meta" : "Status & Meta" ,
"Audit" : "Audit" ,
"Overview" : "Übersicht" ,
"Choose color" : "Farbe wählen" ,
2026-02-11 19:28:12 +01:00
"Code" : "Code" ,
"Cost center" : "Kostenstelle" ,
"Department code already exists" : "Abteilungscode existiert bereits" ,
"Role code already exists" : "Rollencode existiert bereits" ,
2026-02-04 23:31:53 +01:00
"Internationalization" : "Internationalisierung" ,
"User creation rules" : "Benutzeranlage-Regeln" ,
"App title" : "App-Titel" ,
"Tenants" : "Mandanten" ,
"Create tenant" : "Mandant anlegen" ,
"Edit tenant" : "Mandant bearbeiten" ,
2026-03-22 22:28:19 +01:00
"View tenant" : "Mandant anzeigen" ,
2026-02-04 23:31:53 +01:00
"Tenant created" : "Mandant erstellt" ,
"Tenant updated" : "Mandant aktualisiert" ,
"Tenant deleted" : "Mandant gelöscht" ,
"Tenant not found" : "Mandant nicht gefunden" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Tenant can not be deleted while departments are assigned" : "Mandant kann nicht gelöscht werden, solange Abteilungen zugewiesen sind" ,
2026-02-04 23:31:53 +01:00
"Tenant can not be created" : "Mandant kann nicht erstellt werden" ,
"Tenant can not be updated" : "Mandant kann nicht aktualisiert werden" ,
"Assigned tenants" : "Zugewiesene Mandanten" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Assigned tenant" : "Zugewiesener Mandant" ,
2026-02-04 23:31:53 +01:00
"Primary tenant" : "Hauptmandant" ,
"Select primary tenant" : "Hauptmandant auswählen" ,
"Please select a primary tenant" : "Bitte einen Hauptmandanten auswählen" ,
"Primary tenant must be one of the assigned tenants" : "Der Hauptmandant muss einem zugewiesenen Mandanten entsprechen" ,
"Department assignments cleaned: %d" : "Abteilungszuweisungen bereinigt: %d" ,
"Select tenants" : "Mandanten auswählen" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Select tenant" : "Mandant auswählen" ,
2026-02-04 23:31:53 +01:00
"Assigned roles" : "Zugewiesene Rollen" ,
"Select roles" : "Rollen auswählen" ,
"Department" : "Abteilung" ,
"Departments" : "Abteilungen" ,
"Create department" : "Abteilung anlegen" ,
"Edit department" : "Abteilung bearbeiten" ,
2026-03-22 22:28:19 +01:00
"View department" : "Abteilung anzeigen" ,
2026-02-04 23:31:53 +01:00
"Department created" : "Abteilung erstellt" ,
"Department updated" : "Abteilung aktualisiert" ,
"Department deleted" : "Abteilung gelöscht" ,
"Department not found" : "Abteilung nicht gefunden" ,
"Department can not be created" : "Abteilung kann nicht erstellt werden" ,
"Department can not be updated" : "Abteilung kann nicht aktualisiert werden" ,
2026-03-22 18:25:33 +01:00
"Department can not be deleted while users are assigned" : "Abteilung kann nicht gelöscht werden, solange Benutzer zugewiesen sind" ,
2026-02-04 23:31:53 +01:00
"Delete this department?" : "Diese Abteilung wirklich löschen?" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Delete department" : "Abteilung löschen" ,
"This will permanently delete this department." : "Diese Abteilung wird dauerhaft gelöscht." ,
2026-02-04 23:31:53 +01:00
"Assigned departments" : "Zugewiesene Abteilungen" ,
"Select departments" : "Abteilungen auswählen" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Departments for tenant" : "Abteilungen für Mandant" ,
"No departments available for this tenant" : "Für diesen Mandanten sind keine Abteilungen verfügbar" ,
"Assign tenants first to select departments" : "Bitte zuerst Mandanten zuweisen, um Abteilungen auszuwählen" ,
2026-03-13 09:49:11 +01:00
"No tenants available" : "Keine Mandanten verfügbar" ,
"No tenant is available in your current scope." : "Im aktuellen Geltungsbereich sind keine Mandanten verfügbar." ,
2026-02-04 23:31:53 +01:00
"Role" : "Rolle" ,
"Roles" : "Rollen" ,
2026-03-13 09:49:11 +01:00
"No roles available" : "Keine Rollen verfügbar" ,
feat(ui): token-select primitive for large multi-selects
Adds tokenSelectForm() in core/Support/helpers/ui.php: an inline
typeahead combobox + flat alphabetical removable list, designed for
selections that outgrow the chip-header of the vendor MultiSelect
(roles, permissions, and similar admin pickers).
Contract:
- Hidden <select multiple name="<name>[]"> is the form submission source —
consumers read via $request->body() verbatim, no parsing
- Items are ['id' => int, <labelKey> => string, 'key' => string?]
where labelKeys default to ['description', 'label', 'name']; 'key' is
an invisible fuzzy-match hint
- $labelOverrides lets callers swap emptyState / removeTooltip /
noMatches / clearAll / countSuffix / errorMessage with domain copy
- $disabled renders pure-presentation list (no combobox, no remove)
Runtime:
- initTokenSelect in web/js/components/app-token-select.js is registered
as 'token-select' in app-init.js; destroy()/cleanupFns contract
- Syncs the hidden <select> on every mutation and dispatches 'change'
so dependent UI can react
Wired up: pages/admin/permissions/_form.phtml (assigned roles),
pages/admin/roles/_form.phtml (permissions + assignable roles).
Helper contract lives in tests/Support/Helpers/TokenSelectFormHelperTest.php;
runtime contract + entrypoint registration + host usage are enforced by
FrontendRuntime*ContractTest.php.
Coexists with multiSelectForm() — pick tokenSelectForm() when the
selected set can grow beyond ~10 items or typeahead is expected.
Docs in CLAUDE.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:52:32 +02:00
"No roles selected" : "Keine Rollen ausgewählt" ,
"Remove role" : "Rolle entfernen" ,
"Search roles…" : "Rollen suchen…" ,
2026-03-13 21:11:48 +01:00
"Assignable roles" : "Zuweisbare Rollen" ,
2026-02-04 23:31:53 +01:00
"Create role" : "Rolle anlegen" ,
"Edit role" : "Rolle bearbeiten" ,
2026-03-22 22:28:19 +01:00
"View role" : "Rolle anzeigen" ,
2026-02-04 23:31:53 +01:00
"Role created" : "Rolle erstellt" ,
"Role updated" : "Rolle aktualisiert" ,
"Role deleted" : "Rolle gelöscht" ,
"Role not found" : "Rolle nicht gefunden" ,
"Role can not be created" : "Rolle kann nicht erstellt werden" ,
"Role can not be updated" : "Rolle kann nicht aktualisiert werden" ,
"Delete this role?" : "Diese Rolle wirklich löschen?" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Delete role" : "Rolle löschen" ,
"Delete permission" : "Berechtigung löschen" ,
"This will permanently delete this role." : "Diese Rolle wird dauerhaft gelöscht." ,
"This will permanently delete this permission." : "Diese Berechtigung wird dauerhaft gelöscht." ,
2026-02-04 23:31:53 +01:00
"Description" : "Beschreibung" ,
"Description cannot be empty" : "Beschreibung darf nicht leer sein" ,
"Status is invalid" : "Status ist ungültig" ,
"Address" : "Adresse" ,
"Postal code" : "Postleitzahl" ,
"City" : "Ort" ,
"Country" : "Land" ,
"Mail logs" : "E-Mail-Protokolle" ,
"Mail log" : "E-Mail-Protokoll" ,
"View mail log" : "E-Mail-Protokoll ansehen" ,
"Mail log not found" : "E-Mail-Protokoll nicht gefunden" ,
"Email details" : "E-Mail-Details" ,
"Recipient" : "Empfänger" ,
"Subject" : "Betreff" ,
"Template" : "Vorlage" ,
"Sent" : "Gesendet" ,
"Failed" : "Fehlgeschlagen" ,
"Queued" : "Warteschlange" ,
"Error message" : "Fehlermeldung" ,
"Error information" : "Fehlerinformationen" ,
"Provider message ID" : "Provider-Nachrichten-ID" ,
"Sent at" : "Gesendet am" ,
"Created at" : "Erstellt am" ,
"Delivery information" : "Versandinformationen" ,
"All statuses" : "Alle Status" ,
"Contact" : "Kontakt" ,
"Support" : "Support" ,
"Support email" : "Support-E-Mail" ,
"Support phone" : "Support-Telefon" ,
2026-03-13 09:49:11 +01:00
"No contact details available" : "Keine Kontaktdaten vorhanden" ,
2026-02-04 23:31:53 +01:00
"VAT ID" : "USt-ID" ,
"Tax number" : "Steuernummer" ,
"Billing email" : "Rechnungs-E-Mail" ,
"Phone" : "Telefon" ,
"Website" : "Webseite" ,
"Legal" : "Rechtliches" ,
2026-03-13 09:49:11 +01:00
"No legal links configured" : "Keine rechtlichen Links konfiguriert" ,
2026-02-04 23:31:53 +01:00
"Privacy URL" : "Datenschutz-URL" ,
"Imprint URL" : "Impressum-URL" ,
"Region" : "Region" ,
"Fax" : "Fax" ,
"Back" : "Zurück" ,
"Access denied" : "Zugriff verweigert" ,
"You do not have permission to view this content." : "Du hast keine Berechtigung, diesen Inhalt zu sehen." ,
"If you believe this is an error, please contact your system administrator." : "Wenn du glaubst, dass dies ein Fehler ist, wende dich bitte an den Systemadministrator." ,
"Requested URL" : "Angeforderte URL" ,
"Forward" : "Vorwärts" ,
"Status changed" : "Status geändert" ,
"Status changed by" : "Status geändert von" ,
"Requested path" : "Angeforderter Pfad" ,
"Page not found" : "Seite nicht gefunden" ,
"The page you requested does not exist or has moved." : "Die angeforderte Seite existiert nicht oder wurde verschoben." ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Back to start" : "Zur Startseite" ,
2026-02-04 23:31:53 +01:00
"Page updated" : "Seite aktualisiert" ,
"Page can not be updated" : "Seite kann nicht aktualisiert werden" ,
"Content is invalid" : "Inhalt ist ungültig" ,
"You are not allowed to edit this page" : "Du darfst diese Seite nicht bearbeiten" ,
"Form expired, please try again" : "Formular abgelaufen, bitte erneut versuchen" ,
"Start writing..." : "Mit dem Schreiben beginnen..." ,
"View" : "Ansicht" ,
"Heading" : "Überschrift" ,
"Copy content to" : "Inhalt kopieren nach" ,
"Existing content in the target language will be overwritten" : "Bestehender Inhalt in der Zielsprache wird überschrieben" ,
"Content copied" : "Inhalt kopiert" ,
"Target language required" : "Zielsprache erforderlich" ,
"Source content not found" : "Quellinhalt nicht gefunden" ,
"Employment" : "Arbeitsverhältnis" ,
"Job title" : "Position" ,
"Hire date" : "Eintrittsdatum" ,
"German" : "Deutsch" ,
"English" : "Englisch" ,
"Switch tenant" : "Mandant wechseln" ,
"Copy" : "Kopieren" ,
2026-04-24 21:26:11 +02:00
"Copy to clipboard" : "In Zwischenablage kopieren" ,
2026-02-04 23:31:53 +01:00
"Registration successful! Please check your email for the verification code." : "Registrierung erfolgreich! Bitte prüfe deine E-Mails für den Bestätigungscode." ,
2026-02-11 19:28:12 +01:00
"Registration is currently disabled" : "Registrierung ist derzeit deaktiviert." ,
2026-02-04 23:31:53 +01:00
"A new verification code has been sent." : "Ein neuer Bestätigungscode wurde gesendet." ,
"Email already verified. Please login." : "E-Mail bereits bestätigt. Bitte einloggen." ,
"If the email exists, a new verification code has been sent." : "Falls die E-Mail existiert, wurde ein neuer Bestätigungscode gesendet." ,
"Email verified successfully! Please login." : "E-Mail erfolgreich bestätigt! Bitte einloggen." ,
"Too many failed attempts. Please request a new code." : "Zu viele Fehlversuche. Bitte fordere einen neuen Code an." ,
"Verify email" : "E-Mail bestätigen" ,
"Enter the verification code we sent to your email to complete your registration." : "Gib den Bestätigungscode ein, den wir dir per E-Mail gesendet haben, um deine Registrierung abzuschließen." ,
"Email verified" : "E-Mail bestätigt" ,
"Not verified" : "Nicht bestätigt" ,
"Verified" : "Bestätigt" ,
"SMTP host" : "SMTP Host" ,
"SMTP port" : "SMTP Port" ,
"SMTP user" : "SMTP Benutzer" ,
"SMTP password" : "SMTP Passwort" ,
"SMTP security" : "SMTP Sicherheit" ,
"SMTP from address" : "Absender-Adresse" ,
"SMTP from name" : "Absendername" ,
"Mobile" : "Mobil" ,
"Short dial" : "Kurzwahl" ,
"setting.smtp_host" : "SMTP-Serveradresse (z.B. smtp.example.com)" ,
"setting.smtp_port" : "SMTP-Port (z.B. 587)" ,
"setting.smtp_user" : "SMTP-Benutzername" ,
"setting.smtp_password" : "Leer lassen, um das bestehende Passwort zu behalten" ,
"setting.smtp_secure" : "Verschlüsselung für SMTP" ,
"setting.smtp_from" : "Absender-E-Mail für ausgehende Nachrichten" ,
2026-02-11 19:28:12 +01:00
"setting.smtp_from_name" : "Absendername für ausgehende Nachrichten" ,
"High contrast" : "Hoher Kontrast" ,
"Toggle contrast" : "Kontrast umschalten" ,
"Email security" : "E-Mail Sicherheit" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"API" : "API" ,
"API requests (24h)" : "API Requests (24h)" ,
"Request trend vs previous 24h" : "Request-Trend zur vorherigen 24h" ,
"4xx errors (24h)" : "4xx Fehler (24h)" ,
"5xx errors (24h)" : "5xx Fehler (24h)" ,
"P95 response time (ms)" : "P95 Antwortzeit (ms)" ,
"Tokens expiring in 7 days" : "Tokens mit Ablauf in 7 Tagen" ,
"Top API error codes (24h)" : "Top API-Fehlercodes (24h)" ,
"Slowest API endpoints (avg, 24h)" : "Langsamste API-Endpunkte (Durchschnitt, 24h)" ,
"Import runs (7d)" : "Import-Läufe (7 Tage)" ,
"Created rows (7d)" : "Erstellte Zeilen (7 Tage)" ,
"Failed rows (7d)" : "Fehlgeschlagene Zeilen (7 Tage)" ,
"Success rate (7d)" : "Erfolgsquote (7 Tage)" ,
"Recent import runs" : "Letzte Import-Läufe" ,
"Imports by profile (7d)" : "Importe nach Profil (7 Tage)" ,
"Top import error codes (7d)" : "Häufigste Import-Fehlercodes (7 Tage)" ,
"Runs" : "Läufe" ,
"Created rows" : "Erstellte Zeilen" ,
"Failed rows" : "Fehlgeschlagene Zeilen" ,
"Success rate" : "Erfolgsquote" ,
"Requests" : "Requests" ,
"Average duration (ms)" : "Durchschnittliche Dauer (ms)" ,
"Maximum duration (ms)" : "Maximale Dauer (ms)" ,
2026-02-11 19:28:12 +01:00
"Error" : "Fehler" ,
"Active tenants" : "Aktive Mandanten" ,
"Inactive tenants" : "Inaktive Mandanten" ,
"Active departments" : "Aktive Abteilungen" ,
"Inactive departments" : "Inaktive Abteilungen" ,
"Active roles" : "Aktive Rollen" ,
"Inactive roles" : "Inaktive Rollen" ,
"Roles without permissions" : "Rollen ohne Berechtigungen" ,
"Permissions without roles" : "Berechtigungen ohne Rollen" ,
"Users without roles" : "Benutzer ohne Rollen" ,
"Users without tenants" : "Benutzer ohne Mandant" ,
"Mail failures" : "E-Mail Fehler" ,
"Last email sent" : "Letzte E-Mail gesendet" ,
"Never" : "Nie" ,
"Recent logins" : "Letzte Anmeldungen" ,
"Never logged in" : "Nie angemeldet" ,
"Last login" : "Letzte Anmeldung" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Last login via" : "Letzte Anmeldung über" ,
"Local" : "Lokal" ,
"Microsoft" : "Microsoft" ,
"Unknown" : "Unbekannt" ,
2026-02-11 19:28:12 +01:00
"User" : "Benutzer" ,
"No entries found" : "Keine Einträge gefunden" ,
"Login status" : "Anmeldestatus" ,
"Logged in" : "Angemeldet" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Email unverified" : "E-Mail nicht verifiziert" ,
2026-02-11 19:28:12 +01:00
"Password resets" : "Passwort-Resets" ,
2026-03-13 09:49:11 +01:00
"No password reset requests" : "Keine Passwort-Reset-Anfragen" ,
"No reset has been requested for this account yet." : "Für dieses Konto wurde noch kein Reset angefordert." ,
2026-02-11 19:28:12 +01:00
"Requested at" : "Angefordert am" ,
"Expires at" : "Gültig bis" ,
"Used at" : "Verwendet am" ,
"Attempts" : "Versuche" ,
"Used" : "Verwendet" ,
"Expired" : "Abgelaufen" ,
"Expired by admin" : "Durch Admin abgelaufen" ,
"Login tokens" : "Login-Tokens" ,
2026-03-13 09:49:11 +01:00
"No login tokens" : "Keine Login-Tokens" ,
"This user is currently not signed in via remember-me." : "Dieser Benutzer ist aktuell nicht per Angemeldet-bleiben eingeloggt." ,
2026-02-11 19:28:12 +01:00
"Expire all login tokens" : "Alle Login-Tokens ablaufen" ,
"Expire all login tokens?" : "Alle Login-Tokens ablaufen?" ,
"%d active login tokens" : "%d aktive Login-Tokens" ,
"%d login tokens expired" : "%d Login-Tokens abgelaufen" ,
"Danger zone" : "Gefahrenzone" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"This will mark all remember-me tokens as expired. Users will need to sign in again." : "Alle Angemeldet-bleiben Tokens werden als abgelaufen markiert. Benutzer müssen sich erneut anmelden sobald die Browser-Session ausgelaufen ist." ,
2026-02-11 19:28:12 +01:00
"Last used" : "Zuletzt verwendet" ,
"Keyboard shortcuts" : "Tastenkürzel" ,
"Open search" : "Suche öffnen" ,
2026-03-04 15:56:58 +01:00
"Save in edit pages" : "Auf Bearbeitungsseiten speichern" ,
2026-03-06 00:44:52 +01:00
"Unsaved changes" : "Ungespeichert" ,
"Unsaved change (%d field)" : "Ungespeichert (%d Feld)" ,
"Unsaved changes (%d fields)" : "Ungespeichert (%d Felder)" ,
2026-03-04 15:56:58 +01:00
"Please review the following errors" : "Bitte prüfen Sie die folgenden Fehler" ,
"You have unsaved changes. Leave without saving?" : "Sie haben ungespeicherte Änderungen. Seite ohne Speichern verlassen?" ,
2026-02-11 19:28:12 +01:00
"Switch sidebar section" : "Sidebar-Bereich wechseln" ,
"Action" : "Aktion" ,
"Mac" : "Mac" ,
"Windows" : "Windows" ,
"Email verification code" : "E-Mail Verifizierungscode" ,
"Failed to switch tenant" : "Mandantwechsel fehlgeschlagen" ,
"IDs" : "IDs" ,
"Pages" : "Seiten" ,
"Permission" : "Berechtigung" ,
2026-03-13 09:49:11 +01:00
"No effective permissions" : "Keine effektiven Berechtigungen" ,
"Assign at least one role to show effective permissions." : "Weisen Sie mindestens eine Rolle zu, um effektive Berechtigungen anzuzeigen." ,
2026-02-11 19:28:12 +01:00
"Please verify your email first" : "Bitte bestätige zuerst deine E-Mail" ,
"Toggle sidebar" : "Sidebar umschalten" ,
"Unverified" : "Nicht verifiziert" ,
"Imprint" : "Impressum" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Privacy" : "Datenschutz" ,
2026-03-12 14:09:06 +01:00
"Terms of Service" : "Nutzungsbedingungen" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Custom fields" : "Zusatzfelder" ,
"User custom fields" : "Benutzerzusatzfelder" ,
"Affected tenants" : "Betroffene Mandanten" ,
"If a tenant appears here, at least one custom field setup needs review (missing options, inactive fields with values, or unused active fields)." : "Wenn ein Mandant hier erscheint, muss mindestens eine Zusatzfeld-Konfiguration geprüft werden (fehlende Optionen, inaktive Felder mit Werten oder ungenutzte aktive Felder)." ,
"Issue" : "Problem" ,
"Count" : "Anzahl" ,
"Selection fields without options" : "Auswahlfelder ohne Optionen" ,
"Tenants with broken selection fields" : "Mandanten mit fehlerhaften Auswahlfeldern" ,
"Inactive custom fields with values" : "Inaktive Zusatzfelder mit Werten" ,
"Unused active custom fields" : "Ungenutzte aktive Zusatzfelder" ,
"Save tenant first to manage custom fields" : "Speichern Sie den Mandanten zuerst, um Zusatzfelder zu verwalten" ,
"Define custom fields here. They appear per user in the \"Custom fields\" tab and can be maintained there." : "Hier definieren Sie Zusatzfelder. Diese erscheinen pro Benutzer im Reiter \"Zusatzfelder\" und sind dort pflegbar." ,
"Add custom field" : "Zusatzfeld hinzufügen" ,
"The label is shown in user custom fields and in address book filters." : "Die Bezeichnung wird bei Benutzer-Zusatzfeldern und in den Adressbuch-Filtern angezeigt." ,
"The field type controls input and filter behavior." : "Der Feldtyp steuert Eingabe- und Filterverhalten." ,
"Field type" : "Feldtyp" ,
"Text" : "Text" ,
"Textarea" : "Mehrzeiliger Text" ,
"Select" : "Auswahl" ,
"Multiselect" : "Mehrfachauswahl" ,
"Boolean" : "Ja/Nein" ,
"Date" : "Datum" ,
"Filterable" : "Filterbar" ,
"Options (one per line)" : "Optionen (eine pro Zeile)" ,
"Example: manager|Manager" : "Beispiel: manager|Manager" ,
"One option per line. Optional format: key|Label." : "Eine Option pro Zeile. Optionales Format: key|Label." ,
"No custom fields configured yet" : "Noch keine Zusatzfelder konfiguriert" ,
"Delete custom field" : "Zusatzfeld löschen" ,
"Custom field saved" : "Zusatzfeld gespeichert" ,
"Custom field deleted" : "Zusatzfeld gelöscht" ,
"Custom field can not be created" : "Zusatzfeld kann nicht erstellt werden" ,
"Custom field can not be updated" : "Zusatzfeld kann nicht aktualisiert werden" ,
"Custom field can not be deleted" : "Zusatzfeld kann nicht gelöscht werden" ,
"Custom field values can not be saved" : "Zusatzfeldwerte konnten nicht gespeichert werden" ,
"Custom field not found" : "Zusatzfeld nicht gefunden" ,
"Label cannot be empty" : "Bezeichnung darf nicht leer sein" ,
"Field key cannot be empty" : "Feldschlüssel darf nicht leer sein" ,
"Field type is invalid" : "Feldtyp ist ungültig" ,
"Field key already exists" : "Feldschlüssel existiert bereits" ,
"Options are required for this field type" : "Für diesen Feldtyp sind Optionen erforderlich" ,
"Assign tenants first to edit custom fields" : "Bitte zuerst Mandanten zuweisen, um Zusatzfelder zu bearbeiten" ,
"Custom fields for tenant" : "Zusatzfelder für Mandant" ,
"No custom fields configured for this tenant" : "Für diesen Mandanten sind keine Zusatzfelder konfiguriert" ,
"No custom fields configured for selected tenants" : "Für die ausgewählten Mandanten sind keine Zusatzfelder konfiguriert" ,
"Select options" : "Optionen auswählen" ,
"Invalid value for %s" : "Ungültiger Wert für %s" ,
"Please select" : "Bitte auswählen" ,
"perm.custom_fields.manage" : "Mandanten-Zusatzfelder verwalten" ,
"perm.custom_fields.edit_values" : "Benutzer-Zusatzfelder bearbeiten" ,
"Label" : "Bezeichnung" ,
"Required" : "Pflichtfeld" ,
"Filterable fields are available in address book filters." : "Filterbare Felder sind im Adressbuch als Filter verfügbar." ,
"Inactive fields are hidden in forms and filters." : "Inaktive Felder sind in Formularen und Filtern ausgeblendet." ,
"Default theme is invalid" : "Standard-Theme ist ungültig" ,
"Theme change is disabled for this tenant" : "Theme-Wechsel ist für diesen Mandanten deaktiviert" ,
"Controls whether users in this tenant can choose their own theme." : "Steuert, ob Benutzer in diesem Mandanten ihr eigenes Theme wählen können." ,
"Tenants can override color and theme behavior in their appearance settings." : "Mandanten können Farbe und Theme-Verhalten in ihren Darstellungs-Einstellungen überschreiben." ,
"User theme policy" : "Benutzer-Theme-Richtlinie" ,
"APP_CRYPTO_KEY is missing or invalid" : "APP_CRYPTO_KEY fehlt oder ist ungültig" ,
"Allowed email domains" : "Erlaubte E-Mail-Domains" ,
"Authority URL" : "Authority-URL" ,
"Clear override secret" : "Override-Secret entfernen" ,
"Client ID override" : "Client-ID-Override" ,
"Client ID override is required" : "Client-ID-Override ist erforderlich" ,
"Client secret could not be encrypted" : "Client-Secret konnte nicht verschlüsselt werden" ,
"Client secret override" : "Client-Secret-Override" ,
"Client secret override is required" : "Client-Secret-Override ist erforderlich" ,
"Enable Microsoft login for this tenant" : "Microsoft-Login für diesen Mandanten aktivieren" ,
"Entra tenant ID (tid)" : "Entra-Tenant-ID (tid)" ,
"Entra tenant ID is invalid" : "Entra-Tenant-ID ist ungültig" ,
"Microsoft SSO" : "Microsoft SSO" ,
"Microsoft login" : "Microsoft-Login" ,
"Microsoft login could not be started" : "Microsoft-Login konnte nicht gestartet werden" ,
"Microsoft login failed" : "Microsoft-Login fehlgeschlagen" ,
"Microsoft login is not allowed for this account" : "Microsoft-Login ist für dieses Konto nicht erlaubt" ,
"Microsoft login is not available for this tenant" : "Microsoft-Login ist für diesen Mandanten nicht verfügbar" ,
"Microsoft login was cancelled or failed" : "Microsoft-Login wurde abgebrochen oder ist fehlgeschlagen" ,
"Microsoft-only login requires a complete configuration" : "Nur-Microsoft-Login erfordert eine vollständige Konfiguration" ,
"No access to this tenant" : "Kein Zugriff auf diesen Mandanten" ,
"Shared credentials missing" : "Geteilte Zugangsdaten fehlen" ,
"Optional allow-list, comma or newline separated (example.com)." : "Optionale Allow-List, per Komma oder Zeilenumbruch getrennt (example.com)." ,
"Password login is disabled for this tenant. Please use Microsoft login." : "Passwort-Login ist für diesen Mandanten deaktiviert. Bitte nutze Microsoft-Login." ,
"Password login is disabled for all assigned tenants" : "Passwort-Login ist für alle zugewiesenen Mandanten deaktiviert." ,
"Password login mode" : "Passwort-Login-Modus" ,
2026-03-12 10:01:24 +01:00
"Local password only" : "Nur lokales Passwort" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Local password + Microsoft" : "Lokales Passwort + Microsoft" ,
"Credentials source" : "Quelle der Zugangsdaten" ,
"Shared app" : "Geteilte App" ,
"Tenant override" : "Mandanten-Override" ,
"SSO configuration status" : "SSO-Konfigurationsstatus" ,
"Configuration complete" : "Konfiguration vollständig" ,
"Required Microsoft configuration" : "Pflichtkonfiguration Microsoft" ,
"Required for Microsoft login." : "Für Microsoft-Login erforderlich." ,
"SSO" : "SSO" ,
"Shared Microsoft app credentials are used by tenants that enable \"Use shared app credentials\"." : "Geteilte Microsoft-App-Zugangsdaten werden von Mandanten verwendet, die \"Geteilte App-Zugangsdaten verwenden\" aktivieren." ,
"Shared client ID" : "Geteilte Client-ID" ,
"Shared client secret" : "Geteiltes Client-Secret" ,
"Sign in with Microsoft" : "Mit Microsoft anmelden" ,
"Tenant SSO settings could not be saved" : "Mandanten-SSO-Einstellungen konnten nicht gespeichert werden" ,
"Tenant login link is invalid" : "Mandanten-Login-Link ist ungültig" ,
"Profile sync on Microsoft login" : "Profil-Sync bei Microsoft-Login" ,
"Sync fields" : "Sync-Felder" ,
"Sync first name" : "Vorname synchronisieren" ,
"Sync last name" : "Nachname synchronisieren" ,
2026-04-13 14:13:21 +02:00
"Sync display name" : "Anzeigename synchronisieren" ,
"Sync job title" : "Berufsbezeichnung synchronisieren" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Sync phone" : "Telefon synchronisieren" ,
"Sync mobile" : "Mobil synchronisieren" ,
"Sync avatar image" : "Avatarbild synchronisieren" ,
"User profile fields are global and affect all tenants of this user" : "Benutzer-Profildaten sind global und wirken auf alle Mandanten dieses Benutzers." ,
"Phone/mobile/avatar sync requires Microsoft Graph (User.Read)" : "Telefon/Mobil/Avatar-Sync benötigt Microsoft Graph (User.Read)." ,
"SSO-enabled tenants" : "Mandanten mit aktivem SSO" ,
"SSO-enforced tenants" : "Mandanten mit erzwungenem SSO" ,
"SSO rollout" : "SSO-Rollout" ,
"Users with Microsoft-only login" : "Benutzer mit nur Microsoft-Login" ,
"Microsoft profile sync gaps" : "Microsoft-Profil-Sync-Lücken" ,
"Microsoft only" : "Nur Microsoft" ,
"Use shared app credentials from settings" : "Geteilte App-Zugangsdaten aus Einstellungen verwenden" ,
"Override only if this tenant needs a separate Entra app." : "Override nur nutzen, wenn dieser Mandant eine eigene Entra-App benötigt." ,
"Write-only. Leave empty to keep current secret." : "Nur schreiben. Leer lassen, um das aktuelle Secret beizubehalten." ,
"Client secret override is invalid" : "Client-Secret-Override ist ungültig" ,
"Client credentials are missing" : "Client-Zugangsdaten fehlen" ,
"setting.microsoft_shared_client_id" : "Einstellungsschlüssel für geteilte Microsoft-Client-ID" ,
"setting.microsoft_shared_client_secret_enc" : "Einstellungsschlüssel für geteiltes Microsoft-Client-Secret (verschlüsselt)" ,
"setting.microsoft_authority" : "Basis-OpenID-Authority-URL für Microsoft-Login" ,
"API tokens" : "API-Tokens" ,
"Token name" : "Token-Name" ,
"Create API token" : "API-Token erstellen" ,
"Revoke" : "Widerrufen" ,
"Revoke this API token?" : "Dieses API-Token widerrufen?" ,
"Revoked" : "Widerrufen" ,
"Prefix" : "Präfix" ,
"No API tokens" : "Keine API-Tokens" ,
2026-03-13 09:49:11 +01:00
"Create a token to enable API access for this user." : "Erstellen Sie ein Token, um den API-Zugriff für diesen Benutzer zu aktivieren." ,
"No API token has been created for this user yet." : "Für diesen Benutzer wurde noch kein API-Token erstellt." ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"New API token (copy now — shown only once):" : "Neues API-Token (jetzt kopieren — wird nur einmal angezeigt):" ,
"API token created. Copy it now — it will not be shown again." : "API-Token erstellt. Jetzt kopieren — es wird nicht erneut angezeigt." ,
"Could not create API token: %s" : "API-Token konnte nicht erstellt werden: %s" ,
"API token revoked" : "API-Token widerrufen" ,
"%d API tokens revoked" : "%d API-Tokens widerrufen" ,
"%d active API tokens" : "%d aktive API-Tokens" ,
"Revoke all API tokens" : "Alle API-Tokens widerrufen" ,
"Revoke all API tokens?" : "Alle API-Tokens widerrufen?" ,
"API token default lifetime is invalid" : "Standardlaufzeit für API-Tokens ist ungültig" ,
"API token max lifetime is invalid" : "Maximale Laufzeit für API-Tokens ist ungültig" ,
2026-03-26 15:09:55 +01:00
"nav.logs.mail" : "E-Mail" ,
"nav.audit.api" : "API" ,
"nav.audit.system" : "System" ,
"nav.audit.imports" : "Importe" ,
"nav.audit.user_lifecycle" : "Benutzer-Lifecycle" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"API audit" : "API-Protokolle" ,
"API audit logs" : "API-Protokolle" ,
"Request ID" : "Request-ID" ,
"Method" : "Methode" ,
"Path" : "Pfad" ,
"Status code" : "Statuscode" ,
"Duration (ms)" : "Dauer (ms)" ,
"Error code" : "Fehlercode" ,
"Token ID" : "Token-ID" ,
"Token tenant" : "Token-Mandant" ,
"Purge API audit logs" : "API-Protokolle bereinigen" ,
"Purge entries older than 90 days?" : "Einträge älter als 90 Tage bereinigen?" ,
"%d API audit entries purged" : "%d API-Protokoll-Einträge bereinigt" ,
"API audit entry not found" : "API-Protokoll-Eintrag nicht gefunden" ,
"View API audit entry" : "API-Protokoll-Eintrag anzeigen" ,
"Request details" : "Request-Details" ,
"Scope" : "Geltungsbereich" ,
2026-04-05 23:20:55 +02:00
"Query metadata (keys)" : "Query-Metadaten (Schlüssel)" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"All methods" : "Alle Methoden" ,
"Tenant ID" : "Mandanten-ID" ,
"User ID" : "Benutzer-ID" ,
"IP" : "IP" ,
"CORS allowed origins are invalid" : "Erlaubte CORS-Origins sind ungültig" ,
"Token name is required" : "Token-Name ist erforderlich" ,
"e.g. CI Pipeline" : "z.B. CI-Pipeline" ,
"Imports" : "Importe" ,
"You do not have permission to run imports." : "Du hast keine Berechtigung für Importe." ,
"CSV file" : "CSV-Datei" ,
"Max size 10MB, max 20000 rows" : "Maximal 10MB, maximal 20000 Zeilen" ,
"Download sample CSV" : "Beispiel-CSV herunterladen" ,
"Analyze file" : "Datei analysieren" ,
"CSV header" : "CSV-Header" ,
"Target field" : "Zielfeld" ,
"Ignore column" : "Spalte ignorieren" ,
"Assignment columns require additional permission." : "Zuweisungsspalten benötigen eine zusätzliche Berechtigung." ,
"Run preview" : "Vorschau ausführen" ,
"Preview" : "Vorschau" ,
"Rows total" : "Zeilen gesamt" ,
"Valid rows" : "Gültige Zeilen" ,
"Would create" : "Würde erstellen" ,
"Would skip" : "Würde überspringen" ,
"Would fail" : "Würde fehlschlagen" ,
"Row issues" : "Zeilenprobleme" ,
"Start import" : "Import starten" ,
"Import finished" : "Import abgeschlossen" ,
"Processed" : "Verarbeitet" ,
"Skipped" : "Übersprungen" ,
"Import another file" : "Weitere Datei importieren" ,
"No row errors found" : "Keine Zeilenfehler gefunden" ,
"Row" : "Zeile" ,
"Message" : "Nachricht" ,
"No upload file provided" : "Keine Upload-Datei übergeben" ,
"Upload exceeds the maximum size" : "Upload überschreitet die maximale Dateigröße" ,
"Invalid file type" : "Ungültiger Dateityp" ,
"CSV header is invalid" : "CSV-Header ist ungültig" ,
"CSV file has no data rows" : "CSV-Datei enthält keine Datenzeilen" ,
"CSV row limit exceeded" : "CSV-Zeilenlimit überschritten" ,
"Required mapping is missing" : "Erforderliches Mapping fehlt" ,
"Assignment import permission is required" : "Berechtigung für Assignment-Import ist erforderlich" ,
"Email is invalid" : "E-Mail ist ungültig" ,
"Email already exists" : "E-Mail existiert bereits" ,
"Locale is invalid" : "Locale ist ungültig" ,
"Active value is invalid" : "Active-Wert ist ungültig" ,
"Hire date must be YYYY-MM-DD" : "Eintrittsdatum muss YYYY-MM-DD sein" ,
"Tenant is missing, inactive or invalid" : "Mandant fehlt, ist inaktiv oder ungültig" ,
"Role is missing, inactive or invalid" : "Rolle fehlt, ist inaktiv oder ungültig" ,
"Department is missing, inactive or invalid" : "Abteilung fehlt, ist inaktiv oder ungültig" ,
"Department does not belong to tenant" : "Abteilung gehört nicht zum Mandanten" ,
"Tenant assignment is out of your scope" : "Mandantenzuweisung liegt außerhalb deines Scopes" ,
"Unexpected error during import" : "Unerwarteter Fehler beim Import" ,
"Required field is empty: first_name" : "Pflichtfeld ist leer: first_name" ,
"Required field is empty: last_name" : "Pflichtfeld ist leer: last_name" ,
"User assignments can not be updated" : "Benutzerzuweisungen können nicht aktualisiert werden" ,
"How the import works" : "So funktioniert der Import" ,
"1. Upload CSV and click analyze" : "1. CSV hochladen und analysieren klicken" ,
"2. Map your CSV columns to system fields" : "2. CSV-Spalten auf Systemfelder mappen" ,
"3. Review preview counters and row errors" : "3. Vorschau, Zähler und Zeilenfehler prüfen" ,
"4. Start import for valid rows" : "4. Import für gültige Zeilen starten" ,
"Rules" : "Regeln" ,
"Create-only: existing entries are skipped" : "Nur erstellen: bestehende Einträge werden übersprungen" ,
"Here is a CSV template for this import profile." : "Hier ist eine CSV-Vorlage für dieses Importprofil." ,
"Reference" : "Referenz" ,
"Required fields" : "Pflichtfelder" ,
"Required field is empty: description" : "Pflichtfeld ist leer: description" ,
"Tenant must be a valid UUID" : "Mandant muss eine gültige UUID sein" ,
"Code already exists" : "Code existiert bereits" ,
"Department already exists for this tenant" : "Abteilung für diesen Mandanten existiert bereits" ,
"Duplicate entry in CSV file" : "Doppelter Eintrag in der CSV-Datei" ,
"Entry could not be created" : "Eintrag konnte nicht erstellt werden" ,
"Import logs" : "Import-Protokolle" ,
"Import audit logs" : "Import-Protokolle" ,
"Run UUID" : "Run-UUID" ,
"Mapped fields" : "Gemappte Felder" ,
"Created count" : "Erstellt" ,
"Skipped count" : "Übersprungen" ,
"Failed count" : "Fehlgeschlagen" ,
"Purge import logs" : "Import-Protokolle bereinigen" ,
"%d import audit entries purged" : "%d Import-Protokoll-Einträge bereinigt" ,
"Import audit entry not found" : "Import-Protokoll-Eintrag nicht gefunden" ,
"View import audit entry" : "Import-Protokoll-Eintrag anzeigen" ,
"Import details" : "Import-Details" ,
"Started" : "Gestartet" ,
"Finished" : "Beendet" ,
"File" : "Datei" ,
"Current tenant" : "Aktueller Mandant" ,
"Error code distribution" : "Fehlercode-Verteilung" ,
"All profiles" : "Alle Profile" ,
"Running" : "Laufend" ,
"Success" : "Erfolgreich" ,
"Partial" : "Teilweise" ,
"Import" : "Import" ,
"Counters" : "Zähler" ,
"User lifecycle policy" : "Benutzer-Lifecycle-Regel" ,
2026-03-09 20:07:55 +01:00
"Session policy" : "Sitzungsrichtlinie" ,
2026-03-09 21:57:52 +01:00
"Registration controls whether new users can create an account." : "Hier wird gesteuert, ob neue Benutzer ein Konto erstellen dürfen." ,
"Session limits define how long logged-in users stay signed in." : "Hier werden Inaktivitäts- und Absolute-Timeout für aktive Sitzungen festgelegt." ,
"User lifecycle defines when inactive users are deactivated or deleted." : "Hier wird festgelegt, wann inaktive Benutzer deaktiviert oder gelöscht werden." ,
"System audit controls whether security events are logged and how long they are kept." : "Hier wird gesteuert, ob Sicherheitsereignisse protokolliert werden und wie lange sie aufbewahrt werden." ,
2026-03-09 20:07:55 +01:00
"Session idle timeout (minutes)" : "Sitzungs-Inaktivitäts-Timeout (Minuten)" ,
"Session absolute timeout (hours)" : "Absolutes Sitzungs-Timeout (Stunden)" ,
"Allowed range: 5-1440 minutes (default: 30)" : "Erlaubter Bereich: 5-1440 Minuten (Standard: 30)" ,
"Allowed range: 1-72 hours (default: 8)" : "Erlaubter Bereich: 1-72 Stunden (Standard: 8)" ,
2026-03-09 21:57:52 +01:00
"Deactivate users after inactivity (days)" : "Nach Inaktivität deaktivieren (Tage)" ,
"Delete inactive users after (days)" : "Inaktive löschen nach (Tagen)" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"0 disables this rule" : "0 deaktiviert diese Regel" ,
"Run user lifecycle now?" : "Benutzer-Lifecycle jetzt ausführen?" ,
"Run user lifecycle now" : "Benutzer-Lifecycle jetzt ausführen" ,
"setting.user_inactivity_deactivate_days" : "Setzt Benutzer nach dieser Anzahl Tagen ohne Login automatisch auf inaktiv" ,
"setting.user_inactivity_delete_days" : "Löscht inaktive Benutzer nach dieser zusätzlichen Anzahl Tagen automatisch" ,
2026-03-09 20:07:55 +01:00
"setting.session_idle_timeout_minutes" : "Maximale Inaktivitätsdauer in Minuten vor automatischer Abmeldung (Standard: 30)" ,
"setting.session_absolute_timeout_hours" : "Maximale Gesamtdauer einer Sitzung in Stunden vor automatischer Abmeldung (Standard: 8)" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"User lifecycle already running" : "Benutzer-Lifecycle läuft bereits" ,
"User lifecycle failed" : "Benutzer-Lifecycle fehlgeschlagen" ,
"User lifecycle completed: %d deactivated, %d deleted" : "Benutzer-Lifecycle abgeschlossen: %d deaktiviert, %d gelöscht" ,
"User inactivity deactivation period is invalid" : "Zeitraum für automatische Deaktivierung ist ungültig" ,
"User inactivity deletion period is invalid" : "Zeitraum für automatische Löschung ist ungültig" ,
2026-03-09 20:07:55 +01:00
"Session idle timeout is invalid" : "Sitzungs-Inaktivitäts-Timeout ist ungültig" ,
"Session absolute timeout is invalid" : "Absolutes Sitzungs-Timeout ist ungültig" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Auto-delete is ignored while auto-deactivate is disabled" : "Auto-Löschung wird ignoriert, solange Auto-Deaktivierung deaktiviert ist" ,
"Scheduled jobs" : "Geplante Aufgaben" ,
"Scheduled job not found" : "Geplante Aufgabe nicht gefunden" ,
"Scheduled job is not registered" : "Geplante Aufgabe ist nicht registriert" ,
2026-04-13 14:13:09 +02:00
"This scheduled job is no longer registered and cannot be edited. It has been superseded by a newer version." : "Diese geplante Aufgabe ist nicht mehr registriert und kann nicht bearbeitet werden. Sie wurde durch eine neuere Version ersetzt." ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Scheduled job could not be saved" : "Geplante Aufgabe konnte nicht gespeichert werden" ,
"Scheduled job saved" : "Geplante Aufgabe gespeichert" ,
"Edit scheduled job" : "Geplante Aufgabe bearbeiten" ,
2026-03-22 22:28:19 +01:00
"View scheduled job" : "Geplante Aufgabe anzeigen" ,
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
"Job" : "Aufgabe" ,
"Job key" : "Aufgaben-Key" ,
"Run history" : "Laufhistorie" ,
"Run now" : "Jetzt ausführen" ,
"Next run" : "Nächster Lauf" ,
"Last run" : "Letzter Lauf" ,
"Last error" : "Letzter Fehler" ,
"Schedule" : "Zeitplan" ,
"Schedule type" : "Zeitplan-Typ" ,
"Schedule interval" : "Zeitplan-Intervall" ,
"Schedule time" : "Zeitplan-Uhrzeit" ,
"Weekdays" : "Wochentage" ,
"Hourly" : "Stündlich" ,
"Daily" : "Täglich" ,
"Weekly" : "Wöchentlich" ,
"Enabled" : "Aktiv" ,
"Disabled" : "Inaktiv" ,
"Timezone" : "Zeitzone" ,
"Catch up once" : "Verpassten Lauf einmal nachholen" ,
"Scheduler" : "Scheduler" ,
"Every %d hour(s)" : "Alle %d Stunde(n)" ,
"Every %d day(s) at %s" : "Alle %d Tag(e) um %s" ,
"Every %d week(s) on %s at %s" : "Alle %d Woche(n) an %s um %s" ,
"No weekdays" : "Keine Wochentage" ,
"Mon" : "Mo" ,
"Tue" : "Di" ,
"Wed" : "Mi" ,
"Thu" : "Do" ,
"Fri" : "Fr" ,
"Sat" : "Sa" ,
"Sun" : "So" ,
"Schedule type is invalid" : "Zeitplan-Typ ist ungültig" ,
"Schedule time is required" : "Zeitplan-Uhrzeit ist erforderlich" ,
"Timezone is invalid" : "Zeitzone ist ungültig" ,
"Hourly interval must be between 1 and 24" : "Stündliches Intervall muss zwischen 1 und 24 liegen" ,
"Daily interval must be between 1 and 365" : "Tägliches Intervall muss zwischen 1 und 365 liegen" ,
"Weekly interval must be between 1 and 52" : "Wöchentliches Intervall muss zwischen 1 und 52 liegen" ,
"At least one weekday is required for weekly schedule" : "Für einen wöchentlichen Zeitplan ist mindestens ein Wochentag erforderlich" ,
"Scheduled job run completed" : "Geplante Aufgabe wurde ausgeführt" ,
"Scheduled job run skipped" : "Geplante Aufgabe wurde übersprungen" ,
"Scheduled job run failed" : "Ausführung der geplanten Aufgabe fehlgeschlagen" ,
"Scheduler is already running" : "Scheduler läuft bereits" ,
"Purge scheduler logs" : "Scheduler-Protokolle bereinigen" ,
"Purge run logs older than 90 days?" : "Laufprotokolle älter als 90 Tage bereinigen?" ,
"%d scheduler run logs purged" : "%d Scheduler-Laufprotokolle bereinigt" ,
"User lifecycle logs" : "Benutzer-Lifecycle-Protokolle" ,
"View user lifecycle audit entry" : "Benutzer-Lifecycle-Eintrag anzeigen" ,
"Lifecycle audit entry not found" : "Benutzer-Lifecycle-Eintrag nicht gefunden" ,
"Purge user lifecycle logs" : "Benutzer-Lifecycle-Protokolle bereinigen" ,
"Purge entries older than 365 days?" : "Einträge älter als 365 Tage bereinigen?" ,
"%d user lifecycle audit entries purged" : "%d Benutzer-Lifecycle-Protokoll-Einträge bereinigt" ,
"Lifecycle event" : "Lifecycle-Ereignis" ,
"Trigger" : "Auslöser" ,
"Reason code" : "Fehlercode" ,
"Target" : "Ziel" ,
"Target UUID" : "Ziel-UUID" ,
"Target email" : "Ziel-E-Mail" ,
"Policy" : "Regel" ,
"Snapshot summary" : "Snapshot-Zusammenfassung" ,
"Snapshot version" : "Snapshot-Version" ,
"Restore status" : "Wiederherstellungsstatus" ,
"Restored at" : "Wiederhergestellt am" ,
"Restored by" : "Wiederhergestellt von" ,
"Restored user" : "Wiederhergestellter Benutzer" ,
"Restore user" : "Benutzer wiederherstellen" ,
"Restore" : "Wiederherstellen" ,
"Restore this user from lifecycle snapshot?" : "Diesen Benutzer aus dem Lifecycle-Snapshot wiederherstellen?" ,
"User restored" : "Benutzer wiederhergestellt" ,
"User restore failed" : "Benutzer-Wiederherstellung fehlgeschlagen" ,
"Lifecycle event was already restored" : "Lifecycle-Ereignis wurde bereits wiederhergestellt" ,
"Lifecycle snapshot unavailable" : "Lifecycle-Snapshot nicht verfügbar" ,
"Restore not possible: email already exists" : "Wiederherstellung nicht möglich: E-Mail existiert bereits" ,
"Restore not possible: uuid already exists" : "Wiederherstellung nicht möglich: UUID existiert bereits" ,
"All triggers" : "Alle Auslöser" ,
"Manual" : "Manuell" ,
"Cron" : "Cron" ,
"Enabled jobs" : "Aktive Aufgaben" ,
"Overdue jobs" : "Überfällige Aufgaben" ,
"Scheduler runs (24h)" : "Scheduler-Läufe (24h)" ,
"Failed scheduler runs (24h)" : "Fehlgeschlagene Scheduler-Läufe (24h)" ,
"Cron runner active" : "Cron-Runner aktiv" ,
"Last heartbeat" : "Letzter Heartbeat" ,
"Last runner result" : "Letztes Runner-Ergebnis" ,
"Runner lock not acquired" : "Runner-Lock nicht erhalten" ,
2026-03-04 15:56:58 +01:00
"Locale" : "Sprache" ,
"Learning path" : "Lernpfad" ,
"Concepts" : "Konzepte" ,
"How-to guides" : "Aufgabenanleitungen" ,
"Contributor guide" : "Mitwirken" ,
"System audit" : "System-Protokolle" ,
"System audit logs" : "System-Protokolle" ,
"View system audit entry" : "System-Protokoll-Eintrag anzeigen" ,
"System audit entry not found" : "System-Protokoll-Eintrag nicht gefunden" ,
"Enable system audit log" : "System-Protokolle aktivieren" ,
"Purge system audit logs" : "System-Protokolle bereinigen" ,
"Purge expired system audit entries?" : "Abgelaufene System-Protokoll-Einträge bereinigen?" ,
"%d system audit entries purged" : "%d System-Protokoll-Einträge bereinigt" ,
"All outcomes" : "Alle Ergebnisse" ,
"All channels" : "Alle Kanäle" ,
"Event type" : "Ereignistyp" ,
"Outcome" : "Ergebnis" ,
"Actor" : "Akteur" ,
"Actor tenant" : "Akteur-Mandant" ,
"Event details" : "Ereignisdetails" ,
"Target type" : "Zieltyp" ,
"IP hash" : "IP-Hash" ,
"User agent hash" : "User-Agent-Hash" ,
"Channel" : "Kanal" ,
"Denied" : "Verweigert" ,
"Event" : "Ereignis" ,
"Metadata" : "Metadaten" ,
"Select users" : "Benutzer auswählen" ,
"Select actions" : "Aktionen auswählen" ,
"Select statuses" : "Status auswählen" ,
"Select triggers" : "Auslöser auswählen" ,
"Tenant #%d" : "Mandant #%d" ,
"Tenant #%d (deleted)" : "Mandant #%d (gelöscht)" ,
"Select event types" : "Ereignistypen auswählen" ,
"Select actor users" : "Akteure auswählen" ,
"User #%d" : "Benutzer #%d" ,
"User #%d (deleted)" : "Benutzer #%d (gelöscht)" ,
"Retention (days)" : "Aufbewahrung (Tage)" ,
2026-03-06 00:44:52 +01:00
"Frontend telemetry" : "Frontend-Telemetrie" ,
"Enable frontend telemetry" : "Frontend-Telemetrie aktivieren" ,
"Sampling rate" : "Sampling-Rate" ,
"Allowed telemetry events" : "Erlaubte Telemetrie-Ereignisse" ,
"warnOnce warnings" : "warnOnce-Warnungen" ,
"AJAX errors" : "AJAX-Fehler" ,
"The percentage of users who will have telemetry enabled." : "Der Anteil der Nutzer, für die Telemetrie aktiv ist." ,
"Advanced telemetry options" : "Erweiterte Telemetrie-Optionen" ,
2026-03-04 15:56:58 +01:00
"setting.system_audit_enabled" : "System-Protokolle aktivieren/deaktivieren" ,
"setting.system_audit_retention_days" : "Aufbewahrungsdauer in Tagen für System-Protokoll-Einträge" ,
2026-03-06 00:44:52 +01:00
"setting.frontend_telemetry_enabled" : "Sichere Frontend-UX- und Fehler-Telemetrie aktivieren/deaktivieren" ,
"setting.frontend_telemetry_sample_rate" : "Sampling-Rate zwischen 0 und 1 für akzeptierte Frontend-Telemetrie-Ereignisse" ,
"setting.frontend_telemetry_allowed_events" : "Erlaubte Frontend-Telemetrie-Ereignisgruppen (warn_once, ajax_error)" ,
2026-03-04 15:56:58 +01:00
"System audit events (24h)" : "System-Protokoll-Ereignisse (24h)" ,
"System audit risks (24h)" : "System-Protokoll-Risiken (24h)" ,
"Failed or denied" : "Fehlgeschlagen oder verweigert" ,
"Recent system audit risks (24h)" : "Aktuelle System-Protokoll-Risiken (24h)" ,
"Lifecycle runs (7d)" : "Lifecycle-Läufe (7d)" ,
"Lifecycle risks (7d)" : "Lifecycle-Risiken (7d)" ,
"Restore actions (7d)" : "Wiederherstellungsaktionen (7d)" ,
2026-03-07 21:21:47 +01:00
"Recent lifecycle risks (7d)" : "Aktuelle Lifecycle-Risiken (7d)" ,
2026-03-09 20:47:21 +01:00
"Your session has expired. Please log in again." : "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an. Mit „Angemeldet bleiben“ erfolgt die Anmeldung ggf. automatisch." ,
2026-03-09 19:16:26 +01:00
"Failed to update role permissions" : "Rollenberechtigungen konnten nicht aktualisiert werden" ,
2026-03-10 22:48:10 +01:00
"Failed to update permission roles" : "Berechtigungsrollen konnten nicht aktualisiert werden" ,
"Login persistence" : "Anmeldespeicherung" ,
"Controls remember-me token lifetime and Microsoft auto-remember behavior." : "Steuert die Lebensdauer von Angemeldet-bleiben-Tokens und das automatische Anmeldeverhalten bei Microsoft-Login." ,
"Remember token lifetime (days)" : "Token-Lebensdauer Angemeldet-bleiben (Tage)" ,
"Allowed range: 1-365 days (default: 30)" : "Erlaubter Bereich: 1– 365 Tage (Standard: 30)" ,
"Microsoft Auto-Remember default" : "Microsoft Auto-Anmeldung Standard" ,
"When enabled, successful Microsoft logins automatically persist a remember-me token (unless overridden per tenant)." : "Wenn aktiviert, setzen erfolgreiche Microsoft-Anmeldungen automatisch ein Angemeldet-bleiben-Token (sofern nicht pro Mandant überschrieben)." ,
"Inherit global default" : "Globalen Standard verwenden" ,
"Force on" : "Erzwingen (an)" ,
"Force off" : "Erzwingen (aus)" ,
"Controls whether Microsoft logins automatically persist a remember-me token." : "Steuert, ob Microsoft-Anmeldungen automatisch ein Angemeldet-bleiben-Token setzen." ,
2026-03-12 14:09:06 +01:00
"Complete" : "Vollständig" ,
"Incomplete" : "Unvollständig" ,
"No domain restrictions" : "Keine Domain-Einschränkungen" ,
"Configuration status" : "Konfigurationsstatus" ,
"SSO setup is incomplete" : "SSO-Konfiguration ist unvollständig" ,
"Complete the required Microsoft configuration before enforcing Microsoft-only login." : "Vervollständigen Sie die erforderliche Microsoft-Konfiguration, bevor Sie Microsoft-only-Anmeldung erzwingen." ,
"Login policy" : "Anmelderichtlinie" ,
"Allow Microsoft-only login (disable local password login)" : "Nur Microsoft-Anmeldung erlauben (lokale Passwort-Anmeldung deaktivieren)" ,
"Remember login after Microsoft sign-in" : "Angemeldet bleiben nach Microsoft-Login" ,
"Access and profile sync" : "Zugriff und Profilabgleich" ,
"Profile sync" : "Profilabgleich" ,
"App credentials (advanced)" : "App-Anmeldedaten (Erweitert)" ,
2026-03-13 14:28:49 +01:00
"Remember token lifetime is invalid" : "Token-Lebensdauer ist ungültig" ,
"Session expiring" : "Sitzung läuft ab" ,
"Your session will expire in {countdown}. Would you like to continue?" : "Ihre Sitzung läuft in {countdown} ab. Möchten Sie fortfahren?" ,
"Extend session" : "Sitzung verlängern" ,
feat: add read-only System Info admin page with health checks and module inventory
New page at /admin/system-info with three tabs:
- Overview: PHP version, SAPI, environment, 6 health checks (DB, schema,
storage, RBAC baseline, admin role, scheduler heartbeat)
- Modules: table of active modules with version, dependencies, permission count
- Permissions: active/inactive counts and per-source breakdown
Gated behind new system_info.view permission assigned to Admin role.
No mutations — purely diagnostic/observability.
Includes SystemHealthService, SystemInfoService, SystemHealthRepository
with interface, DI registration, i18n keys (de+en), idempotent DB update
script, and 17 new PHPUnit tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 15:08:02 +01:00
"Log out" : "Abmelden" ,
"System Info" : "Systeminfo" ,
2026-04-24 16:32:46 +02:00
"OK" : "OK" ,
"System status" : "Systemstatus" ,
"All systems operational" : "Alle Systeme betriebsbereit" ,
"Degraded service" : "Eingeschränkter Betrieb" ,
"System outage detected" : "Systemstörung erkannt" ,
"Last checked" : "Zuletzt geprüft" ,
"Components" : "Komponenten" ,
"Database" : "Datenbank" ,
"Database schema" : "Datenbankschema" ,
"Storage" : "Speicher" ,
"Administrators" : "Administratoren" ,
"Connection established" : "Verbindung hergestellt" ,
"Database did not return the expected response" : "Datenbank hat keine erwartete Antwort geliefert" ,
"Database check could not be executed" : "Datenbank-Prüfung konnte nicht ausgeführt werden" ,
"All required core tables are present" : "Alle erforderlichen Kerntabellen sind vorhanden" ,
"Required core tables are missing" : "Erforderliche Kerntabellen fehlen" ,
"Schema check could not be executed" : "Schema-Prüfung konnte nicht ausgeführt werden" ,
"Storage path is writable" : "Speicherpfad ist beschreibbar" ,
"Storage directory is missing" : "Speicherverzeichnis fehlt" ,
"Storage directory is not writable" : "Speicherverzeichnis ist nicht beschreibbar" ,
"Storage write probe failed" : "Schreibprobe im Speicher fehlgeschlagen" ,
"Storage check could not be executed" : "Speicher-Prüfung konnte nicht ausgeführt werden" ,
"Baseline permissions are present" : "Basisberechtigungen sind vorhanden" ,
"Baseline permissions are missing" : "Basisberechtigungen fehlen" ,
"Permission check could not be executed" : "Berechtigungs-Prüfung konnte nicht ausgeführt werden" ,
"At least one administrator is active" : "Mindestens ein Administrator ist aktiv" ,
"No active user has the administrator role" : "Kein aktiver Nutzer hat die Administrator-Rolle" ,
"Administrator check could not be executed" : "Administrator-Prüfung konnte nicht ausgeführt werden" ,
"Scheduler is running on schedule" : "Scheduler läuft planmäßig" ,
"Scheduler heartbeat is outdated" : "Scheduler-Heartbeat ist veraltet" ,
"Scheduler has not reported yet" : "Scheduler hat sich noch nicht gemeldet" ,
"Scheduler heartbeat is empty" : "Scheduler-Heartbeat ist leer" ,
"Scheduler check could not be executed" : "Scheduler-Prüfung konnte nicht ausgeführt werden" ,
feat: add read-only System Info admin page with health checks and module inventory
New page at /admin/system-info with three tabs:
- Overview: PHP version, SAPI, environment, 6 health checks (DB, schema,
storage, RBAC baseline, admin role, scheduler heartbeat)
- Modules: table of active modules with version, dependencies, permission count
- Permissions: active/inactive counts and per-source breakdown
Gated behind new system_info.view permission assigned to Admin role.
No mutations — purely diagnostic/observability.
Includes SystemHealthService, SystemInfoService, SystemHealthRepository
with interface, DI registration, i18n keys (de+en), idempotent DB update
script, and 17 new PHPUnit tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 15:08:02 +01:00
"Health Status" : "Systemstatus" ,
"Check" : "Prüfung" ,
"Details" : "Details" ,
"PHP version" : "PHP-Version" ,
"PHP SAPI" : "PHP SAPI" ,
"Active modules" : "Aktive Module" ,
"No modules active." : "Keine Module aktiv." ,
"Module" : "Modul" ,
"Dependencies" : "Abhängigkeiten" ,
"Permission summary" : "Berechtigungsübersicht" ,
"Active permissions" : "Aktive Berechtigungen" ,
"Inactive (orphaned) permissions" : "Inaktive (verwaiste) Berechtigungen" ,
"Permissions by source" : "Berechtigungen nach Quelle" ,
"Source" : "Quelle" ,
"No health checks available." : "Keine Systemprüfungen verfügbar." ,
"Warning" : "Warnung" ,
"Fail" : "Fehler" ,
"Environment" : "Umgebung" ,
"Modules" : "Module" ,
2026-03-24 14:51:40 +01:00
"Version" : "Version" ,
2026-03-25 07:26:04 +01:00
"Breadcrumb" : "Breadcrumb" ,
"LDAP Username" : "LDAP-Benutzername" ,
"Sign in with LDAP" : "Mit LDAP anmelden" ,
"LDAP login is not available for this tenant." : "LDAP-Anmeldung ist für diesen Mandanten nicht verfügbar." ,
"Your email domain is not allowed for LDAP login on this tenant." : "Ihre E-Mail-Domain ist für die LDAP-Anmeldung bei diesem Mandanten nicht zugelassen." ,
"LDAP server is not reachable. Please try again later." : "LDAP-Server ist nicht erreichbar. Bitte versuchen Sie es später erneut." ,
"Your LDAP account does not have an email address configured." : "Ihr LDAP-Konto hat keine E-Mail-Adresse konfiguriert." ,
"LDAP host is required" : "LDAP-Host ist erforderlich" ,
"LDAP base DN is required" : "LDAP-Base-DN ist erforderlich" ,
"LDAP port must be between 1 and 65535" : "LDAP-Port muss zwischen 1 und 65535 liegen" ,
"Search filter must contain %s placeholder" : "Suchfilter muss den Platzhalter %s enthalten" ,
"LDAP-only login requires a complete configuration" : "Nur-LDAP-Anmeldung erfordert eine vollständige Konfiguration" ,
"Direct bind method requires a username format" : "Direkte Bindung erfordert ein Benutzernamenformat" ,
"Bind DN could not be encrypted" : "Bind-DN konnte nicht verschlüsselt werden" ,
"Bind password could not be encrypted" : "Bind-Passwort konnte nicht verschlüsselt werden" ,
"Tenant LDAP settings could not be saved" : "LDAP-Einstellungen des Mandanten konnten nicht gespeichert werden" ,
"Bind DN could not be decrypted" : "Bind-DN konnte nicht entschlüsselt werden" ,
"Bind password could not be decrypted" : "Bind-Passwort konnte nicht entschlüsselt werden" ,
"LDAP login" : "LDAP-Anmeldung" ,
"LDAP setup is incomplete" : "LDAP-Konfiguration ist unvollständig" ,
"LDAP connection settings" : "LDAP-Verbindungseinstellungen" ,
"Enable LDAP login for this tenant" : "LDAP-Anmeldung für diesen Mandanten aktivieren" ,
"LDAP Host" : "LDAP-Host" ,
"Encryption" : "Verschlüsselung" ,
"None (not recommended)" : "Keine (nicht empfohlen)" ,
"Verify TLS certificate" : "TLS-Zertifikat überprüfen" ,
"Base DN" : "Base-DN" ,
"Bind DN (service account)" : "Bind-DN (Dienstkonto)" ,
"Bind password" : "Bind-Passwort" ,
"Clear bind password" : "Bind-Passwort löschen" ,
"Test connection" : "Verbindung testen" ,
"Search and bind settings" : "Such- und Bindungseinstellungen" ,
"Bind method" : "Bindungsmethode" ,
"Search then bind (recommended)" : "Suchen dann binden (empfohlen)" ,
"Direct bind" : "Direkte Bindung" ,
"User search filter" : "Benutzer-Suchfilter" ,
"Search scope" : "Suchbereich" ,
"Subtree (recursive)" : "Unterbaum (rekursiv)" ,
"One level" : "Eine Ebene" ,
"Network timeout (seconds)" : "Netzwerk-Timeout (Sekunden)" ,
"Direct bind username format" : "Format für direkte Bindung" ,
"Unique ID attribute" : "Eindeutiges ID-Attribut" ,
"Attribute mapping and sync" : "Attributzuordnung und Synchronisierung" ,
"Map application fields to LDAP directory attributes." : "Anwendungsfelder den LDAP-Verzeichnisattributen zuordnen." ,
"Profile sync on LDAP login" : "Profilsynchronisierung bei LDAP-Anmeldung" ,
"Allow LDAP-only login (disable local password login)" : "Nur LDAP-Anmeldung erlauben (lokale Passwortanmeldung deaktivieren)" ,
"Sync email" : "E-Mail synchronisieren" ,
"AD: objectGUID, OpenLDAP: entryUUID, FreeIPA: ipaUniqueID" : "AD: objectGUID, OpenLDAP: entryUUID, FreeIPA: ipaUniqueID" ,
"Login could not be completed. Please contact your administrator." : "Anmeldung konnte nicht abgeschlossen werden. Bitte kontaktieren Sie Ihren Administrator." ,
"Only for direct bind. Use %s as placeholder. Example: %s@corp.example.com or uid=%s,ou=People,dc=example,dc=com" : "Nur für direkte Bindung. Verwenden Sie %s als Platzhalter. Beispiel: %s@corp.example.com oder uid=%s,ou=People,dc=example,dc=com" ,
"Optional allow-list, comma or newline separated." : "Optionale Zulassungsliste, durch Komma oder Zeilenumbruch getrennt." ,
"Please enter your username and password." : "Bitte geben Sie Ihren Benutzernamen und Ihr Passwort ein." ,
"Port" : "Port" ,
"Search-then-bind uses a service account to find the user DN first, then binds with the user credentials." : "Suchen-dann-binden verwendet ein Dienstkonto, um zuerst den Benutzer-DN zu finden, und bindet dann mit den Benutzeranmeldedaten." ,
"Use %s as placeholder for the username. Examples: (&(objectClass=user)(sAMAccountName=%s)) for AD, (&(objectClass=inetOrgPerson)(uid=%s)) for OpenLDAP" : "Verwenden Sie %s als Platzhalter für den Benutzernamen. Beispiele: (&(objectClass=user)(sAMAccountName=%s)) für AD, (&(objectClass=inetOrgPerson)(uid=%s)) für OpenLDAP" ,
"Username or password not valid" : "Benutzername oder Passwort ungültig" ,
"Write-only. Leave empty to keep current value." : "Nur Schreibzugriff. Leer lassen, um den aktuellen Wert beizubehalten." ,
2026-03-25 07:48:13 +01:00
"Your account is deactivated." : "Ihr Konto ist deaktiviert." ,
2026-04-06 11:58:14 +02:00
"LDAP" : "LDAP" ,
2026-04-13 19:06:12 +02:00
"LDAP attribute map could not be encoded" : "LDAP-Attributzuordnung konnte nicht kodiert werden" ,
2026-04-06 11:58:14 +02:00
"Drop file here or click to select" : "Datei hierher ziehen oder klicken" ,
"Remove selected file" : "Ausgewaehlte Datei entfernen" ,
"Replace" : "Ersetzen" ,
"Delete this image?" : "Dieses Bild löschen?" ,
2026-04-06 22:21:39 +02:00
"Current image" : "Aktuelles Bild" ,
"Open navigation" : "Navigation öffnen" ,
2026-04-21 13:43:16 +02:00
"Close navigation" : "Navigation schließen" ,
"Priority" : "Priorität" ,
"Note" : "Notiz" ,
"Optional note..." : "Optionale Notiz..." ,
refactor(settings): remove global appearance settings — tenant is sole source
Removes the global app_theme, app_theme_user and app_primary_color settings
from the admin/settings area and the underlying service/cache/API/i18n/docs
layers. The tenant columns (tenants.primary_color, default_theme,
allow_user_theme) become the single source of truth for appearance.
Branding helpers are tenant-only and fall back to a hardcoded 'light' theme
with no brand color when no tenant context is available (login, error,
pre-session pages). The APP_THEME env var is removed.
Scope:
- UI: Appearance tab gone from /admin/settings; tenant edit form drops the
global-fallback color preview.
- Service: SettingsAppGateway no longer exposes setting-backed accessors
for theme/user-theme/primary-color. Theme catalog utilities (listThemes,
isAllowedTheme, normalizeTheme, resolveDefaultTheme) stay and are used
across Tenant / Auth / User flows; resolveDefaultTheme now hardcodes
'light' with a catalog fallback (no global/env lookup).
- AdminSettingsService: buildPageData, sanitization, audit snapshot, apply
step and cache payload are all stripped of the three keys. Dead helper
applyAppPrimaryColor + normalizePrimaryColor removed.
- Cache: SettingCacheService HOT_PATH_KEYS drops the three keys.
- API: /settings (GET/PUT) and /settings/public (GET) no longer expose
appearance fields; OpenAPI schemas pruned accordingly.
- Audit redaction list shortened.
- DB: db/init/init.sql seed rows removed. No migration for existing
installs — legacy rows stay inert.
- i18n + docs: setting.app_theme, setting.app_theme_user,
setting.app_primary_color removed from de+en locales; reference and
explanation docs updated.
- Tests: covering tests for the removed methods pruned; ThemeResolutionTest
rewritten for tenant-only semantics. One unrelated PHP-CS-Fixer issue in
UserRegistrar.php cleaned up to keep QG-006 green.
Workflow: .agents/runs/SETTINGS-APPEARANCE-TENANT-ONLY/ (gitignored).
Gates: QG-001..003, QG-006, QG-008 all pass (1985 tests, 28764 assertions).
Reviews: code, security, acceptance all pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 22:40:15 +02:00
"Security level updated" : "Sicherheitsstufe aktualisiert" ,
"About" : "Über" ,
"Call" : "Anrufen" ,
"Copy email address" : "E-Mail-Adresse kopieren" ,
"Copy phone number" : "Telefonnummer kopieren" ,
"Copy mobile number" : "Mobilnummer kopieren" ,
"Hired" : "Eingestellt" ,
"Primary" : "Primär" ,
"Send email" : "E-Mail senden" ,
feat(ui): token-select primitive for large multi-selects
Adds tokenSelectForm() in core/Support/helpers/ui.php: an inline
typeahead combobox + flat alphabetical removable list, designed for
selections that outgrow the chip-header of the vendor MultiSelect
(roles, permissions, and similar admin pickers).
Contract:
- Hidden <select multiple name="<name>[]"> is the form submission source —
consumers read via $request->body() verbatim, no parsing
- Items are ['id' => int, <labelKey> => string, 'key' => string?]
where labelKeys default to ['description', 'label', 'name']; 'key' is
an invisible fuzzy-match hint
- $labelOverrides lets callers swap emptyState / removeTooltip /
noMatches / clearAll / countSuffix / errorMessage with domain copy
- $disabled renders pure-presentation list (no combobox, no remove)
Runtime:
- initTokenSelect in web/js/components/app-token-select.js is registered
as 'token-select' in app-init.js; destroy()/cleanupFns contract
- Syncs the hidden <select> on every mutation and dispatches 'change'
so dependent UI can react
Wired up: pages/admin/permissions/_form.phtml (assigned roles),
pages/admin/roles/_form.phtml (permissions + assignable roles).
Helper contract lives in tests/Support/Helpers/TokenSelectFormHelperTest.php;
runtime contract + entrypoint registration + host usage are enforced by
FrontendRuntime*ContractTest.php.
Coexists with multiSelectForm() — pick tokenSelectForm() when the
selected set can grow beyond ~10 items or typeahead is expected.
Docs in CLAUDE.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:52:32 +02:00
"Summary" : "Zusammenfassung" ,
"token_select.clear_all" : "Alle entfernen" ,
"token_select.empty_state_title" : "Keine Elemente ausgewählt" ,
"token_select.error_invalid_items" : "Elemente konnten nicht geladen werden." ,
"token_select.no_matches" : "Keine Treffer" ,
"token_select.remove" : "Entfernen" ,
"token_select.selected_count_suffix" : "ausgewählt"
2026-02-04 23:31:53 +01:00
}