From a6de7fb3d06810ab00f3b2c28ba7628ac1402c39 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Sun, 15 Mar 2026 17:21:24 -0300 Subject: [PATCH] update translations --- locale/de/LC_MESSAGES/django.mo | Bin 101766 -> 99845 bytes locale/de/LC_MESSAGES/django.po | 457 ++++++++++++++++++----------- locale/es/LC_MESSAGES/django.mo | Bin 99986 -> 98016 bytes locale/es/LC_MESSAGES/django.po | 455 +++++++++++++++++----------- locale/fr/LC_MESSAGES/django.mo | Bin 102706 -> 100703 bytes locale/fr/LC_MESSAGES/django.po | 455 +++++++++++++++++----------- locale/pt_BR/LC_MESSAGES/django.mo | Bin 101635 -> 99733 bytes locale/pt_BR/LC_MESSAGES/django.po | 454 +++++++++++++++++----------- locale/sk/LC_MESSAGES/django.mo | Bin 101082 -> 99117 bytes locale/sk/LC_MESSAGES/django.po | 453 +++++++++++++++++----------- 10 files changed, 1438 insertions(+), 836 deletions(-) diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index efc587ed5b712ca761638d387f8ca77cffafb0ea..526f1d3cc2fbda6e078b766899d77c5fa8b1c8c4 100644 GIT binary patch delta 17029 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 22e6d56..3a63179 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-14 11:54-0300\n" +"POT-Creation-Date: 2026-03-15 17:20-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,12 +38,12 @@ msgstr "Zurück" #: templates/app_gateway/application_details.html:125 #: templates/firewall/manage_firewall_rule.html:382 #: templates/firewall/manage_redirect_rule.html:86 -#: templates/gatekeeper/gatekeeper_list.html:77 -#: templates/gatekeeper/gatekeeper_list.html:120 -#: templates/gatekeeper/gatekeeper_list.html:165 -#: templates/gatekeeper/gatekeeper_list.html:213 -#: templates/gatekeeper/gatekeeper_list.html:230 -#: templates/gatekeeper/gatekeeper_list.html:282 +#: templates/gatekeeper/gatekeeper_list.html:93 +#: templates/gatekeeper/gatekeeper_list.html:136 +#: templates/gatekeeper/gatekeeper_list.html:181 +#: templates/gatekeeper/gatekeeper_list.html:229 +#: templates/gatekeeper/gatekeeper_list.html:246 +#: templates/gatekeeper/gatekeeper_list.html:298 #: templates/scheduler/scheduleprofile_form.html:127 #: templates/scheduler/scheduleprofile_list.html:29 #: templates/wireguard/peer_list/peer_preview_modal.html:109 @@ -65,11 +65,11 @@ msgstr "" "wird sofort ungültig." #: api_v2/forms.py:63 app_gateway/forms.py:40 app_gateway/forms.py:92 -#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:226 -#: app_gateway/forms.py:267 cluster/forms.py:67 cluster/forms.py:124 -#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:41 -#: gatekeeper/forms.py:75 gatekeeper/forms.py:139 gatekeeper/forms.py:226 -#: gatekeeper/forms.py:256 gatekeeper/forms.py:287 +#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:237 +#: app_gateway/forms.py:278 cluster/forms.py:67 cluster/forms.py:124 +#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:70 +#: gatekeeper/forms.py:150 gatekeeper/forms.py:212 gatekeeper/forms.py:299 +#: gatekeeper/forms.py:329 gatekeeper/forms.py:360 #: routing_templates/forms.py:71 scheduler/forms.py:102 #: templates/firewall/manage_firewall_rule.html:379 #: templates/firewall/manage_firewall_settings.html:59 @@ -83,13 +83,13 @@ msgid "Save" msgstr "Speichern" #: api_v2/models.py:10 app_gateway/forms.py:18 app_gateway/forms.py:106 -#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:99 +#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:174 #: routing_templates/forms.py:28 templates/api_v2/api_documentation.html:47 #: templates/api_v2/list.html:8 templates/app_gateway/app_gateway_list.html:58 #: templates/app_gateway/app_gateway_list.html:138 #: templates/app_gateway/application_details.html:26 #: templates/cluster/workers_list.html:8 templates/dns/static_host_list.html:68 -#: templates/gatekeeper/gatekeeper_list.html:149 +#: templates/gatekeeper/gatekeeper_list.html:165 #: templates/routing_templates/list.html:8 #: templates/scheduler/scheduleprofile_list.html:13 #: templates/user_manager/peer_group_list.html:8 @@ -133,10 +133,10 @@ msgstr "Aktiviert" #: app_gateway/views.py:293 app_gateway/views.py:328 app_gateway/views.py:354 #: app_gateway/views.py:404 app_gateway/views.py:432 cluster/views.py:18 #: cluster/views.py:45 cluster/views.py:114 gatekeeper/views.py:23 -#: gatekeeper/views.py:48 gatekeeper/views.py:78 gatekeeper/views.py:101 -#: gatekeeper/views.py:131 gatekeeper/views.py:154 gatekeeper/views.py:202 -#: gatekeeper/views.py:261 gatekeeper/views.py:291 gatekeeper/views.py:314 -#: gatekeeper/views.py:344 gatekeeper/views.py:367 gatekeeper/views.py:416 +#: gatekeeper/views.py:48 gatekeeper/views.py:98 gatekeeper/views.py:121 +#: gatekeeper/views.py:151 gatekeeper/views.py:174 gatekeeper/views.py:222 +#: gatekeeper/views.py:281 gatekeeper/views.py:311 gatekeeper/views.py:334 +#: gatekeeper/views.py:364 gatekeeper/views.py:387 gatekeeper/views.py:436 #: templates/access_denied.html:9 msgid "Access Denied" msgstr "Zugriff verweigert" @@ -218,9 +218,9 @@ msgid "Upstream" msgstr "Upstream" #: app_gateway/forms.py:41 app_gateway/forms.py:93 app_gateway/forms.py:137 -#: app_gateway/forms.py:155 app_gateway/forms.py:227 app_gateway/forms.py:268 -#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140 -#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288 +#: app_gateway/forms.py:155 app_gateway/forms.py:238 app_gateway/forms.py:279 +#: gatekeeper/forms.py:71 gatekeeper/forms.py:151 gatekeeper/forms.py:213 +#: gatekeeper/forms.py:300 gatekeeper/forms.py:330 gatekeeper/forms.py:361 #: scheduler/forms.py:103 #: templates/app_gateway/access_policy_type_select.html:50 #: templates/generic_delete_confirmation.html:19 @@ -266,20 +266,28 @@ msgstr "Erlaubte Gruppen" msgid "Authentication Methods" msgstr "Authentifizierungsmethoden" -#: app_gateway/forms.py:185 +#: app_gateway/forms.py:188 msgid "Cannot select more than one Local Password authentication method." msgstr "" "Es kann nicht mehr als eine lokale Passwort-Authentifizierungsmethode " "ausgewählt werden." -#: app_gateway/forms.py:189 +#: app_gateway/forms.py:192 msgid "" "Cannot select more than one OpenID Connect (OIDC) authentication method." msgstr "" "Es kann nicht mehr als eine OpenID Connect (OIDC)-Authentifizierungsmethode " "ausgewählt werden." -#: app_gateway/forms.py:193 +#: app_gateway/forms.py:196 +#, fuzzy +#| msgid "Cannot select more than one Local Password authentication method." +msgid "Cannot select more than one TOTP authentication method." +msgstr "" +"Es kann nicht mehr als eine lokale Passwort-Authentifizierungsmethode " +"ausgewählt werden." + +#: app_gateway/forms.py:200 msgid "" "Cannot select both Local Password and OpenID Connect (OIDC) authentication " "methods." @@ -287,7 +295,19 @@ msgstr "" "Die Authentifizierungsmethoden \"Lokales Passwort\" und OpenID Connect " "(OIDC) können nicht gleichzeitig ausgewählt werden." -#: app_gateway/forms.py:197 +#: app_gateway/forms.py:204 +#, fuzzy +#| msgid "" +#| "Cannot select both Local Password and OpenID Connect (OIDC) " +#| "authentication methods." +msgid "" +"TOTP must be combined with a Local Password or OpenID Connect authentication " +"method." +msgstr "" +"Die Authentifizierungsmethoden \"Lokales Passwort\" und OpenID Connect " +"(OIDC) können nicht gleichzeitig ausgewählt werden." + +#: app_gateway/forms.py:208 msgid "" "At least one user group must be selected when using Local Password " "authentication." @@ -295,31 +315,31 @@ msgstr "" "Bei Verwendung der lokalen Passwort-Authentifizierung muss mindestens eine " "Benutzergruppe ausgewählt werden." -#: app_gateway/forms.py:201 +#: app_gateway/forms.py:212 msgid "User groups can only be used with Local Password authentication." msgstr "" "Benutzergruppen können nur mit der lokalen Passwort-Authentifizierung " "verwendet werden." -#: app_gateway/forms.py:211 templates/app_gateway/app_gateway_list.html:62 +#: app_gateway/forms.py:222 templates/app_gateway/app_gateway_list.html:62 #: templates/app_gateway/application_details.html:31 #: templates/firewall/firewall_nav_tabs.html:15 msgid "Default Policy" msgstr "Standard‑Richtlinie" -#: app_gateway/forms.py:240 templates/app_gateway/application_details.html:105 +#: app_gateway/forms.py:251 templates/app_gateway/application_details.html:105 msgid "Route Name" msgstr "Routenname" -#: app_gateway/forms.py:241 templates/app_gateway/application_details.html:106 +#: app_gateway/forms.py:252 templates/app_gateway/application_details.html:106 msgid "Path Prefix" msgstr "Pfadpräfix" -#: app_gateway/forms.py:242 templates/app_gateway/application_details.html:107 +#: app_gateway/forms.py:253 templates/app_gateway/application_details.html:107 msgid "Policy" msgstr "Richtlinie" -#: app_gateway/forms.py:243 templates/app_gateway/application_details.html:108 +#: app_gateway/forms.py:254 templates/app_gateway/application_details.html:108 msgid "Order" msgstr "Reihenfolge" @@ -337,9 +357,9 @@ msgstr "Öffentlich" msgid "Protected" msgstr "Geschützt" -#: app_gateway/models.py:45 gatekeeper/models.py:110 +#: app_gateway/models.py:45 gatekeeper/models.py:108 #: templates/app_gateway/access_policy_type_select.html:41 -#: templates/gatekeeper/gatekeeper_list.html:272 +#: templates/gatekeeper/gatekeeper_list.html:288 msgid "Deny" msgstr "Verweigern" @@ -627,11 +647,11 @@ msgid "Are you sure you want to delete the route \"%(name)s\" (%(path)s)?" msgstr "" "Sind Sie sicher, dass Sie die Route \"%(name)s\" (%(path)s) löschen möchten?" -#: app_gateway/views.py:444 +#: app_gateway/views.py:443 msgid "Configuration exported successfully." msgstr "Konfiguration erfolgreich exportiert." -#: app_gateway/views.py:446 +#: app_gateway/views.py:445 msgid "" "Caddy is not active. Configuration files were exported for debugging " "purposes." @@ -643,13 +663,13 @@ msgstr "" msgid "IP Lock" msgstr "IP-Sperre" -#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198 +#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:271 #: templates/cluster/workers_list.html:10 #: templates/dns/static_host_list.html:18 #: templates/firewall/manage_redirect_rule.html:43 #: templates/firewall/manage_redirect_rule.html:67 #: templates/firewall/manage_redirect_rule.html:68 -#: templates/gatekeeper/gatekeeper_list.html:256 +#: templates/gatekeeper/gatekeeper_list.html:272 #: templates/wireguard/wireguard_status.html:45 msgid "IP Address" msgstr "IP‑Adresse" @@ -926,7 +946,7 @@ msgstr "Statischer DNS" msgid "Invalid hostname." msgstr "Ungültiger Hostname." -#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201 +#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:274 #: templates/api_v2/api_documentation.html:51 #: templates/dns/static_host_list.html:69 #: templates/firewall/manage_redirect_rule.html:18 @@ -1261,43 +1281,29 @@ msgstr "Firewall‑Einstellungen verwalten" msgid "Firewall settings saved successfully" msgstr "Firewall‑Einstellungen erfolgreich gespeichert" -#: gatekeeper/forms.py:17 templates/accounts/login.html:14 -#: templates/gatekeeper/gatekeeper_list.html:61 -#: templates/user_manager/list.html:8 user_manager/forms.py:13 -#: vpn_invite/forms.py:281 -msgid "Username" -msgstr "Benutzername" - -#: gatekeeper/forms.py:18 gatekeeper/forms.py:271 -#: templates/gatekeeper/gatekeeper_list.html:62 -#: templates/gatekeeper/gatekeeper_list.html:204 -#: templates/wireguard/peer_list/peer_preview_modal.html:103 -msgid "Email" -msgstr "E‑Mail" - -#: gatekeeper/forms.py:19 templates/accounts/login.html:23 +#: gatekeeper/forms.py:17 templates/accounts/login.html:23 #: templates/vpn_invite/invite_settings.html:19 user_manager/forms.py:14 #: vpn_invite/forms.py:282 msgid "Password" msgstr "Passwort" #: gatekeeper/forms.py:20 -msgid "TOTP Secret" -msgstr "TOTP-Geheimnis" +msgid "" +"Minimum 8 characters, with at least one uppercase letter, one lowercase " +"letter, and one number." +msgstr "" -#: gatekeeper/forms.py:55 templates/gatekeeper/gatekeeper_list.html:104 -msgid "Group Name" -msgstr "Gruppenname" +#: gatekeeper/forms.py:23 +#, fuzzy +#| msgid "Random Password" +msgid "Confirm Password" +msgstr "Zufallspasswort" -#: gatekeeper/forms.py:56 templates/gatekeeper/gatekeeper_list.html:105 -msgid "Members" -msgstr "Mitglieder" - -#: gatekeeper/forms.py:86 +#: gatekeeper/forms.py:28 gatekeeper/forms.py:161 msgid "TOTP Validation PIN" msgstr "TOTP-Validierungs-PIN" -#: gatekeeper/forms.py:89 +#: gatekeeper/forms.py:31 gatekeeper/forms.py:164 msgid "" "Enter a 6-digit PIN generated by your authenticator app to validate the " "secret." @@ -1305,98 +1311,154 @@ msgstr "" "Geben Sie eine 6-stellige PIN ein, die von Ihrer Authenticator-App generiert " "wurde, um das Geheimnis zu validieren." -#: gatekeeper/forms.py:100 +#: gatekeeper/forms.py:38 templates/accounts/login.html:14 +#: templates/gatekeeper/gatekeeper_list.html:61 +#: templates/user_manager/list.html:8 user_manager/forms.py:13 +#: vpn_invite/forms.py:281 +msgid "Username" +msgstr "Benutzername" + +#: gatekeeper/forms.py:39 gatekeeper/forms.py:344 +#: templates/gatekeeper/gatekeeper_list.html:62 +#: templates/gatekeeper/gatekeeper_list.html:220 +#: templates/wireguard/peer_list/peer_preview_modal.html:103 +msgid "Email" +msgstr "E‑Mail" + +#: gatekeeper/forms.py:40 +msgid "TOTP Secret" +msgstr "TOTP-Geheimnis" + +#: gatekeeper/forms.py:87 +#, fuzzy +#| msgid "Port is required." +msgid "Password is required." +msgstr "Port ist erforderlich." + +#: gatekeeper/forms.py:90 user_manager/forms.py:127 +msgid "Password must be at least 8 characters long." +msgstr "Das Passwort muss mindestens 8 Zeichen lang sein." + +#: gatekeeper/forms.py:92 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one lowercase letter." +msgstr "Das Passwort muss mindestens 8 Zeichen lang sein." + +#: gatekeeper/forms.py:94 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one uppercase letter." +msgstr "Das Passwort muss mindestens 8 Zeichen lang sein." + +#: gatekeeper/forms.py:96 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one number." +msgstr "Das Passwort muss mindestens 8 Zeichen lang sein." + +#: gatekeeper/forms.py:98 +#, fuzzy +#| msgid "Password Confirmation" +msgid "Passwords do not match." +msgstr "Passwortbestätigung" + +#: gatekeeper/forms.py:103 gatekeeper/forms.py:249 +msgid "Please provide a PIN to validate the TOTP secret." +msgstr "Bitte geben Sie eine PIN an, um das TOTP-Geheimnis zu validieren." + +#: gatekeeper/forms.py:108 gatekeeper/forms.py:254 +msgid "Invalid TOTP PIN." +msgstr "Ungültige TOTP-PIN." + +#: gatekeeper/forms.py:110 gatekeeper/forms.py:256 +msgid "Invalid TOTP secret format. Must be a valid Base32 string." +msgstr "" +"Ungültiges TOTP-Geheimnisformat. Muss eine gültige Base32-Zeichenfolge sein." + +#: gatekeeper/forms.py:130 templates/gatekeeper/gatekeeper_list.html:120 +msgid "Group Name" +msgstr "Gruppenname" + +#: gatekeeper/forms.py:131 templates/gatekeeper/gatekeeper_list.html:121 +msgid "Members" +msgstr "Mitglieder" + +#: gatekeeper/forms.py:175 msgid "Authentication Type" msgstr "Authentifizierungstyp" -#: gatekeeper/forms.py:101 +#: gatekeeper/forms.py:176 msgid "Global TOTP Secret" msgstr "Globales TOTP-Geheimnis" -#: gatekeeper/forms.py:102 -msgid "Global TOTP Before Authentication" -msgstr "Globales TOTP vor der Authentifizierung" - -#: gatekeeper/forms.py:103 +#: gatekeeper/forms.py:177 msgid "OIDC Provider URL" msgstr "OIDC-Anbieter-URL" -#: gatekeeper/forms.py:104 +#: gatekeeper/forms.py:178 msgid "OIDC Client ID" msgstr "OIDC-Client-ID" -#: gatekeeper/forms.py:105 +#: gatekeeper/forms.py:179 msgid "OIDC Client Secret" msgstr "OIDC-Client-Geheimnis" -#: gatekeeper/forms.py:157 +#: gatekeeper/forms.py:230 msgid "TOTP secret must be empty for Local Password authentication." msgstr "" "Das TOTP-Geheimnis muss für die Authentifizierung mit lokalem Passwort leer " "sein." -#: gatekeeper/forms.py:159 +#: gatekeeper/forms.py:232 msgid "TOTP validation PIN must be empty for Local Password authentication." msgstr "" "Die TOTP-Validierungs-PIN muss für die Authentifizierung mit lokalem " "Passwort leer sein." -#: gatekeeper/forms.py:161 +#: gatekeeper/forms.py:234 msgid "OIDC fields must be empty for Local Password authentication." msgstr "" "OIDC-Felder müssen für die Authentifizierung mit lokalem Passwort leer sein." -#: gatekeeper/forms.py:167 +#: gatekeeper/forms.py:240 msgid "Only one Local Password authentication method can be configured." msgstr "" "Es kann nur eine Authentifizierungsmethode mit lokalem Passwort konfiguriert " "werden." -#: gatekeeper/forms.py:170 +#: gatekeeper/forms.py:243 msgid "OIDC fields must be empty for TOTP authentication." msgstr "OIDC-Felder müssen für die TOTP-Authentifizierung leer sein." -#: gatekeeper/forms.py:172 +#: gatekeeper/forms.py:245 msgid "TOTP secret is required for TOTP authentication." msgstr "Das TOTP-Geheimnis ist für die TOTP-Authentifizierung erforderlich." -#: gatekeeper/forms.py:176 -msgid "Please provide a PIN to validate the TOTP secret." -msgstr "Bitte geben Sie eine PIN an, um das TOTP-Geheimnis zu validieren." - -#: gatekeeper/forms.py:181 -msgid "Invalid TOTP PIN." -msgstr "Ungültige TOTP-PIN." - -#: gatekeeper/forms.py:183 -msgid "Invalid TOTP secret format. Must be a valid Base32 string." -msgstr "" -"Ungültiges TOTP-Geheimnisformat. Muss eine gültige Base32-Zeichenfolge sein." - -#: gatekeeper/forms.py:186 +#: gatekeeper/forms.py:259 msgid "TOTP secret must be empty for OIDC authentication." msgstr "Das TOTP-Geheimnis muss für die OIDC-Authentifizierung leer sein." -#: gatekeeper/forms.py:188 +#: gatekeeper/forms.py:261 msgid "TOTP validation PIN must be empty for OIDC authentication." msgstr "" "Die TOTP-Validierungs-PIN muss für die OIDC-Authentifizierung leer sein." -#: gatekeeper/forms.py:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270 +#: gatekeeper/forms.py:270 gatekeeper/forms.py:312 gatekeeper/forms.py:343 msgid "Authentication Method" msgstr "Authentifizierungsmethode" -#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257 +#: gatekeeper/forms.py:272 templates/gatekeeper/gatekeeper_list.html:273 msgid "Prefix Length" msgstr "Präfixlänge" -#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47 +#: gatekeeper/forms.py:273 templates/firewall/firewall_rule_list.html:47 #: templates/firewall/manage_firewall_rule.html:360 -#: templates/gatekeeper/gatekeeper_list.html:258 +#: templates/gatekeeper/gatekeeper_list.html:274 msgid "Action" msgstr "Aktion" -#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221 +#: gatekeeper/forms.py:313 templates/gatekeeper/gatekeeper_list.html:237 msgid "Domain" msgstr "Domäne" @@ -1420,16 +1482,16 @@ msgstr "IP-Adressliste" msgid "Shared/global TOTP secret key" msgstr "Gemeinsamer/globaler TOTP-Geheimschlüssel" -#: gatekeeper/models.py:69 +#: gatekeeper/models.py:68 msgid "Password for local authentication (leave blank if not using)" msgstr "" "Passwort für die lokale Authentifizierung (leer lassen, wenn nicht verwendet)" -#: gatekeeper/models.py:71 +#: gatekeeper/models.py:69 msgid "Per-user TOTP secret key" msgstr "Benutzerspezifischer TOTP-Geheimschlüssel" -#: gatekeeper/models.py:110 templates/gatekeeper/gatekeeper_list.html:270 +#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:286 msgid "Allow" msgstr "Zulassen" @@ -1445,58 +1507,103 @@ msgstr "Gatekeeper-Benutzer erstellen" msgid "Gatekeeper User saved successfully." msgstr "Gatekeeper-Benutzer erfolgreich gespeichert." -#: gatekeeper/views.py:86 +#: gatekeeper/views.py:69 +msgid "" +"\n" +"

Gatekeeper User

\n" +"

Gatekeeper users are used for authenticating against protected " +"applications managed by this gateway.

\n" +"\n" +"
Password
\n" +"

Required when creating a user. When editing, leave both password " +"fields blank to keep the current password.\n" +" Passwords are stored using Argon2id hashing.

\n" +"\n" +"
TOTP Secret
\n" +"

Optional per-user TOTP secret. When set, this user will " +"authenticate using their own secret instead of the\n" +" global TOTP secret configured on the Authentication Method. Use the " +"buttons below the field to generate a\n" +" random secret and scan the QR code with your authenticator app. " +"Validate the secret by entering the current\n" +" 6-digit PIN before saving.

\n" +" " +msgstr "" + +#: gatekeeper/views.py:106 msgid "Gatekeeper User deleted successfully." msgstr "Gatekeeper-Benutzer erfolgreich gelöscht." -#: gatekeeper/views.py:91 +#: gatekeeper/views.py:111 msgid "Delete Gatekeeper User" msgstr "Gatekeeper-Benutzer löschen" -#: gatekeeper/views.py:93 +#: gatekeeper/views.py:113 #, python-format msgid "Are you sure you want to delete the user \"%(username)s\"?" msgstr "" "Sind Sie sicher, dass Sie den Benutzer \"%(username)s\" löschen möchten?" -#: gatekeeper/views.py:107 +#: gatekeeper/views.py:127 msgid "Edit Gatekeeper Group" msgstr "Gatekeeper-Gruppe bearbeiten" -#: gatekeeper/views.py:110 +#: gatekeeper/views.py:130 msgid "Create Gatekeeper Group" msgstr "Gatekeeper-Gruppe erstellen" -#: gatekeeper/views.py:117 +#: gatekeeper/views.py:137 msgid "Gatekeeper Group saved successfully." msgstr "Gatekeeper-Gruppe erfolgreich gespeichert." -#: gatekeeper/views.py:139 +#: gatekeeper/views.py:159 msgid "Gatekeeper Group deleted successfully." msgstr "Gatekeeper-Gruppe erfolgreich gelöscht." -#: gatekeeper/views.py:144 +#: gatekeeper/views.py:164 msgid "Delete Gatekeeper Group" msgstr "Gatekeeper-Gruppe löschen" -#: gatekeeper/views.py:146 +#: gatekeeper/views.py:166 #, python-format msgid "Are you sure you want to delete the group \"%(name)s\"?" msgstr "Sind Sie sicher, dass Sie die Gruppe \"%(name)s\" löschen möchten?" -#: gatekeeper/views.py:160 +#: gatekeeper/views.py:180 msgid "Edit Authentication Method" msgstr "Authentifizierungsmethode bearbeiten" -#: gatekeeper/views.py:163 +#: gatekeeper/views.py:183 msgid "Create Authentication Method" msgstr "Authentifizierungsmethode erstellen" -#: gatekeeper/views.py:170 +#: gatekeeper/views.py:190 msgid "Authentication Method saved successfully." msgstr "Authentifizierungsmethode erfolgreich gespeichert." -#: gatekeeper/views.py:175 +#: gatekeeper/views.py:195 +#, fuzzy +#| msgid "" +#| "\n" +#| "

Authentication Types

\n" +#| "

Select how users will authenticate through this method.

\n" +#| " \n" +#| "
Local Password
\n" +#| "

Users will authenticate using a standard username and password " +#| "stored locally. Only one of this type can be created.

\n" +#| " \n" +#| "
OIDC (OpenID Connect)
\n" +#| "

Users will authenticate via an external identity provider " +#| "(like Keycloak, Google, or Authelia). Requires Provider URL, Client ID, " +#| "and Client Secret.

\n" +#| " \n" +#| "
TOTP (Time-Based One-Time Password)
\n" +#| "

Users will need to enter a rotating token from an " +#| "authenticator app. Requires setting a Global TOTP Secret.
If " +#| "Global TOTP Before Authentication is enabled, the PIN is " +#| "required before the username and password to help combat bruteforce " +#| "attacks.

\n" +#| " " msgid "" "\n" "

Authentication Types

\n" @@ -1513,9 +1620,8 @@ msgid "" " \n" "
TOTP (Time-Based One-Time Password)
\n" "

Users will need to enter a rotating token from an authenticator " -"app. Requires setting a Global TOTP Secret.
If Global TOTP " -"Before Authentication is enabled, the PIN is required before the " -"username and password to help combat bruteforce attacks.

\n" +"app. If a user does not have a personal TOTP configured, the Global " +"TOTP Secret will be used instead.

\n" " " msgstr "" "\n" @@ -1541,88 +1647,88 @@ msgstr "" "Force-Angriffe zu bekämpfen.

\n" " " -#: gatekeeper/views.py:210 +#: gatekeeper/views.py:230 msgid "Authentication Method deleted successfully." msgstr "Authentifizierungsmethode erfolgreich gelöscht." -#: gatekeeper/views.py:215 +#: gatekeeper/views.py:235 msgid "Delete Authentication Method" msgstr "Authentifizierungsmethode löschen" -#: gatekeeper/views.py:217 +#: gatekeeper/views.py:237 #, python-format msgid "Are you sure you want to delete the authentication method \"%(name)s\"?" msgstr "" "Sind Sie sicher, dass Sie die Authentifizierungsmethode \"%(name)s\" löschen " "möchten?" -#: gatekeeper/views.py:267 +#: gatekeeper/views.py:287 msgid "Edit Allowed Domain" msgstr "Zulässige Domäne bearbeiten" -#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186 +#: gatekeeper/views.py:290 templates/gatekeeper/gatekeeper_list.html:202 msgid "Add Allowed Domain" msgstr "Zulässige Domäne hinzufügen" -#: gatekeeper/views.py:277 +#: gatekeeper/views.py:297 msgid "Allowed Domain saved successfully." msgstr "Zulässige Domäne erfolgreich gespeichert." -#: gatekeeper/views.py:299 +#: gatekeeper/views.py:319 msgid "Allowed Domain deleted successfully." msgstr "Zulässige Domäne erfolgreich gelöscht." -#: gatekeeper/views.py:304 +#: gatekeeper/views.py:324 msgid "Delete Allowed Domain" msgstr "Zulässige Domäne löschen" -#: gatekeeper/views.py:306 +#: gatekeeper/views.py:326 #, python-format msgid "Are you sure you want to delete the allowed domain \"%(domain)s\"?" msgstr "" "Sind Sie sicher, dass Sie die zulässige Domäne \"%(domain)s\" löschen " "möchten?" -#: gatekeeper/views.py:320 +#: gatekeeper/views.py:340 msgid "Edit Allowed Email" msgstr "Zulässige E-Mail bearbeiten" -#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183 +#: gatekeeper/views.py:343 templates/gatekeeper/gatekeeper_list.html:199 msgid "Add Allowed Email" msgstr "Zulässige E-Mail hinzufügen" -#: gatekeeper/views.py:330 +#: gatekeeper/views.py:350 msgid "Allowed Email saved successfully." msgstr "Zulässige E-Mail erfolgreich gespeichert." -#: gatekeeper/views.py:352 +#: gatekeeper/views.py:372 msgid "Allowed Email deleted successfully." msgstr "Zulässige E-Mail erfolgreich gelöscht." -#: gatekeeper/views.py:357 +#: gatekeeper/views.py:377 msgid "Delete Allowed Email" msgstr "Zulässige E-Mail löschen" -#: gatekeeper/views.py:359 +#: gatekeeper/views.py:379 #, python-format msgid "Are you sure you want to delete the allowed email \"%(email)s\"?" msgstr "" "Sind Sie sicher, dass Sie die zulässige E-Mail \"%(email)s\" löschen möchten?" -#: gatekeeper/views.py:373 +#: gatekeeper/views.py:393 msgid "Edit IP Address" msgstr "IP-Adresse bearbeiten" -#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247 +#: gatekeeper/views.py:396 templates/gatekeeper/gatekeeper_list.html:263 #: templates/wireguard/wireguard_manage_peer.html:171 msgid "Add IP Address" msgstr "IP‑Adresse hinzufügen" -#: gatekeeper/views.py:383 +#: gatekeeper/views.py:403 msgid "IP Address saved successfully." msgstr "IP-Adresse erfolgreich gespeichert." -#: gatekeeper/views.py:388 +#: gatekeeper/views.py:408 msgid "" "\n" "
IP Address List
\n" @@ -1669,15 +1775,15 @@ msgstr "" "„Büronetzwerk“, „Blockierter Angreifer“).

\n" " " -#: gatekeeper/views.py:424 +#: gatekeeper/views.py:444 msgid "IP Address deleted successfully." msgstr "IP-Adresse erfolgreich gelöscht." -#: gatekeeper/views.py:429 +#: gatekeeper/views.py:449 msgid "Delete IP Address" msgstr "IP-Adresse löschen" -#: gatekeeper/views.py:431 +#: gatekeeper/views.py:451 #, python-format msgid "Are you sure you want to delete the IP address \"%(address)s\"?" msgstr "" @@ -2045,8 +2151,8 @@ msgid "In" msgstr "Eingehend" #: templates/api_v2/api_documentation.html:49 -#: templates/gatekeeper/gatekeeper_list.html:150 -#: templates/gatekeeper/gatekeeper_list.html:195 +#: templates/gatekeeper/gatekeeper_list.html:166 +#: templates/gatekeeper/gatekeeper_list.html:211 #: templates/wireguard/apply_route_template.html:27 msgid "Type" msgstr "Typ" @@ -2056,11 +2162,13 @@ msgid "Required" msgstr "Erforderlich" #: templates/api_v2/api_documentation.html:62 +#: templates/gatekeeper/gatekeeper_list.html:75 #: templates/scheduler/scheduleprofile_form.html:175 msgid "Yes" msgstr "Ja" #: templates/api_v2/api_documentation.html:64 +#: templates/gatekeeper/gatekeeper_list.html:77 #: templates/scheduler/scheduleprofile_form.html:177 msgid "No" msgstr "Nein" @@ -2104,12 +2212,12 @@ msgstr "Deaktiviert" #: templates/app_gateway/application_details.html:121 #: templates/cluster/workers_list.html:77 #: templates/dns/static_host_list.html:74 -#: templates/gatekeeper/gatekeeper_list.html:73 -#: templates/gatekeeper/gatekeeper_list.html:116 -#: templates/gatekeeper/gatekeeper_list.html:161 -#: templates/gatekeeper/gatekeeper_list.html:209 -#: templates/gatekeeper/gatekeeper_list.html:226 -#: templates/gatekeeper/gatekeeper_list.html:278 +#: templates/gatekeeper/gatekeeper_list.html:89 +#: templates/gatekeeper/gatekeeper_list.html:132 +#: templates/gatekeeper/gatekeeper_list.html:177 +#: templates/gatekeeper/gatekeeper_list.html:225 +#: templates/gatekeeper/gatekeeper_list.html:242 +#: templates/gatekeeper/gatekeeper_list.html:294 #: templates/routing_templates/list.html:29 #: templates/scheduler/scheduleprofile_form.html:123 #: templates/scheduler/scheduleprofile_list.html:25 @@ -2192,6 +2300,7 @@ msgstr "Zugriffsrichtlinie hinzufügen" #: templates/app_gateway/app_gateway_list.html:140 #: templates/gatekeeper/gatekeeper_list.html:43 +#: templates/gatekeeper/gatekeeper_list.html:64 msgid "Groups" msgstr "Gruppen" @@ -2202,10 +2311,10 @@ msgstr "Authentifizierungsmethoden" #: templates/app_gateway/app_gateway_list.html:142 #: templates/app_gateway/application_details.html:62 #: templates/app_gateway/application_details.html:109 -#: templates/gatekeeper/gatekeeper_list.html:63 -#: templates/gatekeeper/gatekeeper_list.html:106 -#: templates/gatekeeper/gatekeeper_list.html:151 -#: templates/gatekeeper/gatekeeper_list.html:198 +#: templates/gatekeeper/gatekeeper_list.html:65 +#: templates/gatekeeper/gatekeeper_list.html:122 +#: templates/gatekeeper/gatekeeper_list.html:167 +#: templates/gatekeeper/gatekeeper_list.html:214 #: templates/scheduler/scheduleprofile_form.html:111 #: templates/scheduler/scheduleprofile_list.html:15 #: templates/wireguard/apply_route_template.html:28 @@ -2760,10 +2869,19 @@ msgid "Create Port forwarding Rule" msgstr "Port‑Weiterleitungsregel erstellen" #: templates/gatekeeper/gatekeeper_auth_method_form.html:63 +#: templates/gatekeeper/gatekeeper_user_form.html:43 msgid "View QR Code" msgstr "QR-Code anzeigen" -#: templates/gatekeeper/gatekeeper_auth_method_form.html:74 +#: templates/gatekeeper/gatekeeper_auth_method_form.html:64 +#: templates/gatekeeper/gatekeeper_user_form.html:44 +#, fuzzy +#| msgid "Global TOTP Secret" +msgid "Generate TOTP Secret" +msgstr "Globales TOTP-Geheimnis" + +#: templates/gatekeeper/gatekeeper_auth_method_form.html:93 +#: templates/gatekeeper/gatekeeper_user_form.html:73 msgid "Please enter a TOTP Secret first to generate the QR code." msgstr "" "Bitte geben Sie zuerst ein TOTP-Geheimnis ein, um den QR-Code zu generieren." @@ -2790,44 +2908,48 @@ msgstr "Benutzer" msgid "Add User" msgstr "Benutzer hinzufügen" -#: templates/gatekeeper/gatekeeper_list.html:88 +#: templates/gatekeeper/gatekeeper_list.html:63 +msgid "TOTP" +msgstr "" + +#: templates/gatekeeper/gatekeeper_list.html:104 msgid "No Gatekeeper Users found." msgstr "Keine Gatekeeper-Benutzer gefunden." -#: templates/gatekeeper/gatekeeper_list.html:95 +#: templates/gatekeeper/gatekeeper_list.html:111 msgid "Add Group" msgstr "Gruppe hinzufügen" -#: templates/gatekeeper/gatekeeper_list.html:131 +#: templates/gatekeeper/gatekeeper_list.html:147 msgid "No Gatekeeper Groups found." msgstr "Keine Gatekeeper-Gruppen gefunden." -#: templates/gatekeeper/gatekeeper_list.html:140 +#: templates/gatekeeper/gatekeeper_list.html:156 msgid "Add Auth Method" msgstr "Authentifizierungsmethode hinzufügen" -#: templates/gatekeeper/gatekeeper_list.html:176 +#: templates/gatekeeper/gatekeeper_list.html:192 msgid "No Authentication Methods found." msgstr "Keine Authentifizierungsmethoden gefunden." -#: templates/gatekeeper/gatekeeper_list.html:196 +#: templates/gatekeeper/gatekeeper_list.html:212 msgid "Identity" msgstr "Identität" -#: templates/gatekeeper/gatekeeper_list.html:197 -#: templates/gatekeeper/gatekeeper_list.html:259 +#: templates/gatekeeper/gatekeeper_list.html:213 +#: templates/gatekeeper/gatekeeper_list.html:275 msgid "Auth Method" msgstr "Authentifizierungsmethode" -#: templates/gatekeeper/gatekeeper_list.html:241 +#: templates/gatekeeper/gatekeeper_list.html:257 msgid "No Allowed Emails or Domains found." msgstr "Keine zulässigen E-Mails oder Domänen gefunden." -#: templates/gatekeeper/gatekeeper_list.html:260 +#: templates/gatekeeper/gatekeeper_list.html:276 msgid "Manage" msgstr "Verwalten" -#: templates/gatekeeper/gatekeeper_list.html:293 +#: templates/gatekeeper/gatekeeper_list.html:309 msgid "No IP Addresses found." msgstr "Keine IP-Adressen gefunden." @@ -3666,10 +3788,6 @@ msgstr "Für neue Benutzer ist eine Passwortbestätigung erforderlich." msgid "The two password fields didn't match." msgstr "Die beiden Passwortfelder stimmen nicht überein." -#: user_manager/forms.py:127 -msgid "Password must be at least 8 characters long." -msgstr "Das Passwort muss mindestens 8 Zeichen lang sein." - #: user_manager/forms.py:220 msgid "A peer group with that name already exists." msgstr "Eine Peer‑Gruppe mit diesem Namen existiert bereits." @@ -4452,3 +4570,6 @@ msgid "No interfaces found|No WireGuard interfaces were found to process." msgstr "" "Keine Schnittstellen gefunden|Es wurden keine WireGuard‑Schnittstellen " "gefunden." + +#~ msgid "Global TOTP Before Authentication" +#~ msgstr "Globales TOTP vor der Authentifizierung" diff --git a/locale/es/LC_MESSAGES/django.mo b/locale/es/LC_MESSAGES/django.mo index 20febedd95fd5dbe8b1b9db467c2ca7cf2f9c5e0..e4e5c00758c63ee42a249b481844d25d49d84e7c 100644 GIT binary patch delta 17030 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 OO1Id4q>1N9wf_SMx~F~s delta 18699 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 diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index 90dfbda..1fc51a4 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-14 11:54-0300\n" +"POT-Creation-Date: 2026-03-15 17:20-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,12 +38,12 @@ msgstr "Volver" #: templates/app_gateway/application_details.html:125 #: templates/firewall/manage_firewall_rule.html:382 #: templates/firewall/manage_redirect_rule.html:86 -#: templates/gatekeeper/gatekeeper_list.html:77 -#: templates/gatekeeper/gatekeeper_list.html:120 -#: templates/gatekeeper/gatekeeper_list.html:165 -#: templates/gatekeeper/gatekeeper_list.html:213 -#: templates/gatekeeper/gatekeeper_list.html:230 -#: templates/gatekeeper/gatekeeper_list.html:282 +#: templates/gatekeeper/gatekeeper_list.html:93 +#: templates/gatekeeper/gatekeeper_list.html:136 +#: templates/gatekeeper/gatekeeper_list.html:181 +#: templates/gatekeeper/gatekeeper_list.html:229 +#: templates/gatekeeper/gatekeeper_list.html:246 +#: templates/gatekeeper/gatekeeper_list.html:298 #: templates/scheduler/scheduleprofile_form.html:127 #: templates/scheduler/scheduleprofile_list.html:29 #: templates/wireguard/peer_list/peer_preview_modal.html:109 @@ -65,11 +65,11 @@ msgstr "" "funcionar inmediatamente." #: api_v2/forms.py:63 app_gateway/forms.py:40 app_gateway/forms.py:92 -#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:226 -#: app_gateway/forms.py:267 cluster/forms.py:67 cluster/forms.py:124 -#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:41 -#: gatekeeper/forms.py:75 gatekeeper/forms.py:139 gatekeeper/forms.py:226 -#: gatekeeper/forms.py:256 gatekeeper/forms.py:287 +#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:237 +#: app_gateway/forms.py:278 cluster/forms.py:67 cluster/forms.py:124 +#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:70 +#: gatekeeper/forms.py:150 gatekeeper/forms.py:212 gatekeeper/forms.py:299 +#: gatekeeper/forms.py:329 gatekeeper/forms.py:360 #: routing_templates/forms.py:71 scheduler/forms.py:102 #: templates/firewall/manage_firewall_rule.html:379 #: templates/firewall/manage_firewall_settings.html:59 @@ -83,13 +83,13 @@ msgid "Save" msgstr "Guardar" #: api_v2/models.py:10 app_gateway/forms.py:18 app_gateway/forms.py:106 -#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:99 +#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:174 #: routing_templates/forms.py:28 templates/api_v2/api_documentation.html:47 #: templates/api_v2/list.html:8 templates/app_gateway/app_gateway_list.html:58 #: templates/app_gateway/app_gateway_list.html:138 #: templates/app_gateway/application_details.html:26 #: templates/cluster/workers_list.html:8 templates/dns/static_host_list.html:68 -#: templates/gatekeeper/gatekeeper_list.html:149 +#: templates/gatekeeper/gatekeeper_list.html:165 #: templates/routing_templates/list.html:8 #: templates/scheduler/scheduleprofile_list.html:13 #: templates/user_manager/peer_group_list.html:8 @@ -133,10 +133,10 @@ msgstr "Habilitado" #: app_gateway/views.py:293 app_gateway/views.py:328 app_gateway/views.py:354 #: app_gateway/views.py:404 app_gateway/views.py:432 cluster/views.py:18 #: cluster/views.py:45 cluster/views.py:114 gatekeeper/views.py:23 -#: gatekeeper/views.py:48 gatekeeper/views.py:78 gatekeeper/views.py:101 -#: gatekeeper/views.py:131 gatekeeper/views.py:154 gatekeeper/views.py:202 -#: gatekeeper/views.py:261 gatekeeper/views.py:291 gatekeeper/views.py:314 -#: gatekeeper/views.py:344 gatekeeper/views.py:367 gatekeeper/views.py:416 +#: gatekeeper/views.py:48 gatekeeper/views.py:98 gatekeeper/views.py:121 +#: gatekeeper/views.py:151 gatekeeper/views.py:174 gatekeeper/views.py:222 +#: gatekeeper/views.py:281 gatekeeper/views.py:311 gatekeeper/views.py:334 +#: gatekeeper/views.py:364 gatekeeper/views.py:387 gatekeeper/views.py:436 #: templates/access_denied.html:9 msgid "Access Denied" msgstr "Acceso denegado" @@ -217,9 +217,9 @@ msgid "Upstream" msgstr "Upstream" #: app_gateway/forms.py:41 app_gateway/forms.py:93 app_gateway/forms.py:137 -#: app_gateway/forms.py:155 app_gateway/forms.py:227 app_gateway/forms.py:268 -#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140 -#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288 +#: app_gateway/forms.py:155 app_gateway/forms.py:238 app_gateway/forms.py:279 +#: gatekeeper/forms.py:71 gatekeeper/forms.py:151 gatekeeper/forms.py:213 +#: gatekeeper/forms.py:300 gatekeeper/forms.py:330 gatekeeper/forms.py:361 #: scheduler/forms.py:103 #: templates/app_gateway/access_policy_type_select.html:50 #: templates/generic_delete_confirmation.html:19 @@ -264,20 +264,28 @@ msgstr "Grupos permitidos" msgid "Authentication Methods" msgstr "Métodos de autenticación" -#: app_gateway/forms.py:185 +#: app_gateway/forms.py:188 msgid "Cannot select more than one Local Password authentication method." msgstr "" "No se puede seleccionar más de un método de autenticación de Contraseña " "Local." -#: app_gateway/forms.py:189 +#: app_gateway/forms.py:192 msgid "" "Cannot select more than one OpenID Connect (OIDC) authentication method." msgstr "" "No se puede seleccionar más de un método de autenticação OpenID Connect " "(OIDC)." -#: app_gateway/forms.py:193 +#: app_gateway/forms.py:196 +#, fuzzy +#| msgid "Cannot select more than one Local Password authentication method." +msgid "Cannot select more than one TOTP authentication method." +msgstr "" +"No se puede seleccionar más de un método de autenticación de Contraseña " +"Local." + +#: app_gateway/forms.py:200 msgid "" "Cannot select both Local Password and OpenID Connect (OIDC) authentication " "methods." @@ -285,7 +293,19 @@ msgstr "" "No se pueden seleccionar simultáneamente los métodos de autenticación de " "Contraseña Local y OpenID Connect (OIDC)." -#: app_gateway/forms.py:197 +#: app_gateway/forms.py:204 +#, fuzzy +#| msgid "" +#| "Cannot select both Local Password and OpenID Connect (OIDC) " +#| "authentication methods." +msgid "" +"TOTP must be combined with a Local Password or OpenID Connect authentication " +"method." +msgstr "" +"No se pueden seleccionar simultáneamente los métodos de autenticación de " +"Contraseña Local y OpenID Connect (OIDC)." + +#: app_gateway/forms.py:208 msgid "" "At least one user group must be selected when using Local Password " "authentication." @@ -293,31 +313,31 @@ msgstr "" "Se debe seleccionar al menos um grupo de usuarios al usar la autenticación " "de Contraseña Local." -#: app_gateway/forms.py:201 +#: app_gateway/forms.py:212 msgid "User groups can only be used with Local Password authentication." msgstr "" "Los grupos de usuarios solo se pueden usar con la autenticación de " "Contraseña Local." -#: app_gateway/forms.py:211 templates/app_gateway/app_gateway_list.html:62 +#: app_gateway/forms.py:222 templates/app_gateway/app_gateway_list.html:62 #: templates/app_gateway/application_details.html:31 #: templates/firewall/firewall_nav_tabs.html:15 msgid "Default Policy" msgstr "Política predeterminada" -#: app_gateway/forms.py:240 templates/app_gateway/application_details.html:105 +#: app_gateway/forms.py:251 templates/app_gateway/application_details.html:105 msgid "Route Name" msgstr "Nombre de la ruta" -#: app_gateway/forms.py:241 templates/app_gateway/application_details.html:106 +#: app_gateway/forms.py:252 templates/app_gateway/application_details.html:106 msgid "Path Prefix" msgstr "Prefijo de ruta" -#: app_gateway/forms.py:242 templates/app_gateway/application_details.html:107 +#: app_gateway/forms.py:253 templates/app_gateway/application_details.html:107 msgid "Policy" msgstr "Política" -#: app_gateway/forms.py:243 templates/app_gateway/application_details.html:108 +#: app_gateway/forms.py:254 templates/app_gateway/application_details.html:108 msgid "Order" msgstr "Orden" @@ -335,9 +355,9 @@ msgstr "Público" msgid "Protected" msgstr "Protegido" -#: app_gateway/models.py:45 gatekeeper/models.py:110 +#: app_gateway/models.py:45 gatekeeper/models.py:108 #: templates/app_gateway/access_policy_type_select.html:41 -#: templates/gatekeeper/gatekeeper_list.html:272 +#: templates/gatekeeper/gatekeeper_list.html:288 msgid "Deny" msgstr "Denegar" @@ -620,11 +640,11 @@ msgstr "Eliminar ruta de la aplicación" msgid "Are you sure you want to delete the route \"%(name)s\" (%(path)s)?" msgstr "¿Está seguro de que desea eliminar la ruta \"%(name)s\" (%(path)s)?" -#: app_gateway/views.py:444 +#: app_gateway/views.py:443 msgid "Configuration exported successfully." msgstr "Configuración exportada con éxito." -#: app_gateway/views.py:446 +#: app_gateway/views.py:445 msgid "" "Caddy is not active. Configuration files were exported for debugging " "purposes." @@ -636,13 +656,13 @@ msgstr "" msgid "IP Lock" msgstr "Bloqueo de IP" -#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198 +#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:271 #: templates/cluster/workers_list.html:10 #: templates/dns/static_host_list.html:18 #: templates/firewall/manage_redirect_rule.html:43 #: templates/firewall/manage_redirect_rule.html:67 #: templates/firewall/manage_redirect_rule.html:68 -#: templates/gatekeeper/gatekeeper_list.html:256 +#: templates/gatekeeper/gatekeeper_list.html:272 #: templates/wireguard/wireguard_status.html:45 msgid "IP Address" msgstr "Dirección IP" @@ -919,7 +939,7 @@ msgstr "DNS estático" msgid "Invalid hostname." msgstr "Nombre de host inválido." -#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201 +#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:274 #: templates/api_v2/api_documentation.html:51 #: templates/dns/static_host_list.html:69 #: templates/firewall/manage_redirect_rule.html:18 @@ -1251,43 +1271,29 @@ msgstr "Gestionar configuración de firewall" msgid "Firewall settings saved successfully" msgstr "Configuración de firewall guardada correctamente" -#: gatekeeper/forms.py:17 templates/accounts/login.html:14 -#: templates/gatekeeper/gatekeeper_list.html:61 -#: templates/user_manager/list.html:8 user_manager/forms.py:13 -#: vpn_invite/forms.py:281 -msgid "Username" -msgstr "Usuario" - -#: gatekeeper/forms.py:18 gatekeeper/forms.py:271 -#: templates/gatekeeper/gatekeeper_list.html:62 -#: templates/gatekeeper/gatekeeper_list.html:204 -#: templates/wireguard/peer_list/peer_preview_modal.html:103 -msgid "Email" -msgstr "Email" - -#: gatekeeper/forms.py:19 templates/accounts/login.html:23 +#: gatekeeper/forms.py:17 templates/accounts/login.html:23 #: templates/vpn_invite/invite_settings.html:19 user_manager/forms.py:14 #: vpn_invite/forms.py:282 msgid "Password" msgstr "Contraseña" #: gatekeeper/forms.py:20 -msgid "TOTP Secret" -msgstr "Secreto TOTP" +msgid "" +"Minimum 8 characters, with at least one uppercase letter, one lowercase " +"letter, and one number." +msgstr "" -#: gatekeeper/forms.py:55 templates/gatekeeper/gatekeeper_list.html:104 -msgid "Group Name" -msgstr "Nombre del grupo" +#: gatekeeper/forms.py:23 +#, fuzzy +#| msgid "Random Password" +msgid "Confirm Password" +msgstr "Contraseña aleatoria" -#: gatekeeper/forms.py:56 templates/gatekeeper/gatekeeper_list.html:105 -msgid "Members" -msgstr "Miembros" - -#: gatekeeper/forms.py:86 +#: gatekeeper/forms.py:28 gatekeeper/forms.py:161 msgid "TOTP Validation PIN" msgstr "PIN de validación TOTP" -#: gatekeeper/forms.py:89 +#: gatekeeper/forms.py:31 gatekeeper/forms.py:164 msgid "" "Enter a 6-digit PIN generated by your authenticator app to validate the " "secret." @@ -1295,95 +1301,151 @@ msgstr "" "Introduzca un PIN de 6 dígitos generado por su aplicación de autenticación " "para validar el secreto." -#: gatekeeper/forms.py:100 +#: gatekeeper/forms.py:38 templates/accounts/login.html:14 +#: templates/gatekeeper/gatekeeper_list.html:61 +#: templates/user_manager/list.html:8 user_manager/forms.py:13 +#: vpn_invite/forms.py:281 +msgid "Username" +msgstr "Usuario" + +#: gatekeeper/forms.py:39 gatekeeper/forms.py:344 +#: templates/gatekeeper/gatekeeper_list.html:62 +#: templates/gatekeeper/gatekeeper_list.html:220 +#: templates/wireguard/peer_list/peer_preview_modal.html:103 +msgid "Email" +msgstr "Email" + +#: gatekeeper/forms.py:40 +msgid "TOTP Secret" +msgstr "Secreto TOTP" + +#: gatekeeper/forms.py:87 +#, fuzzy +#| msgid "Port is required." +msgid "Password is required." +msgstr "Puerto es obligatorio." + +#: gatekeeper/forms.py:90 user_manager/forms.py:127 +msgid "Password must be at least 8 characters long." +msgstr "La contraseña debe tener al menos 8 caracteres." + +#: gatekeeper/forms.py:92 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one lowercase letter." +msgstr "La contraseña debe tener al menos 8 caracteres." + +#: gatekeeper/forms.py:94 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one uppercase letter." +msgstr "La contraseña debe tener al menos 8 caracteres." + +#: gatekeeper/forms.py:96 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one number." +msgstr "La contraseña debe tener al menos 8 caracteres." + +#: gatekeeper/forms.py:98 +#, fuzzy +#| msgid "Password Confirmation" +msgid "Passwords do not match." +msgstr "Confirmación de contraseña" + +#: gatekeeper/forms.py:103 gatekeeper/forms.py:249 +msgid "Please provide a PIN to validate the TOTP secret." +msgstr "Proporcione un PIN para validar el secreto TOTP." + +#: gatekeeper/forms.py:108 gatekeeper/forms.py:254 +msgid "Invalid TOTP PIN." +msgstr "PIN TOTP no válido." + +#: gatekeeper/forms.py:110 gatekeeper/forms.py:256 +msgid "Invalid TOTP secret format. Must be a valid Base32 string." +msgstr "Formato de secreto TOTP no válido. Debe ser una cadena Base32 válida." + +#: gatekeeper/forms.py:130 templates/gatekeeper/gatekeeper_list.html:120 +msgid "Group Name" +msgstr "Nombre del grupo" + +#: gatekeeper/forms.py:131 templates/gatekeeper/gatekeeper_list.html:121 +msgid "Members" +msgstr "Miembros" + +#: gatekeeper/forms.py:175 msgid "Authentication Type" msgstr "Tipo de autenticación" -#: gatekeeper/forms.py:101 +#: gatekeeper/forms.py:176 msgid "Global TOTP Secret" msgstr "Secreto TOTP global" -#: gatekeeper/forms.py:102 -msgid "Global TOTP Before Authentication" -msgstr "TOTP global antes de la autenticación" - -#: gatekeeper/forms.py:103 +#: gatekeeper/forms.py:177 msgid "OIDC Provider URL" msgstr "URL del proveedor OIDC" -#: gatekeeper/forms.py:104 +#: gatekeeper/forms.py:178 msgid "OIDC Client ID" msgstr "ID de cliente OIDC" -#: gatekeeper/forms.py:105 +#: gatekeeper/forms.py:179 msgid "OIDC Client Secret" msgstr "Secreto de cliente OIDC" -#: gatekeeper/forms.py:157 +#: gatekeeper/forms.py:230 msgid "TOTP secret must be empty for Local Password authentication." msgstr "" "El secreto TOTP debe estar vacío para la autenticación por contraseña local." -#: gatekeeper/forms.py:159 +#: gatekeeper/forms.py:232 msgid "TOTP validation PIN must be empty for Local Password authentication." msgstr "" "El PIN de validación TOTP debe estar vacío para la autenticación por " "contraseña local." -#: gatekeeper/forms.py:161 +#: gatekeeper/forms.py:234 msgid "OIDC fields must be empty for Local Password authentication." msgstr "" "Los campos OIDC deben estar vacíos para la autenticación por contraseña " "local." -#: gatekeeper/forms.py:167 +#: gatekeeper/forms.py:240 msgid "Only one Local Password authentication method can be configured." msgstr "" "Sólo se puede configurar un método de autenticación por contraseña local." -#: gatekeeper/forms.py:170 +#: gatekeeper/forms.py:243 msgid "OIDC fields must be empty for TOTP authentication." msgstr "Los campos OIDC deben estar vacíos para la autenticación TOTP." -#: gatekeeper/forms.py:172 +#: gatekeeper/forms.py:245 msgid "TOTP secret is required for TOTP authentication." msgstr "El secreto TOTP es obligatorio para la autenticación TOTP." -#: gatekeeper/forms.py:176 -msgid "Please provide a PIN to validate the TOTP secret." -msgstr "Proporcione un PIN para validar el secreto TOTP." - -#: gatekeeper/forms.py:181 -msgid "Invalid TOTP PIN." -msgstr "PIN TOTP no válido." - -#: gatekeeper/forms.py:183 -msgid "Invalid TOTP secret format. Must be a valid Base32 string." -msgstr "Formato de secreto TOTP no válido. Debe ser una cadena Base32 válida." - -#: gatekeeper/forms.py:186 +#: gatekeeper/forms.py:259 msgid "TOTP secret must be empty for OIDC authentication." msgstr "El secreto TOTP debe estar vacío para la autenticación OIDC." -#: gatekeeper/forms.py:188 +#: gatekeeper/forms.py:261 msgid "TOTP validation PIN must be empty for OIDC authentication." msgstr "El PIN de validación TOTP debe estar vacío para la autenticación OIDC." -#: gatekeeper/forms.py:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270 +#: gatekeeper/forms.py:270 gatekeeper/forms.py:312 gatekeeper/forms.py:343 msgid "Authentication Method" msgstr "Método de autenticación" -#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257 +#: gatekeeper/forms.py:272 templates/gatekeeper/gatekeeper_list.html:273 msgid "Prefix Length" msgstr "Longitud del prefijo" -#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47 +#: gatekeeper/forms.py:273 templates/firewall/firewall_rule_list.html:47 #: templates/firewall/manage_firewall_rule.html:360 -#: templates/gatekeeper/gatekeeper_list.html:258 +#: templates/gatekeeper/gatekeeper_list.html:274 msgid "Action" msgstr "Acción" -#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221 +#: gatekeeper/forms.py:313 templates/gatekeeper/gatekeeper_list.html:237 msgid "Domain" msgstr "Dominio" @@ -1407,15 +1469,15 @@ msgstr "Lista de direcciones IP" msgid "Shared/global TOTP secret key" msgstr "Clave secreta TOTP compartida/global" -#: gatekeeper/models.py:69 +#: gatekeeper/models.py:68 msgid "Password for local authentication (leave blank if not using)" msgstr "Contraseña para autenticación local (dejar en blanco si no se usa)" -#: gatekeeper/models.py:71 +#: gatekeeper/models.py:69 msgid "Per-user TOTP secret key" msgstr "Clave secreta TOTP por usuario" -#: gatekeeper/models.py:110 templates/gatekeeper/gatekeeper_list.html:270 +#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:286 msgid "Allow" msgstr "Permitir" @@ -1431,57 +1493,102 @@ msgstr "Crear usuario de Gatekeeper" msgid "Gatekeeper User saved successfully." msgstr "Usuario de Gatekeeper guardado correctamente." -#: gatekeeper/views.py:86 +#: gatekeeper/views.py:69 +msgid "" +"\n" +"

Gatekeeper User

\n" +"

Gatekeeper users are used for authenticating against protected " +"applications managed by this gateway.

\n" +"\n" +"
Password
\n" +"

Required when creating a user. When editing, leave both password " +"fields blank to keep the current password.\n" +" Passwords are stored using Argon2id hashing.

\n" +"\n" +"
TOTP Secret
\n" +"

Optional per-user TOTP secret. When set, this user will " +"authenticate using their own secret instead of the\n" +" global TOTP secret configured on the Authentication Method. Use the " +"buttons below the field to generate a\n" +" random secret and scan the QR code with your authenticator app. " +"Validate the secret by entering the current\n" +" 6-digit PIN before saving.

\n" +" " +msgstr "" + +#: gatekeeper/views.py:106 msgid "Gatekeeper User deleted successfully." msgstr "Usuario de Gatekeeper eliminado correctamente." -#: gatekeeper/views.py:91 +#: gatekeeper/views.py:111 msgid "Delete Gatekeeper User" msgstr "Eliminar usuario de Gatekeeper" -#: gatekeeper/views.py:93 +#: gatekeeper/views.py:113 #, python-format msgid "Are you sure you want to delete the user \"%(username)s\"?" msgstr "¿Está seguro de que desea eliminar al usuario \"%(username)s\"?" -#: gatekeeper/views.py:107 +#: gatekeeper/views.py:127 msgid "Edit Gatekeeper Group" msgstr "Editar grupo de Gatekeeper" -#: gatekeeper/views.py:110 +#: gatekeeper/views.py:130 msgid "Create Gatekeeper Group" msgstr "Crear grupo Gatekeeper" -#: gatekeeper/views.py:117 +#: gatekeeper/views.py:137 msgid "Gatekeeper Group saved successfully." msgstr "Grupo de Gatekeeper guardado correctamente." -#: gatekeeper/views.py:139 +#: gatekeeper/views.py:159 msgid "Gatekeeper Group deleted successfully." msgstr "Grupo de Gatekeeper eliminado correctamente." -#: gatekeeper/views.py:144 +#: gatekeeper/views.py:164 msgid "Delete Gatekeeper Group" msgstr "Eliminar grupo Gatekeeper" -#: gatekeeper/views.py:146 +#: gatekeeper/views.py:166 #, python-format msgid "Are you sure you want to delete the group \"%(name)s\"?" msgstr "¿Está seguro de que desea eliminar el grupo \"%(name)s\"?" -#: gatekeeper/views.py:160 +#: gatekeeper/views.py:180 msgid "Edit Authentication Method" msgstr "Editar método de autenticación" -#: gatekeeper/views.py:163 +#: gatekeeper/views.py:183 msgid "Create Authentication Method" msgstr "Crear método de autenticación" -#: gatekeeper/views.py:170 +#: gatekeeper/views.py:190 msgid "Authentication Method saved successfully." msgstr "Método de autenticación guardado correctamente." -#: gatekeeper/views.py:175 +#: gatekeeper/views.py:195 +#, fuzzy +#| msgid "" +#| "\n" +#| "

Authentication Types

\n" +#| "

Select how users will authenticate through this method.

\n" +#| " \n" +#| "
Local Password
\n" +#| "

Users will authenticate using a standard username and password " +#| "stored locally. Only one of this type can be created.

\n" +#| " \n" +#| "
OIDC (OpenID Connect)
\n" +#| "

Users will authenticate via an external identity provider " +#| "(like Keycloak, Google, or Authelia). Requires Provider URL, Client ID, " +#| "and Client Secret.

\n" +#| " \n" +#| "
TOTP (Time-Based One-Time Password)
\n" +#| "

Users will need to enter a rotating token from an " +#| "authenticator app. Requires setting a Global TOTP Secret.
If " +#| "Global TOTP Before Authentication is enabled, the PIN is " +#| "required before the username and password to help combat bruteforce " +#| "attacks.

\n" +#| " " msgid "" "\n" "

Authentication Types

\n" @@ -1498,9 +1605,8 @@ msgid "" " \n" "
TOTP (Time-Based One-Time Password)
\n" "

Users will need to enter a rotating token from an authenticator " -"app. Requires setting a Global TOTP Secret.
If Global TOTP " -"Before Authentication is enabled, the PIN is required before the " -"username and password to help combat bruteforce attacks.

\n" +"app. If a user does not have a personal TOTP configured, the Global " +"TOTP Secret will be used instead.

\n" " " msgstr "" "\n" @@ -1526,87 +1632,87 @@ msgstr "" "para ayudar a combatir los ataques de fuerza bruta.

\n" " " -#: gatekeeper/views.py:210 +#: gatekeeper/views.py:230 msgid "Authentication Method deleted successfully." msgstr "Método de autenticación eliminado correctamente." -#: gatekeeper/views.py:215 +#: gatekeeper/views.py:235 msgid "Delete Authentication Method" msgstr "Eliminar método de autenticación" -#: gatekeeper/views.py:217 +#: gatekeeper/views.py:237 #, python-format msgid "Are you sure you want to delete the authentication method \"%(name)s\"?" msgstr "" "¿Está seguro de que desea eliminar el método de autenticación \"%(name)s\"?" -#: gatekeeper/views.py:267 +#: gatekeeper/views.py:287 msgid "Edit Allowed Domain" msgstr "Editar dominio permitido" -#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186 +#: gatekeeper/views.py:290 templates/gatekeeper/gatekeeper_list.html:202 msgid "Add Allowed Domain" msgstr "Añadir dominio permitido" -#: gatekeeper/views.py:277 +#: gatekeeper/views.py:297 msgid "Allowed Domain saved successfully." msgstr "Dominio permitido guardado correctamente." -#: gatekeeper/views.py:299 +#: gatekeeper/views.py:319 msgid "Allowed Domain deleted successfully." msgstr "Dominio permitido eliminado correctamente." -#: gatekeeper/views.py:304 +#: gatekeeper/views.py:324 msgid "Delete Allowed Domain" msgstr "Eliminar dominio permitido" -#: gatekeeper/views.py:306 +#: gatekeeper/views.py:326 #, python-format msgid "Are you sure you want to delete the allowed domain \"%(domain)s\"?" msgstr "" "¿Está seguro de que desea eliminar el dominio permitido \"%(domain)s\"?" -#: gatekeeper/views.py:320 +#: gatekeeper/views.py:340 msgid "Edit Allowed Email" msgstr "Editar correo electrónico permitido" -#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183 +#: gatekeeper/views.py:343 templates/gatekeeper/gatekeeper_list.html:199 msgid "Add Allowed Email" msgstr "Añadir correo electrónico permitido" -#: gatekeeper/views.py:330 +#: gatekeeper/views.py:350 msgid "Allowed Email saved successfully." msgstr "Correo electrónico permitido guardado correctamente." -#: gatekeeper/views.py:352 +#: gatekeeper/views.py:372 msgid "Allowed Email deleted successfully." msgstr "Correo electrónico permitido eliminado correctamente." -#: gatekeeper/views.py:357 +#: gatekeeper/views.py:377 msgid "Delete Allowed Email" msgstr "Eliminar correo electrónico permitido" -#: gatekeeper/views.py:359 +#: gatekeeper/views.py:379 #, python-format msgid "Are you sure you want to delete the allowed email \"%(email)s\"?" msgstr "" "¿Está seguro de que desea eliminar el correo electrónico permitido " "\"%(email)s\"?" -#: gatekeeper/views.py:373 +#: gatekeeper/views.py:393 msgid "Edit IP Address" msgstr "Editar dirección IP" -#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247 +#: gatekeeper/views.py:396 templates/gatekeeper/gatekeeper_list.html:263 #: templates/wireguard/wireguard_manage_peer.html:171 msgid "Add IP Address" msgstr "Añadir IP" -#: gatekeeper/views.py:383 +#: gatekeeper/views.py:403 msgid "IP Address saved successfully." msgstr "Dirección IP guardada correctamente." -#: gatekeeper/views.py:388 +#: gatekeeper/views.py:408 msgid "" "\n" "
IP Address List
\n" @@ -1653,15 +1759,15 @@ msgstr "" "\"Red de la Oficina\", \"Atacante Bloqueado\").

\n" " " -#: gatekeeper/views.py:424 +#: gatekeeper/views.py:444 msgid "IP Address deleted successfully." msgstr "Dirección IP eliminada correctamente." -#: gatekeeper/views.py:429 +#: gatekeeper/views.py:449 msgid "Delete IP Address" msgstr "Eliminar dirección IP" -#: gatekeeper/views.py:431 +#: gatekeeper/views.py:451 #, python-format msgid "Are you sure you want to delete the IP address \"%(address)s\"?" msgstr "¿Está seguro de que desea eliminar la dirección IP \"%(address)s\"?" @@ -2027,8 +2133,8 @@ msgid "In" msgstr "Entrada" #: templates/api_v2/api_documentation.html:49 -#: templates/gatekeeper/gatekeeper_list.html:150 -#: templates/gatekeeper/gatekeeper_list.html:195 +#: templates/gatekeeper/gatekeeper_list.html:166 +#: templates/gatekeeper/gatekeeper_list.html:211 #: templates/wireguard/apply_route_template.html:27 msgid "Type" msgstr "Tipo" @@ -2038,11 +2144,13 @@ msgid "Required" msgstr "Obligatorio" #: templates/api_v2/api_documentation.html:62 +#: templates/gatekeeper/gatekeeper_list.html:75 #: templates/scheduler/scheduleprofile_form.html:175 msgid "Yes" msgstr "Sí" #: templates/api_v2/api_documentation.html:64 +#: templates/gatekeeper/gatekeeper_list.html:77 #: templates/scheduler/scheduleprofile_form.html:177 msgid "No" msgstr "No" @@ -2087,12 +2195,12 @@ msgstr "Deshabilitado" #: templates/app_gateway/application_details.html:121 #: templates/cluster/workers_list.html:77 #: templates/dns/static_host_list.html:74 -#: templates/gatekeeper/gatekeeper_list.html:73 -#: templates/gatekeeper/gatekeeper_list.html:116 -#: templates/gatekeeper/gatekeeper_list.html:161 -#: templates/gatekeeper/gatekeeper_list.html:209 -#: templates/gatekeeper/gatekeeper_list.html:226 -#: templates/gatekeeper/gatekeeper_list.html:278 +#: templates/gatekeeper/gatekeeper_list.html:89 +#: templates/gatekeeper/gatekeeper_list.html:132 +#: templates/gatekeeper/gatekeeper_list.html:177 +#: templates/gatekeeper/gatekeeper_list.html:225 +#: templates/gatekeeper/gatekeeper_list.html:242 +#: templates/gatekeeper/gatekeeper_list.html:294 #: templates/routing_templates/list.html:29 #: templates/scheduler/scheduleprofile_form.html:123 #: templates/scheduler/scheduleprofile_list.html:25 @@ -2174,6 +2282,7 @@ msgstr "Añadir política de acceso" #: templates/app_gateway/app_gateway_list.html:140 #: templates/gatekeeper/gatekeeper_list.html:43 +#: templates/gatekeeper/gatekeeper_list.html:64 msgid "Groups" msgstr "Grupos" @@ -2184,10 +2293,10 @@ msgstr "Métodos de autenticación" #: templates/app_gateway/app_gateway_list.html:142 #: templates/app_gateway/application_details.html:62 #: templates/app_gateway/application_details.html:109 -#: templates/gatekeeper/gatekeeper_list.html:63 -#: templates/gatekeeper/gatekeeper_list.html:106 -#: templates/gatekeeper/gatekeeper_list.html:151 -#: templates/gatekeeper/gatekeeper_list.html:198 +#: templates/gatekeeper/gatekeeper_list.html:65 +#: templates/gatekeeper/gatekeeper_list.html:122 +#: templates/gatekeeper/gatekeeper_list.html:167 +#: templates/gatekeeper/gatekeeper_list.html:214 #: templates/scheduler/scheduleprofile_form.html:111 #: templates/scheduler/scheduleprofile_list.html:15 #: templates/wireguard/apply_route_template.html:28 @@ -2737,10 +2846,19 @@ msgid "Create Port forwarding Rule" msgstr "Crear regla de reenvío de puerto" #: templates/gatekeeper/gatekeeper_auth_method_form.html:63 +#: templates/gatekeeper/gatekeeper_user_form.html:43 msgid "View QR Code" msgstr "Ver código QR" -#: templates/gatekeeper/gatekeeper_auth_method_form.html:74 +#: templates/gatekeeper/gatekeeper_auth_method_form.html:64 +#: templates/gatekeeper/gatekeeper_user_form.html:44 +#, fuzzy +#| msgid "Global TOTP Secret" +msgid "Generate TOTP Secret" +msgstr "Secreto TOTP global" + +#: templates/gatekeeper/gatekeeper_auth_method_form.html:93 +#: templates/gatekeeper/gatekeeper_user_form.html:73 msgid "Please enter a TOTP Secret first to generate the QR code." msgstr "" "Por favor, introduzca primero un secreto TOTP para generar el código QR." @@ -2767,44 +2885,48 @@ msgstr "Usuarios" msgid "Add User" msgstr "Añadir usuario" -#: templates/gatekeeper/gatekeeper_list.html:88 +#: templates/gatekeeper/gatekeeper_list.html:63 +msgid "TOTP" +msgstr "" + +#: templates/gatekeeper/gatekeeper_list.html:104 msgid "No Gatekeeper Users found." msgstr "No se han encontrado usuarios de Gatekeeper." -#: templates/gatekeeper/gatekeeper_list.html:95 +#: templates/gatekeeper/gatekeeper_list.html:111 msgid "Add Group" msgstr "Añadir grupo" -#: templates/gatekeeper/gatekeeper_list.html:131 +#: templates/gatekeeper/gatekeeper_list.html:147 msgid "No Gatekeeper Groups found." msgstr "No se han encontrado grupos de Gatekeeper." -#: templates/gatekeeper/gatekeeper_list.html:140 +#: templates/gatekeeper/gatekeeper_list.html:156 msgid "Add Auth Method" msgstr "Añadir método de autenticación" -#: templates/gatekeeper/gatekeeper_list.html:176 +#: templates/gatekeeper/gatekeeper_list.html:192 msgid "No Authentication Methods found." msgstr "No se han encontrado métodos de autenticación." -#: templates/gatekeeper/gatekeeper_list.html:196 +#: templates/gatekeeper/gatekeeper_list.html:212 msgid "Identity" msgstr "Identidad" -#: templates/gatekeeper/gatekeeper_list.html:197 -#: templates/gatekeeper/gatekeeper_list.html:259 +#: templates/gatekeeper/gatekeeper_list.html:213 +#: templates/gatekeeper/gatekeeper_list.html:275 msgid "Auth Method" msgstr "Método de autenticación" -#: templates/gatekeeper/gatekeeper_list.html:241 +#: templates/gatekeeper/gatekeeper_list.html:257 msgid "No Allowed Emails or Domains found." msgstr "No se han encontrado correos electrónicos o dominios permitidos." -#: templates/gatekeeper/gatekeeper_list.html:260 +#: templates/gatekeeper/gatekeeper_list.html:276 msgid "Manage" msgstr "Gestionar" -#: templates/gatekeeper/gatekeeper_list.html:293 +#: templates/gatekeeper/gatekeeper_list.html:309 msgid "No IP Addresses found." msgstr "No se han encontrado direcciones IP." @@ -3640,10 +3762,6 @@ msgstr "Confirmación de contraseña obligatoria para nuevos usuarios." msgid "The two password fields didn't match." msgstr "Las contraseñas no coinciden." -#: user_manager/forms.py:127 -msgid "Password must be at least 8 characters long." -msgstr "La contraseña debe tener al menos 8 caracteres." - #: user_manager/forms.py:220 msgid "A peer group with that name already exists." msgstr "Ya existe un grupo de peers con ese nombre." @@ -4404,3 +4522,6 @@ msgstr "Errores encontrados|Error al procesar una o más interfaces." msgid "No interfaces found|No WireGuard interfaces were found to process." msgstr "" "No se encontraron interfaces|No hay interfaces WireGuard para procesar." + +#~ msgid "Global TOTP Before Authentication" +#~ msgstr "TOTP global antes de la autenticación" diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo index f8e8d095e39f11e20eaf7c69c60808f84de47273..1d04d7d6cb86a6a928e2ff9ebda43b2c3f5772bd 100644 GIT binary patch delta 17030 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 L`@Qy_geLz5-v1`J diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index a8827b7..0d2e2bd 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-14 11:54-0300\n" +"POT-Creation-Date: 2026-03-15 17:20-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,12 +38,12 @@ msgstr "Retour" #: templates/app_gateway/application_details.html:125 #: templates/firewall/manage_firewall_rule.html:382 #: templates/firewall/manage_redirect_rule.html:86 -#: templates/gatekeeper/gatekeeper_list.html:77 -#: templates/gatekeeper/gatekeeper_list.html:120 -#: templates/gatekeeper/gatekeeper_list.html:165 -#: templates/gatekeeper/gatekeeper_list.html:213 -#: templates/gatekeeper/gatekeeper_list.html:230 -#: templates/gatekeeper/gatekeeper_list.html:282 +#: templates/gatekeeper/gatekeeper_list.html:93 +#: templates/gatekeeper/gatekeeper_list.html:136 +#: templates/gatekeeper/gatekeeper_list.html:181 +#: templates/gatekeeper/gatekeeper_list.html:229 +#: templates/gatekeeper/gatekeeper_list.html:246 +#: templates/gatekeeper/gatekeeper_list.html:298 #: templates/scheduler/scheduleprofile_form.html:127 #: templates/scheduler/scheduleprofile_list.html:29 #: templates/wireguard/peer_list/peer_preview_modal.html:109 @@ -65,11 +65,11 @@ msgstr "" "fonctionner immédiatement." #: api_v2/forms.py:63 app_gateway/forms.py:40 app_gateway/forms.py:92 -#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:226 -#: app_gateway/forms.py:267 cluster/forms.py:67 cluster/forms.py:124 -#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:41 -#: gatekeeper/forms.py:75 gatekeeper/forms.py:139 gatekeeper/forms.py:226 -#: gatekeeper/forms.py:256 gatekeeper/forms.py:287 +#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:237 +#: app_gateway/forms.py:278 cluster/forms.py:67 cluster/forms.py:124 +#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:70 +#: gatekeeper/forms.py:150 gatekeeper/forms.py:212 gatekeeper/forms.py:299 +#: gatekeeper/forms.py:329 gatekeeper/forms.py:360 #: routing_templates/forms.py:71 scheduler/forms.py:102 #: templates/firewall/manage_firewall_rule.html:379 #: templates/firewall/manage_firewall_settings.html:59 @@ -83,13 +83,13 @@ msgid "Save" msgstr "Enregistrer" #: api_v2/models.py:10 app_gateway/forms.py:18 app_gateway/forms.py:106 -#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:99 +#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:174 #: routing_templates/forms.py:28 templates/api_v2/api_documentation.html:47 #: templates/api_v2/list.html:8 templates/app_gateway/app_gateway_list.html:58 #: templates/app_gateway/app_gateway_list.html:138 #: templates/app_gateway/application_details.html:26 #: templates/cluster/workers_list.html:8 templates/dns/static_host_list.html:68 -#: templates/gatekeeper/gatekeeper_list.html:149 +#: templates/gatekeeper/gatekeeper_list.html:165 #: templates/routing_templates/list.html:8 #: templates/scheduler/scheduleprofile_list.html:13 #: templates/user_manager/peer_group_list.html:8 @@ -133,10 +133,10 @@ msgstr "Activé" #: app_gateway/views.py:293 app_gateway/views.py:328 app_gateway/views.py:354 #: app_gateway/views.py:404 app_gateway/views.py:432 cluster/views.py:18 #: cluster/views.py:45 cluster/views.py:114 gatekeeper/views.py:23 -#: gatekeeper/views.py:48 gatekeeper/views.py:78 gatekeeper/views.py:101 -#: gatekeeper/views.py:131 gatekeeper/views.py:154 gatekeeper/views.py:202 -#: gatekeeper/views.py:261 gatekeeper/views.py:291 gatekeeper/views.py:314 -#: gatekeeper/views.py:344 gatekeeper/views.py:367 gatekeeper/views.py:416 +#: gatekeeper/views.py:48 gatekeeper/views.py:98 gatekeeper/views.py:121 +#: gatekeeper/views.py:151 gatekeeper/views.py:174 gatekeeper/views.py:222 +#: gatekeeper/views.py:281 gatekeeper/views.py:311 gatekeeper/views.py:334 +#: gatekeeper/views.py:364 gatekeeper/views.py:387 gatekeeper/views.py:436 #: templates/access_denied.html:9 msgid "Access Denied" msgstr "Accès refusé" @@ -217,9 +217,9 @@ msgid "Upstream" msgstr "Upstream" #: app_gateway/forms.py:41 app_gateway/forms.py:93 app_gateway/forms.py:137 -#: app_gateway/forms.py:155 app_gateway/forms.py:227 app_gateway/forms.py:268 -#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140 -#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288 +#: app_gateway/forms.py:155 app_gateway/forms.py:238 app_gateway/forms.py:279 +#: gatekeeper/forms.py:71 gatekeeper/forms.py:151 gatekeeper/forms.py:213 +#: gatekeeper/forms.py:300 gatekeeper/forms.py:330 gatekeeper/forms.py:361 #: scheduler/forms.py:103 #: templates/app_gateway/access_policy_type_select.html:50 #: templates/generic_delete_confirmation.html:19 @@ -263,20 +263,28 @@ msgstr "Groupes autorisés" msgid "Authentication Methods" msgstr "Méthodes d'authentification" -#: app_gateway/forms.py:185 +#: app_gateway/forms.py:188 msgid "Cannot select more than one Local Password authentication method." msgstr "" "Impossible de sélectionner plus d'une méthode d'authentification par mot de " "passe local." -#: app_gateway/forms.py:189 +#: app_gateway/forms.py:192 msgid "" "Cannot select more than one OpenID Connect (OIDC) authentication method." msgstr "" "Impossible de sélectionner plus d'une méthode d'authentification OpenID " "Connect (OIDC)." -#: app_gateway/forms.py:193 +#: app_gateway/forms.py:196 +#, fuzzy +#| msgid "Cannot select more than one Local Password authentication method." +msgid "Cannot select more than one TOTP authentication method." +msgstr "" +"Impossible de sélectionner plus d'une méthode d'authentification par mot de " +"passe local." + +#: app_gateway/forms.py:200 msgid "" "Cannot select both Local Password and OpenID Connect (OIDC) authentication " "methods." @@ -284,7 +292,19 @@ msgstr "" "Impossible de sélectionner à la fois les méthodes d'authentification par mot " "de passe local et OpenID Connect (OIDC)." -#: app_gateway/forms.py:197 +#: app_gateway/forms.py:204 +#, fuzzy +#| msgid "" +#| "Cannot select both Local Password and OpenID Connect (OIDC) " +#| "authentication methods." +msgid "" +"TOTP must be combined with a Local Password or OpenID Connect authentication " +"method." +msgstr "" +"Impossible de sélectionner à la fois les méthodes d'authentification par mot " +"de passe local et OpenID Connect (OIDC)." + +#: app_gateway/forms.py:208 msgid "" "At least one user group must be selected when using Local Password " "authentication." @@ -292,31 +312,31 @@ msgstr "" "Au moins un groupe d'utilisateurs doit être sélectionné lors de " "l'utilisation de l'authentification par mot de passe local." -#: app_gateway/forms.py:201 +#: app_gateway/forms.py:212 msgid "User groups can only be used with Local Password authentication." msgstr "" "Les groupes d'utilisateurs ne peuvent être utilisés qu'avec " "l'authentification par mot de passe local." -#: app_gateway/forms.py:211 templates/app_gateway/app_gateway_list.html:62 +#: app_gateway/forms.py:222 templates/app_gateway/app_gateway_list.html:62 #: templates/app_gateway/application_details.html:31 #: templates/firewall/firewall_nav_tabs.html:15 msgid "Default Policy" msgstr "Politique par défaut" -#: app_gateway/forms.py:240 templates/app_gateway/application_details.html:105 +#: app_gateway/forms.py:251 templates/app_gateway/application_details.html:105 msgid "Route Name" msgstr "Nom de la route" -#: app_gateway/forms.py:241 templates/app_gateway/application_details.html:106 +#: app_gateway/forms.py:252 templates/app_gateway/application_details.html:106 msgid "Path Prefix" msgstr "Préfixe de chemin" -#: app_gateway/forms.py:242 templates/app_gateway/application_details.html:107 +#: app_gateway/forms.py:253 templates/app_gateway/application_details.html:107 msgid "Policy" msgstr "Politique" -#: app_gateway/forms.py:243 templates/app_gateway/application_details.html:108 +#: app_gateway/forms.py:254 templates/app_gateway/application_details.html:108 msgid "Order" msgstr "Ordre" @@ -334,9 +354,9 @@ msgstr "Public" msgid "Protected" msgstr "Protégé" -#: app_gateway/models.py:45 gatekeeper/models.py:110 +#: app_gateway/models.py:45 gatekeeper/models.py:108 #: templates/app_gateway/access_policy_type_select.html:41 -#: templates/gatekeeper/gatekeeper_list.html:272 +#: templates/gatekeeper/gatekeeper_list.html:288 msgid "Deny" msgstr "Refuser" @@ -624,11 +644,11 @@ msgstr "Supprimer la route d'application" msgid "Are you sure you want to delete the route \"%(name)s\" (%(path)s)?" msgstr "Êtes-vous sûr de vouloir supprimer la route \"%(name)s\" (%(path)s) ?" -#: app_gateway/views.py:444 +#: app_gateway/views.py:443 msgid "Configuration exported successfully." msgstr "Configuration exportée avec succès." -#: app_gateway/views.py:446 +#: app_gateway/views.py:445 msgid "" "Caddy is not active. Configuration files were exported for debugging " "purposes." @@ -640,13 +660,13 @@ msgstr "" msgid "IP Lock" msgstr "Verrouillage IP" -#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198 +#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:271 #: templates/cluster/workers_list.html:10 #: templates/dns/static_host_list.html:18 #: templates/firewall/manage_redirect_rule.html:43 #: templates/firewall/manage_redirect_rule.html:67 #: templates/firewall/manage_redirect_rule.html:68 -#: templates/gatekeeper/gatekeeper_list.html:256 +#: templates/gatekeeper/gatekeeper_list.html:272 #: templates/wireguard/wireguard_status.html:45 msgid "IP Address" msgstr "Adresse IP" @@ -922,7 +942,7 @@ msgstr "DNS statique" msgid "Invalid hostname." msgstr "Nom d'hôte invalide." -#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201 +#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:274 #: templates/api_v2/api_documentation.html:51 #: templates/dns/static_host_list.html:69 #: templates/firewall/manage_redirect_rule.html:18 @@ -1256,43 +1276,29 @@ msgstr "Gérer les paramètres du pare‑feu" msgid "Firewall settings saved successfully" msgstr "Paramètres du pare‑feu enregistrés avec succès" -#: gatekeeper/forms.py:17 templates/accounts/login.html:14 -#: templates/gatekeeper/gatekeeper_list.html:61 -#: templates/user_manager/list.html:8 user_manager/forms.py:13 -#: vpn_invite/forms.py:281 -msgid "Username" -msgstr "Nom d’utilisateur" - -#: gatekeeper/forms.py:18 gatekeeper/forms.py:271 -#: templates/gatekeeper/gatekeeper_list.html:62 -#: templates/gatekeeper/gatekeeper_list.html:204 -#: templates/wireguard/peer_list/peer_preview_modal.html:103 -msgid "Email" -msgstr "E‑mail" - -#: gatekeeper/forms.py:19 templates/accounts/login.html:23 +#: gatekeeper/forms.py:17 templates/accounts/login.html:23 #: templates/vpn_invite/invite_settings.html:19 user_manager/forms.py:14 #: vpn_invite/forms.py:282 msgid "Password" msgstr "Mot de passe" #: gatekeeper/forms.py:20 -msgid "TOTP Secret" -msgstr "Secret TOTP" +msgid "" +"Minimum 8 characters, with at least one uppercase letter, one lowercase " +"letter, and one number." +msgstr "" -#: gatekeeper/forms.py:55 templates/gatekeeper/gatekeeper_list.html:104 -msgid "Group Name" -msgstr "Nom du groupe" +#: gatekeeper/forms.py:23 +#, fuzzy +#| msgid "Random Password" +msgid "Confirm Password" +msgstr "Mot de passe aléatoire" -#: gatekeeper/forms.py:56 templates/gatekeeper/gatekeeper_list.html:105 -msgid "Members" -msgstr "Membres" - -#: gatekeeper/forms.py:86 +#: gatekeeper/forms.py:28 gatekeeper/forms.py:161 msgid "TOTP Validation PIN" msgstr "Code de validation TOTP" -#: gatekeeper/forms.py:89 +#: gatekeeper/forms.py:31 gatekeeper/forms.py:164 msgid "" "Enter a 6-digit PIN generated by your authenticator app to validate the " "secret." @@ -1300,97 +1306,153 @@ msgstr "" "Saisissez un code à 6 chiffres généré par votre application " "d'authentification pour valider le secret." -#: gatekeeper/forms.py:100 +#: gatekeeper/forms.py:38 templates/accounts/login.html:14 +#: templates/gatekeeper/gatekeeper_list.html:61 +#: templates/user_manager/list.html:8 user_manager/forms.py:13 +#: vpn_invite/forms.py:281 +msgid "Username" +msgstr "Nom d’utilisateur" + +#: gatekeeper/forms.py:39 gatekeeper/forms.py:344 +#: templates/gatekeeper/gatekeeper_list.html:62 +#: templates/gatekeeper/gatekeeper_list.html:220 +#: templates/wireguard/peer_list/peer_preview_modal.html:103 +msgid "Email" +msgstr "E‑mail" + +#: gatekeeper/forms.py:40 +msgid "TOTP Secret" +msgstr "Secret TOTP" + +#: gatekeeper/forms.py:87 +#, fuzzy +#| msgid "Port is required." +msgid "Password is required." +msgstr "Le port est obligatoire." + +#: gatekeeper/forms.py:90 user_manager/forms.py:127 +msgid "Password must be at least 8 characters long." +msgstr "Le mot de passe doit comporter au moins 8 caractères." + +#: gatekeeper/forms.py:92 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one lowercase letter." +msgstr "Le mot de passe doit comporter au moins 8 caractères." + +#: gatekeeper/forms.py:94 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one uppercase letter." +msgstr "Le mot de passe doit comporter au moins 8 caractères." + +#: gatekeeper/forms.py:96 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one number." +msgstr "Le mot de passe doit comporter au moins 8 caractères." + +#: gatekeeper/forms.py:98 +#, fuzzy +#| msgid "Password Confirmation" +msgid "Passwords do not match." +msgstr "Confirmation du mot de passe" + +#: gatekeeper/forms.py:103 gatekeeper/forms.py:249 +msgid "Please provide a PIN to validate the TOTP secret." +msgstr "Veuillez fournir un code pour valider le secret TOTP." + +#: gatekeeper/forms.py:108 gatekeeper/forms.py:254 +msgid "Invalid TOTP PIN." +msgstr "Code TOTP invalide." + +#: gatekeeper/forms.py:110 gatekeeper/forms.py:256 +msgid "Invalid TOTP secret format. Must be a valid Base32 string." +msgstr "Format du secret TOTP invalide. Doit être une chaîne Base32 valide." + +#: gatekeeper/forms.py:130 templates/gatekeeper/gatekeeper_list.html:120 +msgid "Group Name" +msgstr "Nom du groupe" + +#: gatekeeper/forms.py:131 templates/gatekeeper/gatekeeper_list.html:121 +msgid "Members" +msgstr "Membres" + +#: gatekeeper/forms.py:175 msgid "Authentication Type" msgstr "Type d'authentification" -#: gatekeeper/forms.py:101 +#: gatekeeper/forms.py:176 msgid "Global TOTP Secret" msgstr "Secret TOTP mondial" -#: gatekeeper/forms.py:102 -msgid "Global TOTP Before Authentication" -msgstr "TOTP global avant l'authentification" - -#: gatekeeper/forms.py:103 +#: gatekeeper/forms.py:177 msgid "OIDC Provider URL" msgstr "URL du fournisseur OIDC" -#: gatekeeper/forms.py:104 +#: gatekeeper/forms.py:178 msgid "OIDC Client ID" msgstr "ID client OIDC" -#: gatekeeper/forms.py:105 +#: gatekeeper/forms.py:179 msgid "OIDC Client Secret" msgstr "Secret client OIDC" -#: gatekeeper/forms.py:157 +#: gatekeeper/forms.py:230 msgid "TOTP secret must be empty for Local Password authentication." msgstr "" "Le secret TOTP doit être vide pour l'authentification par mot de passe local." -#: gatekeeper/forms.py:159 +#: gatekeeper/forms.py:232 msgid "TOTP validation PIN must be empty for Local Password authentication." msgstr "" "Le code de validation TOTP doit être vide pour l'authentification par mot de " "passe local." -#: gatekeeper/forms.py:161 +#: gatekeeper/forms.py:234 msgid "OIDC fields must be empty for Local Password authentication." msgstr "" "Les champs OIDC doivent être vides pour l'authentification par mot de passe " "local." -#: gatekeeper/forms.py:167 +#: gatekeeper/forms.py:240 msgid "Only one Local Password authentication method can be configured." msgstr "" "Un seul système d'authentification par mot de passe local peut être " "configuré." -#: gatekeeper/forms.py:170 +#: gatekeeper/forms.py:243 msgid "OIDC fields must be empty for TOTP authentication." msgstr "Les champs OIDC doivent être vides pour l'authentification TOTP." -#: gatekeeper/forms.py:172 +#: gatekeeper/forms.py:245 msgid "TOTP secret is required for TOTP authentication." msgstr "Le secret TOTP est requis pour l'authentification TOTP." -#: gatekeeper/forms.py:176 -msgid "Please provide a PIN to validate the TOTP secret." -msgstr "Veuillez fournir un code pour valider le secret TOTP." - -#: gatekeeper/forms.py:181 -msgid "Invalid TOTP PIN." -msgstr "Code TOTP invalide." - -#: gatekeeper/forms.py:183 -msgid "Invalid TOTP secret format. Must be a valid Base32 string." -msgstr "Format du secret TOTP invalide. Doit être une chaîne Base32 valide." - -#: gatekeeper/forms.py:186 +#: gatekeeper/forms.py:259 msgid "TOTP secret must be empty for OIDC authentication." msgstr "Le secret TOTP doit être vide pour l'authentification OIDC." -#: gatekeeper/forms.py:188 +#: gatekeeper/forms.py:261 msgid "TOTP validation PIN must be empty for OIDC authentication." msgstr "" "Le code de validation TOTP doit être vide pour l'authentification OIDC." -#: gatekeeper/forms.py:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270 +#: gatekeeper/forms.py:270 gatekeeper/forms.py:312 gatekeeper/forms.py:343 msgid "Authentication Method" msgstr "Méthode d'authentification" -#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257 +#: gatekeeper/forms.py:272 templates/gatekeeper/gatekeeper_list.html:273 msgid "Prefix Length" msgstr "Longueur du préfixe" -#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47 +#: gatekeeper/forms.py:273 templates/firewall/firewall_rule_list.html:47 #: templates/firewall/manage_firewall_rule.html:360 -#: templates/gatekeeper/gatekeeper_list.html:258 +#: templates/gatekeeper/gatekeeper_list.html:274 msgid "Action" msgstr "Action" -#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221 +#: gatekeeper/forms.py:313 templates/gatekeeper/gatekeeper_list.html:237 msgid "Domain" msgstr "Domaine" @@ -1414,17 +1476,17 @@ msgstr "Liste d'adresses IP" msgid "Shared/global TOTP secret key" msgstr "Clé secrète TOTP partagée/globale" -#: gatekeeper/models.py:69 +#: gatekeeper/models.py:68 msgid "Password for local authentication (leave blank if not using)" msgstr "" "Mot de passe pour l'authentification locale (laissez vide si vous ne " "l'utilisez pas)" -#: gatekeeper/models.py:71 +#: gatekeeper/models.py:69 msgid "Per-user TOTP secret key" msgstr "Clé secrète TOTP par utilisateur" -#: gatekeeper/models.py:110 templates/gatekeeper/gatekeeper_list.html:270 +#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:286 msgid "Allow" msgstr "Autoriser" @@ -1440,57 +1502,102 @@ msgstr "Créer un utilisateur Gatekeeper" msgid "Gatekeeper User saved successfully." msgstr "Utilisateur Gatekeeper enregistré avec succès." -#: gatekeeper/views.py:86 +#: gatekeeper/views.py:69 +msgid "" +"\n" +"

Gatekeeper User

\n" +"

Gatekeeper users are used for authenticating against protected " +"applications managed by this gateway.

\n" +"\n" +"
Password
\n" +"

Required when creating a user. When editing, leave both password " +"fields blank to keep the current password.\n" +" Passwords are stored using Argon2id hashing.

\n" +"\n" +"
TOTP Secret
\n" +"

Optional per-user TOTP secret. When set, this user will " +"authenticate using their own secret instead of the\n" +" global TOTP secret configured on the Authentication Method. Use the " +"buttons below the field to generate a\n" +" random secret and scan the QR code with your authenticator app. " +"Validate the secret by entering the current\n" +" 6-digit PIN before saving.

\n" +" " +msgstr "" + +#: gatekeeper/views.py:106 msgid "Gatekeeper User deleted successfully." msgstr "Utilisateur Gatekeeper supprimé avec succès." -#: gatekeeper/views.py:91 +#: gatekeeper/views.py:111 msgid "Delete Gatekeeper User" msgstr "Supprimer l'utilisateur Gatekeeper" -#: gatekeeper/views.py:93 +#: gatekeeper/views.py:113 #, python-format msgid "Are you sure you want to delete the user \"%(username)s\"?" msgstr "Êtes-vous sûr de vouloir supprimer l'utilisateur \"%(username)s\" ?" -#: gatekeeper/views.py:107 +#: gatekeeper/views.py:127 msgid "Edit Gatekeeper Group" msgstr "Modifier le groupe Gatekeeper" -#: gatekeeper/views.py:110 +#: gatekeeper/views.py:130 msgid "Create Gatekeeper Group" msgstr "Créer un groupe Gatekeeper" -#: gatekeeper/views.py:117 +#: gatekeeper/views.py:137 msgid "Gatekeeper Group saved successfully." msgstr "Groupe Gatekeeper enregistré avec succès." -#: gatekeeper/views.py:139 +#: gatekeeper/views.py:159 msgid "Gatekeeper Group deleted successfully." msgstr "Groupe Gatekeeper supprimé avec succès." -#: gatekeeper/views.py:144 +#: gatekeeper/views.py:164 msgid "Delete Gatekeeper Group" msgstr "Supprimer le groupe Gatekeeper" -#: gatekeeper/views.py:146 +#: gatekeeper/views.py:166 #, python-format msgid "Are you sure you want to delete the group \"%(name)s\"?" msgstr "Êtes-vous sûr de vouloir supprimer le groupe \"%(name)s\" ?" -#: gatekeeper/views.py:160 +#: gatekeeper/views.py:180 msgid "Edit Authentication Method" msgstr "Modifier la méthode d'authentification" -#: gatekeeper/views.py:163 +#: gatekeeper/views.py:183 msgid "Create Authentication Method" msgstr "Créer une méthode d'authentification" -#: gatekeeper/views.py:170 +#: gatekeeper/views.py:190 msgid "Authentication Method saved successfully." msgstr "Méthode d'authentification enregistrée avec succès." -#: gatekeeper/views.py:175 +#: gatekeeper/views.py:195 +#, fuzzy +#| msgid "" +#| "\n" +#| "

Authentication Types

\n" +#| "

Select how users will authenticate through this method.

\n" +#| " \n" +#| "
Local Password
\n" +#| "

Users will authenticate using a standard username and password " +#| "stored locally. Only one of this type can be created.

\n" +#| " \n" +#| "
OIDC (OpenID Connect)
\n" +#| "

Users will authenticate via an external identity provider " +#| "(like Keycloak, Google, or Authelia). Requires Provider URL, Client ID, " +#| "and Client Secret.

\n" +#| " \n" +#| "
TOTP (Time-Based One-Time Password)
\n" +#| "

Users will need to enter a rotating token from an " +#| "authenticator app. Requires setting a Global TOTP Secret.
If " +#| "Global TOTP Before Authentication is enabled, the PIN is " +#| "required before the username and password to help combat bruteforce " +#| "attacks.

\n" +#| " " msgid "" "\n" "

Authentication Types

\n" @@ -1507,9 +1614,8 @@ msgid "" " \n" "
TOTP (Time-Based One-Time Password)
\n" "

Users will need to enter a rotating token from an authenticator " -"app. Requires setting a Global TOTP Secret.
If Global TOTP " -"Before Authentication is enabled, the PIN is required before the " -"username and password to help combat bruteforce attacks.

\n" +"app. If a user does not have a personal TOTP configured, the Global " +"TOTP Secret will be used instead.

\n" " " msgstr "" "\n" @@ -1535,86 +1641,86 @@ msgstr "" "pour aider à lutter contre les attaques par force brute.

\n" " " -#: gatekeeper/views.py:210 +#: gatekeeper/views.py:230 msgid "Authentication Method deleted successfully." msgstr "Méthode d'authentification supprimée avec succès." -#: gatekeeper/views.py:215 +#: gatekeeper/views.py:235 msgid "Delete Authentication Method" msgstr "Supprimer la méthode d'authentification" -#: gatekeeper/views.py:217 +#: gatekeeper/views.py:237 #, python-format msgid "Are you sure you want to delete the authentication method \"%(name)s\"?" msgstr "" "Êtes-vous sûr de vouloir supprimer la méthode d'authentification " "\"%(name)s\" ?" -#: gatekeeper/views.py:267 +#: gatekeeper/views.py:287 msgid "Edit Allowed Domain" msgstr "Modifier le domaine autorisé" -#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186 +#: gatekeeper/views.py:290 templates/gatekeeper/gatekeeper_list.html:202 msgid "Add Allowed Domain" msgstr "Ajouter un domaine autorisé" -#: gatekeeper/views.py:277 +#: gatekeeper/views.py:297 msgid "Allowed Domain saved successfully." msgstr "Domaine autorisé enregistré avec succès." -#: gatekeeper/views.py:299 +#: gatekeeper/views.py:319 msgid "Allowed Domain deleted successfully." msgstr "Domaine autorisé supprimé avec succès." -#: gatekeeper/views.py:304 +#: gatekeeper/views.py:324 msgid "Delete Allowed Domain" msgstr "Supprimer le domaine autorisé" -#: gatekeeper/views.py:306 +#: gatekeeper/views.py:326 #, python-format msgid "Are you sure you want to delete the allowed domain \"%(domain)s\"?" msgstr "" "Êtes-vous sûr de vouloir supprimer le domaine autorisé \"%(domain)s\" ?" -#: gatekeeper/views.py:320 +#: gatekeeper/views.py:340 msgid "Edit Allowed Email" msgstr "Modifier l'e-mail autorisé" -#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183 +#: gatekeeper/views.py:343 templates/gatekeeper/gatekeeper_list.html:199 msgid "Add Allowed Email" msgstr "Ajouter un e-mail autorisé" -#: gatekeeper/views.py:330 +#: gatekeeper/views.py:350 msgid "Allowed Email saved successfully." msgstr "E-mail autorisé enregistré avec succès." -#: gatekeeper/views.py:352 +#: gatekeeper/views.py:372 msgid "Allowed Email deleted successfully." msgstr "E-mail autorisé supprimé avec succès." -#: gatekeeper/views.py:357 +#: gatekeeper/views.py:377 msgid "Delete Allowed Email" msgstr "Supprimer l'e-mail autorisé" -#: gatekeeper/views.py:359 +#: gatekeeper/views.py:379 #, python-format msgid "Are you sure you want to delete the allowed email \"%(email)s\"?" msgstr "Êtes-vous sûr de vouloir supprimer l'e-mail autorisé \"%(email)s\" ?" -#: gatekeeper/views.py:373 +#: gatekeeper/views.py:393 msgid "Edit IP Address" msgstr "Modifier l'adresse IP" -#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247 +#: gatekeeper/views.py:396 templates/gatekeeper/gatekeeper_list.html:263 #: templates/wireguard/wireguard_manage_peer.html:171 msgid "Add IP Address" msgstr "Ajouter une adresse IP" -#: gatekeeper/views.py:383 +#: gatekeeper/views.py:403 msgid "IP Address saved successfully." msgstr "Adresse IP enregistrée avec succès." -#: gatekeeper/views.py:388 +#: gatekeeper/views.py:408 msgid "" "\n" "
IP Address List
\n" @@ -1661,15 +1767,15 @@ msgstr "" "\"Réseau de bureau\", \"Attaquant bloqué\").

\n" " " -#: gatekeeper/views.py:424 +#: gatekeeper/views.py:444 msgid "IP Address deleted successfully." msgstr "Adresse IP supprimée avec succès." -#: gatekeeper/views.py:429 +#: gatekeeper/views.py:449 msgid "Delete IP Address" msgstr "Supprimer l'adresse IP" -#: gatekeeper/views.py:431 +#: gatekeeper/views.py:451 #, python-format msgid "Are you sure you want to delete the IP address \"%(address)s\"?" msgstr "Êtes-vous sûr de vouloir supprimer l'adresse IP \"%(address)s\" ?" @@ -2034,8 +2140,8 @@ msgid "In" msgstr "Entrée" #: templates/api_v2/api_documentation.html:49 -#: templates/gatekeeper/gatekeeper_list.html:150 -#: templates/gatekeeper/gatekeeper_list.html:195 +#: templates/gatekeeper/gatekeeper_list.html:166 +#: templates/gatekeeper/gatekeeper_list.html:211 #: templates/wireguard/apply_route_template.html:27 msgid "Type" msgstr "Type" @@ -2045,11 +2151,13 @@ msgid "Required" msgstr "Obligatoire" #: templates/api_v2/api_documentation.html:62 +#: templates/gatekeeper/gatekeeper_list.html:75 #: templates/scheduler/scheduleprofile_form.html:175 msgid "Yes" msgstr "Oui" #: templates/api_v2/api_documentation.html:64 +#: templates/gatekeeper/gatekeeper_list.html:77 #: templates/scheduler/scheduleprofile_form.html:177 msgid "No" msgstr "Non" @@ -2094,12 +2202,12 @@ msgstr "Désactivé" #: templates/app_gateway/application_details.html:121 #: templates/cluster/workers_list.html:77 #: templates/dns/static_host_list.html:74 -#: templates/gatekeeper/gatekeeper_list.html:73 -#: templates/gatekeeper/gatekeeper_list.html:116 -#: templates/gatekeeper/gatekeeper_list.html:161 -#: templates/gatekeeper/gatekeeper_list.html:209 -#: templates/gatekeeper/gatekeeper_list.html:226 -#: templates/gatekeeper/gatekeeper_list.html:278 +#: templates/gatekeeper/gatekeeper_list.html:89 +#: templates/gatekeeper/gatekeeper_list.html:132 +#: templates/gatekeeper/gatekeeper_list.html:177 +#: templates/gatekeeper/gatekeeper_list.html:225 +#: templates/gatekeeper/gatekeeper_list.html:242 +#: templates/gatekeeper/gatekeeper_list.html:294 #: templates/routing_templates/list.html:29 #: templates/scheduler/scheduleprofile_form.html:123 #: templates/scheduler/scheduleprofile_list.html:25 @@ -2182,6 +2290,7 @@ msgstr "Ajouter une politique d'accès" #: templates/app_gateway/app_gateway_list.html:140 #: templates/gatekeeper/gatekeeper_list.html:43 +#: templates/gatekeeper/gatekeeper_list.html:64 msgid "Groups" msgstr "Groupes" @@ -2192,10 +2301,10 @@ msgstr "Méthodes d'authentification" #: templates/app_gateway/app_gateway_list.html:142 #: templates/app_gateway/application_details.html:62 #: templates/app_gateway/application_details.html:109 -#: templates/gatekeeper/gatekeeper_list.html:63 -#: templates/gatekeeper/gatekeeper_list.html:106 -#: templates/gatekeeper/gatekeeper_list.html:151 -#: templates/gatekeeper/gatekeeper_list.html:198 +#: templates/gatekeeper/gatekeeper_list.html:65 +#: templates/gatekeeper/gatekeeper_list.html:122 +#: templates/gatekeeper/gatekeeper_list.html:167 +#: templates/gatekeeper/gatekeeper_list.html:214 #: templates/scheduler/scheduleprofile_form.html:111 #: templates/scheduler/scheduleprofile_list.html:15 #: templates/wireguard/apply_route_template.html:28 @@ -2746,10 +2855,19 @@ msgid "Create Port forwarding Rule" msgstr "Créer une règle de redirection de port" #: templates/gatekeeper/gatekeeper_auth_method_form.html:63 +#: templates/gatekeeper/gatekeeper_user_form.html:43 msgid "View QR Code" msgstr "Voir le code QR" -#: templates/gatekeeper/gatekeeper_auth_method_form.html:74 +#: templates/gatekeeper/gatekeeper_auth_method_form.html:64 +#: templates/gatekeeper/gatekeeper_user_form.html:44 +#, fuzzy +#| msgid "Global TOTP Secret" +msgid "Generate TOTP Secret" +msgstr "Secret TOTP mondial" + +#: templates/gatekeeper/gatekeeper_auth_method_form.html:93 +#: templates/gatekeeper/gatekeeper_user_form.html:73 msgid "Please enter a TOTP Secret first to generate the QR code." msgstr "Veuillez d'abord saisir un secret TOTP pour générer le code QR." @@ -2775,44 +2893,48 @@ msgstr "Utilisateurs" msgid "Add User" msgstr "Ajouter un utilisateur" -#: templates/gatekeeper/gatekeeper_list.html:88 +#: templates/gatekeeper/gatekeeper_list.html:63 +msgid "TOTP" +msgstr "" + +#: templates/gatekeeper/gatekeeper_list.html:104 msgid "No Gatekeeper Users found." msgstr "Aucun utilisateur Gatekeeper trouvé." -#: templates/gatekeeper/gatekeeper_list.html:95 +#: templates/gatekeeper/gatekeeper_list.html:111 msgid "Add Group" msgstr "Ajouter un groupe" -#: templates/gatekeeper/gatekeeper_list.html:131 +#: templates/gatekeeper/gatekeeper_list.html:147 msgid "No Gatekeeper Groups found." msgstr "Aucun groupe Gatekeeper trouvé." -#: templates/gatekeeper/gatekeeper_list.html:140 +#: templates/gatekeeper/gatekeeper_list.html:156 msgid "Add Auth Method" msgstr "Ajouter une méthode d'authentification" -#: templates/gatekeeper/gatekeeper_list.html:176 +#: templates/gatekeeper/gatekeeper_list.html:192 msgid "No Authentication Methods found." msgstr "Aucune méthode d'authentification trouvée." -#: templates/gatekeeper/gatekeeper_list.html:196 +#: templates/gatekeeper/gatekeeper_list.html:212 msgid "Identity" msgstr "Identité" -#: templates/gatekeeper/gatekeeper_list.html:197 -#: templates/gatekeeper/gatekeeper_list.html:259 +#: templates/gatekeeper/gatekeeper_list.html:213 +#: templates/gatekeeper/gatekeeper_list.html:275 msgid "Auth Method" msgstr "Méthode d'authentification" -#: templates/gatekeeper/gatekeeper_list.html:241 +#: templates/gatekeeper/gatekeeper_list.html:257 msgid "No Allowed Emails or Domains found." msgstr "Aucun e-mail ou domaine autorisé trouvé." -#: templates/gatekeeper/gatekeeper_list.html:260 +#: templates/gatekeeper/gatekeeper_list.html:276 msgid "Manage" msgstr "Gérer" -#: templates/gatekeeper/gatekeeper_list.html:293 +#: templates/gatekeeper/gatekeeper_list.html:309 msgid "No IP Addresses found." msgstr "Aucune adresse IP trouvée." @@ -3650,10 +3772,6 @@ msgstr "" msgid "The two password fields didn't match." msgstr "Les deux champs de mot de passe ne correspondent pas." -#: user_manager/forms.py:127 -msgid "Password must be at least 8 characters long." -msgstr "Le mot de passe doit comporter au moins 8 caractères." - #: user_manager/forms.py:220 msgid "A peer group with that name already exists." msgstr "Un groupe de peers portant ce nom existe déjà." @@ -4429,3 +4547,6 @@ msgstr "" #: wireguard_tools/views.py:374 msgid "No interfaces found|No WireGuard interfaces were found to process." msgstr "Aucune interface trouvée | Aucune interface WireGuard à traiter." + +#~ msgid "Global TOTP Before Authentication" +#~ msgstr "TOTP global avant l'authentification" diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo index 53a14d450972fe643a25f13a6feff0c0321e5c34..1073d4b04856837bad19f84d26b7cbc65a1b60e8 100644 GIT binary patch delta 17030 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 bgS(xom!4tu&7|~||L#fJGO4*|c*6eybug-R delta 18721 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 E0g$URk^lez diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po index f0675e6..9381a19 100644 --- a/locale/pt_BR/LC_MESSAGES/django.po +++ b/locale/pt_BR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-14 11:54-0300\n" +"POT-Creation-Date: 2026-03-15 17:20-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,12 +38,12 @@ msgstr "Voltar" #: templates/app_gateway/application_details.html:125 #: templates/firewall/manage_firewall_rule.html:382 #: templates/firewall/manage_redirect_rule.html:86 -#: templates/gatekeeper/gatekeeper_list.html:77 -#: templates/gatekeeper/gatekeeper_list.html:120 -#: templates/gatekeeper/gatekeeper_list.html:165 -#: templates/gatekeeper/gatekeeper_list.html:213 -#: templates/gatekeeper/gatekeeper_list.html:230 -#: templates/gatekeeper/gatekeeper_list.html:282 +#: templates/gatekeeper/gatekeeper_list.html:93 +#: templates/gatekeeper/gatekeeper_list.html:136 +#: templates/gatekeeper/gatekeeper_list.html:181 +#: templates/gatekeeper/gatekeeper_list.html:229 +#: templates/gatekeeper/gatekeeper_list.html:246 +#: templates/gatekeeper/gatekeeper_list.html:298 #: templates/scheduler/scheduleprofile_form.html:127 #: templates/scheduler/scheduleprofile_list.html:29 #: templates/wireguard/peer_list/peer_preview_modal.html:109 @@ -65,11 +65,11 @@ msgstr "" "funcionar imediatamente." #: api_v2/forms.py:63 app_gateway/forms.py:40 app_gateway/forms.py:92 -#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:226 -#: app_gateway/forms.py:267 cluster/forms.py:67 cluster/forms.py:124 -#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:41 -#: gatekeeper/forms.py:75 gatekeeper/forms.py:139 gatekeeper/forms.py:226 -#: gatekeeper/forms.py:256 gatekeeper/forms.py:287 +#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:237 +#: app_gateway/forms.py:278 cluster/forms.py:67 cluster/forms.py:124 +#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:70 +#: gatekeeper/forms.py:150 gatekeeper/forms.py:212 gatekeeper/forms.py:299 +#: gatekeeper/forms.py:329 gatekeeper/forms.py:360 #: routing_templates/forms.py:71 scheduler/forms.py:102 #: templates/firewall/manage_firewall_rule.html:379 #: templates/firewall/manage_firewall_settings.html:59 @@ -83,13 +83,13 @@ msgid "Save" msgstr "Salvar" #: api_v2/models.py:10 app_gateway/forms.py:18 app_gateway/forms.py:106 -#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:99 +#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:174 #: routing_templates/forms.py:28 templates/api_v2/api_documentation.html:47 #: templates/api_v2/list.html:8 templates/app_gateway/app_gateway_list.html:58 #: templates/app_gateway/app_gateway_list.html:138 #: templates/app_gateway/application_details.html:26 #: templates/cluster/workers_list.html:8 templates/dns/static_host_list.html:68 -#: templates/gatekeeper/gatekeeper_list.html:149 +#: templates/gatekeeper/gatekeeper_list.html:165 #: templates/routing_templates/list.html:8 #: templates/scheduler/scheduleprofile_list.html:13 #: templates/user_manager/peer_group_list.html:8 @@ -133,10 +133,10 @@ msgstr "Habilitado" #: app_gateway/views.py:293 app_gateway/views.py:328 app_gateway/views.py:354 #: app_gateway/views.py:404 app_gateway/views.py:432 cluster/views.py:18 #: cluster/views.py:45 cluster/views.py:114 gatekeeper/views.py:23 -#: gatekeeper/views.py:48 gatekeeper/views.py:78 gatekeeper/views.py:101 -#: gatekeeper/views.py:131 gatekeeper/views.py:154 gatekeeper/views.py:202 -#: gatekeeper/views.py:261 gatekeeper/views.py:291 gatekeeper/views.py:314 -#: gatekeeper/views.py:344 gatekeeper/views.py:367 gatekeeper/views.py:416 +#: gatekeeper/views.py:48 gatekeeper/views.py:98 gatekeeper/views.py:121 +#: gatekeeper/views.py:151 gatekeeper/views.py:174 gatekeeper/views.py:222 +#: gatekeeper/views.py:281 gatekeeper/views.py:311 gatekeeper/views.py:334 +#: gatekeeper/views.py:364 gatekeeper/views.py:387 gatekeeper/views.py:436 #: templates/access_denied.html:9 msgid "Access Denied" msgstr "Acesso Negado" @@ -217,9 +217,9 @@ msgid "Upstream" msgstr "Upstream" #: app_gateway/forms.py:41 app_gateway/forms.py:93 app_gateway/forms.py:137 -#: app_gateway/forms.py:155 app_gateway/forms.py:227 app_gateway/forms.py:268 -#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140 -#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288 +#: app_gateway/forms.py:155 app_gateway/forms.py:238 app_gateway/forms.py:279 +#: gatekeeper/forms.py:71 gatekeeper/forms.py:151 gatekeeper/forms.py:213 +#: gatekeeper/forms.py:300 gatekeeper/forms.py:330 gatekeeper/forms.py:361 #: scheduler/forms.py:103 #: templates/app_gateway/access_policy_type_select.html:50 #: templates/generic_delete_confirmation.html:19 @@ -263,19 +263,26 @@ msgstr "Grupos Permitidos" msgid "Authentication Methods" msgstr "Métodos de Autenticação" -#: app_gateway/forms.py:185 +#: app_gateway/forms.py:188 msgid "Cannot select more than one Local Password authentication method." msgstr "" "Não é possível selecionar mais de um método de autenticação por Senha Local." -#: app_gateway/forms.py:189 +#: app_gateway/forms.py:192 msgid "" "Cannot select more than one OpenID Connect (OIDC) authentication method." msgstr "" "Não é possível selecionar mais de um método de autenticação OpenID Connect " "(OIDC)." -#: app_gateway/forms.py:193 +#: app_gateway/forms.py:196 +#, fuzzy +#| msgid "Cannot select more than one Local Password authentication method." +msgid "Cannot select more than one TOTP authentication method." +msgstr "" +"Não é possível selecionar mais de um método de autenticação por Senha Local." + +#: app_gateway/forms.py:200 msgid "" "Cannot select both Local Password and OpenID Connect (OIDC) authentication " "methods." @@ -283,7 +290,19 @@ msgstr "" "Não é possível selecionar simultaneamente os métodos de autenticação por " "Senha Local e OpenID Connect (OIDC)." -#: app_gateway/forms.py:197 +#: app_gateway/forms.py:204 +#, fuzzy +#| msgid "" +#| "Cannot select both Local Password and OpenID Connect (OIDC) " +#| "authentication methods." +msgid "" +"TOTP must be combined with a Local Password or OpenID Connect authentication " +"method." +msgstr "" +"Não é possível selecionar simultaneamente os métodos de autenticação por " +"Senha Local e OpenID Connect (OIDC)." + +#: app_gateway/forms.py:208 msgid "" "At least one user group must be selected when using Local Password " "authentication." @@ -291,30 +310,30 @@ msgstr "" "Pelo menos um grupo de usuários deve ser selecionado ao usar a autenticação " "por Senha Local." -#: app_gateway/forms.py:201 +#: app_gateway/forms.py:212 msgid "User groups can only be used with Local Password authentication." msgstr "" "Grupos de usuários só podem ser usados com autenticação por Senha Local." -#: app_gateway/forms.py:211 templates/app_gateway/app_gateway_list.html:62 +#: app_gateway/forms.py:222 templates/app_gateway/app_gateway_list.html:62 #: templates/app_gateway/application_details.html:31 #: templates/firewall/firewall_nav_tabs.html:15 msgid "Default Policy" msgstr "Política Padrão" -#: app_gateway/forms.py:240 templates/app_gateway/application_details.html:105 +#: app_gateway/forms.py:251 templates/app_gateway/application_details.html:105 msgid "Route Name" msgstr "Nome da Rota" -#: app_gateway/forms.py:241 templates/app_gateway/application_details.html:106 +#: app_gateway/forms.py:252 templates/app_gateway/application_details.html:106 msgid "Path Prefix" msgstr "Prefixo do Caminho" -#: app_gateway/forms.py:242 templates/app_gateway/application_details.html:107 +#: app_gateway/forms.py:253 templates/app_gateway/application_details.html:107 msgid "Policy" msgstr "Política" -#: app_gateway/forms.py:243 templates/app_gateway/application_details.html:108 +#: app_gateway/forms.py:254 templates/app_gateway/application_details.html:108 msgid "Order" msgstr "Ordem" @@ -332,9 +351,9 @@ msgstr "Público" msgid "Protected" msgstr "Protegido" -#: app_gateway/models.py:45 gatekeeper/models.py:110 +#: app_gateway/models.py:45 gatekeeper/models.py:108 #: templates/app_gateway/access_policy_type_select.html:41 -#: templates/gatekeeper/gatekeeper_list.html:272 +#: templates/gatekeeper/gatekeeper_list.html:288 msgid "Deny" msgstr "Negar" @@ -615,11 +634,11 @@ msgstr "Excluir Rota da Aplicação" msgid "Are you sure you want to delete the route \"%(name)s\" (%(path)s)?" msgstr "Tem certeza de que deseja excluir a rota \"%(name)s\" (%(path)s)?" -#: app_gateway/views.py:444 +#: app_gateway/views.py:443 msgid "Configuration exported successfully." msgstr "Configuração exportada com sucesso." -#: app_gateway/views.py:446 +#: app_gateway/views.py:445 msgid "" "Caddy is not active. Configuration files were exported for debugging " "purposes." @@ -631,13 +650,13 @@ msgstr "" msgid "IP Lock" msgstr "Bloqueio de IP" -#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198 +#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:271 #: templates/cluster/workers_list.html:10 #: templates/dns/static_host_list.html:18 #: templates/firewall/manage_redirect_rule.html:43 #: templates/firewall/manage_redirect_rule.html:67 #: templates/firewall/manage_redirect_rule.html:68 -#: templates/gatekeeper/gatekeeper_list.html:256 +#: templates/gatekeeper/gatekeeper_list.html:272 #: templates/wireguard/wireguard_status.html:45 msgid "IP Address" msgstr "Endereço IP" @@ -912,7 +931,7 @@ msgstr "DNS Estático" msgid "Invalid hostname." msgstr "Nome de host inválido." -#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201 +#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:274 #: templates/api_v2/api_documentation.html:51 #: templates/dns/static_host_list.html:69 #: templates/firewall/manage_redirect_rule.html:18 @@ -1247,43 +1266,29 @@ msgstr "Gerenciar Configurações de Firewall" msgid "Firewall settings saved successfully" msgstr "Configurações de Firewall salvas com sucesso" -#: gatekeeper/forms.py:17 templates/accounts/login.html:14 -#: templates/gatekeeper/gatekeeper_list.html:61 -#: templates/user_manager/list.html:8 user_manager/forms.py:13 -#: vpn_invite/forms.py:281 -msgid "Username" -msgstr "Usuário" - -#: gatekeeper/forms.py:18 gatekeeper/forms.py:271 -#: templates/gatekeeper/gatekeeper_list.html:62 -#: templates/gatekeeper/gatekeeper_list.html:204 -#: templates/wireguard/peer_list/peer_preview_modal.html:103 -msgid "Email" -msgstr "Email" - -#: gatekeeper/forms.py:19 templates/accounts/login.html:23 +#: gatekeeper/forms.py:17 templates/accounts/login.html:23 #: templates/vpn_invite/invite_settings.html:19 user_manager/forms.py:14 #: vpn_invite/forms.py:282 msgid "Password" msgstr "Senha" #: gatekeeper/forms.py:20 -msgid "TOTP Secret" -msgstr "Segredo TOTP" +msgid "" +"Minimum 8 characters, with at least one uppercase letter, one lowercase " +"letter, and one number." +msgstr "" -#: gatekeeper/forms.py:55 templates/gatekeeper/gatekeeper_list.html:104 -msgid "Group Name" -msgstr "Nome do Grupo" +#: gatekeeper/forms.py:23 +#, fuzzy +#| msgid "Random Password" +msgid "Confirm Password" +msgstr "Senha Aleatória" -#: gatekeeper/forms.py:56 templates/gatekeeper/gatekeeper_list.html:105 -msgid "Members" -msgstr "Membros" - -#: gatekeeper/forms.py:86 +#: gatekeeper/forms.py:28 gatekeeper/forms.py:161 msgid "TOTP Validation PIN" msgstr "PIN de Validação TOTP" -#: gatekeeper/forms.py:89 +#: gatekeeper/forms.py:31 gatekeeper/forms.py:164 msgid "" "Enter a 6-digit PIN generated by your authenticator app to validate the " "secret." @@ -1291,90 +1296,146 @@ msgstr "" "Insira um PIN de 6 dígitos gerado pelo seu aplicativo autenticador para " "validar o segredo." -#: gatekeeper/forms.py:100 +#: gatekeeper/forms.py:38 templates/accounts/login.html:14 +#: templates/gatekeeper/gatekeeper_list.html:61 +#: templates/user_manager/list.html:8 user_manager/forms.py:13 +#: vpn_invite/forms.py:281 +msgid "Username" +msgstr "Usuário" + +#: gatekeeper/forms.py:39 gatekeeper/forms.py:344 +#: templates/gatekeeper/gatekeeper_list.html:62 +#: templates/gatekeeper/gatekeeper_list.html:220 +#: templates/wireguard/peer_list/peer_preview_modal.html:103 +msgid "Email" +msgstr "Email" + +#: gatekeeper/forms.py:40 +msgid "TOTP Secret" +msgstr "Segredo TOTP" + +#: gatekeeper/forms.py:87 +#, fuzzy +#| msgid "Port is required." +msgid "Password is required." +msgstr "Porta é obrigatória." + +#: gatekeeper/forms.py:90 user_manager/forms.py:127 +msgid "Password must be at least 8 characters long." +msgstr "Senha deve ter pelo menos 8 caracteres." + +#: gatekeeper/forms.py:92 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one lowercase letter." +msgstr "Senha deve ter pelo menos 8 caracteres." + +#: gatekeeper/forms.py:94 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one uppercase letter." +msgstr "Senha deve ter pelo menos 8 caracteres." + +#: gatekeeper/forms.py:96 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one number." +msgstr "Senha deve ter pelo menos 8 caracteres." + +#: gatekeeper/forms.py:98 +#, fuzzy +#| msgid "Password Confirmation" +msgid "Passwords do not match." +msgstr "Confirmação de Senha" + +#: gatekeeper/forms.py:103 gatekeeper/forms.py:249 +msgid "Please provide a PIN to validate the TOTP secret." +msgstr "Por favor, forneça um PIN para validar o segredo TOTP." + +#: gatekeeper/forms.py:108 gatekeeper/forms.py:254 +msgid "Invalid TOTP PIN." +msgstr "PIN TOTP inválido." + +#: gatekeeper/forms.py:110 gatekeeper/forms.py:256 +msgid "Invalid TOTP secret format. Must be a valid Base32 string." +msgstr "Formato de segredo TOTP inválido. Deve ser uma string Base32 válida." + +#: gatekeeper/forms.py:130 templates/gatekeeper/gatekeeper_list.html:120 +msgid "Group Name" +msgstr "Nome do Grupo" + +#: gatekeeper/forms.py:131 templates/gatekeeper/gatekeeper_list.html:121 +msgid "Members" +msgstr "Membros" + +#: gatekeeper/forms.py:175 msgid "Authentication Type" msgstr "Tipo de Autenticação" -#: gatekeeper/forms.py:101 +#: gatekeeper/forms.py:176 msgid "Global TOTP Secret" msgstr "Segredo TOTP Global" -#: gatekeeper/forms.py:102 -msgid "Global TOTP Before Authentication" -msgstr "TOTP Global Antes da Autenticação" - -#: gatekeeper/forms.py:103 +#: gatekeeper/forms.py:177 msgid "OIDC Provider URL" msgstr "URL do Provedor OIDC" -#: gatekeeper/forms.py:104 +#: gatekeeper/forms.py:178 msgid "OIDC Client ID" msgstr "ID do Cliente OIDC" -#: gatekeeper/forms.py:105 +#: gatekeeper/forms.py:179 msgid "OIDC Client Secret" msgstr "Segredo do Cliente OIDC" -#: gatekeeper/forms.py:157 +#: gatekeeper/forms.py:230 msgid "TOTP secret must be empty for Local Password authentication." msgstr "O segredo TOTP deve estar vazio para autenticação por Senha Local." -#: gatekeeper/forms.py:159 +#: gatekeeper/forms.py:232 msgid "TOTP validation PIN must be empty for Local Password authentication." msgstr "" "O PIN de validação TOTP deve estar vazio para autenticação por Senha Local." -#: gatekeeper/forms.py:161 +#: gatekeeper/forms.py:234 msgid "OIDC fields must be empty for Local Password authentication." msgstr "Os campos OIDC devem estar vazios para autenticação por Senha Local." -#: gatekeeper/forms.py:167 +#: gatekeeper/forms.py:240 msgid "Only one Local Password authentication method can be configured." msgstr "Apenas um método de autenticação por Senha Local pode ser configurado." -#: gatekeeper/forms.py:170 +#: gatekeeper/forms.py:243 msgid "OIDC fields must be empty for TOTP authentication." msgstr "Os campos OIDC devem estar vazios para autenticação por TOTP." -#: gatekeeper/forms.py:172 +#: gatekeeper/forms.py:245 msgid "TOTP secret is required for TOTP authentication." msgstr "O segredo TOTP é obrigatório para autenticação por TOTP." -#: gatekeeper/forms.py:176 -msgid "Please provide a PIN to validate the TOTP secret." -msgstr "Por favor, forneça um PIN para validar o segredo TOTP." - -#: gatekeeper/forms.py:181 -msgid "Invalid TOTP PIN." -msgstr "PIN TOTP inválido." - -#: gatekeeper/forms.py:183 -msgid "Invalid TOTP secret format. Must be a valid Base32 string." -msgstr "Formato de segredo TOTP inválido. Deve ser uma string Base32 válida." - -#: gatekeeper/forms.py:186 +#: gatekeeper/forms.py:259 msgid "TOTP secret must be empty for OIDC authentication." msgstr "O segredo TOTP deve estar vazio para autenticação por OIDC." -#: gatekeeper/forms.py:188 +#: gatekeeper/forms.py:261 msgid "TOTP validation PIN must be empty for OIDC authentication." msgstr "O PIN de validação TOTP deve estar vazio para autenticação por OIDC." -#: gatekeeper/forms.py:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270 +#: gatekeeper/forms.py:270 gatekeeper/forms.py:312 gatekeeper/forms.py:343 msgid "Authentication Method" msgstr "Método de Autenticação" -#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257 +#: gatekeeper/forms.py:272 templates/gatekeeper/gatekeeper_list.html:273 msgid "Prefix Length" msgstr "Comprimento do Prefixo" -#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47 +#: gatekeeper/forms.py:273 templates/firewall/firewall_rule_list.html:47 #: templates/firewall/manage_firewall_rule.html:360 -#: templates/gatekeeper/gatekeeper_list.html:258 +#: templates/gatekeeper/gatekeeper_list.html:274 msgid "Action" msgstr "Ação" -#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221 +#: gatekeeper/forms.py:313 templates/gatekeeper/gatekeeper_list.html:237 msgid "Domain" msgstr "Domínio" @@ -1398,15 +1459,15 @@ msgstr "Lista de Endereços IP" msgid "Shared/global TOTP secret key" msgstr "Chave secreta TOTP compartilhada/global" -#: gatekeeper/models.py:69 +#: gatekeeper/models.py:68 msgid "Password for local authentication (leave blank if not using)" msgstr "Senha para autenticação local (deixe em branco se não estiver usando)" -#: gatekeeper/models.py:71 +#: gatekeeper/models.py:69 msgid "Per-user TOTP secret key" msgstr "Chave secreta TOTP por usuário" -#: gatekeeper/models.py:110 templates/gatekeeper/gatekeeper_list.html:270 +#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:286 msgid "Allow" msgstr "Permitir" @@ -1422,57 +1483,102 @@ msgstr "Criar Usuário Gatekeeper" msgid "Gatekeeper User saved successfully." msgstr "Usuário Gatekeeper salvo com sucesso." -#: gatekeeper/views.py:86 +#: gatekeeper/views.py:69 +msgid "" +"\n" +"

Gatekeeper User

\n" +"

Gatekeeper users are used for authenticating against protected " +"applications managed by this gateway.

\n" +"\n" +"
Password
\n" +"

Required when creating a user. When editing, leave both password " +"fields blank to keep the current password.\n" +" Passwords are stored using Argon2id hashing.

\n" +"\n" +"
TOTP Secret
\n" +"

Optional per-user TOTP secret. When set, this user will " +"authenticate using their own secret instead of the\n" +" global TOTP secret configured on the Authentication Method. Use the " +"buttons below the field to generate a\n" +" random secret and scan the QR code with your authenticator app. " +"Validate the secret by entering the current\n" +" 6-digit PIN before saving.

\n" +" " +msgstr "" + +#: gatekeeper/views.py:106 msgid "Gatekeeper User deleted successfully." msgstr "Usuário Gatekeeper excluído com sucesso." -#: gatekeeper/views.py:91 +#: gatekeeper/views.py:111 msgid "Delete Gatekeeper User" msgstr "Excluir Usuário Gatekeeper" -#: gatekeeper/views.py:93 +#: gatekeeper/views.py:113 #, python-format msgid "Are you sure you want to delete the user \"%(username)s\"?" msgstr "Tem certeza de que deseja excluir o usuário \"%(username)s\"?" -#: gatekeeper/views.py:107 +#: gatekeeper/views.py:127 msgid "Edit Gatekeeper Group" msgstr "Editar Grupo Gatekeeper" -#: gatekeeper/views.py:110 +#: gatekeeper/views.py:130 msgid "Create Gatekeeper Group" msgstr "Criar Grupo Gatekeeper" -#: gatekeeper/views.py:117 +#: gatekeeper/views.py:137 msgid "Gatekeeper Group saved successfully." msgstr "Grupo Gatekeeper salvo com sucesso." -#: gatekeeper/views.py:139 +#: gatekeeper/views.py:159 msgid "Gatekeeper Group deleted successfully." msgstr "Grupo Gatekeeper excluído com sucesso." -#: gatekeeper/views.py:144 +#: gatekeeper/views.py:164 msgid "Delete Gatekeeper Group" msgstr "Excluir Grupo Gatekeeper" -#: gatekeeper/views.py:146 +#: gatekeeper/views.py:166 #, python-format msgid "Are you sure you want to delete the group \"%(name)s\"?" msgstr "Tem certeza de que deseja excluir o grupo \"%(name)s\"?" -#: gatekeeper/views.py:160 +#: gatekeeper/views.py:180 msgid "Edit Authentication Method" msgstr "Editar Método de Autenticação" -#: gatekeeper/views.py:163 +#: gatekeeper/views.py:183 msgid "Create Authentication Method" msgstr "Criar Método de Autenticação" -#: gatekeeper/views.py:170 +#: gatekeeper/views.py:190 msgid "Authentication Method saved successfully." msgstr "Método de Autenticação salvo com sucesso." -#: gatekeeper/views.py:175 +#: gatekeeper/views.py:195 +#, fuzzy +#| msgid "" +#| "\n" +#| "

Authentication Types

\n" +#| "

Select how users will authenticate through this method.

\n" +#| " \n" +#| "
Local Password
\n" +#| "

Users will authenticate using a standard username and password " +#| "stored locally. Only one of this type can be created.

\n" +#| " \n" +#| "
OIDC (OpenID Connect)
\n" +#| "

Users will authenticate via an external identity provider " +#| "(like Keycloak, Google, or Authelia). Requires Provider URL, Client ID, " +#| "and Client Secret.

\n" +#| " \n" +#| "
TOTP (Time-Based One-Time Password)
\n" +#| "

Users will need to enter a rotating token from an " +#| "authenticator app. Requires setting a Global TOTP Secret.
If " +#| "Global TOTP Before Authentication is enabled, the PIN is " +#| "required before the username and password to help combat bruteforce " +#| "attacks.

\n" +#| " " msgid "" "\n" "

Authentication Types

\n" @@ -1489,9 +1595,8 @@ msgid "" " \n" "
TOTP (Time-Based One-Time Password)
\n" "

Users will need to enter a rotating token from an authenticator " -"app. Requires setting a Global TOTP Secret.
If Global TOTP " -"Before Authentication is enabled, the PIN is required before the " -"username and password to help combat bruteforce attacks.

\n" +"app. If a user does not have a personal TOTP configured, the Global " +"TOTP Secret will be used instead.

\n" " " msgstr "" "\n" @@ -1516,84 +1621,84 @@ msgstr "" "força bruta.

\n" " " -#: gatekeeper/views.py:210 +#: gatekeeper/views.py:230 msgid "Authentication Method deleted successfully." msgstr "Método de Autenticação excluído com sucesso." -#: gatekeeper/views.py:215 +#: gatekeeper/views.py:235 msgid "Delete Authentication Method" msgstr "Excluir Método de Autenticação" -#: gatekeeper/views.py:217 +#: gatekeeper/views.py:237 #, python-format msgid "Are you sure you want to delete the authentication method \"%(name)s\"?" msgstr "" "Tem certeza de que deseja excluir o método de autenticação \"%(name)s\"?" -#: gatekeeper/views.py:267 +#: gatekeeper/views.py:287 msgid "Edit Allowed Domain" msgstr "Editar Domínio Permitido" -#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186 +#: gatekeeper/views.py:290 templates/gatekeeper/gatekeeper_list.html:202 msgid "Add Allowed Domain" msgstr "Adicionar Domínio Permitido" -#: gatekeeper/views.py:277 +#: gatekeeper/views.py:297 msgid "Allowed Domain saved successfully." msgstr "Domínio Permitido salvo com sucesso." -#: gatekeeper/views.py:299 +#: gatekeeper/views.py:319 msgid "Allowed Domain deleted successfully." msgstr "Domínio Permitido excluído com sucesso." -#: gatekeeper/views.py:304 +#: gatekeeper/views.py:324 msgid "Delete Allowed Domain" msgstr "Excluir Domínio Permitido" -#: gatekeeper/views.py:306 +#: gatekeeper/views.py:326 #, python-format msgid "Are you sure you want to delete the allowed domain \"%(domain)s\"?" msgstr "Tem certeza de que deseja excluir o domínio permitido \"%(domain)s\"?" -#: gatekeeper/views.py:320 +#: gatekeeper/views.py:340 msgid "Edit Allowed Email" msgstr "Editar E-mail Permitido" -#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183 +#: gatekeeper/views.py:343 templates/gatekeeper/gatekeeper_list.html:199 msgid "Add Allowed Email" msgstr "Adicionar E-mail Permitido" -#: gatekeeper/views.py:330 +#: gatekeeper/views.py:350 msgid "Allowed Email saved successfully." msgstr "E-mail Permitido salvo com sucesso." -#: gatekeeper/views.py:352 +#: gatekeeper/views.py:372 msgid "Allowed Email deleted successfully." msgstr "E-mail Permitido excluído com sucesso." -#: gatekeeper/views.py:357 +#: gatekeeper/views.py:377 msgid "Delete Allowed Email" msgstr "Excluir E-mail Permitido" -#: gatekeeper/views.py:359 +#: gatekeeper/views.py:379 #, python-format msgid "Are you sure you want to delete the allowed email \"%(email)s\"?" msgstr "Tem certeza de que deseja excluir o e-mail permitido \"%(email)s\"?" -#: gatekeeper/views.py:373 +#: gatekeeper/views.py:393 msgid "Edit IP Address" msgstr "Editar Endereço IP" -#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247 +#: gatekeeper/views.py:396 templates/gatekeeper/gatekeeper_list.html:263 #: templates/wireguard/wireguard_manage_peer.html:171 msgid "Add IP Address" msgstr "Adicionar IP" -#: gatekeeper/views.py:383 +#: gatekeeper/views.py:403 msgid "IP Address saved successfully." msgstr "Endereço IP salvo com sucesso." -#: gatekeeper/views.py:388 +#: gatekeeper/views.py:408 msgid "" "\n" "
IP Address List
\n" @@ -1640,15 +1745,15 @@ msgstr "" "\"Rede do Escritório\", \"Atacante Bloqueado\").

\n" " " -#: gatekeeper/views.py:424 +#: gatekeeper/views.py:444 msgid "IP Address deleted successfully." msgstr "Endereço IP excluído com sucesso." -#: gatekeeper/views.py:429 +#: gatekeeper/views.py:449 msgid "Delete IP Address" msgstr "Excluir Endereço IP" -#: gatekeeper/views.py:431 +#: gatekeeper/views.py:451 #, python-format msgid "Are you sure you want to delete the IP address \"%(address)s\"?" msgstr "Tem certeza de que deseja excluir o endereço IP \"%(address)s\"?" @@ -2016,8 +2121,8 @@ msgid "In" msgstr "Entrada" #: templates/api_v2/api_documentation.html:49 -#: templates/gatekeeper/gatekeeper_list.html:150 -#: templates/gatekeeper/gatekeeper_list.html:195 +#: templates/gatekeeper/gatekeeper_list.html:166 +#: templates/gatekeeper/gatekeeper_list.html:211 #: templates/wireguard/apply_route_template.html:27 msgid "Type" msgstr "Tipo" @@ -2027,11 +2132,13 @@ msgid "Required" msgstr "Obrigatório" #: templates/api_v2/api_documentation.html:62 +#: templates/gatekeeper/gatekeeper_list.html:75 #: templates/scheduler/scheduleprofile_form.html:175 msgid "Yes" msgstr "Sim" #: templates/api_v2/api_documentation.html:64 +#: templates/gatekeeper/gatekeeper_list.html:77 #: templates/scheduler/scheduleprofile_form.html:177 msgid "No" msgstr "Não" @@ -2076,12 +2183,12 @@ msgstr "Desabilitado" #: templates/app_gateway/application_details.html:121 #: templates/cluster/workers_list.html:77 #: templates/dns/static_host_list.html:74 -#: templates/gatekeeper/gatekeeper_list.html:73 -#: templates/gatekeeper/gatekeeper_list.html:116 -#: templates/gatekeeper/gatekeeper_list.html:161 -#: templates/gatekeeper/gatekeeper_list.html:209 -#: templates/gatekeeper/gatekeeper_list.html:226 -#: templates/gatekeeper/gatekeeper_list.html:278 +#: templates/gatekeeper/gatekeeper_list.html:89 +#: templates/gatekeeper/gatekeeper_list.html:132 +#: templates/gatekeeper/gatekeeper_list.html:177 +#: templates/gatekeeper/gatekeeper_list.html:225 +#: templates/gatekeeper/gatekeeper_list.html:242 +#: templates/gatekeeper/gatekeeper_list.html:294 #: templates/routing_templates/list.html:29 #: templates/scheduler/scheduleprofile_form.html:123 #: templates/scheduler/scheduleprofile_list.html:25 @@ -2163,6 +2270,7 @@ msgstr "Adicionar Política de Acesso" #: templates/app_gateway/app_gateway_list.html:140 #: templates/gatekeeper/gatekeeper_list.html:43 +#: templates/gatekeeper/gatekeeper_list.html:64 msgid "Groups" msgstr "Grupos" @@ -2173,10 +2281,10 @@ msgstr "Métodos de Autenticação" #: templates/app_gateway/app_gateway_list.html:142 #: templates/app_gateway/application_details.html:62 #: templates/app_gateway/application_details.html:109 -#: templates/gatekeeper/gatekeeper_list.html:63 -#: templates/gatekeeper/gatekeeper_list.html:106 -#: templates/gatekeeper/gatekeeper_list.html:151 -#: templates/gatekeeper/gatekeeper_list.html:198 +#: templates/gatekeeper/gatekeeper_list.html:65 +#: templates/gatekeeper/gatekeeper_list.html:122 +#: templates/gatekeeper/gatekeeper_list.html:167 +#: templates/gatekeeper/gatekeeper_list.html:214 #: templates/scheduler/scheduleprofile_form.html:111 #: templates/scheduler/scheduleprofile_list.html:15 #: templates/wireguard/apply_route_template.html:28 @@ -2734,10 +2842,19 @@ msgid "Create Port forwarding Rule" msgstr "Criar Regra de Encaminhamento de Porta" #: templates/gatekeeper/gatekeeper_auth_method_form.html:63 +#: templates/gatekeeper/gatekeeper_user_form.html:43 msgid "View QR Code" msgstr "Ver Código QR" -#: templates/gatekeeper/gatekeeper_auth_method_form.html:74 +#: templates/gatekeeper/gatekeeper_auth_method_form.html:64 +#: templates/gatekeeper/gatekeeper_user_form.html:44 +#, fuzzy +#| msgid "Global TOTP Secret" +msgid "Generate TOTP Secret" +msgstr "Segredo TOTP Global" + +#: templates/gatekeeper/gatekeeper_auth_method_form.html:93 +#: templates/gatekeeper/gatekeeper_user_form.html:73 msgid "Please enter a TOTP Secret first to generate the QR code." msgstr "Por favor, insira um Segredo TOTP primeiro para gerar o código QR." @@ -2763,44 +2880,48 @@ msgstr "Usuários" msgid "Add User" msgstr "Adicionar Usuário" -#: templates/gatekeeper/gatekeeper_list.html:88 +#: templates/gatekeeper/gatekeeper_list.html:63 +msgid "TOTP" +msgstr "" + +#: templates/gatekeeper/gatekeeper_list.html:104 msgid "No Gatekeeper Users found." msgstr "Nenhum Usuário Gatekeeper encontrado." -#: templates/gatekeeper/gatekeeper_list.html:95 +#: templates/gatekeeper/gatekeeper_list.html:111 msgid "Add Group" msgstr "Adicionar Grupo" -#: templates/gatekeeper/gatekeeper_list.html:131 +#: templates/gatekeeper/gatekeeper_list.html:147 msgid "No Gatekeeper Groups found." msgstr "Nenhum Grupo Gatekeeper encontrado." -#: templates/gatekeeper/gatekeeper_list.html:140 +#: templates/gatekeeper/gatekeeper_list.html:156 msgid "Add Auth Method" msgstr "Adicionar Método de Autenticação" -#: templates/gatekeeper/gatekeeper_list.html:176 +#: templates/gatekeeper/gatekeeper_list.html:192 msgid "No Authentication Methods found." msgstr "Nenhum Método de Autenticação encontrado." -#: templates/gatekeeper/gatekeeper_list.html:196 +#: templates/gatekeeper/gatekeeper_list.html:212 msgid "Identity" msgstr "Identidade" -#: templates/gatekeeper/gatekeeper_list.html:197 -#: templates/gatekeeper/gatekeeper_list.html:259 +#: templates/gatekeeper/gatekeeper_list.html:213 +#: templates/gatekeeper/gatekeeper_list.html:275 msgid "Auth Method" msgstr "Método de Autenticação" -#: templates/gatekeeper/gatekeeper_list.html:241 +#: templates/gatekeeper/gatekeeper_list.html:257 msgid "No Allowed Emails or Domains found." msgstr "Nenhum E-mail ou Domínio Permitido encontrado." -#: templates/gatekeeper/gatekeeper_list.html:260 +#: templates/gatekeeper/gatekeeper_list.html:276 msgid "Manage" msgstr "Gerenciar" -#: templates/gatekeeper/gatekeeper_list.html:293 +#: templates/gatekeeper/gatekeeper_list.html:309 msgid "No IP Addresses found." msgstr "Nenhum Endereço IP encontrado." @@ -3638,10 +3759,6 @@ msgstr "Confirmação de senha é obrigatória para novos usuários." msgid "The two password fields didn't match." msgstr "As duas senhas não coincidem." -#: user_manager/forms.py:127 -msgid "Password must be at least 8 characters long." -msgstr "Senha deve ter pelo menos 8 caracteres." - #: user_manager/forms.py:220 msgid "A peer group with that name already exists." msgstr "Um grupo de peers com esse nome já existe." @@ -4410,3 +4527,6 @@ msgid "No interfaces found|No WireGuard interfaces were found to process." msgstr "" "Nenhuma interface encontrada|Nenhuma interface WireGuard foi encontrada para " "processar." + +#~ msgid "Global TOTP Before Authentication" +#~ msgstr "TOTP Global Antes da Autenticação" diff --git a/locale/sk/LC_MESSAGES/django.mo b/locale/sk/LC_MESSAGES/django.mo index bf739f9fb6c15805468a74ed76541784d76d5178..29c1d425b4aaee9f0ffbb51e17a9f6038aa2b1a2 100644 GIT binary patch delta 17030 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 A-2eap delta 18781 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 diff --git a/locale/sk/LC_MESSAGES/django.po b/locale/sk/LC_MESSAGES/django.po index 29765fa..15add00 100644 --- a/locale/sk/LC_MESSAGES/django.po +++ b/locale/sk/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-14 11:54-0300\n" +"POT-Creation-Date: 2026-03-15 17:20-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -39,12 +39,12 @@ msgstr "Späť" #: templates/app_gateway/application_details.html:125 #: templates/firewall/manage_firewall_rule.html:382 #: templates/firewall/manage_redirect_rule.html:86 -#: templates/gatekeeper/gatekeeper_list.html:77 -#: templates/gatekeeper/gatekeeper_list.html:120 -#: templates/gatekeeper/gatekeeper_list.html:165 -#: templates/gatekeeper/gatekeeper_list.html:213 -#: templates/gatekeeper/gatekeeper_list.html:230 -#: templates/gatekeeper/gatekeeper_list.html:282 +#: templates/gatekeeper/gatekeeper_list.html:93 +#: templates/gatekeeper/gatekeeper_list.html:136 +#: templates/gatekeeper/gatekeeper_list.html:181 +#: templates/gatekeeper/gatekeeper_list.html:229 +#: templates/gatekeeper/gatekeeper_list.html:246 +#: templates/gatekeeper/gatekeeper_list.html:298 #: templates/scheduler/scheduleprofile_form.html:127 #: templates/scheduler/scheduleprofile_list.html:29 #: templates/wireguard/peer_list/peer_preview_modal.html:109 @@ -65,11 +65,11 @@ msgstr "" "Naozaj chcete regenerovať token? Starý token okamžite prestane fungovať." #: api_v2/forms.py:63 app_gateway/forms.py:40 app_gateway/forms.py:92 -#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:226 -#: app_gateway/forms.py:267 cluster/forms.py:67 cluster/forms.py:124 -#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:41 -#: gatekeeper/forms.py:75 gatekeeper/forms.py:139 gatekeeper/forms.py:226 -#: gatekeeper/forms.py:256 gatekeeper/forms.py:287 +#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:237 +#: app_gateway/forms.py:278 cluster/forms.py:67 cluster/forms.py:124 +#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:70 +#: gatekeeper/forms.py:150 gatekeeper/forms.py:212 gatekeeper/forms.py:299 +#: gatekeeper/forms.py:329 gatekeeper/forms.py:360 #: routing_templates/forms.py:71 scheduler/forms.py:102 #: templates/firewall/manage_firewall_rule.html:379 #: templates/firewall/manage_firewall_settings.html:59 @@ -83,13 +83,13 @@ msgid "Save" msgstr "Uložiť" #: api_v2/models.py:10 app_gateway/forms.py:18 app_gateway/forms.py:106 -#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:99 +#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:174 #: routing_templates/forms.py:28 templates/api_v2/api_documentation.html:47 #: templates/api_v2/list.html:8 templates/app_gateway/app_gateway_list.html:58 #: templates/app_gateway/app_gateway_list.html:138 #: templates/app_gateway/application_details.html:26 #: templates/cluster/workers_list.html:8 templates/dns/static_host_list.html:68 -#: templates/gatekeeper/gatekeeper_list.html:149 +#: templates/gatekeeper/gatekeeper_list.html:165 #: templates/routing_templates/list.html:8 #: templates/scheduler/scheduleprofile_list.html:13 #: templates/user_manager/peer_group_list.html:8 @@ -133,10 +133,10 @@ msgstr "Povolené" #: app_gateway/views.py:293 app_gateway/views.py:328 app_gateway/views.py:354 #: app_gateway/views.py:404 app_gateway/views.py:432 cluster/views.py:18 #: cluster/views.py:45 cluster/views.py:114 gatekeeper/views.py:23 -#: gatekeeper/views.py:48 gatekeeper/views.py:78 gatekeeper/views.py:101 -#: gatekeeper/views.py:131 gatekeeper/views.py:154 gatekeeper/views.py:202 -#: gatekeeper/views.py:261 gatekeeper/views.py:291 gatekeeper/views.py:314 -#: gatekeeper/views.py:344 gatekeeper/views.py:367 gatekeeper/views.py:416 +#: gatekeeper/views.py:48 gatekeeper/views.py:98 gatekeeper/views.py:121 +#: gatekeeper/views.py:151 gatekeeper/views.py:174 gatekeeper/views.py:222 +#: gatekeeper/views.py:281 gatekeeper/views.py:311 gatekeeper/views.py:334 +#: gatekeeper/views.py:364 gatekeeper/views.py:387 gatekeeper/views.py:436 #: templates/access_denied.html:9 msgid "Access Denied" msgstr "Prístup zamietnutý" @@ -217,9 +217,9 @@ msgid "Upstream" msgstr "Upstream" #: app_gateway/forms.py:41 app_gateway/forms.py:93 app_gateway/forms.py:137 -#: app_gateway/forms.py:155 app_gateway/forms.py:227 app_gateway/forms.py:268 -#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140 -#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288 +#: app_gateway/forms.py:155 app_gateway/forms.py:238 app_gateway/forms.py:279 +#: gatekeeper/forms.py:71 gatekeeper/forms.py:151 gatekeeper/forms.py:213 +#: gatekeeper/forms.py:300 gatekeeper/forms.py:330 gatekeeper/forms.py:361 #: scheduler/forms.py:103 #: templates/app_gateway/access_policy_type_select.html:50 #: templates/generic_delete_confirmation.html:19 @@ -264,17 +264,23 @@ msgstr "Povolené skupiny" msgid "Authentication Methods" msgstr "Metódy autentifikácie" -#: app_gateway/forms.py:185 +#: app_gateway/forms.py:188 msgid "Cannot select more than one Local Password authentication method." msgstr "Nemožno vybrať viac ako jednu metódu autentifikácie lokálnym heslom." -#: app_gateway/forms.py:189 +#: app_gateway/forms.py:192 msgid "" "Cannot select more than one OpenID Connect (OIDC) authentication method." msgstr "" "Nemožno vybrať viac ako jednu metódu autentifikácie OpenID Connect (OIDC)." -#: app_gateway/forms.py:193 +#: app_gateway/forms.py:196 +#, fuzzy +#| msgid "Cannot select more than one Local Password authentication method." +msgid "Cannot select more than one TOTP authentication method." +msgstr "Nemožno vybrať viac ako jednu metódu autentifikácie lokálnym heslom." + +#: app_gateway/forms.py:200 msgid "" "Cannot select both Local Password and OpenID Connect (OIDC) authentication " "methods." @@ -282,7 +288,19 @@ msgstr "" "Nemožno vybrať súčasne metódy autentifikácie lokálnym heslom a OpenID " "Connect (OIDC)." -#: app_gateway/forms.py:197 +#: app_gateway/forms.py:204 +#, fuzzy +#| msgid "" +#| "Cannot select both Local Password and OpenID Connect (OIDC) " +#| "authentication methods." +msgid "" +"TOTP must be combined with a Local Password or OpenID Connect authentication " +"method." +msgstr "" +"Nemožno vybrať súčasne metódy autentifikácie lokálnym heslom a OpenID " +"Connect (OIDC)." + +#: app_gateway/forms.py:208 msgid "" "At least one user group must be selected when using Local Password " "authentication." @@ -290,30 +308,30 @@ msgstr "" "Pri použití autentifikácie lokálnym heslom musí byť vybraná aspoň jedna " "skupina používateľov." -#: app_gateway/forms.py:201 +#: app_gateway/forms.py:212 msgid "User groups can only be used with Local Password authentication." msgstr "" "Skupiny používateľov možno použiť len s autentifikáciou lokálnym heslom." -#: app_gateway/forms.py:211 templates/app_gateway/app_gateway_list.html:62 +#: app_gateway/forms.py:222 templates/app_gateway/app_gateway_list.html:62 #: templates/app_gateway/application_details.html:31 #: templates/firewall/firewall_nav_tabs.html:15 msgid "Default Policy" msgstr "Predvolená politika" -#: app_gateway/forms.py:240 templates/app_gateway/application_details.html:105 +#: app_gateway/forms.py:251 templates/app_gateway/application_details.html:105 msgid "Route Name" msgstr "Názov trasy" -#: app_gateway/forms.py:241 templates/app_gateway/application_details.html:106 +#: app_gateway/forms.py:252 templates/app_gateway/application_details.html:106 msgid "Path Prefix" msgstr "Prefix cesty" -#: app_gateway/forms.py:242 templates/app_gateway/application_details.html:107 +#: app_gateway/forms.py:253 templates/app_gateway/application_details.html:107 msgid "Policy" msgstr "Politika" -#: app_gateway/forms.py:243 templates/app_gateway/application_details.html:108 +#: app_gateway/forms.py:254 templates/app_gateway/application_details.html:108 msgid "Order" msgstr "Poradie" @@ -331,9 +349,9 @@ msgstr "Verejné" msgid "Protected" msgstr "Chránené" -#: app_gateway/models.py:45 gatekeeper/models.py:110 +#: app_gateway/models.py:45 gatekeeper/models.py:108 #: templates/app_gateway/access_policy_type_select.html:41 -#: templates/gatekeeper/gatekeeper_list.html:272 +#: templates/gatekeeper/gatekeeper_list.html:288 msgid "Deny" msgstr "Odmietnuť" @@ -614,11 +632,11 @@ msgstr "Odstrániť trasu aplikácie" msgid "Are you sure you want to delete the route \"%(name)s\" (%(path)s)?" msgstr "Naozaj chcete odstrániť trasu \"%(name)s\" (%(path)s)?" -#: app_gateway/views.py:444 +#: app_gateway/views.py:443 msgid "Configuration exported successfully." msgstr "Konfigurácia bola úspešne exportovaná." -#: app_gateway/views.py:446 +#: app_gateway/views.py:445 msgid "" "Caddy is not active. Configuration files were exported for debugging " "purposes." @@ -629,13 +647,13 @@ msgstr "" msgid "IP Lock" msgstr "IP zámok" -#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198 +#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:271 #: templates/cluster/workers_list.html:10 #: templates/dns/static_host_list.html:18 #: templates/firewall/manage_redirect_rule.html:43 #: templates/firewall/manage_redirect_rule.html:67 #: templates/firewall/manage_redirect_rule.html:68 -#: templates/gatekeeper/gatekeeper_list.html:256 +#: templates/gatekeeper/gatekeeper_list.html:272 #: templates/wireguard/wireguard_status.html:45 msgid "IP Address" msgstr "IP adresa" @@ -906,7 +924,7 @@ msgstr "Statický DNS" msgid "Invalid hostname." msgstr "Neplatný názov hostiteľa." -#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201 +#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:274 #: templates/api_v2/api_documentation.html:51 #: templates/dns/static_host_list.html:69 #: templates/firewall/manage_redirect_rule.html:18 @@ -1237,43 +1255,29 @@ msgstr "Spravovať nastavenia firewall" msgid "Firewall settings saved successfully" msgstr "Nastavenia firewall boli úspešne uložené" -#: gatekeeper/forms.py:17 templates/accounts/login.html:14 -#: templates/gatekeeper/gatekeeper_list.html:61 -#: templates/user_manager/list.html:8 user_manager/forms.py:13 -#: vpn_invite/forms.py:281 -msgid "Username" -msgstr "Používateľské meno" - -#: gatekeeper/forms.py:18 gatekeeper/forms.py:271 -#: templates/gatekeeper/gatekeeper_list.html:62 -#: templates/gatekeeper/gatekeeper_list.html:204 -#: templates/wireguard/peer_list/peer_preview_modal.html:103 -msgid "Email" -msgstr "E-mail" - -#: gatekeeper/forms.py:19 templates/accounts/login.html:23 +#: gatekeeper/forms.py:17 templates/accounts/login.html:23 #: templates/vpn_invite/invite_settings.html:19 user_manager/forms.py:14 #: vpn_invite/forms.py:282 msgid "Password" msgstr "Heslo" #: gatekeeper/forms.py:20 -msgid "TOTP Secret" -msgstr "TOTP tajomstvo" +msgid "" +"Minimum 8 characters, with at least one uppercase letter, one lowercase " +"letter, and one number." +msgstr "" -#: gatekeeper/forms.py:55 templates/gatekeeper/gatekeeper_list.html:104 -msgid "Group Name" -msgstr "Názov skupiny" +#: gatekeeper/forms.py:23 +#, fuzzy +#| msgid "Random Password" +msgid "Confirm Password" +msgstr "Náhodné heslo" -#: gatekeeper/forms.py:56 templates/gatekeeper/gatekeeper_list.html:105 -msgid "Members" -msgstr "Členovia" - -#: gatekeeper/forms.py:86 +#: gatekeeper/forms.py:28 gatekeeper/forms.py:161 msgid "TOTP Validation PIN" msgstr "Validačný PIN TOTP" -#: gatekeeper/forms.py:89 +#: gatekeeper/forms.py:31 gatekeeper/forms.py:164 msgid "" "Enter a 6-digit PIN generated by your authenticator app to validate the " "secret." @@ -1281,91 +1285,147 @@ msgstr "" "Zadajte 6-miestny PIN vygenerovaný vašou autentifikačnou aplikáciou na " "overenie tajomstva." -#: gatekeeper/forms.py:100 +#: gatekeeper/forms.py:38 templates/accounts/login.html:14 +#: templates/gatekeeper/gatekeeper_list.html:61 +#: templates/user_manager/list.html:8 user_manager/forms.py:13 +#: vpn_invite/forms.py:281 +msgid "Username" +msgstr "Používateľské meno" + +#: gatekeeper/forms.py:39 gatekeeper/forms.py:344 +#: templates/gatekeeper/gatekeeper_list.html:62 +#: templates/gatekeeper/gatekeeper_list.html:220 +#: templates/wireguard/peer_list/peer_preview_modal.html:103 +msgid "Email" +msgstr "E-mail" + +#: gatekeeper/forms.py:40 +msgid "TOTP Secret" +msgstr "TOTP tajomstvo" + +#: gatekeeper/forms.py:87 +#, fuzzy +#| msgid "Port is required." +msgid "Password is required." +msgstr "Port je povinný." + +#: gatekeeper/forms.py:90 user_manager/forms.py:127 +msgid "Password must be at least 8 characters long." +msgstr "Heslo musí mať aspoň 8 znakov." + +#: gatekeeper/forms.py:92 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one lowercase letter." +msgstr "Heslo musí mať aspoň 8 znakov." + +#: gatekeeper/forms.py:94 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one uppercase letter." +msgstr "Heslo musí mať aspoň 8 znakov." + +#: gatekeeper/forms.py:96 +#, fuzzy +#| msgid "Password must be at least 8 characters long." +msgid "Password must contain at least one number." +msgstr "Heslo musí mať aspoň 8 znakov." + +#: gatekeeper/forms.py:98 +#, fuzzy +#| msgid "Password Confirmation" +msgid "Passwords do not match." +msgstr "Potvrdenie hesla" + +#: gatekeeper/forms.py:103 gatekeeper/forms.py:249 +msgid "Please provide a PIN to validate the TOTP secret." +msgstr "Na overenie tajomstva TOTP zadajte PIN." + +#: gatekeeper/forms.py:108 gatekeeper/forms.py:254 +msgid "Invalid TOTP PIN." +msgstr "Neplatný PIN TOTP." + +#: gatekeeper/forms.py:110 gatekeeper/forms.py:256 +msgid "Invalid TOTP secret format. Must be a valid Base32 string." +msgstr "Neplatný formát tajomstva TOTP. Musí to byť platný reťazec Base32." + +#: gatekeeper/forms.py:130 templates/gatekeeper/gatekeeper_list.html:120 +msgid "Group Name" +msgstr "Názov skupiny" + +#: gatekeeper/forms.py:131 templates/gatekeeper/gatekeeper_list.html:121 +msgid "Members" +msgstr "Členovia" + +#: gatekeeper/forms.py:175 msgid "Authentication Type" msgstr "Typ autentifikácie" -#: gatekeeper/forms.py:101 +#: gatekeeper/forms.py:176 msgid "Global TOTP Secret" msgstr "Globálne TOTP tajomstvo" -#: gatekeeper/forms.py:102 -msgid "Global TOTP Before Authentication" -msgstr "Globálne TOTP pred autentifikáciou" - -#: gatekeeper/forms.py:103 +#: gatekeeper/forms.py:177 msgid "OIDC Provider URL" msgstr "URL poskytovateľa OIDC" -#: gatekeeper/forms.py:104 +#: gatekeeper/forms.py:178 msgid "OIDC Client ID" msgstr "ID klienta OIDC" -#: gatekeeper/forms.py:105 +#: gatekeeper/forms.py:179 msgid "OIDC Client Secret" msgstr "Secret klienta OIDC" -#: gatekeeper/forms.py:157 +#: gatekeeper/forms.py:230 msgid "TOTP secret must be empty for Local Password authentication." msgstr "TOTP tajomstvo musí byť prázdne pre autentifikáciu miestnym heslom." -#: gatekeeper/forms.py:159 +#: gatekeeper/forms.py:232 msgid "TOTP validation PIN must be empty for Local Password authentication." msgstr "" "Validačný PIN TOTP musí byť prázdny pre autentifikáciu miestnym heslom." -#: gatekeeper/forms.py:161 +#: gatekeeper/forms.py:234 msgid "OIDC fields must be empty for Local Password authentication." msgstr "Polia OIDC musia byť prázdne pre autentifikáciu miestnym heslom." -#: gatekeeper/forms.py:167 +#: gatekeeper/forms.py:240 msgid "Only one Local Password authentication method can be configured." msgstr "" "Je možné nakonfigurovať iba jednu metódu autentifikácie miestnym heslom." -#: gatekeeper/forms.py:170 +#: gatekeeper/forms.py:243 msgid "OIDC fields must be empty for TOTP authentication." msgstr "Polia OIDC musia byť prázdne pre autentifikáciu TOTP." -#: gatekeeper/forms.py:172 +#: gatekeeper/forms.py:245 msgid "TOTP secret is required for TOTP authentication." msgstr "TOTP tajomstvo je povinné pre autentifikáciu TOTP." -#: gatekeeper/forms.py:176 -msgid "Please provide a PIN to validate the TOTP secret." -msgstr "Na overenie tajomstva TOTP zadajte PIN." - -#: gatekeeper/forms.py:181 -msgid "Invalid TOTP PIN." -msgstr "Neplatný PIN TOTP." - -#: gatekeeper/forms.py:183 -msgid "Invalid TOTP secret format. Must be a valid Base32 string." -msgstr "Neplatný formát tajomstva TOTP. Musí to byť platný reťazec Base32." - -#: gatekeeper/forms.py:186 +#: gatekeeper/forms.py:259 msgid "TOTP secret must be empty for OIDC authentication." msgstr "TOTP tajomstvo musí byť prázdne pre autentifikáciu OIDC." -#: gatekeeper/forms.py:188 +#: gatekeeper/forms.py:261 msgid "TOTP validation PIN must be empty for OIDC authentication." msgstr "Validačný PIN TOTP musí byť prázdny pre autentifikáciu OIDC." -#: gatekeeper/forms.py:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270 +#: gatekeeper/forms.py:270 gatekeeper/forms.py:312 gatekeeper/forms.py:343 msgid "Authentication Method" msgstr "Metóda autentifikácie" -#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257 +#: gatekeeper/forms.py:272 templates/gatekeeper/gatekeeper_list.html:273 msgid "Prefix Length" msgstr "Dĺžka prefixu" -#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47 +#: gatekeeper/forms.py:273 templates/firewall/firewall_rule_list.html:47 #: templates/firewall/manage_firewall_rule.html:360 -#: templates/gatekeeper/gatekeeper_list.html:258 +#: templates/gatekeeper/gatekeeper_list.html:274 msgid "Action" msgstr "Akcia" -#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221 +#: gatekeeper/forms.py:313 templates/gatekeeper/gatekeeper_list.html:237 msgid "Domain" msgstr "Doména" @@ -1389,15 +1449,15 @@ msgstr "Zoznam IP adries" msgid "Shared/global TOTP secret key" msgstr "Zdieľaný/globálny tajný kľúč TOTP" -#: gatekeeper/models.py:69 +#: gatekeeper/models.py:68 msgid "Password for local authentication (leave blank if not using)" msgstr "Heslo pre miestnu autentifikáciu (ak nepoužívate, nechajte prázdne)" -#: gatekeeper/models.py:71 +#: gatekeeper/models.py:69 msgid "Per-user TOTP secret key" msgstr "Tajný kľúč TOTP pre jednotlivých používateľov" -#: gatekeeper/models.py:110 templates/gatekeeper/gatekeeper_list.html:270 +#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:286 msgid "Allow" msgstr "Povoliť" @@ -1413,57 +1473,102 @@ msgstr "Vytvoriť používateľa Gatekeeper" msgid "Gatekeeper User saved successfully." msgstr "Používateľ Gatekeeper bol úspešne uložený." -#: gatekeeper/views.py:86 +#: gatekeeper/views.py:69 +msgid "" +"\n" +"

Gatekeeper User

\n" +"

Gatekeeper users are used for authenticating against protected " +"applications managed by this gateway.

\n" +"\n" +"
Password
\n" +"

Required when creating a user. When editing, leave both password " +"fields blank to keep the current password.\n" +" Passwords are stored using Argon2id hashing.

\n" +"\n" +"
TOTP Secret
\n" +"

Optional per-user TOTP secret. When set, this user will " +"authenticate using their own secret instead of the\n" +" global TOTP secret configured on the Authentication Method. Use the " +"buttons below the field to generate a\n" +" random secret and scan the QR code with your authenticator app. " +"Validate the secret by entering the current\n" +" 6-digit PIN before saving.

\n" +" " +msgstr "" + +#: gatekeeper/views.py:106 msgid "Gatekeeper User deleted successfully." msgstr "Používateľ Gatekeeper bol úspešne odstránený." -#: gatekeeper/views.py:91 +#: gatekeeper/views.py:111 msgid "Delete Gatekeeper User" msgstr "Odstrániť používateľa Gatekeeper" -#: gatekeeper/views.py:93 +#: gatekeeper/views.py:113 #, python-format msgid "Are you sure you want to delete the user \"%(username)s\"?" msgstr "Naozaj chcete odstrániť používateľa \"%(username)s\"?" -#: gatekeeper/views.py:107 +#: gatekeeper/views.py:127 msgid "Edit Gatekeeper Group" msgstr "Upraviť skupinu Gatekeeper" -#: gatekeeper/views.py:110 +#: gatekeeper/views.py:130 msgid "Create Gatekeeper Group" msgstr "Vytvoriť skupinu Gatekeeper" -#: gatekeeper/views.py:117 +#: gatekeeper/views.py:137 msgid "Gatekeeper Group saved successfully." msgstr "Skupina Gatekeeper bola úspešne uložená." -#: gatekeeper/views.py:139 +#: gatekeeper/views.py:159 msgid "Gatekeeper Group deleted successfully." msgstr "Skupina Gatekeeper bola úspešne odstránená." -#: gatekeeper/views.py:144 +#: gatekeeper/views.py:164 msgid "Delete Gatekeeper Group" msgstr "Odstrániť skupinu Gatekeeper" -#: gatekeeper/views.py:146 +#: gatekeeper/views.py:166 #, python-format msgid "Are you sure you want to delete the group \"%(name)s\"?" msgstr "Naozaj chcete odstrániť skupinu \"%(name)s\"?" -#: gatekeeper/views.py:160 +#: gatekeeper/views.py:180 msgid "Edit Authentication Method" msgstr "Upraviť metódu autentifikácie" -#: gatekeeper/views.py:163 +#: gatekeeper/views.py:183 msgid "Create Authentication Method" msgstr "Vytvoriť metódu autentifikácie" -#: gatekeeper/views.py:170 +#: gatekeeper/views.py:190 msgid "Authentication Method saved successfully." msgstr "Metóda autentifikácie bola úspešne uložená." -#: gatekeeper/views.py:175 +#: gatekeeper/views.py:195 +#, fuzzy +#| msgid "" +#| "\n" +#| "

Authentication Types

\n" +#| "

Select how users will authenticate through this method.

\n" +#| " \n" +#| "
Local Password
\n" +#| "

Users will authenticate using a standard username and password " +#| "stored locally. Only one of this type can be created.

\n" +#| " \n" +#| "
OIDC (OpenID Connect)
\n" +#| "

Users will authenticate via an external identity provider " +#| "(like Keycloak, Google, or Authelia). Requires Provider URL, Client ID, " +#| "and Client Secret.

\n" +#| " \n" +#| "
TOTP (Time-Based One-Time Password)
\n" +#| "

Users will need to enter a rotating token from an " +#| "authenticator app. Requires setting a Global TOTP Secret.
If " +#| "Global TOTP Before Authentication is enabled, the PIN is " +#| "required before the username and password to help combat bruteforce " +#| "attacks.

\n" +#| " " msgid "" "\n" "

Authentication Types

\n" @@ -1480,9 +1585,8 @@ msgid "" " \n" "
TOTP (Time-Based One-Time Password)
\n" "

Users will need to enter a rotating token from an authenticator " -"app. Requires setting a Global TOTP Secret.
If Global TOTP " -"Before Authentication is enabled, the PIN is required before the " -"username and password to help combat bruteforce attacks.

\n" +"app. If a user does not have a personal TOTP configured, the Global " +"TOTP Secret will be used instead.

\n" " " msgstr "" "\n" @@ -1508,83 +1612,83 @@ msgstr "" "p>\n" " " -#: gatekeeper/views.py:210 +#: gatekeeper/views.py:230 msgid "Authentication Method deleted successfully." msgstr "Metóda autentifikácie bola úspešne odstránená." -#: gatekeeper/views.py:215 +#: gatekeeper/views.py:235 msgid "Delete Authentication Method" msgstr "Odstrániť metódu autentifikácie" -#: gatekeeper/views.py:217 +#: gatekeeper/views.py:237 #, python-format msgid "Are you sure you want to delete the authentication method \"%(name)s\"?" msgstr "Naozaj chcete odstrániť metódu autentifikácie \"%(name)s\"?" -#: gatekeeper/views.py:267 +#: gatekeeper/views.py:287 msgid "Edit Allowed Domain" msgstr "Upraviť povolenú doménu" -#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186 +#: gatekeeper/views.py:290 templates/gatekeeper/gatekeeper_list.html:202 msgid "Add Allowed Domain" msgstr "Pridať povolenú doménu" -#: gatekeeper/views.py:277 +#: gatekeeper/views.py:297 msgid "Allowed Domain saved successfully." msgstr "Povolená doména bola úspešne uložená." -#: gatekeeper/views.py:299 +#: gatekeeper/views.py:319 msgid "Allowed Domain deleted successfully." msgstr "Povolená doména bola úspešne odstránená." -#: gatekeeper/views.py:304 +#: gatekeeper/views.py:324 msgid "Delete Allowed Domain" msgstr "Odstrániť povolenú doménu" -#: gatekeeper/views.py:306 +#: gatekeeper/views.py:326 #, python-format msgid "Are you sure you want to delete the allowed domain \"%(domain)s\"?" msgstr "Naozaj chcete odstrániť povolenú doménu \"%(domain)s\"?" -#: gatekeeper/views.py:320 +#: gatekeeper/views.py:340 msgid "Edit Allowed Email" msgstr "Upraviť povolený e-mail" -#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183 +#: gatekeeper/views.py:343 templates/gatekeeper/gatekeeper_list.html:199 msgid "Add Allowed Email" msgstr "Pridať povolený e-mail" -#: gatekeeper/views.py:330 +#: gatekeeper/views.py:350 msgid "Allowed Email saved successfully." msgstr "Povolený e-mail bol úspešne uložený." -#: gatekeeper/views.py:352 +#: gatekeeper/views.py:372 msgid "Allowed Email deleted successfully." msgstr "Povolený e-mail bol úspešne odstránený." -#: gatekeeper/views.py:357 +#: gatekeeper/views.py:377 msgid "Delete Allowed Email" msgstr "Odstrániť povolený e-mail" -#: gatekeeper/views.py:359 +#: gatekeeper/views.py:379 #, python-format msgid "Are you sure you want to delete the allowed email \"%(email)s\"?" msgstr "Naozaj chcete odstrániť povolený e-mail \"%(email)s\"?" -#: gatekeeper/views.py:373 +#: gatekeeper/views.py:393 msgid "Edit IP Address" msgstr "Upraviť IP adresu" -#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247 +#: gatekeeper/views.py:396 templates/gatekeeper/gatekeeper_list.html:263 #: templates/wireguard/wireguard_manage_peer.html:171 msgid "Add IP Address" msgstr "Pridať IP adresu" -#: gatekeeper/views.py:383 +#: gatekeeper/views.py:403 msgid "IP Address saved successfully." msgstr "IP adresa bola úspešne uložená." -#: gatekeeper/views.py:388 +#: gatekeeper/views.py:408 msgid "" "\n" "
IP Address List
\n" @@ -1631,15 +1735,15 @@ msgstr "" "(napr. „Kancelárska sieť“, „Blokovaný útočník“).

\n" " " -#: gatekeeper/views.py:424 +#: gatekeeper/views.py:444 msgid "IP Address deleted successfully." msgstr "IP adresa bola úspešne odstránená." -#: gatekeeper/views.py:429 +#: gatekeeper/views.py:449 msgid "Delete IP Address" msgstr "Odstrániť IP adresu" -#: gatekeeper/views.py:431 +#: gatekeeper/views.py:451 #, python-format msgid "Are you sure you want to delete the IP address \"%(address)s\"?" msgstr "Naozaj chcete odstrániť IP adresu \"%(address)s\"?" @@ -1993,8 +2097,8 @@ msgid "In" msgstr "Vstup" #: templates/api_v2/api_documentation.html:49 -#: templates/gatekeeper/gatekeeper_list.html:150 -#: templates/gatekeeper/gatekeeper_list.html:195 +#: templates/gatekeeper/gatekeeper_list.html:166 +#: templates/gatekeeper/gatekeeper_list.html:211 #: templates/wireguard/apply_route_template.html:27 msgid "Type" msgstr "Typ" @@ -2004,11 +2108,13 @@ msgid "Required" msgstr "Povinné" #: templates/api_v2/api_documentation.html:62 +#: templates/gatekeeper/gatekeeper_list.html:75 #: templates/scheduler/scheduleprofile_form.html:175 msgid "Yes" msgstr "Áno" #: templates/api_v2/api_documentation.html:64 +#: templates/gatekeeper/gatekeeper_list.html:77 #: templates/scheduler/scheduleprofile_form.html:177 msgid "No" msgstr "Nie" @@ -2053,12 +2159,12 @@ msgstr "Zakázané" #: templates/app_gateway/application_details.html:121 #: templates/cluster/workers_list.html:77 #: templates/dns/static_host_list.html:74 -#: templates/gatekeeper/gatekeeper_list.html:73 -#: templates/gatekeeper/gatekeeper_list.html:116 -#: templates/gatekeeper/gatekeeper_list.html:161 -#: templates/gatekeeper/gatekeeper_list.html:209 -#: templates/gatekeeper/gatekeeper_list.html:226 -#: templates/gatekeeper/gatekeeper_list.html:278 +#: templates/gatekeeper/gatekeeper_list.html:89 +#: templates/gatekeeper/gatekeeper_list.html:132 +#: templates/gatekeeper/gatekeeper_list.html:177 +#: templates/gatekeeper/gatekeeper_list.html:225 +#: templates/gatekeeper/gatekeeper_list.html:242 +#: templates/gatekeeper/gatekeeper_list.html:294 #: templates/routing_templates/list.html:29 #: templates/scheduler/scheduleprofile_form.html:123 #: templates/scheduler/scheduleprofile_list.html:25 @@ -2140,6 +2246,7 @@ msgstr "Pridať politiku prístupu" #: templates/app_gateway/app_gateway_list.html:140 #: templates/gatekeeper/gatekeeper_list.html:43 +#: templates/gatekeeper/gatekeeper_list.html:64 msgid "Groups" msgstr "Skupiny" @@ -2150,10 +2257,10 @@ msgstr "Metódy autentifikácie" #: templates/app_gateway/app_gateway_list.html:142 #: templates/app_gateway/application_details.html:62 #: templates/app_gateway/application_details.html:109 -#: templates/gatekeeper/gatekeeper_list.html:63 -#: templates/gatekeeper/gatekeeper_list.html:106 -#: templates/gatekeeper/gatekeeper_list.html:151 -#: templates/gatekeeper/gatekeeper_list.html:198 +#: templates/gatekeeper/gatekeeper_list.html:65 +#: templates/gatekeeper/gatekeeper_list.html:122 +#: templates/gatekeeper/gatekeeper_list.html:167 +#: templates/gatekeeper/gatekeeper_list.html:214 #: templates/scheduler/scheduleprofile_form.html:111 #: templates/scheduler/scheduleprofile_list.html:15 #: templates/wireguard/apply_route_template.html:28 @@ -2707,10 +2814,19 @@ msgid "Create Port forwarding Rule" msgstr "Vytvoriť pravidlo presmerovania portov" #: templates/gatekeeper/gatekeeper_auth_method_form.html:63 +#: templates/gatekeeper/gatekeeper_user_form.html:43 msgid "View QR Code" msgstr "Zobraziť QR kód" -#: templates/gatekeeper/gatekeeper_auth_method_form.html:74 +#: templates/gatekeeper/gatekeeper_auth_method_form.html:64 +#: templates/gatekeeper/gatekeeper_user_form.html:44 +#, fuzzy +#| msgid "Global TOTP Secret" +msgid "Generate TOTP Secret" +msgstr "Globálne TOTP tajomstvo" + +#: templates/gatekeeper/gatekeeper_auth_method_form.html:93 +#: templates/gatekeeper/gatekeeper_user_form.html:73 msgid "Please enter a TOTP Secret first to generate the QR code." msgstr "Najprv zadajte TOTP tajomstvo, aby ste vygenerovali QR kód." @@ -2736,44 +2852,48 @@ msgstr "Používatelia" msgid "Add User" msgstr "Pridať používateľa" -#: templates/gatekeeper/gatekeeper_list.html:88 +#: templates/gatekeeper/gatekeeper_list.html:63 +msgid "TOTP" +msgstr "" + +#: templates/gatekeeper/gatekeeper_list.html:104 msgid "No Gatekeeper Users found." msgstr "Nenašli sa žiadni používatelia Gatekeeper." -#: templates/gatekeeper/gatekeeper_list.html:95 +#: templates/gatekeeper/gatekeeper_list.html:111 msgid "Add Group" msgstr "Pridať skupinu" -#: templates/gatekeeper/gatekeeper_list.html:131 +#: templates/gatekeeper/gatekeeper_list.html:147 msgid "No Gatekeeper Groups found." msgstr "Nenašli sa žiadne skupiny Gatekeeper." -#: templates/gatekeeper/gatekeeper_list.html:140 +#: templates/gatekeeper/gatekeeper_list.html:156 msgid "Add Auth Method" msgstr "Pridať metódu autentifikácie" -#: templates/gatekeeper/gatekeeper_list.html:176 +#: templates/gatekeeper/gatekeeper_list.html:192 msgid "No Authentication Methods found." msgstr "Nenašli sa žiadne metódy autentifikácie." -#: templates/gatekeeper/gatekeeper_list.html:196 +#: templates/gatekeeper/gatekeeper_list.html:212 msgid "Identity" msgstr "Identita" -#: templates/gatekeeper/gatekeeper_list.html:197 -#: templates/gatekeeper/gatekeeper_list.html:259 +#: templates/gatekeeper/gatekeeper_list.html:213 +#: templates/gatekeeper/gatekeeper_list.html:275 msgid "Auth Method" msgstr "Metóda autentifikácie" -#: templates/gatekeeper/gatekeeper_list.html:241 +#: templates/gatekeeper/gatekeeper_list.html:257 msgid "No Allowed Emails or Domains found." msgstr "Nenašli sa žiadne povolené e-maily ani domény." -#: templates/gatekeeper/gatekeeper_list.html:260 +#: templates/gatekeeper/gatekeeper_list.html:276 msgid "Manage" msgstr "Spravovať" -#: templates/gatekeeper/gatekeeper_list.html:293 +#: templates/gatekeeper/gatekeeper_list.html:309 msgid "No IP Addresses found." msgstr "Nenašli sa žiadne IP adresy." @@ -3611,10 +3731,6 @@ msgstr "Potvrdenie hesla je povinné pre nových používateľov." msgid "The two password fields didn't match." msgstr "Heslá sa nezhodujú." -#: user_manager/forms.py:127 -msgid "Password must be at least 8 characters long." -msgstr "Heslo musí mať aspoň 8 znakov." - #: user_manager/forms.py:220 msgid "A peer group with that name already exists." msgstr "Peer skupina s týmto názvom už existuje." @@ -4377,3 +4493,6 @@ msgid "No interfaces found|No WireGuard interfaces were found to process." msgstr "" "Neboli nájdené rozhrania|Neboli nájdené žiadne WireGuard rozhrania na " "spracovanie." + +#~ msgid "Global TOTP Before Authentication" +#~ msgstr "Globálne TOTP pred autentifikáciou"