From fd1d38f8444e4ad840e31d4ee0d643ee24fe7fb8 Mon Sep 17 00:00:00 2001 From: Jens L Date: Tue, 10 May 2022 21:05:22 +0200 Subject: [PATCH] stages/authenticator_validate: remember (#2828) * initial Signed-off-by: Jens Langhammer * web: cleanup timedelta help Signed-off-by: Jens Langhammer * add tooltip Signed-off-by: Jens Langhammer * add tests Signed-off-by: Jens Langhammer * assert response code in self.assertStageResponse Signed-off-by: Jens Langhammer * add more tests, add duo Signed-off-by: Jens Langhammer * add docs Signed-off-by: Jens Langhammer * fix Signed-off-by: Jens Langhammer --- Makefile | 30 +- authentik/flows/exceptions.py | 4 + authentik/flows/tests/__init__.py | 1 + authentik/flows/tests/test_executor.py | 4 - .../policies/password/tests/test_flows.py | 1 - .../migrations/0003_duodevice_last_t.py | 18 + authentik/stages/authenticator_duo/models.py | 2 + authentik/stages/authenticator_duo/stage.py | 7 +- .../migrations/0003_smsdevice_last_used_on.py | 18 + authentik/stages/authenticator_sms/models.py | 8 + .../stages/authenticator_validate/api.py | 1 + .../authenticator_validate/challenge.py | 1 + ...icatorvalidatestage_last_auth_threshold.py | 27 + .../stages/authenticator_validate/models.py | 12 + .../stages/authenticator_validate/stage.py | 33 +- .../authenticator_validate/tests/__init__.py | 0 .../authenticator_validate/tests/test_duo.py | 56 + .../authenticator_validate/tests/test_sms.py | 106 ++ .../{tests.py => tests/test_stage.py} | 93 +- .../authenticator_validate/tests/test_totp.py | 114 ++ .../tests/test_webauthn.py | 134 ++ ...name_last_used_on_webauthndevice_last_t.py | 21 + .../stages/authenticator_webauthn/models.py | 6 +- authentik/stages/deny/tests.py | 2 - authentik/stages/identification/tests.py | 4 - authentik/stages/invitation/tests.py | 1 - authentik/stages/password/tests.py | 2 - authentik/stages/user_delete/tests.py | 1 - authentik/stages/user_login/tests.py | 1 - authentik/stages/user_write/tests.py | 3 - schema.yml | 14 + web/src/elements/Tooltip.ts | 54 + web/src/elements/utils/TimeDeltaHelp.ts | 45 + web/src/locales/de.po | 55 +- web/src/locales/en.po | 241 +-- web/src/locales/es.po | 55 +- web/src/locales/fr_FR.po | 123 +- web/src/locales/pl.po | 55 +- web/src/locales/pseudo-LOCALE.po | 233 +-- web/src/locales/tr.po | 55 +- web/src/locales/zh-Hans.po | 1464 ++++++++--------- web/src/locales/zh-Hant.po | 55 +- web/src/locales/zh_TW.po | 55 +- .../providers/oauth2/OAuth2ProviderForm.ts | 9 +- .../providers/proxy/ProxyProviderForm.ts | 5 +- .../pages/providers/saml/SAMLProviderForm.ts | 11 +- web/src/pages/sources/saml/SAMLSourceForm.ts | 4 +- .../AuthenticatorValidateStageForm.ts | 17 + .../pages/stages/consent/ConsentStageForm.ts | 4 +- .../stages/user_login/UserLoginStageForm.ts | 5 +- .../stages/authenticator_validate/index.md | 3 + 51 files changed, 2006 insertions(+), 1267 deletions(-) create mode 100644 authentik/stages/authenticator_duo/migrations/0003_duodevice_last_t.py create mode 100644 authentik/stages/authenticator_sms/migrations/0003_smsdevice_last_used_on.py create mode 100644 authentik/stages/authenticator_validate/migrations/0011_authenticatorvalidatestage_last_auth_threshold.py create mode 100644 authentik/stages/authenticator_validate/tests/__init__.py create mode 100644 authentik/stages/authenticator_validate/tests/test_duo.py create mode 100644 authentik/stages/authenticator_validate/tests/test_sms.py rename authentik/stages/authenticator_validate/{tests.py => tests/test_stage.py} (55%) create mode 100644 authentik/stages/authenticator_validate/tests/test_totp.py create mode 100644 authentik/stages/authenticator_validate/tests/test_webauthn.py create mode 100644 authentik/stages/authenticator_webauthn/migrations/0007_rename_last_used_on_webauthndevice_last_t.py create mode 100644 web/src/elements/Tooltip.ts create mode 100644 web/src/elements/utils/TimeDeltaHelp.ts diff --git a/Makefile b/Makefile index cc21427e6..5eae011a5 100644 --- a/Makefile +++ b/Makefile @@ -99,11 +99,18 @@ migrate: run: go run -v cmd/server/main.go -web-watch: - cd web && npm run watch +######################### +## Web +######################### web: web-lint-fix web-lint web-extract +web-install: + cd web && npm ci + +web-watch: + cd web && npm run watch + web-lint-fix: cd web && npm run prettier @@ -114,6 +121,21 @@ web-lint: web-extract: cd web && npm run extract +######################### +## Website +######################### + +website: website-lint-fix + +website-install: + cd website && npm ci + +website-lint-fix: + cd website && npm run prettier + +website-watch: + cd website && npm run watch + # These targets are use by GitHub actions to allow usage of matrix # which makes the YAML File a lot smaller @@ -139,10 +161,8 @@ ci-pyright: ci--meta-debug ci-pending-migrations: ci--meta-debug ./manage.py makemigrations --check -install: +install: web-install website-install poetry install - cd web && npm ci - cd website && npm ci a: install tmux \ diff --git a/authentik/flows/exceptions.py b/authentik/flows/exceptions.py index 2f74479be..ddb8b4412 100644 --- a/authentik/flows/exceptions.py +++ b/authentik/flows/exceptions.py @@ -12,3 +12,7 @@ class FlowNonApplicableException(SentryIgnoredException): class EmptyFlowException(SentryIgnoredException): """Flow has no stages.""" + + +class FlowSkipStageException(SentryIgnoredException): + """Exception to skip a stage""" diff --git a/authentik/flows/tests/__init__.py b/authentik/flows/tests/__init__.py index da21f8e88..bd7d8dc88 100644 --- a/authentik/flows/tests/__init__.py +++ b/authentik/flows/tests/__init__.py @@ -23,6 +23,7 @@ class FlowTestCase(APITestCase): **kwargs, ) -> dict[str, Any]: """Assert various attributes of a stage response""" + self.assertEqual(response.status_code, 200) raw_response = loads(response.content.decode()) self.assertIsNotNone(raw_response["component"]) self.assertIsNotNone(raw_response["type"]) diff --git a/authentik/flows/tests/test_executor.py b/authentik/flows/tests/test_executor.py index 01017819e..1a017812c 100644 --- a/authentik/flows/tests/test_executor.py +++ b/authentik/flows/tests/test_executor.py @@ -87,7 +87,6 @@ class TestFlowExecutor(FlowTestCase): response = self.client.get( reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, flow=flow, @@ -406,7 +405,6 @@ class TestFlowExecutor(FlowTestCase): # A get request will evaluate the policies and this will return stage 4 # but it won't save it, hence we can't check the plan response = self.client.get(exec_url) - self.assertEqual(response.status_code, 200) self.assertStageResponse(response, flow, component="ak-stage-dummy") # fourth request, this confirms the last stage (dummy4) @@ -479,7 +477,6 @@ class TestFlowExecutor(FlowTestCase): exec_url = reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}) # First request, run the planner response = self.client.get(exec_url) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, flow, @@ -491,5 +488,4 @@ class TestFlowExecutor(FlowTestCase): user_fields=[UserFields.E_MAIL], ) response = self.client.post(exec_url, {"uid_field": "invalid-string"}, follow=True) - self.assertEqual(response.status_code, 200) self.assertStageResponse(response, flow, component="ak-stage-access-denied") diff --git a/authentik/policies/password/tests/test_flows.py b/authentik/policies/password/tests/test_flows.py index 58b6c8d9c..f5409eb12 100644 --- a/authentik/policies/password/tests/test_flows.py +++ b/authentik/policies/password/tests/test_flows.py @@ -50,7 +50,6 @@ class TestPasswordPolicyFlow(FlowTestCase): reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}), {"password": "akadmin"}, ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, self.flow, diff --git a/authentik/stages/authenticator_duo/migrations/0003_duodevice_last_t.py b/authentik/stages/authenticator_duo/migrations/0003_duodevice_last_t.py new file mode 100644 index 000000000..c00727629 --- /dev/null +++ b/authentik/stages/authenticator_duo/migrations/0003_duodevice_last_t.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.4 on 2022-05-10 17:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("authentik_stages_authenticator_duo", "0002_default_setup_flow"), + ] + + operations = [ + migrations.AddField( + model_name="duodevice", + name="last_t", + field=models.DateTimeField(auto_now=True), + ), + ] diff --git a/authentik/stages/authenticator_duo/models.py b/authentik/stages/authenticator_duo/models.py index 1bbdc632b..6a4aaf7aa 100644 --- a/authentik/stages/authenticator_duo/models.py +++ b/authentik/stages/authenticator_duo/models.py @@ -74,6 +74,8 @@ class DuoDevice(Device): stage = models.ForeignKey(AuthenticatorDuoStage, on_delete=models.CASCADE) duo_user_id = models.TextField() + last_t = models.DateTimeField(auto_now=True) + def __str__(self): return self.name or str(self.user) diff --git a/authentik/stages/authenticator_duo/stage.py b/authentik/stages/authenticator_duo/stage.py index a3a66eae2..a0f890e03 100644 --- a/authentik/stages/authenticator_duo/stage.py +++ b/authentik/stages/authenticator_duo/stage.py @@ -1,5 +1,6 @@ """Duo stage""" from django.http import HttpRequest, HttpResponse +from django.utils.timezone import now from rest_framework.fields import CharField from structlog.stdlib import get_logger @@ -85,7 +86,11 @@ class AuthenticatorDuoStageView(ChallengeStageView): self.request.session.pop(SESSION_KEY_DUO_ACTIVATION_CODE) if not existing_device: DuoDevice.objects.create( - name="Duo Device", user=self.get_pending_user(), duo_user_id=user_id, stage=stage + name="Duo Device", + user=self.get_pending_user(), + duo_user_id=user_id, + stage=stage, + last_t=now(), ) else: return self.executor.stage_invalid("Device with Credential ID already exists.") diff --git a/authentik/stages/authenticator_sms/migrations/0003_smsdevice_last_used_on.py b/authentik/stages/authenticator_sms/migrations/0003_smsdevice_last_used_on.py new file mode 100644 index 000000000..6f94823af --- /dev/null +++ b/authentik/stages/authenticator_sms/migrations/0003_smsdevice_last_used_on.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.4 on 2022-04-14 20:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("authentik_stages_authenticator_sms", "0002_alter_authenticatorsmsstage_from_number"), + ] + + operations = [ + migrations.AddField( + model_name="smsdevice", + name="last_t", + field=models.DateTimeField(auto_now=True), + ), + ] diff --git a/authentik/stages/authenticator_sms/models.py b/authentik/stages/authenticator_sms/models.py index 40e329490..dceb4e4cd 100644 --- a/authentik/stages/authenticator_sms/models.py +++ b/authentik/stages/authenticator_sms/models.py @@ -168,6 +168,14 @@ class SMSDevice(SideChannelDevice): phone_number = models.TextField() + last_t = models.DateTimeField(auto_now=True) + + def verify_token(self, token): + valid = super().verify_token(token) + if valid: + self.save() + return valid + def __str__(self): return self.name or str(self.user) diff --git a/authentik/stages/authenticator_validate/api.py b/authentik/stages/authenticator_validate/api.py index 20c016726..d0de49bb1 100644 --- a/authentik/stages/authenticator_validate/api.py +++ b/authentik/stages/authenticator_validate/api.py @@ -30,6 +30,7 @@ class AuthenticatorValidateStageSerializer(StageSerializer): "not_configured_action", "device_classes", "configuration_stages", + "last_auth_threshold", ] diff --git a/authentik/stages/authenticator_validate/challenge.py b/authentik/stages/authenticator_validate/challenge.py index e7d53c92d..6043ea143 100644 --- a/authentik/stages/authenticator_validate/challenge.py +++ b/authentik/stages/authenticator_validate/challenge.py @@ -147,4 +147,5 @@ def validate_challenge_duo(device_pk: int, request: HttpRequest, user: User) -> # {'result': 'allow', 'status': 'allow', 'status_msg': 'Success. Logging you in...'} if response["result"] == "deny": raise ValidationError("Duo denied access") + device.save() return device_pk diff --git a/authentik/stages/authenticator_validate/migrations/0011_authenticatorvalidatestage_last_auth_threshold.py b/authentik/stages/authenticator_validate/migrations/0011_authenticatorvalidatestage_last_auth_threshold.py new file mode 100644 index 000000000..4e10ea534 --- /dev/null +++ b/authentik/stages/authenticator_validate/migrations/0011_authenticatorvalidatestage_last_auth_threshold.py @@ -0,0 +1,27 @@ +# Generated by Django 4.0.4 on 2022-04-14 20:54 + +from django.db import migrations, models + +import authentik.lib.utils.time + + +class Migration(migrations.Migration): + + dependencies = [ + ( + "authentik_stages_authenticator_validate", + "0010_remove_authenticatorvalidatestage_configuration_stage_and_more", + ), + ] + + operations = [ + migrations.AddField( + model_name="authenticatorvalidatestage", + name="last_auth_threshold", + field=models.TextField( + default="seconds=0", + help_text="If any of the user's device has been used within this threshold, this stage will be skipped", + validators=[authentik.lib.utils.time.timedelta_string_validator], + ), + ), + ] diff --git a/authentik/stages/authenticator_validate/models.py b/authentik/stages/authenticator_validate/models.py index 4f21b20d1..fbe51c47e 100644 --- a/authentik/stages/authenticator_validate/models.py +++ b/authentik/stages/authenticator_validate/models.py @@ -7,6 +7,7 @@ from django.views import View from rest_framework.serializers import BaseSerializer from authentik.flows.models import NotConfiguredAction, Stage +from authentik.lib.utils.time import timedelta_string_validator class DeviceClasses(models.TextChoices): @@ -57,6 +58,17 @@ class AuthenticatorValidateStage(Stage): default=default_device_classes, ) + last_auth_threshold = models.TextField( + default="seconds=0", + validators=[timedelta_string_validator], + help_text=_( + ( + "If any of the user's device has been used within this threshold, this " + "stage will be skipped" + ) + ), + ) + @property def serializer(self) -> BaseSerializer: from authentik.stages.authenticator_validate.api import AuthenticatorValidateStageSerializer diff --git a/authentik/stages/authenticator_validate/stage.py b/authentik/stages/authenticator_validate/stage.py index 2308fcbb0..2e9f43b35 100644 --- a/authentik/stages/authenticator_validate/stage.py +++ b/authentik/stages/authenticator_validate/stage.py @@ -1,6 +1,10 @@ """Authenticator Validation""" +from datetime import timezone + from django.http import HttpRequest, HttpResponse +from django.utils.timezone import datetime, now from django_otp import devices_for_user +from django_otp.models import Device from rest_framework.fields import CharField, IntegerField, JSONField, ListField, UUIDField from rest_framework.serializers import ValidationError from structlog.stdlib import get_logger @@ -10,9 +14,11 @@ from authentik.core.models import User from authentik.events.models import Event, EventAction from authentik.events.utils import cleanse_dict, sanitize_dict from authentik.flows.challenge import ChallengeResponse, ChallengeTypes, WithUserInfoChallenge +from authentik.flows.exceptions import FlowSkipStageException from authentik.flows.models import FlowDesignation, NotConfiguredAction, Stage from authentik.flows.planner import PLAN_CONTEXT_PENDING_USER from authentik.flows.stage import ChallengeStageView +from authentik.lib.utils.time import timedelta_from_string from authentik.stages.authenticator_sms.models import SMSDevice from authentik.stages.authenticator_validate.challenge import ( DeviceChallenge, @@ -121,6 +127,15 @@ class AuthenticatorValidationChallengeResponse(ChallengeResponse): return attrs +def get_device_last_usage(device: Device) -> datetime: + """Get a datetime object from last_t""" + if not hasattr(device, "last_t"): + return datetime.fromtimestamp(0, tz=timezone.utc) + if isinstance(device.last_t, datetime): + return device.last_t + return datetime.fromtimestamp(device.last_t * device.step, tz=timezone.utc) + + class AuthenticatorValidateStageView(ChallengeStageView): """Authenticator Validation""" @@ -139,6 +154,9 @@ class AuthenticatorValidateStageView(ChallengeStageView): stage: AuthenticatorValidateStage = self.executor.current_stage + _now = now() + threshold = timedelta_from_string(stage.last_auth_threshold) + for device in user_devices: device_class = device.__class__.__name__.lower().replace("device", "") if device_class not in stage.device_classes: @@ -148,6 +166,16 @@ class AuthenticatorValidateStageView(ChallengeStageView): # WebAuthn does another device loop to find all webuahtn devices if device_class in seen_classes: continue + # check if device has been used within threshold and skip this stage if so + if threshold.total_seconds() > 0: + print("yeet") + print(get_device_last_usage(device)) + print(_now - get_device_last_usage(device)) + print(threshold) + print(_now - get_device_last_usage(device) <= threshold) + if _now - get_device_last_usage(device) <= threshold: + LOGGER.info("Device has been used within threshold", device=device) + raise FlowSkipStageException() if device_class not in seen_classes: seen_classes.append(device_class) challenge = DeviceChallenge( @@ -181,7 +209,10 @@ class AuthenticatorValidateStageView(ChallengeStageView): user = self.get_pending_user() stage: AuthenticatorValidateStage = self.executor.current_stage if user and not user.is_anonymous: - challenges = self.get_device_challenges() + try: + challenges = self.get_device_challenges() + except FlowSkipStageException: + return self.executor.stage_ok() else: if self.executor.flow.designation != FlowDesignation.AUTHENTICATION: LOGGER.debug("Refusing passwordless flow in non-authentication flow") diff --git a/authentik/stages/authenticator_validate/tests/__init__.py b/authentik/stages/authenticator_validate/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/authentik/stages/authenticator_validate/tests/test_duo.py b/authentik/stages/authenticator_validate/tests/test_duo.py new file mode 100644 index 000000000..ce76469af --- /dev/null +++ b/authentik/stages/authenticator_validate/tests/test_duo.py @@ -0,0 +1,56 @@ +"""Test validator stage""" +from unittest.mock import MagicMock, patch + +from django.test.client import RequestFactory +from rest_framework.exceptions import ValidationError + +from authentik.core.tests.utils import create_test_admin_user +from authentik.flows.tests import FlowTestCase +from authentik.lib.generators import generate_id, generate_key +from authentik.stages.authenticator_duo.models import AuthenticatorDuoStage, DuoDevice +from authentik.stages.authenticator_validate.challenge import validate_challenge_duo + + +class AuthenticatorValidateStageDuoTests(FlowTestCase): + """Test validator stage""" + + def setUp(self) -> None: + self.user = create_test_admin_user() + self.request_factory = RequestFactory() + + def test_device_challenge_duo(self): + """Test duo""" + request = self.request_factory.get("/") + stage = AuthenticatorDuoStage.objects.create( + name="test", + client_id=generate_id(), + client_secret=generate_key(), + api_hostname="", + ) + duo_device = DuoDevice.objects.create( + user=self.user, + stage=stage, + ) + duo_mock = MagicMock( + auth=MagicMock( + return_value={ + "result": "allow", + "status": "allow", + "status_msg": "Success. Logging you in...", + } + ) + ) + failed_duo_mock = MagicMock(auth=MagicMock(return_value={"result": "deny"})) + with patch( + "authentik.stages.authenticator_duo.models.AuthenticatorDuoStage.client", + duo_mock, + ): + self.assertEqual( + duo_device.pk, validate_challenge_duo(duo_device.pk, request, self.user) + ) + with patch( + "authentik.stages.authenticator_duo.models.AuthenticatorDuoStage.client", + failed_duo_mock, + ): + with self.assertRaises(ValidationError): + validate_challenge_duo(duo_device.pk, request, self.user) diff --git a/authentik/stages/authenticator_validate/tests/test_sms.py b/authentik/stages/authenticator_validate/tests/test_sms.py new file mode 100644 index 000000000..f68a5d171 --- /dev/null +++ b/authentik/stages/authenticator_validate/tests/test_sms.py @@ -0,0 +1,106 @@ +"""Test validator stage""" +from time import sleep + +from django.test.client import RequestFactory +from django.urls.base import reverse + +from authentik.core.tests.utils import create_test_admin_user +from authentik.flows.models import Flow, FlowStageBinding, NotConfiguredAction +from authentik.flows.tests import FlowTestCase +from authentik.stages.authenticator_sms.models import AuthenticatorSMSStage, SMSDevice, SMSProviders +from authentik.stages.authenticator_validate.models import AuthenticatorValidateStage, DeviceClasses +from authentik.stages.identification.models import IdentificationStage, UserFields + + +class AuthenticatorValidateStageSMSTests(FlowTestCase): + """Test validator stage""" + + def setUp(self) -> None: + self.user = create_test_admin_user() + self.request_factory = RequestFactory() + self.stage = AuthenticatorSMSStage.objects.create( + name="sms", + provider=SMSProviders.GENERIC, + from_number="1234", + ) + + def test_last_auth_threshold(self): + """Test last_auth_threshold""" + conf_stage = IdentificationStage.objects.create( + name="conf", + user_fields=[ + UserFields.USERNAME, + ], + ) + device: SMSDevice = SMSDevice.objects.create( + user=self.user, + confirmed=True, + stage=self.stage, + ) + # Verify token once here to set last_t etc + token = device.generate_token() + device.verify_token(token) + stage = AuthenticatorValidateStage.objects.create( + name="foo", + last_auth_threshold="milliseconds=0", + not_configured_action=NotConfiguredAction.CONFIGURE, + device_classes=[DeviceClasses.SMS], + ) + sleep(1) + stage.configuration_stages.set([conf_stage]) + flow = Flow.objects.create(name="test", slug="test", title="test") + FlowStageBinding.objects.create(target=flow, stage=conf_stage, order=0) + FlowStageBinding.objects.create(target=flow, stage=stage, order=1) + + response = self.client.post( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + {"uid_field": self.user.username}, + ) + self.assertEqual(response.status_code, 302) + response = self.client.get( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + follow=True, + ) + self.assertStageResponse( + response, + flow, + component="ak-stage-authenticator-validate", + ) + + def test_last_auth_threshold_valid(self): + """Test last_auth_threshold""" + conf_stage = IdentificationStage.objects.create( + name="conf", + user_fields=[ + UserFields.USERNAME, + ], + ) + device: SMSDevice = SMSDevice.objects.create( + user=self.user, + confirmed=True, + stage=self.stage, + ) + # Verify token once here to set last_t etc + token = device.generate_token() + device.verify_token(token) + stage = AuthenticatorValidateStage.objects.create( + name="foo", + last_auth_threshold="hours=1", + not_configured_action=NotConfiguredAction.CONFIGURE, + device_classes=[DeviceClasses.SMS], + ) + stage.configuration_stages.set([conf_stage]) + flow = Flow.objects.create(name="test", slug="test", title="test") + FlowStageBinding.objects.create(target=flow, stage=conf_stage, order=0) + FlowStageBinding.objects.create(target=flow, stage=stage, order=1) + + response = self.client.post( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + {"uid_field": self.user.username}, + ) + self.assertEqual(response.status_code, 302) + response = self.client.get( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + follow=True, + ) + self.assertStageResponse(response, component="xak-flow-redirect", to="/") diff --git a/authentik/stages/authenticator_validate/tests.py b/authentik/stages/authenticator_validate/tests/test_stage.py similarity index 55% rename from authentik/stages/authenticator_validate/tests.py rename to authentik/stages/authenticator_validate/tests/test_stage.py index 6621eff96..88b9068b9 100644 --- a/authentik/stages/authenticator_validate/tests.py +++ b/authentik/stages/authenticator_validate/tests/test_stage.py @@ -1,34 +1,21 @@ """Test validator stage""" -from unittest.mock import MagicMock, patch - from django.contrib.sessions.middleware import SessionMiddleware from django.test.client import RequestFactory from django.urls.base import reverse -from django_otp.plugins.otp_totp.models import TOTPDevice from rest_framework.exceptions import ValidationError -from webauthn.helpers import bytes_to_base64url from authentik.core.tests.utils import create_test_admin_user from authentik.flows.models import Flow, FlowStageBinding, NotConfiguredAction from authentik.flows.stage import StageView from authentik.flows.tests import FlowTestCase from authentik.flows.views.executor import FlowExecutorView -from authentik.lib.generators import generate_id, generate_key -from authentik.lib.tests.utils import dummy_get_response, get_request -from authentik.stages.authenticator_duo.models import AuthenticatorDuoStage, DuoDevice +from authentik.lib.tests.utils import dummy_get_response from authentik.stages.authenticator_validate.api import AuthenticatorValidateStageSerializer -from authentik.stages.authenticator_validate.challenge import ( - get_challenge_for_device, - validate_challenge_code, - validate_challenge_duo, - validate_challenge_webauthn, -) from authentik.stages.authenticator_validate.models import AuthenticatorValidateStage from authentik.stages.authenticator_validate.stage import ( SESSION_DEVICE_CHALLENGES, AuthenticatorValidationChallengeResponse, ) -from authentik.stages.authenticator_webauthn.models import WebAuthnDevice from authentik.stages.identification.models import IdentificationStage, UserFields @@ -65,7 +52,6 @@ class AuthenticatorValidateStageTests(FlowTestCase): reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), follow=True, ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, flow, @@ -90,83 +76,6 @@ class AuthenticatorValidateStageTests(FlowTestCase): ) self.assertTrue(serializer.is_valid()) - def test_device_challenge_totp(self): - """Test device challenge""" - request = self.request_factory.get("/") - totp_device = TOTPDevice.objects.create(user=self.user, confirmed=True, digits=6) - self.assertEqual(get_challenge_for_device(request, totp_device), {}) - with self.assertRaises(ValidationError): - validate_challenge_code("1234", request, self.user) - - def test_device_challenge_webauthn(self): - """Test webauthn""" - request = get_request("/") - request.user = self.user - - webauthn_device = WebAuthnDevice.objects.create( - user=self.user, - public_key=bytes_to_base64url(b"qwerqwerqre"), - credential_id=bytes_to_base64url(b"foobarbaz"), - sign_count=0, - rp_id="foo", - ) - challenge = get_challenge_for_device(request, webauthn_device) - del challenge["challenge"] - self.assertEqual( - challenge, - { - "allowCredentials": [ - { - "id": "Zm9vYmFyYmF6", - "type": "public-key", - } - ], - "rpId": "testserver", - "timeout": 60000, - "userVerification": "preferred", - }, - ) - - with self.assertRaises(ValidationError): - validate_challenge_webauthn({}, request, self.user) - - def test_device_challenge_duo(self): - """Test duo""" - request = self.request_factory.get("/") - stage = AuthenticatorDuoStage.objects.create( - name="test", - client_id=generate_id(), - client_secret=generate_key(), - api_hostname="", - ) - duo_device = DuoDevice.objects.create( - user=self.user, - stage=stage, - ) - duo_mock = MagicMock( - auth=MagicMock( - return_value={ - "result": "allow", - "status": "allow", - "status_msg": "Success. Logging you in...", - } - ) - ) - failed_duo_mock = MagicMock(auth=MagicMock(return_value={"result": "deny"})) - with patch( - "authentik.stages.authenticator_duo.models.AuthenticatorDuoStage.client", - duo_mock, - ): - self.assertEqual( - duo_device.pk, validate_challenge_duo(duo_device.pk, request, self.user) - ) - with patch( - "authentik.stages.authenticator_duo.models.AuthenticatorDuoStage.client", - failed_duo_mock, - ): - with self.assertRaises(ValidationError): - validate_challenge_duo(duo_device.pk, request, self.user) - def test_validate_selected_challenge(self): """Test validate_selected_challenge""" # Prepare request with session diff --git a/authentik/stages/authenticator_validate/tests/test_totp.py b/authentik/stages/authenticator_validate/tests/test_totp.py new file mode 100644 index 000000000..dc4101159 --- /dev/null +++ b/authentik/stages/authenticator_validate/tests/test_totp.py @@ -0,0 +1,114 @@ +"""Test validator stage""" +from time import sleep + +from django.test.client import RequestFactory +from django.urls.base import reverse +from django_otp.oath import TOTP +from django_otp.plugins.otp_totp.models import TOTPDevice +from rest_framework.exceptions import ValidationError + +from authentik.core.tests.utils import create_test_admin_user +from authentik.flows.models import Flow, FlowStageBinding, NotConfiguredAction +from authentik.flows.tests import FlowTestCase +from authentik.stages.authenticator_validate.challenge import ( + get_challenge_for_device, + validate_challenge_code, +) +from authentik.stages.authenticator_validate.models import AuthenticatorValidateStage, DeviceClasses +from authentik.stages.identification.models import IdentificationStage, UserFields + + +class AuthenticatorValidateStageTOTPTests(FlowTestCase): + """Test validator stage""" + + def setUp(self) -> None: + self.user = create_test_admin_user() + self.request_factory = RequestFactory() + + def test_last_auth_threshold(self): + """Test last_auth_threshold""" + conf_stage = IdentificationStage.objects.create( + name="conf", + user_fields=[ + UserFields.USERNAME, + ], + ) + device: TOTPDevice = TOTPDevice.objects.create( + user=self.user, + confirmed=True, + ) + # Verify token once here to set last_t etc + totp = TOTP(device.bin_key) + sleep(1) + self.assertTrue(device.verify_token(totp.token())) + stage = AuthenticatorValidateStage.objects.create( + name="foo", + last_auth_threshold="milliseconds=0", + not_configured_action=NotConfiguredAction.CONFIGURE, + device_classes=[DeviceClasses.TOTP], + ) + stage.configuration_stages.set([conf_stage]) + flow = Flow.objects.create(name="test", slug="test", title="test") + FlowStageBinding.objects.create(target=flow, stage=conf_stage, order=0) + FlowStageBinding.objects.create(target=flow, stage=stage, order=1) + + response = self.client.post( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + {"uid_field": self.user.username}, + ) + self.assertEqual(response.status_code, 302) + response = self.client.get( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + follow=True, + ) + self.assertStageResponse( + response, + flow, + component="ak-stage-authenticator-validate", + ) + + def test_last_auth_threshold_valid(self): + """Test last_auth_threshold""" + conf_stage = IdentificationStage.objects.create( + name="conf", + user_fields=[ + UserFields.USERNAME, + ], + ) + device: TOTPDevice = TOTPDevice.objects.create( + user=self.user, + confirmed=True, + ) + # Verify token once here to set last_t etc + totp = TOTP(device.bin_key) + sleep(1) + self.assertTrue(device.verify_token(totp.token())) + stage = AuthenticatorValidateStage.objects.create( + name="foo", + last_auth_threshold="hours=1", + not_configured_action=NotConfiguredAction.CONFIGURE, + device_classes=[DeviceClasses.TOTP], + ) + stage.configuration_stages.set([conf_stage]) + flow = Flow.objects.create(name="test", slug="test", title="test") + FlowStageBinding.objects.create(target=flow, stage=conf_stage, order=0) + FlowStageBinding.objects.create(target=flow, stage=stage, order=1) + + response = self.client.post( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + {"uid_field": self.user.username}, + ) + self.assertEqual(response.status_code, 302) + response = self.client.get( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + follow=True, + ) + self.assertStageResponse(response, component="xak-flow-redirect", to="/") + + def test_device_challenge_totp(self): + """Test device challenge""" + request = self.request_factory.get("/") + totp_device = TOTPDevice.objects.create(user=self.user, confirmed=True, digits=6) + self.assertEqual(get_challenge_for_device(request, totp_device), {}) + with self.assertRaises(ValidationError): + validate_challenge_code("1234", request, self.user) diff --git a/authentik/stages/authenticator_validate/tests/test_webauthn.py b/authentik/stages/authenticator_validate/tests/test_webauthn.py new file mode 100644 index 000000000..41ca9d0ce --- /dev/null +++ b/authentik/stages/authenticator_validate/tests/test_webauthn.py @@ -0,0 +1,134 @@ +"""Test validator stage""" +from time import sleep + +from django.test.client import RequestFactory +from django.urls.base import reverse +from rest_framework.exceptions import ValidationError +from webauthn.helpers import bytes_to_base64url + +from authentik.core.tests.utils import create_test_admin_user +from authentik.flows.models import Flow, FlowStageBinding, NotConfiguredAction +from authentik.flows.tests import FlowTestCase +from authentik.lib.tests.utils import get_request +from authentik.stages.authenticator_validate.challenge import ( + get_challenge_for_device, + validate_challenge_webauthn, +) +from authentik.stages.authenticator_validate.models import AuthenticatorValidateStage, DeviceClasses +from authentik.stages.authenticator_webauthn.models import WebAuthnDevice +from authentik.stages.identification.models import IdentificationStage, UserFields + + +class AuthenticatorValidateStageWebAuthnTests(FlowTestCase): + """Test validator stage""" + + def setUp(self) -> None: + self.user = create_test_admin_user() + self.request_factory = RequestFactory() + + def test_last_auth_threshold(self): + """Test last_auth_threshold""" + conf_stage = IdentificationStage.objects.create( + name="conf", + user_fields=[ + UserFields.USERNAME, + ], + ) + device: WebAuthnDevice = WebAuthnDevice.objects.create( + user=self.user, + confirmed=True, + ) + device.set_sign_count(device.sign_count + 1) + stage = AuthenticatorValidateStage.objects.create( + name="foo", + last_auth_threshold="milliseconds=0", + not_configured_action=NotConfiguredAction.CONFIGURE, + device_classes=[DeviceClasses.WEBAUTHN], + ) + sleep(1) + stage.configuration_stages.set([conf_stage]) + flow = Flow.objects.create(name="test", slug="test", title="test") + FlowStageBinding.objects.create(target=flow, stage=conf_stage, order=0) + FlowStageBinding.objects.create(target=flow, stage=stage, order=1) + + response = self.client.post( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + {"uid_field": self.user.username}, + ) + self.assertEqual(response.status_code, 302) + response = self.client.get( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + follow=True, + ) + self.assertStageResponse( + response, + flow, + component="ak-stage-authenticator-validate", + ) + + def test_last_auth_threshold_valid(self): + """Test last_auth_threshold""" + conf_stage = IdentificationStage.objects.create( + name="conf", + user_fields=[ + UserFields.USERNAME, + ], + ) + device: WebAuthnDevice = WebAuthnDevice.objects.create( + user=self.user, + confirmed=True, + ) + device.set_sign_count(device.sign_count + 1) + stage = AuthenticatorValidateStage.objects.create( + name="foo", + last_auth_threshold="hours=1", + not_configured_action=NotConfiguredAction.CONFIGURE, + device_classes=[DeviceClasses.WEBAUTHN], + ) + stage.configuration_stages.set([conf_stage]) + flow = Flow.objects.create(name="test", slug="test", title="test") + FlowStageBinding.objects.create(target=flow, stage=conf_stage, order=0) + FlowStageBinding.objects.create(target=flow, stage=stage, order=1) + + response = self.client.post( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + {"uid_field": self.user.username}, + ) + self.assertEqual(response.status_code, 302) + response = self.client.get( + reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), + follow=True, + ) + self.assertStageResponse(response, component="xak-flow-redirect", to="/") + + def test_device_challenge_webauthn(self): + """Test webauthn""" + request = get_request("/") + request.user = self.user + + webauthn_device = WebAuthnDevice.objects.create( + user=self.user, + public_key=bytes_to_base64url(b"qwerqwerqre"), + credential_id=bytes_to_base64url(b"foobarbaz"), + sign_count=0, + rp_id="foo", + ) + challenge = get_challenge_for_device(request, webauthn_device) + del challenge["challenge"] + self.assertEqual( + challenge, + { + "allowCredentials": [ + { + "id": "Zm9vYmFyYmF6", + "type": "public-key", + } + ], + "rpId": "testserver", + "timeout": 60000, + "userVerification": "preferred", + }, + ) + + with self.assertRaises(ValidationError): + validate_challenge_webauthn({}, request, self.user) diff --git a/authentik/stages/authenticator_webauthn/migrations/0007_rename_last_used_on_webauthndevice_last_t.py b/authentik/stages/authenticator_webauthn/migrations/0007_rename_last_used_on_webauthndevice_last_t.py new file mode 100644 index 000000000..4916b1415 --- /dev/null +++ b/authentik/stages/authenticator_webauthn/migrations/0007_rename_last_used_on_webauthndevice_last_t.py @@ -0,0 +1,21 @@ +# Generated by Django 4.0.4 on 2022-04-14 20:58 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ( + "authentik_stages_authenticator_webauthn", + "0006_authenticatewebauthnstage_authenticator_attachment_and_more", + ), + ] + + operations = [ + migrations.RenameField( + model_name="webauthndevice", + old_name="last_used_on", + new_name="last_t", + ), + ] diff --git a/authentik/stages/authenticator_webauthn/models.py b/authentik/stages/authenticator_webauthn/models.py index 8dce7e04d..a6cb3a93a 100644 --- a/authentik/stages/authenticator_webauthn/models.py +++ b/authentik/stages/authenticator_webauthn/models.py @@ -125,7 +125,7 @@ class WebAuthnDevice(Device): rp_id = models.CharField(max_length=253) created_on = models.DateTimeField(auto_now_add=True) - last_used_on = models.DateTimeField(default=now) + last_t = models.DateTimeField(default=now) @property def descriptor(self) -> PublicKeyCredentialDescriptor: @@ -133,9 +133,9 @@ class WebAuthnDevice(Device): return PublicKeyCredentialDescriptor(id=base64url_to_bytes(self.credential_id)) def set_sign_count(self, sign_count: int) -> None: - """Set the sign_count and update the last_used_on datetime.""" + """Set the sign_count and update the last_t datetime.""" self.sign_count = sign_count - self.last_used_on = now() + self.last_t = now() self.save() def __str__(self): diff --git a/authentik/stages/deny/tests.py b/authentik/stages/deny/tests.py index 15acd50b8..36fd88df5 100644 --- a/authentik/stages/deny/tests.py +++ b/authentik/stages/deny/tests.py @@ -36,7 +36,6 @@ class TestUserDenyStage(FlowTestCase): reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}) ) - self.assertEqual(response.status_code, 200) self.assertStageResponse(response, self.flow, component="ak-stage-access-denied") def test_valid_post(self): @@ -50,5 +49,4 @@ class TestUserDenyStage(FlowTestCase): reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}) ) - self.assertEqual(response.status_code, 200) self.assertStageResponse(response, self.flow, component="ak-stage-access-denied") diff --git a/authentik/stages/identification/tests.py b/authentik/stages/identification/tests.py index 5203da0ed..6ba455bd9 100644 --- a/authentik/stages/identification/tests.py +++ b/authentik/stages/identification/tests.py @@ -79,7 +79,6 @@ class TestIdentificationStage(FlowTestCase): } url = reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}) response = self.client.post(url, form_data) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, self.flow, @@ -122,7 +121,6 @@ class TestIdentificationStage(FlowTestCase): reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}), form_data, ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, self.flow, @@ -175,7 +173,6 @@ class TestIdentificationStage(FlowTestCase): response = self.client.get( reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}), ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, self.flow, @@ -218,7 +215,6 @@ class TestIdentificationStage(FlowTestCase): response = self.client.get( reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}), ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, self.flow, diff --git a/authentik/stages/invitation/tests.py b/authentik/stages/invitation/tests.py index 43420f6e8..bb04eb055 100644 --- a/authentik/stages/invitation/tests.py +++ b/authentik/stages/invitation/tests.py @@ -55,7 +55,6 @@ class TestUserLoginStage(FlowTestCase): response = self.client.get( reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}) ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, flow=self.flow, diff --git a/authentik/stages/password/tests.py b/authentik/stages/password/tests.py index 1792f22b3..6e9a701f4 100644 --- a/authentik/stages/password/tests.py +++ b/authentik/stages/password/tests.py @@ -53,7 +53,6 @@ class TestPasswordStage(FlowTestCase): {"password": self.password}, ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, self.flow, @@ -159,7 +158,6 @@ class TestPasswordStage(FlowTestCase): {"password": self.password + "test"}, ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, self.flow, diff --git a/authentik/stages/user_delete/tests.py b/authentik/stages/user_delete/tests.py index ebcd8f78d..c763885bd 100644 --- a/authentik/stages/user_delete/tests.py +++ b/authentik/stages/user_delete/tests.py @@ -43,7 +43,6 @@ class TestUserDeleteStage(FlowTestCase): response = self.client.get( reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}) ) - self.assertEqual(response.status_code, 200) self.assertStageResponse(response, self.flow, component="ak-stage-access-denied") def test_user_delete_get(self): diff --git a/authentik/stages/user_login/tests.py b/authentik/stages/user_login/tests.py index b01974bf8..eca97cdb9 100644 --- a/authentik/stages/user_login/tests.py +++ b/authentik/stages/user_login/tests.py @@ -94,7 +94,6 @@ class TestUserLoginStage(FlowTestCase): reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}) ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, self.flow, diff --git a/authentik/stages/user_write/tests.py b/authentik/stages/user_write/tests.py index 349362833..50f66df89 100644 --- a/authentik/stages/user_write/tests.py +++ b/authentik/stages/user_write/tests.py @@ -112,7 +112,6 @@ class TestUserWriteStage(FlowTestCase): reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}) ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, self.flow, @@ -139,7 +138,6 @@ class TestUserWriteStage(FlowTestCase): reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}) ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, self.flow, @@ -167,7 +165,6 @@ class TestUserWriteStage(FlowTestCase): reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}) ) - self.assertEqual(response.status_code, 200) self.assertStageResponse( response, self.flow, diff --git a/schema.yml b/schema.yml index e6e8e989c..41ce3f6f8 100644 --- a/schema.yml +++ b/schema.yml @@ -19894,6 +19894,10 @@ components: description: Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again. + last_auth_threshold: + type: string + description: If any of the user's device has been used within this threshold, + this stage will be skipped required: - component - meta_model_name @@ -19927,6 +19931,11 @@ components: description: Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again. + last_auth_threshold: + type: string + minLength: 1 + description: If any of the user's device has been used within this threshold, + this stage will be skipped required: - name AuthenticatorValidationChallenge: @@ -26797,6 +26806,11 @@ components: description: Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again. + last_auth_threshold: + type: string + minLength: 1 + description: If any of the user's device has been used within this threshold, + this stage will be skipped PatchedCaptchaStageRequest: type: object description: CaptchaStage Serializer diff --git a/web/src/elements/Tooltip.ts b/web/src/elements/Tooltip.ts new file mode 100644 index 000000000..2dccd1171 --- /dev/null +++ b/web/src/elements/Tooltip.ts @@ -0,0 +1,54 @@ +import { CSSResult, LitElement, TemplateResult, css, html } from "lit"; +import { customElement, state } from "lit/decorators.js"; + +import AKGlobal from "../authentik.css"; +import PFTooltip from "@patternfly/patternfly/components/Tooltip/Tooltip.css"; +import PFBase from "@patternfly/patternfly/patternfly-base.css"; + +@customElement("ak-tooltip") +export class Tooltip extends LitElement { + @state() + open = false; + + static get styles(): CSSResult[] { + return [ + PFBase, + PFTooltip, + AKGlobal, + css` + .pf-c-tooltip__content { + text-align: inherit; + } + .outer { + position: relative; + } + .pf-c-tooltip { + position: absolute; + } + `, + ]; + } + + render(): TemplateResult { + return html` { + this.open = true; + }} + @mouseleave=${() => { + this.open = false; + }} + name="trigger" + > + ${this.open + ? html`
+ +
` + : html``}`; + } +} diff --git a/web/src/elements/utils/TimeDeltaHelp.ts b/web/src/elements/utils/TimeDeltaHelp.ts new file mode 100644 index 000000000..81a0fc627 --- /dev/null +++ b/web/src/elements/utils/TimeDeltaHelp.ts @@ -0,0 +1,45 @@ +import { t } from "@lingui/macro"; + +import { CSSResult, LitElement, TemplateResult, html } from "lit"; +import { customElement, property } from "lit/decorators.js"; + +import AKGlobal from "../../authentik.css"; +import PFForm from "@patternfly/patternfly/components/Form/Form.css"; +import PFList from "@patternfly/patternfly/components/List/list.css"; +import PFBase from "@patternfly/patternfly/patternfly-base.css"; + +import "../Tooltip"; + +@customElement("ak-utils-time-delta-help") +export class TimeDeltaHelp extends LitElement { + @property({ type: Boolean }) + negative = false; + + static get styles(): CSSResult[] { + return [PFBase, PFForm, PFList, AKGlobal]; + } + + render(): TemplateResult { + return html` +

+ ${this.negative + ? t`(Format: hours=-1;minutes=-2;seconds=-3).` + : t`(Format: hours=1;minutes=2;seconds=3).`} + +

+ +
+ ${t`The following keywords are supported:`} +
    +
  • microseconds
  • +
  • milliseconds
  • +
  • seconds
  • +
  • minutes
  • +
  • hours
  • +
  • days
  • +
  • weeks
  • +
+
+
`; + } +} diff --git a/web/src/locales/de.po b/web/src/locales/de.po index d1c83cda0..5ef2eff17 100644 --- a/web/src/locales/de.po +++ b/web/src/locales/de.po @@ -33,14 +33,15 @@ msgstr "" #~ msgid "#/identity/users/{0}" #~ msgstr "#/Identität/Benutzer/{0}" -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/proxy/ProxyProviderForm.ts -#: src/pages/providers/saml/SAMLProviderForm.ts +#: src/elements/utils/TimeDeltaHelp.ts +#~ msgid "(Format: days=-1;minutes=-2;seconds=-3)." +#~ msgstr "" + +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=-1;minutes=-2;seconds=-3)." msgstr "(Format: hours=-1;minutes=-2;seconds=-3)." -#: src/pages/stages/user_login/UserLoginStageForm.ts +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=1;minutes=2;seconds=3)." msgstr "(Format: hours=-1;minutes=-2;seconds=-3)." @@ -458,8 +459,12 @@ msgid "Are you sure you want to update {0} \"{1}\"?" msgstr "Sind Sie sicher, dass Sie {0} \"{1}\" aktualisieren wollen?" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "SAML Assertion nicht gültig am oder nach der aktuellen Uhrzeit + diesem Wert (Format: Stunden=1;Minuten=2;Sekunden=3)." +#~ msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "SAML Assertion nicht gültig am oder nach der aktuellen Uhrzeit + diesem Wert (Format: Stunden=1;Minuten=2;Sekunden=3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Assertion not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Assertion valid not before" @@ -2496,6 +2501,10 @@ msgstr "Kennung" #~ msgid "Identity & Cryptography" #~ msgstr "Identität & Kryptographie" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "If any of the devices user of the types selected above have been used within this duration, this stage will be skipped." +msgstr "" + #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." @@ -2769,6 +2778,10 @@ msgstr "Überprüft: {0}" msgid "Last sync: {0}" msgstr "Letzte Synchronisierung: {0}" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "Last validation threshold" +msgstr "" + #: src/pages/applications/ApplicationViewPage.ts #: src/pages/applications/ApplicationViewPage.ts msgid "Launch" @@ -3490,8 +3503,12 @@ msgid "Objects created" msgstr "Objekte erstellt" #: src/pages/stages/consent/ConsentStageForm.ts -msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." -msgstr "Die Einwilligung erlischt in. (Format: Stunden=1;Minuten=2;Sekunden=3)." +msgid "Offset after which consent expires." +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts +#~ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Die Einwilligung erlischt in. (Format: Stunden=1;Minuten=2;Sekunden=3)." #: src/elements/events/ObjectChangelog.ts #: src/elements/events/UserEvents.ts @@ -4522,8 +4539,12 @@ msgid "Session duration" msgstr "Sessionsdauer" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "Session am oder nach der aktuellen Uhrzeit + diesem Wert nicht gültig (Format: Stunden=1;Minuten=2;Sekunden=3)." +#~ msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Session am oder nach der aktuellen Uhrzeit + diesem Wert nicht gültig (Format: Stunden=1;Minuten=2;Sekunden=3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Session not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Session valid not on or after" @@ -5331,6 +5352,10 @@ msgstr "Die externe URL, unter der Sie auf die Anwendung zugreifen. Schließen S msgid "The external URL you'll authenticate at. The authentik core server should be reachable under this URL." msgstr "Die externe URL, bei der Sie sich authentifizieren. Unter dieser URL sollte der Authentik Core Server erreichbar sein." +#: src/elements/utils/TimeDeltaHelp.ts +msgid "The following keywords are supported:" +msgstr "" + #~ msgid "The following objects use {0}:" #~ msgstr "Die folgenden Objekte verwenden {0}:" @@ -5440,8 +5465,12 @@ msgid "Time in minutes the token sent is valid." msgstr "Zeit in Minuten wie lange der verschickte Token gültig ist" #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "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. (Format: hours=1;minutes=2;seconds=3)." -msgstr "Zeitversatz, wann temporäre Benutzer gelöscht werden sollen. Dies gilt nur, wenn Ihr IDP das NameID-Format „transient“ verwendet und der Benutzer sich nicht manuell abmeldet. (Format: Stunden=1;Minuten=2;Sekunden=3)." +msgid "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." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts +#~ msgid "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. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Zeitversatz, wann temporäre Benutzer gelöscht werden sollen. Dies gilt nur, wenn Ihr IDP das NameID-Format „transient“ verwendet und der Benutzer sich nicht manuell abmeldet. (Format: Stunden=1;Minuten=2;Sekunden=3)." #~ msgid "Time-based One-Time Passwords" #~ msgstr "Zeitbasierte Einmalpasswörter" diff --git a/web/src/locales/en.po b/web/src/locales/en.po index 41af80247..0696303a1 100644 --- a/web/src/locales/en.po +++ b/web/src/locales/en.po @@ -13,18 +13,19 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: +#: #~ msgid "#/identity/users/{0}" #~ msgstr "#/identity/users/{0}" -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/proxy/ProxyProviderForm.ts -#: src/pages/providers/saml/SAMLProviderForm.ts +#: src/elements/utils/TimeDeltaHelp.ts +#~ msgid "(Format: days=-1;minutes=-2;seconds=-3)." +#~ msgstr "(Format: days=-1;minutes=-2;seconds=-3)." + +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=-1;minutes=-2;seconds=-3)." msgstr "(Format: hours=-1;minutes=-2;seconds=-3)." -#: src/pages/stages/user_login/UserLoginStageForm.ts +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=1;minutes=2;seconds=3)." msgstr "(Format: hours=1;minutes=2;seconds=3)." @@ -144,7 +145,7 @@ msgstr "About applications" msgid "Access Key" msgstr "Access Key" -#: +#: #~ msgid "Access code validity" #~ msgstr "Access code validity" @@ -448,8 +449,12 @@ msgid "Are you sure you want to update {0} \"{1}\"?" msgstr "Are you sure you want to update {0} \"{1}\"?" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Assertion not valid on or after current time + this value." +msgstr "Assertion not valid on or after current time + this value." #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Assertion valid not before" @@ -499,7 +504,7 @@ msgstr "Attributes" msgid "Audience" msgstr "Audience" -#: +#: #~ msgid "Auth Type" #~ msgstr "Auth Type" @@ -542,7 +547,7 @@ msgstr "Authenticator Attachment" msgid "Authorization" msgstr "Authorization" -#: +#: #~ msgid "Authorization Code" #~ msgstr "Authorization Code" @@ -702,7 +707,7 @@ msgstr "Browser" msgid "Build hash:" msgstr "Build hash:" -#: +#: #~ msgid "Build hash: {0}" #~ msgstr "Build hash: {0}" @@ -784,7 +789,7 @@ msgstr "Certificate Subject" msgid "Certificate used to sign outgoing Responses going to the Service Provider." msgstr "Certificate used to sign outgoing Responses going to the Service Provider." -#: +#: #~ msgid "Certificate-Key Pair" #~ msgstr "Certificate-Key Pair" @@ -877,7 +882,7 @@ msgstr "Check the IP of the Kubernetes service, or" msgid "Check the logs" msgstr "Check the logs" -#: +#: #~ msgid "Check your Emails for a password reset link." #~ msgstr "Check your Emails for a password reset link." @@ -1026,11 +1031,11 @@ msgstr "Configuration flow" msgid "Configuration stages" msgstr "Configuration stages" -#: +#: #~ msgid "Configure WebAuthn" #~ msgstr "Configure WebAuthn" -#: +#: #~ msgid "Configure how long access codes are valid for." #~ msgstr "Configure how long access codes are valid for." @@ -1066,8 +1071,8 @@ msgstr "Configure how the outpost authenticates requests." msgid "Configure how the outpost queries the core authentik server's users." msgstr "Configure how the outpost queries the core authentik server's users." -#: -#: +#: +#: #~ msgid "Configure settings relevant to your user profile." #~ msgstr "Configure settings relevant to your user profile." @@ -1189,7 +1194,7 @@ msgstr "Cookie domain" msgid "Copy" msgstr "Copy" -#: +#: #~ msgid "Copy Key" #~ msgstr "Copy Key" @@ -1391,7 +1396,7 @@ msgstr "Create {0}" msgid "Created by" msgstr "Created by" -#: +#: #~ msgid "Created {0}" #~ msgstr "Created {0}" @@ -1401,7 +1406,7 @@ msgstr "Created by" msgid "Creation Date" msgstr "Creation Date" -#: +#: #~ msgid "Current plan cntext" #~ msgstr "Current plan cntext" @@ -1498,24 +1503,24 @@ msgstr "Define how notifications are sent to users, like Email or Webhook." msgid "Delete" msgstr "Delete" -#: +#: #~ msgid "Delete Authorization Code" #~ msgstr "Delete Authorization Code" -#: -#: +#: +#: #~ msgid "Delete Binding" #~ msgstr "Delete Binding" -#: +#: #~ msgid "Delete Consent" #~ msgstr "Delete Consent" -#: +#: #~ msgid "Delete Refresh Code" #~ msgstr "Delete Refresh Code" -#: +#: #~ msgid "Delete Session" #~ msgstr "Delete Session" @@ -1596,7 +1601,7 @@ msgstr "Device classes" msgid "Device classes which can be used to authenticate." msgstr "Device classes which can be used to authenticate." -#: +#: #~ msgid "Device name" #~ msgstr "Device name" @@ -1629,24 +1634,24 @@ msgstr "Direct querying, always returns the latest data, but slower than cached msgid "Directory" msgstr "Directory" -#: -#: +#: +#: #~ msgid "Disable" #~ msgstr "Disable" -#: +#: #~ msgid "Disable Duo authenticator" #~ msgstr "Disable Duo authenticator" -#: +#: #~ msgid "Disable SMS authenticator" #~ msgstr "Disable SMS authenticator" -#: +#: #~ msgid "Disable Static Tokens" #~ msgstr "Disable Static Tokens" -#: +#: #~ msgid "Disable Time-based OTP" #~ msgstr "Disable Time-based OTP" @@ -1700,7 +1705,7 @@ msgstr "Due to protocol limitations, this certificate is only used when the outp msgid "Dummy stage used for testing. Shows a simple continue button and always passes." msgstr "Dummy stage used for testing. Shows a simple continue button and always passes." -#: +#: #~ msgid "Duo" #~ msgstr "Duo" @@ -1811,16 +1816,16 @@ msgstr "Email: Text field with Email type." msgid "Embedded outpost is not configured correctly." msgstr "Embedded outpost is not configured correctly." -#: -#: +#: +#: #~ msgid "Enable" #~ msgstr "Enable" -#: +#: #~ msgid "Enable Duo authenticator" #~ msgstr "Enable Duo authenticator" -#: +#: #~ msgid "Enable SMS authenticator" #~ msgstr "Enable SMS authenticator" @@ -1828,11 +1833,11 @@ msgstr "Embedded outpost is not configured correctly." msgid "Enable StartTLS" msgstr "Enable StartTLS" -#: +#: #~ msgid "Enable Static Tokens" #~ msgstr "Enable Static Tokens" -#: +#: #~ msgid "Enable TOTP" #~ msgstr "Enable TOTP" @@ -1896,7 +1901,7 @@ msgstr "Error when validating assertion on server: {err}" msgid "Error: unsupported source settings: {0}" msgstr "Error: unsupported source settings: {0}" -#: +#: #~ msgid "Error: unsupported stage settings: {0}" #~ msgstr "Error: unsupported stage settings: {0}" @@ -1951,7 +1956,7 @@ msgstr "Everything is ok." msgid "Exception" msgstr "Exception" -#: +#: #~ msgid "Execute" #~ msgstr "Execute" @@ -1963,7 +1968,7 @@ msgstr "Exception" msgid "Execute flow" msgstr "Execute flow" -#: +#: #~ msgid "Execute with inspector" #~ msgstr "Execute with inspector" @@ -2138,7 +2143,7 @@ msgstr "Field of the user object this value is written to." msgid "Field which contains a unique Identifier." msgstr "Field which contains a unique Identifier." -#: +#: #~ msgid "Field which contains members of a group." #~ msgstr "Field which contains members of a group." @@ -2345,7 +2350,7 @@ msgstr "German" msgid "Get this value from https://console.twilio.com" msgstr "Get this value from https://console.twilio.com" -#: +#: #~ msgid "Go to admin interface" #~ msgstr "Go to admin interface" @@ -2357,7 +2362,7 @@ msgstr "Go to next page" msgid "Go to previous page" msgstr "Go to previous page" -#: +#: #~ msgid "Go to user interface" #~ msgstr "Go to user interface" @@ -2538,6 +2543,10 @@ msgstr "Identifier" #~ msgid "Identity & Cryptography" #~ msgstr "Identity & Cryptography" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "If any of the devices user of the types selected above have been used within this duration, this stage will be skipped." +msgstr "If any of the devices user of the types selected above have been used within this duration, this stage will be skipped." + #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." @@ -2702,7 +2711,7 @@ msgstr "Invalidation" msgid "Invalidation flow" msgstr "Invalidation flow" -#: +#: #~ msgid "Invitation" #~ msgstr "Invitation" @@ -2820,6 +2829,10 @@ msgstr "Last seen: {0}" msgid "Last sync: {0}" msgstr "Last sync: {0}" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "Last validation threshold" +msgstr "Last validation threshold" + #: src/pages/applications/ApplicationViewPage.ts #: src/pages/applications/ApplicationViewPage.ts msgid "Launch" @@ -2833,7 +2846,7 @@ msgstr "Launch URL" msgid "Let the user identify themselves with their username or Email address." msgstr "Let the user identify themselves with their username or Email address." -#: +#: #~ msgid "Library" #~ msgstr "Library" @@ -3143,7 +3156,7 @@ msgstr "Model deleted" msgid "Model updated" msgstr "Model updated" -#: +#: #~ msgid "Monitor" #~ msgstr "Monitor" @@ -3478,7 +3491,7 @@ msgstr "Notification Rules" msgid "Notification Transports" msgstr "Notification Transports" -#: +#: #~ msgid "Notification rule" #~ msgstr "Notification rule" @@ -3498,7 +3511,7 @@ msgstr "Notification transport(s)" msgid "Notifications" msgstr "Notifications" -#: +#: #~ msgid "Notifications Transport" #~ msgstr "Notifications Transport" @@ -3548,8 +3561,12 @@ msgid "Objects created" msgstr "Objects created" #: src/pages/stages/consent/ConsentStageForm.ts -msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." -msgstr "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +msgid "Offset after which consent expires." +msgstr "Offset after which consent expires." + +#: src/pages/stages/consent/ConsentStageForm.ts +#~ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." #: src/elements/events/ObjectChangelog.ts #: src/elements/events/UserEvents.ts @@ -3569,7 +3586,7 @@ msgstr "Only send notification once, for example when sending a webhook into a c msgid "Open API Browser" msgstr "Open API Browser" -#: +#: #~ msgid "Open application" #~ msgstr "Open application" @@ -3651,7 +3668,7 @@ msgstr "Other global settings" msgid "Outdated outposts" msgstr "Outdated outposts" -#: +#: #~ msgid "Outpost" #~ msgstr "Outpost" @@ -3663,11 +3680,11 @@ msgstr "Outpost Deployment Info" msgid "Outpost Integrations" msgstr "Outpost Integrations" -#: +#: #~ msgid "Outpost Service-connection" #~ msgstr "Outpost Service-connection" -#: +#: #~ msgid "Outpost integration" #~ msgstr "Outpost integration" @@ -3765,7 +3782,7 @@ msgstr "Password set" msgid "Password stage" msgstr "Password stage" -#: +#: #~ msgid "Password, 2FA, etc" #~ msgstr "Password, 2FA, etc" @@ -3841,7 +3858,7 @@ msgstr "Policy / User / Group" msgid "Policy Bindings" msgstr "Policy Bindings" -#: +#: #~ msgid "Policy binding" #~ msgstr "Policy binding" @@ -3931,7 +3948,7 @@ msgstr "Private key, acquired from https://www.google.com/recaptcha/intro/v3.htm msgid "Profile URL" msgstr "Profile URL" -#: +#: #~ msgid "Prompt" #~ msgstr "Prompt" @@ -3948,7 +3965,7 @@ msgstr "Prompt(s)" msgid "Prompts" msgstr "Prompts" -#: +#: #~ msgid "Property Mapping" #~ msgstr "Property Mapping" @@ -4007,7 +4024,7 @@ msgstr "Provider" msgid "Provider Type" msgstr "Provider Type" -#: +#: #~ msgid "Provider type" #~ msgstr "Provider type" @@ -4150,7 +4167,7 @@ msgstr "Redirect binding" msgid "Refresh" msgstr "Refresh" -#: +#: #~ msgid "Refresh Code" #~ msgstr "Refresh Code" @@ -4268,7 +4285,7 @@ msgstr "Result" msgid "Retry" msgstr "Retry" -#: +#: #~ msgid "Retry Task" #~ msgstr "Retry Task" @@ -4436,7 +4453,7 @@ msgstr "Secret key" msgid "Secret was rotated" msgstr "Secret was rotated" -#: +#: #~ msgid "Secret was rotation" #~ msgstr "Secret was rotation" @@ -4476,7 +4493,7 @@ msgstr "Select an authentication method." msgid "Select an enrollment flow" msgstr "Select an enrollment flow" -#: +#: #~ msgid "Select an identification method." #~ msgstr "Select an identification method." @@ -4525,7 +4542,7 @@ msgstr "Select which transports should be used to notify the user. If none are s msgid "Selected policies are executed when the stage is submitted to validate the data." msgstr "Selected policies are executed when the stage is submitted to validate the data." -#: +#: #~ msgid "Selecting a service-connection enables the management of the outpost by authentik." #~ msgstr "Selecting a service-connection enables the management of the outpost by authentik." @@ -4576,7 +4593,7 @@ msgstr "Server URI" msgid "Server and client are further than 5 seconds apart." msgstr "Server and client are further than 5 seconds apart." -#: +#: #~ msgid "Server name for which this provider's certificate is valid for." #~ msgstr "Server name for which this provider's certificate is valid for." @@ -4584,7 +4601,7 @@ msgstr "Server and client are further than 5 seconds apart." msgid "Server validation of credential failed: {err}" msgstr "Server validation of credential failed: {err}" -#: +#: #~ msgid "Service Connections" #~ msgstr "Service Connections" @@ -4592,12 +4609,12 @@ msgstr "Server validation of credential failed: {err}" msgid "Service Provider Binding" msgstr "Service Provider Binding" -#: -#: +#: +#: #~ msgid "Service connection" #~ msgstr "Service connection" -#: +#: #~ msgid "Session" #~ msgstr "Session" @@ -4610,8 +4627,12 @@ msgid "Session duration" msgstr "Session duration" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Session not valid on or after current time + this value." +msgstr "Session not valid on or after current time + this value." #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Session valid not on or after" @@ -4735,7 +4756,7 @@ msgstr "Slug" msgid "Something went wrong! Please try again later." msgstr "Something went wrong! Please try again later." -#: +#: #~ msgid "Source" #~ msgstr "Source" @@ -4743,7 +4764,7 @@ msgstr "Something went wrong! Please try again later." msgid "Source linked" msgstr "Source linked" -#: +#: #~ msgid "Source name" #~ msgstr "Source name" @@ -4760,7 +4781,7 @@ msgstr "Source(s)" msgid "Sources" msgstr "Sources" -#: +#: #~ msgid "Sources of identities, which can either be synced into authentik's database, like LDAP, or can be used by users to authenticate and enroll themselves, like OAuth and social logins" #~ msgstr "Sources of identities, which can either be synced into authentik's database, like LDAP, or can be used by users to authenticate and enroll themselves, like OAuth and social logins" @@ -4789,7 +4810,7 @@ msgstr "Stage Bindings" msgid "Stage Configuration" msgstr "Stage Configuration" -#: +#: #~ msgid "Stage binding" #~ msgstr "Stage binding" @@ -4910,17 +4931,17 @@ msgstr "Statically deny the flow. To use this stage effectively, disable *Evalua msgid "Status" msgstr "Status" -#: -#: -#: -#: +#: +#: +#: +#: #~ msgid "Status: Disabled" #~ msgstr "Status: Disabled" -#: -#: -#: -#: +#: +#: +#: +#: #~ msgid "Status: Enabled" #~ msgstr "Status: Enabled" @@ -5032,8 +5053,8 @@ msgstr "Successfully created provider." msgid "Successfully created rule." msgstr "Successfully created rule." -#: -#: +#: +#: #~ msgid "Successfully created service-connection." #~ msgstr "Successfully created service-connection." @@ -5199,8 +5220,8 @@ msgstr "Successfully updated provider." msgid "Successfully updated rule." msgstr "Successfully updated rule." -#: -#: +#: +#: #~ msgid "Successfully updated service-connection." #~ msgstr "Successfully updated service-connection." @@ -5283,7 +5304,7 @@ msgstr "Suspicious request" msgid "Symbol charset" msgstr "Symbol charset" -#: +#: #~ msgid "Sync" #~ msgstr "Sync" @@ -5291,7 +5312,7 @@ msgstr "Symbol charset" msgid "Sync groups" msgstr "Sync groups" -#: +#: #~ msgid "Sync parent group" #~ msgstr "Sync parent group" @@ -5336,7 +5357,7 @@ msgstr "System task execution" msgid "TLS Authentication Certificate/SSH Keypair" msgstr "TLS Authentication Certificate/SSH Keypair" -#: +#: #~ msgid "TLS Server name" #~ msgstr "TLS Server name" @@ -5445,7 +5466,11 @@ msgstr "The external URL you'll access the application at. Include any non-stand msgid "The external URL you'll authenticate at. The authentik core server should be reachable under this URL." msgstr "The external URL you'll authenticate at. The authentik core server should be reachable under this URL." -#: +#: src/elements/utils/TimeDeltaHelp.ts +msgid "The following keywords are supported:" +msgstr "The following keywords are supported:" + +#: #~ msgid "The following objects use {0}:" #~ msgstr "The following objects use {0}:" @@ -5556,10 +5581,14 @@ msgid "Time in minutes the token sent is valid." msgstr "Time in minutes the token sent is valid." #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "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. (Format: hours=1;minutes=2;seconds=3)." -msgstr "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. (Format: hours=1;minutes=2;seconds=3)." +msgid "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." +msgstr "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." -#: +#: src/pages/sources/saml/SAMLSourceForm.ts +#~ msgid "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. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "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. (Format: hours=1;minutes=2;seconds=3)." + +#: #~ msgid "Time-based One-Time Passwords" #~ msgstr "Time-based One-Time Passwords" @@ -5599,8 +5628,8 @@ msgstr "To let a user directly reset a their password, configure a recovery flow msgid "To use SSL instead, use 'ldaps://' and disable this option." msgstr "To use SSL instead, use 'ldaps://' and disable this option." -#: -#: +#: +#: #~ msgid "Token" #~ msgstr "Token" @@ -5800,7 +5829,7 @@ msgstr "Unique identifier the token is referenced by." msgid "Unknown" msgstr "Unknown" -#: +#: #~ msgid "Unmanaged" #~ msgstr "Unmanaged" @@ -6077,8 +6106,8 @@ msgstr "User Property Mappings" #~ msgid "User Reputation" #~ msgstr "User Reputation" -#: -#: +#: +#: #~ msgid "User Settings" #~ msgstr "User Settings" @@ -6362,7 +6391,7 @@ msgstr "Web Certificate" msgid "WebAuthn Authenticators" msgstr "WebAuthn Authenticators" -#: +#: #~ msgid "WebAuthn Devices" #~ msgstr "WebAuthn Devices" @@ -6519,11 +6548,11 @@ msgstr "You're currently impersonating {0}. Click to stop." msgid "app1 running on app1.example.com" msgstr "app1 running on app1.example.com" -#: +#: #~ msgid "authentik Builtin Database" #~ msgstr "authentik Builtin Database" -#: +#: #~ msgid "authentik LDAP Backend" #~ msgstr "authentik LDAP Backend" diff --git a/web/src/locales/es.po b/web/src/locales/es.po index 6d14955b7..bad12d73e 100644 --- a/web/src/locales/es.po +++ b/web/src/locales/es.po @@ -20,14 +20,15 @@ msgstr "" #~ msgid "#/identity/users/{0}" #~ msgstr "#/identidad/usuarios/ {0}" -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/proxy/ProxyProviderForm.ts -#: src/pages/providers/saml/SAMLProviderForm.ts +#: src/elements/utils/TimeDeltaHelp.ts +#~ msgid "(Format: days=-1;minutes=-2;seconds=-3)." +#~ msgstr "" + +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=-1;minutes=-2;seconds=-3)." msgstr "(Formato: horas = -1; minutos = -2; segundos = -3)." -#: src/pages/stages/user_login/UserLoginStageForm.ts +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=1;minutes=2;seconds=3)." msgstr "(Formato: horas = 1; minutos = 2; segundos = 3)." @@ -445,8 +446,12 @@ msgid "Are you sure you want to update {0} \"{1}\"?" msgstr "¿Seguro que quieres actualizar {0} «{1}»?" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "La afirmación no es válida en o después de la hora actual + este valor (Formato: horas = 1; minutos = 2; segundos = 3)." +#~ msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "La afirmación no es válida en o después de la hora actual + este valor (Formato: horas = 1; minutos = 2; segundos = 3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Assertion not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Assertion valid not before" @@ -2487,6 +2492,10 @@ msgstr "Identificador" #~ msgid "Identity & Cryptography" #~ msgstr "Identidad y criptografía" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "If any of the devices user of the types selected above have been used within this duration, this stage will be skipped." +msgstr "" + #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." @@ -2762,6 +2771,10 @@ msgstr "Visto por última vez: {0}" msgid "Last sync: {0}" msgstr "Última sincronización: {0}" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "Last validation threshold" +msgstr "" + #: src/pages/applications/ApplicationViewPage.ts #: src/pages/applications/ApplicationViewPage.ts msgid "Launch" @@ -3483,8 +3496,12 @@ msgid "Objects created" msgstr "Objetos creados" #: src/pages/stages/consent/ConsentStageForm.ts -msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." -msgstr "Compensación después de la cual caduca el consentimiento. (Formato: horas = 1; minutos = 2; segundos = 3)." +msgid "Offset after which consent expires." +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts +#~ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Compensación después de la cual caduca el consentimiento. (Formato: horas = 1; minutos = 2; segundos = 3)." #: src/elements/events/ObjectChangelog.ts #: src/elements/events/UserEvents.ts @@ -4515,8 +4532,12 @@ msgid "Session duration" msgstr "Duración de la sesión" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "La sesión no es válida a partir de la hora actual + este valor (Formato: horas=1; minutos=2; segundos=3)." +#~ msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "La sesión no es válida a partir de la hora actual + este valor (Formato: horas=1; minutos=2; segundos=3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Session not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Session valid not on or after" @@ -5325,6 +5346,10 @@ msgstr "La URL externa en la que accederás a la aplicación. Incluya cualquier msgid "The external URL you'll authenticate at. The authentik core server should be reachable under this URL." msgstr "La URL externa en la que te autenticarás. Se debe poder acceder al servidor principal de authentik en esta URL." +#: src/elements/utils/TimeDeltaHelp.ts +msgid "The following keywords are supported:" +msgstr "" + #~ msgid "The following objects use {0}:" #~ msgstr "Los siguientes objetos usan {0}:" @@ -5434,8 +5459,12 @@ msgid "Time in minutes the token sent is valid." msgstr "El tiempo en minutos que se envía el token es válido." #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "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. (Format: hours=1;minutes=2;seconds=3)." -msgstr "Desplazamiento temporal en el que se deben eliminar los usuarios temporales. Esto solo se aplica si su IDP utiliza el formato NameID «transitorio» y el usuario no cierra sesión manualmente. (Formato: horas = 1; minutos = 2; segundos = 3)." +msgid "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." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts +#~ msgid "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. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Desplazamiento temporal en el que se deben eliminar los usuarios temporales. Esto solo se aplica si su IDP utiliza el formato NameID «transitorio» y el usuario no cierra sesión manualmente. (Formato: horas = 1; minutos = 2; segundos = 3)." #~ msgid "Time-based One-Time Passwords" #~ msgstr "Contraseñas únicas basadas en tiempo" diff --git a/web/src/locales/fr_FR.po b/web/src/locales/fr_FR.po index 5df1f5290..2749ccac4 100644 --- a/web/src/locales/fr_FR.po +++ b/web/src/locales/fr_FR.po @@ -19,18 +19,19 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: @lingui/cli\n" -#: +#: #~ msgid "#/identity/users/{0}" #~ msgstr "" -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/proxy/ProxyProviderForm.ts -#: src/pages/providers/saml/SAMLProviderForm.ts +#: src/elements/utils/TimeDeltaHelp.ts +#~ msgid "(Format: days=-1;minutes=-2;seconds=-3)." +#~ msgstr "" + +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=-1;minutes=-2;seconds=-3)." msgstr "(Format : heures=-1;minutes=-2;seconds=-3)" -#: src/pages/stages/user_login/UserLoginStageForm.ts +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=1;minutes=2;seconds=3)." msgstr "" @@ -449,8 +450,12 @@ msgid "Are you sure you want to update {0} \"{1}\"?" msgstr "Êtes-vous sûr de vouloir modifier {0} {1} ?" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "Assertion non valide après écoulement de ce délai (format : hours=1;minutes=2;seconds=3)" +#~ msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Assertion non valide après écoulement de ce délai (format : hours=1;minutes=2;seconds=3)" + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Assertion not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Assertion valid not before" @@ -500,7 +505,7 @@ msgstr "Attributs" msgid "Audience" msgstr "Audience" -#: +#: #~ msgid "Auth Type" #~ msgstr "" @@ -873,7 +878,7 @@ msgstr "" msgid "Check the logs" msgstr "" -#: +#: #~ msgid "Check your Emails for a password reset link." #~ msgstr "Vérifiez vos courriels pour un lien de récupération de mot de passe." @@ -1022,7 +1027,7 @@ msgstr "Flux de configuration" msgid "Configuration stages" msgstr "" -#: +#: #~ msgid "Configure WebAuthn" #~ msgstr "Configurer WebAuthn" @@ -1182,7 +1187,7 @@ msgstr "Domaine des cookies" msgid "Copy" msgstr "Copier" -#: +#: #~ msgid "Copy Key" #~ msgstr "Copier la clé" @@ -1384,7 +1389,7 @@ msgstr "Créer {0}" msgid "Created by" msgstr "Créé par" -#: +#: #~ msgid "Created {0}" #~ msgstr "Créé {0}" @@ -1394,7 +1399,7 @@ msgstr "Créé par" msgid "Creation Date" msgstr "Date de création" -#: +#: #~ msgid "Current plan cntext" #~ msgstr "Contexte du plan courant" @@ -1581,7 +1586,7 @@ msgstr "Classes d'équipement" msgid "Device classes which can be used to authenticate." msgstr "Classe d'équipement qui peut être utilisé pour s'authentifier" -#: +#: #~ msgid "Device name" #~ msgstr "Nom de l'équipement" @@ -1617,19 +1622,19 @@ msgstr "" #~ msgid "Disable" #~ msgstr "Désactiver" -#: +#: #~ msgid "Disable Duo authenticator" #~ msgstr "Désactiver l'authentificateur Duo" -#: +#: #~ msgid "Disable SMS authenticator" #~ msgstr "" -#: +#: #~ msgid "Disable Static Tokens" #~ msgstr "Désactiver les jetons statiques" -#: +#: #~ msgid "Disable Time-based OTP" #~ msgstr "Désactiver les OTP basés sur le temps" @@ -1683,7 +1688,7 @@ msgstr "En raison des limitations de protocole, ce certificat n'est utilisé que msgid "Dummy stage used for testing. Shows a simple continue button and always passes." msgstr "Étape factice utilisée pour les tests. Montre un simple bouton continuer et réussit toujours." -#: +#: #~ msgid "Duo" #~ msgstr "Duo" @@ -1797,11 +1802,11 @@ msgstr "L'avant poste intégré n'est pas configuré correctement" #~ msgid "Enable" #~ msgstr "Activer" -#: +#: #~ msgid "Enable Duo authenticator" #~ msgstr "Activer l'authentificateur Duo" -#: +#: #~ msgid "Enable SMS authenticator" #~ msgstr "" @@ -1809,11 +1814,11 @@ msgstr "L'avant poste intégré n'est pas configuré correctement" msgid "Enable StartTLS" msgstr "Activer StartTLS" -#: +#: #~ msgid "Enable Static Tokens" #~ msgstr "Activer les jetons statiques" -#: +#: #~ msgid "Enable TOTP" #~ msgstr "Activer TOTP" @@ -1877,7 +1882,7 @@ msgstr "Erreur lors de la validation de l'assertion sur le serveur : {err}" msgid "Error: unsupported source settings: {0}" msgstr "Erreur : paramètres source non supportés : {0}" -#: +#: #~ msgid "Error: unsupported stage settings: {0}" #~ msgstr "Erreur : paramètres d'étape non supporté : {0}" @@ -1932,7 +1937,7 @@ msgstr "Tout va bien." msgid "Exception" msgstr "Exception" -#: +#: #~ msgid "Execute" #~ msgstr "Exécuter" @@ -1944,7 +1949,7 @@ msgstr "Exception" msgid "Execute flow" msgstr "Exécuter le flux" -#: +#: #~ msgid "Execute with inspector" #~ msgstr "Exécuter avec inspection" @@ -2516,6 +2521,10 @@ msgstr "Identifiant" #~ msgid "Identity & Cryptography" #~ msgstr "Identité et chiffrement" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "If any of the devices user of the types selected above have been used within this duration, this stage will be skipped." +msgstr "" + #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." @@ -2793,6 +2802,10 @@ msgstr "Vu le : {0}" msgid "Last sync: {0}" msgstr "Dernière synchro : {0}" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "Last validation threshold" +msgstr "" + #: src/pages/applications/ApplicationViewPage.ts #: src/pages/applications/ApplicationViewPage.ts msgid "Launch" @@ -3517,8 +3530,12 @@ msgid "Objects created" msgstr "" #: src/pages/stages/consent/ConsentStageForm.ts -msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." -msgstr "Durée d'expiration du consentement (Format : hours=1;minutes=2;seconds=3)." +msgid "Offset after which consent expires." +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts +#~ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Durée d'expiration du consentement (Format : hours=1;minutes=2;seconds=3)." #: src/elements/events/ObjectChangelog.ts #: src/elements/events/UserEvents.ts @@ -3730,7 +3747,7 @@ msgstr "Mot de passe défini" msgid "Password stage" msgstr "Étape de mot de passe" -#: +#: #~ msgid "Password, 2FA, etc" #~ msgstr "Mot de passe, 2FA, etc" @@ -4397,7 +4414,7 @@ msgstr "Clé secrète" msgid "Secret was rotated" msgstr "" -#: +#: #~ msgid "Secret was rotation" #~ msgstr "Rotation du secret effectuée" @@ -4564,8 +4581,12 @@ msgid "Session duration" msgstr "Durée de la session" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "La session n'est plus valide à partir de l'heure actuelle + cette valeur (Format: hours=1;minutes=2;seconds=3)." +#~ msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "La session n'est plus valide à partir de l'heure actuelle + cette valeur (Format: hours=1;minutes=2;seconds=3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Session not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Session valid not on or after" @@ -4696,7 +4717,7 @@ msgstr "Une erreur s'est produite ! Veuillez réessayer plus tard." msgid "Source linked" msgstr "Source liée" -#: +#: #~ msgid "Source name" #~ msgstr "" @@ -4861,17 +4882,17 @@ msgstr "Refuser statiquement le flux. Pour utiliser cette étape efficacement, d msgid "Status" msgstr "Statut" -#: -#: -#: -#: +#: +#: +#: +#: #~ msgid "Status: Disabled" #~ msgstr "Statut : Désactivé" -#: -#: -#: -#: +#: +#: +#: +#: #~ msgid "Status: Enabled" #~ msgstr "Statut : Activé" @@ -5230,7 +5251,7 @@ msgstr "Requête suspecte" msgid "Symbol charset" msgstr "Set de symboles" -#: +#: #~ msgid "Sync" #~ msgstr "Synchroniser" @@ -5390,6 +5411,10 @@ msgstr "L'URL externe par laquelle vous accéderez à l'application. Incluez un msgid "The external URL you'll authenticate at. The authentik core server should be reachable under this URL." msgstr "" +#: src/elements/utils/TimeDeltaHelp.ts +msgid "The following keywords are supported:" +msgstr "" + #~ msgid "The following objects use {0}:" #~ msgstr "Les objets suivants utilisent {0} :" @@ -5490,10 +5515,14 @@ msgid "Time in minutes the token sent is valid." msgstr "Temps en minutes durant lequel le jeton envoyé est valide." #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "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. (Format: hours=1;minutes=2;seconds=3)." -msgstr "Délai de suppression des utilisateurs temporaires. Ceci s'applique uniquement si votre fournisseur d'identité utilise le format NameID transitoire ('transient') et que l'utilisateur ne se déconnecte pas manuellement. (Format : heures=1;minutes=2;secondes=3)." +msgid "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." +msgstr "" -#: +#: src/pages/sources/saml/SAMLSourceForm.ts +#~ msgid "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. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Délai de suppression des utilisateurs temporaires. Ceci s'applique uniquement si votre fournisseur d'identité utilise le format NameID transitoire ('transient') et que l'utilisateur ne se déconnecte pas manuellement. (Format : heures=1;minutes=2;secondes=3)." + +#: #~ msgid "Time-based One-Time Passwords" #~ msgstr "Mots de passe unique basés sur le temps" @@ -6291,7 +6320,7 @@ msgstr "" msgid "WebAuthn Authenticators" msgstr "Authentificateurs WebAuthn" -#: +#: #~ msgid "WebAuthn Devices" #~ msgstr "Équipements WebAuthn" diff --git a/web/src/locales/pl.po b/web/src/locales/pl.po index d9d253bd0..c93d8721a 100644 --- a/web/src/locales/pl.po +++ b/web/src/locales/pl.po @@ -20,14 +20,15 @@ msgstr "" #~ msgid "#/identity/users/{0}" #~ msgstr "#/identity/users/{0}" -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/proxy/ProxyProviderForm.ts -#: src/pages/providers/saml/SAMLProviderForm.ts +#: src/elements/utils/TimeDeltaHelp.ts +#~ msgid "(Format: days=-1;minutes=-2;seconds=-3)." +#~ msgstr "" + +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=-1;minutes=-2;seconds=-3)." msgstr "(Format: hours=-1;minutes=-2;seconds=-3)." -#: src/pages/stages/user_login/UserLoginStageForm.ts +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=1;minutes=2;seconds=3)." msgstr "(Format: hours=1;minutes=2;seconds=3)." @@ -445,8 +446,12 @@ msgid "Are you sure you want to update {0} \"{1}\"?" msgstr "Czy na pewno chcesz zaktualizować {0} \"{1}”?" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "Asercja nieważna w bieżącym lub późniejszym czasie + ta wartość (Format: hours=1;minutes=2;seconds=3)." +#~ msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Asercja nieważna w bieżącym lub późniejszym czasie + ta wartość (Format: hours=1;minutes=2;seconds=3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Assertion not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Assertion valid not before" @@ -2484,6 +2489,10 @@ msgstr "Identyfikator" #~ msgid "Identity & Cryptography" #~ msgstr "Tożsamość i Kryptografia" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "If any of the devices user of the types selected above have been used within this duration, this stage will be skipped." +msgstr "" + #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." @@ -2759,6 +2768,10 @@ msgstr "Ostatnio widziany: {0}" msgid "Last sync: {0}" msgstr "Ostatnia synchronizacja: {0}" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "Last validation threshold" +msgstr "" + #: src/pages/applications/ApplicationViewPage.ts #: src/pages/applications/ApplicationViewPage.ts msgid "Launch" @@ -3480,8 +3493,12 @@ msgid "Objects created" msgstr "Utworzone obiekty" #: src/pages/stages/consent/ConsentStageForm.ts -msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." -msgstr "Przesunięcie, po którym zgoda wygasa. (Format: hours=1;minutes=2;seconds=3)." +msgid "Offset after which consent expires." +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts +#~ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Przesunięcie, po którym zgoda wygasa. (Format: hours=1;minutes=2;seconds=3)." #: src/elements/events/ObjectChangelog.ts #: src/elements/events/UserEvents.ts @@ -4512,8 +4529,12 @@ msgid "Session duration" msgstr "Długość sesji" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "Sesja nieważna w bieżącym czasie lub później + ta wartość (Format: hours=1;minutes=2;seconds=3)." +#~ msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Sesja nieważna w bieżącym czasie lub później + ta wartość (Format: hours=1;minutes=2;seconds=3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Session not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Session valid not on or after" @@ -5322,6 +5343,10 @@ msgstr "Zewnętrzny adres URL, pod którym uzyskasz dostęp do aplikacji. Uwzgl msgid "The external URL you'll authenticate at. The authentik core server should be reachable under this URL." msgstr "Zewnętrzny adres URL, pod którym będziesz się uwierzytelniać. Jądro serwera authentik powinien być dostępny pod tym adresem URL." +#: src/elements/utils/TimeDeltaHelp.ts +msgid "The following keywords are supported:" +msgstr "" + #~ msgid "The following objects use {0}:" #~ msgstr "Następujące obiekty używają {0}:" @@ -5431,8 +5456,12 @@ msgid "Time in minutes the token sent is valid." msgstr "Czas w minutach, w którym wysłany token jest ważny." #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "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. (Format: hours=1;minutes=2;seconds=3)." -msgstr "Przesunięcie czasowe, kiedy użytkownicy tymczasowi powinni zostać usunięci. Ma to zastosowanie tylko wtedy, gdy IDP używa „przejściowego” formatu NameID, a użytkownik nie wylogowuje się ręcznie. (Format: hours=1;minutes=2;seconds=3)." +msgid "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." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts +#~ msgid "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. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Przesunięcie czasowe, kiedy użytkownicy tymczasowi powinni zostać usunięci. Ma to zastosowanie tylko wtedy, gdy IDP używa „przejściowego” formatu NameID, a użytkownik nie wylogowuje się ręcznie. (Format: hours=1;minutes=2;seconds=3)." #~ msgid "Time-based One-Time Passwords" #~ msgstr "Hasła jednorazowe oparte na czasie" diff --git a/web/src/locales/pseudo-LOCALE.po b/web/src/locales/pseudo-LOCALE.po index 83e994cb5..e1eaca2d0 100644 --- a/web/src/locales/pseudo-LOCALE.po +++ b/web/src/locales/pseudo-LOCALE.po @@ -13,18 +13,19 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: +#: #~ msgid "#/identity/users/{0}" #~ msgstr "" -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/proxy/ProxyProviderForm.ts -#: src/pages/providers/saml/SAMLProviderForm.ts +#: src/elements/utils/TimeDeltaHelp.ts +#~ msgid "(Format: days=-1;minutes=-2;seconds=-3)." +#~ msgstr "" + +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=-1;minutes=-2;seconds=-3)." msgstr "" -#: src/pages/stages/user_login/UserLoginStageForm.ts +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=1;minutes=2;seconds=3)." msgstr "" @@ -144,7 +145,7 @@ msgstr "" msgid "Access Key" msgstr "" -#: +#: #~ msgid "Access code validity" #~ msgstr "" @@ -440,7 +441,11 @@ msgid "Are you sure you want to update {0} \"{1}\"?" msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Assertion not valid on or after current time + this value." msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts @@ -491,7 +496,7 @@ msgstr "" msgid "Audience" msgstr "" -#: +#: #~ msgid "Auth Type" #~ msgstr "" @@ -534,7 +539,7 @@ msgstr "" msgid "Authorization" msgstr "" -#: +#: #~ msgid "Authorization Code" #~ msgstr "" @@ -694,7 +699,7 @@ msgstr "" msgid "Build hash:" msgstr "" -#: +#: #~ msgid "Build hash: {0}" #~ msgstr "" @@ -776,7 +781,7 @@ msgstr "" msgid "Certificate used to sign outgoing Responses going to the Service Provider." msgstr "" -#: +#: #~ msgid "Certificate-Key Pair" #~ msgstr "" @@ -867,7 +872,7 @@ msgstr "" msgid "Check the logs" msgstr "" -#: +#: #~ msgid "Check your Emails for a password reset link." #~ msgstr "" @@ -1014,11 +1019,11 @@ msgstr "" msgid "Configuration stages" msgstr "" -#: +#: #~ msgid "Configure WebAuthn" #~ msgstr "" -#: +#: #~ msgid "Configure how long access codes are valid for." #~ msgstr "" @@ -1054,8 +1059,8 @@ msgstr "" msgid "Configure how the outpost queries the core authentik server's users." msgstr "" -#: -#: +#: +#: #~ msgid "Configure settings relevant to your user profile." #~ msgstr "" @@ -1177,7 +1182,7 @@ msgstr "" msgid "Copy" msgstr "" -#: +#: #~ msgid "Copy Key" #~ msgstr "" @@ -1379,7 +1384,7 @@ msgstr "" msgid "Created by" msgstr "" -#: +#: #~ msgid "Created {0}" #~ msgstr "" @@ -1389,7 +1394,7 @@ msgstr "" msgid "Creation Date" msgstr "" -#: +#: #~ msgid "Current plan cntext" #~ msgstr "" @@ -1486,24 +1491,24 @@ msgstr "" msgid "Delete" msgstr "" -#: +#: #~ msgid "Delete Authorization Code" #~ msgstr "" -#: -#: +#: +#: #~ msgid "Delete Binding" #~ msgstr "" -#: +#: #~ msgid "Delete Consent" #~ msgstr "" -#: +#: #~ msgid "Delete Refresh Code" #~ msgstr "" -#: +#: #~ msgid "Delete Session" #~ msgstr "" @@ -1582,7 +1587,7 @@ msgstr "" msgid "Device classes which can be used to authenticate." msgstr "" -#: +#: #~ msgid "Device name" #~ msgstr "" @@ -1615,24 +1620,24 @@ msgstr "" msgid "Directory" msgstr "" -#: -#: +#: +#: #~ msgid "Disable" #~ msgstr "" -#: +#: #~ msgid "Disable Duo authenticator" #~ msgstr "" -#: +#: #~ msgid "Disable SMS authenticator" #~ msgstr "" -#: +#: #~ msgid "Disable Static Tokens" #~ msgstr "" -#: +#: #~ msgid "Disable Time-based OTP" #~ msgstr "" @@ -1686,7 +1691,7 @@ msgstr "" msgid "Dummy stage used for testing. Shows a simple continue button and always passes." msgstr "" -#: +#: #~ msgid "Duo" #~ msgstr "" @@ -1797,16 +1802,16 @@ msgstr "" msgid "Embedded outpost is not configured correctly." msgstr "" -#: -#: +#: +#: #~ msgid "Enable" #~ msgstr "" -#: +#: #~ msgid "Enable Duo authenticator" #~ msgstr "" -#: +#: #~ msgid "Enable SMS authenticator" #~ msgstr "" @@ -1814,11 +1819,11 @@ msgstr "" msgid "Enable StartTLS" msgstr "" -#: +#: #~ msgid "Enable Static Tokens" #~ msgstr "" -#: +#: #~ msgid "Enable TOTP" #~ msgstr "" @@ -1882,7 +1887,7 @@ msgstr "" msgid "Error: unsupported source settings: {0}" msgstr "" -#: +#: #~ msgid "Error: unsupported stage settings: {0}" #~ msgstr "" @@ -1937,7 +1942,7 @@ msgstr "" msgid "Exception" msgstr "" -#: +#: #~ msgid "Execute" #~ msgstr "" @@ -1949,7 +1954,7 @@ msgstr "" msgid "Execute flow" msgstr "" -#: +#: #~ msgid "Execute with inspector" #~ msgstr "" @@ -2124,7 +2129,7 @@ msgstr "" msgid "Field which contains a unique Identifier." msgstr "" -#: +#: #~ msgid "Field which contains members of a group." #~ msgstr "" @@ -2331,7 +2336,7 @@ msgstr "" msgid "Get this value from https://console.twilio.com" msgstr "" -#: +#: #~ msgid "Go to admin interface" #~ msgstr "" @@ -2343,7 +2348,7 @@ msgstr "" msgid "Go to previous page" msgstr "" -#: +#: #~ msgid "Go to user interface" #~ msgstr "" @@ -2524,6 +2529,10 @@ msgstr "" #~ msgid "Identity & Cryptography" #~ msgstr "" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "If any of the devices user of the types selected above have been used within this duration, this stage will be skipped." +msgstr "" + #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." @@ -2684,7 +2693,7 @@ msgstr "" msgid "Invalidation flow" msgstr "" -#: +#: #~ msgid "Invitation" #~ msgstr "" @@ -2802,6 +2811,10 @@ msgstr "" msgid "Last sync: {0}" msgstr "" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "Last validation threshold" +msgstr "" + #: src/pages/applications/ApplicationViewPage.ts #: src/pages/applications/ApplicationViewPage.ts msgid "Launch" @@ -2815,7 +2828,7 @@ msgstr "" msgid "Let the user identify themselves with their username or Email address." msgstr "" -#: +#: #~ msgid "Library" #~ msgstr "" @@ -3125,7 +3138,7 @@ msgstr "" msgid "Model updated" msgstr "" -#: +#: #~ msgid "Monitor" #~ msgstr "" @@ -3460,7 +3473,7 @@ msgstr "" msgid "Notification Transports" msgstr "" -#: +#: #~ msgid "Notification rule" #~ msgstr "" @@ -3480,7 +3493,7 @@ msgstr "" msgid "Notifications" msgstr "" -#: +#: #~ msgid "Notifications Transport" #~ msgstr "" @@ -3530,9 +3543,13 @@ msgid "Objects created" msgstr "" #: src/pages/stages/consent/ConsentStageForm.ts -msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +msgid "Offset after which consent expires." msgstr "" +#: src/pages/stages/consent/ConsentStageForm.ts +#~ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "" + #: src/elements/events/ObjectChangelog.ts #: src/elements/events/UserEvents.ts #: src/pages/events/EventListPage.ts @@ -3551,7 +3568,7 @@ msgstr "" msgid "Open API Browser" msgstr "" -#: +#: #~ msgid "Open application" #~ msgstr "" @@ -3633,7 +3650,7 @@ msgstr "" msgid "Outdated outposts" msgstr "" -#: +#: #~ msgid "Outpost" #~ msgstr "" @@ -3645,11 +3662,11 @@ msgstr "" msgid "Outpost Integrations" msgstr "" -#: +#: #~ msgid "Outpost Service-connection" #~ msgstr "" -#: +#: #~ msgid "Outpost integration" #~ msgstr "" @@ -3747,7 +3764,7 @@ msgstr "" msgid "Password stage" msgstr "" -#: +#: #~ msgid "Password, 2FA, etc" #~ msgstr "" @@ -3823,7 +3840,7 @@ msgstr "" msgid "Policy Bindings" msgstr "" -#: +#: #~ msgid "Policy binding" #~ msgstr "" @@ -3911,7 +3928,7 @@ msgstr "" msgid "Profile URL" msgstr "" -#: +#: #~ msgid "Prompt" #~ msgstr "" @@ -3928,7 +3945,7 @@ msgstr "" msgid "Prompts" msgstr "" -#: +#: #~ msgid "Property Mapping" #~ msgstr "" @@ -3987,7 +4004,7 @@ msgstr "" msgid "Provider Type" msgstr "" -#: +#: #~ msgid "Provider type" #~ msgstr "" @@ -4130,7 +4147,7 @@ msgstr "" msgid "Refresh" msgstr "" -#: +#: #~ msgid "Refresh Code" #~ msgstr "" @@ -4248,7 +4265,7 @@ msgstr "" msgid "Retry" msgstr "" -#: +#: #~ msgid "Retry Task" #~ msgstr "" @@ -4416,7 +4433,7 @@ msgstr "" msgid "Secret was rotated" msgstr "" -#: +#: #~ msgid "Secret was rotation" #~ msgstr "" @@ -4456,7 +4473,7 @@ msgstr "" msgid "Select an enrollment flow" msgstr "" -#: +#: #~ msgid "Select an identification method." #~ msgstr "" @@ -4505,7 +4522,7 @@ msgstr "" msgid "Selected policies are executed when the stage is submitted to validate the data." msgstr "" -#: +#: #~ msgid "Selecting a service-connection enables the management of the outpost by authentik." #~ msgstr "" @@ -4556,7 +4573,7 @@ msgstr "" msgid "Server and client are further than 5 seconds apart." msgstr "" -#: +#: #~ msgid "Server name for which this provider's certificate is valid for." #~ msgstr "" @@ -4564,7 +4581,7 @@ msgstr "" msgid "Server validation of credential failed: {err}" msgstr "" -#: +#: #~ msgid "Service Connections" #~ msgstr "" @@ -4572,12 +4589,12 @@ msgstr "" msgid "Service Provider Binding" msgstr "" -#: -#: +#: +#: #~ msgid "Service connection" #~ msgstr "" -#: +#: #~ msgid "Session" #~ msgstr "" @@ -4590,7 +4607,11 @@ msgid "Session duration" msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Session not valid on or after current time + this value." msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts @@ -4715,7 +4736,7 @@ msgstr "" msgid "Something went wrong! Please try again later." msgstr "" -#: +#: #~ msgid "Source" #~ msgstr "" @@ -4723,7 +4744,7 @@ msgstr "" msgid "Source linked" msgstr "" -#: +#: #~ msgid "Source name" #~ msgstr "" @@ -4740,7 +4761,7 @@ msgstr "" msgid "Sources" msgstr "" -#: +#: #~ msgid "Sources of identities, which can either be synced into authentik's database, like LDAP, or can be used by users to authenticate and enroll themselves, like OAuth and social logins" #~ msgstr "" @@ -4769,7 +4790,7 @@ msgstr "" msgid "Stage Configuration" msgstr "" -#: +#: #~ msgid "Stage binding" #~ msgstr "" @@ -4890,17 +4911,17 @@ msgstr "" msgid "Status" msgstr "" -#: -#: -#: -#: +#: +#: +#: +#: #~ msgid "Status: Disabled" #~ msgstr "" -#: -#: -#: -#: +#: +#: +#: +#: #~ msgid "Status: Enabled" #~ msgstr "" @@ -5012,8 +5033,8 @@ msgstr "" msgid "Successfully created rule." msgstr "" -#: -#: +#: +#: #~ msgid "Successfully created service-connection." #~ msgstr "" @@ -5179,8 +5200,8 @@ msgstr "" msgid "Successfully updated rule." msgstr "" -#: -#: +#: +#: #~ msgid "Successfully updated service-connection." #~ msgstr "" @@ -5263,7 +5284,7 @@ msgstr "" msgid "Symbol charset" msgstr "" -#: +#: #~ msgid "Sync" #~ msgstr "" @@ -5271,7 +5292,7 @@ msgstr "" msgid "Sync groups" msgstr "" -#: +#: #~ msgid "Sync parent group" #~ msgstr "" @@ -5316,7 +5337,7 @@ msgstr "" msgid "TLS Authentication Certificate/SSH Keypair" msgstr "" -#: +#: #~ msgid "TLS Server name" #~ msgstr "" @@ -5425,7 +5446,11 @@ msgstr "" msgid "The external URL you'll authenticate at. The authentik core server should be reachable under this URL." msgstr "" -#: +#: src/elements/utils/TimeDeltaHelp.ts +msgid "The following keywords are supported:" +msgstr "" + +#: #~ msgid "The following objects use {0}:" #~ msgstr "" @@ -5526,10 +5551,14 @@ msgid "Time in minutes the token sent is valid." msgstr "" #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "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. (Format: hours=1;minutes=2;seconds=3)." +msgid "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." msgstr "" -#: +#: src/pages/sources/saml/SAMLSourceForm.ts +#~ msgid "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. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "" + +#: #~ msgid "Time-based One-Time Passwords" #~ msgstr "" @@ -5569,8 +5598,8 @@ msgstr "" msgid "To use SSL instead, use 'ldaps://' and disable this option." msgstr "" -#: -#: +#: +#: #~ msgid "Token" #~ msgstr "" @@ -5770,7 +5799,7 @@ msgstr "" msgid "Unknown" msgstr "" -#: +#: #~ msgid "Unmanaged" #~ msgstr "" @@ -6047,8 +6076,8 @@ msgstr "" #~ msgid "User Reputation" #~ msgstr "" -#: -#: +#: +#: #~ msgid "User Settings" #~ msgstr "" @@ -6332,7 +6361,7 @@ msgstr "" msgid "WebAuthn Authenticators" msgstr "" -#: +#: #~ msgid "WebAuthn Devices" #~ msgstr "" @@ -6485,11 +6514,11 @@ msgstr "" msgid "app1 running on app1.example.com" msgstr "" -#: +#: #~ msgid "authentik Builtin Database" #~ msgstr "" -#: +#: #~ msgid "authentik LDAP Backend" #~ msgstr "" diff --git a/web/src/locales/tr.po b/web/src/locales/tr.po index 926ad2943..217c0b9b4 100644 --- a/web/src/locales/tr.po +++ b/web/src/locales/tr.po @@ -20,14 +20,15 @@ msgstr "" #~ msgid "#/identity/users/{0}" #~ msgstr "#/kimlik/kullanıcılar/ {0}" -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/proxy/ProxyProviderForm.ts -#: src/pages/providers/saml/SAMLProviderForm.ts +#: src/elements/utils/TimeDeltaHelp.ts +#~ msgid "(Format: days=-1;minutes=-2;seconds=-3)." +#~ msgstr "" + +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=-1;minutes=-2;seconds=-3)." msgstr "(Biçim: saat=-1; dakika=-2; ikincil=-3)." -#: src/pages/stages/user_login/UserLoginStageForm.ts +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=1;minutes=2;seconds=3)." msgstr "(Biçim: saat=1; dakika=2; saniye= 3)." @@ -445,8 +446,12 @@ msgid "Are you sure you want to update {0} \"{1}\"?" msgstr "{0} “{1}” güncellemesini istediğinizden emin misiniz?" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "Onay işlemi geçerli saat+bu değerden sonra geçerli değil (Biçim: hours=1; Dakika=2; ikinci=3)." +#~ msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Onay işlemi geçerli saat+bu değerden sonra geçerli değil (Biçim: hours=1; Dakika=2; ikinci=3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Assertion not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Assertion valid not before" @@ -2487,6 +2492,10 @@ msgstr "Tanımlayıcı" #~ msgid "Identity & Cryptography" #~ msgstr "Kimlik ve Kriptografi" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "If any of the devices user of the types selected above have been used within this duration, this stage will be skipped." +msgstr "" + #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." @@ -2763,6 +2772,10 @@ msgstr "Son görüldü: {0}" msgid "Last sync: {0}" msgstr "Son senkronizasyon: {0}" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "Last validation threshold" +msgstr "" + #: src/pages/applications/ApplicationViewPage.ts #: src/pages/applications/ApplicationViewPage.ts msgid "Launch" @@ -3485,8 +3498,12 @@ msgid "Objects created" msgstr "Oluşturulan nesneler" #: src/pages/stages/consent/ConsentStageForm.ts -msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." -msgstr "Onay sona erdikten sonra ofset. (Biçim: saat=1; dakika=2; saniye/= 3)." +msgid "Offset after which consent expires." +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts +#~ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Onay sona erdikten sonra ofset. (Biçim: saat=1; dakika=2; saniye/= 3)." #: src/elements/events/ObjectChangelog.ts #: src/elements/events/UserEvents.ts @@ -4517,8 +4534,12 @@ msgid "Session duration" msgstr "Oturum süresi" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "Oturum geçerli saat+bu değerden sonra geçerli değil (Biçim: hours=1; Dakika=2; ikinci=3)." +#~ msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Oturum geçerli saat+bu değerden sonra geçerli değil (Biçim: hours=1; Dakika=2; ikinci=3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Session not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Session valid not on or after" @@ -5327,6 +5348,10 @@ msgstr "Uygulamaya erişeceğiniz harici URL. Standart olmayan herhangi bir bağ msgid "The external URL you'll authenticate at. The authentik core server should be reachable under this URL." msgstr "Kimlik doğrulayacağınız harici URL. Auentik çekirdek sunucusuna bu URL altında erişilebilir olmalıdır." +#: src/elements/utils/TimeDeltaHelp.ts +msgid "The following keywords are supported:" +msgstr "" + #~ msgid "The following objects use {0}:" #~ msgstr "Aşağıdaki nesneler {0} kullanır:" @@ -5436,8 +5461,12 @@ msgid "Time in minutes the token sent is valid." msgstr "Gönderilen belirtecin dakika cinsinden geçerlilik süresi." #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "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. (Format: hours=1;minutes=2;seconds=3)." -msgstr "Geçici kullanıcıların silinmesi gerektiğinde zaman uzaklığı. Bu yalnızca IDP'niz NameID Biçimi 'geçici' kullanıyorsa ve kullanıcı el ile oturumu kapatmazsa geçerlidir. (Biçim: saat=1; dakika=2; saniye/= 3)." +msgid "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." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts +#~ msgid "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. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "Geçici kullanıcıların silinmesi gerektiğinde zaman uzaklığı. Bu yalnızca IDP'niz NameID Biçimi 'geçici' kullanıyorsa ve kullanıcı el ile oturumu kapatmazsa geçerlidir. (Biçim: saat=1; dakika=2; saniye/= 3)." #~ msgid "Time-based One-Time Passwords" #~ msgstr "Zaman Tabanlı Tek seferlik Parolalar" diff --git a/web/src/locales/zh-Hans.po b/web/src/locales/zh-Hans.po index 06f8ca8c3..c7b10fcf3 100644 --- a/web/src/locales/zh-Hans.po +++ b/web/src/locales/zh-Hans.po @@ -1,9 +1,9 @@ -# +# # Translators: # Chen Zhikai, 2022 # 刘松, 2022 # deluxghost, 2022 -# +# msgid "" msgstr "" "Project-Id-Version: \n" @@ -22,23 +22,27 @@ msgstr "" #~ msgid "#/identity/users/{0}" #~ msgstr "#/identity/users/{0}" -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/proxy/ProxyProviderForm.ts -#: src/pages/providers/saml/SAMLProviderForm.ts +#: src/elements/utils/TimeDeltaHelp.ts +#~ msgid "(Format: days=-1;minutes=-2;seconds=-3)." +#~ msgstr "" + +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=-1;minutes=-2;seconds=-3)." msgstr "(格式:hours=-1;minutes=-2;seconds=-3)。" -#: src/pages/stages/user_login/UserLoginStageForm.ts +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=1;minutes=2;seconds=3)." msgstr "(格式:hours=1;minutes=2;seconds=3)。" -#: src/elements/events/ObjectChangelog.ts src/elements/events/UserEvents.ts +#: src/elements/events/ObjectChangelog.ts +#: src/elements/events/UserEvents.ts #: src/elements/user/SessionList.ts #: src/pages/applications/ApplicationListPage.ts #: src/pages/applications/ApplicationListPage.ts -#: src/pages/events/EventListPage.ts src/pages/events/EventListPage.ts -#: src/pages/groups/GroupListPage.ts src/pages/groups/MemberSelectModal.ts +#: src/pages/events/EventListPage.ts +#: src/pages/events/EventListPage.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/groups/MemberSelectModal.ts #: src/pages/groups/RelatedGroupList.ts #: src/pages/policies/BoundPoliciesList.ts #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts @@ -48,16 +52,15 @@ msgstr "(格式:hours=1;minutes=2;seconds=3)。" #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts #: src/pages/stages/invitation/InvitationListPage.ts -#: src/pages/tokens/TokenListPage.ts src/pages/users/RelatedUserList.ts +#: src/pages/tokens/TokenListPage.ts +#: src/pages/users/RelatedUserList.ts #: src/pages/users/UserListPage.ts #: src/user/user-settings/tokens/UserTokenList.ts msgid "-" msgstr "-" #: src/pages/flows/FlowImportForm.ts -msgid "" -".akflow files, which can be found on goauthentik.io and can be exported by " -"authentik." +msgid ".akflow files, which can be found on goauthentik.io and can be exported by authentik." msgstr ".akflow 文件,可以在 goauthentik.io 上找到,也可以通过 authentik 导出。" #: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts @@ -85,9 +88,7 @@ msgid "A non-removable authenticator, like TouchID or Windows Hello" msgstr "不可移除的身份验证器,例如 TouchID 或 Windows Hello" #: src/pages/policies/dummy/DummyPolicyForm.ts -msgid "" -"A policy used for testing. Always returns the same result as specified below" -" after waiting a random duration." +msgid "A policy used for testing. Always returns the same result as specified below after waiting a random duration." msgstr "用于测试的策略。等待随机时长后,始终返回下面指定的结果。" #: src/pages/providers/saml/SAMLProviderForm.ts @@ -95,7 +96,8 @@ msgstr "用于测试的策略。等待随机时长后,始终返回下面指定 msgid "ACS URL" msgstr "ACS URL" -#: src/pages/applications/ApplicationForm.ts src/pages/flows/FlowForm.ts +#: src/pages/applications/ApplicationForm.ts +#: src/pages/flows/FlowForm.ts msgid "ALL, all policies must match to grant access." msgstr "ALL,必须匹配所有策略才能授予访问权限。" @@ -103,7 +105,8 @@ msgstr "ALL,必须匹配所有策略才能授予访问权限。" msgid "ALL, all policies must match to include this stage access." msgstr "ALL,必须匹配所有策略才能包含此阶段访问权限。" -#: src/pages/applications/ApplicationForm.ts src/pages/flows/FlowForm.ts +#: src/pages/applications/ApplicationForm.ts +#: src/pages/flows/FlowForm.ts msgid "ANY, any policy must match to grant access." msgstr "ANY,必须匹配任意策略才能授予访问权限。" @@ -158,7 +161,8 @@ msgstr "访问令牌 URL" msgid "Access token validity" msgstr "访问令牌有效性" -#: src/elements/events/ObjectChangelog.ts src/elements/events/UserEvents.ts +#: src/elements/events/ObjectChangelog.ts +#: src/elements/events/UserEvents.ts #: src/pages/events/EventListPage.ts #: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts msgid "Action" @@ -166,20 +170,27 @@ msgstr "操作" #: src/pages/applications/ApplicationListPage.ts #: src/pages/crypto/CertificateKeyPairListPage.ts -#: src/pages/events/EventListPage.ts src/pages/events/RuleListPage.ts -#: src/pages/events/TransportListPage.ts src/pages/flows/BoundStagesList.ts -#: src/pages/flows/FlowListPage.ts src/pages/groups/GroupListPage.ts -#: src/pages/groups/RelatedGroupList.ts src/pages/outposts/OutpostListPage.ts +#: src/pages/events/EventListPage.ts +#: src/pages/events/RuleListPage.ts +#: src/pages/events/TransportListPage.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/groups/RelatedGroupList.ts +#: src/pages/outposts/OutpostListPage.ts #: src/pages/outposts/ServiceConnectionListPage.ts #: src/pages/policies/BoundPoliciesList.ts #: src/pages/policies/PolicyListPage.ts #: src/pages/property-mappings/PropertyMappingListPage.ts -#: src/pages/providers/ProviderListPage.ts src/pages/stages/StageListPage.ts +#: src/pages/providers/ProviderListPage.ts +#: src/pages/stages/StageListPage.ts #: src/pages/stages/invitation/InvitationListPage.ts #: src/pages/stages/prompt/PromptListPage.ts #: src/pages/system-tasks/SystemTaskListPage.ts -#: src/pages/tenants/TenantListPage.ts src/pages/tokens/TokenListPage.ts -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/tenants/TenantListPage.ts +#: src/pages/tokens/TokenListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Actions" msgstr "操作" @@ -187,7 +198,8 @@ msgstr "操作" msgid "Actions over the last 24 hours" msgstr "过去 24 小时内的操作" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts #: src/pages/users/UserViewPage.ts msgid "Activate" msgstr "激活" @@ -196,13 +208,17 @@ msgstr "激活" msgid "Activate pending user on success" msgstr "成功时激活待处理用户" -#: src/pages/groups/MemberSelectModal.ts src/pages/users/RelatedUserList.ts -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts -#: src/pages/users/UserListPage.ts src/pages/users/UserViewPage.ts +#: src/pages/groups/MemberSelectModal.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts +#: src/pages/users/UserListPage.ts +#: src/pages/users/UserViewPage.ts msgid "Active" msgstr "激活" -#: src/pages/groups/MemberSelectModal.ts src/pages/users/GroupSelectModal.ts +#: src/pages/groups/MemberSelectModal.ts +#: src/pages/users/GroupSelectModal.ts msgid "Add" msgstr "添加" @@ -250,8 +266,7 @@ msgid "Additional scope mappings, which are passed to the proxy." msgstr "传递给代理的额外作用域映射。" #: src/pages/sources/oauth/OAuthSourceForm.ts -msgid "" -"Additional scopes to be passed to the OAuth Provider, separated by space." +msgid "Additional scopes to be passed to the OAuth Provider, separated by space." msgstr "要传递给 OAuth 提供商的额外作用域,用空格分隔。" #: src/pages/sources/ldap/LDAPSourceForm.ts @@ -297,8 +312,7 @@ msgid "Allow IDP-initiated logins" msgstr "允许 IDP 发起的登录" #: src/pages/sources/plex/PlexSourceForm.ts -msgid "" -"Allow friends to authenticate via Plex, even if you don't share any servers" +msgid "Allow friends to authenticate via Plex, even if you don't share any servers" msgstr "允许好友通过 Plex 进行身份验证,即使您不共享任何服务器。" #: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts @@ -306,9 +320,7 @@ msgid "Allow up to N occurrences in the HIBP database." msgstr "HIBP 数据库中最多允许 N 次出现。" #: src/pages/policies/PolicyListPage.ts -msgid "" -"Allow users to use Applications based on properties, enforce Password " -"Criteria and selectively apply Stages." +msgid "Allow users to use Applications based on properties, enforce Password Criteria and selectively apply Stages." msgstr "允许用户根据属性使用应用程序、强制使用密码标准以及选择性地应用阶段。" #: src/pages/providers/proxy/ProxyProviderViewPage.ts @@ -324,9 +336,7 @@ msgid "Allowed servers" msgstr "允许的服务器" #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "" -"Allows authentication flows initiated by the IdP. This can be a security " -"risk, as no validation of the request ID is done." +msgid "Allows authentication flows initiated by the IdP. This can be a security risk, as no validation of the request ID is done." msgstr "允许由 IdP 启动的身份验证流程。这可能存在安全风险,因为未对请求 ID 进行验证。" #: src/pages/policies/reputation/ReputationPolicyForm.ts @@ -338,8 +348,7 @@ msgid "Also known as Entity ID. Defaults the Metadata URL." msgstr "也称为 Entity ID。 默认为元数据 URL。" #: src/flows/stages/authenticator_duo/AuthenticatorDuoStage.ts -msgid "" -"Alternatively, if your current device has Duo installed, click on this link:" +msgid "Alternatively, if your current device has Duo installed, click on this link:" msgstr "或者,如果您当前的设备已安装 Duo,请点击此链接:" #: src/pages/stages/consent/ConsentStageForm.ts @@ -398,7 +407,8 @@ msgstr "应用的显示名称。" msgid "Application(s)" msgstr "应用程序" -#: src/interfaces/AdminInterface.ts src/interfaces/AdminInterface.ts +#: src/interfaces/AdminInterface.ts +#: src/interfaces/AdminInterface.ts #: src/pages/applications/ApplicationListPage.ts #: src/pages/outposts/OutpostForm.ts msgid "Applications" @@ -437,10 +447,12 @@ msgid "Are you sure you want to update {0} \"{1}\"?" msgstr "您确定要更新 {0} \"{1}\" 吗?" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "" -"Assertion not valid on or after current time + this value (Format: " -"hours=1;minutes=2;seconds=3)." -msgstr "从当前时间经过多久时或之后,断言无效(格式:hours=1;minutes=2;seconds=3)。" +#~ msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "从当前时间经过多久时或之后,断言无效(格式:hours=1;minutes=2;seconds=3)。" + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Assertion not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Assertion valid not before" @@ -474,16 +486,13 @@ msgid "Attempted to log in as {0}" msgstr "已尝试以 {0} 身份登录" #: src/pages/property-mappings/PropertyMappingSAMLForm.ts -msgid "" -"Attribute name used for SAML Assertions. Can be a URN OID, a schema " -"reference, or a any other string. If this property mapping is used for " -"NameID Property, this field is discarded." -msgstr "" -"用于 SAML 断言的属性名称。可以是 URN OID、Schema Reference 或任何其他字符串。如果此属性映射用于 NameID " -"属性,则会丢弃此字段。" +msgid "Attribute name used for SAML Assertions. Can be a URN OID, a schema reference, or a any other string. If this property mapping is used for NameID Property, this field is discarded." +msgstr "用于 SAML 断言的属性名称。可以是 URN OID、Schema Reference 或任何其他字符串。如果此属性映射用于 NameID 属性,则会丢弃此字段。" -#: src/pages/groups/GroupForm.ts src/pages/stages/invitation/InvitationForm.ts -#: src/pages/tenants/TenantForm.ts src/pages/users/UserForm.ts +#: src/pages/groups/GroupForm.ts +#: src/pages/stages/invitation/InvitationForm.ts +#: src/pages/tenants/TenantForm.ts +#: src/pages/users/UserForm.ts msgid "Attributes" msgstr "属性" @@ -517,7 +526,8 @@ msgstr "身份验证 URL" #: src/pages/sources/oauth/OAuthSourceForm.ts #: src/pages/sources/plex/PlexSourceForm.ts -#: src/pages/sources/saml/SAMLSourceForm.ts src/pages/tenants/TenantForm.ts +#: src/pages/sources/saml/SAMLSourceForm.ts +#: src/pages/tenants/TenantForm.ts msgid "Authentication flow" msgstr "身份验证流程" @@ -579,7 +589,8 @@ msgstr "返回" msgid "Backends" msgstr "后端" -#: src/pages/flows/FlowForm.ts src/pages/flows/FlowForm.ts +#: src/pages/flows/FlowForm.ts +#: src/pages/flows/FlowForm.ts msgid "Background" msgstr "背景" @@ -587,7 +598,8 @@ msgstr "背景" msgid "Background image" msgstr "背景图片" -#: src/pages/flows/FlowForm.ts src/pages/flows/FlowForm.ts +#: src/pages/flows/FlowForm.ts +#: src/pages/flows/FlowForm.ts msgid "Background shown during execution." msgstr "执行过程中显示的背景。" @@ -616,9 +628,7 @@ msgid "Based on the User's Email. This is recommended over the UPN method." msgstr "基于用户的电子邮箱。建议在 UPN 方法上使用。" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts -msgid "" -"Based on the User's UPN, only works if user has a 'upn' attribute set. Use " -"this method only if you have different UPN and Mail domains." +msgid "Based on the User's UPN, only works if user has a 'upn' attribute set. Use this method only if you have different UPN and Mail domains." msgstr "基于用户的 UPN,仅当用户设置了 'upn' 属性时才有效。仅当您有不同的 UPN 和 Mail 域时才使用此方法。" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts @@ -658,11 +668,13 @@ msgstr "Bind 流程" msgid "Bind mode" msgstr "绑定模式" -#: src/pages/flows/BoundStagesList.ts src/pages/flows/BoundStagesList.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/flows/BoundStagesList.ts msgid "Bind stage" msgstr "绑定阶段" -#: src/pages/events/EventInfo.ts src/pages/events/EventInfo.ts +#: src/pages/events/EventInfo.ts +#: src/pages/events/EventInfo.ts msgid "Binding" msgstr "绑定" @@ -689,26 +701,21 @@ msgstr "构建哈希:" #~ msgid "Build hash: {0}" #~ msgstr "构建哈希:{0}" -#: src/pages/sources/SourceListPage.ts src/pages/sources/SourceListPage.ts +#: src/pages/sources/SourceListPage.ts +#: src/pages/sources/SourceListPage.ts msgid "Built-in" msgstr "内置" #: src/pages/stages/identification/IdentificationStageForm.ts -msgid "" -"By default, only icons are shown for sources. Enable this to show their full" -" names." +msgid "By default, only icons are shown for sources. Enable this to show their full names." msgstr "默认情况下,只为源显示图标。启用此选项可显示它们的全名。" #: src/pages/outposts/ServiceConnectionDockerForm.ts -msgid "" -"CA which the endpoint's Certificate is verified against. Can be left empty " -"for no validation." +msgid "CA which the endpoint's Certificate is verified against. Can be left empty for no validation." msgstr "验证端点证书所依据的 CA。可以留空,表示不进行验证。" #: src/pages/providers/ldap/LDAPProviderForm.ts -msgid "" -"Cached binding, flow is executed and session is cached in memory. Flow is " -"executed when session expires." +msgid "Cached binding, flow is executed and session is cached in memory. Flow is executed when session expires." msgstr "缓存绑定,流程与会话会在内存中执行与缓存。会话过期时执行流程。" #: src/pages/admin-overview/charts/FlowStatusChart.ts @@ -720,33 +727,28 @@ msgid "Cached policies" msgstr "缓存策略" #: src/pages/providers/ldap/LDAPProviderForm.ts -msgid "" -"Cached querying, the outpost holds all users and groups in-memory and will " -"refresh every 5 Minutes." +msgid "Cached querying, the outpost holds all users and groups in-memory and will refresh every 5 Minutes." msgstr "缓存查询,前哨将所有用户和组保存在内存中,并每 5 分钟刷新一次。" #: src/pages/sources/oauth/OAuthSourceViewPage.ts msgid "Callback URL" msgstr "回调 URL" -#~ msgid "" -#~ "Can be in the format of 'unix://' when connecting to a local docker daemon, " -#~ "or 'https://:2376' when connecting to a remote system." +#~ 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 "连接到本地 Docker 守护进程时可以采用 'unix://' 格式,或者在连接到远程系统时采用 'https://:2376' 格式。" #: src/pages/outposts/ServiceConnectionDockerForm.ts -msgid "" -"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." -msgstr "" -"连接到本地 Docker 守护进程时可以采用 'unix://' 格式,通过 SSH 连接时采用 'ssh://' 格式,或者在连接到远程系统时采用 " -"'https://:2376' 格式。" +msgid "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." +msgstr "连接到本地 Docker 守护进程时可以采用 'unix://' 格式,通过 SSH 连接时采用 'ssh://' 格式,或者在连接到远程系统时采用 'https://:2376' 格式。" -#: src/elements/forms/ConfirmationForm.ts src/elements/forms/DeleteBulkForm.ts -#: src/elements/forms/DeleteForm.ts src/elements/forms/ModalForm.ts -#: src/elements/wizard/Wizard.ts src/pages/groups/MemberSelectModal.ts -#: src/pages/users/GroupSelectModal.ts src/pages/users/UserActiveForm.ts +#: src/elements/forms/ConfirmationForm.ts +#: src/elements/forms/DeleteBulkForm.ts +#: src/elements/forms/DeleteForm.ts +#: src/elements/forms/ModalForm.ts +#: src/elements/wizard/Wizard.ts +#: src/pages/groups/MemberSelectModal.ts +#: src/pages/users/GroupSelectModal.ts +#: src/pages/users/UserActiveForm.ts msgid "Cancel" msgstr "取消" @@ -773,8 +775,7 @@ msgid "Certificate Subject" msgstr "证书主题" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "" -"Certificate used to sign outgoing Responses going to the Service Provider." +msgid "Certificate used to sign outgoing Responses going to the Service Provider." msgstr "证书,用于签署发送给服务提供程序的传出响应。" #~ msgid "Certificate-Key Pair" @@ -789,9 +790,7 @@ msgid "Certificate-Key Pairs" msgstr "证书密钥对" #: src/pages/outposts/ServiceConnectionDockerForm.ts -msgid "" -"Certificate/Key used for authentication. Can be left empty for no " -"authentication." +msgid "Certificate/Key used for authentication. Can be left empty for no authentication." msgstr "用于身份验证的证书/密钥。可以留空表示不验证。" #: src/interfaces/AdminInterface.ts @@ -802,7 +801,8 @@ msgstr "证书" msgid "Change password" msgstr "更改密码" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Change status" msgstr "更改状态" @@ -811,7 +811,8 @@ msgid "Change your password" msgstr "更改您的密码" #: src/pages/applications/ApplicationViewPage.ts -#: src/pages/flows/FlowViewPage.ts src/pages/groups/GroupViewPage.ts +#: src/pages/flows/FlowViewPage.ts +#: src/pages/groups/GroupViewPage.ts #: src/pages/providers/ProviderViewPage.ts #: src/pages/sources/ldap/LDAPSourceViewPage.ts #: src/pages/sources/oauth/OAuthSourceViewPage.ts @@ -888,15 +889,11 @@ msgstr "" "请注意,只有一部分密码哈希值被发送,完整的比较是在客户端完成的。" #: src/pages/policies/expiry/ExpiryPolicyForm.ts -msgid "" -"Checks if the request's user's password has been changed in the last x days," -" and denys based on settings." +msgid "Checks if the request's user's password has been changed in the last x days, and denys based on settings." msgstr "检查过去 x 天内请求的用户密码是否已更改,并根据设置拒绝。" #: src/pages/policies/password/PasswordPolicyForm.ts -msgid "" -"Checks the value from the policy request against several rules, mostly used " -"to ensure password strength." +msgid "Checks the value from the policy request against several rules, mostly used to ensure password strength." msgstr "根据多条规则检查策略请求中的值,这些规则主要用于确保密码强度。" #: src/interfaces/locale.ts @@ -924,8 +921,10 @@ msgstr "全部清除" msgid "Clear background image" msgstr "清除背景图片" -#: src/pages/flows/FlowListPage.ts src/pages/flows/FlowListPage.ts -#: src/pages/policies/PolicyListPage.ts src/pages/policies/PolicyListPage.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/policies/PolicyListPage.ts +#: src/pages/policies/PolicyListPage.ts msgid "Clear cache" msgstr "清除缓存" @@ -947,7 +946,8 @@ msgstr "点击复制令牌" msgid "Client ID" msgstr "客户端 ID" -#: src/elements/events/ObjectChangelog.ts src/elements/events/UserEvents.ts +#: src/elements/events/ObjectChangelog.ts +#: src/elements/events/UserEvents.ts #: src/pages/events/EventListPage.ts #: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts msgid "Client IP" @@ -963,8 +963,10 @@ msgid "Client type" msgstr "客户端类型" #: src/elements/notifications/NotificationDrawer.ts -#: src/elements/wizard/Wizard.ts src/pages/outposts/OutpostDeploymentModal.ts -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/elements/wizard/Wizard.ts +#: src/pages/outposts/OutpostDeploymentModal.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Close" msgstr "关闭" @@ -987,9 +989,7 @@ msgid "Confidential" msgstr "机密" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts -msgid "" -"Confidential clients are capable of maintaining the confidentiality of their" -" credentials. Public clients are incapable." +msgid "Confidential clients are capable of maintaining the confidentiality of their credentials. Public clients are incapable." msgstr "机密客户能够对其凭据进行保密。公共客户端无此能力。" #: src/pages/outposts/OutpostForm.ts @@ -1035,15 +1035,11 @@ msgid "Configure how long tokens are valid for." msgstr "配置令牌的有效期限。" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "" -"Configure how the NameID value will be created. When left empty, the " -"NameIDPolicy of the incoming request will be respected." +msgid "Configure how the NameID value will be created. When left empty, the NameIDPolicy of the incoming request will be respected." msgstr "配置如何创建 NameID 值。如果留空,将遵守传入请求的 NameIDPolicy。" #: src/pages/flows/StageBindingForm.ts -msgid "" -"Configure how the flow executor should handle an invalid response to a " -"challenge." +msgid "Configure how the flow executor should handle an invalid response to a challenge." msgstr "配置流程执行器应如何处理对质询的无效响应。" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts @@ -1070,9 +1066,7 @@ msgid "Configure visual settings and defaults for different domains." msgstr "配置不同域名的可视化设置和默认值。" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts -msgid "" -"Configure what data should be used as unique User Identifier. For most " -"cases, the default should be fine." +msgid "Configure what data should be used as unique User Identifier. For most cases, the default should be fine." msgstr "配置应将哪些数据用作唯一用户标识符。在大多数情况下保持默认值即可。" #: src/user/user-settings/sources/SourceSettingsOAuth.ts @@ -1085,9 +1079,7 @@ msgid "Connect to the LDAP Server on port 389:" msgstr "通过端口 389 连接到 LDAP 服务器:" #: src/user/user-settings/sources/SourceSettings.ts -msgid "" -"Connect your user account to the services listed below, to allow you to " -"login using the service instead of traditional credentials." +msgid "Connect your user account to the services listed below, to allow you to login using the service instead of traditional credentials." msgstr "将您的用户账户连接到下面列出的服务,以允许您使用该服务而不是传统凭据登录。" #: src/user/user-settings/UserSettingsPage.ts @@ -1142,8 +1134,10 @@ msgstr "消费者 Key" msgid "Consumer secret" msgstr "消费者 Secret" -#: src/pages/events/EventInfo.ts src/pages/events/EventInfo.ts -#: src/pages/events/EventInfo.ts src/pages/policies/PolicyTestForm.ts +#: src/pages/events/EventInfo.ts +#: src/pages/events/EventInfo.ts +#: src/pages/events/EventInfo.ts +#: src/pages/policies/PolicyTestForm.ts #: src/pages/property-mappings/PropertyMappingTestForm.ts msgid "Context" msgstr "上下文" @@ -1186,7 +1180,8 @@ msgstr "复制" msgid "Copy download URL" msgstr "复制下载 URL" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Copy recovery link" msgstr "复制恢复链接" @@ -1194,31 +1189,44 @@ msgstr "复制恢复链接" #: src/pages/applications/ApplicationListPage.ts #: src/pages/crypto/CertificateKeyPairListPage.ts #: src/pages/crypto/CertificateKeyPairListPage.ts -#: src/pages/events/RuleListPage.ts src/pages/events/RuleListPage.ts -#: src/pages/events/TransportListPage.ts src/pages/events/TransportListPage.ts -#: src/pages/flows/BoundStagesList.ts src/pages/flows/BoundStagesList.ts -#: src/pages/flows/FlowListPage.ts src/pages/flows/FlowListPage.ts -#: src/pages/groups/GroupListPage.ts src/pages/groups/GroupListPage.ts -#: src/pages/outposts/OutpostListPage.ts src/pages/outposts/OutpostListPage.ts +#: src/pages/events/RuleListPage.ts +#: src/pages/events/RuleListPage.ts +#: src/pages/events/TransportListPage.ts +#: src/pages/events/TransportListPage.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/outposts/OutpostListPage.ts +#: src/pages/outposts/OutpostListPage.ts #: src/pages/outposts/ServiceConnectionWizard.ts #: src/pages/policies/BoundPoliciesList.ts -#: src/pages/policies/BoundPoliciesList.ts src/pages/policies/PolicyWizard.ts +#: src/pages/policies/BoundPoliciesList.ts +#: src/pages/policies/PolicyWizard.ts #: src/pages/property-mappings/PropertyMappingWizard.ts #: src/pages/providers/ProviderWizard.ts #: src/pages/providers/RelatedApplicationButton.ts #: src/pages/providers/RelatedApplicationButton.ts -#: src/pages/sources/SourceWizard.ts src/pages/stages/StageWizard.ts +#: src/pages/sources/SourceWizard.ts +#: src/pages/stages/StageWizard.ts #: src/pages/stages/invitation/InvitationListPage.ts #: src/pages/stages/invitation/InvitationListPage.ts #: src/pages/stages/prompt/PromptListPage.ts #: src/pages/stages/prompt/PromptListPage.ts #: src/pages/stages/prompt/PromptStageForm.ts #: src/pages/stages/prompt/PromptStageForm.ts -#: src/pages/tenants/TenantListPage.ts src/pages/tenants/TenantListPage.ts -#: src/pages/tokens/TokenListPage.ts src/pages/tokens/TokenListPage.ts -#: src/pages/users/RelatedUserList.ts src/pages/users/RelatedUserList.ts -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts -#: src/pages/users/UserListPage.ts src/pages/users/UserListPage.ts +#: src/pages/tenants/TenantListPage.ts +#: src/pages/tenants/TenantListPage.ts +#: src/pages/tokens/TokenListPage.ts +#: src/pages/tokens/TokenListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts +#: src/pages/users/UserListPage.ts +#: src/pages/users/UserListPage.ts #: src/user/user-settings/tokens/UserTokenList.ts #: src/user/user-settings/tokens/UserTokenList.ts msgid "Create" @@ -1258,9 +1266,7 @@ msgid "Create Invitation" msgstr "创建邀请" #: src/pages/stages/invitation/InvitationListPage.ts -msgid "" -"Create Invitation Links to enroll Users, and optionally force specific " -"attributes of their account." +msgid "Create Invitation Links to enroll Users, and optionally force specific attributes of their account." msgstr "创建邀请链接以注册用户,并可选地强制设置其账户的特定属性。" #: src/pages/events/RuleListPage.ts @@ -1284,8 +1290,10 @@ msgstr "创建策略" msgid "Create Prompt" msgstr "创建输入" -#: src/pages/users/RelatedUserList.ts src/pages/users/RelatedUserList.ts -#: src/pages/users/UserListPage.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts +#: src/pages/users/UserListPage.ts msgid "Create Service account" msgstr "创建服务账户" @@ -1293,7 +1301,8 @@ msgstr "创建服务账户" msgid "Create Stage" msgstr "创建阶段" -#: src/pages/flows/BoundStagesList.ts src/pages/flows/BoundStagesList.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/flows/BoundStagesList.ts msgid "Create Stage binding" msgstr "创建阶段绑定" @@ -1307,7 +1316,8 @@ msgstr "创建租户" msgid "Create Token" msgstr "创建令牌" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Create User" msgstr "创建用户" @@ -1354,7 +1364,8 @@ msgstr "创建未激活用户" #: src/pages/outposts/ServiceConnectionWizard.ts #: src/pages/policies/PolicyWizard.ts #: src/pages/property-mappings/PropertyMappingWizard.ts -#: src/pages/providers/ProviderWizard.ts src/pages/sources/SourceWizard.ts +#: src/pages/providers/ProviderWizard.ts +#: src/pages/sources/SourceWizard.ts #: src/pages/stages/StageWizard.ts msgid "Create {0}" msgstr "创建 {0}" @@ -1366,7 +1377,8 @@ msgstr "创建者" #~ msgid "Created {0}" #~ msgstr "已创建 {0}" -#: src/elements/events/ObjectChangelog.ts src/elements/events/UserEvents.ts +#: src/elements/events/ObjectChangelog.ts +#: src/elements/events/UserEvents.ts #: src/pages/events/EventListPage.ts msgid "Creation Date" msgstr "创建日期" @@ -1378,7 +1390,8 @@ msgstr "创建日期" msgid "Current plan context" msgstr "当前计划上下文" -#: src/pages/applications/ApplicationForm.ts src/pages/flows/FlowForm.ts +#: src/pages/applications/ApplicationForm.ts +#: src/pages/flows/FlowForm.ts msgid "Currently set to:" msgstr "当前设置为:" @@ -1403,7 +1416,8 @@ msgstr "日期" msgid "Date Time" msgstr "日期时间" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts #: src/pages/users/UserViewPage.ts msgid "Deactivate" msgstr "停用" @@ -1413,9 +1427,7 @@ msgid "Debug" msgstr "调试" #: src/pages/flows/FlowForm.ts -msgid "" -"Decides what this Flow is used for. For example, the Authentication flow is " -"redirect to when an un-authenticated user visits authentik." +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 时,会重定向到身份验证流程。" #: src/pages/tenants/TenantForm.ts @@ -1434,26 +1446,34 @@ msgstr "默认?" msgid "Define how notifications are sent to users, like Email or Webhook." msgstr "定义如何向用户发送通知,例如电子邮件或 Webhook。" -#: src/elements/forms/DeleteBulkForm.ts src/elements/forms/DeleteForm.ts -#: src/elements/oauth/UserRefreshList.ts src/elements/user/SessionList.ts +#: src/elements/forms/DeleteBulkForm.ts +#: src/elements/forms/DeleteForm.ts +#: src/elements/oauth/UserRefreshList.ts +#: src/elements/user/SessionList.ts #: src/elements/user/UserConsentList.ts #: src/pages/applications/ApplicationListPage.ts #: src/pages/crypto/CertificateKeyPairListPage.ts -#: src/pages/events/RuleListPage.ts src/pages/events/TransportListPage.ts -#: src/pages/flows/BoundStagesList.ts src/pages/flows/FlowListPage.ts -#: src/pages/groups/GroupListPage.ts src/pages/groups/RelatedGroupList.ts +#: src/pages/events/RuleListPage.ts +#: src/pages/events/TransportListPage.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/groups/RelatedGroupList.ts #: src/pages/outposts/OutpostListPage.ts #: src/pages/outposts/ServiceConnectionListPage.ts #: src/pages/policies/BoundPoliciesList.ts #: src/pages/policies/PolicyListPage.ts #: src/pages/policies/reputation/ReputationListPage.ts #: src/pages/property-mappings/PropertyMappingListPage.ts -#: src/pages/providers/ProviderListPage.ts src/pages/sources/SourceListPage.ts +#: src/pages/providers/ProviderListPage.ts +#: src/pages/sources/SourceListPage.ts #: src/pages/stages/StageListPage.ts #: src/pages/stages/invitation/InvitationListPage.ts #: src/pages/stages/prompt/PromptListPage.ts -#: src/pages/tenants/TenantListPage.ts src/pages/tokens/TokenListPage.ts -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/tenants/TenantListPage.ts +#: src/pages/tokens/TokenListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts #: src/user/user-settings/mfa/MFADevicesPage.ts #: src/user/user-settings/tokens/UserTokenList.ts msgid "Delete" @@ -1498,7 +1518,8 @@ msgstr "" "删除当前待处理的用户。注意,这个阶段不要求确认。\n" "使用同意授权阶段来确保用户知道自己的行为。" -#: src/elements/forms/DeleteBulkForm.ts src/elements/forms/DeleteForm.ts +#: src/elements/forms/DeleteBulkForm.ts +#: src/elements/forms/DeleteForm.ts msgid "Delete {0}" msgstr "删除 {0}" @@ -1508,21 +1529,18 @@ msgstr "拒绝用户访问" #: src/pages/applications/ApplicationForm.ts #: src/pages/property-mappings/PropertyMappingScopeForm.ts -#: src/pages/system-tasks/SystemTaskListPage.ts src/pages/tokens/TokenForm.ts +#: src/pages/system-tasks/SystemTaskListPage.ts +#: src/pages/tokens/TokenForm.ts #: src/user/user-settings/tokens/UserTokenForm.ts msgid "Description" msgstr "描述" #: src/pages/property-mappings/PropertyMappingScopeForm.ts -msgid "" -"Description shown to the user when consenting. If left empty, the user won't" -" be informed." +msgid "Description shown to the user when consenting. If left empty, the user won't be informed." msgstr "同意授权时向用户显示的描述。如果留空,则不会告知用户。" #: src/pages/users/UserForm.ts -msgid "" -"Designates whether this user should be treated as active. Unselect this " -"instead of deleting accounts." +msgid "Designates whether this user should be treated as active. Unselect this instead of deleting accounts." msgstr "指定是否应将此用户视为活动用户。取消选择此选项,而不是删除帐户。" #: src/pages/flows/FlowForm.ts @@ -1530,20 +1548,15 @@ msgid "Designation" msgstr "指定" #: src/pages/outposts/OutpostListPage.ts -msgid "" -"Detailed health (one instance per column, data is cached so may be out of " -"data)" +msgid "Detailed health (one instance per column, data is cached so may be out of data)" msgstr "详细健康状况(每列一个实例,数据经过缓存,因此可能会缺少数据)" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "" -"Determines how authentik sends the response back to the Service Provider." +msgid "Determines how authentik sends the response back to the Service Provider." msgstr "确定 authentik 如何将响应发送回服务提供程序。" #: src/pages/stages/user_login/UserLoginStageForm.ts -msgid "" -"Determines how long a session lasts. Default of 0 seconds means that the " -"sessions lasts until the browser is closed." +msgid "Determines how long a session lasts. Default of 0 seconds means that the sessions lasts until the browser is closed." msgstr "确定会话持续多长时间。默认为 0 秒意味着会话持续到浏览器关闭为止。" #: src/elements/user/SessionList.ts @@ -1579,15 +1592,11 @@ msgid "Digits" msgstr "数字" #: src/pages/providers/ldap/LDAPProviderForm.ts -msgid "" -"Direct querying, always execute the configured bind flow to authenticate the" -" user." +msgid "Direct querying, always execute the configured bind flow to authenticate the user." msgstr "直接查询,总是执行配置的绑定流程,以验证用户的身份。" #: src/pages/providers/ldap/LDAPProviderForm.ts -msgid "" -"Direct querying, always returns the latest data, but slower than cached " -"querying." +msgid "Direct querying, always returns the latest data, but slower than cached querying." msgstr "直接查询,总是返回最新数据,但比缓存查询慢。" #: src/interfaces/AdminInterface.ts @@ -1622,7 +1631,8 @@ msgstr "断开连接" msgid "Docker URL" msgstr "Docker URL" -#: src/pages/tenants/TenantForm.ts src/pages/tenants/TenantListPage.ts +#: src/pages/tenants/TenantForm.ts +#: src/pages/tenants/TenantListPage.ts #: src/pages/tenants/TenantListPage.ts msgid "Domain" msgstr "域名" @@ -1647,18 +1657,14 @@ msgid "Download signing certificate" msgstr "下载签名证书" #: src/pages/providers/ldap/LDAPProviderForm.ts -msgid "" -"Due to protocol limitations, this certificate is only used when the outpost " -"has a single provider." +msgid "Due to protocol limitations, this certificate is only used when the outpost has a single provider." msgstr "由于协议限制,只在前哨有单个提供程序时才使用此证书。" #~ msgid "Dummy" #~ msgstr "占位" #: src/pages/stages/dummy/DummyStageForm.ts -msgid "" -"Dummy stage used for testing. Shows a simple continue button and always " -"passes." +msgid "Dummy stage used for testing. Shows a simple continue button and always passes." msgstr "用于测试的虚拟阶段。显示一个简单的“继续”按钮,并且始终通过。" #~ msgid "Duo" @@ -1690,7 +1696,8 @@ msgstr "根据应用程序 Slug,每个提供程序都有不同的颁发者。" #: src/pages/applications/ApplicationViewPage.ts #: src/pages/applications/ApplicationViewPage.ts -#: src/pages/flows/FlowViewPage.ts src/pages/flows/FlowViewPage.ts +#: src/pages/flows/FlowViewPage.ts +#: src/pages/flows/FlowViewPage.ts #: src/pages/groups/GroupViewPage.ts #: src/pages/providers/ldap/LDAPProviderViewPage.ts #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts @@ -1704,7 +1711,8 @@ msgstr "根据应用程序 Slug,每个提供程序都有不同的颁发者。" msgid "Edit" msgstr "编辑" -#: src/pages/flows/BoundStagesList.ts src/pages/policies/BoundPoliciesList.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/policies/BoundPoliciesList.ts msgid "Edit Binding" msgstr "编辑绑定" @@ -1725,9 +1733,7 @@ msgid "Edit User" msgstr "编辑用户" #: src/pages/applications/ApplicationForm.ts -msgid "" -"Either input a full URL, a relative path, or use 'fa://fa-test' to use the " -"Font Awesome icon \"fa-test\"." +msgid "Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon \"fa-test\"." msgstr "输入完整 URL、相对路径,或者使用 'fa://fa-test' 来使用 Font Awesome 图标 \"fa-test\"。" #: src/user/LibraryPage.ts @@ -1737,7 +1743,8 @@ msgstr "没有定义应用程序,或者您无权访问任何应用程序。" #: src/flows/stages/identification/IdentificationStage.ts #: src/pages/events/TransportForm.ts #: src/pages/stages/identification/IdentificationStageForm.ts -#: src/pages/users/UserForm.ts src/pages/users/UserViewPage.ts +#: src/pages/users/UserForm.ts +#: src/pages/users/UserViewPage.ts msgid "Email" msgstr "电子邮箱" @@ -1749,7 +1756,8 @@ msgstr "电子邮箱地址" msgid "Email info:" msgstr "电子邮件信息:" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Email recovery link" msgstr "电子邮件恢复链接" @@ -1789,9 +1797,7 @@ msgstr "启用 StartTLS" #~ msgstr "启用 TOTP" #: src/pages/flows/FlowForm.ts -msgid "" -"Enable compatibility mode, increases compatibility with password managers on" -" mobile devices." +msgid "Enable compatibility mode, increases compatibility with password managers on mobile devices." msgstr "启用兼容模式,增强与移动设备上密码管理器的兼容性。" #: src/pages/policies/BoundPoliciesList.ts @@ -1804,9 +1810,7 @@ msgid "Enabled" msgstr "已启用" #: src/pages/users/ServiceAccountForm.ts -msgid "" -"Enabling this toggle will create a group named after the user, with the user" -" as member." +msgid "Enabling this toggle will create a group named after the user, with the user as member." msgstr "启用此开关将创建一个以用户命名的组,用户为成员。" #: src/interfaces/locale.ts @@ -1864,12 +1868,8 @@ msgid "Evaluate policies before the Stage is present to the user." msgstr "在阶段即将呈现给用户时评估策略。" #: src/pages/flows/StageBindingForm.ts -msgid "" -"Evaluate policies during the Flow planning process. Disable this for input-" -"based policies. Should be used in conjunction with 'Re-evaluate policies', " -"as with both options disabled, policies are **not** evaluated." -msgstr "" -"在流程规划过程中评估策略。对于基于输入的策略,请禁用此选项。应与“重新评估策略”结合使用,因为如果同时禁用这两个选项,则**不**评估策略。" +msgid "Evaluate policies during the Flow planning process. Disable this for input-based policies. Should be used in conjunction with 'Re-evaluate policies', as with both options disabled, policies are **not** evaluated." +msgstr "在流程规划过程中评估策略。对于基于输入的策略,请禁用此选项。应与“重新评估策略”结合使用,因为如果同时禁用这两个选项,则**不**评估策略。" #: src/pages/events/EventListPage.ts msgid "Event Log" @@ -1901,7 +1901,8 @@ msgstr "事件" msgid "Everything is ok." msgstr "一切正常。" -#: src/pages/events/EventInfo.ts src/pages/events/EventInfo.ts +#: src/pages/events/EventInfo.ts +#: src/pages/events/EventInfo.ts #: src/pages/events/EventInfo.ts msgid "Exception" msgstr "异常" @@ -1909,8 +1910,7 @@ msgstr "异常" #~ msgid "Execute" #~ msgstr "执行" -#~ msgid "" -#~ "Execute arbitrary Python code to implement custom checks and validation." +#~ msgid "Execute arbitrary Python code to implement custom checks and validation." #~ msgstr "执行任意 Python 代码以实现自定义检查和验证。" #: src/pages/flows/FlowViewPage.ts @@ -1921,8 +1921,7 @@ msgstr "执行流程" #~ msgstr "与检视器一起执行" #: src/pages/policies/expression/ExpressionPolicyForm.ts -msgid "" -"Executes the python snippet to determine whether to allow or deny a request." +msgid "Executes the python snippet to determine whether to allow or deny a request." msgstr "执行 Python 代码段以确定是允许还是拒绝请求。" #: src/pages/policies/dummy/DummyPolicyForm.ts @@ -1935,7 +1934,8 @@ msgstr "执行 Python 代码段以确定是允许还是拒绝请求。" msgid "Execution logging" msgstr "记录执行日志" -#: src/elements/oauth/UserRefreshList.ts src/elements/user/SessionList.ts +#: src/elements/oauth/UserRefreshList.ts +#: src/elements/user/SessionList.ts #: src/elements/user/UserConsentList.ts #: src/pages/stages/invitation/InvitationForm.ts msgid "Expires" @@ -2010,12 +2010,8 @@ msgid "External API URL" msgstr "外部 API URL" #: src/pages/applications/ApplicationListPage.ts -msgid "" -"External Applications which use authentik as Identity-Provider, utilizing " -"protocols like OAuth2 and SAML. All applications are shown here, even ones " -"you cannot access." -msgstr "" -"利用 OAuth2 和 SAML 等协议,使用 authentik 作为身份提供程序的外部应用程序。此处显示了所有应用程序,即使您无法访问的也包括在内。" +msgid "External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access." +msgstr "利用 OAuth2 和 SAML 等协议,使用 authentik 作为身份提供程序的外部应用程序。此处显示了所有应用程序,即使您无法访问的也包括在内。" #: src/pages/providers/proxy/ProxyProviderViewPage.ts msgid "External Host" @@ -2026,7 +2022,8 @@ msgstr "外部主机" msgid "External host" msgstr "外部主机" -#: src/elements/charts/AdminLoginsChart.ts src/elements/charts/UserChart.ts +#: src/elements/charts/AdminLoginsChart.ts +#: src/elements/charts/UserChart.ts msgid "Failed Logins" msgstr "失败登录" @@ -2054,7 +2051,8 @@ msgstr "删除流程缓存失败" msgid "Failed to delete policy cache" msgstr "删除策略缓存失败" -#: src/elements/forms/DeleteBulkForm.ts src/elements/forms/DeleteForm.ts +#: src/elements/forms/DeleteBulkForm.ts +#: src/elements/forms/DeleteForm.ts msgid "Failed to delete {0}: {1}" msgstr "删除 {0} 失败:{1}" @@ -2066,7 +2064,8 @@ msgstr "更新 {0} 失败:{1}" msgid "Favicon" msgstr "网站图标" -#: src/interfaces/AdminInterface.ts src/pages/sources/SourceListPage.ts +#: src/interfaces/AdminInterface.ts +#: src/pages/sources/SourceListPage.ts msgid "Federation & Social login" msgstr "联结与社交登录" @@ -2095,23 +2094,15 @@ msgstr "包含唯一标识符的字段。" #~ msgstr "包含组成员的字段。" #: src/pages/sources/ldap/LDAPSourceForm.ts -msgid "" -"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,...'" -msgstr "" -"包含组成员的字段。请注意,如果使用 \"memberUid\" 字段,则假定该值包含相对可分辨名称。例如,'memberUid=some-user' " -"而不是 'memberUid=cn=some-user,ou=groups,...'" +msgid "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,...'" +msgstr "包含组成员的字段。请注意,如果使用 \"memberUid\" 字段,则假定该值包含相对可分辨名称。例如,'memberUid=some-user' 而不是 'memberUid=cn=some-user,ou=groups,...'" #: src/pages/stages/prompt/PromptStageForm.ts msgid "Fields" msgstr "字段" #: src/pages/stages/identification/IdentificationStageForm.ts -msgid "" -"Fields a user can identify themselves with. If no fields are selected, the " -"user will only be able to use sources." +msgid "Fields a user can identify themselves with. If no fields are selected, the user will only be able to use sources." msgstr "用户可以用来标识自己的字段。如果未选择任何字段,则用户将只能使用源。" #: src/elements/wizard/Wizard.ts @@ -2130,7 +2121,8 @@ msgstr "流程总览" msgid "Flow execution" msgstr "流程执行" -#: src/flows/FlowInspector.ts src/flows/FlowInspector.ts +#: src/flows/FlowInspector.ts +#: src/flows/FlowInspector.ts msgid "Flow inspector" msgstr "流程检视器" @@ -2158,9 +2150,7 @@ msgid "Flow used before authentication." msgstr "身份验证之前使用的流程。" #: src/pages/stages/password/PasswordStageForm.ts -msgid "" -"Flow used by an authenticated user to configure their password. If empty, " -"user will not be able to configure change their password." +msgid "Flow used by an authenticated user to configure their password. If empty, user will not be able to configure change their password." msgstr "经过身份验证的用户用来配置其密码的流程。如果为空,用户将无法配置更改其密码。" #: src/pages/stages/authenticator_duo/AuthenticatorDuoStageForm.ts @@ -2168,27 +2158,19 @@ msgstr "经过身份验证的用户用来配置其密码的流程。如果为空 #: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts #: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts #: src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts -msgid "" -"Flow used by an authenticated user to configure this Stage. If empty, user " -"will not be able to configure this stage." +msgid "Flow used by an authenticated user to configure this Stage. If empty, user will not be able to configure this stage." msgstr "经过身份验证的用户用来配置此阶段的流程。如果为空,用户将无法配置此阶段。" #: src/pages/providers/ldap/LDAPProviderForm.ts -msgid "" -"Flow used for users to authenticate. Currently only identification and " -"password stages are supported." +msgid "Flow used for users to authenticate. Currently only identification and password stages are supported." msgstr "用于用户进行身份验证的流程。目前仅支持身份识别和密码阶段。" #: src/pages/tenants/TenantForm.ts -msgid "" -"Flow used to authenticate users. If left empty, the first applicable flow " -"sorted by the slug is used." +msgid "Flow used to authenticate users. If left empty, the first applicable flow sorted by the slug is used." msgstr "用于对用户进行身份验证的流程。如果留空,则使用按 Slug 排序的第一个适用流程。" #: src/pages/tenants/TenantForm.ts -msgid "" -"Flow used to logout. If left empty, the first applicable flow sorted by the " -"slug is used." +msgid "Flow used to logout. If left empty, the first applicable flow sorted by the slug is used." msgstr "用于登出的流程。如果留空,则使用按 Slug 排序的第一个适用流程。" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts @@ -2204,7 +2186,8 @@ msgstr "流程" #: src/interfaces/AdminInterface.ts #: src/pages/admin-overview/AdminOverviewPage.ts -#: src/pages/flows/FlowListPage.ts src/pages/stages/StageListPage.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/stages/StageListPage.ts msgid "Flows" msgstr "流程" @@ -2213,9 +2196,7 @@ msgid "Flows & Stages" msgstr "流程与阶段" #: src/pages/flows/FlowListPage.ts -msgid "" -"Flows describe a chain of Stages to authenticate, enroll or recover a user. " -"Stages are chosen based on policies applied to them." +msgid "Flows describe a chain of Stages to authenticate, enroll or recover a user. Stages are chosen based on policies applied to them." msgstr "流程描述了一系列用于对用户进行身份验证、注册或恢复的阶段。阶段是根据应用于它们的策略来选择的。" #: src/flows/stages/RedirectStage.ts @@ -2234,7 +2215,8 @@ msgstr "忘记密码了吗?" msgid "Forgot username or password?" msgstr "忘记用户名或密码?" -#: src/elements/forms/ModalForm.ts src/elements/wizard/FormWizardPage.ts +#: src/elements/forms/ModalForm.ts +#: src/elements/wizard/FormWizardPage.ts #: src/elements/wizard/FormWizardPage.ts msgid "Form didn't return a promise for submitting" msgstr "表单提交未返回 Promise" @@ -2329,7 +2311,8 @@ msgstr "前往上一页" #~ msgstr "前往用户界面" #: src/pages/applications/ApplicationForm.ts -#: src/pages/applications/ApplicationListPage.ts src/pages/events/RuleForm.ts +#: src/pages/applications/ApplicationListPage.ts +#: src/pages/events/RuleForm.ts #: src/pages/policies/PolicyBindingForm.ts #: src/pages/policies/PolicyBindingForm.ts #: src/pages/sources/ldap/LDAPSourceForm.ts @@ -2346,9 +2329,7 @@ msgid "Group Property Mappings" msgstr "组属性映射" #: src/pages/policies/PolicyBindingForm.ts -msgid "" -"Group mappings can only be checked if a user is already logged in when " -"trying to access this source." +msgid "Group mappings can only be checked if a user is already logged in when trying to access this source." msgstr "组绑定仅会在已登录用户访问此源时检查。" #: src/pages/sources/ldap/LDAPSourceForm.ts @@ -2360,21 +2341,23 @@ msgid "Group object filter" msgstr "组对象过滤器" #: src/pages/groups/GroupListPage.ts -msgid "" -"Group users together and give them permissions based on the membership." +msgid "Group users together and give them permissions based on the membership." msgstr "将用户分组在一起,并根据成员资格为他们授予权限。" -#: src/pages/groups/GroupViewPage.ts src/pages/policies/BoundPoliciesList.ts +#: src/pages/groups/GroupViewPage.ts +#: src/pages/policies/BoundPoliciesList.ts msgid "Group {0}" msgstr "组 {0}" -#: src/pages/groups/GroupListPage.ts src/pages/groups/RelatedGroupList.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/groups/RelatedGroupList.ts msgid "Group(s)" msgstr "组" #: src/interfaces/AdminInterface.ts #: src/pages/admin-overview/AdminOverviewPage.ts -#: src/pages/groups/GroupListPage.ts src/pages/users/UserForm.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/users/UserForm.ts #: src/pages/users/UserViewPage.ts msgid "Groups" msgstr "组" @@ -2424,11 +2407,13 @@ msgstr "隐藏:隐藏字段,可用于将数据插入表单。" msgid "Hide managed mappings" msgstr "隐藏管理映射" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Hide service-accounts" msgstr "隐藏服务账户" -#: src/pages/events/RuleForm.ts src/pages/outposts/OutpostForm.ts +#: src/pages/events/RuleForm.ts +#: src/pages/outposts/OutpostForm.ts #: src/pages/providers/oauth2/OAuth2ProviderForm.ts #: src/pages/providers/oauth2/OAuth2ProviderForm.ts #: src/pages/providers/proxy/ProxyProviderForm.ts @@ -2446,16 +2431,15 @@ msgid "Hold control/command to select multiple items." msgstr "按住 ctrl/command 键可选择多个项目。" #: src/pages/stages/password/PasswordStageForm.ts -msgid "" -"How many attempts a user has before the flow is canceled. To lock the user " -"out, use a reputation policy and a user_write stage." +msgid "How many attempts a user has before the flow is canceled. To lock the user out, use a reputation policy and a user_write stage." msgstr "在取消流程之前,用户可以尝试多少次。要锁定用户,请使用信誉策略和 user_write 阶段。" #: src/pages/providers/ldap/LDAPProviderViewPage.ts msgid "How to connect" msgstr "如何连接" -#: src/elements/forms/DeleteBulkForm.ts src/pages/users/RelatedUserList.ts +#: src/elements/forms/DeleteBulkForm.ts +#: src/pages/users/RelatedUserList.ts #: src/pages/users/UserListPage.ts msgid "ID" msgstr "ID" @@ -2486,7 +2470,8 @@ msgstr "浏览器选项卡中显示的图标。" #: src/pages/flows/FlowListPage.ts #: src/pages/policies/reputation/ReputationListPage.ts -#: src/pages/system-tasks/SystemTaskListPage.ts src/pages/tokens/TokenForm.ts +#: src/pages/system-tasks/SystemTaskListPage.ts +#: src/pages/tokens/TokenForm.ts #: src/pages/tokens/TokenListPage.ts #: src/user/user-settings/tokens/UserTokenForm.ts #: src/user/user-settings/tokens/UserTokenList.ts @@ -2496,32 +2481,28 @@ msgstr "标识符" #~ msgid "Identity & Cryptography" #~ msgstr "身份识别与加密" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "If any of the devices user of the types selected above have been used within this duration, this stage will be skipped." +msgstr "" + #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts -msgid "" -"If enabled, use the local connection. Required Docker socket/Kubernetes " -"Integration." +msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." msgstr "如果启用,请使用本地连接。需要 Docker Socket/Kubernetes 集成。" #: src/pages/applications/ApplicationForm.ts -msgid "" -"If left empty, authentik will try to extract the launch URL based on the " -"selected provider." +msgid "If left empty, authentik will try to extract the launch URL based on the selected provider." msgstr "如果留空,authentik 将尝试根据选定的提供程序提取启动 URL。" #: src/pages/providers/ldap/LDAPProviderForm.ts -msgid "" -"If multiple providers share an outpost, a self-signed certificate is used." +msgid "If multiple providers share an outpost, a self-signed certificate is used." msgstr "如果多个提供程序共享同一个前哨,则使用自签名证书。" -#~ msgid "" -#~ "If no explicit redirect URIs are specified, any redirect URI is allowed." +#~ msgid "If no explicit redirect URIs are specified, any redirect URI is allowed." #~ msgstr "如果未指定显式重定向 URI,则允许使用任何重定向 URI。" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts -msgid "" -"If no explicit redirect URIs are specified, the first successfully used " -"redirect URI will be saved." +msgid "If no explicit redirect URIs are specified, the first successfully used redirect URI will be saved." msgstr "如果未指定显式重定向 URI,则将保存第一个成功使用的重定向 URI。" #~ msgid "" @@ -2534,43 +2515,31 @@ msgid "If set, users are able to configure details of their profile." msgstr "设置后,用户可以配置他们个人资料的详细信息。" #: src/pages/tenants/TenantForm.ts -msgid "" -"If set, users are able to unenroll themselves using this flow. If no flow is" -" set, option is not shown." +msgid "If set, users are able to unenroll themselves using this flow. If no flow is set, option is not shown." msgstr "如果已设置,则用户可以使用此流程自行删除账户。如果未设置流程,则不显示选项。" #: src/pages/stages/invitation/InvitationStageForm.ts -msgid "" -"If this flag is set, this Stage will jump to the next Stage when no " -"Invitation is given. By default this Stage will cancel the Flow when no " -"invitation is given." +msgid "If this flag is set, this Stage will jump to the next Stage when no Invitation is given. By default this Stage will cancel the Flow when no invitation is given." msgstr "如果设置了此标志,则当没有发出邀请时,此阶段将跳转到下一个阶段。默认情况下,当没有发出邀请时,此阶段将取消流程。" #: src/pages/tokens/TokenForm.ts -msgid "" -"If this is selected, the token will expire. Upon expiration, the token will " -"be rotated." +msgid "If this is selected, the token will expire. Upon expiration, the token will be rotated." msgstr "如果选择此选项,令牌将能够过期。过期时,令牌将被轮换。" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts -msgid "" -"If you are using an Implicit, client-side flow (where the token-endpoint " -"isn't used), you probably want to increase this time." +msgid "If you are using an Implicit, client-side flow (where the token-endpoint isn't used), you probably want to increase this time." msgstr "如果您使用的是隐式的客户端流程(不使用令牌端点),您可能想增加此时间。" #: src/pages/outposts/OutpostDeploymentModal.ts -msgid "" -"If your authentik Instance is using a self-signed certificate, set this " -"value." +msgid "If your authentik Instance is using a self-signed certificate, set this value." msgstr "如果您的 authentik 实例正在使用自签名证书,请设置此值。" #: src/pages/outposts/OutpostDeploymentModal.ts -msgid "" -"If your authentik_host setting does not match the URL you want to login " -"with, add this setting." +msgid "If your authentik_host setting does not match the URL you want to login with, add this setting." msgstr "如果您的 authentik_host 设置与您要登录时使用的网址不匹配,请添加此设置。" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts #: src/pages/users/UserViewPage.ts msgid "Impersonate" msgstr "模拟身份" @@ -2583,7 +2552,8 @@ msgstr "已结束模拟身份" msgid "Impersonation started" msgstr "已开始模拟身份" -#: src/pages/flows/FlowListPage.ts src/pages/flows/FlowListPage.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/flows/FlowListPage.ts msgid "Import" msgstr "导入" @@ -2592,9 +2562,7 @@ msgid "Import Flow" msgstr "导入流程" #: src/pages/crypto/CertificateKeyPairListPage.ts -msgid "" -"Import certificates of external providers or create certificates to sign " -"requests with." +msgid "Import certificates of external providers or create certificates to sign requests with." msgstr "导入外部提供商的证书或创建用于签名请求的证书。" #: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts @@ -2602,26 +2570,24 @@ msgid "In case you can't access any other method." msgstr "以防万一您无法使用任何其他方法。" #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"In this case, you'd set the Authentication URL to auth.example.com and " -"Cookie domain to example.com." +msgid "In this case, you'd set the Authentication URL to auth.example.com and Cookie domain to example.com." msgstr "在这种情况下,您需要将身份验证 URL 设置为 auth.example.com,并将 Cookie 域名设置为 example.com。" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Inactive" msgstr "未激活" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts -msgid "" -"Include User claims from scopes in the id_token, for applications that don't" -" access the userinfo endpoint." +msgid "Include User claims from scopes in the id_token, for applications that don't access the userinfo endpoint." msgstr "对于不访问 userinfo 端点的应用程序,将来自作用域的用户声明包含在 id_token 中。" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts msgid "Include claims in id_token" msgstr "在 id_token 中包含声明" -#: src/pages/outposts/OutpostForm.ts src/pages/outposts/OutpostListPage.ts +#: src/pages/outposts/OutpostForm.ts +#: src/pages/outposts/OutpostListPage.ts msgid "Integration" msgstr "集成" @@ -2632,7 +2598,8 @@ msgstr "集成密钥" #~ msgid "Integrations" #~ msgstr "集成" -#: src/pages/tokens/TokenForm.ts src/pages/tokens/TokenListPage.ts +#: src/pages/tokens/TokenForm.ts +#: src/pages/tokens/TokenListPage.ts #: src/user/user-settings/tokens/UserTokenList.ts msgid "Intent" msgstr "意图" @@ -2716,24 +2683,18 @@ msgstr "Issuer 模式" #~ msgstr "JWT 算法" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts -msgid "" -"JWTs signed by certificates configured here can be used to authenticate to " -"the provider." +msgid "JWTs signed by certificates configured here can be used to authenticate to the provider." msgstr "此处配置的证书签名的 JWT 可以用于此提供程序的身份验证。" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts msgid "Key used to sign the tokens." msgstr "用于签名令牌的密钥。" -#~ msgid "" -#~ "Key used to sign the tokens. Only required when JWT Algorithm is set to " -#~ "RS256." +#~ msgid "Key used to sign the tokens. Only required when JWT Algorithm is set to RS256." #~ msgstr "用于签名令牌的密钥。仅当 JWT 算法设置为 RS256 时才需要。" #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "" -"Keypair which is used to sign outgoing requests. Leave empty to disable " -"signing." +msgid "Keypair which is used to sign outgoing requests. Leave empty to disable signing." msgstr "用于签名传出请求的密钥对。留空则禁用签名。" #: src/pages/outposts/ServiceConnectionKubernetesForm.ts @@ -2772,12 +2733,15 @@ msgstr "标签" msgid "Label shown next to/above the prompt." msgstr "标签会显示在输入侧方/上方。" -#: src/elements/user/SessionList.ts src/elements/user/SessionList.ts +#: src/elements/user/SessionList.ts +#: src/elements/user/SessionList.ts msgid "Last IP" msgstr "上次 IP" -#: src/pages/groups/MemberSelectModal.ts src/pages/users/RelatedUserList.ts -#: src/pages/users/UserListPage.ts src/pages/users/UserViewPage.ts +#: src/pages/groups/MemberSelectModal.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts +#: src/pages/users/UserViewPage.ts msgid "Last login" msgstr "上次登录" @@ -2794,6 +2758,10 @@ msgstr "上次出现:{0}" msgid "Last sync: {0}" msgstr "上次同步:{0}" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "Last validation threshold" +msgstr "" + #: src/pages/applications/ApplicationViewPage.ts #: src/pages/applications/ApplicationViewPage.ts msgid "Launch" @@ -2812,16 +2780,12 @@ msgstr "让用户使用用户名或电子邮件地址来标识自己。" #: src/pages/sources/oauth/OAuthSourceForm.ts #: src/pages/sources/plex/PlexSourceForm.ts -msgid "" -"Link to a user with identical email address. Can have security implications " -"when a source doesn't validate email addresses" +msgid "Link to a user with identical email address. Can have security implications when a source doesn't validate email addresses" msgstr "链接到电子邮件地址相同的用户。当源不验证电子邮件地址时,可能会有安全隐患" #: src/pages/sources/oauth/OAuthSourceForm.ts #: src/pages/sources/plex/PlexSourceForm.ts -msgid "" -"Link to a user with identical username. Can have security implications when " -"a username is used with another source." +msgid "Link to a user with identical username. Can have security implications when a username is used with another source." msgstr "链接到用户名相同的用户。当其他源使用相同用户名时,可能会有安全隐患。" #: src/pages/stages/invitation/InvitationListLink.ts @@ -2837,8 +2801,10 @@ msgstr "使用唯一标识符链接用户" msgid "Load servers" msgstr "加载服务器" -#: src/elements/table/Table.ts src/flows/FlowExecutor.ts -#: src/flows/FlowExecutor.ts src/flows/FlowInspector.ts +#: src/elements/table/Table.ts +#: src/flows/FlowExecutor.ts +#: src/flows/FlowExecutor.ts +#: src/flows/FlowInspector.ts #: src/flows/stages/access_denied/AccessDeniedStage.ts #: src/flows/stages/authenticator_duo/AuthenticatorDuoStage.ts #: src/flows/stages/authenticator_sms/AuthenticatorSMSStage.ts @@ -2850,7 +2816,8 @@ msgstr "加载服务器" #: src/flows/stages/autosubmit/AutosubmitStage.ts #: src/flows/stages/captcha/CaptchaStage.ts #: src/flows/stages/consent/ConsentStage.ts -#: src/flows/stages/dummy/DummyStage.ts src/flows/stages/email/EmailStage.ts +#: src/flows/stages/dummy/DummyStage.ts +#: src/flows/stages/email/EmailStage.ts #: src/flows/stages/identification/IdentificationStage.ts #: src/flows/stages/password/PasswordStage.ts #: src/flows/stages/prompt/PromptStage.ts @@ -2859,17 +2826,23 @@ msgstr "加载服务器" #: src/user/user-settings/details/UserSettingsFlowExecutor.ts #: src/user/user-settings/details/stages/prompt/PromptStage.ts #: src/user/user-settings/mfa/MFADevicesPage.ts -#: src/user/user-settings/sources/SourceSettings.ts src/utils.ts +#: src/user/user-settings/sources/SourceSettings.ts +#: src/utils.ts msgid "Loading" msgstr "正在加载" #: src/elements/Spinner.ts #: src/pages/applications/ApplicationCheckAccessForm.ts -#: src/pages/applications/ApplicationForm.ts src/pages/events/RuleForm.ts -#: src/pages/events/RuleForm.ts src/pages/events/TransportForm.ts -#: src/pages/flows/StageBindingForm.ts src/pages/flows/StageBindingForm.ts -#: src/pages/groups/GroupForm.ts src/pages/groups/GroupForm.ts -#: src/pages/outposts/OutpostForm.ts src/pages/outposts/OutpostForm.ts +#: src/pages/applications/ApplicationForm.ts +#: src/pages/events/RuleForm.ts +#: src/pages/events/RuleForm.ts +#: src/pages/events/TransportForm.ts +#: src/pages/flows/StageBindingForm.ts +#: src/pages/flows/StageBindingForm.ts +#: src/pages/groups/GroupForm.ts +#: src/pages/groups/GroupForm.ts +#: src/pages/outposts/OutpostForm.ts +#: src/pages/outposts/OutpostForm.ts #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/policies/PolicyBindingForm.ts @@ -2922,10 +2895,14 @@ msgstr "正在加载" #: src/pages/stages/prompt/PromptStageForm.ts #: src/pages/stages/prompt/PromptStageForm.ts #: src/pages/stages/user_write/UserWriteStageForm.ts -#: src/pages/tenants/TenantForm.ts src/pages/tenants/TenantForm.ts -#: src/pages/tenants/TenantForm.ts src/pages/tenants/TenantForm.ts -#: src/pages/tenants/TenantForm.ts src/pages/tenants/TenantForm.ts -#: src/pages/tokens/TokenForm.ts src/pages/users/UserForm.ts +#: src/pages/tenants/TenantForm.ts +#: src/pages/tenants/TenantForm.ts +#: src/pages/tenants/TenantForm.ts +#: src/pages/tenants/TenantForm.ts +#: src/pages/tenants/TenantForm.ts +#: src/pages/tenants/TenantForm.ts +#: src/pages/tokens/TokenForm.ts +#: src/pages/users/UserForm.ts #: src/pages/users/UserResetEmailForm.ts msgid "Loading..." msgstr "正在加载……" @@ -2957,9 +2934,7 @@ msgid "Login" msgstr "登录" #: src/pages/sources/ldap/LDAPSourceForm.ts -msgid "" -"Login password is synced from LDAP into authentik automatically. Enable this" -" option only to write password changes in authentik back to LDAP." +msgid "Login password is synced from LDAP into authentik automatically. Enable this option only to write password changes in authentik back to LDAP." msgstr "登录密码会自动从 LDAP 同步到 authentik。启用此选项可将 authentik 中的密码更改写回至 LDAP。" #: src/flows/stages/identification/IdentificationStage.ts @@ -3020,40 +2995,31 @@ msgid "Mark newly created users as inactive." msgstr "将新创建的用户标记为未激活。" #: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts -msgid "" -"Match created events with this action type. When left empty, all action " -"types will be matched." +msgid "Match created events with this action type. When left empty, all action types will be matched." msgstr "将创建的事件与此操作类型匹配。留空时,所有操作类型都将匹配。" #: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts -msgid "" -"Match events created by selected application. When left empty, all " -"applications are matched." +msgid "Match events created by selected application. When left empty, all applications are matched." msgstr "匹配选定应用程序创建的事件。如果留空,则匹配所有应用程序。" #: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts -msgid "" -"Matches Event's Client IP (strict matching, for network matching use an " -"Expression Policy." +msgid "Matches Event's Client IP (strict matching, for network matching use an Expression Policy." msgstr "匹配事件的客户端 IP(严格匹配,要网络匹配请使用表达式策略)。" #: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts -msgid "" -"Matches an event against a set of criteria. If any of the configured values " -"match, the policy passes." +msgid "Matches an event against a set of criteria. If any of the configured values match, the policy passes." msgstr "根据一组条件匹配事件。如果任何配置的值匹配,则策略将通过。" #: src/pages/tenants/TenantForm.ts -msgid "" -"Matching is done based on domain suffix, so if you enter domain.tld, " -"foo.domain.tld will still match." +msgid "Matching is done based on domain suffix, so if you enter domain.tld, foo.domain.tld will still match." msgstr "根据域名后缀完成匹配,因此,如果您输入 domain.tld,foo.domain.tld 仍将匹配。" #: src/pages/policies/expiry/ExpiryPolicyForm.ts msgid "Maximum age (in days)" msgstr "最长使用期限(单位为天)" -#: src/pages/groups/GroupForm.ts src/pages/groups/GroupListPage.ts +#: src/pages/groups/GroupForm.ts +#: src/pages/groups/GroupListPage.ts #: src/pages/users/GroupSelectModal.ts msgid "Members" msgstr "成员" @@ -3063,7 +3029,8 @@ msgid "Message" msgstr "消息" #: src/pages/applications/ApplicationCheckAccessForm.ts -#: src/pages/events/EventInfo.ts src/pages/policies/PolicyTestForm.ts +#: src/pages/events/EventInfo.ts +#: src/pages/policies/PolicyTestForm.ts #: src/pages/system-tasks/SystemTaskListPage.ts msgid "Messages" msgstr "消息" @@ -3093,7 +3060,8 @@ msgstr "最低大写字符数" msgid "Minimum length" msgstr "最小长度" -#: src/pages/events/TransportForm.ts src/pages/events/TransportListPage.ts +#: src/pages/events/TransportForm.ts +#: src/pages/events/TransportListPage.ts #: src/pages/providers/proxy/ProxyProviderViewPage.ts #: src/pages/stages/consent/ConsentStageForm.ts msgid "Mode" @@ -3132,13 +3100,20 @@ msgstr "我的应用" #: src/pages/crypto/CertificateKeyPairForm.ts #: src/pages/crypto/CertificateKeyPairListPage.ts #: src/pages/crypto/CertificateKeyPairListPage.ts -#: src/pages/events/EventInfo.ts src/pages/events/RuleForm.ts -#: src/pages/events/RuleListPage.ts src/pages/events/TransportForm.ts -#: src/pages/events/TransportListPage.ts src/pages/flows/BoundStagesList.ts -#: src/pages/flows/FlowForm.ts src/pages/flows/FlowListPage.ts -#: src/pages/groups/GroupForm.ts src/pages/groups/GroupListPage.ts -#: src/pages/groups/GroupViewPage.ts src/pages/groups/MemberSelectModal.ts -#: src/pages/groups/RelatedGroupList.ts src/pages/outposts/OutpostForm.ts +#: src/pages/events/EventInfo.ts +#: src/pages/events/RuleForm.ts +#: src/pages/events/RuleListPage.ts +#: src/pages/events/TransportForm.ts +#: src/pages/events/TransportListPage.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/flows/FlowForm.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/groups/GroupForm.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/groups/GroupViewPage.ts +#: src/pages/groups/MemberSelectModal.ts +#: src/pages/groups/RelatedGroupList.ts +#: src/pages/outposts/OutpostForm.ts #: src/pages/outposts/OutpostListPage.ts #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts @@ -3197,9 +3172,12 @@ msgstr "我的应用" #: src/pages/stages/user_login/UserLoginStageForm.ts #: src/pages/stages/user_logout/UserLogoutStageForm.ts #: src/pages/stages/user_write/UserWriteStageForm.ts -#: src/pages/users/GroupSelectModal.ts src/pages/users/RelatedUserList.ts -#: src/pages/users/UserForm.ts src/pages/users/UserListPage.ts -#: src/pages/users/UserViewPage.ts src/user/user-settings/mfa/MFADeviceForm.ts +#: src/pages/users/GroupSelectModal.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserForm.ts +#: src/pages/users/UserListPage.ts +#: src/pages/users/UserViewPage.ts +#: src/user/user-settings/mfa/MFADeviceForm.ts #: src/user/user-settings/mfa/MFADevicesPage.ts msgid "Name" msgstr "名称" @@ -3283,14 +3261,17 @@ msgstr "Nginx(独立)" #: src/elements/oauth/UserRefreshList.ts #: src/pages/applications/ApplicationCheckAccessForm.ts #: src/pages/crypto/CertificateKeyPairListPage.ts -#: src/pages/groups/GroupListPage.ts src/pages/groups/MemberSelectModal.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/groups/MemberSelectModal.ts #: src/pages/groups/RelatedGroupList.ts #: src/pages/outposts/ServiceConnectionListPage.ts #: src/pages/policies/BoundPoliciesList.ts #: src/pages/policies/PolicyTestForm.ts #: src/pages/providers/proxy/ProxyProviderViewPage.ts -#: src/pages/tenants/TenantListPage.ts src/pages/tokens/TokenListPage.ts -#: src/pages/users/GroupSelectModal.ts src/pages/users/RelatedUserList.ts +#: src/pages/tenants/TenantListPage.ts +#: src/pages/tokens/TokenListPage.ts +#: src/pages/users/GroupSelectModal.ts +#: src/pages/users/RelatedUserList.ts #: src/pages/users/UserListPage.ts #: src/user/user-settings/tokens/UserTokenList.ts msgid "No" @@ -3300,7 +3281,8 @@ msgstr "否" msgid "No Applications available." msgstr "没有可用的应用程序。" -#: src/elements/events/ObjectChangelog.ts src/elements/events/UserEvents.ts +#: src/elements/events/ObjectChangelog.ts +#: src/elements/events/UserEvents.ts msgid "No Events found." msgstr "未找到事件。" @@ -3320,7 +3302,8 @@ msgstr "没有可用的额外数据。" msgid "No additional setup is required." msgstr "无需进行额外设置。" -#: src/elements/forms/ModalForm.ts src/elements/wizard/FormWizardPage.ts +#: src/elements/forms/ModalForm.ts +#: src/elements/wizard/FormWizardPage.ts #: src/elements/wizard/FormWizardPage.ts msgid "No form found" msgstr "未找到表单" @@ -3334,7 +3317,8 @@ msgstr "没有激活的集成" msgid "No log messages." msgstr "没有日志消息。" -#: src/elements/events/ObjectChangelog.ts src/elements/events/UserEvents.ts +#: src/elements/events/ObjectChangelog.ts +#: src/elements/events/UserEvents.ts msgid "No matching events could be found." msgstr "未找到匹配的事件" @@ -3350,7 +3334,8 @@ msgstr "当前没有策略绑定到此对象。" msgid "No preference is sent" msgstr "不发送偏好" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "No recovery flow is configured." msgstr "未配置恢复流程。" @@ -3420,11 +3405,13 @@ msgstr "不是您?" msgid "Notice" msgstr "通知" -#: src/interfaces/AdminInterface.ts src/pages/events/RuleListPage.ts +#: src/interfaces/AdminInterface.ts +#: src/pages/events/RuleListPage.ts msgid "Notification Rules" msgstr "通知规则" -#: src/interfaces/AdminInterface.ts src/pages/events/TransportListPage.ts +#: src/interfaces/AdminInterface.ts +#: src/pages/events/TransportListPage.ts msgid "Notification Transports" msgstr "通知传输" @@ -3474,7 +3461,8 @@ msgstr "OAuth 刷新代码" msgid "OK" msgstr "好的" -#: src/pages/events/EventInfo.ts src/pages/events/EventInfo.ts +#: src/pages/events/EventInfo.ts +#: src/pages/events/EventInfo.ts msgid "Object" msgstr "对象" @@ -3491,11 +3479,15 @@ msgid "Objects created" msgstr "已创建对象" #: src/pages/stages/consent/ConsentStageForm.ts -msgid "" -"Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." -msgstr "经过多少偏移量后同意授权过期。(格式:hours=1;minutes=2;seconds=3)。" +msgid "Offset after which consent expires." +msgstr "" -#: src/elements/events/ObjectChangelog.ts src/elements/events/UserEvents.ts +#: src/pages/stages/consent/ConsentStageForm.ts +#~ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "经过多少偏移量后同意授权过期。(格式:hours=1;minutes=2;seconds=3)。" + +#: src/elements/events/ObjectChangelog.ts +#: src/elements/events/UserEvents.ts #: src/pages/events/EventListPage.ts msgid "On behalf of {0}" msgstr "代表 {0}" @@ -3505,9 +3497,7 @@ msgid "Only fail the policy, don't invalidate user's password." msgstr "仅使策略失败,不使用户的密码失效。" #: src/pages/events/TransportForm.ts -msgid "" -"Only send notification once, for example when sending a webhook into a chat " -"channel." +msgid "Only send notification once, for example when sending a webhook into a chat channel." msgstr "仅发送一次通知,例如在向聊天频道发送 Webhook 时。" #: src/elements/notifications/APIDrawer.ts @@ -3534,9 +3524,7 @@ msgid "OpenID Configuration URL" msgstr "OpenID 配置 URL" #: src/pages/crypto/CertificateKeyPairForm.ts -msgid "" -"Optional Private Key. If this is set, you can use this keypair for " -"encryption." +msgid "Optional Private Key. If this is set, you can use this keypair for encryption." msgstr "可选私钥。如果设置,则可以使用此密钥对来加密。" #: src/pages/sources/saml/SAMLSourceForm.ts @@ -3544,9 +3532,7 @@ msgid "Optional URL if the IDP supports Single-Logout." msgstr "如果 IDP 支持单点登出,则为可选 URL。" #: src/pages/stages/invitation/InvitationForm.ts -msgid "" -"Optional data which is loaded into the flow's 'prompt_data' context " -"variable. YAML or JSON." +msgid "Optional data which is loaded into the flow's 'prompt_data' context variable. YAML or JSON." msgstr "加载到流程的 'prompt_data' 上下文变量中的可选数据。YAML 或 JSON。" #: src/pages/stages/identification/IdentificationStageForm.ts @@ -3554,10 +3540,7 @@ msgid "Optional enrollment flow, which is linked at the bottom of the page." msgstr "可选注册流程,链接在页面底部。" #: src/pages/stages/identification/IdentificationStageForm.ts -msgid "" -"Optional passwordless flow, which is linked at the bottom of the page. When " -"configured, users can use this flow to authenticate with a WebAuthn " -"authenticator, without entering any details." +msgid "Optional passwordless flow, which is linked at the bottom of the page. When configured, users can use this flow to authenticate with a WebAuthn authenticator, without entering any details." msgstr "可选的无密码流程,链接在页面底部。配置后,用户可以使用此流程通过 WebAuthn 身份验证器进行验证,无需输入任何详细信息。" #: src/pages/stages/identification/IdentificationStageForm.ts @@ -3569,9 +3552,7 @@ msgid "Optional, comma-separated SubjectAlt Names." msgstr "可选,逗号分隔的替代名称。" #: src/pages/applications/ApplicationForm.ts -msgid "" -"Optionally enter a group name. Applications with identical groups are shown " -"grouped together." +msgid "Optionally enter a group name. Applications with identical groups are shown grouped together." msgstr "输入可选的分组名称。分组相同的应用程序会显示在一起。 " #: src/pages/stages/prompt/PromptForm.ts @@ -3582,15 +3563,11 @@ msgstr "可选,预先填充输入值" msgid "Optionally set the 'FriendlyName' value of the Assertion attribute." msgstr "可选,设置断言属性的 'FriendlyName' 值。" -#~ msgid "" -#~ "Optionally set this to your parent domain, if you want authentication and " -#~ "authorization to happen on a domain level. If you're running applications as" -#~ " app1.domain.tld, app2.domain.tld, set this to 'domain.tld'." -#~ msgstr "" -#~ "如果您希望在域名级别进行身份验证和授权,可以选择将其设置为您的父域名。如果您运行应用 " -#~ "app1.domain.tld、app2.domain.tld,请将其设置为 'domain.tld'。" +#~ msgid "Optionally set this to your parent domain, if you want authentication and authorization to happen on a domain level. If you're running applications as app1.domain.tld, app2.domain.tld, set this to 'domain.tld'." +#~ msgstr "如果您希望在域名级别进行身份验证和授权,可以选择将其设置为您的父域名。如果您运行应用 app1.domain.tld、app2.domain.tld,请将其设置为 'domain.tld'。" -#: src/pages/flows/BoundStagesList.ts src/pages/flows/StageBindingForm.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/flows/StageBindingForm.ts #: src/pages/policies/BoundPoliciesList.ts #: src/pages/policies/BoundPoliciesList.ts #: src/pages/policies/PolicyBindingForm.ts @@ -3636,19 +3613,19 @@ msgstr "前哨状态" msgid "Outpost(s)" msgstr "前哨" -#: src/interfaces/AdminInterface.ts src/pages/outposts/OutpostListPage.ts +#: src/interfaces/AdminInterface.ts +#: src/pages/outposts/OutpostListPage.ts msgid "Outposts" msgstr "前哨" #: src/pages/outposts/OutpostListPage.ts -msgid "" -"Outposts are deployments of authentik components to support different " -"environments and protocols, like reverse proxies." +msgid "Outposts are deployments of authentik components to support different environments and protocols, like reverse proxies." msgstr "前哨是对 authentik 组件的部署,用于支持不同的环境和协议,例如反向代理。" #: src/interfaces/AdminInterface.ts #: src/pages/applications/ApplicationViewPage.ts -#: src/pages/groups/GroupViewPage.ts src/pages/providers/ProviderViewPage.ts +#: src/pages/groups/GroupViewPage.ts +#: src/pages/providers/ProviderViewPage.ts #: src/pages/sources/ldap/LDAPSourceViewPage.ts #: src/pages/sources/oauth/OAuthSourceViewPage.ts #: src/pages/sources/plex/PlexSourceViewPage.ts @@ -3661,7 +3638,8 @@ msgstr "总览" msgid "PEM-encoded Certificate data." msgstr "PEM 编码的证书数据。" -#: src/pages/groups/GroupForm.ts src/pages/groups/GroupListPage.ts +#: src/pages/groups/GroupForm.ts +#: src/pages/groups/GroupListPage.ts #: src/pages/groups/RelatedGroupList.ts msgid "Parent" msgstr "父级" @@ -3678,14 +3656,16 @@ msgstr "通过策略?" #~ msgstr "当事件匹配选定的条件时通过。" #: src/pages/applications/ApplicationCheckAccessForm.ts -#: src/pages/events/EventInfo.ts src/pages/policies/PolicyTestForm.ts +#: src/pages/events/EventInfo.ts +#: src/pages/policies/PolicyTestForm.ts msgid "Passing" msgstr "通过" #: src/flows/stages/identification/IdentificationStage.ts #: src/flows/stages/identification/IdentificationStage.ts #: src/flows/stages/password/PasswordStage.ts -#: src/pages/users/ServiceAccountForm.ts src/pages/users/UserPasswordForm.ts +#: src/pages/users/ServiceAccountForm.ts +#: src/pages/users/UserPasswordForm.ts msgid "Password" msgstr "密码" @@ -3715,10 +3695,7 @@ msgstr "密码阶段" #~ msgstr "密码、2FA 等" #: src/pages/stages/prompt/PromptForm.ts -msgid "" -"Password: Masked input, password is validated against sources. Policies " -"still have to be applied to this Stage. If two of these are used in the same" -" stage, they are ensured to be identical." +msgid "Password: Masked input, password is validated against sources. Policies still have to be applied to this Stage. If two of these are used in the same stage, they are ensured to be identical." msgstr "密码:屏蔽输入内容,密码根据来源进行验证。策略仍需应用于此阶段。如果在同一阶段使用其中的两个,则确保它们是相同的。" #: src/pages/stages/identification/IdentificationStageForm.ts @@ -3758,7 +3735,8 @@ msgstr "请输入您的 TOTP 代码" msgid "Please enter your password" msgstr "请输入您的密码" -#: src/interfaces/AdminInterface.ts src/pages/flows/FlowListPage.ts +#: src/interfaces/AdminInterface.ts +#: src/pages/flows/FlowListPage.ts #: src/pages/policies/PolicyListPage.ts msgid "Policies" msgstr "策略" @@ -3796,7 +3774,8 @@ msgid "Policy binding(s)" msgstr "策略绑定" #: src/pages/applications/ApplicationForm.ts -#: src/pages/applications/ApplicationViewPage.ts src/pages/flows/FlowForm.ts +#: src/pages/applications/ApplicationViewPage.ts +#: src/pages/flows/FlowForm.ts #: src/pages/flows/StageBindingForm.ts msgid "Policy engine mode" msgstr "策略引擎模式" @@ -3865,8 +3844,7 @@ msgid "Private key available?" msgstr "私钥可用吗?" #: src/pages/stages/captcha/CaptchaStageForm.ts -msgid "" -"Private key, acquired from https://www.google.com/recaptcha/intro/v3.html." +msgid "Private key, acquired from https://www.google.com/recaptcha/intro/v3.html." msgstr "私钥,从 https://www.google.com/recaptcha/intro/v3.html 获取。" #: src/pages/sources/oauth/OAuthSourceForm.ts @@ -3877,16 +3855,15 @@ msgstr "个人资料 URL" #~ msgstr "输入" #: src/pages/stages/consent/ConsentStageForm.ts -msgid "" -"Prompt for the user's consent. The consent can either be permanent or expire" -" in a defined amount of time." +msgid "Prompt for the user's consent. The consent can either be permanent or expire in a defined amount of time." msgstr "请求用户同意授权。同意授权可以是永久性的,也可以在规定的时间后过期。" #: src/pages/stages/prompt/PromptListPage.ts msgid "Prompt(s)" msgstr "输入" -#: src/interfaces/AdminInterface.ts src/pages/stages/prompt/PromptListPage.ts +#: src/interfaces/AdminInterface.ts +#: src/pages/stages/prompt/PromptListPage.ts msgid "Prompts" msgstr "输入" @@ -3932,8 +3909,7 @@ msgid "Protocol settings" msgstr "协议设置" #: src/pages/providers/ProviderListPage.ts -msgid "" -"Provide support for protocols like SAML and OAuth to assigned applications." +msgid "Provide support for protocols like SAML and OAuth to assigned applications." msgstr "为分配的应用程序提供对 SAML 和 OAuth 等协议的支持。" #: src/elements/oauth/UserRefreshList.ts @@ -3956,12 +3932,14 @@ msgstr "提供程序类型" msgid "Provider(s)" msgstr "提供程序" -#: src/interfaces/AdminInterface.ts src/pages/outposts/OutpostListPage.ts +#: src/interfaces/AdminInterface.ts +#: src/pages/outposts/OutpostListPage.ts #: src/pages/providers/ProviderListPage.ts msgid "Providers" msgstr "提供程序" -#: src/pages/outposts/OutpostForm.ts src/pages/outposts/OutpostListPage.ts +#: src/pages/outposts/OutpostForm.ts +#: src/pages/outposts/OutpostListPage.ts #: src/pages/providers/proxy/ProxyProviderForm.ts #: src/pages/providers/proxy/ProxyProviderViewPage.ts msgid "Proxy" @@ -3979,8 +3957,7 @@ msgid "Public Key" msgstr "公钥" #: src/pages/stages/captcha/CaptchaStageForm.ts -msgid "" -"Public key, acquired from https://www.google.com/recaptcha/intro/v3.html." +msgid "Public key, acquired from https://www.google.com/recaptcha/intro/v3.html." msgstr "公钥,从 https://www.google.com/recaptcha/intro/v3.html 获取。" #: src/pages/applications/ApplicationForm.ts @@ -3992,9 +3969,7 @@ msgid "Quick actions" msgstr "快速操作" #: src/pages/flows/StageBindingForm.ts -msgid "" -"RESTART restarts the flow from the beginning, while keeping the flow " -"context." +msgid "RESTART restarts the flow from the beginning, while keeping the flow context." msgstr "RESTART 从头开始重新启动流程,同时保留流程上下文。" #: src/pages/flows/StageBindingForm.ts @@ -4002,8 +3977,7 @@ msgid "RESTART restarts the flow from the beginning." msgstr "RESTART 从头开始重新启动流程。" #: src/pages/flows/StageBindingForm.ts -msgid "" -"RETRY returns the error message and a similar challenge to the executor." +msgid "RETRY returns the error message and a similar challenge to the executor." msgstr "RETRY 向执行器返回错误消息和类似的质询。" #~ msgid "RS256 (Asymmetric Encryption)" @@ -4044,8 +4018,10 @@ msgstr "重新评估策略" msgid "Receive a push notification on your device." msgstr "在您的设备上接收推送通知。" -#: src/pages/flows/utils.ts src/pages/tokens/TokenListPage.ts -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/flows/utils.ts +#: src/pages/tokens/TokenListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Recovery" msgstr "恢复" @@ -4055,16 +4031,15 @@ msgid "Recovery flow" msgstr "恢复流程" #: src/pages/tenants/TenantForm.ts -msgid "" -"Recovery flow. If left empty, the first applicable flow sorted by the slug " -"is used." +msgid "Recovery flow. If left empty, the first applicable flow sorted by the slug is used." msgstr "恢复流程。如果留空,则使用按 Slug 排序的第一个适用流程。" #: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts msgid "Recovery keys" msgstr "恢复密钥" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Recovery link cannot be emailed, user has no email address saved." msgstr "无法通过电子邮件发送恢复链接,用户没有保存电子邮件地址。" @@ -4100,18 +4075,15 @@ msgstr "刷新代码" msgid "Register device" msgstr "注册设备" -#~ msgid "" -#~ "Regular expressions for which authentication is not required. Each new line " -#~ "is interpreted as a new Regular Expression." +#~ msgid "Regular expressions for which authentication is not required. Each new line is interpreted as a new Regular Expression." #~ msgstr "用于描述何处不需要身份验证的正则表达式。每个新行都被解释为一个新的正则表达式。" #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"Regular expressions for which authentication is not required. Each new line " -"is interpreted as a new expression." +msgid "Regular expressions for which authentication is not required. Each new line is interpreted as a new expression." msgstr "用于描述何处不需要身份验证的正则表达式。每个新行都被解释为一个新的表达式。" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Regular user" msgstr "普通用户" @@ -4133,19 +4105,13 @@ msgid "Reputation" msgstr "信誉" #: src/pages/policies/reputation/ReputationListPage.ts -msgid "" -"Reputation for IP and user identifiers. Scores are decreased for each failed" -" login and increased for each successful login." +msgid "Reputation for IP and user identifiers. Scores are decreased for each failed login and increased for each successful login." msgstr "IP 和用户标识符的信誉。每次登录失败分数都会降低,每次登录成功分数都会增加。" -#~ msgid "" -#~ "Reputation for IPs. Scores are decreased for each failed login and increased" -#~ " for each successful login." +#~ msgid "Reputation for IPs. Scores are decreased for each failed login and increased for each successful login." #~ msgstr "IP 的信誉。每次登录失败分数都会降低,每次登录成功分数都会增加。" -#~ msgid "" -#~ "Reputation for usernames. Scores are decreased for each failed login and " -#~ "increased for each successful login." +#~ msgid "Reputation for usernames. Scores are decreased for each failed login and increased for each successful login." #~ msgstr "用户名的声誉。每次登录失败分数都会降低,每次登录成功分数都会增加。" #~ msgid "Reputation policy" @@ -4162,7 +4128,8 @@ msgstr "IP 和用户标识符的信誉。每次登录失败分数都会降低, msgid "Reputation scores" msgstr "信誉分数" -#: src/pages/events/EventInfo.ts src/pages/events/EventInfo.ts +#: src/pages/events/EventInfo.ts +#: src/pages/events/EventInfo.ts msgid "Request" msgstr "请求" @@ -4182,7 +4149,8 @@ msgstr "必需" msgid "Required." msgstr "必需。" -#: src/pages/users/ServiceAccountForm.ts src/pages/users/UserForm.ts +#: src/pages/users/ServiceAccountForm.ts +#: src/pages/users/UserForm.ts msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." msgstr "必填。不超过 150 个字符。仅限字母、数字和 @/./+/-/_ 。" @@ -4228,9 +4196,7 @@ msgstr "返回主页" msgid "Return to device picker" msgstr "返回设备选择器" -#~ msgid "" -#~ "Return true if request IP/target username's score is below a certain " -#~ "threshold." +#~ msgid "Return true if request IP/target username's score is below a certain threshold." #~ msgstr "如果请求 IP/目标用户名的分数低于特定阈值则返回真。 " #: src/elements/oauth/UserRefreshList.ts @@ -4357,7 +4323,8 @@ msgstr "搜索组" msgid "Search mode" msgstr "搜索模式" -#: src/elements/table/TableSearch.ts src/user/LibraryPage.ts +#: src/elements/table/TableSearch.ts +#: src/user/LibraryPage.ts msgid "Search..." msgstr "搜索..." @@ -4393,9 +4360,7 @@ msgid "See documentation for a list of all variables." msgstr "请阅读文档了解完整变量列表。" #: src/pages/applications/ApplicationForm.ts -msgid "" -"Select a provider that this application should use. Alternatively, create a " -"new provider." +msgid "Select a provider that this application should use. Alternatively, create a new provider." msgstr "选择此应用程序应使用的提供程序。或者创建一个新的提供程序。" #: src/elements/table/Table.ts @@ -4426,15 +4391,14 @@ msgid "Select one of the sources below to login." msgstr "选择以下源之一进行登录。" #: src/pages/stages/identification/IdentificationStageForm.ts -msgid "" -"Select sources should be shown for users to authenticate with. This only " -"affects web-based sources, not LDAP." +msgid "Select sources should be shown for users to authenticate with. This only affects web-based sources, not LDAP." msgstr "选择的源应显示给用户进行身份验证。这只会影响基于 Web 的源,而不影响 LDAP。" #: src/pages/outposts/ServiceConnectionWizard.ts #: src/pages/policies/PolicyWizard.ts #: src/pages/property-mappings/PropertyMappingWizard.ts -#: src/pages/providers/ProviderWizard.ts src/pages/sources/SourceWizard.ts +#: src/pages/providers/ProviderWizard.ts +#: src/pages/sources/SourceWizard.ts #: src/pages/stages/StageWizard.ts msgid "Select type" msgstr "选择类型" @@ -4444,37 +4408,26 @@ msgid "Select users to add" msgstr "选择要添加的用户" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts -msgid "" -"Select which scopes can be used by the client. The client still has to " -"specify the scope to access the data." +msgid "Select which scopes can be used by the client. The client still has to specify the scope to access the data." msgstr "选择客户端可以使用哪些作用域。客户端仍然需要指定访问数据的范围。" #: src/pages/sources/plex/PlexSourceForm.ts -msgid "" -"Select which server a user has to be a member of to be allowed to " -"authenticate." +msgid "Select which server a user has to be a member of to be allowed to authenticate." msgstr "选择用户必须是哪个服务器的成员才能进行身份验证。" #: src/pages/events/RuleForm.ts -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." +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 UI 中。" #: src/pages/stages/prompt/PromptStageForm.ts -msgid "" -"Selected policies are executed when the stage is submitted to validate the " -"data." +msgid "Selected policies are executed when the stage is submitted to validate the data." msgstr "当阶段被提交以验证数据时,执行选定的策略。" -#~ msgid "" -#~ "Selecting a service-connection enables the management of the outpost by " -#~ "authentik." +#~ msgid "Selecting a service-connection enables the management of the outpost by authentik." #~ msgstr "选择服务连接使 authentik 能够管理前哨。" #: src/pages/outposts/OutpostForm.ts -msgid "" -"Selecting an integration enables the management of the outpost by authentik." +msgid "Selecting an integration enables the management of the outpost by authentik." msgstr "选择集成使 authentik 能够管理前哨。" #: src/pages/stages/password/PasswordStageForm.ts @@ -4485,21 +4438,21 @@ msgstr "选择用于测试密码的后端。" msgid "Send Email again." msgstr "再次发送电子邮件。" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Send link" msgstr "发送链接" #: src/pages/events/RuleListPage.ts -msgid "" -"Send notifications whenever a specific Event is created and matched by " -"policies." +msgid "Send notifications whenever a specific Event is created and matched by policies." msgstr "每当特定事件被创建并匹配策略时,都会发送通知。" #: src/pages/events/TransportForm.ts msgid "Send once" msgstr "发送一次" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Send recovery link to user" msgstr "向用户发送恢复链接" @@ -4549,10 +4502,12 @@ msgid "Session duration" msgstr "会话持续时间" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "" -"Session not valid on or after current time + this value (Format: " -"hours=1;minutes=2;seconds=3)." -msgstr "从当前时间经过多久时或之后,会话无效(格式:hours=1;minutes=2;seconds=3)。" +#~ msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "从当前时间经过多久时或之后,会话无效(格式:hours=1;minutes=2;seconds=3)。" + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Session not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Session valid not on or after" @@ -4562,7 +4517,8 @@ msgstr "不在此刻或之后,会话有效" msgid "Session(s)" msgstr "会话" -#: src/pages/users/UserViewPage.ts src/user/user-settings/UserSettingsPage.ts +#: src/pages/users/UserViewPage.ts +#: src/user/user-settings/UserSettingsPage.ts msgid "Sessions" msgstr "会话" @@ -4571,48 +4527,41 @@ msgid "Set HTTP-Basic Authentication" msgstr "设置 HTTP-Basic 身份验证" #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"Set a custom HTTP-Basic Authentication header based on values from " -"authentik." +msgid "Set a custom HTTP-Basic Authentication header based on values from authentik." msgstr "根据来自 authentik 的值设置自定义 HTTP-Basic 身份验证标头。" -#: src/pages/groups/GroupForm.ts src/pages/outposts/OutpostForm.ts +#: src/pages/groups/GroupForm.ts +#: src/pages/outposts/OutpostForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts -#: src/pages/policies/PolicyTestForm.ts src/pages/users/UserForm.ts +#: src/pages/policies/PolicyTestForm.ts +#: src/pages/users/UserForm.ts msgid "Set custom attributes using YAML or JSON." msgstr "使用 YAML 或 JSON 设置自定义属性。" #: src/pages/tenants/TenantForm.ts -msgid "" -"Set custom attributes using YAML or JSON. Any attributes set here will be " -"inherited by users, if the request is handled by this tenant." +msgid "Set custom attributes using YAML or JSON. Any attributes set here will be inherited by users, if the request is handled by this tenant." msgstr "使用 YAML 或 JSON 格式设置自定义属性。如果请求由此租户处理,则用户会继承此处设置的任何自定义属性。 " -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "Set password" msgstr "设置密码" #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"Set this to the domain you wish the authentication to be valid for. Must be " -"a parent domain of the URL above. If you're running applications as " -"app1.domain.tld, app2.domain.tld, set this to 'domain.tld'." -msgstr "" -"将此设置为您希望身份验证有效的域名。必须是上述 URL 的父域名。如果您的应用部署在 " -"app1.domain.tld、app2.domain.tld,请将其设置为 'domain.tld'。" +msgid "Set this to the domain you wish the authentication to be valid for. Must be a parent domain of the URL above. If you're running applications as app1.domain.tld, app2.domain.tld, set this to 'domain.tld'." +msgstr "将此设置为您希望身份验证有效的域名。必须是上述 URL 的父域名。如果您的应用部署在 app1.domain.tld、app2.domain.tld,请将其设置为 'domain.tld'。" #: src/pages/providers/proxy/ProxyProviderViewPage.ts msgid "Setup" msgstr "设置" -#: src/pages/events/RuleForm.ts src/pages/events/RuleListPage.ts +#: src/pages/events/RuleForm.ts +#: src/pages/events/RuleListPage.ts msgid "Severity" msgstr "严重程度" #: src/pages/stages/prompt/PromptStageForm.ts -msgid "" -"Show arbitrary input fields to the user, for example during enrollment. Data" -" is saved in the flow context under the 'prompt_data' variable." +msgid "Show arbitrary input fields to the user, for example during enrollment. Data is saved in the flow context under the 'prompt_data' variable." msgstr "向用户显示任意输入字段,例如在注册期间。数据保存在流程上下文中的 'prompt_data' 变量下。" #: src/elements/Expand.ts @@ -4667,7 +4616,8 @@ msgstr "一次性使用" #~ msgid "Skip path regex" #~ msgstr "跳过路径正则表达式" -#: src/pages/applications/ApplicationForm.ts src/pages/flows/FlowForm.ts +#: src/pages/applications/ApplicationForm.ts +#: src/pages/flows/FlowForm.ts #: src/pages/sources/ldap/LDAPSourceForm.ts #: src/pages/sources/oauth/OAuthSourceForm.ts #: src/pages/sources/plex/PlexSourceForm.ts @@ -4701,16 +4651,11 @@ msgstr "源" msgid "Sources" msgstr "源" -#~ msgid "" -#~ "Sources of identities, which can either be synced into authentik's database," -#~ " like LDAP, or can be used by users to authenticate and enroll themselves, " -#~ "like OAuth and social logins" +#~ msgid "Sources of identities, which can either be synced into authentik's database, like LDAP, or can be used by users to authenticate and enroll themselves, like OAuth and social logins" #~ msgstr "身份来源,既可以同步到 authentik 的数据库中,例如 LDAP,也可以被用户用来进行身份验证和注册,例如 OAuth 和社交登录" #: src/pages/sources/SourceListPage.ts -msgid "" -"Sources of identities, which can either be synced into authentik's database," -" or can be used by users to authenticate and enroll themselves." +msgid "Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves." msgstr "身份来源,既可以同步到 authentik 的数据库中,也可以被用户用来进行身份验证和注册。" #: src/interfaces/locale.ts @@ -4721,7 +4666,8 @@ msgstr "西班牙语" msgid "Specify multiple server URIs by separating them with a comma." msgstr "通过用逗号分隔多个服务器 URI 来指定它们。" -#: src/pages/flows/BoundStagesList.ts src/pages/flows/StageBindingForm.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/flows/StageBindingForm.ts msgid "Stage" msgstr "阶段" @@ -4756,34 +4702,23 @@ msgstr "阶段对象" msgid "Stage type" msgstr "阶段类型" -#~ msgid "" -#~ "Stage used to configure Authenticator when user doesn't have any compatible " -#~ "devices. After this configuration Stage passes, the user is not prompted " -#~ "again." +#~ msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again." #~ msgstr "在用户没有任何兼容设备时用来配置身份验证器的阶段。此配置阶段通过后,不会再次提示用户。" #: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts -msgid "" -"Stage used to configure a TOTP authenticator (i.e. Authy/Google " -"Authenticator)." +msgid "Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator)." msgstr "用来配置 TOTP 身份验证器(即 Authy/Google 身份验证器)的阶段。" #: src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts -msgid "" -"Stage used to configure a WebAutnn authenticator (i.e. Yubikey, " -"FaceID/Windows Hello)." +msgid "Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello)." msgstr "用来配置 WebAuthn 身份验证器(即 Yubikey、FaceID/Windows Hello)的阶段。" #: src/pages/stages/authenticator_duo/AuthenticatorDuoStageForm.ts -msgid "" -"Stage used to configure a duo-based authenticator. This stage should be used" -" for configuration flows." +msgid "Stage used to configure a duo-based authenticator. This stage should be used for configuration flows." msgstr "用来配置基于 Duo 的身份验证器的阶段。此阶段应该用于配置流程。" #: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts -msgid "" -"Stage used to configure a static authenticator (i.e. static tokens). This " -"stage should be used for configuration flows." +msgid "Stage used to configure a static authenticator (i.e. static tokens). This stage should be used for configuration flows." msgstr "用来配置静态身份验证器(即静态令牌)的阶段。此阶段应该用于配置流程。" #: src/pages/stages/authenticator_sms/AuthenticatorSMSStageForm.ts @@ -4791,9 +4726,7 @@ msgid "Stage used to configure an SMS-based TOTP authenticator." msgstr "用来配置基于短信的 TOTP 身份验证器的阶段。" #: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts -msgid "" -"Stage used to validate any authenticator. This stage should be used during " -"authentication or authorization flows." +msgid "Stage used to validate any authenticator. This stage should be used during authentication or authorization flows." msgstr "用来验证任何身份验证器的阶段。此阶段应在身份验证或授权流程中使用。" #: src/pages/stages/StageListPage.ts @@ -4818,22 +4751,19 @@ msgstr "阶段" msgid "Stage-specific settings" msgstr "阶段特定设置" -#: src/interfaces/AdminInterface.ts src/pages/flows/FlowListPage.ts -#: src/pages/stages/StageListPage.ts src/pages/stages/prompt/PromptListPage.ts +#: src/interfaces/AdminInterface.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/stages/StageListPage.ts +#: src/pages/stages/prompt/PromptListPage.ts msgid "Stages" msgstr "阶段" #: src/pages/stages/StageListPage.ts -msgid "" -"Stages are single steps of a Flow that a user is guided through. A stage can" -" only be executed from within a flow." +msgid "Stages are single steps of a Flow that a user is guided through. A stage can only be executed from within a flow." msgstr "阶段是引导用户完成流程的单个步骤。阶段只能在流程内部执行。" #: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts -msgid "" -"Stages used to configure Authenticator when user doesn't have any compatible" -" devices. After this configuration Stage passes, the user is not prompted " -"again." +msgid "Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again." msgstr "当用户没有任何兼容的设备时,用来配置身份验证器的阶段。此阶段通过后,将不再请求此用户。" #: src/pages/outposts/ServiceConnectionListPage.ts @@ -4861,9 +4791,7 @@ msgid "Static: Static value, displayed as-is." msgstr "静态:静态值,按原样显示。" #: src/pages/stages/deny/DenyStageForm.ts -msgid "" -"Statically deny the flow. To use this stage effectively, disable *Evaluate " -"on plan* on the respective binding." +msgid "Statically deny the flow. To use this stage effectively, disable *Evaluate on plan* on the respective binding." msgstr "静态拒绝流。要有效地使用此阶段,请在相应的绑定上禁用*规划时进行评估*。" #: src/pages/system-tasks/SystemTaskListPage.ts @@ -4880,7 +4808,8 @@ msgstr "状态" msgid "Stop impersonation" msgstr "停止模拟身份" -#: src/pages/events/EventInfo.ts src/pages/stages/email/EmailStageForm.ts +#: src/pages/events/EventInfo.ts +#: src/pages/stages/email/EmailStageForm.ts msgid "Subject" msgstr "主题" @@ -4896,7 +4825,8 @@ msgstr "替代名称" msgid "Successful" msgstr "成功" -#: src/elements/charts/AdminLoginsChart.ts src/elements/charts/UserChart.ts +#: src/elements/charts/AdminLoginsChart.ts +#: src/elements/charts/UserChart.ts msgid "Successful Logins" msgstr "成功登录" @@ -4920,7 +4850,8 @@ msgstr "已成功复制 TOTP 配置。" msgid "Successfully created application." msgstr "已成功创建应用程序。" -#: src/pages/flows/StageBindingForm.ts src/pages/policies/PolicyBindingForm.ts +#: src/pages/flows/StageBindingForm.ts +#: src/pages/policies/PolicyBindingForm.ts msgid "Successfully created binding." msgstr "已成功创建绑定。" @@ -5026,11 +4957,13 @@ msgstr "已成功创建令牌。" msgid "Successfully created transport." msgstr "已成功创建传输。" -#: src/pages/users/ServiceAccountForm.ts src/pages/users/UserForm.ts +#: src/pages/users/ServiceAccountForm.ts +#: src/pages/users/UserForm.ts msgid "Successfully created user." msgstr "已成功创建用户。" -#: src/elements/forms/DeleteBulkForm.ts src/elements/forms/DeleteForm.ts +#: src/elements/forms/DeleteBulkForm.ts +#: src/elements/forms/DeleteForm.ts msgid "Successfully deleted {0} {1}" msgstr "已成功删除 {0} {1}" @@ -5038,7 +4971,8 @@ msgstr "已成功删除 {0} {1}" msgid "Successfully generated certificate-key pair." msgstr "已成功生成证书密钥对。" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts #: src/pages/users/UserViewPage.ts msgid "Successfully generated recovery link" msgstr "已成功生成恢复链接" @@ -5065,7 +4999,8 @@ msgstr "已成功发送测试请求。" msgid "Successfully updated application." msgstr "已成功更新应用程序。" -#: src/pages/flows/StageBindingForm.ts src/pages/policies/PolicyBindingForm.ts +#: src/pages/flows/StageBindingForm.ts +#: src/pages/policies/PolicyBindingForm.ts msgid "Successfully updated binding." msgstr "已成功更新绑定。" @@ -5194,13 +5129,16 @@ msgstr "已成功更新用户。" msgid "Successfully updated {0} {1}" msgstr "已成功更新 {0} {1}" -#: src/pages/groups/GroupViewPage.ts src/pages/users/GroupSelectModal.ts -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/groups/GroupViewPage.ts +#: src/pages/users/GroupSelectModal.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts #: src/pages/users/UserViewPage.ts msgid "Superuser" msgstr "超级用户" -#: src/pages/groups/GroupListPage.ts src/pages/groups/RelatedGroupList.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/groups/RelatedGroupList.ts msgid "Superuser privileges?" msgstr "超级用户权限?" @@ -5317,7 +5255,8 @@ msgstr "租户" msgid "Tenant(s)" msgstr "租户" -#: src/interfaces/AdminInterface.ts src/pages/tenants/TenantListPage.ts +#: src/interfaces/AdminInterface.ts +#: src/pages/tenants/TenantListPage.ts msgid "Tenants" msgstr "租户" @@ -5352,15 +5291,11 @@ msgid "The URL \"{0}\" was not found." msgstr "未找到 URL \"{0}\"。" #: src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts -msgid "" -"The authenticator MUST create a dedicated credential. If it cannot, the RP " -"is prepared for an error to occur" +msgid "The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur" msgstr "身份验证器必须创建专用凭据。如果不能,RP 预期会发生错误" #: src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts -msgid "" -"The authenticator can create and store a dedicated credential, but if it " -"doesn't that's alright too" +msgid "The authenticator can create and store a dedicated credential, but if it doesn't that's alright too" msgstr "身份验证器可以创建和存储专用凭据,但不创建也可以" #: src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts @@ -5369,22 +5304,20 @@ msgstr "身份验证器不应该创建专用凭据" #: src/pages/providers/proxy/ProxyProviderForm.ts #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"The external URL you'll access the application at. Include any non-standard " -"port." +msgid "The external URL you'll access the application at. Include any non-standard port." msgstr "您将通过此外部 URL 访问应用程序。请包括任何非标准端口。" -#~ msgid "" -#~ "The external URL you'll authenticate at. Can be the same domain as " -#~ "authentik." +#~ msgid "The external URL you'll authenticate at. Can be the same domain as authentik." #~ msgstr "您将在此外部 URL 进行身份验证。可以使用与 authentik 相同的域名。" #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"The external URL you'll authenticate at. The authentik core server should be" -" reachable under this URL." +msgid "The external URL you'll authenticate at. The authentik core server should be reachable under this URL." msgstr "您将在此外部 URL 进行身份验证。通过此 URL 应该可以访问到 authentik 核心服务器。" +#: src/elements/utils/TimeDeltaHelp.ts +msgid "The following keywords are supported:" +msgstr "" + #~ msgid "The following objects use {0}:" #~ msgstr "以下对象使用 {0}:" @@ -5412,29 +5345,16 @@ msgstr "" "策略不通过。" #: src/pages/policies/dummy/DummyPolicyForm.ts -msgid "" -"The policy takes a random time to execute. This controls the minimum time it" -" will take." +msgid "The policy takes a random time to execute. This controls the minimum time it will take." msgstr "策略需要一段随机时间来执行。这将控制所需的最短时间。" #: src/pages/providers/ldap/LDAPProviderForm.ts -msgid "" -"The start for gidNumbers, this number is added to a number generated from " -"the group.Pk to make sure that the numbers aren't too low for POSIX groups. " -"Default is 4000 to ensure that we don't collide with local groups or users " -"primary groups gidNumber" -msgstr "" -"起始 gidNumbers,这个数字会被添加到从 group.Pk 生成的数字中,以确保对于 POSIX 用户来说,这个数字不会太低。默认值为 " -"4000,以确保我们不会与本地群组或用户主组的 gidNumber 发生冲突" +msgid "The start for gidNumbers, this number is added to a number generated from the group.Pk to make sure that the numbers aren't too low for POSIX groups. Default is 4000 to ensure that we don't collide with local groups or users primary groups gidNumber" +msgstr "起始 gidNumbers,这个数字会被添加到从 group.Pk 生成的数字中,以确保对于 POSIX 用户来说,这个数字不会太低。默认值为 4000,以确保我们不会与本地群组或用户主组的 gidNumber 发生冲突" #: src/pages/providers/ldap/LDAPProviderForm.ts -msgid "" -"The start for uidNumbers, this number is added to the user.Pk to make sure " -"that the numbers aren't too low for POSIX users. Default is 2000 to ensure " -"that we don't collide with local users uidNumber" -msgstr "" -"起始 uidNumbers,这个数字会被添加到 user.Pk 中,以确保对于 POSIX 用户来说,这个数字不会太低。默认值为 " -"2000,以确保我们不会与本地用户的 uidNumber 发生冲突" +msgid "The start for uidNumbers, this number is added to the user.Pk to make sure that the numbers aren't too low for POSIX users. Default is 2000 to ensure that we don't collide with local users uidNumber" +msgstr "起始 uidNumbers,这个数字会被添加到 user.Pk 中,以确保对于 POSIX 用户来说,这个数字不会太低。默认值为 2000,以确保我们不会与本地用户的 uidNumber 发生冲突" #: src/pages/flows/BoundStagesList.ts msgid "These bindings control if this stage will be applied to the flow." @@ -5479,22 +5399,15 @@ msgid "This is the password to be used with basic auth" msgstr "这是用于 Basic 身份验证的密码" #: src/pages/stages/authenticator_sms/AuthenticatorSMSStageForm.ts -msgid "" -"This is the username to be used with basic auth or the token when used with " -"bearer token" +msgid "This is the username to be used with basic auth or the token when used with bearer token" msgstr "这是用于 Basic 身份验证的用户名,或是使用 Bearer 令牌时的令牌" #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"This provider will behave like a transparent reverse-proxy, except requests " -"must be authenticated. If your upstream application uses HTTPS, make sure to" -" connect to the outpost using HTTPS as well." -msgstr "" -"除了请求必须经过身份验证外,此提供程序的行为类似于透明反向代理。如果您的上游应用程序使用 HTTPS,请确保连接到前哨时也使用 HTTPS。" +msgid "This provider will behave like a transparent reverse-proxy, except requests must be authenticated. If your upstream application uses HTTPS, make sure to connect to the outpost using HTTPS as well." +msgstr "除了请求必须经过身份验证外,此提供程序的行为类似于透明反向代理。如果您的上游应用程序使用 HTTPS,请确保连接到前哨时也使用 HTTPS。" #: src/pages/tenants/TenantForm.ts -msgid "" -"This setting only affects new Events, as the expiration is saved per-event." +msgid "This setting only affects new Events, as the expiration is saved per-event." msgstr "此设置仅影响新事件,因为过期时间是分事件保存的。" #: src/pages/stages/invitation/InvitationStageForm.ts @@ -5502,9 +5415,7 @@ msgid "This stage can be included in enrollment flows to accept invitations." msgstr "此阶段可以包含在注册流程中以接受邀请。" #: src/pages/stages/captcha/CaptchaStageForm.ts -msgid "" -"This stage checks the user's current session against the Google reCaptcha " -"service." +msgid "This stage checks the user's current session against the Google reCaptcha service." msgstr "此阶段会根据 Google reCAPTCHA 服务检查用户的当前会话。" #: src/pages/policies/reputation/ReputationPolicyForm.ts @@ -5516,13 +5427,12 @@ msgid "Time in minutes the token sent is valid." msgstr "发出令牌的有效时间(单位为分钟)。" #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "" -"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. (Format: hours=1;minutes=2;seconds=3)." +msgid "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." msgstr "" -"删除临时用户的时间偏移。这仅适用于您的 IDP 使用 NameID 格式 'transient' " -"且用户未手动登出的情况。(格式:hours=1;minutes=2;seconds=3)。" + +#: src/pages/sources/saml/SAMLSourceForm.ts +#~ msgid "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. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "删除临时用户的时间偏移。这仅适用于您的 IDP 使用 NameID 格式 'transient' 且用户未手动登出的情况。(格式:hours=1;minutes=2;seconds=3)。" #~ msgid "Time-based One-Time Passwords" #~ msgstr "基于时间的一次性密码" @@ -5533,7 +5443,8 @@ msgstr "" msgid "Timeout" msgstr "超时" -#: src/pages/flows/FlowForm.ts src/pages/tenants/TenantForm.ts +#: src/pages/flows/FlowForm.ts +#: src/pages/tenants/TenantForm.ts msgid "Title" msgstr "标题" @@ -5542,26 +5453,19 @@ msgid "To" msgstr "至" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts -msgid "" -"To allow any redirect URI, set this value to \"*\". Be aware of the possible" -" security implications this can have." +msgid "To allow any redirect URI, set this value to \"*\". Be aware of the possible security implications this can have." msgstr "要允许任何重定向 URI,请将此值设置为 \"*\"。请注意这可能带来的安全影响。" #: src/pages/users/UserViewPage.ts -msgid "" -"To create a recovery link, the current tenant needs to have a recovery flow " -"configured." +msgid "To create a recovery link, the current tenant needs to have a recovery flow configured." msgstr "要创建恢复链接,当前租户需要配置恢复流程。" -#~ msgid "" -#~ "To directly reset a user's password, configure a recovery flow on the " -#~ "currently active tenant." +#~ msgid "To directly reset a user's password, configure a recovery flow on the currently active tenant." #~ msgstr "要直接重置用户的密码,请在当前活动的租户上配置恢复流程。" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts -msgid "" -"To let a user directly reset a their password, configure a recovery flow on " -"the currently active tenant." +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts +msgid "To let a user directly reset a their password, configure a recovery flow on the currently active tenant." msgstr "要让用户直接重置密码,请在当前活动的租户上配置恢复流程。" #: src/pages/sources/ldap/LDAPSourceForm.ts @@ -5611,9 +5515,7 @@ msgid "Tokens and App passwords" msgstr "令牌和应用程序密码" #: src/pages/tokens/TokenListPage.ts -msgid "" -"Tokens are used throughout authentik for Email validation stages, Recovery " -"keys and API access." +msgid "Tokens are used throughout authentik for Email validation stages, Recovery keys and API access." msgstr "令牌在整个 authentik 中用于电子邮件验证阶段、恢复密钥和 API 访问。" #: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts @@ -5676,12 +5578,14 @@ msgstr "Twilio 账户 SID" msgid "Twilio Auth Token" msgstr "Twilio 身份验证令牌" -#: src/pages/flows/BoundStagesList.ts src/pages/outposts/OutpostForm.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/outposts/OutpostForm.ts #: src/pages/outposts/OutpostListPage.ts #: src/pages/outposts/ServiceConnectionListPage.ts #: src/pages/policies/PolicyListPage.ts #: src/pages/property-mappings/PropertyMappingListPage.ts -#: src/pages/providers/ProviderListPage.ts src/pages/sources/SourceListPage.ts +#: src/pages/providers/ProviderListPage.ts +#: src/pages/sources/SourceListPage.ts #: src/pages/stages/prompt/PromptForm.ts #: src/pages/stages/prompt/PromptListPage.ts #: src/user/user-settings/mfa/MFADevicesPage.ts @@ -5692,7 +5596,8 @@ msgstr "类型" msgid "UI settings" msgstr "用户界面设置" -#: src/pages/events/EventInfo.ts src/pages/users/RelatedUserList.ts +#: src/pages/events/EventInfo.ts +#: src/pages/users/RelatedUserList.ts #: src/pages/users/UserListPage.ts msgid "UID" msgstr "UID" @@ -5727,9 +5632,7 @@ msgid "URL used by authentik to retrieve tokens." msgstr "authentik 用来获取令牌的 URL。" #: src/pages/sources/oauth/OAuthSourceForm.ts -msgid "" -"URL used to request the initial token. This URL is only required for OAuth " -"1." +msgid "URL used to request the initial token. This URL is only required for OAuth 1." msgstr "用于请求初始令牌的 URL。只有 OAuth 1 才需要此网址。" #: src/pages/providers/proxy/ProxyProviderForm.ts @@ -5786,11 +5689,16 @@ msgstr "最新!" #: src/pages/applications/ApplicationListPage.ts #: src/pages/applications/ApplicationViewPage.ts #: src/pages/crypto/CertificateKeyPairListPage.ts -#: src/pages/events/RuleListPage.ts src/pages/events/TransportListPage.ts -#: src/pages/flows/BoundStagesList.ts src/pages/flows/BoundStagesList.ts -#: src/pages/flows/FlowListPage.ts src/pages/flows/FlowViewPage.ts -#: src/pages/groups/GroupListPage.ts src/pages/groups/GroupViewPage.ts -#: src/pages/groups/RelatedGroupList.ts src/pages/outposts/OutpostListPage.ts +#: src/pages/events/RuleListPage.ts +#: src/pages/events/TransportListPage.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/flows/BoundStagesList.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/flows/FlowViewPage.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/groups/GroupViewPage.ts +#: src/pages/groups/RelatedGroupList.ts +#: src/pages/outposts/OutpostListPage.ts #: src/pages/outposts/ServiceConnectionListPage.ts #: src/pages/policies/BoundPoliciesList.ts #: src/pages/policies/BoundPoliciesList.ts @@ -5811,9 +5719,12 @@ msgstr "最新!" #: src/pages/stages/StageListPage.ts #: src/pages/stages/invitation/InvitationListPage.ts #: src/pages/stages/prompt/PromptListPage.ts -#: src/pages/tenants/TenantListPage.ts src/pages/tokens/TokenListPage.ts -#: src/pages/users/RelatedUserList.ts src/pages/users/UserActiveForm.ts -#: src/pages/users/UserListPage.ts src/pages/users/UserViewPage.ts +#: src/pages/tenants/TenantListPage.ts +#: src/pages/tokens/TokenListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserActiveForm.ts +#: src/pages/users/UserListPage.ts +#: src/pages/users/UserViewPage.ts #: src/user/user-settings/mfa/MFADevicesPage.ts #: src/user/user-settings/tokens/UserTokenList.ts msgid "Update" @@ -5836,11 +5747,13 @@ msgstr "更新证书密钥对" msgid "Update Device" msgstr "更新设备" -#: src/pages/flows/FlowListPage.ts src/pages/flows/FlowViewPage.ts +#: src/pages/flows/FlowListPage.ts +#: src/pages/flows/FlowViewPage.ts msgid "Update Flow" msgstr "更新流程" -#: src/pages/groups/GroupListPage.ts src/pages/groups/GroupViewPage.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/groups/GroupViewPage.ts #: src/pages/groups/RelatedGroupList.ts #: src/pages/policies/BoundPoliciesList.ts msgid "Update Group" @@ -5911,8 +5824,10 @@ msgstr "更新租户" msgid "Update Token" msgstr "更新令牌" -#: src/pages/policies/BoundPoliciesList.ts src/pages/users/RelatedUserList.ts -#: src/pages/users/UserListPage.ts src/pages/users/UserViewPage.ts +#: src/pages/policies/BoundPoliciesList.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts +#: src/pages/users/UserViewPage.ts msgid "Update User" msgstr "更新用户" @@ -5924,8 +5839,10 @@ msgstr "更新可用" msgid "Update details" msgstr "更新详情" -#: src/pages/users/RelatedUserList.ts src/pages/users/RelatedUserList.ts -#: src/pages/users/UserListPage.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts +#: src/pages/users/UserListPage.ts msgid "Update password" msgstr "更新密码" @@ -5934,8 +5851,10 @@ msgstr "更新密码" #: src/pages/policies/BoundPoliciesList.ts #: src/pages/policies/PolicyListPage.ts #: src/pages/property-mappings/PropertyMappingListPage.ts -#: src/pages/providers/ProviderListPage.ts src/pages/sources/SourceListPage.ts -#: src/pages/stages/StageListPage.ts src/pages/users/UserActiveForm.ts +#: src/pages/providers/ProviderListPage.ts +#: src/pages/sources/SourceListPage.ts +#: src/pages/stages/StageListPage.ts +#: src/pages/users/UserActiveForm.ts msgid "Update {0}" msgstr "更新 {0}" @@ -5973,57 +5892,43 @@ msgstr "使用全局设置" #: src/pages/sources/oauth/OAuthSourceForm.ts #: src/pages/sources/plex/PlexSourceForm.ts -msgid "" -"Use the user's email address, but deny enrollment when the email address " -"already exists." +msgid "Use the user's email address, but deny enrollment when the email address already exists." msgstr "使用用户的电子邮件地址,但在电子邮件地址已存在时拒绝注册。" #: src/pages/sources/oauth/OAuthSourceForm.ts #: src/pages/sources/plex/PlexSourceForm.ts -msgid "" -"Use the user's username, but deny enrollment when the username already " -"exists." +msgid "Use the user's username, but deny enrollment when the username already exists." msgstr "使用用户的用户名,但在用户名已存在时拒绝注册。" #: src/pages/users/ServiceAccountForm.ts -msgid "" -"Use the username and password below to authenticate. The password can be " -"retrieved later on the Tokens page." +msgid "Use the username and password below to authenticate. The password can be retrieved later on the Tokens page." msgstr "使用下面的用户名和密码进行身份验证。密码可以稍后在令牌页面上获取。" #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"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 manged " -"outpost, this is done for you)." -msgstr "" -"与 nginx 的 auth_request 或 traefik 的 ForwardAuth " -"一起使用此提供程序。每个应用程序/域名都需要自己的提供程序。此外,在每个域名上,/outpost.goauthentik.io " -"必须路由到前哨(在使用托管的 Outpost 时,这已经为您处理好了)。" +msgid "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 manged outpost, this is done for you)." +msgstr "与 nginx 的 auth_request 或 traefik 的 ForwardAuth 一起使用此提供程序。每个应用程序/域名都需要自己的提供程序。此外,在每个域名上,/outpost.goauthentik.io 必须路由到前哨(在使用托管的 Outpost 时,这已经为您处理好了)。" #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"Use this provider with nginx's auth_request or traefik's forwardAuth. Only a" -" single provider is required per root domain. You can't do per-application " -"authorization, but you don't have to create a provider for each application." -msgstr "" -"与 nginx 的 auth_request 或 traefik 的 ForwardAuth " -"一起使用此提供程序。每个根域名只需要一个提供程序。您无法管理每个应用程序的授权,但不必为每个应用程序分别创建提供程序。" +msgid "Use this provider with nginx's auth_request or traefik's forwardAuth. Only a single provider is required per root domain. You can't do per-application authorization, but you don't have to create a provider for each application." +msgstr "与 nginx 的 auth_request 或 traefik 的 ForwardAuth 一起使用此提供程序。每个根域名只需要一个提供程序。您无法管理每个应用程序的授权,但不必为每个应用程序分别创建提供程序。" #: src/pages/tenants/TenantForm.ts msgid "Use this tenant for each domain that doesn't have a dedicated tenant." msgstr "所有未设置专用租户的域名都将使用此租户。" -#: src/elements/events/ObjectChangelog.ts src/elements/events/UserEvents.ts +#: src/elements/events/ObjectChangelog.ts +#: src/elements/events/UserEvents.ts #: src/pages/applications/ApplicationCheckAccessForm.ts -#: src/pages/events/EventInfo.ts src/pages/events/EventListPage.ts +#: src/pages/events/EventInfo.ts +#: src/pages/events/EventListPage.ts #: src/pages/policies/PolicyBindingForm.ts #: src/pages/policies/PolicyBindingForm.ts #: src/pages/policies/PolicyTestForm.ts #: src/pages/property-mappings/PropertyMappingTestForm.ts -#: src/pages/tokens/TokenForm.ts src/pages/tokens/TokenListPage.ts -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/tokens/TokenForm.ts +#: src/pages/tokens/TokenListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts #: src/pages/users/UserViewPage.ts #: src/user/user-settings/tokens/UserTokenList.ts msgid "User" @@ -6072,9 +5977,7 @@ msgid "User interface" msgstr "用户界面" #: src/pages/policies/PolicyBindingForm.ts -msgid "" -"User mappings can only be checked if a user is already logged in when trying" -" to access this source." +msgid "User mappings can only be checked if a user is already logged in when trying to access this source." msgstr "用户绑定仅会在已登录用户访问此源时检查。" #: src/pages/sources/oauth/OAuthSourceForm.ts @@ -6101,7 +6004,8 @@ msgstr "用户设置流程" msgid "User statistics" msgstr "用户统计" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "User status" msgstr "用户状态" @@ -6125,7 +6029,8 @@ msgstr "不应进行用户验证。" msgid "User was written to" msgstr "用户被写入" -#: src/pages/policies/BoundPoliciesList.ts src/pages/users/UserViewPage.ts +#: src/pages/policies/BoundPoliciesList.ts +#: src/pages/users/UserViewPage.ts msgid "User {0}" msgstr "用户 {0}" @@ -6137,19 +6042,17 @@ msgstr "用户的头像" msgid "User's display name." msgstr "用户的显示名称" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts msgid "User(s)" msgstr "用户" #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"User/Group Attribute used for the password part of the HTTP-Basic Header." +msgid "User/Group Attribute used for the password part of the HTTP-Basic Header." msgstr "用于 HTTP-Basic 标头的密码部分的用户/组属性。" #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"User/Group Attribute used for the user part of the HTTP-Basic Header. If not" -" set, the user's Email address is used." +msgid "User/Group Attribute used for the user part of the HTTP-Basic Header. If not set, the user's Email address is used." msgstr "用于 HTTP-Basic 标头用户名部分的用户/组属性。如果未设置,则使用用户的电子邮件地址。" #: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts @@ -6158,21 +6061,24 @@ msgstr "用户信息 URL" #: src/flows/stages/identification/IdentificationStage.ts #: src/pages/stages/identification/IdentificationStageForm.ts -#: src/pages/users/RelatedUserList.ts src/pages/users/ServiceAccountForm.ts -#: src/pages/users/ServiceAccountForm.ts src/pages/users/UserForm.ts -#: src/pages/users/UserListPage.ts src/pages/users/UserViewPage.ts +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/ServiceAccountForm.ts +#: src/pages/users/ServiceAccountForm.ts +#: src/pages/users/UserForm.ts +#: src/pages/users/UserListPage.ts +#: src/pages/users/UserViewPage.ts msgid "Username" msgstr "用户名" #: src/pages/stages/prompt/PromptForm.ts -msgid "" -"Username: Same as Text input, but checks for and prevents duplicate " -"usernames." +msgid "Username: Same as Text input, but checks for and prevents duplicate usernames." msgstr "用户名:与文本输入相同,但检查并防止用户名重复。" -#: src/interfaces/AdminInterface.ts src/interfaces/AdminInterface.ts +#: src/interfaces/AdminInterface.ts +#: src/interfaces/AdminInterface.ts #: src/pages/admin-overview/AdminOverviewPage.ts -#: src/pages/groups/GroupViewPage.ts src/pages/users/UserListPage.ts +#: src/pages/groups/GroupViewPage.ts +#: src/pages/users/UserListPage.ts msgid "Users" msgstr "用户" @@ -6185,9 +6091,7 @@ msgid "Users created per day in the last month" msgstr "上个月中每天创建的用户" #: src/pages/providers/ldap/LDAPProviderForm.ts -msgid "" -"Users in the selected group can do search queries. If no group is selected, " -"no LDAP Searches are allowed." +msgid "Users in the selected group can do search queries. If no group is selected, no LDAP Searches are allowed." msgstr "所选组中的用户可以执行搜索查询。如果未选择任何组,则不允许 LDAP 搜索。" #: src/pages/events/EventInfo.ts @@ -6199,15 +6103,11 @@ msgid "Using source" msgstr "使用源" #: src/pages/users/ServiceAccountForm.ts -msgid "" -"Valid for 360 days, after which the password will automatically rotate. You " -"can copy the password from the Token List." +msgid "Valid for 360 days, after which the password will automatically rotate. You can copy the password from the Token List." msgstr "有效期为 360 天,之后密码将自动轮换。您可以从令牌列表中复制密码。" #: src/pages/providers/oauth2/OAuth2ProviderForm.ts -msgid "" -"Valid redirect URLs after a successful authorization flow. Also specify any " -"origins here for Implicit flows." +msgid "Valid redirect URLs after a successful authorization flow. Also specify any origins here for Implicit flows." msgstr "授权流程成功后有效的重定向 URL。还可以在此处为隐式流程指定任何来源。" #: src/pages/providers/proxy/ProxyProviderForm.ts @@ -6239,9 +6139,7 @@ msgid "Verification certificates" msgstr "验证证书" #: src/pages/stages/email/EmailStageForm.ts -msgid "" -"Verify the user's email address by sending them a one-time-link. Can also be" -" used for recovery to verify the user's authenticity." +msgid "Verify the user's email address by sending them a one-time-link. Can also be used for recovery to verify the user's authenticity." msgstr "通过向用户发送一次性链接来验证用户的电子邮件地址。也可用于在恢复时验证用户的真实性。" #: src/pages/admin-overview/AdminOverviewPage.ts @@ -6278,7 +6176,8 @@ msgstr "等待(最短)" #: src/pages/admin-overview/cards/SystemStatusCard.ts #: src/pages/admin-overview/cards/SystemStatusCard.ts #: src/pages/admin-overview/cards/SystemStatusCard.ts -#: src/pages/events/RuleForm.ts src/pages/system-tasks/SystemTaskListPage.ts +#: src/pages/events/RuleForm.ts +#: src/pages/system-tasks/SystemTaskListPage.ts msgid "Warning" msgstr "警告" @@ -6287,9 +6186,7 @@ msgid "Warning: Application is not used by any Outpost." msgstr "警告:应用程序未被任何前哨使用。" #: src/pages/stages/invitation/InvitationListPage.ts -msgid "" -"Warning: No invitation stage is bound to any flow. Invitations will not work" -" as expected." +msgid "Warning: No invitation stage is bound to any flow. Invitations will not work as expected." msgstr "警告:没有邀请阶段绑定到任何流程。邀请将无法按预期工作。" #: src/pages/policies/PolicyListPage.ts @@ -6312,15 +6209,13 @@ msgstr "警告:提供程序未被任何前哨使用。" msgid "Warning: Provider not assigned to any application." msgstr "警告:提供程序未分配给任何应用程序。" -#: src/pages/users/RelatedUserList.ts src/pages/users/UserListPage.ts -msgid "" -"Warning: You're about to delete the user you're logged in as ({0}). Proceed " -"at your own risk." +#: src/pages/users/RelatedUserList.ts +#: src/pages/users/UserListPage.ts +msgid "Warning: You're about to delete the user you're logged in as ({0}). Proceed at your own risk." msgstr "警告:您即将删除当前登录的用户({0})。如果继续,请自担风险。" #: src/pages/outposts/OutpostListPage.ts -msgid "" -"Warning: authentik Domain is not configured, authentication will not work." +msgid "Warning: authentik Domain is not configured, authentication will not work." msgstr "警告:未配置 authentik 域名,身份验证将不起作用。" #: src/pages/tenants/TenantForm.ts @@ -6355,16 +6250,11 @@ msgid "Welcome, {name}." msgstr "欢迎,{name}。" #: src/pages/stages/email/EmailStageForm.ts -msgid "" -"When a user returns from the email successfully, their account will be " -"activated." +msgid "When a user returns from the email successfully, their account will be activated." msgstr "当用户成功自电子邮件中返回时,其账户将被激活。" #: src/pages/stages/identification/IdentificationStageForm.ts -msgid "" -"When a valid username/email has been entered, and this option is enabled, " -"the user's username and avatar will be shown. Otherwise, the text that the " -"user entered will be shown." +msgid "When a valid username/email has been entered, and this option is enabled, the user's username and avatar will be shown. Otherwise, the text that the user entered will be shown." msgstr "如果输入了有效的用户名/电子邮箱,并且启用了此选项,则会显示用户的用户名和头像。否则,将显示用户输入的文本。" #: src/pages/stages/prompt/PromptForm.ts @@ -6376,9 +6266,7 @@ msgstr "" "如果评估失败,则返回占位符本身。" #: src/pages/sources/ldap/LDAPSourceForm.ts -msgid "" -"When connecting to an LDAP Server with TLS, certificates are not checked by " -"default. Specify a keypair to validate the remote certificate." +msgid "When connecting to an LDAP Server with TLS, certificates are not checked by default. Specify a keypair to validate the remote certificate." msgstr "使用 TLS 连接到 LDAP 服务器时,默认情况下不检查证书。指定密钥对以验证远程证书。" #: src/pages/outposts/ServiceConnectionDockerForm.ts @@ -6386,9 +6274,7 @@ msgid "When connecting via SSH, this keypair is used for authentication." msgstr "通过 SSH 连接时,此密钥对用于身份验证。" #: src/pages/stages/email/EmailStageForm.ts -msgid "" -"When enabled, global Email connection settings will be used and connection " -"settings below will be ignored." +msgid "When enabled, global Email connection settings will be used and connection settings below will be ignored." msgstr "启用后,将使用全局电子邮件连接设置,下面的连接设置将被忽略。" #: src/pages/stages/invitation/InvitationForm.ts @@ -6400,21 +6286,15 @@ msgid "When enabled, user fields are matched regardless of their casing." msgstr "启用后,无论大小写如何,都将匹配用户字段。" #: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts -msgid "" -"When multiple stages are selected, the user can choose which one they want " -"to enroll." +msgid "When multiple stages are selected, the user can choose which one they want to enroll." msgstr "选中多个阶段时,用户可以选择要注册哪个。" #: src/pages/stages/identification/IdentificationStageForm.ts -msgid "" -"When selected, a password field is shown on the same page instead of a " -"separate page. This prevents username enumeration attacks." +msgid "When selected, a password field is shown on the same page instead of a separate page. This prevents username enumeration attacks." msgstr "选中后,密码字段将显示在同一页面,而不是单独的页面上。这样可以防止用户名枚举攻击。" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "" -"When selected, incoming assertion's Signatures will be validated against " -"this certificate. To allow unsigned Requests, leave on default." +msgid "When selected, incoming assertion's Signatures will be validated against this certificate. To allow unsigned Requests, leave on default." msgstr "选中后,传入断言的签名将根据此证书进行验证。要允许未签名的请求,请保留默认值。" #: src/pages/policies/dummy/DummyPolicyForm.ts @@ -6424,32 +6304,20 @@ msgstr "选中后,传入断言的签名将根据此证书进行验证。要允 #: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts #: src/pages/policies/password/PasswordPolicyForm.ts #: src/pages/policies/reputation/ReputationPolicyForm.ts -msgid "" -"When this option is enabled, all executions of this policy will be logged. " -"By default, only execution errors are logged." +msgid "When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged." msgstr "启用此选项后,将记录此策略的所有执行日志。默认情况下,只记录执行错误。" #: src/pages/stages/prompt/PromptForm.ts -msgid "" -"When used in conjunction with a User Write stage, use attributes.foo to " -"write attributes." +msgid "When used in conjunction with a User Write stage, use attributes.foo to write attributes." msgstr "当与用户写入阶段结合使用时,请使用 attributes.foo 来编写属性。" #: src/pages/tenants/TenantForm.ts -msgid "" -"When using an external logging solution for archiving, this can be set to " -"\"minutes=5\"." +msgid "When using an external logging solution for archiving, this can be set to \"minutes=5\"." msgstr "使用外部日志记录解决方案进行存档时,可以将其设置为 \"minutes=5\"。" #: src/pages/providers/proxy/ProxyProviderForm.ts -msgid "" -"When using proxy or forward auth (single application) mode, the requested " -"URL Path is checked against the regular expressions. When using forward auth" -" (domain mode), the full requested URL including scheme and host is matched " -"against the regular expressions." -msgstr "" -"使用代理或 Forward Auth(单应用)模式时,将根据正则表达式检查请求的 URL 路径。使用 Forward " -"Auth(域名模式)时,将根据正则表达式检查请求的完整 URL(包括协议和主机名)。" +msgid "When using proxy or forward auth (single application) mode, the requested URL Path is checked against the regular expressions. When using forward auth (domain mode), the full requested URL including scheme and host is matched against the regular expressions." +msgstr "使用代理或 Forward Auth(单应用)模式时,将根据正则表达式检查请求的 URL 路径。使用 Forward Auth(域名模式)时,将根据正则表达式检查请求的完整 URL(包括协议和主机名)。" #: src/flows/FlowExecutor.ts #: src/user/user-settings/details/UserSettingsFlowExecutor.ts @@ -6478,14 +6346,17 @@ msgstr "X509 主题" #: src/elements/oauth/UserRefreshList.ts #: src/pages/applications/ApplicationCheckAccessForm.ts -#: src/pages/groups/GroupListPage.ts src/pages/groups/MemberSelectModal.ts +#: src/pages/groups/GroupListPage.ts +#: src/pages/groups/MemberSelectModal.ts #: src/pages/groups/RelatedGroupList.ts #: src/pages/outposts/ServiceConnectionListPage.ts #: src/pages/policies/BoundPoliciesList.ts #: src/pages/policies/PolicyTestForm.ts #: src/pages/providers/proxy/ProxyProviderViewPage.ts -#: src/pages/tenants/TenantListPage.ts src/pages/tokens/TokenListPage.ts -#: src/pages/users/GroupSelectModal.ts src/pages/users/RelatedUserList.ts +#: src/pages/tenants/TenantListPage.ts +#: src/pages/tokens/TokenListPage.ts +#: src/pages/users/GroupSelectModal.ts +#: src/pages/users/RelatedUserList.ts #: src/pages/users/UserListPage.ts #: src/user/user-settings/tokens/UserTokenList.ts msgid "Yes" @@ -6537,15 +6408,18 @@ msgstr "连接将被删除" msgid "no tabs defined" msgstr "未定义选项卡" -#: src/elements/forms/DeleteBulkForm.ts src/elements/forms/DeleteForm.ts +#: src/elements/forms/DeleteBulkForm.ts +#: src/elements/forms/DeleteForm.ts msgid "object will be DELETED" msgstr "对象将被删除" -#: src/elements/forms/DeleteBulkForm.ts src/elements/forms/DeleteForm.ts +#: src/elements/forms/DeleteBulkForm.ts +#: src/elements/forms/DeleteForm.ts msgid "reference will be reset to default value" msgstr "引用将被重置为默认值" -#: src/elements/forms/DeleteBulkForm.ts src/elements/forms/DeleteForm.ts +#: src/elements/forms/DeleteBulkForm.ts +#: src/elements/forms/DeleteForm.ts msgid "reference will be set to an empty value" msgstr "引用将被设置为空值" @@ -6557,7 +6431,8 @@ msgstr "以当前用户" msgid "with inspector" msgstr "附加检视器" -#: src/elements/Expand.ts src/elements/Expand.ts +#: src/elements/Expand.ts +#: src/elements/Expand.ts #: src/user/user-settings/details/stages/prompt/PromptStage.ts msgid "{0}" msgstr "{0}" @@ -6570,7 +6445,8 @@ msgstr "{0}(\"{1}\",类型为 {2})" msgid "{0} ({1})" msgstr "{0}({1})" -#: src/elements/forms/DeleteBulkForm.ts src/elements/forms/DeleteForm.ts +#: src/elements/forms/DeleteBulkForm.ts +#: src/elements/forms/DeleteForm.ts msgid "{0} ({consequence})" msgstr "{0}({consequence})" diff --git a/web/src/locales/zh-Hant.po b/web/src/locales/zh-Hant.po index 21c23cf19..63db418c7 100644 --- a/web/src/locales/zh-Hant.po +++ b/web/src/locales/zh-Hant.po @@ -22,14 +22,15 @@ msgstr "" #~ msgid "#/identity/users/{0}" #~ msgstr "#/identity/users/{0}" -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/proxy/ProxyProviderForm.ts -#: src/pages/providers/saml/SAMLProviderForm.ts +#: src/elements/utils/TimeDeltaHelp.ts +#~ msgid "(Format: days=-1;minutes=-2;seconds=-3)." +#~ msgstr "" + +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=-1;minutes=-2;seconds=-3)." msgstr "(格式: hours=-1;minutes=-2;seconds=-3)." -#: src/pages/stages/user_login/UserLoginStageForm.ts +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=1;minutes=2;seconds=3)." msgstr "(格式: hours=1;minutes=2;seconds=3)." @@ -446,8 +447,12 @@ msgid "Are you sure you want to update {0} \"{1}\"?" msgstr "你确定要更新 {0} \"{1}\" 吗?" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "断言在当前时间+此值时或之后无效(格式:hours=1;minutes=2;seconds=3)。" +#~ msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "断言在当前时间+此值时或之后无效(格式:hours=1;minutes=2;seconds=3)。" + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Assertion not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Assertion valid not before" @@ -2476,6 +2481,10 @@ msgstr "标识符" #~ msgid "Identity & Cryptography" #~ msgstr "身份与加密" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "If any of the devices user of the types selected above have been used within this duration, this stage will be skipped." +msgstr "" + #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." @@ -2749,6 +2758,10 @@ msgstr "最后显示:{0}" msgid "Last sync: {0}" msgstr "上次同步:{0}" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "Last validation threshold" +msgstr "" + #: src/pages/applications/ApplicationViewPage.ts #: src/pages/applications/ApplicationViewPage.ts msgid "Launch" @@ -3466,8 +3479,12 @@ msgid "Objects created" msgstr "已创建对象" #: src/pages/stages/consent/ConsentStageForm.ts -msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." -msgstr "偏移量,在此之后同意过期。(格式:hours=1;minutes=2;seconds=3)。" +msgid "Offset after which consent expires." +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts +#~ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "偏移量,在此之后同意过期。(格式:hours=1;minutes=2;seconds=3)。" #: src/elements/events/ObjectChangelog.ts #: src/elements/events/UserEvents.ts @@ -4485,8 +4502,12 @@ msgid "Session duration" msgstr "会话持续时间" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "在当前时间+此值时或之后,会话无效(格式:hours=1;minutes=2;seconds=3)。" +#~ msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "在当前时间+此值时或之后,会话无效(格式:hours=1;minutes=2;seconds=3)。" + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Session not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Session valid not on or after" @@ -5293,6 +5314,10 @@ msgstr "您将通过其访问应用程序的外部 URL。包括任何非标准 msgid "The external URL you'll authenticate at. The authentik core server should be reachable under this URL." msgstr "您将在其中进行身份验证的外部 URL。在此 URL 下应该可以访问身份验证核心服务器。" +#: src/elements/utils/TimeDeltaHelp.ts +msgid "The following keywords are supported:" +msgstr "" + #~ msgid "The following objects use {0}:" #~ msgstr "以下对象使用 {0}:" @@ -5402,8 +5427,12 @@ msgid "Time in minutes the token sent is valid." msgstr "发送的令牌的有效时间(以分钟为单位)。" #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "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. (Format: hours=1;minutes=2;seconds=3)." -msgstr "删除临时用户的时间偏移。这仅适用于您的 IDP 使用 NameID 格式为 “瞬态” 且用户未手动注销的情况。(格式:hours=1;minutes=2;seconds=3)。" +msgid "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." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts +#~ msgid "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. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "删除临时用户的时间偏移。这仅适用于您的 IDP 使用 NameID 格式为 “瞬态” 且用户未手动注销的情况。(格式:hours=1;minutes=2;seconds=3)。" #~ msgid "Time-based One-Time Passwords" #~ msgstr "基于时间的一次性密码" diff --git a/web/src/locales/zh_TW.po b/web/src/locales/zh_TW.po index 94ef54129..8803f38a6 100644 --- a/web/src/locales/zh_TW.po +++ b/web/src/locales/zh_TW.po @@ -22,14 +22,15 @@ msgstr "" #~ msgid "#/identity/users/{0}" #~ msgstr "#/identity/users/{0}" -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/oauth2/OAuth2ProviderForm.ts -#: src/pages/providers/proxy/ProxyProviderForm.ts -#: src/pages/providers/saml/SAMLProviderForm.ts +#: src/elements/utils/TimeDeltaHelp.ts +#~ msgid "(Format: days=-1;minutes=-2;seconds=-3)." +#~ msgstr "" + +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=-1;minutes=-2;seconds=-3)." msgstr "(格式: hours=-1;minutes=-2;seconds=-3)." -#: src/pages/stages/user_login/UserLoginStageForm.ts +#: src/elements/utils/TimeDeltaHelp.ts msgid "(Format: hours=1;minutes=2;seconds=3)." msgstr "(格式: hours=1;minutes=2;seconds=3)." @@ -446,8 +447,12 @@ msgid "Are you sure you want to update {0} \"{1}\"?" msgstr "你确定要更新 {0} \"{1}\" 吗?" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "断言在当前时间+此值时或之后无效(格式:hours=1;minutes=2;seconds=3)。" +#~ msgid "Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "断言在当前时间+此值时或之后无效(格式:hours=1;minutes=2;seconds=3)。" + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Assertion not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Assertion valid not before" @@ -2476,6 +2481,10 @@ msgstr "标识符" #~ msgid "Identity & Cryptography" #~ msgstr "身份与加密" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "If any of the devices user of the types selected above have been used within this duration, this stage will be skipped." +msgstr "" + #: src/pages/outposts/ServiceConnectionDockerForm.ts #: src/pages/outposts/ServiceConnectionKubernetesForm.ts msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." @@ -2749,6 +2758,10 @@ msgstr "最后显示:{0}" msgid "Last sync: {0}" msgstr "上次同步:{0}" +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +msgid "Last validation threshold" +msgstr "" + #: src/pages/applications/ApplicationViewPage.ts #: src/pages/applications/ApplicationViewPage.ts msgid "Launch" @@ -3466,8 +3479,12 @@ msgid "Objects created" msgstr "已创建对象" #: src/pages/stages/consent/ConsentStageForm.ts -msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." -msgstr "偏移量,在此之后同意过期。(格式:hours=1;minutes=2;seconds=3)。" +msgid "Offset after which consent expires." +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts +#~ msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "偏移量,在此之后同意过期。(格式:hours=1;minutes=2;seconds=3)。" #: src/elements/events/ObjectChangelog.ts #: src/elements/events/UserEvents.ts @@ -4485,8 +4502,12 @@ msgid "Session duration" msgstr "会话持续时间" #: src/pages/providers/saml/SAMLProviderForm.ts -msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." -msgstr "在当前时间+此值时或之后,会话无效(格式:hours=1;minutes=2;seconds=3)。" +#~ msgid "Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "在当前时间+此值时或之后,会话无效(格式:hours=1;minutes=2;seconds=3)。" + +#: src/pages/providers/saml/SAMLProviderForm.ts +msgid "Session not valid on or after current time + this value." +msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts msgid "Session valid not on or after" @@ -5293,6 +5314,10 @@ msgstr "您将通过其访问应用程序的外部 URL。包括任何非标准 msgid "The external URL you'll authenticate at. The authentik core server should be reachable under this URL." msgstr "您将在其中进行身份验证的外部 URL。在此 URL 下应该可以访问身份验证核心服务器。" +#: src/elements/utils/TimeDeltaHelp.ts +msgid "The following keywords are supported:" +msgstr "" + #~ msgid "The following objects use {0}:" #~ msgstr "以下对象使用 {0}:" @@ -5402,8 +5427,12 @@ msgid "Time in minutes the token sent is valid." msgstr "发送的令牌的有效时间(以分钟为单位)。" #: src/pages/sources/saml/SAMLSourceForm.ts -msgid "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. (Format: hours=1;minutes=2;seconds=3)." -msgstr "删除临时用户的时间偏移。这仅适用于您的 IDP 使用 NameID 格式为 “瞬态” 且用户未手动注销的情况。(格式:hours=1;minutes=2;seconds=3)。" +msgid "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." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts +#~ msgid "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. (Format: hours=1;minutes=2;seconds=3)." +#~ msgstr "删除临时用户的时间偏移。这仅适用于您的 IDP 使用 NameID 格式为 “瞬态” 且用户未手动注销的情况。(格式:hours=1;minutes=2;seconds=3)。" #~ msgid "Time-based One-Time Passwords" #~ msgstr "基于时间的一次性密码" diff --git a/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts b/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts index c2eb01cc3..3176db807 100644 --- a/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts +++ b/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts @@ -21,6 +21,7 @@ import { DEFAULT_CONFIG } from "../../../api/Config"; import "../../../elements/forms/FormGroup"; import "../../../elements/forms/HorizontalFormElement"; import { ModelForm } from "../../../elements/forms/ModelForm"; +import "../../../elements/utils/TimeDeltaHelp"; import { first, randomString } from "../../../utils"; @customElement("ak-provider-oauth2-form") @@ -230,9 +231,7 @@ ${this.instance?.redirectUris} ${t`If you are using an Implicit, client-side flow (where the token-endpoint isn't used), you probably want to increase this time.`}

-

- ${t`(Format: hours=-1;minutes=-2;seconds=-3).`} -

+ ${t`Configure how long refresh tokens and their id_tokens are valid for.`}

-

- ${t`(Format: hours=-1;minutes=-2;seconds=-3).`} -

+
+

+ ${t`If any of the devices user of the types selected above have been used within this duration, this stage will be skipped.`} +

+ +
{ @@ -113,8 +114,9 @@ export class ConsentStageForm extends ModelForm { required />

- ${t`Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3).`} + ${t`Offset after which consent expires.`}

+
diff --git a/web/src/pages/stages/user_login/UserLoginStageForm.ts b/web/src/pages/stages/user_login/UserLoginStageForm.ts index 7d0f36cd3..6baf0475d 100644 --- a/web/src/pages/stages/user_login/UserLoginStageForm.ts +++ b/web/src/pages/stages/user_login/UserLoginStageForm.ts @@ -9,6 +9,7 @@ import { DEFAULT_CONFIG } from "../../../api/Config"; import "../../../elements/forms/FormGroup"; import "../../../elements/forms/HorizontalFormElement"; import { ModelForm } from "../../../elements/forms/ModelForm"; +import "../../../elements/utils/TimeDeltaHelp"; import { first } from "../../../utils"; @customElement("ak-stage-user-login-form") @@ -68,9 +69,7 @@ export class UserLoginStageForm extends ModelForm {

${t`Determines how long a session lasts. Default of 0 seconds means that the sessions lasts until the browser is closed.`}

-

- ${t`(Format: hours=1;minutes=2;seconds=3).`} -

+ diff --git a/website/docs/flow/stages/authenticator_validate/index.md b/website/docs/flow/stages/authenticator_validate/index.md index 458a6e92e..c274e68d1 100644 --- a/website/docs/flow/stages/authenticator_validate/index.md +++ b/website/docs/flow/stages/authenticator_validate/index.md @@ -18,6 +18,9 @@ Using the `Not configured action`, you can choose what happens when a user does - Deny: Access is denied, the flow execution ends - Configure: This option requires a _Configuration stage_ to be set. The validation stage will be marked as successful, and the configuration stage will be injected into the flow. +By default, authenticator validation is required every time the flow containing this stage is executed. To only change this behavior, set _Last validation threshold_ to a non-zero value. (Requires authentik 2022.5) +Keep in mind that when using Code-based devices (TOTP, Static and SMS), values lower than `seconds=30` cannot be used, as with the way TOTP devices are saved, there is no exact timestamp. + ## Passwordless authentication :::info