diff --git a/Makefile b/Makefile index 93092a7796..0a82f974e4 100644 --- a/Makefile +++ b/Makefile @@ -67,16 +67,18 @@ lint: ## Lint the python and golang sources pylint $(PY_SOURCES) golangci-lint run -v +core-install: + poetry install + migrate: ## Run the Authentik Django server's migrations python -m lifecycle.migrate -i18n-extract: i18n-extract-core web-i18n-extract ## Extract strings that require translation into files to send to a translation service +i18n-extract: core-i18n-extract web-i18n-extract ## Extract strings that require translation into files to send to a translation service -i18n-extract-core: +core-i18n-extract: ak makemessages --ignore web --ignore internal --ignore web --ignore web-api --ignore website -l en -install: web-install website-install ## Install all requires dependencies for `web`, `website` and `core` - poetry install +install: web-install website-install core-install ## Install all requires dependencies for `web`, `website` and `core` dev-drop-db: dropdb -U ${pg_user} -h ${pg_host} ${pg_name} diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 07031190c0..05e35ec9f5 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-06 16:55+0000\n" +"POT-Creation-Date: 2024-01-18 22:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -69,183 +69,183 @@ msgstr "" msgid "authentik Export - %(date)s" msgstr "" -#: authentik/blueprints/v1/tasks.py:150 authentik/crypto/tasks.py:93 +#: authentik/blueprints/v1/tasks.py:145 authentik/crypto/tasks.py:93 #, python-format msgid "Successfully imported %(count)d files." msgstr "" -#: authentik/core/api/providers.py:120 +#: authentik/core/api/providers.py:122 msgid "SAML Provider from Metadata" msgstr "" -#: authentik/core/api/providers.py:121 +#: authentik/core/api/providers.py:123 msgid "Create a SAML Provider by importing its Metadata." msgstr "" -#: authentik/core/api/users.py:156 +#: authentik/core/api/users.py:150 msgid "No leading or trailing slashes allowed." msgstr "" -#: authentik/core/api/users.py:159 +#: authentik/core/api/users.py:153 msgid "No empty segments in user path allowed." msgstr "" -#: authentik/core/models.py:86 +#: authentik/core/models.py:85 msgid "name" msgstr "" -#: authentik/core/models.py:88 +#: authentik/core/models.py:87 msgid "Users added to this group will be superusers." msgstr "" -#: authentik/core/models.py:162 +#: authentik/core/models.py:161 msgid "Group" msgstr "" -#: authentik/core/models.py:163 +#: authentik/core/models.py:162 msgid "Groups" msgstr "" -#: authentik/core/models.py:178 +#: authentik/core/models.py:177 msgid "User's display name." msgstr "" -#: authentik/core/models.py:274 authentik/providers/oauth2/models.py:295 +#: authentik/core/models.py:273 authentik/providers/oauth2/models.py:295 msgid "User" msgstr "" -#: authentik/core/models.py:275 +#: authentik/core/models.py:274 msgid "Users" msgstr "" -#: authentik/core/models.py:277 +#: authentik/core/models.py:276 #: authentik/stages/email/templates/email/password_reset.html:28 msgid "Reset Password" msgstr "" -#: authentik/core/models.py:278 +#: authentik/core/models.py:277 msgid "Can impersonate other users" msgstr "" -#: authentik/core/models.py:279 authentik/rbac/models.py:54 +#: authentik/core/models.py:278 authentik/rbac/models.py:54 msgid "Can assign permissions to users" msgstr "" -#: authentik/core/models.py:280 authentik/rbac/models.py:55 +#: authentik/core/models.py:279 authentik/rbac/models.py:55 msgid "Can unassign permissions from users" msgstr "" -#: authentik/core/models.py:294 +#: authentik/core/models.py:293 msgid "" "Flow used for authentication when the associated application is accessed by " "an un-authenticated user." msgstr "" -#: authentik/core/models.py:304 +#: authentik/core/models.py:303 msgid "Flow used when authorizing this provider." msgstr "" -#: authentik/core/models.py:316 +#: authentik/core/models.py:315 msgid "" "Accessed from applications; optional backchannel providers for protocols " "like LDAP and SCIM." msgstr "" -#: authentik/core/models.py:371 +#: authentik/core/models.py:370 msgid "Application's display Name." msgstr "" -#: authentik/core/models.py:372 +#: authentik/core/models.py:371 msgid "Internal application name, used in URLs." msgstr "" -#: authentik/core/models.py:384 +#: authentik/core/models.py:383 msgid "Open launch URL in a new browser tab or window." msgstr "" -#: authentik/core/models.py:448 +#: authentik/core/models.py:447 msgid "Application" msgstr "" -#: authentik/core/models.py:449 +#: authentik/core/models.py:448 msgid "Applications" msgstr "" -#: authentik/core/models.py:455 +#: authentik/core/models.py:454 msgid "Use the source-specific identifier" msgstr "" -#: authentik/core/models.py:457 +#: authentik/core/models.py:456 msgid "" "Link to a user with identical email address. Can have security implications " "when a source doesn't validate email addresses." msgstr "" -#: authentik/core/models.py:461 +#: authentik/core/models.py:460 msgid "" "Use the user's email address, but deny enrollment when the email address " "already exists." msgstr "" -#: authentik/core/models.py:464 +#: authentik/core/models.py:463 msgid "" "Link to a user with identical username. Can have security implications when " "a username is used with another source." msgstr "" -#: authentik/core/models.py:468 +#: authentik/core/models.py:467 msgid "" "Use the user's username, but deny enrollment when the username already " "exists." msgstr "" -#: authentik/core/models.py:475 +#: authentik/core/models.py:474 msgid "Source's display Name." msgstr "" -#: authentik/core/models.py:476 +#: authentik/core/models.py:475 msgid "Internal source name, used in URLs." msgstr "" -#: authentik/core/models.py:495 +#: authentik/core/models.py:494 msgid "Flow to use when authenticating existing users." msgstr "" -#: authentik/core/models.py:504 +#: authentik/core/models.py:503 msgid "Flow to use when enrolling new users." msgstr "" -#: authentik/core/models.py:512 +#: authentik/core/models.py:511 msgid "" "How the source determines if an existing user should be authenticated or a " "new user enrolled." msgstr "" -#: authentik/core/models.py:684 +#: authentik/core/models.py:683 msgid "Token" msgstr "" -#: authentik/core/models.py:685 +#: authentik/core/models.py:684 msgid "Tokens" msgstr "" -#: authentik/core/models.py:690 +#: authentik/core/models.py:689 msgid "View token's key" msgstr "" -#: authentik/core/models.py:726 +#: authentik/core/models.py:725 msgid "Property Mapping" msgstr "" -#: authentik/core/models.py:727 +#: authentik/core/models.py:726 msgid "Property Mappings" msgstr "" -#: authentik/core/models.py:762 +#: authentik/core/models.py:763 msgid "Authenticated Session" msgstr "" -#: authentik/core/models.py:763 +#: authentik/core/models.py:764 msgid "Authenticated Sessions" msgstr "" @@ -320,12 +320,12 @@ msgstr "" msgid "Go home" msgstr "" -#: authentik/core/templates/login/base_full.html:89 +#: authentik/core/templates/login/base_full.html:75 msgid "Powered by authentik" msgstr "" #: authentik/core/views/apps.py:53 -#: authentik/providers/oauth2/views/authorize.py:393 +#: authentik/providers/oauth2/views/authorize.py:434 #: authentik/providers/oauth2/views/device_init.py:70 #: authentik/providers/saml/views/sso.py:70 #, python-format @@ -354,6 +354,10 @@ msgstr "" msgid "Certificate-Key Pairs" msgstr "" +#: authentik/enterprise/api.py:33 +msgid "Enterprise is required to create/update this object." +msgstr "" + #: authentik/enterprise/models.py:183 msgid "License" msgstr "" @@ -370,105 +374,152 @@ msgstr "" msgid "License Usage Records" msgstr "" -#: authentik/events/models.py:291 +#: authentik/enterprise/policy.py:18 +msgid "Enterprise required to access this feature." +msgstr "" + +#: authentik/enterprise/policy.py:20 +msgid "Feature only accessible for internal users." +msgstr "" + +#: authentik/enterprise/providers/rac/models.py:48 +#: authentik/stages/user_login/models.py:39 +msgid "" +"Determines how long a session lasts. Default of 0 means that the sessions " +"lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)" +msgstr "" + +#: authentik/enterprise/providers/rac/models.py:71 +msgid "RAC Provider" +msgstr "" + +#: authentik/enterprise/providers/rac/models.py:72 +msgid "RAC Providers" +msgstr "" + +#: authentik/enterprise/providers/rac/models.py:100 +msgid "RAC Endpoint" +msgstr "" + +#: authentik/enterprise/providers/rac/models.py:101 +msgid "RAC Endpoints" +msgstr "" + +#: authentik/enterprise/providers/rac/models.py:122 +msgid "RAC Property Mapping" +msgstr "" + +#: authentik/enterprise/providers/rac/models.py:123 +msgid "RAC Property Mappings" +msgstr "" + +#: authentik/enterprise/providers/rac/views.py:108 +msgid "Maximum connection limit reached." +msgstr "" + +#: authentik/enterprise/providers/rac/views.py:112 +msgid "(You are already connected in another tab/window)" +msgstr "" + +#: authentik/events/models.py:286 msgid "Event" msgstr "" -#: authentik/events/models.py:292 +#: authentik/events/models.py:287 msgid "Events" msgstr "" -#: authentik/events/models.py:298 +#: authentik/events/models.py:293 msgid "authentik inbuilt notifications" msgstr "" -#: authentik/events/models.py:299 +#: authentik/events/models.py:294 msgid "Generic Webhook" msgstr "" -#: authentik/events/models.py:300 +#: authentik/events/models.py:295 msgid "Slack Webhook (Slack/Discord)" msgstr "" -#: authentik/events/models.py:301 +#: authentik/events/models.py:296 msgid "Email" msgstr "" -#: authentik/events/models.py:319 +#: authentik/events/models.py:314 msgid "" "Only send notification once, for example when sending a webhook into a chat " "channel." msgstr "" -#: authentik/events/models.py:384 +#: authentik/events/models.py:379 msgid "Severity" msgstr "" -#: authentik/events/models.py:389 +#: authentik/events/models.py:384 msgid "Dispatched for user" msgstr "" -#: authentik/events/models.py:398 +#: authentik/events/models.py:393 msgid "Event user" msgstr "" -#: authentik/events/models.py:492 +#: authentik/events/models.py:487 msgid "Notification Transport" msgstr "" -#: authentik/events/models.py:493 +#: authentik/events/models.py:488 msgid "Notification Transports" msgstr "" -#: authentik/events/models.py:499 +#: authentik/events/models.py:494 msgid "Notice" msgstr "" -#: authentik/events/models.py:500 +#: authentik/events/models.py:495 msgid "Warning" msgstr "" -#: authentik/events/models.py:501 +#: authentik/events/models.py:496 msgid "Alert" msgstr "" -#: authentik/events/models.py:526 +#: authentik/events/models.py:521 msgid "Notification" msgstr "" -#: authentik/events/models.py:527 +#: authentik/events/models.py:522 msgid "Notifications" msgstr "" -#: authentik/events/models.py:537 +#: authentik/events/models.py:532 msgid "" "Select which transports should be used to notify the user. If none are " "selected, the notification will only be shown in the authentik UI." msgstr "" -#: authentik/events/models.py:545 +#: authentik/events/models.py:540 msgid "Controls which severity level the created notifications will have." msgstr "" -#: authentik/events/models.py:550 +#: authentik/events/models.py:545 msgid "" "Define which group of users this notification should be sent and shown to. " "If left empty, Notification won't ben sent." msgstr "" -#: authentik/events/models.py:568 +#: authentik/events/models.py:563 msgid "Notification Rule" msgstr "" -#: authentik/events/models.py:569 +#: authentik/events/models.py:564 msgid "Notification Rules" msgstr "" -#: authentik/events/models.py:589 +#: authentik/events/models.py:584 msgid "Webhook Mapping" msgstr "" -#: authentik/events/models.py:590 +#: authentik/events/models.py:585 msgid "Webhook Mappings" msgstr "" @@ -529,7 +580,7 @@ msgstr "" msgid "Pre-flow policies" msgstr "" -#: authentik/flows/api/flows_diagram.py:214 authentik/flows/models.py:193 +#: authentik/flows/api/flows_diagram.py:214 authentik/flows/models.py:194 msgid "Flow" msgstr "" @@ -537,72 +588,72 @@ msgstr "" msgid "Flow does not apply to current user." msgstr "" -#: authentik/flows/models.py:114 +#: authentik/flows/models.py:115 #, python-format msgid "Dynamic In-memory stage: %(doc)s" msgstr "" -#: authentik/flows/models.py:129 +#: authentik/flows/models.py:130 msgid "Visible in the URL." msgstr "" -#: authentik/flows/models.py:131 +#: authentik/flows/models.py:132 msgid "Shown as the Title in Flow pages." msgstr "" -#: authentik/flows/models.py:138 +#: authentik/flows/models.py:139 msgid "" "Decides what this Flow is used for. For example, the Authentication flow is " "redirect to when an un-authenticated user visits authentik." msgstr "" -#: authentik/flows/models.py:147 +#: authentik/flows/models.py:148 msgid "Background shown during execution" msgstr "" -#: authentik/flows/models.py:154 +#: authentik/flows/models.py:155 msgid "" "Enable compatibility mode, increases compatibility with password managers on " "mobile devices." msgstr "" -#: authentik/flows/models.py:162 +#: authentik/flows/models.py:163 msgid "Configure what should happen when a flow denies access to a user." msgstr "" -#: authentik/flows/models.py:168 +#: authentik/flows/models.py:169 msgid "Required level of authentication and authorization to access a flow." msgstr "" -#: authentik/flows/models.py:194 +#: authentik/flows/models.py:195 msgid "Flows" msgstr "" -#: authentik/flows/models.py:197 +#: authentik/flows/models.py:198 msgid "Can export a Flow" msgstr "" -#: authentik/flows/models.py:198 +#: authentik/flows/models.py:199 msgid "Can inspect a Flow's execution" msgstr "" -#: authentik/flows/models.py:199 +#: authentik/flows/models.py:200 msgid "View Flow's cache metrics" msgstr "" -#: authentik/flows/models.py:200 +#: authentik/flows/models.py:201 msgid "Clear Flow's cache metrics" msgstr "" -#: authentik/flows/models.py:216 +#: authentik/flows/models.py:217 msgid "Evaluate policies during the Flow planning process." msgstr "" -#: authentik/flows/models.py:220 +#: authentik/flows/models.py:221 msgid "Evaluate policies when the Stage is present to the user." msgstr "" -#: authentik/flows/models.py:227 +#: authentik/flows/models.py:228 msgid "" "Configure how the flow executor should handle an invalid response to a " "challenge. RETRY returns the error message and a similar challenge to the " @@ -610,25 +661,25 @@ msgid "" "RESTART_WITH_CONTEXT restarts the flow while keeping the current context." msgstr "" -#: authentik/flows/models.py:250 +#: authentik/flows/models.py:251 msgid "Flow Stage Binding" msgstr "" -#: authentik/flows/models.py:251 +#: authentik/flows/models.py:252 msgid "Flow Stage Bindings" msgstr "" -#: authentik/flows/models.py:266 +#: authentik/flows/models.py:267 msgid "" "Flow used by an authenticated user to configure this Stage. If empty, user " "will not be able to configure this stage." msgstr "" -#: authentik/flows/models.py:306 +#: authentik/flows/models.py:307 msgid "Flow Token" msgstr "" -#: authentik/flows/models.py:307 +#: authentik/flows/models.py:308 msgid "Flow Tokens" msgstr "" @@ -651,75 +702,75 @@ msgstr "" msgid "Invalid kubeconfig" msgstr "" -#: authentik/outposts/models.py:122 +#: authentik/outposts/models.py:123 msgid "" "If enabled, use the local connection. Required Docker socket/Kubernetes " "Integration" msgstr "" -#: authentik/outposts/models.py:152 +#: authentik/outposts/models.py:153 msgid "Outpost Service-Connection" msgstr "" -#: authentik/outposts/models.py:153 +#: authentik/outposts/models.py:154 msgid "Outpost Service-Connections" msgstr "" -#: authentik/outposts/models.py:161 +#: authentik/outposts/models.py:162 msgid "" "Can be in the format of 'unix://' when connecting to a local docker " "daemon, or 'https://:2376' when connecting to a remote system." msgstr "" -#: authentik/outposts/models.py:173 +#: authentik/outposts/models.py:174 msgid "" "CA which the endpoint's Certificate is verified against. Can be left empty " "for no validation." msgstr "" -#: authentik/outposts/models.py:185 +#: authentik/outposts/models.py:186 msgid "" "Certificate/Key used for authentication. Can be left empty for no " "authentication." msgstr "" -#: authentik/outposts/models.py:203 +#: authentik/outposts/models.py:204 msgid "Docker Service-Connection" msgstr "" -#: authentik/outposts/models.py:204 +#: authentik/outposts/models.py:205 msgid "Docker Service-Connections" msgstr "" -#: authentik/outposts/models.py:212 +#: authentik/outposts/models.py:213 msgid "" "Paste your kubeconfig here. authentik will automatically use the currently " "selected context." msgstr "" -#: authentik/outposts/models.py:218 +#: authentik/outposts/models.py:219 msgid "Verify SSL Certificates of the Kubernetes API endpoint" msgstr "" -#: authentik/outposts/models.py:235 +#: authentik/outposts/models.py:236 msgid "Kubernetes Service-Connection" msgstr "" -#: authentik/outposts/models.py:236 +#: authentik/outposts/models.py:237 msgid "Kubernetes Service-Connections" msgstr "" -#: authentik/outposts/models.py:252 +#: authentik/outposts/models.py:253 msgid "" "Select Service-Connection authentik should use to manage this outpost. Leave " "empty if authentik should not handle the deployment." msgstr "" -#: authentik/outposts/models.py:419 +#: authentik/outposts/models.py:420 msgid "Outpost" msgstr "" -#: authentik/outposts/models.py:420 +#: authentik/outposts/models.py:421 msgid "Outposts" msgstr "" @@ -902,11 +953,11 @@ msgstr "" msgid "Reputation Policies" msgstr "" -#: authentik/policies/reputation/models.py:95 +#: authentik/policies/reputation/models.py:96 msgid "Reputation Score" msgstr "" -#: authentik/policies/reputation/models.py:96 +#: authentik/policies/reputation/models.py:97 msgid "Reputation Scores" msgstr "" @@ -1169,63 +1220,63 @@ msgid "OAuth2/OpenID Providers" msgstr "" #: authentik/providers/oauth2/models.py:297 -#: authentik/providers/oauth2/models.py:429 +#: authentik/providers/oauth2/models.py:430 msgid "Scopes" msgstr "" -#: authentik/providers/oauth2/models.py:316 +#: authentik/providers/oauth2/models.py:317 msgid "Code" msgstr "" -#: authentik/providers/oauth2/models.py:317 +#: authentik/providers/oauth2/models.py:318 msgid "Nonce" msgstr "" -#: authentik/providers/oauth2/models.py:318 +#: authentik/providers/oauth2/models.py:319 msgid "Code Challenge" msgstr "" -#: authentik/providers/oauth2/models.py:320 +#: authentik/providers/oauth2/models.py:321 msgid "Code Challenge Method" msgstr "" -#: authentik/providers/oauth2/models.py:340 +#: authentik/providers/oauth2/models.py:341 msgid "Authorization Code" msgstr "" -#: authentik/providers/oauth2/models.py:341 +#: authentik/providers/oauth2/models.py:342 msgid "Authorization Codes" msgstr "" -#: authentik/providers/oauth2/models.py:383 +#: authentik/providers/oauth2/models.py:384 msgid "OAuth2 Access Token" msgstr "" -#: authentik/providers/oauth2/models.py:384 +#: authentik/providers/oauth2/models.py:385 msgid "OAuth2 Access Tokens" msgstr "" -#: authentik/providers/oauth2/models.py:394 +#: authentik/providers/oauth2/models.py:395 msgid "ID Token" msgstr "" -#: authentik/providers/oauth2/models.py:413 +#: authentik/providers/oauth2/models.py:414 msgid "OAuth2 Refresh Token" msgstr "" -#: authentik/providers/oauth2/models.py:414 +#: authentik/providers/oauth2/models.py:415 msgid "OAuth2 Refresh Tokens" msgstr "" -#: authentik/providers/oauth2/models.py:441 +#: authentik/providers/oauth2/models.py:442 msgid "Device Token" msgstr "" -#: authentik/providers/oauth2/models.py:442 +#: authentik/providers/oauth2/models.py:443 msgid "Device Tokens" msgstr "" -#: authentik/providers/oauth2/views/authorize.py:448 +#: authentik/providers/oauth2/views/authorize.py:489 #: authentik/providers/saml/views/flows.py:87 #, python-format msgid "Redirecting to %(app)s..." @@ -1476,59 +1527,59 @@ msgstr "" msgid "SAML Property Mappings" msgstr "" -#: authentik/providers/scim/models.py:20 +#: authentik/providers/scim/models.py:23 msgid "Base URL to SCIM requests, usually ends in /v2" msgstr "" -#: authentik/providers/scim/models.py:21 +#: authentik/providers/scim/models.py:24 msgid "Authentication token" msgstr "" -#: authentik/providers/scim/models.py:27 authentik/sources/ldap/models.py:98 +#: authentik/providers/scim/models.py:30 authentik/sources/ldap/models.py:98 msgid "Property mappings used for group creation/updating." msgstr "" -#: authentik/providers/scim/models.py:60 +#: authentik/providers/scim/models.py:72 msgid "SCIM Provider" msgstr "" -#: authentik/providers/scim/models.py:61 +#: authentik/providers/scim/models.py:73 msgid "SCIM Providers" msgstr "" -#: authentik/providers/scim/models.py:81 +#: authentik/providers/scim/models.py:93 msgid "SCIM Mapping" msgstr "" -#: authentik/providers/scim/models.py:82 +#: authentik/providers/scim/models.py:94 msgid "SCIM Mappings" msgstr "" -#: authentik/providers/scim/tasks.py:52 +#: authentik/providers/scim/tasks.py:56 msgid "Starting full SCIM sync" msgstr "" -#: authentik/providers/scim/tasks.py:59 +#: authentik/providers/scim/tasks.py:66 #, python-format msgid "Syncing page %(page)d of users" msgstr "" -#: authentik/providers/scim/tasks.py:63 +#: authentik/providers/scim/tasks.py:70 #, python-format msgid "Syncing page %(page)d of groups" msgstr "" -#: authentik/providers/scim/tasks.py:92 +#: authentik/providers/scim/tasks.py:102 #, python-format msgid "Failed to sync user %(user_name)s due to remote error: %(error)s" msgstr "" -#: authentik/providers/scim/tasks.py:103 authentik/providers/scim/tasks.py:144 +#: authentik/providers/scim/tasks.py:113 authentik/providers/scim/tasks.py:154 #, python-format msgid "Stopping sync due to error: %(error)s" msgstr "" -#: authentik/providers/scim/tasks.py:133 +#: authentik/providers/scim/tasks.py:143 #, python-format msgid "Failed to sync group %(group_name)s due to remote error: %(error)s" msgstr "" @@ -2054,7 +2105,7 @@ msgstr "" msgid "TOTP Devices" msgstr "" -#: authentik/stages/authenticator_validate/challenge.py:131 +#: authentik/stages/authenticator_validate/challenge.py:123 msgid "Invalid Token" msgstr "" @@ -2227,6 +2278,7 @@ msgid "Email Successfully sent." msgstr "" #: authentik/stages/email/templates/email/account_confirmation.html:10 +#: authentik/stages/email/templates/email/account_confirmation.txt:1 msgid "Welcome!" msgstr "" @@ -2249,6 +2301,12 @@ msgid "" " " msgstr "" +#: authentik/stages/email/templates/email/account_confirmation.txt:3 +msgid "" +"We're excited to have you get started. First, you need to confirm your " +"account. Just open the link below." +msgstr "" + #: authentik/stages/email/templates/email/event_notification.html:46 #, python-format msgid "" @@ -2258,6 +2316,25 @@ msgid "" " " msgstr "" +#: authentik/stages/email/templates/email/event_notification.txt:1 +msgid "Dear authentik user," +msgstr "" + +#: authentik/stages/email/templates/email/event_notification.txt:3 +msgid "The following notification was created:" +msgstr "" + +#: authentik/stages/email/templates/email/event_notification.txt:8 +msgid "Additional attributes:" +msgstr "" + +#: authentik/stages/email/templates/email/event_notification.txt:13 +#, python-format +msgid "" +"\n" +"This email was sent from the notification transport %(name)s.\n" +msgstr "" + #: authentik/stages/email/templates/email/password_reset.html:10 #, python-format msgid "" @@ -2283,6 +2360,26 @@ msgid "" " " msgstr "" +#: authentik/stages/email/templates/email/password_reset.txt:1 +#, python-format +msgid "Hi %(username)s," +msgstr "" + +#: authentik/stages/email/templates/email/password_reset.txt:3 +msgid "" +"\n" +"You recently requested to change your password for your authentik account. " +"Use the link below to set a new password.\n" +msgstr "" + +#: authentik/stages/email/templates/email/password_reset.txt:7 +#, python-format +msgid "" +"\n" +"If you did not request a password change, please ignore this Email. The link " +"above is valid for %(expires)s.\n" +msgstr "" + #: authentik/stages/email/templates/email/setup.html:9 msgid "authentik Test-Email" msgstr "" @@ -2295,6 +2392,13 @@ msgid "" " " msgstr "" +#: authentik/stages/email/templates/email/setup.txt:2 +msgid "" +"\n" +"This is a test email to inform you, that you've successfully configured " +"authentik emails.\n" +msgstr "" + #: authentik/stages/identification/api.py:20 msgid "When no user fields are selected, at least one source must be selected" msgstr "" @@ -2539,36 +2643,38 @@ msgstr "" msgid "No Pending User." msgstr "" -#: authentik/stages/user_login/models.py:19 -msgid "" -"Determines how long a session lasts. Default of 0 means that the sessions " -"lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)" +#: authentik/stages/user_login/models.py:47 +msgid "Bind sessions created by this stage to the configured network" msgstr "" -#: authentik/stages/user_login/models.py:25 +#: authentik/stages/user_login/models.py:52 +msgid "Bind sessions created by this stage to the configured GeoIP location" +msgstr "" + +#: authentik/stages/user_login/models.py:55 msgid "Terminate all other sessions of the user logging in." msgstr "" -#: authentik/stages/user_login/models.py:31 +#: authentik/stages/user_login/models.py:61 msgid "" "Offset the session will be extended by when the user picks the remember me " "option. Default of 0 means that the remember me option will not be shown. " "(Format: hours=-1;minutes=-2;seconds=-3)" msgstr "" -#: authentik/stages/user_login/models.py:54 +#: authentik/stages/user_login/models.py:84 msgid "User Login Stage" msgstr "" -#: authentik/stages/user_login/models.py:55 +#: authentik/stages/user_login/models.py:85 msgid "User Login Stages" msgstr "" -#: authentik/stages/user_login/stage.py:57 +#: authentik/stages/user_login/stage.py:85 msgid "No Pending user to login." msgstr "" -#: authentik/stages/user_login/stage.py:90 +#: authentik/stages/user_login/stage.py:112 msgid "Successfully logged in!" msgstr "" diff --git a/web/package-lock.json b/web/package-lock.json index 2f39418064..bee297b642 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -25,7 +25,6 @@ "@patternfly/elements": "^2.4.0", "@patternfly/patternfly": "^4.224.2", "@sentry/browser": "^7.93.0", - "@sentry/tracing": "^7.93.0", "@webcomponents/webcomponentsjs": "^2.8.0", "base64-js": "^1.5.1", "chart.js": "^4.4.1", @@ -4818,17 +4817,6 @@ "node": ">=12" } }, - "node_modules/@sentry/tracing": { - "version": "7.93.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.93.0.tgz", - "integrity": "sha512-n4XbAQ7e098Jzv4ZvpXAsFgM+XFfjhKci18r7s3UfDMnrB4FTCwhHZoeiygO8PZhB944mEFbNXNFhHkb8nTDbA==", - "dependencies": { - "@sentry-internal/tracing": "7.93.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@sentry/types": { "version": "7.93.0", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.93.0.tgz", diff --git a/web/package.json b/web/package.json index 50979f00ee..6e16966002 100644 --- a/web/package.json +++ b/web/package.json @@ -50,7 +50,6 @@ "@patternfly/elements": "^2.4.0", "@patternfly/patternfly": "^4.224.2", "@sentry/browser": "^7.93.0", - "@sentry/tracing": "^7.93.0", "@webcomponents/webcomponentsjs": "^2.8.0", "base64-js": "^1.5.1", "chart.js": "^4.4.1", diff --git a/web/src/admin/groups/GroupViewPage.ts b/web/src/admin/groups/GroupViewPage.ts index a2f7043636..cd95a14e35 100644 --- a/web/src/admin/groups/GroupViewPage.ts +++ b/web/src/admin/groups/GroupViewPage.ts @@ -117,8 +117,8 @@ export class GroupViewPage extends AKElement {
diff --git a/web/src/admin/stages/invitation/InvitationForm.ts b/web/src/admin/stages/invitation/InvitationForm.ts index 24b2c34cf7..bd1c8ff9f3 100644 --- a/web/src/admin/stages/invitation/InvitationForm.ts +++ b/web/src/admin/stages/invitation/InvitationForm.ts @@ -65,7 +65,7 @@ export class InvitationForm extends ModelForm { value="${dateTimeLocal(first(this.instance?.expires, new Date()))}" /> - + { ], release: `authentik@${VERSION}`, integrations: [ - new Integrations.BrowserTracing({ - tracingOrigins: [window.location.host, "localhost"], + new Sentry.BrowserTracing({ + shouldCreateSpanForRequest: (url: string) => { + return url.startsWith(window.location.host); + }, }), ], tracesSampleRate: cfg.errorReporting.tracesSampleRate, diff --git a/web/src/common/styles/theme-dark.css b/web/src/common/styles/theme-dark.css index b36ddc7356..764f66dd09 100644 --- a/web/src/common/styles/theme-dark.css +++ b/web/src/common/styles/theme-dark.css @@ -157,6 +157,10 @@ select[multiple] option:checked { .pf-c-switch__input:checked ~ .pf-c-switch__label { --pf-c-switch__input--checked__label--Color: var(--ak-dark-foreground); } +input[type="datetime-local"]::-webkit-calendar-picker-indicator, +input[type="date"]::-webkit-calendar-picker-indicator { + filter: invert(1); +} /* select toggle */ .pf-c-select__toggle::before { --pf-c-select__toggle--before--BorderTopColor: var(--ak-dark-background-lighter); diff --git a/web/src/elements/forms/SearchSelect/ak-search-select.ts b/web/src/elements/forms/SearchSelect/ak-search-select.ts index e710e487a6..67e362577d 100644 --- a/web/src/elements/forms/SearchSelect/ak-search-select.ts +++ b/web/src/elements/forms/SearchSelect/ak-search-select.ts @@ -1,12 +1,13 @@ +import { APIErrorTypes, parseAPIError } from "@goauthentik/app/common/errors"; import { PreventFormSubmit } from "@goauthentik/app/elements/forms/helpers"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import { ascii_letters, digits, groupBy, randomString } from "@goauthentik/common/utils"; import { AKElement } from "@goauthentik/elements/Base"; import { CustomEmitterElement } from "@goauthentik/elements/utils/eventEmitter"; -import { msg } from "@lit/localize"; +import { msg, str } from "@lit/localize"; import { TemplateResult, html, render } from "lit"; -import { customElement, property } from "lit/decorators.js"; +import { customElement, property, state } from "lit/decorators.js"; import { styleMap } from "lit/directives/style-map.js"; import PFDropdown from "@patternfly/patternfly/components/Dropdown/dropdown.css"; @@ -15,6 +16,8 @@ import PFFormControl from "@patternfly/patternfly/components/FormControl/form-co import PFSelect from "@patternfly/patternfly/components/Select/select.css"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; +import { ResponseError } from "@goauthentik/api"; + type Group = [string, T[]]; @customElement("ak-search-select") @@ -99,6 +102,9 @@ export class SearchSelect extends CustomEmitterElement(AKElement) { isFetchingData = false; + @state() + error?: APIErrorTypes; + static styles = [PFBase, PFForm, PFFormControl, PFSelect]; constructor() { @@ -139,15 +145,23 @@ export class SearchSelect extends CustomEmitterElement(AKElement) { return; } this.isFetchingData = true; - this.fetchObjects(this.query).then((objects) => { - objects.forEach((obj) => { - if (this.selected && this.selected(obj, objects || [])) { - this.selectedObject = obj; - } + this.fetchObjects(this.query) + .then((objects) => { + objects.forEach((obj) => { + if (this.selected && this.selected(obj, objects || [])) { + this.selectedObject = obj; + } + }); + this.objects = objects; + this.isFetchingData = false; + }) + .catch((exc: ResponseError) => { + this.isFetchingData = false; + this.objects = undefined; + parseAPIError(exc).then((err) => { + this.error = err; + }); }); - this.objects = objects; - this.isFetchingData = false; - }); } connectedCallback(): void { @@ -307,11 +321,19 @@ export class SearchSelect extends CustomEmitterElement(AKElement) { } get renderedValue() { - // prettier-ignore - return (!this.objects) ? msg("Loading...") - : (this.selectedObject) ? this.renderElement(this.selectedObject) - : (this.blankable) ? this.emptyOption - : ""; + if (this.error) { + return msg(str`Failed to fetch objects: ${this.error.detail}`); + } + if (!this.objects) { + return msg("Loading..."); + } + if (this.selectedObject) { + return this.renderElement(this.selectedObject); + } + if (this.blankable) { + return this.emptyOption; + } + return ""; } render(): TemplateResult { diff --git a/web/xliff/de.xlf b/web/xliff/de.xlf index 38b1af3893..ac4f7103d4 100644 --- a/web/xliff/de.xlf +++ b/web/xliff/de.xlf @@ -6255,6 +6255,9 @@ Bindings to groups/users are checked against the user of the event. Dutch + + + Failed to fetch objects: diff --git a/web/xliff/en.xlf b/web/xliff/en.xlf index a085ec4ab9..0b9a4359c6 100644 --- a/web/xliff/en.xlf +++ b/web/xliff/en.xlf @@ -6531,6 +6531,9 @@ Bindings to groups/users are checked against the user of the event. Dutch + + + Failed to fetch objects: diff --git a/web/xliff/es.xlf b/web/xliff/es.xlf index ac8a1c5393..15c6dca1de 100644 --- a/web/xliff/es.xlf +++ b/web/xliff/es.xlf @@ -6171,6 +6171,9 @@ Bindings to groups/users are checked against the user of the event. Dutch + + + Failed to fetch objects: diff --git a/web/xliff/fr.xlf b/web/xliff/fr.xlf index 9f11e1959c..6d33f5f7ce 100644 --- a/web/xliff/fr.xlf +++ b/web/xliff/fr.xlf @@ -1,4 +1,4 @@ - + @@ -613,9 +613,9 @@ Il y a jour(s) - The URL "" was not found. - L'URL " - " n'a pas été trouvée. + The URL "" was not found. + L'URL " + " n'a pas été trouvée. @@ -1057,8 +1057,8 @@ Il y a jour(s) - To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. - Pour permettre n'importe quelle URI de redirection, définissez cette valeur sur ".*". Soyez conscient des possibles implications de sécurité que cela peut avoir. + To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. + Pour permettre n'importe quelle URI de redirection, définissez cette valeur sur ".*". Soyez conscient des possibles implications de sécurité que cela peut avoir. @@ -1630,7 +1630,7 @@ Il y a jour(s) Token to authenticate with. Currently only bearer authentication is supported. - Jeton d'authentification à utiliser. Actuellement, seule l'authentification "bearer authentication" est prise en charge. + Jeton d'authentification à utiliser. Actuellement, seule l'authentification "bearer authentication" est prise en charge. @@ -1798,8 +1798,8 @@ Il y a jour(s) - Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". - Entrez une URL complète, un chemin relatif ou utilisez 'fa://fa-test' pour utiliser l'icône Font Awesome "fa-test". + Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". + Entrez une URL complète, un chemin relatif ou utilisez 'fa://fa-test' pour utiliser l'icône Font Awesome "fa-test". @@ -2892,7 +2892,7 @@ doesn't pass when either or both of the selected options are equal or above the To use SSL instead, use 'ldaps://' and disable this option. - Pour utiliser SSL à la base, utilisez "ldaps://" et désactviez cette option. + Pour utiliser SSL à la base, utilisez "ldaps://" et désactviez cette option. @@ -2981,8 +2981,8 @@ doesn't pass when either or both of the selected options are equal or above the - Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' - Champ qui contient les membres d'un groupe. Si vous utilisez le champ "memberUid", la valeur est censée contenir un nom distinctif relatif, par exemple 'memberUid=un-utilisateur' au lieu de 'memberUid=cn=un-utilisateur,ou=groups,...' + Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' + Champ qui contient les membres d'un groupe. Si vous utilisez le champ "memberUid", la valeur est censée contenir un nom distinctif relatif, par exemple 'memberUid=un-utilisateur' au lieu de 'memberUid=cn=un-utilisateur,ou=groups,...' @@ -3277,7 +3277,7 @@ doesn't pass when either or both of the selected options are equal or above the Time offset when temporary users should be deleted. This only applies if your IDP uses the NameID Format 'transient', and the user doesn't log out manually. - Moment où les utilisateurs temporaires doivent être supprimés. Cela ne s'applique que si votre IDP utilise le format NameID "transient" et que l'utilisateur ne se déconnecte pas manuellement. + Moment où les utilisateurs temporaires doivent être supprimés. Cela ne s'applique que si votre IDP utilise le format NameID "transient" et que l'utilisateur ne se déconnecte pas manuellement. @@ -3445,7 +3445,7 @@ doesn't pass when either or both of the selected options are equal or above the Optionally set the 'FriendlyName' value of the Assertion attribute. - Indiquer la valeur "FriendlyName" de l'attribut d'assertion (optionnel) + Indiquer la valeur "FriendlyName" de l'attribut d'assertion (optionnel) @@ -3774,8 +3774,8 @@ doesn't pass when either or both of the selected options are equal or above the - When using an external logging solution for archiving, this can be set to "minutes=5". - En cas d'utilisation d'une solution de journalisation externe pour l'archivage, cette valeur peut être fixée à "minutes=5". + When using an external logging solution for archiving, this can be set to "minutes=5". + En cas d'utilisation d'une solution de journalisation externe pour l'archivage, cette valeur peut être fixée à "minutes=5". @@ -3784,8 +3784,8 @@ doesn't pass when either or both of the selected options are equal or above the - Format: "weeks=3;days=2;hours=3,seconds=2". - Format : "weeks=3;days=2;hours=3,seconds=2". + Format: "weeks=3;days=2;hours=3,seconds=2". + Format : "weeks=3;days=2;hours=3,seconds=2". @@ -3981,10 +3981,10 @@ doesn't pass when either or both of the selected options are equal or above the - Are you sure you want to update ""? + Are you sure you want to update ""? Êtes-vous sûr de vouloir mettre à jour - " - " ? + " + " ? @@ -5070,8 +5070,8 @@ doesn't pass when either or both of the selected options are equal or above the - A "roaming" authenticator, like a YubiKey - Un authentificateur "itinérant", comme une YubiKey + A "roaming" authenticator, like a YubiKey + Un authentificateur "itinérant", comme une YubiKey @@ -5396,7 +5396,7 @@ doesn't pass when either or both of the selected options are equal or above the Show arbitrary input fields to the user, for example during enrollment. Data is saved in the flow context under the 'prompt_data' variable. - Afficher des champs de saisie arbitraires à l'utilisateur, par exemple pendant l'inscription. Les données sont enregistrées dans le contexte du flux sous la variable "prompt_data". + Afficher des champs de saisie arbitraires à l'utilisateur, par exemple pendant l'inscription. Les données sont enregistrées dans le contexte du flux sous la variable "prompt_data". @@ -5405,10 +5405,10 @@ doesn't pass when either or both of the selected options are equal or above the - ("", of type ) + ("", of type ) - (" - ", de type + (" + ", de type ) @@ -5457,8 +5457,8 @@ doesn't pass when either or both of the selected options are equal or above the - If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. - Si défini à une durée supérieure à 0, l'utilisateur aura la possibilité de choisir de "rester connecté", ce qui prolongera sa session jusqu'à la durée spécifiée ici. + If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. + Si défini à une durée supérieure à 0, l'utilisateur aura la possibilité de choisir de "rester connecté", ce qui prolongera sa session jusqu'à la durée spécifiée ici. @@ -6242,7 +6242,7 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti Can be in the format of 'unix://' when connecting to a local docker daemon, using 'ssh://' to connect via SSH, or 'https://:2376' when connecting to a remote system. - Peut être au format "unix://" pour une connexion à un service docker local, "ssh://" pour une connexion via SSH, ou "https://:2376" pour une connexion à un système distant. + Peut être au format "unix://" pour une connexion à un service docker local, "ssh://" pour une connexion via SSH, ou "https://:2376" pour une connexion à un système distant. @@ -7549,7 +7549,7 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti Use this provider with nginx's auth_request or traefik's forwardAuth. Each application/domain needs its own provider. Additionally, on each domain, /outpost.goauthentik.io must be routed to the outpost (when using a managed outpost, this is done for you). - Utilisez ce fournisseur avec l'option "auth_request" de Nginx ou "forwardAuth" de Traefik. Chaque application/domaine a besoin de son propre fournisseur. De plus, sur chaque domaine, "/outpost.goauthentik.io" doit être routé vers le poste avancé (lorsque vous utilisez un poste avancé géré, cela est fait pour vous). + Utilisez ce fournisseur avec l'option "auth_request" de Nginx ou "forwardAuth" de Traefik. Chaque application/domaine a besoin de son propre fournisseur. De plus, sur chaque domaine, "/outpost.goauthentik.io" doit être routé vers le poste avancé (lorsque vous utilisez un poste avancé géré, cela est fait pour vous). Default relay state @@ -7963,7 +7963,7 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti Utilisateur créé et ajouté au groupe avec succès - This user will be added to the group "". + This user will be added to the group "". Cet utilisateur sera ajouté au groupe "". @@ -8225,7 +8225,10 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti Dutch Néerlandais + + + Failed to fetch objects: - \ No newline at end of file + diff --git a/web/xliff/ko.xlf b/web/xliff/ko.xlf index 7330d9c274..6fdfb38cd4 100644 --- a/web/xliff/ko.xlf +++ b/web/xliff/ko.xlf @@ -8142,6 +8142,9 @@ Bindings to groups/users are checked against the user of the event. Select endpoint to connect to + + + Failed to fetch objects: diff --git a/web/xliff/nl.xlf b/web/xliff/nl.xlf index c2eade20f9..7d69331687 100644 --- a/web/xliff/nl.xlf +++ b/web/xliff/nl.xlf @@ -7981,6 +7981,9 @@ Bindingen naar groepen/gebruikers worden gecontroleerd tegen de gebruiker van de Select endpoint to connect to + + + Failed to fetch objects: diff --git a/web/xliff/pl.xlf b/web/xliff/pl.xlf index a222735d45..339a5f58f3 100644 --- a/web/xliff/pl.xlf +++ b/web/xliff/pl.xlf @@ -6379,6 +6379,9 @@ Bindings to groups/users are checked against the user of the event. Dutch + + + Failed to fetch objects: diff --git a/web/xliff/pseudo-LOCALE.xlf b/web/xliff/pseudo-LOCALE.xlf index 7de534b8b7..ddca0dd6d7 100644 --- a/web/xliff/pseudo-LOCALE.xlf +++ b/web/xliff/pseudo-LOCALE.xlf @@ -8117,4 +8117,7 @@ Bindings to groups/users are checked against the user of the event. Dutch + + Failed to fetch objects: + diff --git a/web/xliff/tr.xlf b/web/xliff/tr.xlf index 9a706a47cd..2e68acc40c 100644 --- a/web/xliff/tr.xlf +++ b/web/xliff/tr.xlf @@ -6164,6 +6164,9 @@ Bindings to groups/users are checked against the user of the event. Dutch + + + Failed to fetch objects: diff --git a/web/xliff/zh-CN.xlf b/web/xliff/zh-CN.xlf index fe8df6e0f0..afe78b4bd9 100644 --- a/web/xliff/zh-CN.xlf +++ b/web/xliff/zh-CN.xlf @@ -5063,6 +5063,9 @@ Bindings to groups/users are checked against the user of the event. Connected services + + Failed to fetch objects: + diff --git a/web/xliff/zh-Hans.xlf b/web/xliff/zh-Hans.xlf index 69e5dc31d9..502ba23a7b 100644 --- a/web/xliff/zh-Hans.xlf +++ b/web/xliff/zh-Hans.xlf @@ -1,4 +1,4 @@ - + @@ -613,9 +613,9 @@ - The URL "" was not found. - 未找到 URL " - "。 + The URL "" was not found. + 未找到 URL " + "。 @@ -1057,8 +1057,8 @@ - To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. - 要允许任何重定向 URI,请将此值设置为 ".*"。请注意这可能带来的安全影响。 + To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. + 要允许任何重定向 URI,请将此值设置为 ".*"。请注意这可能带来的安全影响。 @@ -1799,8 +1799,8 @@ - Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". - 输入完整 URL、相对路径,或者使用 'fa://fa-test' 来使用 Font Awesome 图标 "fa-test"。 + Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". + 输入完整 URL、相对路径,或者使用 'fa://fa-test' 来使用 Font Awesome 图标 "fa-test"。 @@ -2983,8 +2983,8 @@ doesn't pass when either or both of the selected options are equal or above the - Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' - 包含组成员的字段。请注意,如果使用 "memberUid" 字段,则假定该值包含相对可分辨名称。例如,'memberUid=some-user' 而不是 'memberUid=cn=some-user,ou=groups,...' + Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' + 包含组成员的字段。请注意,如果使用 "memberUid" 字段,则假定该值包含相对可分辨名称。例如,'memberUid=some-user' 而不是 'memberUid=cn=some-user,ou=groups,...' @@ -3776,8 +3776,8 @@ doesn't pass when either or both of the selected options are equal or above the - When using an external logging solution for archiving, this can be set to "minutes=5". - 使用外部日志记录解决方案进行存档时,可以将其设置为 "minutes=5"。 + When using an external logging solution for archiving, this can be set to "minutes=5". + 使用外部日志记录解决方案进行存档时,可以将其设置为 "minutes=5"。 @@ -3786,8 +3786,8 @@ doesn't pass when either or both of the selected options are equal or above the - Format: "weeks=3;days=2;hours=3,seconds=2". - 格式:"weeks=3;days=2;hours=3,seconds=2"。 + Format: "weeks=3;days=2;hours=3,seconds=2". + 格式:"weeks=3;days=2;hours=3,seconds=2"。 @@ -3983,10 +3983,10 @@ doesn't pass when either or both of the selected options are equal or above the - Are you sure you want to update ""? + Are you sure you want to update ""? 您确定要更新 - " - " 吗? + " + " 吗? @@ -5072,7 +5072,7 @@ doesn't pass when either or both of the selected options are equal or above the - A "roaming" authenticator, like a YubiKey + A "roaming" authenticator, like a YubiKey 像 YubiKey 这样的“漫游”身份验证器 @@ -5407,10 +5407,10 @@ doesn't pass when either or both of the selected options are equal or above the - ("", of type ) + ("", of type ) - (" - ",类型为 + (" + ",类型为 @@ -5459,7 +5459,7 @@ doesn't pass when either or both of the selected options are equal or above the - If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. + If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. 如果设置时长大于 0,用户可以选择“保持登录”选项,这将使用户的会话延长此处设置的时间。 @@ -7965,7 +7965,7 @@ Bindings to groups/users are checked against the user of the event. 成功创建用户并添加到组 - This user will be added to the group "". + This user will be added to the group "". 此用户将会被添加到组 ""。 @@ -8227,7 +8227,10 @@ Bindings to groups/users are checked against the user of the event. Dutch 荷兰语 + + + Failed to fetch objects: - \ No newline at end of file + diff --git a/web/xliff/zh-Hant.xlf b/web/xliff/zh-Hant.xlf index 191369798d..b47c8a5530 100644 --- a/web/xliff/zh-Hant.xlf +++ b/web/xliff/zh-Hant.xlf @@ -6212,6 +6212,9 @@ Bindings to groups/users are checked against the user of the event. Dutch + + + Failed to fetch objects: diff --git a/web/xliff/zh_TW.xlf b/web/xliff/zh_TW.xlf index 95810f4b79..5efcbe9721 100644 --- a/web/xliff/zh_TW.xlf +++ b/web/xliff/zh_TW.xlf @@ -8101,6 +8101,9 @@ Bindings to groups/users are checked against the user of the event. Dutch + + + Failed to fetch objects: