core/rbac: fix missing field when removing perm, add delete from object page (#7226)

* make object permissions deletable from the object page

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix error when removing object permissions form user/role page

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* upgrade translation

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
Jens L 2023-10-19 14:53:56 +02:00 committed by GitHub
parent 34367a7481
commit acad3c4d5c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 337 additions and 68 deletions

View File

@ -8,7 +8,7 @@ import { msg } from "@lit/localize";
import { TemplateResult, html } from "lit"; import { TemplateResult, html } from "lit";
import { customElement, property } from "lit/decorators.js"; import { customElement, property } from "lit/decorators.js";
import { ExtraRoleObjectPermission, RbacApi } from "@goauthentik/api"; import { ExtraRoleObjectPermission, ModelEnum, RbacApi } from "@goauthentik/api";
@customElement("ak-role-permissions-object-table") @customElement("ak-role-permissions-object-table")
export class RolePermissionObjectTable extends Table<ExtraRoleObjectPermission> { export class RolePermissionObjectTable extends Table<ExtraRoleObjectPermission> {
@ -64,6 +64,7 @@ export class RolePermissionObjectTable extends Table<ExtraRoleObjectPermission>
patchedPermissionAssignRequest: { patchedPermissionAssignRequest: {
permissions: [`${item.appLabel}.${item.codename}`], permissions: [`${item.appLabel}.${item.codename}`],
objectPk: item.objectPk, objectPk: item.objectPk,
model: `${item.appLabel}.${item.model}` as ModelEnum,
}, },
}); });
}} }}

View File

@ -8,7 +8,7 @@ import { msg } from "@lit/localize";
import { TemplateResult, html } from "lit"; import { TemplateResult, html } from "lit";
import { customElement, property } from "lit/decorators.js"; import { customElement, property } from "lit/decorators.js";
import { ExtraUserObjectPermission, RbacApi } from "@goauthentik/api"; import { ExtraUserObjectPermission, ModelEnum, RbacApi } from "@goauthentik/api";
@customElement("ak-user-assigned-object-permissions-table") @customElement("ak-user-assigned-object-permissions-table")
export class UserAssignedObjectPermissionsTable extends Table<ExtraUserObjectPermission> { export class UserAssignedObjectPermissionsTable extends Table<ExtraUserObjectPermission> {
@ -60,6 +60,7 @@ export class UserAssignedObjectPermissionsTable extends Table<ExtraUserObjectPer
patchedPermissionAssignRequest: { patchedPermissionAssignRequest: {
permissions: [`${item.appLabel}.${item.codename}`], permissions: [`${item.appLabel}.${item.codename}`],
objectPk: item.objectPk, objectPk: item.objectPk,
model: `${item.appLabel}.${item.model}` as ModelEnum,
}, },
}); });
}} }}

View File

@ -25,6 +25,7 @@ export class ObjectPermissionPage extends AKElement {
static get styles(): CSSResult[] { static get styles(): CSSResult[] {
return [PFBase, PFGrid, PFPage, PFCard]; return [PFBase, PFGrid, PFPage, PFCard];
} }
render(): TemplateResult { render(): TemplateResult {
return html`<ak-tabs pageIdentifier="permissionPage"> return html`<ak-tabs pageIdentifier="permissionPage">
<section <section

View File

@ -1,5 +1,6 @@
import { DEFAULT_CONFIG } from "@goauthentik/app/common/api/config"; import { DEFAULT_CONFIG } from "@goauthentik/app/common/api/config";
import { PaginatedResponse, Table, TableColumn } from "@goauthentik/app/elements/table/Table"; import { PaginatedResponse, Table, TableColumn } from "@goauthentik/app/elements/table/Table";
import "@goauthentik/elements/forms/DeleteBulkForm";
import "@goauthentik/elements/forms/ModalForm"; import "@goauthentik/elements/forms/ModalForm";
import "@goauthentik/elements/rbac/RoleObjectPermissionForm"; import "@goauthentik/elements/rbac/RoleObjectPermissionForm";
import "@patternfly/elements/pf-tooltip/pf-tooltip.js"; import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
@ -27,6 +28,8 @@ export class RoleAssignedObjectPermissionTable extends Table<RoleAssignedObjectP
@state() @state()
modelPermissions?: PaginatedPermissionList; modelPermissions?: PaginatedPermissionList;
checkbox = true;
async apiEndpoint(page: number): Promise<PaginatedResponse<RoleAssignedObjectPermission>> { async apiEndpoint(page: number): Promise<PaginatedResponse<RoleAssignedObjectPermission>> {
const perms = await new RbacApi(DEFAULT_CONFIG).rbacPermissionsAssignedByRolesList({ const perms = await new RbacApi(DEFAULT_CONFIG).rbacPermissionsAssignedByRolesList({
page: page, page: page,
@ -72,6 +75,35 @@ export class RoleAssignedObjectPermissionTable extends Table<RoleAssignedObjectP
</ak-forms-modal>`; </ak-forms-modal>`;
} }
renderToolbarSelected(): TemplateResult {
const disabled = this.selectedElements.length < 1;
return html`<ak-forms-delete-bulk
objectLabel=${msg("Permission(s)")}
.objects=${this.selectedElements}
.metadata=${(item: RoleAssignedObjectPermission) => {
return [{ key: msg("Permission"), value: item.name }];
}}
.delete=${(item: RoleAssignedObjectPermission) => {
return new RbacApi(
DEFAULT_CONFIG,
).rbacPermissionsAssignedByRolesUnassignPartialUpdate({
uuid: item.rolePk,
patchedPermissionAssignRequest: {
objectPk: this.objectPk?.toString(),
model: this.model,
permissions: item.permissions.map((perm) => {
return `${perm.appLabel}.${perm.codename}`;
}),
},
});
}}
>
<button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
${msg("Delete")}
</button>
</ak-forms-delete-bulk>`;
}
row(item: RoleAssignedObjectPermission): TemplateResult[] { row(item: RoleAssignedObjectPermission): TemplateResult[] {
const baseRow = [html` <a href="#/identity/roles/${item.rolePk}">${item.name}</a>`]; const baseRow = [html` <a href="#/identity/roles/${item.rolePk}">${item.name}</a>`];
this.modelPermissions?.results.forEach((perm) => { this.modelPermissions?.results.forEach((perm) => {

View File

@ -1,5 +1,6 @@
import { DEFAULT_CONFIG } from "@goauthentik/app/common/api/config"; import { DEFAULT_CONFIG } from "@goauthentik/app/common/api/config";
import { PaginatedResponse, Table, TableColumn } from "@goauthentik/app/elements/table/Table"; import { PaginatedResponse, Table, TableColumn } from "@goauthentik/app/elements/table/Table";
import "@goauthentik/elements/forms/DeleteBulkForm";
import "@goauthentik/elements/forms/ModalForm"; import "@goauthentik/elements/forms/ModalForm";
import "@goauthentik/elements/rbac/UserObjectPermissionForm"; import "@goauthentik/elements/rbac/UserObjectPermissionForm";
import "@patternfly/elements/pf-tooltip/pf-tooltip.js"; import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
@ -27,6 +28,8 @@ export class UserAssignedObjectPermissionTable extends Table<UserAssignedObjectP
@state() @state()
modelPermissions?: PaginatedPermissionList; modelPermissions?: PaginatedPermissionList;
checkbox = true;
async apiEndpoint(page: number): Promise<PaginatedResponse<UserAssignedObjectPermission>> { async apiEndpoint(page: number): Promise<PaginatedResponse<UserAssignedObjectPermission>> {
const perms = await new RbacApi(DEFAULT_CONFIG).rbacPermissionsAssignedByUsersList({ const perms = await new RbacApi(DEFAULT_CONFIG).rbacPermissionsAssignedByUsersList({
page: page, page: page,
@ -72,6 +75,40 @@ export class UserAssignedObjectPermissionTable extends Table<UserAssignedObjectP
</ak-forms-modal>`; </ak-forms-modal>`;
} }
renderToolbarSelected(): TemplateResult {
const disabled =
this.selectedElements.length < 1 ||
this.selectedElements.filter((item) => item.isSuperuser).length > 0;
return html`<ak-forms-delete-bulk
objectLabel=${msg("Permission(s)")}
.objects=${this.selectedElements.filter((item) => !item.isSuperuser)}
.metadata=${(item: UserAssignedObjectPermission) => {
return [{ key: msg("Permission"), value: item.name }];
}}
.delete=${(item: UserAssignedObjectPermission) => {
if (item.isSuperuser) {
return Promise.resolve();
}
return new RbacApi(
DEFAULT_CONFIG,
).rbacPermissionsAssignedByUsersUnassignPartialUpdate({
id: item.pk,
patchedPermissionAssignRequest: {
objectPk: this.objectPk?.toString(),
model: this.model,
permissions: item.permissions.map((perm) => {
return `${perm.appLabel}.${perm.codename}`;
}),
},
});
}}
>
<button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
${msg("Delete")}
</button>
</ak-forms-delete-bulk>`;
}
row(item: UserAssignedObjectPermission): TemplateResult[] { row(item: UserAssignedObjectPermission): TemplateResult[] {
const baseRow = [html` <a href="#/identity/users/${item.pk}"> ${item.username} </a> `]; const baseRow = [html` <a href="#/identity/users/${item.pk}"> ${item.username} </a> `];
this.modelPermissions?.results.forEach((perm) => { this.modelPermissions?.results.forEach((perm) => {

View File

@ -1719,10 +1719,6 @@
<source>Applications</source> <source>Applications</source>
<target>Anwendungen</target> <target>Anwendungen</target>
</trans-unit> </trans-unit>
<trans-unit id="sb9024c1640c4da12">
<source>External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
<target>Externe Anwendungen, die Authentik als Identitätsanbieter verwenden und Protokolle wie OAuth2 und SAML verwenden. Hier werden alle Anwendungen angezeigt; auch diejenigen, auf die Sie keinen Zugriff haben.</target>
</trans-unit>
<trans-unit id="s96b2fefc550e4b1c"> <trans-unit id="s96b2fefc550e4b1c">
<source>Provider Type</source> <source>Provider Type</source>
<target>Anbietertyp</target> <target>Anbietertyp</target>
@ -5984,6 +5980,30 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s2da4aa7a9abeb653"> <trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source> <source>Pseudolocale (for testing)</source>
</trans-unit>
<trans-unit id="s4bd386db7302bb22">
<source>Create With Wizard</source>
</trans-unit>
<trans-unit id="s070fdfb03034ca9b">
<source>One hint, 'New Application Wizard', is currently hidden</source>
</trans-unit>
<trans-unit id="s61bd841e66966325">
<source>External applications that use authentik as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
</trans-unit>
<trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source>
</trans-unit>
<trans-unit id="s6985c401e1100122">
<source>Message shown when this stage is run.</source>
</trans-unit>
<trans-unit id="s09f0c100d0ad2fec">
<source>Open Wizard</source>
</trans-unit>
<trans-unit id="sf2ef885f7d0a101d">
<source>Demo Wizard</source>
</trans-unit>
<trans-unit id="s77505ee5d2e45e53">
<source>Run the demo wizard</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -1815,10 +1815,6 @@
<source>Applications</source> <source>Applications</source>
<target>Applications</target> <target>Applications</target>
</trans-unit> </trans-unit>
<trans-unit id="sb9024c1640c4da12">
<source>External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
<target>External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</target>
</trans-unit>
<trans-unit id="s96b2fefc550e4b1c"> <trans-unit id="s96b2fefc550e4b1c">
<source>Provider Type</source> <source>Provider Type</source>
<target>Provider Type</target> <target>Provider Type</target>
@ -6266,6 +6262,30 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s2da4aa7a9abeb653"> <trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source> <source>Pseudolocale (for testing)</source>
</trans-unit>
<trans-unit id="s4bd386db7302bb22">
<source>Create With Wizard</source>
</trans-unit>
<trans-unit id="s070fdfb03034ca9b">
<source>One hint, 'New Application Wizard', is currently hidden</source>
</trans-unit>
<trans-unit id="s61bd841e66966325">
<source>External applications that use authentik as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
</trans-unit>
<trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source>
</trans-unit>
<trans-unit id="s6985c401e1100122">
<source>Message shown when this stage is run.</source>
</trans-unit>
<trans-unit id="s09f0c100d0ad2fec">
<source>Open Wizard</source>
</trans-unit>
<trans-unit id="sf2ef885f7d0a101d">
<source>Demo Wizard</source>
</trans-unit>
<trans-unit id="s77505ee5d2e45e53">
<source>Run the demo wizard</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -1691,10 +1691,6 @@
<source>Applications</source> <source>Applications</source>
<target>Aplicaciones</target> <target>Aplicaciones</target>
</trans-unit> </trans-unit>
<trans-unit id="sb9024c1640c4da12">
<source>External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
<target>Aplicaciones externas que usan authentik como proveedor de identidad, utilizando protocolos como OAuth2 y SAML. Aquí se muestran todas las aplicaciones, incluso aquellas a las que no puede acceder.</target>
</trans-unit>
<trans-unit id="s96b2fefc550e4b1c"> <trans-unit id="s96b2fefc550e4b1c">
<source>Provider Type</source> <source>Provider Type</source>
<target>Tipo de proveedor</target> <target>Tipo de proveedor</target>
@ -5899,6 +5895,30 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s2da4aa7a9abeb653"> <trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source> <source>Pseudolocale (for testing)</source>
</trans-unit>
<trans-unit id="s4bd386db7302bb22">
<source>Create With Wizard</source>
</trans-unit>
<trans-unit id="s070fdfb03034ca9b">
<source>One hint, 'New Application Wizard', is currently hidden</source>
</trans-unit>
<trans-unit id="s61bd841e66966325">
<source>External applications that use authentik as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
</trans-unit>
<trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source>
</trans-unit>
<trans-unit id="s6985c401e1100122">
<source>Message shown when this stage is run.</source>
</trans-unit>
<trans-unit id="s09f0c100d0ad2fec">
<source>Open Wizard</source>
</trans-unit>
<trans-unit id="sf2ef885f7d0a101d">
<source>Demo Wizard</source>
</trans-unit>
<trans-unit id="s77505ee5d2e45e53">
<source>Run the demo wizard</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -2261,11 +2261,6 @@ Il y a <x id="0" equiv-text="${ago}"/> jour(s)</target>
<source>Applications</source> <source>Applications</source>
<target>Applications</target> <target>Applications</target>
</trans-unit>
<trans-unit id="sb9024c1640c4da12">
<source>External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
<target>Applications externes qui utilisent authentik comme fournisseur d'identité, en utilisant des protocoles comme OAuth2 et SAML. Toutes les applications sont affichées ici, même celles auxquelles vous n'avez pas accéder.</target>
</trans-unit> </trans-unit>
<trans-unit id="s96b2fefc550e4b1c"> <trans-unit id="s96b2fefc550e4b1c">
<source>Provider Type</source> <source>Provider Type</source>
@ -7842,6 +7837,30 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti
</trans-unit> </trans-unit>
<trans-unit id="s2da4aa7a9abeb653"> <trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source> <source>Pseudolocale (for testing)</source>
</trans-unit>
<trans-unit id="s4bd386db7302bb22">
<source>Create With Wizard</source>
</trans-unit>
<trans-unit id="s070fdfb03034ca9b">
<source>One hint, 'New Application Wizard', is currently hidden</source>
</trans-unit>
<trans-unit id="s61bd841e66966325">
<source>External applications that use authentik as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
</trans-unit>
<trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source>
</trans-unit>
<trans-unit id="s6985c401e1100122">
<source>Message shown when this stage is run.</source>
</trans-unit>
<trans-unit id="s09f0c100d0ad2fec">
<source>Open Wizard</source>
</trans-unit>
<trans-unit id="sf2ef885f7d0a101d">
<source>Demo Wizard</source>
</trans-unit>
<trans-unit id="s77505ee5d2e45e53">
<source>Run the demo wizard</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -1747,10 +1747,6 @@
<source>Applications</source> <source>Applications</source>
<target>Aplikacje</target> <target>Aplikacje</target>
</trans-unit> </trans-unit>
<trans-unit id="sb9024c1640c4da12">
<source>External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
<target>Aplikacje zewnętrzne, które używają authentik jako dostawcy tożsamości, wykorzystując protokoły takie jak OAuth2 i SAML. Tutaj wyświetlane są wszystkie aplikacje, nawet te, do których nie masz dostępu.</target>
</trans-unit>
<trans-unit id="s96b2fefc550e4b1c"> <trans-unit id="s96b2fefc550e4b1c">
<source>Provider Type</source> <source>Provider Type</source>
<target>Typ dostawcy</target> <target>Typ dostawcy</target>
@ -6107,6 +6103,30 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s2da4aa7a9abeb653"> <trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source> <source>Pseudolocale (for testing)</source>
</trans-unit>
<trans-unit id="s4bd386db7302bb22">
<source>Create With Wizard</source>
</trans-unit>
<trans-unit id="s070fdfb03034ca9b">
<source>One hint, 'New Application Wizard', is currently hidden</source>
</trans-unit>
<trans-unit id="s61bd841e66966325">
<source>External applications that use authentik as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
</trans-unit>
<trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source>
</trans-unit>
<trans-unit id="s6985c401e1100122">
<source>Message shown when this stage is run.</source>
</trans-unit>
<trans-unit id="s09f0c100d0ad2fec">
<source>Open Wizard</source>
</trans-unit>
<trans-unit id="sf2ef885f7d0a101d">
<source>Demo Wizard</source>
</trans-unit>
<trans-unit id="s77505ee5d2e45e53">
<source>Run the demo wizard</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -2241,11 +2241,6 @@
<source>Applications</source> <source>Applications</source>
<target>Àƥƥĺĩćàţĩōńś</target> <target>Àƥƥĺĩćàţĩōńś</target>
</trans-unit>
<trans-unit id="sb9024c1640c4da12">
<source>External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
<target>Ēxţēŕńàĺ Àƥƥĺĩćàţĩōńś ŵĥĩćĥ ũśē àũţĥēńţĩķ àś Ĩďēńţĩţŷ-Ƥŕōvĩďēŕ, ũţĩĺĩźĩńĝ ƥŕōţōćōĺś ĺĩķē ŌÀũţĥ2 àńď ŚÀMĹ. Àĺĺ àƥƥĺĩćàţĩōńś àŕē śĥōŵń ĥēŕē, ēvēń ōńēś ŷōũ ćàńńōţ àććēśś.</target>
</trans-unit> </trans-unit>
<trans-unit id="s96b2fefc550e4b1c"> <trans-unit id="s96b2fefc550e4b1c">
<source>Provider Type</source> <source>Provider Type</source>
@ -7808,4 +7803,28 @@ Bindings to groups/users are checked against the user of the event.</source>
<source>Role Info</source> <source>Role Info</source>
<target>Ŕōĺē Ĩńƒō</target> <target>Ŕōĺē Ĩńƒō</target>
</trans-unit> </trans-unit>
<trans-unit id="s4bd386db7302bb22">
<source>Create With Wizard</source>
</trans-unit>
<trans-unit id="s070fdfb03034ca9b">
<source>One hint, 'New Application Wizard', is currently hidden</source>
</trans-unit>
<trans-unit id="s61bd841e66966325">
<source>External applications that use authentik as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
</trans-unit>
<trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source>
</trans-unit>
<trans-unit id="s6985c401e1100122">
<source>Message shown when this stage is run.</source>
</trans-unit>
<trans-unit id="s09f0c100d0ad2fec">
<source>Open Wizard</source>
</trans-unit>
<trans-unit id="sf2ef885f7d0a101d">
<source>Demo Wizard</source>
</trans-unit>
<trans-unit id="s77505ee5d2e45e53">
<source>Run the demo wizard</source>
</trans-unit>
</body></file></xliff> </body></file></xliff>

View File

@ -1690,10 +1690,6 @@
<source>Applications</source> <source>Applications</source>
<target>Uygulamalar</target> <target>Uygulamalar</target>
</trans-unit> </trans-unit>
<trans-unit id="sb9024c1640c4da12">
<source>External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
<target>OAuth2 ve SAML gibi protokolleri kullanan Kimlik Sağlayıcı olarak authentik'i kullanan Harici Uygulamalar. Tüm uygulamalar burada gösterilir, erişemediğiniz uygulamalar bile.</target>
</trans-unit>
<trans-unit id="s96b2fefc550e4b1c"> <trans-unit id="s96b2fefc550e4b1c">
<source>Provider Type</source> <source>Provider Type</source>
<target>Sağlayıcı Türü</target> <target>Sağlayıcı Türü</target>
@ -5892,6 +5888,30 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s2da4aa7a9abeb653"> <trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source> <source>Pseudolocale (for testing)</source>
</trans-unit>
<trans-unit id="s4bd386db7302bb22">
<source>Create With Wizard</source>
</trans-unit>
<trans-unit id="s070fdfb03034ca9b">
<source>One hint, 'New Application Wizard', is currently hidden</source>
</trans-unit>
<trans-unit id="s61bd841e66966325">
<source>External applications that use authentik as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
</trans-unit>
<trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source>
</trans-unit>
<trans-unit id="s6985c401e1100122">
<source>Message shown when this stage is run.</source>
</trans-unit>
<trans-unit id="s09f0c100d0ad2fec">
<source>Open Wizard</source>
</trans-unit>
<trans-unit id="sf2ef885f7d0a101d">
<source>Demo Wizard</source>
</trans-unit>
<trans-unit id="s77505ee5d2e45e53">
<source>Run the demo wizard</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" ?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2"> <?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="zh-Hans" source-language="en" original="lit-localize-inputs" datatype="plaintext"> <file target-language="zh-Hans" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body> <body>
<trans-unit id="s4caed5b7a7e5d89b"> <trans-unit id="s4caed5b7a7e5d89b">
@ -613,9 +613,9 @@
</trans-unit> </trans-unit>
<trans-unit id="saa0e2675da69651b"> <trans-unit id="saa0e2675da69651b">
<source>The URL &quot;<x id="0" equiv-text="${this.url}"/>&quot; was not found.</source> <source>The URL "<x id="0" equiv-text="${this.url}"/>" was not found.</source>
<target>未找到 URL &quot; <target>未找到 URL "
<x id="0" equiv-text="${this.url}"/>&quot;。</target> <x id="0" equiv-text="${this.url}"/>"。</target>
</trans-unit> </trans-unit>
<trans-unit id="s58cd9c2fe836d9c6"> <trans-unit id="s58cd9c2fe836d9c6">
@ -1067,8 +1067,8 @@
</trans-unit> </trans-unit>
<trans-unit id="sa8384c9c26731f83"> <trans-unit id="sa8384c9c26731f83">
<source>To allow any redirect URI, set this value to &quot;.*&quot;. Be aware of the possible security implications this can have.</source> <source>To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have.</source>
<target>要允许任何重定向 URI请将此值设置为 &quot;.*&quot;。请注意这可能带来的安全影响。</target> <target>要允许任何重定向 URI请将此值设置为 ".*"。请注意这可能带来的安全影响。</target>
</trans-unit> </trans-unit>
<trans-unit id="s55787f4dfcdce52b"> <trans-unit id="s55787f4dfcdce52b">
@ -1809,8 +1809,8 @@
</trans-unit> </trans-unit>
<trans-unit id="sa90b7809586c35ce"> <trans-unit id="sa90b7809586c35ce">
<source>Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon &quot;fa-test&quot;.</source> <source>Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test".</source>
<target>输入完整 URL、相对路径或者使用 'fa://fa-test' 来使用 Font Awesome 图标 &quot;fa-test&quot;。</target> <target>输入完整 URL、相对路径或者使用 'fa://fa-test' 来使用 Font Awesome 图标 "fa-test"。</target>
</trans-unit> </trans-unit>
<trans-unit id="s0410779cb47de312"> <trans-unit id="s0410779cb47de312">
@ -2262,11 +2262,6 @@
<source>Applications</source> <source>Applications</source>
<target>应用程序</target> <target>应用程序</target>
</trans-unit>
<trans-unit id="sb9024c1640c4da12">
<source>External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
<target>利用 OAuth2 和 SAML 等协议,使用 authentik 作为身份提供程序的外部应用程序。此处显示了所有应用程序,即使您无法访问的也包括在内。</target>
</trans-unit> </trans-unit>
<trans-unit id="s96b2fefc550e4b1c"> <trans-unit id="s96b2fefc550e4b1c">
<source>Provider Type</source> <source>Provider Type</source>
@ -3028,8 +3023,8 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="s76768bebabb7d543"> <trans-unit id="s76768bebabb7d543">
<source>Field which contains members of a group. Note that if using the &quot;memberUid&quot; field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...'</source> <source>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,...'</source>
<target>包含组成员的字段。请注意,如果使用 &quot;memberUid&quot; 字段,则假定该值包含相对可分辨名称。例如,'memberUid=some-user' 而不是 'memberUid=cn=some-user,ou=groups,...'</target> <target>包含组成员的字段。请注意,如果使用 "memberUid" 字段,则假定该值包含相对可分辨名称。例如,'memberUid=some-user' 而不是 'memberUid=cn=some-user,ou=groups,...'</target>
</trans-unit> </trans-unit>
<trans-unit id="s026555347e589f0e"> <trans-unit id="s026555347e589f0e">
@ -3821,8 +3816,8 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="s7b1fba26d245cb1c"> <trans-unit id="s7b1fba26d245cb1c">
<source>When using an external logging solution for archiving, this can be set to &quot;minutes=5&quot;.</source> <source>When using an external logging solution for archiving, this can be set to "minutes=5".</source>
<target>使用外部日志记录解决方案进行存档时,可以将其设置为 &quot;minutes=5&quot;。</target> <target>使用外部日志记录解决方案进行存档时,可以将其设置为 "minutes=5"。</target>
</trans-unit> </trans-unit>
<trans-unit id="s44536d20bb5c8257"> <trans-unit id="s44536d20bb5c8257">
@ -3831,8 +3826,8 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="s3bb51cabb02b997e"> <trans-unit id="s3bb51cabb02b997e">
<source>Format: &quot;weeks=3;days=2;hours=3,seconds=2&quot;.</source> <source>Format: "weeks=3;days=2;hours=3,seconds=2".</source>
<target>格式:&quot;weeks=3;days=2;hours=3,seconds=2&quot;。</target> <target>格式:"weeks=3;days=2;hours=3,seconds=2"。</target>
</trans-unit> </trans-unit>
<trans-unit id="s04bfd02201db5ab8"> <trans-unit id="s04bfd02201db5ab8">
@ -4028,10 +4023,10 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="sa95a538bfbb86111"> <trans-unit id="sa95a538bfbb86111">
<source>Are you sure you want to update <x id="0" equiv-text="${this.objectLabel}"/> &quot;<x id="1" equiv-text="${this.obj?.name}"/>&quot;?</source> <source>Are you sure you want to update <x id="0" equiv-text="${this.objectLabel}"/> "<x id="1" equiv-text="${this.obj?.name}"/>"?</source>
<target>您确定要更新 <target>您确定要更新
<x id="0" equiv-text="${this.objectLabel}"/>&quot; <x id="0" equiv-text="${this.objectLabel}"/>"
<x id="1" equiv-text="${this.obj?.name}"/>&quot; 吗?</target> <x id="1" equiv-text="${this.obj?.name}"/>" 吗?</target>
</trans-unit> </trans-unit>
<trans-unit id="sc92d7cfb6ee1fec6"> <trans-unit id="sc92d7cfb6ee1fec6">
@ -5127,7 +5122,7 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="sdf1d8edef27236f0"> <trans-unit id="sdf1d8edef27236f0">
<source>A &quot;roaming&quot; authenticator, like a YubiKey</source> <source>A "roaming" authenticator, like a YubiKey</source>
<target>像 YubiKey 这样的“漫游”身份验证器</target> <target>像 YubiKey 这样的“漫游”身份验证器</target>
</trans-unit> </trans-unit>
@ -5462,10 +5457,10 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="s2d5f69929bb7221d"> <trans-unit id="s2d5f69929bb7221d">
<source><x id="0" equiv-text="${prompt.name}"/> (&quot;<x id="1" equiv-text="${prompt.fieldKey}"/>&quot;, of type <x id="2" equiv-text="${prompt.type}"/>)</source> <source><x id="0" equiv-text="${prompt.name}"/> ("<x id="1" equiv-text="${prompt.fieldKey}"/>", of type <x id="2" equiv-text="${prompt.type}"/>)</source>
<target> <target>
<x id="0" equiv-text="${prompt.name}"/>&quot; <x id="0" equiv-text="${prompt.name}"/>"
<x id="1" equiv-text="${prompt.fieldKey}"/>&quot;,类型为 <x id="1" equiv-text="${prompt.fieldKey}"/>",类型为
<x id="2" equiv-text="${prompt.type}"/></target> <x id="2" equiv-text="${prompt.type}"/></target>
</trans-unit> </trans-unit>
@ -5514,7 +5509,7 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="s1608b2f94fa0dbd4"> <trans-unit id="s1608b2f94fa0dbd4">
<source>If set to a duration above 0, the user will have the option to choose to &quot;stay signed in&quot;, which will extend their session by the time specified here.</source> <source>If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here.</source>
<target>如果设置时长大于 0用户可以选择“保持登录”选项这将使用户的会话延长此处设置的时间。</target> <target>如果设置时长大于 0用户可以选择“保持登录”选项这将使用户的会话延长此处设置的时间。</target>
</trans-unit> </trans-unit>
@ -7870,7 +7865,31 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s2da4aa7a9abeb653"> <trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source> <source>Pseudolocale (for testing)</source>
<target>伪区域(测试用)</target> <target>伪区域(测试用)</target>
</trans-unit>
<trans-unit id="s4bd386db7302bb22">
<source>Create With Wizard</source>
</trans-unit>
<trans-unit id="s070fdfb03034ca9b">
<source>One hint, 'New Application Wizard', is currently hidden</source>
</trans-unit>
<trans-unit id="s61bd841e66966325">
<source>External applications that use authentik as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
</trans-unit>
<trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source>
</trans-unit>
<trans-unit id="s6985c401e1100122">
<source>Message shown when this stage is run.</source>
</trans-unit>
<trans-unit id="s09f0c100d0ad2fec">
<source>Open Wizard</source>
</trans-unit>
<trans-unit id="sf2ef885f7d0a101d">
<source>Demo Wizard</source>
</trans-unit>
<trans-unit id="s77505ee5d2e45e53">
<source>Run the demo wizard</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>

View File

@ -1704,10 +1704,6 @@
<source>Applications</source> <source>Applications</source>
<target>应用程序</target> <target>应用程序</target>
</trans-unit> </trans-unit>
<trans-unit id="sb9024c1640c4da12">
<source>External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
<target>使用 authentik 作为身份提供程序的外部应用程序,利用 OAuth2 和 SAML 等协议。此处显示了所有应用程序,甚至是您无法访问的应用程序。</target>
</trans-unit>
<trans-unit id="s96b2fefc550e4b1c"> <trans-unit id="s96b2fefc550e4b1c">
<source>Provider Type</source> <source>Provider Type</source>
<target>提供商类型</target> <target>提供商类型</target>
@ -5940,6 +5936,30 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s2da4aa7a9abeb653"> <trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source> <source>Pseudolocale (for testing)</source>
</trans-unit>
<trans-unit id="s4bd386db7302bb22">
<source>Create With Wizard</source>
</trans-unit>
<trans-unit id="s070fdfb03034ca9b">
<source>One hint, 'New Application Wizard', is currently hidden</source>
</trans-unit>
<trans-unit id="s61bd841e66966325">
<source>External applications that use authentik as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
</trans-unit>
<trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source>
</trans-unit>
<trans-unit id="s6985c401e1100122">
<source>Message shown when this stage is run.</source>
</trans-unit>
<trans-unit id="s09f0c100d0ad2fec">
<source>Open Wizard</source>
</trans-unit>
<trans-unit id="sf2ef885f7d0a101d">
<source>Demo Wizard</source>
</trans-unit>
<trans-unit id="s77505ee5d2e45e53">
<source>Run the demo wizard</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -1704,10 +1704,6 @@
<source>Applications</source> <source>Applications</source>
<target>应用程序</target> <target>应用程序</target>
</trans-unit> </trans-unit>
<trans-unit id="sb9024c1640c4da12">
<source>External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
<target>使用 authentik 作为身份提供程序的外部应用程序,利用 OAuth2 和 SAML 等协议。此处显示了所有应用程序,甚至是您无法访问的应用程序。</target>
</trans-unit>
<trans-unit id="s96b2fefc550e4b1c"> <trans-unit id="s96b2fefc550e4b1c">
<source>Provider Type</source> <source>Provider Type</source>
<target>提供商类型</target> <target>提供商类型</target>
@ -5939,6 +5935,30 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s2da4aa7a9abeb653"> <trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source> <source>Pseudolocale (for testing)</source>
</trans-unit>
<trans-unit id="s4bd386db7302bb22">
<source>Create With Wizard</source>
</trans-unit>
<trans-unit id="s070fdfb03034ca9b">
<source>One hint, 'New Application Wizard', is currently hidden</source>
</trans-unit>
<trans-unit id="s61bd841e66966325">
<source>External applications that use authentik as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access.</source>
</trans-unit>
<trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source>
</trans-unit>
<trans-unit id="s6985c401e1100122">
<source>Message shown when this stage is run.</source>
</trans-unit>
<trans-unit id="s09f0c100d0ad2fec">
<source>Open Wizard</source>
</trans-unit>
<trans-unit id="sf2ef885f7d0a101d">
<source>Demo Wizard</source>
</trans-unit>
<trans-unit id="s77505ee5d2e45e53">
<source>Run the demo wizard</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>