feat(web): Sessions, Rate-Limiting, Security-Header, Templates und eingebettete Assets
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
This commit is contained in:
parent
e49882b8a8
commit
bb2bc223b9
16 changed files with 1292 additions and 0 deletions
65
internal/web/strings.go
Normal file
65
internal/web/strings.go
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
package web
|
||||
|
||||
// S enthält alle Texte der Oberfläche. Die Map-Struktur ist bewusst
|
||||
// vorbereitet für spätere Mehrsprachigkeit; v1 füllt nur Deutsch.
|
||||
// Kein deutschsprachiger Text gehört direkt in einen Handler.
|
||||
var S = map[string]string{
|
||||
"login_title": "Anmeldung",
|
||||
"login_username": "Benutzername",
|
||||
"login_password": "Passwort",
|
||||
"login_submit": "Anmelden",
|
||||
"login_username_hint": "z. B. mmueller oder m.mueller@firma.de",
|
||||
"login_show_password": "Passwort anzeigen",
|
||||
|
||||
"error_generic_login": "Anmeldung fehlgeschlagen. Bitte prüfen Sie Benutzername und Passwort.",
|
||||
"error_password_expired": "Ihr Passwort ist abgelaufen. Bitte ändern Sie es zuerst an Ihrem Arbeitsplatz.",
|
||||
"error_rate_limited": "Zu viele Anmeldeversuche. Bitte versuchen Sie es in %s erneut.",
|
||||
"error_session_expired": "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.",
|
||||
|
||||
"error_service_unavailable": "Dienst vorübergehend nicht verfügbar",
|
||||
"error_service_unavailable_body": "Die Firewall ist derzeit nicht erreichbar. " +
|
||||
"Bitte versuchen Sie es in einigen Minuten erneut.",
|
||||
"error_forbidden": "Zugriff verweigert",
|
||||
"error_forbidden_body": "Diese Anfrage ist nicht zulässig. " +
|
||||
"Bitte starten Sie den Download erneut über die Übersicht.",
|
||||
"error_not_found": "Seite nicht gefunden",
|
||||
"error_not_found_body": "Die aufgerufene Adresse gibt es nicht.",
|
||||
"error_csrf": "Die Anfrage ist abgelaufen oder ungültig. Bitte versuchen Sie es erneut.",
|
||||
"error_internal": "Unerwarteter Fehler",
|
||||
"error_internal_body": "Es ist ein interner Fehler aufgetreten. Bitte versuchen Sie es erneut.",
|
||||
|
||||
"overview_title": "Ihre VPN-Konfigurationen",
|
||||
"overview_intro": "Laden Sie hier Ihre persönliche OpenVPN-Konfiguration herunter.",
|
||||
"overview_no_certs": "Für Ihr Benutzerkonto ist derzeit keine VPN-Konfiguration hinterlegt.",
|
||||
"overview_no_certs_contact": "Bitte wenden Sie sich an %s.",
|
||||
"overview_expiry_warning": "Achtung: Dieses Zertifikat läuft in %d Tagen ab.",
|
||||
"overview_expired_today": "Achtung: Dieses Zertifikat läuft heute ab.",
|
||||
|
||||
"vpn_instance": "VPN-Verbindung",
|
||||
"common_name": "Zertifikat",
|
||||
"valid_until": "Gültig bis",
|
||||
|
||||
"download_ovpn": "OpenVPN-Datei (.ovpn)",
|
||||
"download_viscosity": "Viscosity-Paket",
|
||||
|
||||
"logout": "Abmelden",
|
||||
"logout_reminder": "Bitte melden Sie sich nach dem Herunterladen ab.",
|
||||
"logout_done": "Sie wurden abgemeldet.",
|
||||
|
||||
"guides_title": "Anleitungen",
|
||||
"guides_intro": "Kurzanleitungen zum Einrichten der VPN-Verbindung auf Ihrem Gerät.",
|
||||
"guides_link": "Anleitungen",
|
||||
"guides_suggested": "Passt vermutlich zu Ihrem Gerät",
|
||||
|
||||
"back_to_overview": "Zurück zur Übersicht",
|
||||
"footer_version": "Version",
|
||||
}
|
||||
|
||||
// T liefert den Text zu einem Schlüssel. Fehlt der Schlüssel, wird er selbst
|
||||
// zurückgegeben — eine leere Fläche in der Oberfläche wäre schlimmer.
|
||||
func T(key string) string {
|
||||
if v, ok := S[key]; ok {
|
||||
return v
|
||||
}
|
||||
return key
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue