web: app icons v2 (#6410)

* fix more icons stuff

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

* refactor app icon into separate component

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

* update locale

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

* make app icon work correctly in admin list and app view page

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

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
Jens L 2023-07-28 14:25:56 +02:00 committed by GitHub
parent 5803c39e91
commit 782d95b4a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 301 additions and 207 deletions

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-21 13:04+0000\n" "POT-Creation-Date: 2023-07-28 11:50+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -427,7 +427,7 @@ msgstr ""
msgid "Webhook Mappings" msgid "Webhook Mappings"
msgstr "" msgstr ""
#: authentik/events/monitored_tasks.py:198 #: authentik/events/monitored_tasks.py:205
msgid "Task has not been run yet." msgid "Task has not been run yet."
msgstr "" msgstr ""
@ -585,65 +585,65 @@ msgstr ""
msgid "Invalid kubeconfig" msgid "Invalid kubeconfig"
msgstr "" msgstr ""
#: authentik/outposts/models.py:121 #: authentik/outposts/models.py:122
msgid "" msgid ""
"If enabled, use the local connection. Required Docker socket/Kubernetes " "If enabled, use the local connection. Required Docker socket/Kubernetes "
"Integration" "Integration"
msgstr "" msgstr ""
#: authentik/outposts/models.py:151 #: authentik/outposts/models.py:152
msgid "Outpost Service-Connection" msgid "Outpost Service-Connection"
msgstr "" msgstr ""
#: authentik/outposts/models.py:152 #: authentik/outposts/models.py:153
msgid "Outpost Service-Connections" msgid "Outpost Service-Connections"
msgstr "" msgstr ""
#: authentik/outposts/models.py:160 #: authentik/outposts/models.py:161
msgid "" msgid ""
"Can be in the format of 'unix://<path>' when connecting to a local docker " "Can be in the format of 'unix://<path>' when connecting to a local docker "
"daemon, or 'https://<hostname>:2376' when connecting to a remote system." "daemon, or 'https://<hostname>:2376' when connecting to a remote system."
msgstr "" msgstr ""
#: authentik/outposts/models.py:172 #: authentik/outposts/models.py:173
msgid "" msgid ""
"CA which the endpoint's Certificate is verified against. Can be left empty " "CA which the endpoint's Certificate is verified against. Can be left empty "
"for no validation." "for no validation."
msgstr "" msgstr ""
#: authentik/outposts/models.py:184 #: authentik/outposts/models.py:185
msgid "" msgid ""
"Certificate/Key used for authentication. Can be left empty for no " "Certificate/Key used for authentication. Can be left empty for no "
"authentication." "authentication."
msgstr "" msgstr ""
#: authentik/outposts/models.py:202 #: authentik/outposts/models.py:203
msgid "Docker Service-Connection" msgid "Docker Service-Connection"
msgstr "" msgstr ""
#: authentik/outposts/models.py:203 #: authentik/outposts/models.py:204
msgid "Docker Service-Connections" msgid "Docker Service-Connections"
msgstr "" msgstr ""
#: authentik/outposts/models.py:211 #: authentik/outposts/models.py:212
msgid "" msgid ""
"Paste your kubeconfig here. authentik will automatically use the currently " "Paste your kubeconfig here. authentik will automatically use the currently "
"selected context." "selected context."
msgstr "" msgstr ""
#: authentik/outposts/models.py:217 #: authentik/outposts/models.py:218
msgid "Verify SSL Certificates of the Kubernetes API endpoint" msgid "Verify SSL Certificates of the Kubernetes API endpoint"
msgstr "" msgstr ""
#: authentik/outposts/models.py:234 #: authentik/outposts/models.py:235
msgid "Kubernetes Service-Connection" msgid "Kubernetes Service-Connection"
msgstr "" msgstr ""
#: authentik/outposts/models.py:235 #: authentik/outposts/models.py:236
msgid "Kubernetes Service-Connections" msgid "Kubernetes Service-Connections"
msgstr "" msgstr ""
#: authentik/outposts/models.py:251 #: authentik/outposts/models.py:252
msgid "" msgid ""
"Select Service-Connection authentik should use to manage this outpost. Leave " "Select Service-Connection authentik should use to manage this outpost. Leave "
"empty if authentik should not handle the deployment." "empty if authentik should not handle the deployment."

View File

@ -1,5 +1,6 @@
import "@goauthentik/admin/applications/ApplicationForm"; import "@goauthentik/admin/applications/ApplicationForm";
import "@goauthentik/admin/applications/wizard/ApplicationWizard"; import "@goauthentik/admin/applications/wizard/ApplicationWizard";
import { PFSize } from "@goauthentik/app/elements/Spinner";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { uiConfig } from "@goauthentik/common/ui/config"; import { uiConfig } from "@goauthentik/common/ui/config";
import MDApplication from "@goauthentik/docs/core/applications.md"; import MDApplication from "@goauthentik/docs/core/applications.md";
@ -11,13 +12,12 @@ import { getURLParam } from "@goauthentik/elements/router/RouteMatch";
import { PaginatedResponse } from "@goauthentik/elements/table/Table"; import { PaginatedResponse } from "@goauthentik/elements/table/Table";
import { TableColumn } from "@goauthentik/elements/table/Table"; import { TableColumn } from "@goauthentik/elements/table/Table";
import { TablePage } from "@goauthentik/elements/table/TablePage"; import { TablePage } from "@goauthentik/elements/table/TablePage";
import "@goauthentik/user/LibraryApplication/AppIcon";
import { msg } from "@lit/localize"; import { msg } from "@lit/localize";
import { CSSResult, TemplateResult, css, html } from "lit"; import { CSSResult, TemplateResult, css, html } from "lit";
import { customElement, property } from "lit/decorators.js"; import { customElement, property } from "lit/decorators.js";
import { ifDefined } from "lit/directives/if-defined.js";
import PFAvatar from "@patternfly/patternfly/components/Avatar/avatar.css";
import PFCard from "@patternfly/patternfly/components/Card/card.css"; import PFCard from "@patternfly/patternfly/components/Card/card.css";
import { Application, CoreApi } from "@goauthentik/api"; import { Application, CoreApi } from "@goauthentik/api";
@ -56,13 +56,8 @@ export class ApplicationListPage extends TablePage<Application> {
static get styles(): CSSResult[] { static get styles(): CSSResult[] {
return super.styles.concat( return super.styles.concat(
PFAvatar,
PFCard, PFCard,
css` css`
:host {
--icon-height: 2rem;
--icon-border: 0.25rem;
}
/* Fix alignment issues with images in tables */ /* Fix alignment issues with images in tables */
.pf-c-table tbody > tr > * { .pf-c-table tbody > tr > * {
vertical-align: middle; vertical-align: middle;
@ -76,14 +71,6 @@ export class ApplicationListPage extends TablePage<Application> {
.pf-c-sidebar.pf-m-gutter > .pf-c-sidebar__main > * + * { .pf-c-sidebar.pf-m-gutter > .pf-c-sidebar__main > * + * {
margin-left: calc(var(--pf-c-sidebar__main--child--MarginLeft) / 2); margin-left: calc(var(--pf-c-sidebar__main--child--MarginLeft) / 2);
} }
.icon {
font-size: var(--icon-height);
color: var(--ak-global--Color--100);
padding: var(--icon-border);
max-height: calc(var(--icon-height) + var(--icon-border) + var(--icon-border));
line-height: calc(var(--icon-height) + var(--icon-border) + var(--icon-border));
filter: drop-shadow(5px 5px 5px rgba(128, 128, 128, 0.25));
}
`, `,
); );
} }
@ -137,24 +124,9 @@ export class ApplicationListPage extends TablePage<Application> {
</ak-forms-delete-bulk>`; </ak-forms-delete-bulk>`;
} }
renderIcon(item: Application): TemplateResult {
if (item?.metaIcon) {
if (item.metaIcon.startsWith("fa://")) {
const icon = item.metaIcon.replaceAll("fa://", "");
return html`<i class="icon fas ${icon}"></i>`;
}
return html`<img
class="icon pf-c-avatar"
src="${ifDefined(item.metaIcon)}"
alt="${msg("Application Icon")}"
/>`;
}
return html`<span class="icon">${item?.name.charAt(0).toUpperCase()}</span>`;
}
row(item: Application): TemplateResult[] { row(item: Application): TemplateResult[] {
return [ return [
this.renderIcon(item), html`<ak-app-icon size=${PFSize.Medium} .app=${item}></ak-app-icon>`,
html`<a href="#/core/applications/${item.slug}"> html`<a href="#/core/applications/${item.slug}">
<div>${item.name}</div> <div>${item.name}</div>
${item.metaPublisher ? html`<small>${item.metaPublisher}</small>` : html``} ${item.metaPublisher ? html`<small>${item.metaPublisher}</small>` : html``}

View File

@ -2,6 +2,7 @@ import "@goauthentik/admin/applications/ApplicationAuthorizeChart";
import "@goauthentik/admin/applications/ApplicationCheckAccessForm"; import "@goauthentik/admin/applications/ApplicationCheckAccessForm";
import "@goauthentik/admin/applications/ApplicationForm"; import "@goauthentik/admin/applications/ApplicationForm";
import "@goauthentik/admin/policies/BoundPoliciesList"; import "@goauthentik/admin/policies/BoundPoliciesList";
import { PFSize } from "@goauthentik/app/elements/Spinner";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { AKElement } from "@goauthentik/elements/Base"; import { AKElement } from "@goauthentik/elements/Base";
import "@goauthentik/elements/EmptyState"; import "@goauthentik/elements/EmptyState";
@ -9,6 +10,7 @@ import "@goauthentik/elements/PageHeader";
import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/Tabs";
import "@goauthentik/elements/buttons/SpinnerButton"; import "@goauthentik/elements/buttons/SpinnerButton";
import "@goauthentik/elements/events/ObjectChangelog"; import "@goauthentik/elements/events/ObjectChangelog";
import "@goauthentik/user/LibraryApplication/AppIcon";
import { msg } from "@lit/localize"; import { msg } from "@lit/localize";
import { CSSResult, TemplateResult, html } from "lit"; import { CSSResult, TemplateResult, html } from "lit";
@ -80,11 +82,15 @@ export class ApplicationViewPage extends AKElement {
render(): TemplateResult { render(): TemplateResult {
return html`<ak-page-header return html`<ak-page-header
icon=${this.application?.metaIcon || ""}
header=${this.application?.name || msg("Loading")} header=${this.application?.name || msg("Loading")}
description=${ifDefined(this.application?.metaPublisher)} description=${ifDefined(this.application?.metaPublisher)}
.iconImage=${true} .iconImage=${true}
> >
<ak-app-icon
size=${PFSize.Small}
slot="icon"
.app=${this.application}
></ak-app-icon>
</ak-page-header> </ak-page-header>
${this.renderApp()}`; ${this.renderApp()}`;
} }

View File

@ -1,7 +1,7 @@
import { AKElement } from "@goauthentik/elements/Base"; import { AKElement } from "@goauthentik/elements/Base";
import { msg } from "@lit/localize"; import { msg } from "@lit/localize";
import { CSSResult, TemplateResult, html } from "lit"; import { CSSResult, TemplateResult, css, html } from "lit";
import { customElement, property } from "lit/decorators.js"; import { customElement, property } from "lit/decorators.js";
import PFExpandableSection from "@patternfly/patternfly/components/ExpandableSection/expandable-section.css"; import PFExpandableSection from "@patternfly/patternfly/components/ExpandableSection/expandable-section.css";
@ -19,7 +19,15 @@ export class Expand extends AKElement {
textClosed = msg("Show more"); textClosed = msg("Show more");
static get styles(): CSSResult[] { static get styles(): CSSResult[] {
return [PFBase, PFExpandableSection]; return [
PFBase,
PFExpandableSection,
css`
.pf-c-expandable-section.pf-m-display-lg {
background-color: var(--pf-global--BackgroundColor--100);
}
`,
];
} }
render(): TemplateResult { render(): TemplateResult {

View File

@ -91,6 +91,11 @@ export class PageHeader extends AKElement {
.notification-trigger.has-notifications { .notification-trigger.has-notifications {
color: var(--pf-global--active-color--100); color: var(--pf-global--active-color--100);
} }
h1 {
display: flex;
flex-direction: row;
align-items: center !important;
}
`, `,
]; ];
} }
@ -120,10 +125,10 @@ export class PageHeader extends AKElement {
renderIcon(): TemplateResult { renderIcon(): TemplateResult {
if (this.icon) { if (this.icon) {
if (this.iconImage && !this.icon.startsWith("fa://")) { if (this.iconImage && !this.icon.startsWith("fa://")) {
return html`<img class="pf-icon" src="${this.icon}" alt="page icon" />&nbsp;`; return html`<img class="pf-icon" src="${this.icon}" alt="page icon" />`;
} }
const icon = this.icon.replaceAll("fa://", "fa "); const icon = this.icon.replaceAll("fa://", "fa ");
return html`<i class=${icon}></i>&nbsp;`; return html`<i class=${icon}></i>`;
} }
return html``; return html``;
} }
@ -147,7 +152,7 @@ export class PageHeader extends AKElement {
<section class="pf-c-page__main-section pf-m-light"> <section class="pf-c-page__main-section pf-m-light">
<div class="pf-c-content"> <div class="pf-c-content">
<h1> <h1>
${this.renderIcon()} <slot name="icon">${this.renderIcon()}</slot>&nbsp;
<slot name="header">${this.header}</slot> <slot name="header">${this.header}</slot>
</h1> </h1>
${this.description ? html`<p>${this.description}</p>` : html``} ${this.description ? html`<p>${this.description}</p>` : html``}

View File

@ -0,0 +1,80 @@
import { AKElement } from "@goauthentik/app/elements/Base";
import { PFSize } from "@goauthentik/app/elements/Spinner";
import { msg } from "@lit/localize";
import { CSSResult, TemplateResult, css, html } from "lit";
import { customElement, property } from "lit/decorators.js";
import { ifDefined } from "lit/directives/if-defined.js";
import PFFAIcons from "@patternfly/patternfly/base/patternfly-fa-icons.css";
import PFAvatar from "@patternfly/patternfly/components/Avatar/avatar.css";
import { Application } from "@goauthentik/api";
@customElement("ak-app-icon")
export class AppIcon extends AKElement {
@property({ attribute: false })
app?: Application;
@property()
size: PFSize = PFSize.Large;
static get styles(): CSSResult[] {
return [
PFFAIcons,
PFAvatar,
css`
:host([size="pf-m-lg"]) {
--icon-height: 4rem;
--icon-border: 0.25rem;
}
:host([size="pf-m-md"]) {
--icon-height: 2rem;
--icon-border: 0.125rem;
}
:host([size="pf-m-sm"]) {
--icon-height: 1rem;
--icon-border: 0.125rem;
}
.pf-c-avatar {
--pf-c-avatar--BorderRadius: 0;
--pf-c-avatar--Height: calc(
var(--icon-height) + var(--icon-border) + var(--icon-border)
);
--pf-c-avatar--Width: calc(
var(--icon-height) + var(--icon-border) + var(--icon-border)
);
}
.icon {
font-size: var(--icon-height);
color: var(--ak-global--Color--100);
padding: var(--icon-border);
max-height: calc(var(--icon-height) + var(--icon-border) + var(--icon-border));
line-height: calc(var(--icon-height) + var(--icon-border) + var(--icon-border));
filter: drop-shadow(5px 5px 5px rgba(128, 128, 128, 0.25));
}
div {
height: calc(var(--icon-height) + var(--icon-border) + var(--icon-border));
}
`,
];
}
render(): TemplateResult {
if (!this.app) {
return html`<div><i class="icon fas fa-question-circle"></i></div>`;
}
if (this.app?.metaIcon) {
if (this.app.metaIcon.startsWith("fa://")) {
const icon = this.app.metaIcon.replaceAll("fa://", "");
return html`<div><i class="icon fas ${icon}"></i></div>`;
}
return html`<img
class="icon pf-c-avatar"
src="${ifDefined(this.app.metaIcon)}"
alt="${msg("Application Icon")}"
/>`;
}
return html`<span class="icon">${this.app?.name.charAt(0).toUpperCase()}</span>`;
}
}

View File

@ -1,6 +1,7 @@
import { truncateWords } from "@goauthentik/common/utils"; import { truncateWords } from "@goauthentik/common/utils";
import { AKElement, rootInterface } from "@goauthentik/elements/Base"; import { AKElement, rootInterface } from "@goauthentik/elements/Base";
import "@goauthentik/elements/Expand"; import "@goauthentik/elements/Expand";
import "@goauthentik/user/LibraryApplication/AppIcon";
import { UserInterface } from "@goauthentik/user/UserInterface"; import { UserInterface } from "@goauthentik/user/UserInterface";
import { msg } from "@lit/localize"; import { msg } from "@lit/localize";
@ -8,7 +9,6 @@ import { CSSResult, TemplateResult, css, html } from "lit";
import { customElement, property } from "lit/decorators.js"; import { customElement, property } from "lit/decorators.js";
import { ifDefined } from "lit/directives/if-defined.js"; import { ifDefined } from "lit/directives/if-defined.js";
import PFAvatar from "@patternfly/patternfly/components/Avatar/avatar.css";
import PFButton from "@patternfly/patternfly/components/Button/button.css"; import PFButton from "@patternfly/patternfly/components/Button/button.css";
import PFCard from "@patternfly/patternfly/components/Card/card.css"; import PFCard from "@patternfly/patternfly/components/Card/card.css";
import PFBase from "@patternfly/patternfly/patternfly-base.css"; import PFBase from "@patternfly/patternfly/patternfly-base.css";
@ -31,24 +31,10 @@ export class LibraryApplication extends AKElement {
PFBase, PFBase,
PFCard, PFCard,
PFButton, PFButton,
PFAvatar,
css` css`
:host {
--icon-height: 4rem;
--icon-border: 0.25rem;
}
.pf-c-card { .pf-c-card {
--pf-c-card--BoxShadow: var(--pf-global--BoxShadow--md); --pf-c-card--BoxShadow: var(--pf-global--BoxShadow--md);
} }
.pf-c-avatar {
--pf-c-avatar--BorderRadius: 0;
--pf-c-avatar--Height: calc(
var(--icon-height) + var(--icon-border) + var(--icon-border)
);
--pf-c-avatar--Width: calc(
var(--icon-height) + var(--icon-border) + var(--icon-border)
);
}
.pf-c-card__header { .pf-c-card__header {
justify-content: space-between; justify-content: space-between;
flex-direction: column; flex-direction: column;
@ -58,13 +44,8 @@ export class LibraryApplication extends AKElement {
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
} }
.icon { a:hover {
font-size: var(--icon-height); text-decoration: none;
color: var(--ak-global--Color--100);
padding: var(--icon-border);
max-height: calc(var(--icon-height) + var(--icon-border) + var(--icon-border));
line-height: calc(var(--icon-height) + var(--icon-border) + var(--icon-border));
filter: drop-shadow(5px 5px 5px rgba(128, 128, 128, 0.25));
} }
.expander { .expander {
flex-grow: 1; flex-grow: 1;
@ -80,21 +61,6 @@ export class LibraryApplication extends AKElement {
]; ];
} }
renderIcon(): TemplateResult {
if (this.application?.metaIcon) {
if (this.application.metaIcon.startsWith("fa://")) {
const icon = this.application.metaIcon.replaceAll("fa://", "");
return html`<i class="icon fas ${icon}"></i>`;
}
return html`<img
class="icon pf-c-avatar"
src="${ifDefined(this.application.metaIcon)}"
alt="${msg("Application Icon")}"
/>`;
}
return html`<span class="icon">${this.application?.name.charAt(0).toUpperCase()}</span>`;
}
render(): TemplateResult { render(): TemplateResult {
if (!this.application) { if (!this.application) {
return html`<ak-spinner></ak-spinner>`; return html`<ak-spinner></ak-spinner>`;
@ -111,7 +77,7 @@ export class LibraryApplication extends AKElement {
href="${ifDefined(this.application.launchUrl ?? "")}" href="${ifDefined(this.application.launchUrl ?? "")}"
target="${ifDefined(this.application.openInNewTab ? "_blank" : undefined)}" target="${ifDefined(this.application.openInNewTab ? "_blank" : undefined)}"
> >
${this.renderIcon()} <ak-app-icon .app=${this.application}></ak-app-icon>
</a> </a>
</div> </div>
<div class="pf-c-card__title"> <div class="pf-c-card__title">

View File

@ -5751,15 +5751,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s9f9492d30a96b9c6"> <trans-unit id="s9f9492d30a96b9c6">
<source>User type</source> <source>User type</source>
</trans-unit> </trans-unit>
<trans-unit id="s0b9a40b7b2853c7d">
<source>Default user</source>
</trans-unit>
<trans-unit id="s35b9fa270f45b391">
<source>External user</source>
</trans-unit>
<trans-unit id="s1a635369edaf4dc3">
<source>Service account</source>
</trans-unit>
<trans-unit id="s0e427111d750cc02"> <trans-unit id="s0e427111d750cc02">
<source>Successfully updated license.</source> <source>Successfully updated license.</source>
</trans-unit> </trans-unit>
@ -5828,6 +5819,21 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s0285b4bd69130fa3"> <trans-unit id="s0285b4bd69130fa3">
<source>Install License</source> <source>Install License</source>
</trans-unit>
<trans-unit id="scef2eb6a2bfe3110">
<source>Internal users might be users such as company employees, which will get access to the full Enterprise feature set.</source>
</trans-unit>
<trans-unit id="sf66389b04fcc219c">
<source>External users might be external consultants or B2C customers. These users don't get access to enterprise features.</source>
</trans-unit>
<trans-unit id="s77e8668a27dbc402">
<source>Service accounts should be used for machine-to-machine authentication or other automations.</source>
</trans-unit>
<trans-unit id="s28cbd874ba450b4e">
<source>Less details</source>
</trans-unit>
<trans-unit id="s8fa26f65aed77c96">
<source>More details</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -6067,15 +6067,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s9f9492d30a96b9c6"> <trans-unit id="s9f9492d30a96b9c6">
<source>User type</source> <source>User type</source>
</trans-unit> </trans-unit>
<trans-unit id="s0b9a40b7b2853c7d">
<source>Default user</source>
</trans-unit>
<trans-unit id="s35b9fa270f45b391">
<source>External user</source>
</trans-unit>
<trans-unit id="s1a635369edaf4dc3">
<source>Service account</source>
</trans-unit>
<trans-unit id="s0e427111d750cc02"> <trans-unit id="s0e427111d750cc02">
<source>Successfully updated license.</source> <source>Successfully updated license.</source>
</trans-unit> </trans-unit>
@ -6144,6 +6135,21 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s0285b4bd69130fa3"> <trans-unit id="s0285b4bd69130fa3">
<source>Install License</source> <source>Install License</source>
</trans-unit>
<trans-unit id="scef2eb6a2bfe3110">
<source>Internal users might be users such as company employees, which will get access to the full Enterprise feature set.</source>
</trans-unit>
<trans-unit id="sf66389b04fcc219c">
<source>External users might be external consultants or B2C customers. These users don't get access to enterprise features.</source>
</trans-unit>
<trans-unit id="s77e8668a27dbc402">
<source>Service accounts should be used for machine-to-machine authentication or other automations.</source>
</trans-unit>
<trans-unit id="s28cbd874ba450b4e">
<source>Less details</source>
</trans-unit>
<trans-unit id="s8fa26f65aed77c96">
<source>More details</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -5659,15 +5659,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s9f9492d30a96b9c6"> <trans-unit id="s9f9492d30a96b9c6">
<source>User type</source> <source>User type</source>
</trans-unit> </trans-unit>
<trans-unit id="s0b9a40b7b2853c7d">
<source>Default user</source>
</trans-unit>
<trans-unit id="s35b9fa270f45b391">
<source>External user</source>
</trans-unit>
<trans-unit id="s1a635369edaf4dc3">
<source>Service account</source>
</trans-unit>
<trans-unit id="s0e427111d750cc02"> <trans-unit id="s0e427111d750cc02">
<source>Successfully updated license.</source> <source>Successfully updated license.</source>
</trans-unit> </trans-unit>
@ -5736,6 +5727,21 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s0285b4bd69130fa3"> <trans-unit id="s0285b4bd69130fa3">
<source>Install License</source> <source>Install License</source>
</trans-unit>
<trans-unit id="scef2eb6a2bfe3110">
<source>Internal users might be users such as company employees, which will get access to the full Enterprise feature set.</source>
</trans-unit>
<trans-unit id="sf66389b04fcc219c">
<source>External users might be external consultants or B2C customers. These users don't get access to enterprise features.</source>
</trans-unit>
<trans-unit id="s77e8668a27dbc402">
<source>Service accounts should be used for machine-to-machine authentication or other automations.</source>
</trans-unit>
<trans-unit id="s28cbd874ba450b4e">
<source>Less details</source>
</trans-unit>
<trans-unit id="s8fa26f65aed77c96">
<source>More details</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -5766,15 +5766,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s9f9492d30a96b9c6"> <trans-unit id="s9f9492d30a96b9c6">
<source>User type</source> <source>User type</source>
</trans-unit> </trans-unit>
<trans-unit id="s0b9a40b7b2853c7d">
<source>Default user</source>
</trans-unit>
<trans-unit id="s35b9fa270f45b391">
<source>External user</source>
</trans-unit>
<trans-unit id="s1a635369edaf4dc3">
<source>Service account</source>
</trans-unit>
<trans-unit id="s0e427111d750cc02"> <trans-unit id="s0e427111d750cc02">
<source>Successfully updated license.</source> <source>Successfully updated license.</source>
</trans-unit> </trans-unit>
@ -5843,6 +5834,21 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s0285b4bd69130fa3"> <trans-unit id="s0285b4bd69130fa3">
<source>Install License</source> <source>Install License</source>
</trans-unit>
<trans-unit id="scef2eb6a2bfe3110">
<source>Internal users might be users such as company employees, which will get access to the full Enterprise feature set.</source>
</trans-unit>
<trans-unit id="sf66389b04fcc219c">
<source>External users might be external consultants or B2C customers. These users don't get access to enterprise features.</source>
</trans-unit>
<trans-unit id="s77e8668a27dbc402">
<source>Service accounts should be used for machine-to-machine authentication or other automations.</source>
</trans-unit>
<trans-unit id="s28cbd874ba450b4e">
<source>Less details</source>
</trans-unit>
<trans-unit id="s8fa26f65aed77c96">
<source>More details</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -5898,15 +5898,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s9f9492d30a96b9c6"> <trans-unit id="s9f9492d30a96b9c6">
<source>User type</source> <source>User type</source>
</trans-unit> </trans-unit>
<trans-unit id="s0b9a40b7b2853c7d">
<source>Default user</source>
</trans-unit>
<trans-unit id="s35b9fa270f45b391">
<source>External user</source>
</trans-unit>
<trans-unit id="s1a635369edaf4dc3">
<source>Service account</source>
</trans-unit>
<trans-unit id="s0e427111d750cc02"> <trans-unit id="s0e427111d750cc02">
<source>Successfully updated license.</source> <source>Successfully updated license.</source>
</trans-unit> </trans-unit>
@ -5975,6 +5966,21 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s0285b4bd69130fa3"> <trans-unit id="s0285b4bd69130fa3">
<source>Install License</source> <source>Install License</source>
</trans-unit>
<trans-unit id="scef2eb6a2bfe3110">
<source>Internal users might be users such as company employees, which will get access to the full Enterprise feature set.</source>
</trans-unit>
<trans-unit id="sf66389b04fcc219c">
<source>External users might be external consultants or B2C customers. These users don't get access to enterprise features.</source>
</trans-unit>
<trans-unit id="s77e8668a27dbc402">
<source>Service accounts should be used for machine-to-machine authentication or other automations.</source>
</trans-unit>
<trans-unit id="s28cbd874ba450b4e">
<source>Less details</source>
</trans-unit>
<trans-unit id="s8fa26f65aed77c96">
<source>More details</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -6002,15 +6002,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s9f9492d30a96b9c6"> <trans-unit id="s9f9492d30a96b9c6">
<source>User type</source> <source>User type</source>
</trans-unit> </trans-unit>
<trans-unit id="s0b9a40b7b2853c7d">
<source>Default user</source>
</trans-unit>
<trans-unit id="s35b9fa270f45b391">
<source>External user</source>
</trans-unit>
<trans-unit id="s1a635369edaf4dc3">
<source>Service account</source>
</trans-unit>
<trans-unit id="s0e427111d750cc02"> <trans-unit id="s0e427111d750cc02">
<source>Successfully updated license.</source> <source>Successfully updated license.</source>
</trans-unit> </trans-unit>
@ -6079,6 +6070,21 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s0285b4bd69130fa3"> <trans-unit id="s0285b4bd69130fa3">
<source>Install License</source> <source>Install License</source>
</trans-unit>
<trans-unit id="scef2eb6a2bfe3110">
<source>Internal users might be users such as company employees, which will get access to the full Enterprise feature set.</source>
</trans-unit>
<trans-unit id="sf66389b04fcc219c">
<source>External users might be external consultants or B2C customers. These users don't get access to enterprise features.</source>
</trans-unit>
<trans-unit id="s77e8668a27dbc402">
<source>Service accounts should be used for machine-to-machine authentication or other automations.</source>
</trans-unit>
<trans-unit id="s28cbd874ba450b4e">
<source>Less details</source>
</trans-unit>
<trans-unit id="s8fa26f65aed77c96">
<source>More details</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -5649,15 +5649,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s9f9492d30a96b9c6"> <trans-unit id="s9f9492d30a96b9c6">
<source>User type</source> <source>User type</source>
</trans-unit> </trans-unit>
<trans-unit id="s0b9a40b7b2853c7d">
<source>Default user</source>
</trans-unit>
<trans-unit id="s35b9fa270f45b391">
<source>External user</source>
</trans-unit>
<trans-unit id="s1a635369edaf4dc3">
<source>Service account</source>
</trans-unit>
<trans-unit id="s0e427111d750cc02"> <trans-unit id="s0e427111d750cc02">
<source>Successfully updated license.</source> <source>Successfully updated license.</source>
</trans-unit> </trans-unit>
@ -5726,6 +5717,21 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s0285b4bd69130fa3"> <trans-unit id="s0285b4bd69130fa3">
<source>Install License</source> <source>Install License</source>
</trans-unit>
<trans-unit id="scef2eb6a2bfe3110">
<source>Internal users might be users such as company employees, which will get access to the full Enterprise feature set.</source>
</trans-unit>
<trans-unit id="sf66389b04fcc219c">
<source>External users might be external consultants or B2C customers. These users don't get access to enterprise features.</source>
</trans-unit>
<trans-unit id="s77e8668a27dbc402">
<source>Service accounts should be used for machine-to-machine authentication or other automations.</source>
</trans-unit>
<trans-unit id="s28cbd874ba450b4e">
<source>Less details</source>
</trans-unit>
<trans-unit id="s8fa26f65aed77c96">
<source>More details</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -618,9 +618,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">
@ -1072,8 +1072,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">
@ -1819,8 +1819,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">
@ -3248,8 +3248,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">
@ -4046,8 +4046,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">
@ -4056,8 +4056,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">
@ -4253,10 +4253,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">
@ -5372,7 +5372,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>
@ -5712,10 +5712,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>
@ -5764,7 +5764,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>
@ -7585,18 +7585,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<source>User type</source> <source>User type</source>
<target>用户类型</target> <target>用户类型</target>
</trans-unit> </trans-unit>
<trans-unit id="s0b9a40b7b2853c7d">
<source>Default user</source>
<target>默认用户</target>
</trans-unit>
<trans-unit id="s35b9fa270f45b391">
<source>External user</source>
<target>外部用户</target>
</trans-unit>
<trans-unit id="s1a635369edaf4dc3">
<source>Service account</source>
<target>服务账户</target>
</trans-unit>
<trans-unit id="s0e427111d750cc02"> <trans-unit id="s0e427111d750cc02">
<source>Successfully updated license.</source> <source>Successfully updated license.</source>
<target>已成功更新许可证。</target> <target>已成功更新许可证。</target>
@ -7688,6 +7676,21 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s0285b4bd69130fa3"> <trans-unit id="s0285b4bd69130fa3">
<source>Install License</source> <source>Install License</source>
<target>安装许可证</target> <target>安装许可证</target>
</trans-unit>
<trans-unit id="scef2eb6a2bfe3110">
<source>Internal users might be users such as company employees, which will get access to the full Enterprise feature set.</source>
</trans-unit>
<trans-unit id="sf66389b04fcc219c">
<source>External users might be external consultants or B2C customers. These users don't get access to enterprise features.</source>
</trans-unit>
<trans-unit id="s77e8668a27dbc402">
<source>Service accounts should be used for machine-to-machine authentication or other automations.</source>
</trans-unit>
<trans-unit id="s28cbd874ba450b4e">
<source>Less details</source>
</trans-unit>
<trans-unit id="s8fa26f65aed77c96">
<source>More details</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -5704,15 +5704,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s9f9492d30a96b9c6"> <trans-unit id="s9f9492d30a96b9c6">
<source>User type</source> <source>User type</source>
</trans-unit> </trans-unit>
<trans-unit id="s0b9a40b7b2853c7d">
<source>Default user</source>
</trans-unit>
<trans-unit id="s35b9fa270f45b391">
<source>External user</source>
</trans-unit>
<trans-unit id="s1a635369edaf4dc3">
<source>Service account</source>
</trans-unit>
<trans-unit id="s0e427111d750cc02"> <trans-unit id="s0e427111d750cc02">
<source>Successfully updated license.</source> <source>Successfully updated license.</source>
</trans-unit> </trans-unit>
@ -5781,6 +5772,21 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s0285b4bd69130fa3"> <trans-unit id="s0285b4bd69130fa3">
<source>Install License</source> <source>Install License</source>
</trans-unit>
<trans-unit id="scef2eb6a2bfe3110">
<source>Internal users might be users such as company employees, which will get access to the full Enterprise feature set.</source>
</trans-unit>
<trans-unit id="sf66389b04fcc219c">
<source>External users might be external consultants or B2C customers. These users don't get access to enterprise features.</source>
</trans-unit>
<trans-unit id="s77e8668a27dbc402">
<source>Service accounts should be used for machine-to-machine authentication or other automations.</source>
</trans-unit>
<trans-unit id="s28cbd874ba450b4e">
<source>Less details</source>
</trans-unit>
<trans-unit id="s8fa26f65aed77c96">
<source>More details</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -5703,15 +5703,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s9f9492d30a96b9c6"> <trans-unit id="s9f9492d30a96b9c6">
<source>User type</source> <source>User type</source>
</trans-unit> </trans-unit>
<trans-unit id="s0b9a40b7b2853c7d">
<source>Default user</source>
</trans-unit>
<trans-unit id="s35b9fa270f45b391">
<source>External user</source>
</trans-unit>
<trans-unit id="s1a635369edaf4dc3">
<source>Service account</source>
</trans-unit>
<trans-unit id="s0e427111d750cc02"> <trans-unit id="s0e427111d750cc02">
<source>Successfully updated license.</source> <source>Successfully updated license.</source>
</trans-unit> </trans-unit>
@ -5780,6 +5771,21 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s0285b4bd69130fa3"> <trans-unit id="s0285b4bd69130fa3">
<source>Install License</source> <source>Install License</source>
</trans-unit>
<trans-unit id="scef2eb6a2bfe3110">
<source>Internal users might be users such as company employees, which will get access to the full Enterprise feature set.</source>
</trans-unit>
<trans-unit id="sf66389b04fcc219c">
<source>External users might be external consultants or B2C customers. These users don't get access to enterprise features.</source>
</trans-unit>
<trans-unit id="s77e8668a27dbc402">
<source>Service accounts should be used for machine-to-machine authentication or other automations.</source>
</trans-unit>
<trans-unit id="s28cbd874ba450b4e">
<source>Less details</source>
</trans-unit>
<trans-unit id="s8fa26f65aed77c96">
<source>More details</source>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>