diff --git a/web/package.json b/web/package.json index e42822dcb..1c4898d42 100644 --- a/web/package.json +++ b/web/package.json @@ -12,9 +12,11 @@ }, "lingui": { "sourceLocale": "en", - "locales": [ - "en" - ], + "locales": ["en", "pseudo-LOCALE"], + "pseudoLocale": "pseudo-LOCALE", + "fallbackLocales": { + "pseudo-LOCALE": "en" + }, "compileNamespace": "ts", "catalogs": [ { @@ -68,7 +70,6 @@ "rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-copy": "^3.4.0", "rollup-plugin-cssimport": "^1.0.2", - "rollup-plugin-external-globals": "^0.6.1", "rollup-plugin-minify-html-literals": "^1.2.6", "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-sourcemaps": "^0.6.3", diff --git a/web/rollup.config.js b/web/rollup.config.js index 803fab4fb..cc60e7f7a 100644 --- a/web/rollup.config.js +++ b/web/rollup.config.js @@ -5,12 +5,11 @@ import sourcemaps from "rollup-plugin-sourcemaps"; import typescript from "@rollup/plugin-typescript"; import cssimport from "rollup-plugin-cssimport"; import copy from "rollup-plugin-copy"; -import externalGlobals from "rollup-plugin-external-globals"; -import babel from '@rollup/plugin-babel'; -import replace from '@rollup/plugin-replace'; +import babel from "@rollup/plugin-babel"; +import replace from "@rollup/plugin-replace"; const extensions = [ - '.js', '.jsx', '.ts', '.tsx', + ".js", ".jsx", ".ts", ".tsx", ]; const resources = [ @@ -32,6 +31,11 @@ const resources = [ const isProdBuild = process.env.NODE_ENV === "production"; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types function manualChunks(id) { + if (id.includes("locales")) { + const parts = id.split("/"); + const file = parts[parts.length - 1]; + return "locale-" + file.replace(".ts", ""); + } if (id.includes("node_modules")) { if (id.includes("codemirror")) { return "vendor-cm"; @@ -105,23 +109,19 @@ export default [ commonjs(), babel({ extensions, - babelHelpers: 'runtime', - include: ['src/**/*'], + babelHelpers: "runtime", + include: ["src/**/*"], }), replace({ - 'process.env.NODE_ENV': JSON.stringify(isProdBuild ? 'production' : "development"), + "process.env.NODE_ENV": JSON.stringify(isProdBuild ? "production" : "development"), preventAssignment: true }), - externalGlobals({ - django: "django", - }), sourcemaps(), isProdBuild && terser(), ].filter(p => p), watch: { clearScreen: false, }, - external: ["django"] }, // Flow executor { @@ -140,22 +140,18 @@ export default [ commonjs(), babel({ extensions, - babelHelpers: 'runtime', - include: ['src/**/*'], + babelHelpers: "runtime", + include: ["src/**/*"], }), replace({ - 'process.env.NODE_ENV': JSON.stringify(isProdBuild ? 'production' : "development"), + "process.env.NODE_ENV": JSON.stringify(isProdBuild ? "production" : "development"), preventAssignment: true }), - externalGlobals({ - django: "django" - }), sourcemaps(), isProdBuild && terser(), ].filter(p => p), watch: { clearScreen: false, }, - external: ["django"] }, ]; diff --git a/web/src/django.d.ts b/web/src/django.d.ts deleted file mode 100644 index 66cfe6379..000000000 --- a/web/src/django.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -declare module "django" { - export = django; -} -declare namespace django { - function gettext(name: string): string; - function ngettext(singular: string, plural: string, count: number): string; - function gettext_noop(msgid: string): string; - function pgettext(context: string, msgid: string): string; - function interpolate(fmt: string, obj: unknown, named: boolean): string; -} diff --git a/web/src/elements/Expand.ts b/web/src/elements/Expand.ts index 6fba66b58..1343bd797 100644 --- a/web/src/elements/Expand.ts +++ b/web/src/elements/Expand.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import PFExpandableSection from "../../node_modules/@patternfly/patternfly/components/ExpandableSection/expandable-section.css"; @@ -26,7 +26,7 @@ export class Expand extends LitElement { <span class="pf-c-expandable-section__toggle-icon"> <i class="fas fa-angle-right" aria-hidden="true"></i> </span> - <span class="pf-c-expandable-section__toggle-text">${gettext(this.expanded ? this.textOpen : this.textClosed)}</span> + <span class="pf-c-expandable-section__toggle-text">${this.expanded ? t`${this.textOpen}` : t`${this.textClosed}`}</span> </button> <slot ?hidden=${!this.expanded} class="pf-c-expandable-section__content"></slot> </div>`; diff --git a/web/src/elements/Page.ts b/web/src/elements/Page.ts index cb22f36e9..2c5d4895c 100644 --- a/web/src/elements/Page.ts +++ b/web/src/elements/Page.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { LitElement } from "lit-element"; import { html, TemplateResult } from "lit-html"; @@ -15,9 +15,9 @@ export abstract class Page extends LitElement { <div class="pf-c-content"> <h1> <i class="${this.pageIcon()}"></i> - ${gettext(this.pageTitle())} + ${t`${this.pageTitle()}`} </h1> - ${description ? html`<p>${gettext(description)}</p>` : html``} + ${description ? html`<p>${t`${description}`}</p>` : html``} </div> </section> ${this.renderContent()}`; diff --git a/web/src/elements/Spinner.ts b/web/src/elements/Spinner.ts index ee37091cc..84ca4c199 100644 --- a/web/src/elements/Spinner.ts +++ b/web/src/elements/Spinner.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import PFSpinner from "@patternfly/patternfly/components/Spinner/spinner.css"; @@ -22,7 +22,7 @@ export class Spinner extends LitElement { return html`<span class="pf-c-spinner ${this.size.toString()}" role="progressbar" - aria-valuetext="${gettext("Loading...")}"> + aria-valuetext="${t`Loading...`}"> <span class="pf-c-spinner__clipper"></span> <span class="pf-c-spinner__lead-ball"></span> <span class="pf-c-spinner__tail-ball"></span> diff --git a/web/src/elements/Tabs.ts b/web/src/elements/Tabs.ts index ea6a25a01..4cc045c8b 100644 --- a/web/src/elements/Tabs.ts +++ b/web/src/elements/Tabs.ts @@ -4,7 +4,7 @@ import PFTabs from "@patternfly/patternfly/components/Tabs/tabs.css"; import PFGlobal from "@patternfly/patternfly/patternfly-base.css"; import AKGlobal from "../authentik.css"; import { CURRENT_CLASS } from "../constants"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; @customElement("ak-tabs") export class Tabs extends LitElement { @@ -62,7 +62,7 @@ export class Tabs extends LitElement { const pages = Array.from(this.querySelectorAll("[slot^='page-']")); if (!this.currentPage) { if (pages.length < 1) { - return html`<h1>${gettext("no tabs defined")}</h1>`; + return html`<h1>${t`no tabs defined`}</h1>`; } this.currentPage = pages[0].attributes.getNamedItem("slot")?.value; } diff --git a/web/src/elements/cards/AggregateCard.ts b/web/src/elements/cards/AggregateCard.ts index 9407afff4..b1b7e7b8b 100644 --- a/web/src/elements/cards/AggregateCard.ts +++ b/web/src/elements/cards/AggregateCard.ts @@ -1,4 +1,3 @@ -import { gettext } from "django"; import { css, CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import { ifDefined } from "lit-html/directives/if-defined"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; @@ -47,7 +46,7 @@ export class AggregateCard extends LitElement { return html`<div class="pf-c-card pf-c-card-aggregate"> <div class="pf-c-card__header pf-l-flex pf-m-justify-content-space-between"> <div class="pf-c-card__header-main"> - <i class="${ifDefined(this.icon)}"></i> ${this.header ? gettext(this.header) : ""} + <i class="${ifDefined(this.icon)}"></i> ${this.header ? this.header : ""} </div> ${this.renderHeaderLink()} </div> diff --git a/web/src/elements/events/ObjectChangelog.ts b/web/src/elements/events/ObjectChangelog.ts index d7f4125c4..ee709d4d8 100644 --- a/web/src/elements/events/ObjectChangelog.ts +++ b/web/src/elements/events/ObjectChangelog.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { Table, TableColumn } from "../table/Table"; @@ -44,10 +44,10 @@ export class ObjectChangelog extends Table<Event> { columns(): TableColumn[] { return [ - new TableColumn("Action", "action"), - new TableColumn("User", "enabled"), - new TableColumn("Creation Date", "created"), - new TableColumn("Client IP", "client_ip"), + new TableColumn(t`Action`, t`action`), + new TableColumn(t`User`, t`enabled`), + new TableColumn(t`Creation Date`, t`created`), + new TableColumn(t`Client IP`, t`client_ip`), ]; } @@ -56,7 +56,7 @@ export class ObjectChangelog extends Table<Event> { html`${item.action}`, html`<div>${item.user?.username}</div> ${item.user.on_behalf_of ? html`<small> - ${gettext(`On behalf of ${item.user.on_behalf_of.username}`)} + ${t`On behalf of ${item.user.on_behalf_of.username}`} </small>` : html``}`, html`<span>${item.created?.toLocaleString()}</span>`, html`<span>${item.clientIp}</span>`, @@ -76,9 +76,9 @@ export class ObjectChangelog extends Table<Event> { } renderEmpty(): TemplateResult { - return super.renderEmpty(html`<ak-empty-state header=${gettext("No Events found.")} icon="pf-icon-module"> + return super.renderEmpty(html`<ak-empty-state header=${t`No Events found.`} icon="pf-icon-module"> <div slot="body"> - ${gettext("No matching events could be found.")} + ${t`No matching events could be found.`} </div> </ak-empty-state>`); } diff --git a/web/src/elements/forms/ConfirmationForm.ts b/web/src/elements/forms/ConfirmationForm.ts index f340914dc..41d916382 100644 --- a/web/src/elements/forms/ConfirmationForm.ts +++ b/web/src/elements/forms/ConfirmationForm.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { EVENT_REFRESH } from "../../constants"; import { ModalButton } from "../buttons/ModalButton"; @@ -37,14 +37,14 @@ export class ConfirmationForm extends ModalButton { onSuccess(): void { showMessage({ - message: gettext(this.successMessage), + message: this.successMessage, level: MessageLevel.success, }); } onError(e: Error): void { showMessage({ - message: gettext(`${this.errorMessage}: ${e.toString()}`), + message: t`${this.errorMessage}: ${e.toString()}`, level: MessageLevel.error, }); } @@ -76,14 +76,14 @@ export class ConfirmationForm extends ModalButton { this.confirm(); }} class="pf-m-danger"> - ${gettext(this.action)} + ${this.action} </ak-spinner-button> <ak-spinner-button .callAction=${() => { this.open = false; }} class="pf-m-secondary"> - ${gettext("Cancel")} + ${t`Cancel`} </ak-spinner-button> </footer>`; } diff --git a/web/src/elements/forms/DeleteForm.ts b/web/src/elements/forms/DeleteForm.ts index 91154ca76..031ded926 100644 --- a/web/src/elements/forms/DeleteForm.ts +++ b/web/src/elements/forms/DeleteForm.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { EVENT_REFRESH } from "../../constants"; import { ModalButton } from "../buttons/ModalButton"; @@ -35,14 +35,14 @@ export class DeleteForm extends ModalButton { onSuccess(): void { showMessage({ - message: gettext(`Successfully deleted ${this.objectLabel} ${ this.obj?.name }`), + message: t`Successfully deleted ${this.objectLabel} ${ this.obj?.name }`, level: MessageLevel.success, }); } onError(e: Error): void { showMessage({ - message: gettext(`Failed to delete ${this.objectLabel}: ${e.toString()}`), + message: t`Failed to delete ${this.objectLabel}: ${e.toString()}`, level: MessageLevel.error, }); } @@ -51,7 +51,7 @@ export class DeleteForm extends ModalButton { return html`<section class="pf-c-page__main-section pf-m-light"> <div class="pf-c-content"> <h1 class="pf-c-title pf-m-2xl"> - ${gettext(`Delete ${this.objectLabel}`)} + ${t`Delete ${this.objectLabel}`} </h1> </div> </section> @@ -62,9 +62,7 @@ export class DeleteForm extends ModalButton { <div class="pf-c-card__body"> <form class="pf-c-form pf-m-horizontal"> <p> - ${gettext( - `Are you sure you want to delete ${this.objectLabel} '${this.obj?.name}'?` - )} + ${t`Are you sure you want to delete ${this.objectLabel} '${this.obj?.name}'?`} </p> </form> </div> @@ -78,14 +76,14 @@ export class DeleteForm extends ModalButton { this.confirm(); }} class="pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </ak-spinner-button> <ak-spinner-button .callAction=${() => { this.open = false; }} class="pf-m-secondary"> - ${gettext("Cancel")} + ${t`Cancel`} </ak-spinner-button> </footer>`; } diff --git a/web/src/elements/forms/ModalForm.ts b/web/src/elements/forms/ModalForm.ts index aaf42fe73..08fe12591 100644 --- a/web/src/elements/forms/ModalForm.ts +++ b/web/src/elements/forms/ModalForm.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { EVENT_REFRESH } from "../../constants"; import { ModalButton } from "../buttons/ModalButton"; @@ -66,7 +66,7 @@ export class ModalForm extends ModalButton { this.open = false; }} class="pf-m-secondary"> - ${gettext("Cancel")} + ${t`Cancel`} </ak-spinner-button> </footer>`; } diff --git a/web/src/elements/messages/MessageContainer.ts b/web/src/elements/messages/MessageContainer.ts index b4f6d2db2..5e9845b9c 100644 --- a/web/src/elements/messages/MessageContainer.ts +++ b/web/src/elements/messages/MessageContainer.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { LitElement, html, customElement, TemplateResult, property, CSSResult, css } from "lit-element"; import "./Message"; import { APIMessage, MessageLevel } from "./Message"; @@ -64,7 +64,7 @@ export class MessageContainer extends LitElement { if (this.retryDelay > 3000) { showMessage({ level: MessageLevel.error, - message: gettext("Connection error, reconnecting...") + message: t`Connection error, reconnecting...` }); } setTimeout(() => { diff --git a/web/src/elements/messages/Middleware.ts b/web/src/elements/messages/Middleware.ts index 320cdc74f..88ec39cc5 100644 --- a/web/src/elements/messages/Middleware.ts +++ b/web/src/elements/messages/Middleware.ts @@ -1,5 +1,5 @@ import { Middleware, ResponseContext } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { MessageLevel } from "./Message"; import { showMessage } from "./MessageContainer"; @@ -9,7 +9,7 @@ export class MessageMiddleware implements Middleware { if (context.response.status >= 500) { showMessage({ level: MessageLevel.error, - message: gettext("API request failed"), + message: t`API request failed`, description: `${context.init.method} ${context.url}: ${context.response.status}` }); } diff --git a/web/src/elements/notifications/APIDrawer.ts b/web/src/elements/notifications/APIDrawer.ts index 74d2db018..a14ff7030 100644 --- a/web/src/elements/notifications/APIDrawer.ts +++ b/web/src/elements/notifications/APIDrawer.ts @@ -5,7 +5,7 @@ import PFNotificationDrawer from "@patternfly/patternfly/components/Notification import PFDropdown from "@patternfly/patternfly/components/Dropdown/dropdown.css"; import AKGlobal from "../../authentik.css"; import PFContent from "@patternfly/patternfly/components/Content/content.css"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { EVENT_API_DRAWER_REFRESH } from "../../constants"; export interface RequestInfo { @@ -71,7 +71,7 @@ export class APIDrawer extends LitElement { <div class="pf-c-notification-drawer"> <div class="pf-c-notification-drawer__header pf-c-content"> <h1> - ${gettext("API Requests")} + ${t`API Requests`} </h1> </div> <div class="pf-c-notification-drawer__body"> diff --git a/web/src/elements/notifications/NotificationDrawer.ts b/web/src/elements/notifications/NotificationDrawer.ts index a2edf65ba..c3ec51eab 100644 --- a/web/src/elements/notifications/NotificationDrawer.ts +++ b/web/src/elements/notifications/NotificationDrawer.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import { EventsApi, Notification } from "authentik-api"; import { AKResponse } from "../../api/Client"; @@ -100,10 +100,10 @@ export class NotificationDrawer extends LitElement { <div class="pf-c-notification-drawer"> <div class="pf-c-notification-drawer__header pf-c-content"> <h1> - ${gettext("Notifications")} + ${t`Notifications`} </h1> <p> - ${gettext(`${this.unread} unread`)} + ${t`${this.unread} unread`} </p> </div> <div class="pf-c-notification-drawer__body"> diff --git a/web/src/elements/oauth/UserCodeList.ts b/web/src/elements/oauth/UserCodeList.ts index ff7c99dff..f51ff7929 100644 --- a/web/src/elements/oauth/UserCodeList.ts +++ b/web/src/elements/oauth/UserCodeList.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { Table, TableColumn } from "../table/Table"; @@ -26,9 +26,9 @@ export class UserOAuthCodeList extends Table<ExpiringBaseGrantModel> { columns(): TableColumn[] { return [ - new TableColumn("Provider", "provider"), - new TableColumn("Expires", "expires"), - new TableColumn("Scopes", "scope"), + new TableColumn(t`Provider`, t`provider`), + new TableColumn(t`Expires`, t`expires`), + new TableColumn(t`Scopes`, t`scope`), new TableColumn(""), ]; } @@ -41,14 +41,14 @@ export class UserOAuthCodeList extends Table<ExpiringBaseGrantModel> { html` <ak-forms-delete .obj=${item} - objectLabel=${gettext("Authorization Code")} + objectLabel=${t`Authorization Code`} .delete=${() => { return new Oauth2Api(DEFAULT_CONFIG).oauth2AuthorizationCodesDelete({ id: item.pk || 0, }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete Authorization Code")} + ${t`Delete Authorization Code`} </button> </ak-forms-delete>`, ]; diff --git a/web/src/elements/oauth/UserRefreshList.ts b/web/src/elements/oauth/UserRefreshList.ts index 66ede9214..5d9a52163 100644 --- a/web/src/elements/oauth/UserRefreshList.ts +++ b/web/src/elements/oauth/UserRefreshList.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { Table, TableColumn } from "../table/Table"; @@ -26,9 +26,9 @@ export class UserOAuthRefreshList extends Table<ExpiringBaseGrantModel> { columns(): TableColumn[] { return [ - new TableColumn("Provider", "provider"), - new TableColumn("Expires", "expires"), - new TableColumn("Scopes", "scope"), + new TableColumn(t`Provider`, t`provider`), + new TableColumn(t`Expires`, t`expires`), + new TableColumn(t`Scopes`, t`scope`), new TableColumn(""), ]; } @@ -41,14 +41,14 @@ export class UserOAuthRefreshList extends Table<ExpiringBaseGrantModel> { html` <ak-forms-delete .obj=${item} - objectLabel=${gettext("Refresh Code")} + objectLabel=${t`Refresh Code`} .delete=${() => { return new Oauth2Api(DEFAULT_CONFIG).oauth2RefreshTokensDelete({ id: item.pk || 0, }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete Refresh Code")} + ${t`Delete Refresh Code`} </button> </ak-forms-delete>`, ]; diff --git a/web/src/elements/router/Router404.ts b/web/src/elements/router/Router404.ts index d04832511..51cdef1cb 100644 --- a/web/src/elements/router/Router404.ts +++ b/web/src/elements/router/Router404.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import PFEmptyState from "@patternfly/patternfly/components/EmptyState/empty-state.css"; import PFTitle from "@patternfly/patternfly/components/Title/title.css"; @@ -18,11 +18,11 @@ export class Router404 extends LitElement { return html`<div class="pf-c-empty-state pf-m-full-height"> <div class="pf-c-empty-state__content"> <i class="fas fa-question-circle pf-c-empty-state__icon" aria-hidden="true"></i> - <h1 class="pf-c-title pf-m-lg">${gettext("Not found")}</h1> + <h1 class="pf-c-title pf-m-lg">${t`Not found`}</h1> <div class="pf-c-empty-state__body"> - ${gettext(`The URL '${this.url}' was not found.`)} + ${t`The URL '${this.url}' was not found.`} </div> - <a href="#/" class="pf-c-button pf-m-primary" type="button">${gettext("Return home")}</a> + <a href="#/" class="pf-c-button pf-m-primary" type="button">${t`Return home`}</a> </div> </div>`; } diff --git a/web/src/elements/table/Table.ts b/web/src/elements/table/Table.ts index 05b6234c8..7d317a0e7 100644 --- a/web/src/elements/table/Table.ts +++ b/web/src/elements/table/Table.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, html, LitElement, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; @@ -54,7 +54,7 @@ export class TableColumn { return html` <button class="pf-c-table__button" @click=${() => this.headerClickHandler(table)}> <div class="pf-c-table__button-content"> - <span class="pf-c-table__text">${gettext(this.title)}</span> + <span class="pf-c-table__text">${this.title}</span> <span class="pf-c-table__sort-indicator"> <i class="fas ${this.getSortIndicator(table)}"></i> </span> @@ -70,7 +70,7 @@ export class TableColumn { ${this.orderBy ? "pf-c-table__sort " : " "} ${(table.order === this.orderBy || table.order === `-${this.orderBy}`) ? "pf-m-selected " : ""} "> - ${this.orderBy ? this.renderSortable(table) : html`${gettext(this.title)}`} + ${this.orderBy ? this.renderSortable(table) : html`${this.title}`} </th>`; } @@ -147,7 +147,7 @@ export abstract class Table<T> extends LitElement { <div class="pf-l-bullseye"> <ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state> </div> </td> @@ -159,7 +159,7 @@ export abstract class Table<T> extends LitElement { <tr role="row"> <td role="cell" colspan="8"> <div class="pf-l-bullseye"> - ${inner ? inner : html`<ak-empty-state header="${gettext("No elements found.")}"></ak-empty-state>`} + ${inner ? inner : html`<ak-empty-state header="${t`No elements found.`}"></ak-empty-state>`} </div> </td> </tr> @@ -218,7 +218,7 @@ export abstract class Table<T> extends LitElement { return html`<button @click=${() => { this.fetch(); }} class="pf-c-button pf-m-primary"> - ${gettext("Refresh")} + ${t`Refresh`} </button>`; } @@ -253,7 +253,7 @@ export abstract class Table<T> extends LitElement { <thead> <tr role="row"> ${this.checkbox ? html`<td class="pf-c-table__check" role="cell"> - <input type="checkbox" aria-label=${gettext("Select all rows")} @input=${(ev: InputEvent) => { + <input type="checkbox" aria-label=${t`Select all rows`} @input=${(ev: InputEvent) => { if ((ev.target as HTMLInputElement).checked) { this.selectedElements = this.data?.results || []; } else { diff --git a/web/src/elements/table/TablePage.ts b/web/src/elements/table/TablePage.ts index d0c0a2063..e3a429d15 100644 --- a/web/src/elements/table/TablePage.ts +++ b/web/src/elements/table/TablePage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { ifDefined } from "lit-html/directives/if-defined"; @@ -34,9 +34,9 @@ export abstract class TablePage<T> extends Table<T> { <div class="pf-c-content"> <h1> <i class="${this.pageIcon()}"></i> - ${gettext(this.pageTitle())} + ${t`${this.pageTitle()}`} </h1> - ${description ? html`<p>${gettext(description)}</p>` : html``} + ${description ? html`<p>${t`${description}`}</p>` : html``} </div> </section> <section class="pf-c-page__main-section pf-m-no-padding-mobile"> diff --git a/web/src/elements/table/TablePagination.ts b/web/src/elements/table/TablePagination.ts index 7994f76fe..eb904234c 100644 --- a/web/src/elements/table/TablePagination.ts +++ b/web/src/elements/table/TablePagination.ts @@ -1,6 +1,6 @@ import { CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import { AKPagination } from "../../api/Client"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; import PFButton from "@patternfly/patternfly/components/Button/button.css"; import PFPagination from "@patternfly/patternfly/components/Pagination/pagination.css"; @@ -37,7 +37,7 @@ export class TablePagination extends LitElement { class="pf-c-button pf-m-plain" @click=${() => { this.pageChangeHandler(this.pages?.previous || 0); }} ?disabled="${(this.pages?.previous || 0) < 1}" - aria-label="${gettext("Go to previous page")}" + aria-label="${t`Go to previous page`}" > <i class="fas fa-angle-left" aria-hidden="true"></i> </button> @@ -47,7 +47,7 @@ export class TablePagination extends LitElement { class="pf-c-button pf-m-plain" @click=${() => { this.pageChangeHandler(this.pages?.next || 0); }} ?disabled="${(this.pages?.next || 0) <= 0}" - aria-label="${gettext("Go to next page")}" + aria-label="${t`Go to next page`}" > <i class="fas fa-angle-right" aria-hidden="true"></i> </button> diff --git a/web/src/elements/user/UserConsentList.ts b/web/src/elements/user/UserConsentList.ts index 921bb43ef..4c1174d7d 100644 --- a/web/src/elements/user/UserConsentList.ts +++ b/web/src/elements/user/UserConsentList.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { Table, TableColumn } from "../table/Table"; @@ -26,8 +26,8 @@ export class UserConsentList extends Table<UserConsent> { columns(): TableColumn[] { return [ - new TableColumn("Application", "application"), - new TableColumn("Expires", "expires"), + new TableColumn(t`Application`, t`application`), + new TableColumn(t`Expires`, t`expires`), new TableColumn(""), ]; } @@ -39,14 +39,14 @@ export class UserConsentList extends Table<UserConsent> { html` <ak-forms-delete .obj=${item} - objectLabel=${gettext("Consent")} + objectLabel=${t`Consent`} .delete=${() => { return new CoreApi(DEFAULT_CONFIG).coreUserConsentDelete({ id: item.pk || 0, }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete Consent")} + ${t`Delete Consent`} </button> </ak-forms-delete>`, ]; diff --git a/web/src/flows/FlowExecutor.ts b/web/src/flows/FlowExecutor.ts index ac991d3cd..333375ac3 100644 --- a/web/src/flows/FlowExecutor.ts +++ b/web/src/flows/FlowExecutor.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { LitElement, html, customElement, property, TemplateResult, CSSResult, css } from "lit-element"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -152,11 +152,11 @@ export class FlowExecutor extends LitElement implements StageHost { type: ChallengeTypeEnum.Shell, body: `<header class="pf-c-login__main-header"> <h1 class="pf-c-title pf-m-3xl"> - ${gettext("Whoops!")} + ${t`Whoops!`} </h1> </header> <div class="pf-c-login__main-body"> - <h3>${gettext("Something went wrong! Please try again later.")}</h3> + <h3>${t`Something went wrong! Please try again later.`}</h3> <pre class="ak-exception">${error}</pre> </div>` }; @@ -178,7 +178,7 @@ export class FlowExecutor extends LitElement implements StageHost { window.location.assign((this.challenge as RedirectChallenge).to); return html`<ak-empty-state ?loading=${true} - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; case ChallengeTypeEnum.Shell: return html`${unsafeHTML((this.challenge as ShellChallenge).body)}`; @@ -225,7 +225,7 @@ export class FlowExecutor extends LitElement implements StageHost { if (!this.challenge) { return html`<ak-empty-state ?loading=${true} - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html` @@ -267,7 +267,7 @@ export class FlowExecutor extends LitElement implements StageHost { </li>`; }))} ${this.config?.brandingTitle != "authentik" ? html` - <li><a href="https://goauthentik.io">${gettext("Powered by authentik")}</a></li> + <li><a href="https://goauthentik.io">${t`Powered by authentik`}</a></li> ` : html``} </ul> </footer> diff --git a/web/src/flows/FormStatic.ts b/web/src/flows/FormStatic.ts index ae52f6434..9826fe953 100644 --- a/web/src/flows/FormStatic.ts +++ b/web/src/flows/FormStatic.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import PFAvatar from "@patternfly/patternfly/components/Avatar/avatar.css"; import { ifDefined } from "lit-html/directives/if-defined"; @@ -40,7 +40,7 @@ export class FormStatic extends LitElement { return html` <div class="form-control-static"> <div class="avatar"> - <img class="pf-c-avatar" src="${ifDefined(this.userAvatar)}" alt="${gettext("User's avatar")}"> + <img class="pf-c-avatar" src="${ifDefined(this.userAvatar)}" alt="${t`User's avatar`}"> ${this.user} </div> <slot name="link"></slot> diff --git a/web/src/flows/access_denied/FlowAccessDenied.ts b/web/src/flows/access_denied/FlowAccessDenied.ts index bdbd3df16..0005f23f7 100644 --- a/web/src/flows/access_denied/FlowAccessDenied.ts +++ b/web/src/flows/access_denied/FlowAccessDenied.ts @@ -8,7 +8,7 @@ import PFForm from "@patternfly/patternfly/components/Form/form.css"; import PFList from "@patternfly/patternfly/components/List/list.css"; import PFFormControl from "@patternfly/patternfly/components/FormControl/form-control.css"; import AKGlobal from "../../authentik.css"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import "../../elements/EmptyState"; @@ -30,7 +30,7 @@ export class FlowAccessDenied extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<header class="pf-c-login__main-header"> @@ -43,7 +43,7 @@ export class FlowAccessDenied extends BaseStage { <div class="pf-c-form__group"> <p> <i class="pf-icon pf-icon-error-circle-o"></i> - ${gettext("Request has been denied.")} + ${t`Request has been denied.`} </p> ${this.challenge?.error_message && html`<hr> diff --git a/web/src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts b/web/src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts index cee973c07..cf0857872 100644 --- a/web/src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts +++ b/web/src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { WithUserInfoChallenge } from "../../../api/Flows"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -47,7 +47,7 @@ export class AuthenticatorStaticStage extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<header class="pf-c-login__main-header"> @@ -62,11 +62,11 @@ export class AuthenticatorStaticStage extends BaseStage { userAvatar="${this.challenge.pending_user_avatar}" user=${this.challenge.pending_user}> <div slot="link"> - <a href="${FlowURLManager.cancel()}">${gettext("Not you?")}</a> + <a href="${FlowURLManager.cancel()}">${t`Not you?`}</a> </div> </ak-form-static> <ak-form-element - label="${gettext("Tokens")}" + label="${t`Tokens`}" ?required="${true}" class="pf-c-form__group"> <ul class="ak-otp-tokens"> @@ -78,7 +78,7 @@ export class AuthenticatorStaticStage extends BaseStage { <div class="pf-c-form__group pf-m-action"> <button type="submit" class="pf-c-button pf-m-primary pf-m-block"> - ${gettext("Continue")} + ${t`Continue`} </button> </div> </form> diff --git a/web/src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts b/web/src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts index d4fa8ec9e..1aa7174a2 100644 --- a/web/src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts +++ b/web/src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { WithUserInfoChallenge } from "../../../api/Flows"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -35,7 +35,7 @@ export class AuthenticatorTOTPStage extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<header class="pf-c-login__main-header"> @@ -50,7 +50,7 @@ export class AuthenticatorTOTPStage extends BaseStage { userAvatar="${this.challenge.pending_user_avatar}" user=${this.challenge.pending_user}> <div slot="link"> - <a href="${FlowURLManager.cancel()}">${gettext("Not you?")}</a> + <a href="${FlowURLManager.cancel()}">${t`Not you?`}</a> </div> </ak-form-static> <input type="hidden" name="otp_uri" value=${this.challenge.config_url} /> @@ -63,16 +63,16 @@ export class AuthenticatorTOTPStage extends BaseStage { navigator.clipboard.writeText(this.challenge?.config_url).then(() => { showMessage({ level: MessageLevel.success, - message: gettext("Successfully copied TOTP Config.") + message: t`Successfully copied TOTP Config.` }); }); }}> <span class="pf-c-button__progress"><i class="fas fa-copy"></i></span> - ${gettext("Copy")} + ${t`Copy`} </button> </ak-form-element> <ak-form-element - label="${gettext("Code")}" + label="${t`Code`}" ?required="${true}" class="pf-c-form__group" .errors=${(this.challenge?.response_errors || {})["code"]}> @@ -81,7 +81,7 @@ export class AuthenticatorTOTPStage extends BaseStage { name="code" inputmode="numeric" pattern="[0-9]*" - placeholder="${gettext("Please enter your TOTP Code")}" + placeholder="${t`Please enter your TOTP Code`}" autofocus="" autocomplete="one-time-code" class="pf-c-form-control" @@ -90,7 +90,7 @@ export class AuthenticatorTOTPStage extends BaseStage { <div class="pf-c-form__group pf-m-action"> <button type="submit" class="pf-c-button pf-m-primary pf-m-block"> - ${gettext("Continue")} + ${t`Continue`} </button> </div> </form> diff --git a/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts b/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts index e048cf178..6fd3c4867 100644 --- a/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts +++ b/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { WithUserInfoChallenge } from "../../../api/Flows"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -80,8 +80,8 @@ export class AuthenticatorValidateStage extends BaseStage implements StageHost { case DeviceClasses.WEBAUTHN: return html`<i class="fas fa-mobile-alt"></i> <div class="right"> - <p>${gettext("Authenticator")}</p> - <small>${gettext("Use a security key to prove your identity.")}</small> + <p>${t`Authenticator`}</p> + <small>${t`Use a security key to prove your identity.`}</small> </div>`; case DeviceClasses.TOTP: // TOTP is a bit special, assuming that TOTP is allowed from the backend, @@ -97,14 +97,14 @@ export class AuthenticatorValidateStage extends BaseStage implements StageHost { } return html`<i class="fas fa-clock"></i> <div class="right"> - <p>${gettext("Traditional authenticator")}</p> - <small>${gettext("Use a code-based authenticator.")}</small> + <p>${t`Traditional authenticator`}</p> + <small>${t`Use a code-based authenticator.`}</small> </div>`; case DeviceClasses.STATIC: return html`<i class="fas fa-key"></i> <div class="right"> - <p>${gettext("Recovery keys")}</p> - <small>${gettext("In case you can't access any other method.")}</small> + <p>${t`Recovery keys`}</p> + <small>${t`In case you can't access any other method.`}</small> </div>`; default: break; @@ -154,7 +154,7 @@ export class AuthenticatorValidateStage extends BaseStage implements StageHost { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } // User only has a single device class, so we don't show a picker @@ -166,7 +166,7 @@ export class AuthenticatorValidateStage extends BaseStage implements StageHost { ${this.challenge.title} </h1> ${this.selectedDeviceChallenge ? "" : html`<p class="pf-c-login__main-header-desc"> - ${gettext("Select an identification method.")} + ${t`Select an identification method.`} </p>`} </header> ${this.selectedDeviceChallenge ? diff --git a/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts b/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts index 76176c825..14f399d4e 100644 --- a/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts +++ b/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; import PFForm from "@patternfly/patternfly/components/Form/form.css"; @@ -35,7 +35,7 @@ export class AuthenticatorValidateStageWebCode extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<div class="pf-c-login__main-body"> @@ -45,11 +45,11 @@ export class AuthenticatorValidateStageWebCode extends BaseStage { userAvatar="${this.challenge.pending_user_avatar}" user=${this.challenge.pending_user}> <div slot="link"> - <a href="${FlowURLManager.cancel()}">${gettext("Not you?")}</a> + <a href="${FlowURLManager.cancel()}">${t`Not you?`}</a> </div> </ak-form-static> <ak-form-element - label="${gettext("Code")}" + label="${t`Code`}" ?required="${true}" class="pf-c-form__group" .errors=${(this.challenge?.response_errors || {})["code"]}> @@ -58,7 +58,7 @@ export class AuthenticatorValidateStageWebCode extends BaseStage { name="code" inputmode="numeric" pattern="[0-9]*" - placeholder="${gettext("Please enter your TOTP Code")}" + placeholder="${t`Please enter your TOTP Code`}" autofocus="" autocomplete="one-time-code" class="pf-c-form-control" @@ -68,7 +68,7 @@ export class AuthenticatorValidateStageWebCode extends BaseStage { <div class="pf-c-form__group pf-m-action"> <button type="submit" class="pf-c-button pf-m-primary pf-m-block"> - ${gettext("Continue")} + ${t`Continue`} </button> </div> </form> @@ -81,7 +81,7 @@ export class AuthenticatorValidateStageWebCode extends BaseStage { if (!this.host) return; (this.host as AuthenticatorValidateStage).selectedDeviceChallenge = undefined; }}> - ${gettext("Return to device picker")} + ${t`Return to device picker`} </button> </li>`: html``} diff --git a/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts b/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts index 7eb3875a1..d02788e3b 100644 --- a/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts +++ b/web/src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; import PFForm from "@patternfly/patternfly/components/Form/form.css"; @@ -48,10 +48,10 @@ export class AuthenticatorValidateStageWebAuthn extends BaseStage { publicKey: transformedCredentialRequestOptions, }); if (!assertion) { - throw new Error(gettext("Assertions is empty")); + throw new Error(t`Assertions is empty`); } } catch (err) { - throw new Error(gettext(`Error when creating credential: ${err}`)); + throw new Error(t`Error when creating credential: ${err}`); } // we now have an authentication assertion! encode the byte arrays contained @@ -64,7 +64,7 @@ export class AuthenticatorValidateStageWebAuthn extends BaseStage { formData.set("webauthn", JSON.stringify(transformedAssertionForServer)); await this.host?.submit(formData); } catch (err) { - throw new Error(gettext(`Error when validating assertion on server: ${err}`)); + throw new Error(t`Error when validating assertion on server: ${err}`); } } @@ -78,7 +78,7 @@ export class AuthenticatorValidateStageWebAuthn extends BaseStage { } this.authenticateRunning = true; this.authenticate().catch((e) => { - console.error(gettext(e)); + console.error(e); this.authenticateMessage = e.toString(); }).finally(() => { this.authenticateRunning = false; @@ -101,7 +101,7 @@ export class AuthenticatorValidateStageWebAuthn extends BaseStage { <button class="pf-c-button pf-m-primary pf-m-block" @click=${() => { this.authenticateWrapper(); }}> - ${gettext("Retry authentication")} + ${t`Retry authentication`} </button> </div>`} </div> @@ -113,7 +113,7 @@ export class AuthenticatorValidateStageWebAuthn extends BaseStage { if (!this.host) return; (this.host as AuthenticatorValidateStage).selectedDeviceChallenge = undefined; }}> - ${gettext("Return to device picker")} + ${t`Return to device picker`} </button> </li>`: html``} diff --git a/web/src/flows/stages/authenticator_webauthn/WebAuthnAuthenticatorRegisterStage.ts b/web/src/flows/stages/authenticator_webauthn/WebAuthnAuthenticatorRegisterStage.ts index 664086260..ff2f52134 100644 --- a/web/src/flows/stages/authenticator_webauthn/WebAuthnAuthenticatorRegisterStage.ts +++ b/web/src/flows/stages/authenticator_webauthn/WebAuthnAuthenticatorRegisterStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { WithUserInfoChallenge } from "../../../api/Flows"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -54,7 +54,7 @@ export class WebAuthnAuthenticatorRegisterStage extends BaseStage { throw new Error("Credential is empty"); } } catch (err) { - throw new Error(gettext(`Error creating credential: ${err}`)); + throw new Error(t`Error creating credential: ${err}`); } // we now have a new credential! We now need to encode the byte arrays @@ -68,7 +68,7 @@ export class WebAuthnAuthenticatorRegisterStage extends BaseStage { response: newAssertionForServer }); } catch (err) { - throw new Error(gettext(`Server validation of credential failed: ${err}`)); + throw new Error(t`Server validation of credential failed: ${err}`); } } @@ -113,7 +113,7 @@ export class WebAuthnAuthenticatorRegisterStage extends BaseStage { <button class="pf-c-button pf-m-primary pf-m-block" @click=${() => { this.registerWrapper(); }}> - ${gettext("Register device")} + ${t`Register device`} </button> </div>`} </div> diff --git a/web/src/flows/stages/autosubmit/AutosubmitStage.ts b/web/src/flows/stages/autosubmit/AutosubmitStage.ts index 827059fbf..7a9cd14b4 100644 --- a/web/src/flows/stages/autosubmit/AutosubmitStage.ts +++ b/web/src/flows/stages/autosubmit/AutosubmitStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { WithUserInfoChallenge } from "../../../api/Flows"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -34,7 +34,7 @@ export class AutosubmitStage extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<header class="pf-c-login__main-header"> @@ -52,7 +52,7 @@ export class AutosubmitStage extends BaseStage { </ak-empty-state> <div class="pf-c-form__group pf-m-action"> <button type="submit" class="pf-c-button pf-m-primary pf-m-block"> - ${gettext("Continue")} + ${t`Continue`} </button> </div> </form> diff --git a/web/src/flows/stages/captcha/CaptchaStage.ts b/web/src/flows/stages/captcha/CaptchaStage.ts index bae366a52..5fc87a495 100644 --- a/web/src/flows/stages/captcha/CaptchaStage.ts +++ b/web/src/flows/stages/captcha/CaptchaStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { WithUserInfoChallenge } from "../../../api/Flows"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -64,7 +64,7 @@ export class CaptchaStage extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<header class="pf-c-login__main-header"> @@ -79,7 +79,7 @@ export class CaptchaStage extends BaseStage { userAvatar="${this.challenge.pending_user_avatar}" user=${this.challenge.pending_user}> <div slot="link"> - <a href="${FlowURLManager.cancel()}">${gettext("Not you?")}</a> + <a href="${FlowURLManager.cancel()}">${t`Not you?`}</a> </div> </ak-form-static> <div class="ak-loading"> diff --git a/web/src/flows/stages/consent/ConsentStage.ts b/web/src/flows/stages/consent/ConsentStage.ts index f8c1f1d8e..4d2c02334 100644 --- a/web/src/flows/stages/consent/ConsentStage.ts +++ b/web/src/flows/stages/consent/ConsentStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { WithUserInfoChallenge } from "../../../api/Flows"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -39,7 +39,7 @@ export class ConsentStage extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<header class="pf-c-login__main-header"> @@ -54,14 +54,14 @@ export class ConsentStage extends BaseStage { userAvatar="${this.challenge.pending_user_avatar}" user=${this.challenge.pending_user}> <div slot="link"> - <a href="${FlowURLManager.cancel()}">${gettext("Not you?")}</a> + <a href="${FlowURLManager.cancel()}">${t`Not you?`}</a> </div> </ak-form-static> <div class="pf-c-form__group"> <p id="header-text"> ${this.challenge.header_text} </p> - <p>${gettext("Application requires following permissions")}</p> + <p>${t`Application requires following permissions`}</p> <ul class="pf-c-list" id="permmissions"> ${(this.challenge.permissions || []).map((permission) => { return html`<li data-permission-code="${permission.id}">${permission.name}</li>`; @@ -71,7 +71,7 @@ export class ConsentStage extends BaseStage { <div class="pf-c-form__group pf-m-action"> <button type="submit" class="pf-c-button pf-m-primary pf-m-block"> - ${gettext("Continue")} + ${t`Continue`} </button> </div> </form> diff --git a/web/src/flows/stages/dummy/DummyStage.ts b/web/src/flows/stages/dummy/DummyStage.ts index d54d3389c..d85310c21 100644 --- a/web/src/flows/stages/dummy/DummyStage.ts +++ b/web/src/flows/stages/dummy/DummyStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { Challenge } from "../../../api/Flows"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -26,7 +26,7 @@ export class DummyStage extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<header class="pf-c-login__main-header"> @@ -38,7 +38,7 @@ export class DummyStage extends BaseStage { <form class="pf-c-form" @submit=${(e: Event) => { this.submitForm(e); }}> <div class="pf-c-form__group pf-m-action"> <button type="submit" class="pf-c-button pf-m-primary pf-m-block"> - ${gettext("Continue")} + ${t`Continue`} </button> </div> </form> diff --git a/web/src/flows/stages/email/EmailStage.ts b/web/src/flows/stages/email/EmailStage.ts index 28516fb60..d2eb299e5 100644 --- a/web/src/flows/stages/email/EmailStage.ts +++ b/web/src/flows/stages/email/EmailStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { Challenge } from "authentik-api"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -27,7 +27,7 @@ export class EmailStage extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<header class="pf-c-login__main-header"> @@ -39,13 +39,13 @@ export class EmailStage extends BaseStage { <form class="pf-c-form" @submit=${(e: Event) => { this.submitForm(e); }}> <div class="pf-c-form__group"> <p> - ${gettext("Check your Emails for a password reset link.")} + ${t`Check your Emails for a password reset link.`} </p> </div> <div class="pf-c-form__group pf-m-action"> <button type="submit" class="pf-c-button pf-m-primary pf-m-block"> - ${gettext("Send Email again.")} + ${t`Send Email again.`} </button> </div> </form> diff --git a/web/src/flows/stages/identification/IdentificationStage.ts b/web/src/flows/stages/identification/IdentificationStage.ts index e246890eb..c6fa5490c 100644 --- a/web/src/flows/stages/identification/IdentificationStage.ts +++ b/web/src/flows/stages/identification/IdentificationStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { BaseStage } from "../base"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -144,13 +144,13 @@ export class IdentificationStage extends BaseStage { return html`<div class="pf-c-login__main-footer-band"> ${this.challenge.enroll_url ? html` <p class="pf-c-login__main-footer-band-item"> - ${gettext("Need an account?")} - <a id="enroll" href="${this.challenge.enroll_url}">${gettext("Sign up.")}</a> + ${t`Need an account?`} + <a id="enroll" href="${this.challenge.enroll_url}">${t`Sign up.`}</a> </p>` : html``} ${this.challenge.recovery_url ? html` <p class="pf-c-login__main-footer-band-item"> - ${gettext("Need an account?")} - <a id="recovery" href="${this.challenge.recovery_url}">${gettext("Forgot username or password?")}</a> + ${t`Need an account?`} + <a id="recovery" href="${this.challenge.recovery_url}">${t`Forgot username or password?`}</a> </p>` : html``} </div>`; } @@ -159,7 +159,7 @@ export class IdentificationStage extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<header class="pf-c-login__main-header"> @@ -171,12 +171,12 @@ export class IdentificationStage extends BaseStage { <form class="pf-c-form" @submit=${(e: Event) => {this.submitForm(e);}}> ${this.challenge.application_pre ? html`<p> - ${gettext(`Login to continue to ${this.challenge.application_pre}.`)} + ${t`Login to continue to ${this.challenge.application_pre}.`} </p>`: html``} <ak-form-element - label="${gettext("Email or Username")}" + label="${t`Email or Username`}" ?required="${true}" class="pf-c-form__group" .errors=${(this.challenge?.response_errors || {})["uid_field"]}> diff --git a/web/src/flows/stages/password/PasswordStage.ts b/web/src/flows/stages/password/PasswordStage.ts index 7ec21f215..276a39167 100644 --- a/web/src/flows/stages/password/PasswordStage.ts +++ b/web/src/flows/stages/password/PasswordStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { WithUserInfoChallenge } from "../../../api/Flows"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -33,7 +33,7 @@ export class PasswordStage extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<header class="pf-c-login__main-header"> @@ -48,18 +48,18 @@ export class PasswordStage extends BaseStage { userAvatar="${this.challenge.pending_user_avatar}" user=${this.challenge.pending_user}> <div slot="link"> - <a href="${FlowURLManager.cancel()}">${gettext("Not you?")}</a> + <a href="${FlowURLManager.cancel()}">${t`Not you?`}</a> </div> </ak-form-static> <input name="username" autocomplete="username" type="hidden" value="${this.challenge.pending_user}"> <ak-form-element - label="${gettext("Password")}" + label="${t`Password`}" ?required="${true}" class="pf-c-form__group" .errors=${(this.challenge?.response_errors || {})["password"]}> <input type="password" name="password" - placeholder="${gettext("Please enter your password")}" + placeholder="${t`Please enter your password`}" autofocus="" autocomplete="current-password" class="pf-c-form-control" @@ -69,11 +69,11 @@ export class PasswordStage extends BaseStage { ${this.challenge.recovery_url ? html`<a href="${this.challenge.recovery_url}"> - ${gettext("Forgot password?")}</a>` : ""} + ${t`Forgot password?`}</a>` : ""} <div class="pf-c-form__group pf-m-action"> <button type="submit" class="pf-c-button pf-m-primary pf-m-block"> - ${gettext("Continue")} + ${t`Continue`} </button> </div> </form> diff --git a/web/src/flows/stages/prompt/PromptStage.ts b/web/src/flows/stages/prompt/PromptStage.ts index 5bb3d811d..249e123b4 100644 --- a/web/src/flows/stages/prompt/PromptStage.ts +++ b/web/src/flows/stages/prompt/PromptStage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { unsafeHTML } from "lit-html/directives/unsafe-html"; import PFLogin from "@patternfly/patternfly/components/Login/login.css"; @@ -121,7 +121,7 @@ export class PromptStage extends BaseStage { if (!this.challenge) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<header class="pf-c-login__main-header"> @@ -142,7 +142,7 @@ export class PromptStage extends BaseStage { })} <div class="pf-c-form__group pf-m-action"> <button type="submit" class="pf-c-button pf-m-primary pf-m-block"> - ${gettext("Continue")} + ${t`Continue`} </button> </div> </form> diff --git a/web/src/interfaces/Interface.ts b/web/src/interfaces/Interface.ts index 5c1996115..a6f67d4c4 100644 --- a/web/src/interfaces/Interface.ts +++ b/web/src/interfaces/Interface.ts @@ -13,7 +13,7 @@ import "../elements/notifications/NotificationDrawer"; import "../elements/Banner"; import { until } from "lit-html/directives/until"; import { me } from "../api/Users"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { EVENT_NOTIFICATION_TOGGLE, EVENT_SIDEBAR_TOGGLE } from "../constants"; export abstract class Interface extends LitElement { @@ -52,9 +52,9 @@ export abstract class Interface extends LitElement { ${until(me().then((u) => { if (u.original) { return html`<ak-banner> - ${gettext(`You're currently impersonating ${u.user.username}.`)} + ${t`You're currently impersonating ${u.user.username}.`} <a href=${`/-/impersonation/end/?back=${window.location.pathname}%23${window.location.hash}`}> - ${gettext("Stop impersonation")} + ${t`Stop impersonation`} </a> </ak-banner>`; } diff --git a/web/src/interfaces/locale.ts b/web/src/interfaces/locale.ts index 993574398..d6d8c6a64 100644 --- a/web/src/interfaces/locale.ts +++ b/web/src/interfaces/locale.ts @@ -1,7 +1,13 @@ -import { i18n } from '@lingui/core' +import { i18n } from "@lingui/core"; +import { en } from "make-plural/plurals"; +import { messages as localeEN } from "../locales/en"; -// messages.js is generated by the cli -import { messages } from '../locales/en'; - -i18n.load('en', messages) -i18n.activate('en') +i18n.loadLocaleData("en", { + plurals: en +}); +i18n.load("en", localeEN); +i18n.activate("en"); +// Uncomment to debug localisation +// import { messages as localeDEBUG } from "../locales/pseudo-LOCALE"; +// i18n.load("debug", localeDEBUG); +// i18n.activate("debug"); diff --git a/web/src/locales/en.po b/web/src/locales/en.po new file mode 100644 index 000000000..e339e522c --- /dev/null +++ b/web/src/locales/en.po @@ -0,0 +1,3632 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2021-04-03 18:44+0200\n" +"Mime-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: en\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/pages/policies/BoundPoliciesList.ts:54 +msgid "-" +msgstr "-" + +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:69 +msgid "6 digits, widely compatible" +msgstr "6 digits, widely compatible" + +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:72 +msgid "8 digits, not compatible with apps like Google Authenticator" +msgstr "8 digits, not compatible with apps like Google Authenticator" + +#: src/pages/providers/saml/SAMLProviderForm.ts:82 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:95 +msgid "ACS URL" +msgstr "ACS URL" + +#: src/pages/applications/ApplicationForm.ts:110 +#: src/pages/flows/FlowForm.ts:109 +#: src/pages/flows/StageBindingForm.ts:138 +msgid "ALL, all policies must match to grant access." +msgstr "ALL, all policies must match to grant access." + +#: src/pages/applications/ApplicationForm.ts:107 +#: src/pages/flows/FlowForm.ts:106 +#: src/pages/flows/StageBindingForm.ts:135 +msgid "ANY, any policy must match to grant access." +msgstr "ANY, any policy must match to grant access." + +#: src/elements/notifications/APIDrawer.ts:61 +msgid "API Requests" +msgstr "API Requests" + +#: src/elements/messages/Middleware.ts:9 +msgid "API request failed" +msgstr "API request failed" + +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:97 +msgid "Access Key" +msgstr "Access Key" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:71 +msgid "Access token URL" +msgstr "Access token URL" + +#: src/pages/stages/email/EmailStageForm.ts:160 +msgid "Account confirmation" +msgstr "Account confirmation" + +#: src/elements/events/ObjectChangelog.ts:38 +#: src/pages/events/EventListPage.ts:43 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:73 +msgid "Action" +msgstr "Action" + +#: src/pages/users/UserListPage.ts:50 +#: src/pages/users/UserViewPage.ts:115 +msgid "Active" +msgstr "Active" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:199 +msgid "Addition Group DN" +msgstr "Addition Group DN" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:193 +msgid "Addition User DN" +msgstr "Addition User DN" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:202 +msgid "Additional group DN, prepended to the Base DN." +msgstr "Additional group DN, prepended to the Base DN." + +#: src/pages/sources/ldap/LDAPSourceForm.ts:196 +msgid "Additional user DN, prepended to the Base DN." +msgstr "Additional user DN, prepended to the Base DN." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:128 +#: src/pages/providers/proxy/ProxyProviderForm.ts:108 +#: src/pages/providers/saml/SAMLProviderForm.ts:117 +#: src/pages/sources/saml/SAMLSourceForm.ts:133 +msgid "Advanced protocol settings" +msgstr "Advanced protocol settings" + +#: src/pages/policies/password/PasswordPolicyForm.ts:114 +#: src/pages/sources/ldap/LDAPSourceForm.ts:137 +msgid "Advanced settings" +msgstr "Advanced settings" + +#: src/pages/events/EventInfo.ts:98 +msgid "Affected model:" +msgstr "Affected model:" + +#: src/pages/events/RuleForm.ts:45 +msgid "Alert" +msgstr "Alert" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:149 +msgid "Algorithm used to sign the JWT Tokens." +msgstr "Algorithm used to sign the JWT Tokens." + +#: src/pages/sources/saml/SAMLSourceForm.ts:140 +msgid "Allow IDP-initiated logins" +msgstr "Allow IDP-initiated logins" + +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:84 +msgid "Allow up to N occurrences in the HIBP database." +msgstr "Allow up to N occurrences in the HIBP database." + +#: src/pages/policies/PolicyListPage.ts:41 +msgid "Allow users to use Applications based on properties, enforce Password Criteria and selectively apply Stages." +msgstr "Allow users to use Applications based on properties, enforce Password Criteria and selectively apply Stages." + +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:80 +msgid "Allowed count" +msgstr "Allowed count" + +#: src/pages/sources/saml/SAMLSourceForm.ts:143 +msgid "Allows authentication flows initiated by the IdP. This can be a security risk, as no validation of the request ID is done." +msgstr "Allows authentication flows initiated by the IdP. This can be a security risk, as no validation of the request ID is done." + +#: src/pages/sources/saml/SAMLSourceForm.ts:95 +msgid "Also known as Entity ID. Defaults the Metadata URL." +msgstr "Also known as Entity ID. Defaults the Metadata URL." + +#: src/pages/stages/consent/ConsentStageForm.ts:78 +msgid "Always require consent" +msgstr "Always require consent" + +#: src/pages/events/EventInfo.ts:59 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:93 +msgid "App" +msgstr "App" + +#: src/elements/user/UserConsentList.ts:29 +#: src/pages/admin-overview/TopApplicationsTable.ts:42 +#: src/pages/applications/ApplicationListPage.ts:95 +msgid "Application" +msgstr "Application" + +#: src/pages/applications/ApplicationListPage.ts:68 +msgid "Application Icon" +msgstr "Application Icon" + +#: src/flows/stages/consent/ConsentStage.ts:50 +msgid "Application requires following permissions" +msgstr "Application requires following permissions" + +#: src/pages/applications/ApplicationForm.ts:82 +msgid "Application's display Name." +msgstr "Application's display Name." + +#: src/pages/LibraryPage.ts:92 +#: src/pages/LibraryPage.ts:131 +#: src/pages/applications/ApplicationListPage.ts:28 +msgid "Applications" +msgstr "Applications" + +#: src/pages/admin-overview/AdminOverviewPage.ts:39 +msgid "Apps with most usage" +msgstr "Apps with most usage" + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:44 +msgid "" +"Are you sure you want to clear the flow cache?\n" +"This will cause all flows to be re-evaluated on their next usage." +msgstr "" +"Are you sure you want to clear the flow cache?\n" +"This will cause all flows to be re-evaluated on their next usage." + +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:45 +msgid "" +"Are you sure you want to clear the policy cache?\n" +"This will cause all policies to be re-evaluated on their next usage." +msgstr "" +"Are you sure you want to clear the policy cache?\n" +"This will cause all policies to be re-evaluated on their next usage." + +#: src/elements/forms/DeleteForm.ts:56 +msgid "Are you sure you want to delete {0} '{1}'?" +msgstr "Are you sure you want to delete {0} '{1}'?" + +#: src/pages/users/UserActiveForm.ts:43 +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:202 +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:191 +msgid "Assertion valid not before" +msgstr "Assertion valid not before" + +#: src/pages/providers/saml/SAMLProviderForm.ts:195 +msgid "Assertion valid not before current time + this value (Format: hours=-1;minutes=-2;seconds=-3)." +msgstr "Assertion valid not before current time + this value (Format: hours=-1;minutes=-2;seconds=-3)." + +#: src/pages/providers/saml/SAMLProviderForm.ts:198 +msgid "Assertion valid not on or after" +msgstr "Assertion valid not on or after" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts:53 +msgid "Assertions is empty" +msgstr "Assertions is empty" + +#: src/pages/providers/ProviderListPage.ts:65 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:91 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:82 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:85 +msgid "Assigned to application" +msgstr "Assigned to application" + +#: src/pages/policies/PolicyListPage.ts:68 +msgid "Assigned to {0} objects." +msgstr "Assigned to {0} objects." + +#: src/pages/events/EventInfo.ts:120 +msgid "Attempted to log in as {0}" +msgstr "Attempted to log in as {0}" + +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:63 +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 "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." + +#: src/pages/groups/GroupForm.ts:95 +#: src/pages/stages/invitation/InvitationForm.ts:51 +#: src/pages/users/UserForm.ts:76 +msgid "Attributes" +msgstr "Attributes" + +#: src/pages/providers/saml/SAMLProviderForm.ts:108 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:103 +msgid "Audience" +msgstr "Audience" + +#: src/pages/flows/FlowForm.ts:55 +msgid "Authentication" +msgstr "Authentication" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:165 +#: src/pages/sources/saml/SAMLSourceForm.ts:244 +msgid "Authentication flow" +msgstr "Authentication flow" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:63 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:29 +msgid "Authenticator" +msgstr "Authenticator" + +#: src/pages/flows/FlowForm.ts:58 +msgid "Authorization" +msgstr "Authorization" + +#: src/elements/oauth/UserCodeList.ts:44 +msgid "Authorization Code" +msgstr "Authorization Code" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:64 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:105 +msgid "Authorization URL" +msgstr "Authorization URL" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:62 +#: src/pages/providers/proxy/ProxyProviderForm.ts:60 +#: src/pages/providers/saml/SAMLProviderForm.ts:59 +#: src/pages/providers/saml/SAMLProviderImportForm.ts:44 +msgid "Authorization flow" +msgstr "Authorization flow" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:178 +msgid "Authorize URL" +msgstr "Authorize URL" + +#: src/pages/events/EventInfo.ts:104 +msgid "Authorized application:" +msgstr "Authorized application:" + +#: src/pages/stages/password/PasswordStageForm.ts:71 +msgid "Backends" +msgstr "Backends" + +#: src/pages/flows/FlowForm.ts:124 +msgid "Background" +msgstr "Background" + +#: src/pages/flows/FlowForm.ts:127 +#: src/pages/flows/FlowImportForm.ts:37 +msgid "Background shown during execution." +msgstr "Background shown during execution." + +#: src/pages/sources/ldap/LDAPSourceForm.ts:128 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:91 +msgid "Base DN" +msgstr "Base DN" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:195 +msgid "Based on the Hashed User ID" +msgstr "Based on the Hashed User ID" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:201 +msgid "Based on the User's Email. This is recommended over the UPN method." +msgstr "Based on the User's Email. This is recommended over the UPN method." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:204 +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 "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." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:198 +msgid "Based on the username" +msgstr "Based on the username" + +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:108 +msgid "Basic-Auth" +msgstr "Basic-Auth" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:116 +msgid "Bind CN" +msgstr "Bind CN" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:122 +msgid "Bind Password" +msgstr "Bind Password" + +#: src/pages/flows/BoundStagesList.ts:127 +#: src/pages/flows/BoundStagesList.ts:175 +msgid "Bind stage" +msgstr "Bind stage" + +#: src/pages/events/EventInfo.ts:141 +#: src/pages/events/EventInfo.ts:160 +msgid "Binding" +msgstr "Binding" + +#: src/pages/sources/saml/SAMLSourceForm.ts:98 +msgid "Binding Type" +msgstr "Binding Type" + +#: src/pages/admin-overview/cards/VersionStatusCard.ts:21 +msgid "Build hash: {0}" +msgstr "Build hash: {0}" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:88 +msgid "CA which the endpoint's Certificate is verified against. Can be left empty for no validation." +msgstr "CA which the endpoint's Certificate is verified against. Can be left empty for no validation." + +#: src/pages/admin-overview/AdminOverviewPage.ts:54 +msgid "Cached Flows" +msgstr "Cached Flows" + +#: src/pages/admin-overview/AdminOverviewPage.ts:52 +msgid "Cached Policies" +msgstr "Cached Policies" + +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:89 +msgid "Callback URL" +msgstr "Callback URL" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:71 +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 "Can be in the format of 'unix://' when connecting to a local docker daemon, or 'https://:2376' when connecting to a remote system." + +#: src/elements/forms/ConfirmationForm.ts:73 +#: src/elements/forms/DeleteForm.ts:77 +#: src/elements/forms/ModalForm.ts:69 +#: src/pages/users/UserActiveForm.ts:64 +msgid "Cancel" +msgstr "Cancel" + +#: src/pages/stages/identification/IdentificationStageForm.ts:88 +msgid "Case insensitive matching" +msgstr "Case insensitive matching" + +#: src/pages/crypto/CertificateKeyPairForm.ts:53 +#: src/pages/providers/proxy/ProxyProviderForm.ts:111 +msgid "Certificate" +msgstr "Certificate" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:98 +msgid "Certificate Fingerprint" +msgstr "Certificate Fingerprint" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:106 +msgid "Certificate Subjet" +msgstr "Certificate Subjet" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:79 +msgid "Certificate-Key Pair" +msgstr "Certificate-Key Pair" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:30 +msgid "Certificate-Key Pairs" +msgstr "Certificate-Key Pairs" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:105 +msgid "Certificate/Key used for authentication. Can be left empty for no authentication." +msgstr "Certificate/Key used for authentication. Can be left empty for no authentication." + +#: src/pages/user-settings/settings/UserSettingsPassword.ts:22 +msgid "Change password" +msgstr "Change password" + +#: src/pages/user-settings/settings/UserSettingsPassword.ts:17 +msgid "Change your password" +msgstr "Change your password" + +#: src/pages/applications/ApplicationViewPage.ts:98 +#: src/pages/flows/FlowViewPage.ts:113 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:146 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:145 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:140 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:124 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:142 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:129 +#: src/pages/users/UserViewPage.ts:176 +msgid "Changelog" +msgstr "Changelog" + +#: src/pages/policies/password/PasswordPolicyForm.ts:122 +msgid "Characters which are considered as symbols." +msgstr "Characters which are considered as symbols." + +#: src/pages/policies/reputation/ReputationPolicyForm.ts:75 +msgid "Check IP" +msgstr "Check IP" + +#: src/pages/policies/reputation/ReputationPolicyForm.ts:83 +msgid "Check Username" +msgstr "Check Username" + +#: src/flows/stages/email/EmailStage.ts:38 +msgid "Check your Emails for a password reset link." +msgstr "Check your Emails for a password reset link." + +#: src/pages/stages/prompt/PromptForm.ts:59 +msgid "Checkbox" +msgstr "Checkbox" + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:41 +msgid "Clear Flow cache" +msgstr "Clear Flow cache" + +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:42 +msgid "Clear Policy cache" +msgstr "Clear Policy cache" + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:36 +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:37 +msgid "Clear cache" +msgstr "Clear cache" + +#: src/pages/outposts/OutpostListPage.ts:112 +msgid "Click to copy token" +msgstr "Click to copy token" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:107 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:109 +msgid "Client ID" +msgstr "Client ID" + +#: src/elements/events/ObjectChangelog.ts:41 +#: src/pages/events/EventListPage.ts:46 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:87 +msgid "Client IP" +msgstr "Client IP" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:114 +msgid "Client Secret" +msgstr "Client Secret" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:85 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:101 +msgid "Client type" +msgstr "Client type" + +#: src/pages/outposts/OutpostListPage.ts:126 +msgid "Close" +msgstr "Close" + +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:72 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:49 +msgid "Code" +msgstr "Code" + +#: src/pages/crypto/CertificateGenerateForm.ts:29 +msgid "Common Name" +msgstr "Common Name" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:98 +msgid "Confidential" +msgstr "Confidential" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:104 +msgid "Confidential clients are capable of maintaining the confidentiality of their credentials. Public clients are incapable." +msgstr "Confidential clients are capable of maintaining the confidentiality of their credentials. Public clients are incapable." + +#: src/pages/outposts/OutpostForm.ts:104 +msgid "Configuration" +msgstr "Configuration" + +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:71 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:77 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:115 +#: src/pages/stages/password/PasswordStageForm.ts:86 +msgid "Configuration flow" +msgstr "Configuration flow" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:103 +msgid "Configure WebAuthn" +msgstr "Configure WebAuthn" + +#: src/pages/providers/saml/SAMLProviderForm.ts:187 +msgid "Configure how the NameID value will be created. When left empty, the NameIDPolicy of the incoming request will be respected." +msgstr "Configure how the NameID value will be created. When left empty, the NameIDPolicy of the incoming request will be respected." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:233 +msgid "Configure how the issuer field of the ID Token should be filled." +msgstr "Configure how the issuer field of the ID Token should be filled." + +#: src/pages/user-settings/UserSettingsPage.ts:73 +msgid "Configure settings relevant to your user profile." +msgstr "Configure settings relevant to your user profile." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:208 +msgid "Configure what data should be used as unique User Identifier. For most cases, the default should be fine." +msgstr "Configure what data should be used as unique User Identifier. For most cases, the default should be fine." + +#: src/pages/user-settings/settings/SourceSettingsOAuth.ts:47 +msgid "Connect" +msgstr "Connect" + +#: src/pages/user-settings/settings/SourceSettingsOAuth.ts:34 +msgid "Connected." +msgstr "Connected." + +#: src/elements/messages/MessageContainer.ts:62 +msgid "Connection error, reconnecting..." +msgstr "Connection error, reconnecting..." + +#: src/pages/sources/ldap/LDAPSourceForm.ts:98 +#: src/pages/stages/email/EmailStageForm.ts:57 +msgid "Connection settings" +msgstr "Connection settings" + +#: src/elements/user/UserConsentList.ts:42 +msgid "Consent" +msgstr "Consent" + +#: src/pages/stages/consent/ConsentStageForm.ts:90 +msgid "Consent expires in" +msgstr "Consent expires in" + +#: src/pages/stages/consent/ConsentStageForm.ts:84 +msgid "Consent expires." +msgstr "Consent expires." + +#: src/pages/stages/consent/ConsentStageForm.ts:81 +msgid "Consent given last indefinitely" +msgstr "Consent given last indefinitely" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:216 +msgid "Consider Objects matching this filter to be Groups." +msgstr "Consider Objects matching this filter to be Groups." + +#: src/pages/sources/ldap/LDAPSourceForm.ts:209 +msgid "Consider Objects matching this filter to be Users." +msgstr "Consider Objects matching this filter to be Users." + +#: src/pages/sources/oauth/OAuthSourceForm.ts:123 +msgid "Consumer key" +msgstr "Consumer key" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:129 +msgid "Consumer secret" +msgstr "Consumer secret" + +#: src/pages/events/EventInfo.ts:79 +#: src/pages/events/EventInfo.ts:148 +#: src/pages/events/EventInfo.ts:167 +#: src/pages/policies/PolicyTestForm.ts:74 +#: src/pages/property-mappings/PropertyMappingTestForm.ts:63 +msgid "Context" +msgstr "Context" + +#: src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts:74 +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:90 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:68 +#: src/flows/stages/autosubmit/AutosubmitStage.ts:48 +#: src/flows/stages/consent/ConsentStage.ts:60 +#: src/flows/stages/dummy/DummyStage.ts:39 +#: src/flows/stages/password/PasswordStage.ts:71 +#: src/flows/stages/prompt/PromptStage.ts:130 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:91 +msgid "Continue" +msgstr "Continue" + +#: src/pages/stages/invitation/InvitationStageForm.ts:66 +msgid "Continue flow without invitation" +msgstr "Continue flow without invitation" + +#: src/pages/property-mappings/PropertyMappingListPage.ts:38 +msgid "Control how authentik exposes and interprets information." +msgstr "Control how authentik exposes and interprets information." + +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:68 +msgid "Copy" +msgstr "Copy" + +#: src/pages/tokens/TokenListPage.ts:72 +#: src/pages/user-settings/tokens/UserTokenList.ts:129 +msgid "Copy Key" +msgstr "Copy Key" + +#: src/pages/applications/ApplicationListPage.ts:111 +#: src/pages/applications/ApplicationListPage.ts:119 +#: src/pages/crypto/CertificateKeyPairListPage.ts:122 +#: src/pages/crypto/CertificateKeyPairListPage.ts:130 +#: src/pages/events/RuleListPage.ts:91 +#: src/pages/events/RuleListPage.ts:99 +#: src/pages/events/TransportListPage.ts:95 +#: src/pages/events/TransportListPage.ts:103 +#: src/pages/flows/BoundStagesList.ts:119 +#: src/pages/flows/BoundStagesList.ts:146 +#: src/pages/flows/BoundStagesList.ts:167 +#: src/pages/flows/FlowListPage.ts:109 +#: src/pages/flows/FlowListPage.ts:117 +#: src/pages/groups/GroupListPage.ts:91 +#: src/pages/groups/GroupListPage.ts:99 +#: src/pages/outposts/OutpostListPage.ts:136 +#: src/pages/outposts/OutpostListPage.ts:144 +#: src/pages/outposts/ServiceConnectionListPage.ts:109 +#: src/pages/outposts/ServiceConnectionListPage.ts:118 +#: src/pages/policies/BoundPoliciesList.ts:157 +#: src/pages/policies/BoundPoliciesList.ts:184 +#: src/pages/policies/BoundPoliciesList.ts:205 +#: src/pages/policies/PolicyListPage.ts:124 +#: src/pages/policies/PolicyListPage.ts:133 +#: src/pages/property-mappings/PropertyMappingListPage.ts:113 +#: src/pages/property-mappings/PropertyMappingListPage.ts:122 +#: src/pages/providers/ProviderListPage.ts:107 +#: src/pages/providers/ProviderListPage.ts:116 +#: src/pages/providers/RelatedApplicationButton.ts:27 +#: src/pages/providers/RelatedApplicationButton.ts:35 +#: src/pages/sources/SourcesListPage.ts:100 +#: src/pages/sources/SourcesListPage.ts:109 +#: src/pages/stages/StageListPage.ts:119 +#: src/pages/stages/StageListPage.ts:128 +#: src/pages/stages/invitation/InvitationListPage.ts:77 +#: src/pages/stages/invitation/InvitationListPage.ts:85 +#: src/pages/stages/prompt/PromptListPage.ts:96 +#: src/pages/stages/prompt/PromptListPage.ts:104 +#: src/pages/user-settings/tokens/UserTokenList.ts:50 +#: src/pages/user-settings/tokens/UserTokenList.ts:58 +#: src/pages/users/UserListPage.ts:143 +#: src/pages/users/UserListPage.ts:151 +msgid "Create" +msgstr "Create" + +#: src/pages/applications/ApplicationListPage.ts:114 +#: src/pages/providers/RelatedApplicationButton.ts:30 +msgid "Create Application" +msgstr "Create Application" + +#: src/pages/policies/BoundPoliciesList.ts:160 +#: src/pages/policies/BoundPoliciesList.ts:165 +#: src/pages/policies/BoundPoliciesList.ts:208 +#: src/pages/policies/BoundPoliciesList.ts:213 +msgid "Create Binding" +msgstr "Create Binding" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:125 +msgid "Create Certificate-Key Pair" +msgstr "Create Certificate-Key Pair" + +#: src/pages/flows/FlowListPage.ts:112 +msgid "Create Flow" +msgstr "Create Flow" + +#: src/pages/groups/GroupListPage.ts:94 +msgid "Create Group" +msgstr "Create Group" + +#: src/pages/stages/invitation/InvitationListPage.ts:80 +msgid "Create Invitation" +msgstr "Create Invitation" + +#: src/pages/stages/invitation/InvitationListPage.ts:31 +msgid "Create Invitation Links to enroll Users, and optionally force specific attributes of their account." +msgstr "Create Invitation Links to enroll Users, and optionally force specific attributes of their account." + +#: src/pages/events/RuleListPage.ts:94 +msgid "Create Notification Rule" +msgstr "Create Notification Rule" + +#: src/pages/events/TransportListPage.ts:98 +msgid "Create Notification Transport" +msgstr "Create Notification Transport" + +#: src/pages/outposts/OutpostListPage.ts:139 +msgid "Create Outpost" +msgstr "Create Outpost" + +#: src/pages/policies/BoundPoliciesList.ts:175 +msgid "Create Policy" +msgstr "Create Policy" + +#: src/pages/stages/prompt/PromptListPage.ts:99 +msgid "Create Prompt" +msgstr "Create Prompt" + +#: src/pages/flows/BoundStagesList.ts:137 +msgid "Create Stage" +msgstr "Create Stage" + +#: src/pages/flows/BoundStagesList.ts:122 +#: src/pages/flows/BoundStagesList.ts:170 +msgid "Create Stage binding" +msgstr "Create Stage binding" + +#: src/pages/user-settings/tokens/UserTokenList.ts:53 +msgid "Create Token" +msgstr "Create Token" + +#: src/pages/users/UserListPage.ts:146 +msgid "Create User" +msgstr "Create User" + +#: src/pages/flows/BoundStagesList.ts:149 +#: src/pages/outposts/ServiceConnectionListPage.ts:121 +#: src/pages/policies/BoundPoliciesList.ts:187 +#: src/pages/policies/PolicyListPage.ts:136 +#: src/pages/property-mappings/PropertyMappingListPage.ts:125 +#: src/pages/providers/ProviderListPage.ts:119 +#: src/pages/sources/SourcesListPage.ts:112 +#: src/pages/stages/StageListPage.ts:131 +msgid "Create {0}" +msgstr "Create {0}" + +#: src/pages/stages/invitation/InvitationListPage.ts:47 +msgid "Created by" +msgstr "Created by" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:86 +msgid "Created {0}" +msgstr "Created {0}" + +#: src/elements/events/ObjectChangelog.ts:40 +#: src/pages/events/EventListPage.ts:45 +msgid "Creation Date" +msgstr "Creation Date" + +#: src/pages/providers/saml/SAMLProviderForm.ts:249 +#: src/pages/sources/saml/SAMLSourceForm.ts:211 +msgid "DSA-SHA1" +msgstr "DSA-SHA1" + +#: src/pages/stages/prompt/PromptForm.ts:62 +msgid "Date" +msgstr "Date" + +#: src/pages/stages/prompt/PromptForm.ts:65 +msgid "Date Time" +msgstr "Date Time" + +#: src/pages/flows/FlowForm.ts:121 +msgid "Decides what this Flow is used for. For example, the Authentication flow is redirect to when an un-authenticated user visits authentik." +msgstr "Decides what this Flow is used for. For example, the Authentication flow is redirect to when an un-authenticated user visits authentik." + +#: src/pages/events/TransportListPage.ts:31 +msgid "Define how notifications are sent to users, like Email or Webhook." +msgstr "Define how notifications are sent to users, like Email or Webhook." + +#: src/elements/forms/DeleteForm.ts:70 +#: src/pages/applications/ApplicationListPage.ts:102 +#: src/pages/crypto/CertificateKeyPairListPage.ts:86 +#: src/pages/events/RuleListPage.ts:82 +#: src/pages/events/TransportListPage.ts:86 +#: src/pages/flows/FlowListPage.ts:86 +#: src/pages/groups/GroupListPage.ts:82 +#: src/pages/outposts/OutpostListPage.ts:86 +#: src/pages/outposts/ServiceConnectionListPage.ts:100 +#: src/pages/policies/PolicyListPage.ts:115 +#: src/pages/property-mappings/PropertyMappingListPage.ts:104 +#: src/pages/providers/ProviderListPage.ts:98 +#: src/pages/sources/SourcesListPage.ts:91 +#: src/pages/stages/StageListPage.ts:110 +#: src/pages/stages/invitation/InvitationListPage.ts:68 +#: src/pages/stages/prompt/PromptListPage.ts:87 +#: src/pages/tokens/TokenListPage.ts:68 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:36 +#: src/pages/user-settings/tokens/UserTokenList.ts:125 +#: src/pages/users/UserListPage.ts:114 +msgid "Delete" +msgstr "Delete" + +#: src/elements/oauth/UserCodeList.ts:51 +msgid "Delete Authorization Code" +msgstr "Delete Authorization Code" + +#: src/pages/flows/BoundStagesList.ts:91 +#: src/pages/policies/BoundPoliciesList.ts:144 +msgid "Delete Binding" +msgstr "Delete Binding" + +#: src/elements/user/UserConsentList.ts:49 +msgid "Delete Consent" +msgstr "Delete Consent" + +#: src/elements/oauth/UserRefreshList.ts:51 +msgid "Delete Refresh Code" +msgstr "Delete Refresh Code" + +#: src/pages/user-settings/UserDetailsPage.ts:85 +msgid "Delete account" +msgstr "Delete account" + +#: src/pages/sources/saml/SAMLSourceForm.ts:168 +msgid "Delete temporary users after" +msgstr "Delete temporary users after" + +#: src/elements/forms/DeleteForm.ts:45 +msgid "Delete {0}" +msgstr "Delete {0}" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:88 +msgid "Deny the user access" +msgstr "Deny the user access" + +#: src/pages/applications/ApplicationForm.ts:126 +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:65 +#: src/pages/user-settings/tokens/UserTokenForm.ts:50 +msgid "Description" +msgstr "Description" + +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:69 +msgid "Description shown to the user when consenting. If left empty, the user won't be informed." +msgstr "Description shown to the user when consenting. If left empty, the user won't be informed." + +#: src/pages/users/UserForm.ts:73 +msgid "Designates whether this user should be treated as active. Unselect this instead of deleting accounts." +msgstr "Designates whether this user should be treated as active. Unselect this instead of deleting accounts." + +#: src/pages/flows/FlowForm.ts:114 +#: src/pages/flows/FlowListPage.ts:48 +msgid "Designation" +msgstr "Designation" + +#: src/pages/providers/saml/SAMLProviderForm.ts:105 +msgid "Determines how authentik sends the response back to the Service Provider." +msgstr "Determines how authentik sends the response back to the Service Provider." + +#: src/pages/stages/user_login/UserLoginStageForm.ts:67 +msgid "Determines how long a session lasts. Default of 0 seconds means that the sessions lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)." +msgstr "Determines how long a session lasts. Default of 0 seconds means that the sessions lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)." + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:110 +msgid "Device classes which can be used to authenticate." +msgstr "Device classes which can be used to authenticate." + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:59 +msgid "Device name" +msgstr "Device name" + +#: src/pages/providers/saml/SAMLProviderForm.ts:213 +#: src/pages/sources/saml/SAMLSourceForm.ts:175 +msgid "Digest algorithm" +msgstr "Digest algorithm" + +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:64 +msgid "Digits" +msgstr "Digits" + +#: src/pages/users/UserListPage.ts:80 +#: src/pages/users/UserListPage.ts:99 +msgid "Disable" +msgstr "Disable" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts:51 +msgid "Disable Static Tokens" +msgstr "Disable Static Tokens" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts:36 +msgid "Disable Time-based OTP" +msgstr "Disable Time-based OTP" + +#: src/pages/sources/SourcesListPage.ts:60 +msgid "Disabled" +msgstr "Disabled" + +#: src/pages/user-settings/settings/SourceSettingsOAuth.ts:41 +msgid "Disconnect" +msgstr "Disconnect" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:67 +msgid "Docker URL" +msgstr "Docker URL" + +#: src/pages/providers/saml/SAMLProviderViewPage.ts:166 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:153 +msgid "Download" +msgstr "Download" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:226 +msgid "Each provider has a different issuer, based on the application slug." +msgstr "Each provider has a different issuer, based on the application slug." + +#: src/pages/applications/ApplicationListPage.ts:90 +#: src/pages/crypto/CertificateKeyPairListPage.ts:74 +#: src/pages/events/RuleListPage.ts:70 +#: src/pages/events/TransportListPage.ts:74 +#: src/pages/flows/FlowListPage.ts:74 +#: src/pages/groups/GroupListPage.ts:70 +#: src/pages/outposts/OutpostListPage.ts:74 +#: src/pages/outposts/ServiceConnectionListPage.ts:88 +#: src/pages/policies/BoundPoliciesList.ts:76 +#: src/pages/policies/BoundPoliciesList.ts:106 +#: src/pages/policies/PolicyListPage.ts:90 +#: src/pages/property-mappings/PropertyMappingListPage.ts:79 +#: src/pages/providers/ProviderListPage.ts:86 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:138 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:137 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:132 +#: src/pages/sources/SourcesListPage.ts:79 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:116 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:134 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:121 +#: src/pages/stages/StageListPage.ts:98 +#: src/pages/stages/prompt/PromptListPage.ts:75 +#: src/pages/user-settings/tokens/UserTokenList.ts:113 +#: src/pages/users/UserListPage.ts:75 +#: src/pages/users/UserViewPage.ts:146 +msgid "Edit" +msgstr "Edit" + +#: src/pages/flows/BoundStagesList.ts:79 +#: src/pages/policies/BoundPoliciesList.ts:132 +msgid "Edit Binding" +msgstr "Edit Binding" + +#: src/pages/policies/BoundPoliciesList.ts:91 +msgid "Edit Group" +msgstr "Edit Group" + +#: src/pages/flows/BoundStagesList.ts:66 +msgid "Edit Stage" +msgstr "Edit Stage" + +#: src/pages/LibraryPage.ts:113 +msgid "Either no applications are defined, or you don't have access to any." +msgstr "Either no applications are defined, or you don't have access to any." + +#: src/pages/events/TransportForm.ts:45 +#: src/pages/stages/identification/IdentificationStageForm.ts:78 +#: src/pages/users/UserForm.ts:60 +#: src/pages/users/UserViewPage.ts:99 +msgid "Email" +msgstr "Email" + +#: src/pages/sources/saml/SAMLSourceForm.ts:154 +#: src/pages/user-settings/UserDetailsPage.ts:73 +msgid "Email address" +msgstr "Email address" + +#: src/flows/stages/identification/IdentificationStage.ts:151 +msgid "Email or Username" +msgstr "Email or Username" + +#: src/pages/stages/prompt/PromptForm.ts:50 +msgid "Email: Text field with Email type." +msgstr "Email: Text field with Email type." + +#: src/pages/users/UserListPage.ts:80 +#: src/pages/users/UserListPage.ts:99 +msgid "Enable" +msgstr "Enable" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:111 +msgid "Enable StartTLS" +msgstr "Enable StartTLS" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts:67 +msgid "Enable Static Tokens" +msgstr "Enable Static Tokens" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts:52 +msgid "Enable Time-based OTP" +msgstr "Enable Time-based OTP" + +#: src/pages/policies/BoundPoliciesList.ts:36 +#: src/pages/policies/PolicyBindingForm.ts:130 +#: src/pages/sources/ldap/LDAPSourceForm.ts:68 +#: src/pages/sources/oauth/OAuthSourceForm.ts:112 +#: src/pages/sources/saml/SAMLSourceForm.ts:68 +msgid "Enabled" +msgstr "Enabled" + +#: src/pages/flows/FlowForm.ts:61 +msgid "Enrollment" +msgstr "Enrollment" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:186 +#: src/pages/sources/saml/SAMLSourceForm.ts:265 +#: src/pages/stages/identification/IdentificationStageForm.ts:103 +msgid "Enrollment flow" +msgstr "Enrollment flow" + +#: src/pages/system-tasks/SystemTaskListPage.ts:63 +msgid "Error" +msgstr "Error" + +#: src/flows/stages/authenticator_webauthn/WebAuthnAuthenticatorRegisterStage.ts:57 +msgid "Error creating credential: {err}" +msgstr "Error creating credential: {err}" + +#: src/pages/policies/password/PasswordPolicyForm.ts:105 +msgid "Error message" +msgstr "Error message" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts:57 +msgid "Error when creating credential: {err}" +msgstr "Error when creating credential: {err}" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts:69 +msgid "Error when validating assertion on server: {err}" +msgstr "Error when validating assertion on server: {err}" + +#: src/pages/user-settings/UserSettingsPage.ts:61 +msgid "Error: unsupported source settings: {0}" +msgstr "Error: unsupported source settings: {0}" + +#: src/pages/user-settings/UserSettingsPage.ts:52 +msgid "Error: unsupported stage settings: {0}" +msgstr "Error: unsupported stage settings: {0}" + +#: src/pages/flows/StageBindingForm.ts:109 +msgid "Evaluate on plan" +msgstr "Evaluate on plan" + +#: src/pages/flows/StageBindingForm.ts:112 +msgid "Evaluate policies during the Flow planning process. Disable this for input-based policies." +msgstr "Evaluate policies during the Flow planning process. Disable this for input-based policies." + +#: src/pages/flows/StageBindingForm.ts:121 +msgid "Evaluate policies when the Stage is present to the user." +msgstr "Evaluate policies when the Stage is present to the user." + +#: src/pages/events/EventInfoPage.ts:37 +msgid "Event {0}" +msgstr "Event {0}" + +#: src/pages/events/EventInfo.ts:129 +#: src/pages/events/EventInfo.ts:152 +msgid "Exception" +msgstr "Exception" + +#: src/pages/flows/FlowListPage.ts:98 +#: src/pages/flows/FlowViewPage.ts:86 +msgid "Execute" +msgstr "Execute" + +#: src/pages/flows/FlowViewPage.ts:73 +msgid "Execute flow" +msgstr "Execute flow" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:62 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:62 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:61 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:62 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:62 +#: src/pages/policies/password/PasswordPolicyForm.ts:62 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:61 +msgid "Execution logging" +msgstr "Execution logging" + +#: src/elements/oauth/UserCodeList.ts:30 +#: src/elements/oauth/UserRefreshList.ts:30 +#: src/elements/user/UserConsentList.ts:30 +#: src/pages/stages/invitation/InvitationForm.ts:45 +msgid "Expires" +msgstr "Expires" + +#: src/pages/tokens/TokenListPage.ts:46 +msgid "Expires?" +msgstr "Expires?" + +#: src/pages/user-settings/tokens/UserTokenList.ts:80 +#: src/pages/user-settings/tokens/UserTokenList.ts:88 +msgid "Expiring" +msgstr "Expiring" + +#: src/pages/tokens/TokenListPage.ts:47 +msgid "Expiry date" +msgstr "Expiry date" + +#: src/pages/users/UserViewPage.ts:187 +msgid "Explicit Consent" +msgstr "Explicit Consent" + +#: src/pages/flows/FlowListPage.ts:101 +msgid "Export" +msgstr "Export" + +#: src/pages/events/EventInfo.ts:133 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:73 +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:65 +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:75 +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:72 +msgid "Expression" +msgstr "Expression" + +#: src/pages/applications/ApplicationListPage.ts:31 +msgid "External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML." +msgstr "External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML." + +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:100 +msgid "External Host" +msgstr "External Host" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:98 +msgid "External host" +msgstr "External host" + +#: src/pages/stages/password/PasswordStageForm.ts:108 +msgid "Failed attempts before cancel" +msgstr "Failed attempts before cancel" + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:35 +msgid "Failed to delete flow cache" +msgstr "Failed to delete flow cache" + +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:36 +msgid "Failed to delete policy cache" +msgstr "Failed to delete policy cache" + +#: src/elements/forms/DeleteForm.ts:36 +msgid "Failed to delete {0}: {1}" +msgstr "Failed to delete {0}: {1}" + +#: src/pages/users/UserActiveForm.ts:23 +msgid "Failed to update {0}: {1}" +msgstr "Failed to update {0}: {1}" + +#: src/pages/stages/prompt/PromptListPage.ts:46 +msgid "Field" +msgstr "Field" + +#: src/pages/stages/prompt/PromptForm.ts:82 +msgid "Field Key" +msgstr "Field Key" + +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:77 +#: src/pages/policies/password/PasswordPolicyForm.ts:77 +msgid "Field key to check, field keys defined in Prompt stages are available." +msgstr "Field key to check, field keys defined in Prompt stages are available." + +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:62 +msgid "Field of the user object this value is written to." +msgstr "Field of the user object this value is written to." + +#: src/pages/sources/ldap/LDAPSourceForm.ts:230 +msgid "Field which contains a unique Identifier." +msgstr "Field which contains a unique Identifier." + +#: src/pages/sources/ldap/LDAPSourceForm.ts:223 +msgid "Field which contains members of a group." +msgstr "Field which contains members of a group." + +#: src/pages/stages/prompt/PromptStageForm.ts:64 +msgid "Fields" +msgstr "Fields" + +#: src/pages/stages/identification/IdentificationStageForm.ts:81 +msgid "Fields a user can identify themselves with." +msgstr "Fields a user can identify themselves with." + +#: src/pages/flows/FlowImportForm.ts:34 +#: src/pages/flows/FlowListPage.ts:79 +msgid "Flow" +msgstr "Flow" + +#: src/pages/flows/FlowViewPage.ts:57 +msgid "Flow Overview" +msgstr "Flow Overview" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:161 +#: src/pages/sources/saml/SAMLSourceForm.ts:219 +msgid "Flow settings" +msgstr "Flow settings" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:183 +#: src/pages/sources/saml/SAMLSourceForm.ts:262 +msgid "Flow to use when authenticating existing users." +msgstr "Flow to use when authenticating existing users." + +#: src/pages/sources/oauth/OAuthSourceForm.ts:204 +#: src/pages/sources/saml/SAMLSourceForm.ts:283 +msgid "Flow to use when enrolling new users." +msgstr "Flow to use when enrolling new users." + +#: src/pages/sources/saml/SAMLSourceForm.ts:241 +msgid "Flow used before authentication." +msgstr "Flow used before authentication." + +#: src/pages/stages/password/PasswordStageForm.ts:105 +msgid "Flow used by an authenticated user to configure their password. If empty, user will not be able to configure change their password." +msgstr "Flow used by an authenticated user to configure their password. If empty, user will not be able to configure change their password." + +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:89 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:95 +msgid "Flow used by an authenticated user to configure this Stage. If empty, user will not be able to configure this stage." +msgstr "Flow used by an authenticated user to configure this Stage. If empty, user will not be able to configure this stage." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:76 +#: src/pages/providers/proxy/ProxyProviderForm.ts:74 +#: src/pages/providers/saml/SAMLProviderForm.ts:73 +#: src/pages/providers/saml/SAMLProviderImportForm.ts:57 +msgid "Flow used when authorizing this provider." +msgstr "Flow used when authorizing this provider." + +#: src/pages/flows/FlowListPage.ts:28 +msgid "Flows" +msgstr "Flows" + +#: src/pages/flows/FlowListPage.ts:31 +msgid "Flows describe a chain of Stages to authenticate, enroll or recover a user. Stages are chosen based on policies applied to them." +msgstr "Flows describe a chain of Stages to authenticate, enroll or recover a user. Stages are chosen based on policies applied to them." + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:85 +msgid "Force the user to configure an authenticator" +msgstr "Force the user to configure an authenticator" + +#: src/flows/stages/password/PasswordStage.ts:67 +msgid "Forgot password?" +msgstr "Forgot password?" + +#: src/flows/stages/identification/IdentificationStage.ts:125 +msgid "Forgot username or password?" +msgstr "Forgot username or password?" + +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:67 +msgid "Friendly Name" +msgstr "Friendly Name" + +#: src/pages/stages/email/EmailStageForm.ts:107 +msgid "From address" +msgstr "From address" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:135 +#: src/pages/crypto/CertificateKeyPairListPage.ts:143 +msgid "Generate" +msgstr "Generate" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:138 +msgid "Generate Certificate-Key Pair" +msgstr "Generate Certificate-Key Pair" + +#: src/elements/table/TablePagination.ts:51 +msgid "Go to next page" +msgstr "Go to next page" + +#: src/elements/table/TablePagination.ts:41 +msgid "Go to previous page" +msgstr "Go to previous page" + +#: src/pages/events/RuleForm.ts:65 +#: src/pages/groups/GroupListPage.ts:75 +#: src/pages/policies/PolicyBindingForm.ts:96 +#: src/pages/stages/StageListPage.ts:103 +msgid "Group" +msgstr "Group" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:167 +msgid "Group Property Mappings" +msgstr "Group Property Mappings" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:219 +msgid "Group membership field" +msgstr "Group membership field" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:212 +msgid "Group object filter" +msgstr "Group object filter" + +#: src/pages/groups/GroupListPage.ts:30 +msgid "Group users together and give them permissions based on the membership." +msgstr "Group users together and give them permissions based on the membership." + +#: src/pages/policies/BoundPoliciesList.ts:48 +msgid "Group {0}" +msgstr "Group {0}" + +#: src/pages/groups/GroupListPage.ts:27 +msgid "Groups" +msgstr "Groups" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:146 +msgid "HS256 (Symmetric Encryption)" +msgstr "HS256 (Symmetric Encryption)" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:149 +msgid "HTTP-Basic Password Key" +msgstr "HTTP-Basic Password Key" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:143 +msgid "HTTP-Basic Username Key" +msgstr "HTTP-Basic Username Key" + +#: src/interfaces/AdminInterface.ts:14 +#~ msgid "Hello World!" +#~ msgstr "Hello World!" + +#: src/pages/stages/prompt/PromptForm.ts:71 +msgid "Hidden: Hidden field, can be used to insert data into form." +msgstr "Hidden: Hidden field, can be used to insert data into form." + +#: src/pages/property-mappings/PropertyMappingListPage.ts:153 +msgid "Hide managed mappings" +msgstr "Hide managed mappings" + +#: src/pages/events/RuleForm.ts:93 +#: src/pages/groups/GroupForm.ts:92 +#: src/pages/outposts/OutpostForm.ts:96 +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:169 +#: src/pages/providers/saml/SAMLProviderForm.ts:171 +#: src/pages/sources/ldap/LDAPSourceForm.ts:164 +#: src/pages/sources/ldap/LDAPSourceForm.ts:190 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:111 +#: src/pages/stages/identification/IdentificationStageForm.ts:82 +#: src/pages/stages/password/PasswordStageForm.ts:83 +#: src/pages/stages/prompt/PromptStageForm.ts:82 +#: src/pages/stages/prompt/PromptStageForm.ts:103 +msgid "Hold control/command to select multiple items." +msgstr "Hold control/command to select multiple items." + +#: src/pages/stages/password/PasswordStageForm.ts:112 +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 "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." + +#: src/pages/stages/invitation/InvitationListPage.ts:46 +msgid "ID" +msgstr "ID" + +#: src/pages/applications/ApplicationForm.ts:121 +msgid "Icon" +msgstr "Icon" + +#: src/pages/flows/FlowListPage.ts:46 +#: src/pages/system-tasks/SystemTaskListPage.ts:48 +#: src/pages/tokens/TokenListPage.ts:44 +#: src/pages/user-settings/tokens/UserTokenForm.ts:44 +#: src/pages/user-settings/tokens/UserTokenList.ts:39 +msgid "Identifier" +msgstr "Identifier" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:64 +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:65 +msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." +msgstr "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." + +#: src/pages/applications/ApplicationForm.ts:118 +msgid "If left empty, authentik will try to extract the launch URL based on the selected provider." +msgstr "If left empty, authentik will try to extract the launch URL based on the selected provider." + +#: src/pages/stages/invitation/InvitationStageForm.ts:69 +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 "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." + +#: src/pages/outposts/OutpostListPage.ts:116 +msgid "If your authentik Instance is using a self-signed certificate, set this value." +msgstr "If your authentik Instance is using a self-signed certificate, set this value." + +#: src/pages/users/UserListPage.ts:135 +msgid "Impersonate" +msgstr "Impersonate" + +#: src/pages/flows/FlowListPage.ts:122 +#: src/pages/flows/FlowListPage.ts:130 +msgid "Import" +msgstr "Import" + +#: src/pages/flows/FlowListPage.ts:125 +msgid "Import Flow" +msgstr "Import Flow" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:33 +msgid "Import certificates of external providers or create certificates to sign requests with." +msgstr "Import certificates of external providers or create certificates to sign requests with." + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:87 +msgid "In case you can't access any other method." +msgstr "In case you can't access any other method." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:218 +msgid "Include User claims from scopes in the id_token, for applications that don't access the userinfo endpoint." +msgstr "Include User claims from scopes in the id_token, for applications that don't access the userinfo endpoint." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:215 +msgid "Include claims in id_token" +msgstr "Include claims in id_token" + +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:92 +msgid "Internal Host" +msgstr "Internal Host" + +#: src/pages/applications/ApplicationForm.ts:89 +msgid "Internal application name, used in URLs." +msgstr "Internal application name, used in URLs." + +#: src/pages/providers/proxy/ProxyProviderForm.ts:83 +msgid "Internal host" +msgstr "Internal host" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:92 +msgid "Internal host SSL Validation" +msgstr "Internal host SSL Validation" + +#: src/pages/flows/FlowForm.ts:64 +msgid "Invalidation" +msgstr "Invalidation" + +#: src/pages/stages/invitation/InvitationListPage.ts:28 +msgid "Invitations" +msgstr "Invitations" + +#: src/pages/users/UserForm.ts:70 +msgid "Is active" +msgstr "Is active" + +#: src/pages/groups/GroupForm.ts:56 +msgid "Is superuser" +msgstr "Is superuser" + +#: src/pages/providers/saml/SAMLProviderForm.ts:88 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:111 +#: src/pages/sources/saml/SAMLSourceForm.ts:92 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:100 +msgid "Issuer" +msgstr "Issuer" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:221 +msgid "Issuer mode" +msgstr "Issuer mode" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:138 +msgid "JWT Algorithm" +msgstr "JWT Algorithm" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:187 +msgid "Key used to sign the tokens. Only required when JWT Algorithm is set to RS256." +msgstr "Key used to sign the tokens. Only required when JWT Algorithm is set to RS256." + +#: src/pages/providers/saml/SAMLProviderForm.ts:135 +msgid "Keypair used to sign outgoing Responses going to the Service Provider." +msgstr "Keypair used to sign outgoing Responses going to the Service Provider." + +#: src/pages/sources/oauth/OAuthSourceForm.ts:154 +#: src/pages/sources/saml/SAMLSourceForm.ts:127 +msgid "Keypair which is used to sign outgoing requests. Leave empty to disable signing." +msgstr "Keypair which is used to sign outgoing requests. Leave empty to disable signing." + +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:68 +msgid "Kubeconfig" +msgstr "Kubeconfig" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:44 +msgid "LDAP Source {0}" +msgstr "LDAP Source {0}" + +#: src/pages/stages/prompt/PromptForm.ts:89 +#: src/pages/stages/prompt/PromptListPage.ts:47 +msgid "Label" +msgstr "Label" + +#: src/pages/stages/prompt/PromptForm.ts:93 +msgid "Label shown next to/above the prompt." +msgstr "Label shown next to/above the prompt." + +#: src/pages/users/UserListPage.ts:51 +#: src/pages/users/UserViewPage.ts:107 +msgid "Last login" +msgstr "Last login" + +#: src/pages/outposts/OutpostHealth.ts:40 +msgid "Last seen: {0}" +msgstr "Last seen: {0}" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:150 +msgid "Last sync: {0}" +msgstr "Last sync: {0}" + +#: src/pages/applications/ApplicationForm.ts:115 +msgid "Launch URL" +msgstr "Launch URL" + +#: src/elements/table/Table.ts:113 +#: src/flows/FlowExecutor.ts:154 +#: src/flows/FlowExecutor.ts:200 +#: src/flows/access_denied/FlowAccessDenied.ts:27 +#: src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts:43 +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:33 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:137 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:35 +#: src/flows/stages/autosubmit/AutosubmitStage.ts:30 +#: src/flows/stages/captcha/CaptchaStage.ts:62 +#: src/flows/stages/consent/ConsentStage.ts:28 +#: src/flows/stages/dummy/DummyStage.ts:27 +#: src/flows/stages/email/EmailStage.ts:26 +#: src/flows/stages/identification/IdentificationStage.ts:134 +#: src/flows/stages/password/PasswordStage.ts:31 +#: src/flows/stages/prompt/PromptStage.ts:108 +#: src/pages/applications/ApplicationViewPage.ts:53 +#: src/pages/user-settings/UserDetailsPage.ts:37 +#: src/utils.ts:40 +msgid "Loading" +msgstr "Loading" + +#: src/elements/Spinner.ts:29 +#: src/pages/applications/ApplicationViewPage.ts:47 +msgid "Loading..." +msgstr "Loading..." + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:61 +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:62 +#: src/pages/outposts/ServiceConnectionListPage.ts:54 +msgid "Local" +msgstr "Local" + +#: src/flows/stages/identification/IdentificationStage.ts:146 +msgid "Login to continue to {0}." +msgstr "Login to continue to {0}." + +#: src/pages/admin-overview/TopApplicationsTable.ts:43 +msgid "Logins" +msgstr "Logins" + +#: src/pages/admin-overview/AdminOverviewPage.ts:36 +#: src/pages/applications/ApplicationViewPage.ts:69 +msgid "Logins over the last 24 hours" +msgstr "Logins over the last 24 hours" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:196 +msgid "Logout URL" +msgstr "Logout URL" + +#: src/pages/system-tasks/SystemTaskListPage.ts:27 +msgid "Long-running operations which authentik executes in the background." +msgstr "Long-running operations which authentik executes in the background." + +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:84 +msgid "Match created events with this action type. When left empty, all action types will be matched." +msgstr "Match created events with this action type. When left empty, all action types will be matched." + +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:104 +msgid "Match events created by selected application. When left empty, all applications are matched." +msgstr "Match events created by selected application. When left empty, all applications are matched." + +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:90 +msgid "Matches Event's Client IP (strict matching, for network matching use an Expression Policy." +msgstr "Matches Event's Client IP (strict matching, for network matching use an Expression Policy." + +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:72 +msgid "Maximum age (in days)" +msgstr "Maximum age (in days)" + +#: src/pages/groups/GroupForm.ts:76 +msgid "Members" +msgstr "Members" + +#: src/pages/events/EventInfo.ts:174 +#: src/pages/policies/PolicyTestForm.ts:43 +msgid "Messages" +msgstr "Messages" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:157 +#: src/pages/providers/saml/SAMLProviderImportForm.ts:61 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:152 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:140 +msgid "Metadata" +msgstr "Metadata" + +#: src/pages/policies/password/PasswordPolicyForm.ts:93 +msgid "Minimum amount of Lowercase Characters" +msgstr "Minimum amount of Lowercase Characters" + +#: src/pages/policies/password/PasswordPolicyForm.ts:99 +msgid "Minimum amount of Symbols Characters" +msgstr "Minimum amount of Symbols Characters" + +#: src/pages/policies/password/PasswordPolicyForm.ts:87 +msgid "Minimum amount of Uppercase Characters" +msgstr "Minimum amount of Uppercase Characters" + +#: src/pages/policies/password/PasswordPolicyForm.ts:81 +msgid "Minimum length" +msgstr "Minimum length" + +#: src/pages/events/TransportForm.ts:78 +#: src/pages/events/TransportListPage.ts:47 +#: src/pages/stages/consent/ConsentStageForm.ts:65 +msgid "Mode" +msgstr "Mode" + +#: src/pages/events/EventInfo.ts:67 +msgid "Model Name" +msgstr "Model Name" + +#: src/pages/applications/ApplicationForm.ts:78 +#: src/pages/applications/ApplicationListPage.ts:57 +#: src/pages/crypto/CertificateKeyPairForm.ts:46 +#: src/pages/crypto/CertificateKeyPairListPage.ts:51 +#: src/pages/events/EventInfo.ts:51 +#: src/pages/events/RuleForm.ts:59 +#: src/pages/events/RuleListPage.ts:47 +#: src/pages/events/TransportForm.ts:72 +#: src/pages/events/TransportListPage.ts:46 +#: src/pages/flows/FlowForm.ts:81 +#: src/pages/flows/FlowForm.ts:94 +#: src/pages/flows/FlowListPage.ts:47 +#: src/pages/groups/GroupForm.ts:47 +#: src/pages/groups/GroupListPage.ts:45 +#: src/pages/outposts/OutpostForm.ts:47 +#: src/pages/outposts/OutpostListPage.ts:49 +#: src/pages/outposts/ServiceConnectionDockerForm.ts:52 +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:53 +#: src/pages/outposts/ServiceConnectionListPage.ts:52 +#: src/pages/policies/PolicyListPage.ts:56 +#: src/pages/policies/dummy/DummyPolicyForm.ts:53 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:53 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:52 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:53 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:53 +#: src/pages/policies/password/PasswordPolicyForm.ts:53 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:52 +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:52 +#: src/pages/property-mappings/PropertyMappingListPage.ts:54 +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:52 +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:52 +#: src/pages/providers/ProviderListPage.ts:52 +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:56 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:83 +#: src/pages/providers/proxy/ProxyProviderForm.ts:54 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:74 +#: src/pages/providers/saml/SAMLProviderForm.ts:53 +#: src/pages/providers/saml/SAMLProviderImportForm.ts:38 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:77 +#: src/pages/sources/SourcesListPage.ts:51 +#: src/pages/sources/ldap/LDAPSourceForm.ts:53 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:75 +#: src/pages/sources/oauth/OAuthSourceForm.ts:97 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:73 +#: src/pages/sources/saml/SAMLSourceForm.ts:53 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:76 +#: src/pages/stages/StageListPage.ts:65 +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:54 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:53 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:61 +#: src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts:51 +#: src/pages/stages/captcha/CaptchaStageForm.ts:52 +#: src/pages/stages/consent/ConsentStageForm.ts:54 +#: src/pages/stages/deny/DenyStageForm.ts:51 +#: src/pages/stages/dummy/DummyStageForm.ts:51 +#: src/pages/stages/email/EmailStageForm.ts:119 +#: src/pages/stages/identification/IdentificationStageForm.ts:59 +#: src/pages/stages/invitation/InvitationStageForm.ts:52 +#: src/pages/stages/password/PasswordStageForm.ts:60 +#: src/pages/stages/prompt/PromptStageForm.ts:53 +#: src/pages/stages/user_delete/UserDeleteStageForm.ts:51 +#: src/pages/stages/user_login/UserLoginStageForm.ts:52 +#: src/pages/stages/user_logout/UserLogoutStageForm.ts:51 +#: src/pages/stages/user_write/UserWriteStageForm.ts:51 +#: src/pages/user-settings/UserDetailsPage.ts:65 +#: src/pages/users/UserForm.ts:53 +#: src/pages/users/UserListPage.ts:49 +#: src/pages/users/UserViewPage.ts:91 +msgid "Name" +msgstr "Name" + +#: src/pages/stages/prompt/PromptForm.ts:86 +msgid "Name of the form field, also used to store the value." +msgstr "Name of the form field, also used to store the value." + +#: src/pages/sources/saml/SAMLSourceForm.ts:146 +msgid "NameID Policy" +msgstr "NameID Policy" + +#: src/pages/providers/saml/SAMLProviderForm.ts:174 +msgid "NameID Property Mapping" +msgstr "NameID Property Mapping" + +#: src/flows/stages/identification/IdentificationStage.ts:119 +#: src/flows/stages/identification/IdentificationStage.ts:124 +msgid "Need an account?" +msgstr "Need an account?" + +#: src/pages/events/EventInfo.ts:189 +msgid "New version available!" +msgstr "New version available!" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:61 +#: src/pages/policies/PolicyTestForm.ts:38 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:118 +msgid "No" +msgstr "No" + +#: src/pages/LibraryPage.ts:111 +msgid "No Applications available." +msgstr "No Applications available." + +#: src/elements/events/ObjectChangelog.ts:68 +msgid "No Events found." +msgstr "No Events found." + +#: src/pages/policies/BoundPoliciesList.ts:150 +msgid "No Policies bound." +msgstr "No Policies bound." + +#: src/pages/flows/BoundStagesList.ts:112 +msgid "No Stages bound" +msgstr "No Stages bound" + +#: src/pages/events/EventInfo.ts:206 +msgid "No additional data available." +msgstr "No additional data available." + +#: src/elements/table/Table.ts:124 +msgid "No elements found." +msgstr "No elements found." + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:23 +msgid "No flows cached." +msgstr "No flows cached." + +#: src/elements/events/ObjectChangelog.ts:70 +msgid "No matching events could be found." +msgstr "No matching events could be found." + +#: src/pages/policies/BoundPoliciesList.ts:152 +msgid "No policies are currently bound to this object." +msgstr "No policies are currently bound to this object." + +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:24 +msgid "No policies cached. Users may experience slow response times." +msgstr "No policies cached. Users may experience slow response times." + +#: src/pages/flows/BoundStagesList.ts:114 +msgid "No stages are currently bound to this flow." +msgstr "No stages are currently bound to this flow." + +#: src/pages/admin-overview/cards/WorkerStatusCard.ts:22 +msgid "No workers connected. Background tasks will not run." +msgstr "No workers connected. Background tasks will not run." + +#: src/pages/events/RuleListPage.ts:58 +msgid "None (rule disabled)" +msgstr "None (rule disabled)" + +#: src/pages/outposts/OutpostHealth.ts:30 +msgid "Not available" +msgstr "Not available" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:72 +msgid "Not configured action" +msgstr "Not configured action" + +#: src/pages/user-settings/settings/SourceSettingsOAuth.ts:44 +msgid "Not connected." +msgstr "Not connected." + +#: src/elements/router/Router404.ts:24 +msgid "Not found" +msgstr "Not found" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:148 +msgid "Not synced in the last hour, check System tasks." +msgstr "Not synced in the last hour, check System tasks." + +#: src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts:58 +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:48 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:45 +#: src/flows/stages/captcha/CaptchaStage.ts:77 +#: src/flows/stages/consent/ConsentStage.ts:43 +#: src/flows/stages/password/PasswordStage.ts:46 +msgid "Not you?" +msgstr "Not you?" + +#: src/pages/events/RuleForm.ts:51 +msgid "Notice" +msgstr "Notice" + +#: src/pages/events/RuleListPage.ts:29 +msgid "Notification Rules" +msgstr "Notification Rules" + +#: src/pages/events/TransportListPage.ts:28 +msgid "Notification Transports" +msgstr "Notification Transports" + +#: src/pages/events/RuleListPage.ts:75 +msgid "Notification rule" +msgstr "Notification rule" + +#: src/elements/notifications/NotificationDrawer.ts:99 +msgid "Notifications" +msgstr "Notifications" + +#: src/pages/events/TransportListPage.ts:79 +msgid "Notifications Transport" +msgstr "Notifications Transport" + +#: src/pages/stages/prompt/PromptForm.ts:56 +msgid "Number" +msgstr "Number" + +#: src/pages/users/UserViewPage.ts:195 +msgid "OAuth Authorization Codes" +msgstr "OAuth Authorization Codes" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:45 +msgid "OAuth Provider {0}" +msgstr "OAuth Provider {0}" + +#: src/pages/users/UserViewPage.ts:203 +msgid "OAuth Refresh Codes" +msgstr "OAuth Refresh Codes" + +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:42 +msgid "OAuth Source {0}" +msgstr "OAuth Source {0}" + +#: src/pages/events/EventInfo.ts:147 +#: src/pages/events/EventInfo.ts:166 +msgid "Object" +msgstr "Object" + +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:58 +msgid "Object field" +msgstr "Object field" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:226 +msgid "Object uniqueness field" +msgstr "Object uniqueness field" + +#: src/pages/stages/consent/ConsentStageForm.ts:94 +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:50 +#: src/pages/events/EventListPage.ts:56 +msgid "On behalf of {0}" +msgstr "On behalf of {0}" + +#: src/pages/crypto/CertificateKeyPairForm.ts:51 +msgid "Only change the fields below if you want to overwrite their values." +msgstr "Only change the fields below if you want to overwrite their values." + +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:81 +msgid "Only fail the policy, don't set user's password." +msgstr "Only fail the policy, don't set user's password." + +#: src/pages/events/TransportForm.ts:101 +msgid "Only send notification once, for example when sending a webhook into a chat channel." +msgstr "Only send notification once, for example when sending a webhook into a chat channel." + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:171 +msgid "OpenID Configuration Issuer" +msgstr "OpenID Configuration Issuer" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:165 +msgid "OpenID Configuration URL" +msgstr "OpenID Configuration URL" + +#: src/pages/crypto/CertificateKeyPairForm.ts:63 +msgid "Optional Private Key. If this is set, you can use this keypair for encryption." +msgstr "Optional Private Key. If this is set, you can use this keypair for encryption." + +#: src/pages/sources/saml/SAMLSourceForm.ts:89 +msgid "Optional URL if the IDP supports Single-Logout." +msgstr "Optional URL if the IDP supports Single-Logout." + +#: src/pages/stages/invitation/InvitationForm.ts:55 +msgid "Optional data which is loaded into the flow's 'prompt_data' context variable." +msgstr "Optional data which is loaded into the flow's 'prompt_data' context variable." + +#: src/pages/stages/identification/IdentificationStageForm.ts:118 +msgid "Optional enrollment flow, which is linked at the bottom of the page." +msgstr "Optional enrollment flow, which is linked at the bottom of the page." + +#: src/pages/stages/identification/IdentificationStageForm.ts:136 +msgid "Optional recovery flow, which is linked at the bottom of the page." +msgstr "Optional recovery flow, which is linked at the bottom of the page." + +#: src/pages/crypto/CertificateGenerateForm.ts:38 +msgid "Optional, comma-separated SubjectAlt Names." +msgstr "Optional, comma-separated SubjectAlt Names." + +#: src/pages/stages/prompt/PromptForm.ts:115 +msgid "Optionally pre-fill the input value" +msgstr "Optionally pre-fill the input value" + +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:71 +msgid "Optionally set the 'FriendlyName' value of the Assertion attribute." +msgstr "Optionally set the 'FriendlyName' value of the Assertion attribute." + +#: src/pages/flows/StageBindingForm.ts:124 +#: src/pages/policies/BoundPoliciesList.ts:37 +#: src/pages/policies/PolicyBindingForm.ts:135 +#: src/pages/stages/prompt/PromptForm.ts:118 +#: src/pages/stages/prompt/PromptListPage.ts:49 +msgid "Order" +msgstr "Order" + +#: src/pages/outposts/OutpostListPage.ts:79 +msgid "Outpost" +msgstr "Outpost" + +#: src/pages/outposts/OutpostListPage.ts:95 +msgid "Outpost Deployment Info" +msgstr "Outpost Deployment Info" + +#: src/pages/outposts/ServiceConnectionListPage.ts:93 +msgid "Outpost Service-connection" +msgstr "Outpost Service-connection" + +#: src/pages/applications/ApplicationViewPage.ts:66 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:75 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:66 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:69 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:67 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:65 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:68 +#: src/pages/users/UserViewPage.ts:73 +msgid "Overview" +msgstr "Overview" + +#: src/pages/crypto/CertificateKeyPairForm.ts:57 +msgid "PEM-encoded Certificate data." +msgstr "PEM-encoded Certificate data." + +#: src/pages/groups/GroupForm.ts:62 +#: src/pages/groups/GroupListPage.ts:46 +msgid "Parent" +msgstr "Parent" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:76 +msgid "Pass policy?" +msgstr "Pass policy?" + +#: src/pages/events/EventInfo.ts:173 +#: src/pages/policies/PolicyTestForm.ts:35 +msgid "Passing" +msgstr "Passing" + +#: src/flows/stages/password/PasswordStage.ts:51 +msgid "Password" +msgstr "Password" + +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:73 +#: src/pages/policies/password/PasswordPolicyForm.ts:73 +msgid "Password field" +msgstr "Password field" + +#: src/pages/stages/email/EmailStageForm.ts:163 +msgid "Password reset" +msgstr "Password reset" + +#: src/pages/stages/prompt/PromptForm.ts:53 +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 "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." + +#: src/pages/sources/saml/SAMLSourceForm.ts:151 +msgid "Persistent" +msgstr "Persistent" + +#: src/pages/stages/prompt/PromptForm.ts:112 +msgid "Placeholder" +msgstr "Placeholder" + +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:81 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:58 +msgid "Please enter your TOTP Code" +msgstr "Please enter your TOTP Code" + +#: src/flows/stages/password/PasswordStage.ts:57 +msgid "Please enter your password" +msgstr "Please enter your password" + +#: src/pages/admin-overview/AdminOverviewPage.ts:44 +#: src/pages/policies/PolicyListPage.ts:38 +msgid "Policies" +msgstr "Policies" + +#: src/pages/admin-overview/cards/PolicyUnboundStatusCard.ts:25 +msgid "Policies without binding exist." +msgstr "Policies without binding exist." + +#: src/pages/policies/PolicyBindingForm.ts:84 +#: src/pages/policies/PolicyListPage.ts:108 +msgid "Policy" +msgstr "Policy" + +#: src/pages/applications/ApplicationViewPage.ts:109 +#: src/pages/flows/FlowViewPage.ts:104 +msgid "Policy Bindings" +msgstr "Policy Bindings" + +#: src/pages/policies/BoundPoliciesList.ts:137 +msgid "Policy binding" +msgstr "Policy binding" + +#: src/pages/applications/ApplicationForm.ts:102 +#: src/pages/flows/FlowForm.ts:101 +#: src/pages/flows/StageBindingForm.ts:130 +msgid "Policy engine mode" +msgstr "Policy engine mode" + +#: src/pages/policies/BoundPoliciesList.ts:45 +msgid "Policy {0}" +msgstr "Policy {0}" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:69 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:69 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:68 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:69 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:69 +#: src/pages/policies/password/PasswordPolicyForm.ts:69 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:68 +msgid "Policy-specific settings" +msgstr "Policy-specific settings" + +#: src/pages/providers/saml/SAMLProviderForm.ts:102 +msgid "Post" +msgstr "Post" + +#: src/pages/sources/saml/SAMLSourceForm.ts:109 +msgid "Post binding" +msgstr "Post binding" + +#: src/pages/sources/saml/SAMLSourceForm.ts:106 +msgid "Post binding (auto-submit)" +msgstr "Post binding (auto-submit)" + +#: src/flows/FlowExecutor.ts:242 +msgid "Powered by authentik" +msgstr "Powered by authentik" + +#: src/pages/sources/saml/SAMLSourceForm.ts:223 +msgid "Pre-authentication flow" +msgstr "Pre-authentication flow" + +#: src/pages/crypto/CertificateKeyPairForm.ts:61 +#: src/pages/stages/captcha/CaptchaStageForm.ts:70 +msgid "Private Key" +msgstr "Private Key" + +#: src/pages/stages/captcha/CaptchaStageForm.ts:74 +msgid "Private key, acquired from https://www.google.com/recaptcha/intro/v3.html." +msgstr "Private key, acquired from https://www.google.com/recaptcha/intro/v3.html." + +#: src/pages/sources/oauth/OAuthSourceForm.ts:78 +msgid "Profile URL" +msgstr "Profile URL" + +#: src/pages/stages/invitation/InvitationListPage.ts:61 +#: src/pages/stages/prompt/PromptListPage.ts:80 +msgid "Prompt" +msgstr "Prompt" + +#: src/pages/stages/prompt/PromptListPage.ts:28 +msgid "Prompts" +msgstr "Prompts" + +#: src/pages/property-mappings/PropertyMappingListPage.ts:97 +msgid "Property Mapping" +msgstr "Property Mapping" + +#: src/pages/property-mappings/PropertyMappingListPage.ts:35 +msgid "Property Mappings" +msgstr "Property Mappings" + +#: src/pages/providers/saml/SAMLProviderForm.ts:155 +msgid "Property mappings" +msgstr "Property mappings" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:189 +msgid "Property mappings used to group creation." +msgstr "Property mappings used to group creation." + +#: src/pages/sources/ldap/LDAPSourceForm.ts:163 +msgid "Property mappings used to user creation." +msgstr "Property mappings used to user creation." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:81 +#: src/pages/providers/proxy/ProxyProviderForm.ts:79 +#: src/pages/providers/saml/SAMLProviderForm.ts:78 +#: src/pages/sources/oauth/OAuthSourceForm.ts:119 +#: src/pages/sources/saml/SAMLSourceForm.ts:75 +msgid "Protocol settings" +msgstr "Protocol settings" + +#: src/pages/providers/ProviderListPage.ts:37 +msgid "Provide support for protocols like SAML and OAuth to assigned applications." +msgstr "Provide support for protocols like SAML and OAuth to assigned applications." + +#: src/elements/oauth/UserCodeList.ts:29 +#: src/elements/oauth/UserRefreshList.ts:29 +#: src/pages/applications/ApplicationForm.ts:92 +#: src/pages/applications/ApplicationViewPage.ts:83 +#: src/pages/providers/ProviderListPage.ts:34 +msgid "Provider" +msgstr "Provider" + +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:81 +msgid "Provider Type" +msgstr "Provider Type" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:135 +msgid "Provider type" +msgstr "Provider type" + +#: src/pages/admin-overview/AdminOverviewPage.ts:42 +#: src/pages/outposts/OutpostForm.ts:80 +msgid "Providers" +msgstr "Providers" + +#: src/pages/outposts/OutpostForm.ts:57 +msgid "Proxy" +msgstr "Proxy" + +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:42 +msgid "Proxy Provider {0}" +msgstr "Proxy Provider {0}" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:101 +msgid "Public" +msgstr "Public" + +#: src/pages/stages/captcha/CaptchaStageForm.ts:63 +msgid "Public Key" +msgstr "Public Key" + +#: src/pages/stages/captcha/CaptchaStageForm.ts:67 +msgid "Public key, acquired from https://www.google.com/recaptcha/intro/v3.html." +msgstr "Public key, acquired from https://www.google.com/recaptcha/intro/v3.html." + +#: src/pages/applications/ApplicationForm.ts:131 +msgid "Publisher" +msgstr "Publisher" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:143 +msgid "RS256 (Asymmetric Encryption)" +msgstr "RS256 (Asymmetric Encryption)" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:172 +msgid "RSA Key" +msgstr "RSA Key" + +#: src/pages/providers/saml/SAMLProviderForm.ts:237 +#: src/pages/sources/saml/SAMLSourceForm.ts:199 +msgid "RSA-SHA1" +msgstr "RSA-SHA1" + +#: src/pages/providers/saml/SAMLProviderForm.ts:240 +#: src/pages/sources/saml/SAMLSourceForm.ts:202 +msgid "RSA-SHA256" +msgstr "RSA-SHA256" + +#: src/pages/providers/saml/SAMLProviderForm.ts:243 +#: src/pages/sources/saml/SAMLSourceForm.ts:205 +msgid "RSA-SHA384" +msgstr "RSA-SHA384" + +#: src/pages/providers/saml/SAMLProviderForm.ts:246 +#: src/pages/sources/saml/SAMLSourceForm.ts:208 +msgid "RSA-SHA512" +msgstr "RSA-SHA512" + +#: src/pages/flows/StageBindingForm.ts:118 +msgid "Re-evaluate policies" +msgstr "Re-evaluate policies" + +#: src/pages/flows/FlowForm.ts:67 +msgid "Recovery" +msgstr "Recovery" + +#: src/pages/stages/identification/IdentificationStageForm.ts:121 +msgid "Recovery flow" +msgstr "Recovery flow" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:86 +msgid "Recovery keys" +msgstr "Recovery keys" + +#: src/pages/providers/saml/SAMLProviderForm.ts:99 +msgid "Redirect" +msgstr "Redirect" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:119 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:117 +msgid "Redirect URIs" +msgstr "Redirect URIs" + +#: src/pages/sources/saml/SAMLSourceForm.ts:103 +msgid "Redirect binding" +msgstr "Redirect binding" + +#: src/elements/table/Table.ts:183 +msgid "Refresh" +msgstr "Refresh" + +#: src/elements/oauth/UserRefreshList.ts:44 +msgid "Refresh Code" +msgstr "Refresh Code" + +#: src/flows/stages/authenticator_webauthn/WebAuthnAuthenticatorRegisterStage.ts:116 +msgid "Register device" +msgstr "Register device" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:130 +msgid "Regular expressions for which authentication is not required. Each new line is interpreted as a new Regular Expression." +msgstr "Regular expressions for which authentication is not required. Each new line is interpreted as a new Regular Expression." + +#: src/pages/applications/ApplicationViewPage.ts:77 +#: src/pages/flows/FlowViewPage.ts:68 +msgid "Related" +msgstr "Related" + +#: src/pages/events/EventInfo.ts:145 +#: src/pages/events/EventInfo.ts:164 +msgid "Request" +msgstr "Request" + +#: src/flows/access_denied/FlowAccessDenied.ts:40 +msgid "Request has been denied." +msgstr "Request has been denied." + +#: src/pages/sources/oauth/OAuthSourceForm.ts:85 +msgid "Request token URL" +msgstr "Request token URL" + +#: src/pages/stages/prompt/PromptForm.ts:107 +msgid "Required" +msgstr "Required" + +#: src/pages/user-settings/UserDetailsPage.ts:61 +#: src/pages/users/UserForm.ts:50 +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." + +#: src/pages/users/UserListPage.ts:132 +#: src/pages/users/UserViewPage.ts:164 +msgid "Reset Password" +msgstr "Reset Password" + +#: src/pages/events/EventInfo.ts:171 +#: src/pages/property-mappings/PropertyMappingTestForm.ts:34 +msgid "Result" +msgstr "Result" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:163 +#: src/pages/system-tasks/SystemTaskListPage.ts:83 +msgid "Retry Task" +msgstr "Retry Task" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts:106 +msgid "Retry authentication" +msgstr "Retry authentication" + +#: src/elements/router/Router404.ts:28 +msgid "Return home" +msgstr "Return home" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:82 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts:119 +msgid "Return to device picker" +msgstr "Return to device picker" + +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:58 +msgid "SAML Attribute Name" +msgstr "SAML Attribute Name" + +#: src/pages/providers/saml/SAMLProviderViewPage.ts:45 +msgid "SAML Provider {0}" +msgstr "SAML Provider {0}" + +#: src/pages/sources/saml/SAMLSourceViewPage.ts:45 +msgid "SAML Source {0}" +msgstr "SAML Source {0}" + +#: src/pages/providers/saml/SAMLProviderForm.ts:218 +#: src/pages/sources/saml/SAMLSourceForm.ts:180 +msgid "SHA1" +msgstr "SHA1" + +#: src/pages/providers/saml/SAMLProviderForm.ts:221 +#: src/pages/sources/saml/SAMLSourceForm.ts:183 +msgid "SHA256" +msgstr "SHA256" + +#: src/pages/providers/saml/SAMLProviderForm.ts:224 +#: src/pages/sources/saml/SAMLSourceForm.ts:186 +msgid "SHA384" +msgstr "SHA384" + +#: src/pages/providers/saml/SAMLProviderForm.ts:227 +#: src/pages/sources/saml/SAMLSourceForm.ts:189 +msgid "SHA512" +msgstr "SHA512" + +#: src/pages/sources/saml/SAMLSourceForm.ts:86 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:92 +msgid "SLO URL" +msgstr "SLO URL" + +#: src/pages/stages/email/EmailStageForm.ts:61 +msgid "SMTP Host" +msgstr "SMTP Host" + +#: src/pages/stages/email/EmailStageForm.ts:79 +msgid "SMTP Password" +msgstr "SMTP Password" + +#: src/pages/stages/email/EmailStageForm.ts:67 +msgid "SMTP Port" +msgstr "SMTP Port" + +#: src/pages/stages/email/EmailStageForm.ts:73 +msgid "SMTP Username" +msgstr "SMTP Username" + +#: src/pages/sources/saml/SAMLSourceForm.ts:79 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:84 +msgid "SSO URL" +msgstr "SSO URL" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:229 +msgid "Same identifier is used for all providers" +msgstr "Same identifier is used for all providers" + +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:58 +msgid "Scope name" +msgstr "Scope name" + +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:62 +msgid "Scope which the client can specify to access these properties." +msgstr "Scope which the client can specify to access these properties." + +#: src/elements/oauth/UserCodeList.ts:31 +#: src/elements/oauth/UserRefreshList.ts:31 +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:152 +msgid "Scopes" +msgstr "Scopes" + +#: src/pages/events/EventInfo.ts:124 +msgid "Secret:" +msgstr "Secret:" + +#: src/elements/table/Table.ts:215 +msgid "Select all rows" +msgstr "Select all rows" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:149 +msgid "Select an identification method." +msgstr "Select an identification method." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:168 +msgid "Select which scopes can be used by the client. The client stil has to specify the scope to access the data." +msgstr "Select which scopes can be used by the client. The client stil has to specify the scope to access the data." + +#: src/pages/events/RuleForm.ts:92 +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 "Select which transports should be used to notify the user. If none are selected, the notification will only be shown in the authentik UI." + +#: src/pages/stages/prompt/PromptStageForm.ts:102 +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." + +#: src/pages/outposts/OutpostForm.ts:74 +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." + +#: src/pages/stages/password/PasswordStageForm.ts:82 +msgid "Selection of backends to test the password against." +msgstr "Selection of backends to test the password against." + +#: src/flows/stages/email/EmailStage.ts:44 +msgid "Send Email again." +msgstr "Send Email again." + +#: src/pages/events/RuleListPage.ts:32 +msgid "Send notifications whenever a specific Event is created and matched by policies." +msgstr "Send notifications whenever a specific Event is created and matched by policies." + +#: src/pages/events/TransportForm.ts:98 +msgid "Send once" +msgstr "Send once" + +#: src/pages/events/RuleListPage.ts:49 +msgid "Sent to group" +msgstr "Sent to group" + +#: src/pages/stages/prompt/PromptForm.ts:68 +msgid "Separator: Static Separator Line" +msgstr "Separator: Static Separator Line" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:102 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:83 +msgid "Server URI" +msgstr "Server URI" + +#: src/flows/stages/authenticator_webauthn/WebAuthnAuthenticatorRegisterStage.ts:70 +msgid "Server validation of credential failed: {err}" +msgstr "Server validation of credential failed: {err}" + +#: src/pages/providers/saml/SAMLProviderForm.ts:94 +msgid "Service Provider Binding" +msgstr "Service Provider Binding" + +#: src/pages/outposts/OutpostForm.ts:61 +msgid "Service connection" +msgstr "Service connection" + +#: src/pages/stages/user_login/UserLoginStageForm.ts:63 +msgid "Session duration" +msgstr "Session duration" + +#: src/pages/providers/saml/SAMLProviderForm.ts:209 +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:205 +msgid "Session valid not on or after" +msgstr "Session valid not on or after" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:137 +msgid "Set HTTP-Basic Authentication" +msgstr "Set HTTP-Basic Authentication" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:140 +msgid "Set a custom HTTP-Basic Authentication header based on values from authentik." +msgstr "Set a custom HTTP-Basic Authentication header based on values from authentik." + +#: src/pages/events/RuleForm.ts:96 +#: src/pages/events/RuleListPage.ts:48 +msgid "Severity" +msgstr "Severity" + +#: src/pages/stages/identification/IdentificationStageForm.ts:97 +msgid "Show matched user" +msgstr "Show matched user" + +#: src/pages/flows/FlowForm.ts:91 +msgid "Shown as the Title in Flow pages." +msgstr "Shown as the Title in Flow pages." + +#: src/flows/stages/identification/IdentificationStage.ts:120 +msgid "Sign up." +msgstr "Sign up." + +#: src/pages/providers/saml/SAMLProviderForm.ts:232 +#: src/pages/sources/saml/SAMLSourceForm.ts:194 +msgid "Signature algorithm" +msgstr "Signature algorithm" + +#: src/pages/providers/saml/SAMLProviderForm.ts:121 +msgid "Signing Keypair" +msgstr "Signing Keypair" + +#: src/pages/sources/saml/SAMLSourceForm.ts:114 +msgid "Signing keypair" +msgstr "Signing keypair" + +#: src/pages/stages/prompt/PromptListPage.ts:31 +msgid "Single Prompts that can be used for Prompt Stages." +msgstr "Single Prompts that can be used for Prompt Stages." + +#: src/pages/providers/proxy/ProxyProviderForm.ts:127 +msgid "Skip path regex" +msgstr "Skip path regex" + +#: src/pages/applications/ApplicationForm.ts:85 +#: src/pages/applications/ApplicationListPage.ts:58 +#: src/pages/sources/ldap/LDAPSourceForm.ts:59 +#: src/pages/sources/oauth/OAuthSourceForm.ts:103 +#: src/pages/sources/saml/SAMLSourceForm.ts:59 +msgid "Slug" +msgstr "Slug" + +#: src/flows/FlowExecutor.ts:134 +msgid "Something went wrong! Please try again later." +msgstr "Something went wrong! Please try again later." + +#: src/pages/providers/ProviderListPage.ts:91 +#: src/pages/sources/SourcesListPage.ts:84 +msgid "Source" +msgstr "Source" + +#: src/pages/user-settings/settings/SourceSettingsOAuth.ts:21 +msgid "Source {0}" +msgstr "Source {0}" + +#: src/pages/flows/StageBindingForm.ts:94 +msgid "Stage" +msgstr "Stage" + +#: src/pages/flows/FlowViewPage.ts:96 +msgid "Stage Bindings" +msgstr "Stage Bindings" + +#: src/pages/flows/FlowForm.ts:70 +msgid "Stage Configuration" +msgstr "Stage Configuration" + +#: src/pages/flows/BoundStagesList.ts:84 +msgid "Stage binding" +msgstr "Stage binding" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:130 +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 "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again." + +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:61 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:60 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:68 +#: src/pages/stages/captcha/CaptchaStageForm.ts:59 +#: src/pages/stages/consent/ConsentStageForm.ts:61 +#: src/pages/stages/email/EmailStageForm.ts:126 +#: src/pages/stages/identification/IdentificationStageForm.ts:66 +#: src/pages/stages/invitation/InvitationStageForm.ts:59 +#: src/pages/stages/password/PasswordStageForm.ts:67 +#: src/pages/stages/prompt/PromptStageForm.ts:60 +#: src/pages/stages/user_login/UserLoginStageForm.ts:59 +msgid "Stage-specific settings" +msgstr "Stage-specific settings" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:101 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts:77 +msgid "Static Tokens" +msgstr "Static Tokens" + +#: src/pages/stages/prompt/PromptForm.ts:74 +msgid "Static: Static value, displayed as-is." +msgstr "Static: Static value, displayed as-is." + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts:44 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts:59 +msgid "Status: Disabled" +msgstr "Status: Disabled" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts:18 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts:22 +msgid "Status: Enabled" +msgstr "Status: Enabled" + +#: src/interfaces/Interface.ts:52 +msgid "Stop impersonation" +msgstr "Stop impersonation" + +#: src/pages/stages/email/EmailStageForm.ts:149 +msgid "Subject" +msgstr "Subject" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:190 +msgid "Subject mode" +msgstr "Subject mode" + +#: src/pages/crypto/CertificateGenerateForm.ts:35 +msgid "Subject-alt name" +msgstr "Subject-alt name" + +#: src/pages/system-tasks/SystemTaskListPage.ts:59 +msgid "Successful" +msgstr "Successful" + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:34 +msgid "Successfully cleared flow cache" +msgstr "Successfully cleared flow cache" + +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:35 +msgid "Successfully cleared policy cache" +msgstr "Successfully cleared policy cache" + +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:63 +msgid "Successfully copied TOTP Config." +msgstr "Successfully copied TOTP Config." + +#: src/pages/applications/ApplicationForm.ts:50 +msgid "Successfully created application." +msgstr "Successfully created application." + +#: src/pages/flows/StageBindingForm.ts:39 +#: src/pages/policies/PolicyBindingForm.ts:48 +msgid "Successfully created binding." +msgstr "Successfully created binding." + +#: src/pages/crypto/CertificateKeyPairForm.ts:39 +msgid "Successfully created certificate-key pair." +msgstr "Successfully created certificate-key pair." + +#: src/pages/flows/FlowForm.ts:48 +msgid "Successfully created flow." +msgstr "Successfully created flow." + +#: src/pages/groups/GroupForm.ts:40 +msgid "Successfully created group." +msgstr "Successfully created group." + +#: src/pages/stages/invitation/InvitationForm.ts:38 +msgid "Successfully created invitation." +msgstr "Successfully created invitation." + +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:45 +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:45 +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:45 +msgid "Successfully created mapping." +msgstr "Successfully created mapping." + +#: src/pages/outposts/OutpostForm.ts:40 +msgid "Successfully created outpost." +msgstr "Successfully created outpost." + +#: src/pages/policies/dummy/DummyPolicyForm.ts:46 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:46 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:45 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:46 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:46 +#: src/pages/policies/password/PasswordPolicyForm.ts:46 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:45 +msgid "Successfully created policy." +msgstr "Successfully created policy." + +#: src/pages/stages/prompt/PromptForm.ts:37 +msgid "Successfully created prompt." +msgstr "Successfully created prompt." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:49 +#: src/pages/providers/proxy/ProxyProviderForm.ts:47 +#: src/pages/providers/saml/SAMLProviderForm.ts:46 +msgid "Successfully created provider." +msgstr "Successfully created provider." + +#: src/pages/events/RuleForm.ts:38 +msgid "Successfully created rule." +msgstr "Successfully created rule." + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:45 +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:46 +msgid "Successfully created service-connection." +msgstr "Successfully created service-connection." + +#: src/pages/sources/ldap/LDAPSourceForm.ts:46 +#: src/pages/sources/oauth/OAuthSourceForm.ts:49 +#: src/pages/sources/saml/SAMLSourceForm.ts:46 +msgid "Successfully created source." +msgstr "Successfully created source." + +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:47 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:46 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:48 +#: src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts:44 +#: src/pages/stages/captcha/CaptchaStageForm.ts:45 +#: src/pages/stages/consent/ConsentStageForm.ts:47 +#: src/pages/stages/deny/DenyStageForm.ts:44 +#: src/pages/stages/dummy/DummyStageForm.ts:44 +#: src/pages/stages/email/EmailStageForm.ts:47 +#: src/pages/stages/identification/IdentificationStageForm.ts:46 +#: src/pages/stages/invitation/InvitationStageForm.ts:45 +#: src/pages/stages/password/PasswordStageForm.ts:47 +#: src/pages/stages/prompt/PromptStageForm.ts:46 +#: src/pages/stages/user_delete/UserDeleteStageForm.ts:44 +#: src/pages/stages/user_login/UserLoginStageForm.ts:45 +#: src/pages/stages/user_logout/UserLogoutStageForm.ts:44 +#: src/pages/stages/user_write/UserWriteStageForm.ts:44 +msgid "Successfully created stage." +msgstr "Successfully created stage." + +#: src/pages/user-settings/tokens/UserTokenForm.ts:37 +msgid "Successfully created token." +msgstr "Successfully created token." + +#: src/pages/events/TransportForm.ts:38 +msgid "Successfully created transport." +msgstr "Successfully created transport." + +#: src/pages/users/UserForm.ts:39 +msgid "Successfully created user." +msgstr "Successfully created user." + +#: src/elements/forms/DeleteForm.ts:30 +msgid "Successfully deleted {0} {1}" +msgstr "Successfully deleted {0} {1}" + +#: src/pages/crypto/CertificateGenerateForm.ts:24 +msgid "Successfully generated certificate-key pair." +msgstr "Successfully generated certificate-key pair." + +#: src/pages/users/UserListPage.ts:127 +#: src/pages/users/UserViewPage.ts:159 +msgid "Successfully generated recovery link" +msgstr "Successfully generated recovery link" + +#: src/pages/flows/FlowImportForm.ts:29 +msgid "Successfully imported flow." +msgstr "Successfully imported flow." + +#: src/pages/providers/saml/SAMLProviderImportForm.ts:33 +msgid "Successfully imported provider." +msgstr "Successfully imported provider." + +#: src/pages/policies/PolicyTestForm.ts:29 +#: src/pages/property-mappings/PropertyMappingTestForm.ts:29 +msgid "Successfully sent test-request." +msgstr "Successfully sent test-request." + +#: src/pages/applications/ApplicationForm.ts:47 +msgid "Successfully updated application." +msgstr "Successfully updated application." + +#: src/pages/flows/StageBindingForm.ts:36 +#: src/pages/policies/PolicyBindingForm.ts:45 +msgid "Successfully updated binding." +msgstr "Successfully updated binding." + +#: src/pages/crypto/CertificateKeyPairForm.ts:36 +msgid "Successfully updated certificate-key pair." +msgstr "Successfully updated certificate-key pair." + +#: src/pages/user-settings/UserDetailsPage.ts:46 +msgid "Successfully updated details." +msgstr "Successfully updated details." + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:50 +msgid "Successfully updated device." +msgstr "Successfully updated device." + +#: src/pages/flows/FlowForm.ts:45 +msgid "Successfully updated flow." +msgstr "Successfully updated flow." + +#: src/pages/groups/GroupForm.ts:37 +msgid "Successfully updated group." +msgstr "Successfully updated group." + +#: src/pages/stages/invitation/InvitationForm.ts:35 +msgid "Successfully updated invitation." +msgstr "Successfully updated invitation." + +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:42 +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:42 +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:42 +msgid "Successfully updated mapping." +msgstr "Successfully updated mapping." + +#: src/pages/outposts/OutpostForm.ts:37 +msgid "Successfully updated outpost." +msgstr "Successfully updated outpost." + +#: src/pages/policies/dummy/DummyPolicyForm.ts:43 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:43 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:42 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:43 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:43 +#: src/pages/policies/password/PasswordPolicyForm.ts:43 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:42 +msgid "Successfully updated policy." +msgstr "Successfully updated policy." + +#: src/pages/stages/prompt/PromptForm.ts:34 +msgid "Successfully updated prompt." +msgstr "Successfully updated prompt." + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:46 +#: src/pages/providers/proxy/ProxyProviderForm.ts:44 +#: src/pages/providers/saml/SAMLProviderForm.ts:43 +msgid "Successfully updated provider." +msgstr "Successfully updated provider." + +#: src/pages/events/RuleForm.ts:35 +msgid "Successfully updated rule." +msgstr "Successfully updated rule." + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:42 +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:43 +msgid "Successfully updated service-connection." +msgstr "Successfully updated service-connection." + +#: src/pages/sources/ldap/LDAPSourceForm.ts:43 +#: src/pages/sources/oauth/OAuthSourceForm.ts:46 +#: src/pages/sources/saml/SAMLSourceForm.ts:43 +msgid "Successfully updated source." +msgstr "Successfully updated source." + +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:44 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:43 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:45 +#: src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts:41 +#: src/pages/stages/captcha/CaptchaStageForm.ts:42 +#: src/pages/stages/consent/ConsentStageForm.ts:44 +#: src/pages/stages/deny/DenyStageForm.ts:41 +#: src/pages/stages/dummy/DummyStageForm.ts:41 +#: src/pages/stages/email/EmailStageForm.ts:44 +#: src/pages/stages/identification/IdentificationStageForm.ts:43 +#: src/pages/stages/invitation/InvitationStageForm.ts:42 +#: src/pages/stages/password/PasswordStageForm.ts:44 +#: src/pages/stages/prompt/PromptStageForm.ts:43 +#: src/pages/stages/user_delete/UserDeleteStageForm.ts:41 +#: src/pages/stages/user_login/UserLoginStageForm.ts:42 +#: src/pages/stages/user_logout/UserLogoutStageForm.ts:41 +#: src/pages/stages/user_write/UserWriteStageForm.ts:41 +msgid "Successfully updated stage." +msgstr "Successfully updated stage." + +#: src/pages/user-settings/tokens/UserTokenForm.ts:34 +msgid "Successfully updated token." +msgstr "Successfully updated token." + +#: src/pages/events/TransportForm.ts:35 +msgid "Successfully updated transport." +msgstr "Successfully updated transport." + +#: src/pages/users/UserForm.ts:36 +msgid "Successfully updated user." +msgstr "Successfully updated user." + +#: src/pages/users/UserActiveForm.ts:17 +msgid "Successfully updated {0} {1}" +msgstr "Successfully updated {0} {1}" + +#: src/pages/users/UserViewPage.ts:125 +msgid "Superuser" +msgstr "Superuser" + +#: src/pages/policies/password/PasswordPolicyForm.ts:118 +msgid "Symbol charset" +msgstr "Symbol charset" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:135 +msgid "Sync" +msgstr "Sync" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:92 +msgid "Sync groups" +msgstr "Sync groups" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:140 +msgid "Sync status" +msgstr "Sync status" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:76 +msgid "Sync users" +msgstr "Sync users" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:84 +msgid "Sync users' passwords" +msgstr "Sync users' passwords" + +#: src/pages/admin-overview/AdminOverviewPage.ts:31 +msgid "System Overview" +msgstr "System Overview" + +#: src/pages/system-tasks/SystemTaskListPage.ts:24 +msgid "System Tasks" +msgstr "System Tasks" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:91 +msgid "TLS Authentication Certificate" +msgstr "TLS Authentication Certificate" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:74 +msgid "TLS Verification Certificate" +msgstr "TLS Verification Certificate" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:104 +msgid "TOTP Authenticators" +msgstr "TOTP Authenticators" + +#: src/pages/flows/StageBindingForm.ts:74 +msgid "Target" +msgstr "Target" + +#: src/pages/stages/email/EmailStageForm.ts:155 +msgid "Template" +msgstr "Template" + +#: src/pages/events/TransportListPage.ts:62 +#: src/pages/policies/PolicyListPage.ts:95 +#: src/pages/policies/PolicyListPage.ts:103 +#: src/pages/property-mappings/PropertyMappingListPage.ts:84 +#: src/pages/property-mappings/PropertyMappingListPage.ts:92 +msgid "Test" +msgstr "Test" + +#: src/pages/policies/PolicyListPage.ts:98 +msgid "Test Policy" +msgstr "Test Policy" + +#: src/pages/property-mappings/PropertyMappingListPage.ts:87 +msgid "Test Property Mapping" +msgstr "Test Property Mapping" + +#: src/pages/stages/prompt/PromptForm.ts:44 +msgid "Text: Simple Text input" +msgstr "Text: Simple Text input" + +#: src/elements/router/Router404.ts:26 +msgid "The URL '{0}' was not found." +msgstr "The URL '{0}' was not found." + +#: src/pages/policies/dummy/DummyPolicyForm.ts:86 +msgid "The policy takes a random time to execute. This controls the minimum time it will take." +msgstr "The policy takes a random time to execute. This controls the minimum time it will take." + +#: src/pages/flows/BoundStagesList.ts:102 +msgid "These policies control when this stage will be applied to the flow." +msgstr "These policies control when this stage will be applied to the flow." + +#: src/pages/applications/ApplicationViewPage.ts:111 +msgid "These policies control which users can access this application." +msgstr "These policies control which users can access this application." + +#: src/pages/flows/FlowViewPage.ts:106 +msgid "These policies control which users can access this flow." +msgstr "These policies control which users can access this flow." + +#: src/pages/policies/reputation/ReputationPolicyForm.ts:88 +msgid "Threshold" +msgstr "Threshold" + +#: src/pages/stages/email/EmailStageForm.ts:146 +msgid "Time in minutes the token sent is valid." +msgstr "Time in minutes the token sent is valid." + +#: src/pages/sources/saml/SAMLSourceForm.ts:172 +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)." + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts:62 +msgid "Time-based One-Time Passwords" +msgstr "Time-based One-Time Passwords" + +#: src/pages/policies/BoundPoliciesList.ts:38 +#: src/pages/policies/PolicyBindingForm.ts:141 +#: src/pages/stages/email/EmailStageForm.ts:101 +msgid "Timeout" +msgstr "Timeout" + +#: src/pages/flows/FlowForm.ts:87 +msgid "Title" +msgstr "Title" + +#: src/pages/tokens/TokenListPage.ts:61 +#: src/pages/user-settings/tokens/UserTokenList.ts:118 +msgid "Token" +msgstr "Token" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:184 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:113 +msgid "Token URL" +msgstr "Token URL" + +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:65 +msgid "Token count" +msgstr "Token count" + +#: src/pages/stages/email/EmailStageForm.ts:142 +msgid "Token expiry" +msgstr "Token expiry" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:132 +msgid "Token validity" +msgstr "Token validity" + +#: src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts:62 +#: src/pages/tokens/TokenListPage.ts:26 +#: src/pages/user-settings/UserSettingsPage.ts:80 +msgid "Tokens" +msgstr "Tokens" + +#: src/pages/tokens/TokenListPage.ts:29 +msgid "Tokens are used throughout authentik for Email validation stages, Recovery keys and API access." +msgstr "Tokens are used throughout authentik for Email validation stages, Recovery keys and API access." + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:80 +msgid "Traditional authenticator" +msgstr "Traditional authenticator" + +#: src/pages/sources/saml/SAMLSourceForm.ts:163 +msgid "Transient" +msgstr "Transient" + +#: src/pages/events/RuleForm.ts:78 +msgid "Transports" +msgstr "Transports" + +#: src/pages/outposts/OutpostForm.ts:53 +#: src/pages/property-mappings/PropertyMappingListPage.ts:55 +#: src/pages/providers/ProviderListPage.ts:54 +#: src/pages/sources/SourcesListPage.ts:52 +#: src/pages/stages/prompt/PromptForm.ts:96 +#: src/pages/stages/prompt/PromptListPage.ts:48 +msgid "Type" +msgstr "Type" + +#: src/pages/events/EventInfo.ts:43 +msgid "UID" +msgstr "UID" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:60 +msgid "URL settings" +msgstr "URL settings" + +#: src/pages/sources/saml/SAMLSourceForm.ts:83 +msgid "URL that the initial Login request is sent to." +msgstr "URL that the initial Login request is sent to." + +#: src/pages/sources/oauth/OAuthSourceForm.ts:68 +msgid "URL the user is redirect to to consent the authorization." +msgstr "URL the user is redirect to to consent the authorization." + +#: src/pages/sources/oauth/OAuthSourceForm.ts:82 +msgid "URL used by authentik to get user information." +msgstr "URL used by authentik to get user information." + +#: src/pages/sources/oauth/OAuthSourceForm.ts:75 +msgid "URL used by authentik to retrieve tokens." +msgstr "URL used by authentik to retrieve tokens." + +#: src/pages/sources/oauth/OAuthSourceForm.ts:88 +msgid "URL used to request the initial token. This URL is only required for OAuth 1." +msgstr "URL used to request the initial token. This URL is only required for OAuth 1." + +#: src/pages/flows/FlowForm.ts:73 +msgid "Unenrollment" +msgstr "Unenrollment" + +#: src/pages/outposts/ServiceConnectionListPage.ts:70 +msgid "Unhealthy" +msgstr "Unhealthy" + +#: src/pages/system-tasks/SystemTaskListPage.ts:65 +msgid "Unknown" +msgstr "Unknown" + +#: src/pages/admin-overview/cards/VersionStatusCard.ts:32 +msgid "Up-to-date!" +msgstr "Up-to-date!" + +#: src/pages/applications/ApplicationListPage.ts:82 +#: src/pages/crypto/CertificateKeyPairListPage.ts:66 +#: src/pages/events/RuleListPage.ts:62 +#: src/pages/events/TransportListPage.ts:66 +#: src/pages/flows/BoundStagesList.ts:53 +#: src/pages/flows/BoundStagesList.ts:71 +#: src/pages/flows/FlowListPage.ts:66 +#: src/pages/groups/GroupListPage.ts:62 +#: src/pages/outposts/OutpostListPage.ts:66 +#: src/pages/outposts/ServiceConnectionListPage.ts:75 +#: src/pages/policies/BoundPoliciesList.ts:63 +#: src/pages/policies/BoundPoliciesList.ts:83 +#: src/pages/policies/BoundPoliciesList.ts:98 +#: src/pages/policies/BoundPoliciesList.ts:124 +#: src/pages/policies/PolicyListPage.ts:77 +#: src/pages/property-mappings/PropertyMappingListPage.ts:66 +#: src/pages/providers/ProviderListPage.ts:73 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:128 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:127 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:122 +#: src/pages/sources/SourcesListPage.ts:66 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:106 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:124 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:111 +#: src/pages/stages/StageListPage.ts:85 +#: src/pages/stages/prompt/PromptListPage.ts:67 +#: src/pages/user-settings/UserDetailsPage.ts:81 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:43 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:46 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:67 +#: src/pages/user-settings/tokens/UserTokenList.ts:105 +#: src/pages/users/UserActiveForm.ts:57 +#: src/pages/users/UserListPage.ts:67 +#: src/pages/users/UserViewPage.ts:138 +msgid "Update" +msgstr "Update" + +#: src/pages/applications/ApplicationListPage.ts:85 +msgid "Update Application" +msgstr "Update Application" + +#: src/pages/policies/BoundPoliciesList.ts:127 +msgid "Update Binding" +msgstr "Update Binding" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:69 +msgid "Update Certificate-Key Pair" +msgstr "Update Certificate-Key Pair" + +#: src/pages/flows/FlowListPage.ts:69 +msgid "Update Flow" +msgstr "Update Flow" + +#: src/pages/groups/GroupListPage.ts:65 +#: src/pages/policies/BoundPoliciesList.ts:86 +msgid "Update Group" +msgstr "Update Group" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:109 +msgid "Update LDAP Source" +msgstr "Update LDAP Source" + +#: src/pages/events/RuleListPage.ts:65 +msgid "Update Notification Rule" +msgstr "Update Notification Rule" + +#: src/pages/events/TransportListPage.ts:69 +msgid "Update Notification Transport" +msgstr "Update Notification Transport" + +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:127 +msgid "Update OAuth Source" +msgstr "Update OAuth Source" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:131 +msgid "Update OAuth2 Provider" +msgstr "Update OAuth2 Provider" + +#: src/pages/outposts/OutpostListPage.ts:69 +msgid "Update Outpost" +msgstr "Update Outpost" + +#: src/pages/stages/prompt/PromptListPage.ts:70 +msgid "Update Prompt" +msgstr "Update Prompt" + +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:130 +msgid "Update Proxy Provider" +msgstr "Update Proxy Provider" + +#: src/pages/providers/saml/SAMLProviderViewPage.ts:125 +msgid "Update SAML Provider" +msgstr "Update SAML Provider" + +#: src/pages/sources/saml/SAMLSourceViewPage.ts:114 +msgid "Update SAML Source" +msgstr "Update SAML Source" + +#: src/pages/flows/BoundStagesList.ts:74 +msgid "Update Stage binding" +msgstr "Update Stage binding" + +#: src/pages/user-settings/tokens/UserTokenList.ts:108 +msgid "Update Token" +msgstr "Update Token" + +#: src/pages/policies/BoundPoliciesList.ts:101 +#: src/pages/users/UserListPage.ts:70 +#: src/pages/users/UserViewPage.ts:141 +msgid "Update User" +msgstr "Update User" + +#: src/pages/user-settings/UserDetailsPage.ts:42 +msgid "Update details" +msgstr "Update details" + +#: src/pages/flows/BoundStagesList.ts:56 +#: src/pages/outposts/ServiceConnectionListPage.ts:78 +#: src/pages/policies/BoundPoliciesList.ts:66 +#: src/pages/policies/PolicyListPage.ts:80 +#: src/pages/property-mappings/PropertyMappingListPage.ts:69 +#: src/pages/providers/ProviderListPage.ts:76 +#: src/pages/sources/SourcesListPage.ts:69 +#: src/pages/stages/StageListPage.ts:88 +#: src/pages/users/UserActiveForm.ts:32 +msgid "Update {0}" +msgstr "Update {0}" + +#: src/pages/stages/email/EmailStageForm.ts:96 +msgid "Use SSL" +msgstr "Use SSL" + +#: src/pages/stages/email/EmailStageForm.ts:88 +msgid "Use TLS" +msgstr "Use TLS" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:81 +msgid "Use a code-based authenticator." +msgstr "Use a code-based authenticator." + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:64 +msgid "Use a security key to prove your identity." +msgstr "Use a security key to prove your identity." + +#: src/pages/stages/email/EmailStageForm.ts:136 +msgid "Use global settings" +msgstr "Use global settings" + +#: src/elements/events/ObjectChangelog.ts:39 +#: src/pages/events/EventInfo.ts:83 +#: src/pages/events/EventListPage.ts:44 +#: src/pages/policies/PolicyBindingForm.ts:111 +#: src/pages/policies/PolicyTestForm.ts:60 +#: src/pages/property-mappings/PropertyMappingTestForm.ts:49 +#: src/pages/tokens/TokenListPage.ts:45 +#: src/pages/user-settings/tokens/UserTokenList.ts:72 +#: src/pages/users/UserListPage.ts:87 +#: src/pages/users/UserListPage.ts:107 +msgid "User" +msgstr "User" + +#: src/pages/users/UserViewPage.ts:77 +msgid "User Info" +msgstr "User Info" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:141 +msgid "User Property Mappings" +msgstr "User Property Mappings" + +#: src/pages/user-settings/UserSettingsPage.ts:71 +msgid "User Settings" +msgstr "User Settings" + +#: src/pages/user-settings/UserSettingsPage.ts:77 +msgid "User details" +msgstr "User details" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:96 +#: src/pages/stages/identification/IdentificationStageForm.ts:70 +msgid "User fields" +msgstr "User fields" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:205 +msgid "User object filter" +msgstr "User object filter" + +#: src/pages/policies/BoundPoliciesList.ts:51 +#: src/pages/users/UserViewPage.ts:48 +msgid "User {0}" +msgstr "User {0}" + +#: src/flows/FormStatic.ts:43 +msgid "User's avatar" +msgstr "User's avatar" + +#: src/pages/user-settings/UserDetailsPage.ts:68 +#: src/pages/users/UserForm.ts:57 +msgid "User's display name." +msgstr "User's display name." + +#: src/pages/providers/proxy/ProxyProviderForm.ts:152 +msgid "User/Group Attribute used for the password part of the HTTP-Basic Header." +msgstr "User/Group Attribute used for the password part of the HTTP-Basic Header." + +#: src/pages/providers/proxy/ProxyProviderForm.ts:146 +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 "User/Group Attribute used for the user part of the HTTP-Basic Header. If not set, the user's Email address is used." + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:190 +msgid "Userinfo URL" +msgstr "Userinfo URL" + +#: src/pages/stages/identification/IdentificationStageForm.ts:75 +#: src/pages/user-settings/UserDetailsPage.ts:58 +#: src/pages/users/UserForm.ts:46 +#: src/pages/users/UserViewPage.ts:83 +msgid "Username" +msgstr "Username" + +#: src/pages/stages/prompt/PromptForm.ts:47 +msgid "Username: Same as Text input, but checks for and prevents duplicate usernames." +msgstr "Username: Same as Text input, but checks for and prevents duplicate usernames." + +#: src/pages/admin-overview/AdminOverviewPage.ts:46 +#: src/pages/users/UserListPage.ts:31 +msgid "Users" +msgstr "Users" + +#: src/pages/groups/GroupForm.ts:59 +msgid "Users added to this group will be superusers." +msgstr "Users added to this group will be superusers." + +#: src/pages/events/EventInfo.ts:108 +msgid "Using flow" +msgstr "Using flow" + +#: src/pages/events/EventInfo.ts:198 +msgid "Using source" +msgstr "Using source" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:95 +msgid "Validate SSL Certificates of upstream servers." +msgstr "Validate SSL Certificates of upstream servers." + +#: src/pages/stages/prompt/PromptStageForm.ts:85 +msgid "Validation Policies" +msgstr "Validation Policies" + +#: src/pages/crypto/CertificateGenerateForm.ts:41 +msgid "Validity days" +msgstr "Validity days" + +#: src/pages/providers/saml/SAMLProviderForm.ts:138 +msgid "Verification Certificate" +msgstr "Verification Certificate" + +#: src/pages/admin-overview/AdminOverviewPage.ts:48 +msgid "Version" +msgstr "Version" + +#: src/pages/outposts/OutpostHealth.ts:46 +msgid "Version: {0}" +msgstr "Version: {0}" + +#: src/pages/outposts/OutpostListPage.ts:91 +msgid "View Deployment Info" +msgstr "View Deployment Info" + +#: src/pages/outposts/OutpostListPage.ts:98 +msgid "View deployment documentation" +msgstr "View deployment documentation" + +#: src/pages/flows/FlowForm.ts:98 +msgid "Visible in the URL." +msgstr "Visible in the URL." + +#: src/pages/policies/dummy/DummyPolicyForm.ts:89 +msgid "Wait (max)" +msgstr "Wait (max)" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:82 +msgid "Wait (min)" +msgstr "Wait (min)" + +#: src/pages/events/RuleForm.ts:48 +#: src/pages/system-tasks/SystemTaskListPage.ts:61 +msgid "Warning" +msgstr "Warning" + +#: src/pages/admin-overview/cards/ProviderStatusCard.ts:24 +msgid "Warning: At least one Provider has no application assigned." +msgstr "Warning: At least one Provider has no application assigned." + +#: src/pages/policies/PolicyListPage.ts:71 +msgid "Warning: Policy is not assigned." +msgstr "Warning: Policy is not assigned." + +#: src/pages/providers/ProviderListPage.ts:68 +msgid "Warning: Provider not assigned to any application." +msgstr "Warning: Provider not assigned to any application." + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:107 +msgid "WebAuthn Authenticators" +msgstr "WebAuthn Authenticators" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:74 +msgid "WebAuthn Devices" +msgstr "WebAuthn Devices" + +#: src/pages/events/TransportForm.ts:51 +msgid "Webhook (Slack/Discord)" +msgstr "Webhook (Slack/Discord)" + +#: src/pages/events/TransportForm.ts:48 +msgid "Webhook (generic)" +msgstr "Webhook (generic)" + +#: src/pages/events/TransportForm.ts:90 +msgid "Webhook URL" +msgstr "Webhook URL" + +#: src/pages/stages/identification/IdentificationStageForm.ts:100 +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 "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." + +#: src/pages/stages/email/EmailStageForm.ts:139 +msgid "When enabled, global Email connection settings will be used and connection settings below will be ignored." +msgstr "When enabled, global Email connection settings will be used and connection settings below will be ignored." + +#: src/pages/stages/identification/IdentificationStageForm.ts:91 +msgid "When enabled, user fields are matched regardless of their casing." +msgstr "When enabled, user fields are matched regardless of their casing." + +#: src/pages/providers/saml/SAMLProviderForm.ts:151 +msgid "When selected, incoming assertion's Signatures will be validated against this certificate. To allow unsigned Requests, leave on default." +msgstr "When selected, incoming assertion's Signatures will be validated against this certificate. To allow unsigned Requests, leave on default." + +#: src/pages/policies/dummy/DummyPolicyForm.ts:65 +#: src/pages/policies/dummy/DummyPolicyForm.ts:79 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:65 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:64 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:65 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:65 +#: src/pages/policies/password/PasswordPolicyForm.ts:65 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:64 +msgid "When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged." +msgstr "When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged." + +#: src/flows/FlowExecutor.ts:130 +msgid "Whoops!" +msgstr "Whoops!" + +#: src/pages/sources/saml/SAMLSourceForm.ts:157 +msgid "Windows" +msgstr "Windows" + +#: src/pages/admin-overview/AdminOverviewPage.ts:50 +msgid "Workers" +msgstr "Workers" + +#: src/pages/sources/saml/SAMLSourceForm.ts:160 +msgid "X509 Subject" +msgstr "X509 Subject" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:61 +#: src/pages/policies/PolicyTestForm.ts:38 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:115 +msgid "Yes" +msgstr "Yes" + +#: src/interfaces/Interface.ts:50 +msgid "You're currently impersonating {0}." +msgstr "You're currently impersonating {0}." + +#: src/elements/events/ObjectChangelog.ts:38 +#: src/pages/events/EventListPage.ts:43 +msgid "action" +msgstr "action" + +#: src/pages/users/UserListPage.ts:50 +msgid "active" +msgstr "active" + +#: src/elements/user/UserConsentList.ts:29 +msgid "application" +msgstr "application" + +#: src/pages/stages/password/PasswordStageForm.ts:76 +msgid "authentik Builtin Database" +msgstr "authentik Builtin Database" + +#: src/pages/stages/password/PasswordStageForm.ts:79 +msgid "authentik LDAP Backend" +msgstr "authentik LDAP Backend" + +#: src/elements/events/ObjectChangelog.ts:41 +#: src/pages/events/EventListPage.ts:46 +msgid "client_ip" +msgstr "client_ip" + +#: src/elements/events/ObjectChangelog.ts:40 +#: src/pages/events/EventListPage.ts:45 +msgid "created" +msgstr "created" + +#: src/pages/stages/invitation/InvitationListPage.ts:47 +msgid "created_by" +msgstr "created_by" + +#: src/pages/flows/FlowListPage.ts:48 +msgid "designation" +msgstr "designation" + +#: src/elements/events/ObjectChangelog.ts:39 +#: src/pages/policies/BoundPoliciesList.ts:36 +msgid "enabled" +msgstr "enabled" + +#: src/elements/oauth/UserCodeList.ts:30 +#: src/elements/oauth/UserRefreshList.ts:30 +#: src/elements/user/UserConsentList.ts:30 +#: src/pages/tokens/TokenListPage.ts:47 +msgid "expires" +msgstr "expires" + +#: src/pages/tokens/TokenListPage.ts:46 +msgid "expiring" +msgstr "expiring" + +#: src/pages/stages/prompt/PromptListPage.ts:46 +msgid "field_key" +msgstr "field_key" + +#: src/pages/events/RuleListPage.ts:49 +msgid "group" +msgstr "group" + +#: src/pages/tokens/TokenListPage.ts:44 +#: src/pages/user-settings/tokens/UserTokenList.ts:39 +msgid "identifier" +msgstr "identifier" + +#: src/pages/stages/prompt/PromptListPage.ts:47 +msgid "label" +msgstr "label" + +#: src/pages/users/UserListPage.ts:51 +msgid "last_login" +msgstr "last_login" + +#: src/pages/outposts/ServiceConnectionListPage.ts:54 +msgid "local" +msgstr "local" + +#: src/pages/events/TransportListPage.ts:47 +msgid "mode" +msgstr "mode" + +#: src/pages/applications/ApplicationListPage.ts:57 +#: src/pages/crypto/CertificateKeyPairListPage.ts:51 +#: src/pages/events/RuleListPage.ts:47 +#: src/pages/events/TransportListPage.ts:46 +#: src/pages/flows/FlowListPage.ts:47 +#: src/pages/groups/GroupListPage.ts:45 +#: src/pages/outposts/OutpostListPage.ts:49 +#: src/pages/outposts/ServiceConnectionListPage.ts:52 +#: src/pages/policies/PolicyListPage.ts:56 +#: src/pages/property-mappings/PropertyMappingListPage.ts:54 +#: src/pages/providers/ProviderListPage.ts:52 +#: src/pages/sources/SourcesListPage.ts:51 +#: src/pages/stages/StageListPage.ts:65 +msgid "name" +msgstr "name" + +#: src/elements/Tabs.ts:59 +msgid "no tabs defined" +msgstr "no tabs defined" + +#: src/pages/policies/BoundPoliciesList.ts:37 +#: src/pages/stages/prompt/PromptListPage.ts:49 +msgid "order" +msgstr "order" + +#: src/pages/groups/GroupListPage.ts:46 +msgid "parent" +msgstr "parent" + +#: src/pages/stages/invitation/InvitationListPage.ts:46 +msgid "pk" +msgstr "pk" + +#: src/elements/oauth/UserCodeList.ts:29 +#: src/elements/oauth/UserRefreshList.ts:29 +msgid "provider" +msgstr "provider" + +#: src/elements/oauth/UserCodeList.ts:31 +#: src/elements/oauth/UserRefreshList.ts:31 +msgid "scope" +msgstr "scope" + +#: src/pages/events/RuleListPage.ts:48 +msgid "severity" +msgstr "severity" + +#: src/pages/applications/ApplicationListPage.ts:58 +#: src/pages/flows/FlowListPage.ts:46 +msgid "slug" +msgstr "slug" + +#: src/pages/system-tasks/SystemTaskListPage.ts:48 +msgid "task_name" +msgstr "task_name" + +#: src/pages/policies/BoundPoliciesList.ts:38 +msgid "timeout" +msgstr "timeout" + +#: src/pages/property-mappings/PropertyMappingListPage.ts:55 +#: src/pages/providers/ProviderListPage.ts:54 +#: src/pages/stages/prompt/PromptListPage.ts:48 +msgid "type" +msgstr "type" + +#: src/pages/events/EventListPage.ts:44 +#: src/pages/tokens/TokenListPage.ts:45 +msgid "user" +msgstr "user" + +#: src/pages/users/UserListPage.ts:49 +msgid "username" +msgstr "username" + +#: src/pages/sources/SourcesListPage.ts:52 +msgid "verboseName" +msgstr "verboseName" + +#: src/elements/Expand.ts:28 +#: src/elements/Expand.ts:28 +#: src/elements/Page.ts:11 +#: src/elements/table/TablePage.ts:28 +msgid "{0}" +msgstr "{0}" + +#: src/pages/stages/prompt/PromptStageForm.ts:77 +msgid "{0} ('{1}', Type {2})" +msgstr "{0} ('{1}', Type {2})" + +#: src/pages/stages/prompt/PromptStageForm.ts:97 +msgid "{0} ({1})" +msgstr "{0} ({1})" + +#: src/pages/admin-overview/cards/VersionStatusCard.ts:27 +msgid "{0} is available!" +msgstr "{0} is available!" + +#: src/elements/notifications/NotificationDrawer.ts:102 +msgid "{0} unread" +msgstr "{0} unread" + +#: src/pages/outposts/OutpostHealth.ts:45 +msgid "{0}, should be {1}" +msgstr "{0}, should be {1}" + +#: src/elements/forms/ConfirmationForm.ts:35 +msgid "{0}: {1}" +msgstr "{0}: {1}" + +#: src/elements/Page.ts:13 +#: src/elements/table/TablePage.ts:30 +msgid "{description}" +msgstr "{description}" diff --git a/web/src/locales/pseudo-LOCALE.po b/web/src/locales/pseudo-LOCALE.po new file mode 100644 index 000000000..e213ea808 --- /dev/null +++ b/web/src/locales/pseudo-LOCALE.po @@ -0,0 +1,3618 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2021-04-03 19:38+0200\n" +"Mime-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: pseudo-LOCALE\n" + +#: src/pages/policies/BoundPoliciesList.ts:54 +msgid "-" +msgstr "" + +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:69 +msgid "6 digits, widely compatible" +msgstr "" + +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:72 +msgid "8 digits, not compatible with apps like Google Authenticator" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:82 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:95 +msgid "ACS URL" +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:110 +#: src/pages/flows/FlowForm.ts:109 +#: src/pages/flows/StageBindingForm.ts:138 +msgid "ALL, all policies must match to grant access." +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:107 +#: src/pages/flows/FlowForm.ts:106 +#: src/pages/flows/StageBindingForm.ts:135 +msgid "ANY, any policy must match to grant access." +msgstr "" + +#: src/elements/notifications/APIDrawer.ts:61 +msgid "API Requests" +msgstr "" + +#: src/elements/messages/Middleware.ts:9 +msgid "API request failed" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:97 +msgid "Access Key" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:71 +msgid "Access token URL" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:160 +msgid "Account confirmation" +msgstr "" + +#: src/elements/events/ObjectChangelog.ts:38 +#: src/pages/events/EventListPage.ts:43 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:73 +msgid "Action" +msgstr "" + +#: src/pages/users/UserListPage.ts:50 +#: src/pages/users/UserViewPage.ts:115 +msgid "Active" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:199 +msgid "Addition Group DN" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:193 +msgid "Addition User DN" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:202 +msgid "Additional group DN, prepended to the Base DN." +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:196 +msgid "Additional user DN, prepended to the Base DN." +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:128 +#: src/pages/providers/proxy/ProxyProviderForm.ts:108 +#: src/pages/providers/saml/SAMLProviderForm.ts:117 +#: src/pages/sources/saml/SAMLSourceForm.ts:133 +msgid "Advanced protocol settings" +msgstr "" + +#: src/pages/policies/password/PasswordPolicyForm.ts:114 +#: src/pages/sources/ldap/LDAPSourceForm.ts:137 +msgid "Advanced settings" +msgstr "" + +#: src/pages/events/EventInfo.ts:98 +msgid "Affected model:" +msgstr "" + +#: src/pages/events/RuleForm.ts:45 +msgid "Alert" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:149 +msgid "Algorithm used to sign the JWT Tokens." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:140 +msgid "Allow IDP-initiated logins" +msgstr "" + +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:84 +msgid "Allow up to N occurrences in the HIBP database." +msgstr "" + +#: src/pages/policies/PolicyListPage.ts:41 +msgid "Allow users to use Applications based on properties, enforce Password Criteria and selectively apply Stages." +msgstr "" + +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:80 +msgid "Allowed count" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:143 +msgid "Allows authentication flows initiated by the IdP. This can be a security risk, as no validation of the request ID is done." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:95 +msgid "Also known as Entity ID. Defaults the Metadata URL." +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts:78 +msgid "Always require consent" +msgstr "" + +#: src/pages/events/EventInfo.ts:59 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:93 +msgid "App" +msgstr "" + +#: src/elements/user/UserConsentList.ts:29 +#: src/pages/admin-overview/TopApplicationsTable.ts:42 +#: src/pages/applications/ApplicationListPage.ts:95 +msgid "Application" +msgstr "" + +#: src/pages/applications/ApplicationListPage.ts:68 +msgid "Application Icon" +msgstr "" + +#: src/flows/stages/consent/ConsentStage.ts:50 +msgid "Application requires following permissions" +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:82 +msgid "Application's display Name." +msgstr "" + +#: src/pages/LibraryPage.ts:92 +#: src/pages/LibraryPage.ts:131 +#: src/pages/applications/ApplicationListPage.ts:28 +msgid "Applications" +msgstr "" + +#: src/pages/admin-overview/AdminOverviewPage.ts:39 +msgid "Apps with most usage" +msgstr "" + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:44 +msgid "" +"Are you sure you want to clear the flow cache?\n" +"This will cause all flows to be re-evaluated on their next usage." +msgstr "" + +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:45 +msgid "" +"Are you sure you want to clear the policy cache?\n" +"This will cause all policies to be re-evaluated on their next usage." +msgstr "" + +#: src/elements/forms/DeleteForm.ts:56 +msgid "Are you sure you want to delete {0} '{1}'?" +msgstr "" + +#: src/pages/users/UserActiveForm.ts:43 +msgid "Are you sure you want to update {0} '{1}'?" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:202 +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:191 +msgid "Assertion valid not before" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:195 +msgid "Assertion valid not before current time + this value (Format: hours=-1;minutes=-2;seconds=-3)." +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:198 +msgid "Assertion valid not on or after" +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts:53 +msgid "Assertions is empty" +msgstr "" + +#: src/pages/providers/ProviderListPage.ts:65 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:91 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:82 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:85 +msgid "Assigned to application" +msgstr "" + +#: src/pages/policies/PolicyListPage.ts:68 +msgid "Assigned to {0} objects." +msgstr "" + +#: src/pages/events/EventInfo.ts:120 +msgid "Attempted to log in as {0}" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:63 +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 "" + +#: src/pages/groups/GroupForm.ts:95 +#: src/pages/stages/invitation/InvitationForm.ts:51 +#: src/pages/users/UserForm.ts:76 +msgid "Attributes" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:108 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:103 +msgid "Audience" +msgstr "" + +#: src/pages/flows/FlowForm.ts:55 +msgid "Authentication" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:165 +#: src/pages/sources/saml/SAMLSourceForm.ts:244 +msgid "Authentication flow" +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:63 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:29 +msgid "Authenticator" +msgstr "" + +#: src/pages/flows/FlowForm.ts:58 +msgid "Authorization" +msgstr "" + +#: src/elements/oauth/UserCodeList.ts:44 +msgid "Authorization Code" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:64 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:105 +msgid "Authorization URL" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:62 +#: src/pages/providers/proxy/ProxyProviderForm.ts:60 +#: src/pages/providers/saml/SAMLProviderForm.ts:59 +#: src/pages/providers/saml/SAMLProviderImportForm.ts:44 +msgid "Authorization flow" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:178 +msgid "Authorize URL" +msgstr "" + +#: src/pages/events/EventInfo.ts:104 +msgid "Authorized application:" +msgstr "" + +#: src/pages/stages/password/PasswordStageForm.ts:71 +msgid "Backends" +msgstr "" + +#: src/pages/flows/FlowForm.ts:124 +msgid "Background" +msgstr "" + +#: src/pages/flows/FlowForm.ts:127 +#: src/pages/flows/FlowImportForm.ts:37 +msgid "Background shown during execution." +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:128 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:91 +msgid "Base DN" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:195 +msgid "Based on the Hashed User ID" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:201 +msgid "Based on the User's Email. This is recommended over the UPN method." +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:204 +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 "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:198 +msgid "Based on the username" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:108 +msgid "Basic-Auth" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:116 +msgid "Bind CN" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:122 +msgid "Bind Password" +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:127 +#: src/pages/flows/BoundStagesList.ts:175 +msgid "Bind stage" +msgstr "" + +#: src/pages/events/EventInfo.ts:141 +#: src/pages/events/EventInfo.ts:160 +msgid "Binding" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:98 +msgid "Binding Type" +msgstr "" + +#: src/pages/admin-overview/cards/VersionStatusCard.ts:21 +msgid "Build hash: {0}" +msgstr "" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:88 +msgid "CA which the endpoint's Certificate is verified against. Can be left empty for no validation." +msgstr "" + +#: src/pages/admin-overview/AdminOverviewPage.ts:54 +msgid "Cached Flows" +msgstr "" + +#: src/pages/admin-overview/AdminOverviewPage.ts:52 +msgid "Cached Policies" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:89 +msgid "Callback URL" +msgstr "" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:71 +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 "" + +#: src/elements/forms/ConfirmationForm.ts:73 +#: src/elements/forms/DeleteForm.ts:77 +#: src/elements/forms/ModalForm.ts:69 +#: src/pages/users/UserActiveForm.ts:64 +msgid "Cancel" +msgstr "" + +#: src/pages/stages/identification/IdentificationStageForm.ts:88 +msgid "Case insensitive matching" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairForm.ts:53 +#: src/pages/providers/proxy/ProxyProviderForm.ts:111 +msgid "Certificate" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:98 +msgid "Certificate Fingerprint" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:106 +msgid "Certificate Subjet" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:79 +msgid "Certificate-Key Pair" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:30 +msgid "Certificate-Key Pairs" +msgstr "" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:105 +msgid "Certificate/Key used for authentication. Can be left empty for no authentication." +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsPassword.ts:22 +msgid "Change password" +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsPassword.ts:17 +msgid "Change your password" +msgstr "" + +#: src/pages/applications/ApplicationViewPage.ts:98 +#: src/pages/flows/FlowViewPage.ts:113 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:146 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:145 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:140 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:124 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:142 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:129 +#: src/pages/users/UserViewPage.ts:176 +msgid "Changelog" +msgstr "" + +#: src/pages/policies/password/PasswordPolicyForm.ts:122 +msgid "Characters which are considered as symbols." +msgstr "" + +#: src/pages/policies/reputation/ReputationPolicyForm.ts:75 +msgid "Check IP" +msgstr "" + +#: src/pages/policies/reputation/ReputationPolicyForm.ts:83 +msgid "Check Username" +msgstr "" + +#: src/flows/stages/email/EmailStage.ts:38 +msgid "Check your Emails for a password reset link." +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:59 +msgid "Checkbox" +msgstr "" + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:41 +msgid "Clear Flow cache" +msgstr "" + +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:42 +msgid "Clear Policy cache" +msgstr "" + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:36 +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:37 +msgid "Clear cache" +msgstr "" + +#: src/pages/outposts/OutpostListPage.ts:112 +msgid "Click to copy token" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:107 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:109 +msgid "Client ID" +msgstr "" + +#: src/elements/events/ObjectChangelog.ts:41 +#: src/pages/events/EventListPage.ts:46 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:87 +msgid "Client IP" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:114 +msgid "Client Secret" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:85 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:101 +msgid "Client type" +msgstr "" + +#: src/pages/outposts/OutpostListPage.ts:126 +msgid "Close" +msgstr "" + +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:72 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:49 +msgid "Code" +msgstr "" + +#: src/pages/crypto/CertificateGenerateForm.ts:29 +msgid "Common Name" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:98 +msgid "Confidential" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:104 +msgid "Confidential clients are capable of maintaining the confidentiality of their credentials. Public clients are incapable." +msgstr "" + +#: src/pages/outposts/OutpostForm.ts:104 +msgid "Configuration" +msgstr "" + +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:71 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:77 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:115 +#: src/pages/stages/password/PasswordStageForm.ts:86 +msgid "Configuration flow" +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:103 +msgid "Configure WebAuthn" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:187 +msgid "Configure how the NameID value will be created. When left empty, the NameIDPolicy of the incoming request will be respected." +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:233 +msgid "Configure how the issuer field of the ID Token should be filled." +msgstr "" + +#: src/pages/user-settings/UserSettingsPage.ts:73 +msgid "Configure settings relevant to your user profile." +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:208 +msgid "Configure what data should be used as unique User Identifier. For most cases, the default should be fine." +msgstr "" + +#: src/pages/user-settings/settings/SourceSettingsOAuth.ts:47 +msgid "Connect" +msgstr "" + +#: src/pages/user-settings/settings/SourceSettingsOAuth.ts:34 +msgid "Connected." +msgstr "" + +#: src/elements/messages/MessageContainer.ts:62 +msgid "Connection error, reconnecting..." +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:98 +#: src/pages/stages/email/EmailStageForm.ts:57 +msgid "Connection settings" +msgstr "" + +#: src/elements/user/UserConsentList.ts:42 +msgid "Consent" +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts:90 +msgid "Consent expires in" +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts:84 +msgid "Consent expires." +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts:81 +msgid "Consent given last indefinitely" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:216 +msgid "Consider Objects matching this filter to be Groups." +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:209 +msgid "Consider Objects matching this filter to be Users." +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:123 +msgid "Consumer key" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:129 +msgid "Consumer secret" +msgstr "" + +#: src/pages/events/EventInfo.ts:79 +#: src/pages/events/EventInfo.ts:148 +#: src/pages/events/EventInfo.ts:167 +#: src/pages/policies/PolicyTestForm.ts:74 +#: src/pages/property-mappings/PropertyMappingTestForm.ts:63 +msgid "Context" +msgstr "" + +#: src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts:74 +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:90 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:68 +#: src/flows/stages/autosubmit/AutosubmitStage.ts:48 +#: src/flows/stages/consent/ConsentStage.ts:60 +#: src/flows/stages/dummy/DummyStage.ts:39 +#: src/flows/stages/password/PasswordStage.ts:71 +#: src/flows/stages/prompt/PromptStage.ts:130 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:91 +msgid "Continue" +msgstr "" + +#: src/pages/stages/invitation/InvitationStageForm.ts:66 +msgid "Continue flow without invitation" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingListPage.ts:38 +msgid "Control how authentik exposes and interprets information." +msgstr "" + +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:68 +msgid "Copy" +msgstr "" + +#: src/pages/tokens/TokenListPage.ts:72 +#: src/pages/user-settings/tokens/UserTokenList.ts:129 +msgid "Copy Key" +msgstr "" + +#: src/pages/applications/ApplicationListPage.ts:111 +#: src/pages/applications/ApplicationListPage.ts:119 +#: src/pages/crypto/CertificateKeyPairListPage.ts:122 +#: src/pages/crypto/CertificateKeyPairListPage.ts:130 +#: src/pages/events/RuleListPage.ts:91 +#: src/pages/events/RuleListPage.ts:99 +#: src/pages/events/TransportListPage.ts:95 +#: src/pages/events/TransportListPage.ts:103 +#: src/pages/flows/BoundStagesList.ts:119 +#: src/pages/flows/BoundStagesList.ts:146 +#: src/pages/flows/BoundStagesList.ts:167 +#: src/pages/flows/FlowListPage.ts:109 +#: src/pages/flows/FlowListPage.ts:117 +#: src/pages/groups/GroupListPage.ts:91 +#: src/pages/groups/GroupListPage.ts:99 +#: src/pages/outposts/OutpostListPage.ts:136 +#: src/pages/outposts/OutpostListPage.ts:144 +#: src/pages/outposts/ServiceConnectionListPage.ts:109 +#: src/pages/outposts/ServiceConnectionListPage.ts:118 +#: src/pages/policies/BoundPoliciesList.ts:157 +#: src/pages/policies/BoundPoliciesList.ts:184 +#: src/pages/policies/BoundPoliciesList.ts:205 +#: src/pages/policies/PolicyListPage.ts:124 +#: src/pages/policies/PolicyListPage.ts:133 +#: src/pages/property-mappings/PropertyMappingListPage.ts:113 +#: src/pages/property-mappings/PropertyMappingListPage.ts:122 +#: src/pages/providers/ProviderListPage.ts:107 +#: src/pages/providers/ProviderListPage.ts:116 +#: src/pages/providers/RelatedApplicationButton.ts:27 +#: src/pages/providers/RelatedApplicationButton.ts:35 +#: src/pages/sources/SourcesListPage.ts:100 +#: src/pages/sources/SourcesListPage.ts:109 +#: src/pages/stages/StageListPage.ts:119 +#: src/pages/stages/StageListPage.ts:128 +#: src/pages/stages/invitation/InvitationListPage.ts:77 +#: src/pages/stages/invitation/InvitationListPage.ts:85 +#: src/pages/stages/prompt/PromptListPage.ts:96 +#: src/pages/stages/prompt/PromptListPage.ts:104 +#: src/pages/user-settings/tokens/UserTokenList.ts:50 +#: src/pages/user-settings/tokens/UserTokenList.ts:58 +#: src/pages/users/UserListPage.ts:143 +#: src/pages/users/UserListPage.ts:151 +msgid "Create" +msgstr "" + +#: src/pages/applications/ApplicationListPage.ts:114 +#: src/pages/providers/RelatedApplicationButton.ts:30 +msgid "Create Application" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:160 +#: src/pages/policies/BoundPoliciesList.ts:165 +#: src/pages/policies/BoundPoliciesList.ts:208 +#: src/pages/policies/BoundPoliciesList.ts:213 +msgid "Create Binding" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:125 +msgid "Create Certificate-Key Pair" +msgstr "" + +#: src/pages/flows/FlowListPage.ts:112 +msgid "Create Flow" +msgstr "" + +#: src/pages/groups/GroupListPage.ts:94 +msgid "Create Group" +msgstr "" + +#: src/pages/stages/invitation/InvitationListPage.ts:80 +msgid "Create Invitation" +msgstr "" + +#: src/pages/stages/invitation/InvitationListPage.ts:31 +msgid "Create Invitation Links to enroll Users, and optionally force specific attributes of their account." +msgstr "" + +#: src/pages/events/RuleListPage.ts:94 +msgid "Create Notification Rule" +msgstr "" + +#: src/pages/events/TransportListPage.ts:98 +msgid "Create Notification Transport" +msgstr "" + +#: src/pages/outposts/OutpostListPage.ts:139 +msgid "Create Outpost" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:175 +msgid "Create Policy" +msgstr "" + +#: src/pages/stages/prompt/PromptListPage.ts:99 +msgid "Create Prompt" +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:137 +msgid "Create Stage" +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:122 +#: src/pages/flows/BoundStagesList.ts:170 +msgid "Create Stage binding" +msgstr "" + +#: src/pages/user-settings/tokens/UserTokenList.ts:53 +msgid "Create Token" +msgstr "" + +#: src/pages/users/UserListPage.ts:146 +msgid "Create User" +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:149 +#: src/pages/outposts/ServiceConnectionListPage.ts:121 +#: src/pages/policies/BoundPoliciesList.ts:187 +#: src/pages/policies/PolicyListPage.ts:136 +#: src/pages/property-mappings/PropertyMappingListPage.ts:125 +#: src/pages/providers/ProviderListPage.ts:119 +#: src/pages/sources/SourcesListPage.ts:112 +#: src/pages/stages/StageListPage.ts:131 +msgid "Create {0}" +msgstr "" + +#: src/pages/stages/invitation/InvitationListPage.ts:47 +msgid "Created by" +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:86 +msgid "Created {0}" +msgstr "" + +#: src/elements/events/ObjectChangelog.ts:40 +#: src/pages/events/EventListPage.ts:45 +msgid "Creation Date" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:249 +#: src/pages/sources/saml/SAMLSourceForm.ts:211 +msgid "DSA-SHA1" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:62 +msgid "Date" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:65 +msgid "Date Time" +msgstr "" + +#: src/pages/flows/FlowForm.ts:121 +msgid "Decides what this Flow is used for. For example, the Authentication flow is redirect to when an un-authenticated user visits authentik." +msgstr "" + +#: src/pages/events/TransportListPage.ts:31 +msgid "Define how notifications are sent to users, like Email or Webhook." +msgstr "" + +#: src/elements/forms/DeleteForm.ts:70 +#: src/pages/applications/ApplicationListPage.ts:102 +#: src/pages/crypto/CertificateKeyPairListPage.ts:86 +#: src/pages/events/RuleListPage.ts:82 +#: src/pages/events/TransportListPage.ts:86 +#: src/pages/flows/FlowListPage.ts:86 +#: src/pages/groups/GroupListPage.ts:82 +#: src/pages/outposts/OutpostListPage.ts:86 +#: src/pages/outposts/ServiceConnectionListPage.ts:100 +#: src/pages/policies/PolicyListPage.ts:115 +#: src/pages/property-mappings/PropertyMappingListPage.ts:104 +#: src/pages/providers/ProviderListPage.ts:98 +#: src/pages/sources/SourcesListPage.ts:91 +#: src/pages/stages/StageListPage.ts:110 +#: src/pages/stages/invitation/InvitationListPage.ts:68 +#: src/pages/stages/prompt/PromptListPage.ts:87 +#: src/pages/tokens/TokenListPage.ts:68 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:36 +#: src/pages/user-settings/tokens/UserTokenList.ts:125 +#: src/pages/users/UserListPage.ts:114 +msgid "Delete" +msgstr "" + +#: src/elements/oauth/UserCodeList.ts:51 +msgid "Delete Authorization Code" +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:91 +#: src/pages/policies/BoundPoliciesList.ts:144 +msgid "Delete Binding" +msgstr "" + +#: src/elements/user/UserConsentList.ts:49 +msgid "Delete Consent" +msgstr "" + +#: src/elements/oauth/UserRefreshList.ts:51 +msgid "Delete Refresh Code" +msgstr "" + +#: src/pages/user-settings/UserDetailsPage.ts:85 +msgid "Delete account" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:168 +msgid "Delete temporary users after" +msgstr "" + +#: src/elements/forms/DeleteForm.ts:45 +msgid "Delete {0}" +msgstr "" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:88 +msgid "Deny the user access" +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:126 +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:65 +#: src/pages/user-settings/tokens/UserTokenForm.ts:50 +msgid "Description" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:69 +msgid "Description shown to the user when consenting. If left empty, the user won't be informed." +msgstr "" + +#: src/pages/users/UserForm.ts:73 +msgid "Designates whether this user should be treated as active. Unselect this instead of deleting accounts." +msgstr "" + +#: src/pages/flows/FlowForm.ts:114 +#: src/pages/flows/FlowListPage.ts:48 +msgid "Designation" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:105 +msgid "Determines how authentik sends the response back to the Service Provider." +msgstr "" + +#: src/pages/stages/user_login/UserLoginStageForm.ts:67 +msgid "Determines how long a session lasts. Default of 0 seconds means that the sessions lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)." +msgstr "" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:110 +msgid "Device classes which can be used to authenticate." +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:59 +msgid "Device name" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:213 +#: src/pages/sources/saml/SAMLSourceForm.ts:175 +msgid "Digest algorithm" +msgstr "" + +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:64 +msgid "Digits" +msgstr "" + +#: src/pages/users/UserListPage.ts:80 +#: src/pages/users/UserListPage.ts:99 +msgid "Disable" +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts:51 +msgid "Disable Static Tokens" +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts:36 +msgid "Disable Time-based OTP" +msgstr "" + +#: src/pages/sources/SourcesListPage.ts:60 +msgid "Disabled" +msgstr "" + +#: src/pages/user-settings/settings/SourceSettingsOAuth.ts:41 +msgid "Disconnect" +msgstr "" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:67 +msgid "Docker URL" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderViewPage.ts:166 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:153 +msgid "Download" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:226 +msgid "Each provider has a different issuer, based on the application slug." +msgstr "" + +#: src/pages/applications/ApplicationListPage.ts:90 +#: src/pages/crypto/CertificateKeyPairListPage.ts:74 +#: src/pages/events/RuleListPage.ts:70 +#: src/pages/events/TransportListPage.ts:74 +#: src/pages/flows/FlowListPage.ts:74 +#: src/pages/groups/GroupListPage.ts:70 +#: src/pages/outposts/OutpostListPage.ts:74 +#: src/pages/outposts/ServiceConnectionListPage.ts:88 +#: src/pages/policies/BoundPoliciesList.ts:76 +#: src/pages/policies/BoundPoliciesList.ts:106 +#: src/pages/policies/PolicyListPage.ts:90 +#: src/pages/property-mappings/PropertyMappingListPage.ts:79 +#: src/pages/providers/ProviderListPage.ts:86 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:138 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:137 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:132 +#: src/pages/sources/SourcesListPage.ts:79 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:116 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:134 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:121 +#: src/pages/stages/StageListPage.ts:98 +#: src/pages/stages/prompt/PromptListPage.ts:75 +#: src/pages/user-settings/tokens/UserTokenList.ts:113 +#: src/pages/users/UserListPage.ts:75 +#: src/pages/users/UserViewPage.ts:146 +msgid "Edit" +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:79 +#: src/pages/policies/BoundPoliciesList.ts:132 +msgid "Edit Binding" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:91 +msgid "Edit Group" +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:66 +msgid "Edit Stage" +msgstr "" + +#: src/pages/LibraryPage.ts:113 +msgid "Either no applications are defined, or you don't have access to any." +msgstr "" + +#: src/pages/events/TransportForm.ts:45 +#: src/pages/stages/identification/IdentificationStageForm.ts:78 +#: src/pages/users/UserForm.ts:60 +#: src/pages/users/UserViewPage.ts:99 +msgid "Email" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:154 +#: src/pages/user-settings/UserDetailsPage.ts:73 +msgid "Email address" +msgstr "" + +#: src/flows/stages/identification/IdentificationStage.ts:151 +msgid "Email or Username" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:50 +msgid "Email: Text field with Email type." +msgstr "" + +#: src/pages/users/UserListPage.ts:80 +#: src/pages/users/UserListPage.ts:99 +msgid "Enable" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:111 +msgid "Enable StartTLS" +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts:67 +msgid "Enable Static Tokens" +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts:52 +msgid "Enable Time-based OTP" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:36 +#: src/pages/policies/PolicyBindingForm.ts:130 +#: src/pages/sources/ldap/LDAPSourceForm.ts:68 +#: src/pages/sources/oauth/OAuthSourceForm.ts:112 +#: src/pages/sources/saml/SAMLSourceForm.ts:68 +msgid "Enabled" +msgstr "" + +#: src/pages/flows/FlowForm.ts:61 +msgid "Enrollment" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:186 +#: src/pages/sources/saml/SAMLSourceForm.ts:265 +#: src/pages/stages/identification/IdentificationStageForm.ts:103 +msgid "Enrollment flow" +msgstr "" + +#: src/pages/system-tasks/SystemTaskListPage.ts:63 +msgid "Error" +msgstr "" + +#: src/flows/stages/authenticator_webauthn/WebAuthnAuthenticatorRegisterStage.ts:57 +msgid "Error creating credential: {err}" +msgstr "" + +#: src/pages/policies/password/PasswordPolicyForm.ts:105 +msgid "Error message" +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts:57 +msgid "Error when creating credential: {err}" +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts:69 +msgid "Error when validating assertion on server: {err}" +msgstr "" + +#: src/pages/user-settings/UserSettingsPage.ts:61 +msgid "Error: unsupported source settings: {0}" +msgstr "" + +#: src/pages/user-settings/UserSettingsPage.ts:52 +msgid "Error: unsupported stage settings: {0}" +msgstr "" + +#: src/pages/flows/StageBindingForm.ts:109 +msgid "Evaluate on plan" +msgstr "" + +#: src/pages/flows/StageBindingForm.ts:112 +msgid "Evaluate policies during the Flow planning process. Disable this for input-based policies." +msgstr "" + +#: src/pages/flows/StageBindingForm.ts:121 +msgid "Evaluate policies when the Stage is present to the user." +msgstr "" + +#: src/pages/events/EventInfoPage.ts:37 +msgid "Event {0}" +msgstr "" + +#: src/pages/events/EventInfo.ts:129 +#: src/pages/events/EventInfo.ts:152 +msgid "Exception" +msgstr "" + +#: src/pages/flows/FlowListPage.ts:98 +#: src/pages/flows/FlowViewPage.ts:86 +msgid "Execute" +msgstr "" + +#: src/pages/flows/FlowViewPage.ts:73 +msgid "Execute flow" +msgstr "" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:62 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:62 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:61 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:62 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:62 +#: src/pages/policies/password/PasswordPolicyForm.ts:62 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:61 +msgid "Execution logging" +msgstr "" + +#: src/elements/oauth/UserCodeList.ts:30 +#: src/elements/oauth/UserRefreshList.ts:30 +#: src/elements/user/UserConsentList.ts:30 +#: src/pages/stages/invitation/InvitationForm.ts:45 +msgid "Expires" +msgstr "" + +#: src/pages/tokens/TokenListPage.ts:46 +msgid "Expires?" +msgstr "" + +#: src/pages/user-settings/tokens/UserTokenList.ts:80 +#: src/pages/user-settings/tokens/UserTokenList.ts:88 +msgid "Expiring" +msgstr "" + +#: src/pages/tokens/TokenListPage.ts:47 +msgid "Expiry date" +msgstr "" + +#: src/pages/users/UserViewPage.ts:187 +msgid "Explicit Consent" +msgstr "" + +#: src/pages/flows/FlowListPage.ts:101 +msgid "Export" +msgstr "" + +#: src/pages/events/EventInfo.ts:133 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:73 +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:65 +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:75 +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:72 +msgid "Expression" +msgstr "" + +#: src/pages/applications/ApplicationListPage.ts:31 +msgid "External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML." +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:100 +msgid "External Host" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:98 +msgid "External host" +msgstr "" + +#: src/pages/stages/password/PasswordStageForm.ts:108 +msgid "Failed attempts before cancel" +msgstr "" + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:35 +msgid "Failed to delete flow cache" +msgstr "" + +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:36 +msgid "Failed to delete policy cache" +msgstr "" + +#: src/elements/forms/DeleteForm.ts:36 +msgid "Failed to delete {0}: {1}" +msgstr "" + +#: src/pages/users/UserActiveForm.ts:23 +msgid "Failed to update {0}: {1}" +msgstr "" + +#: src/pages/stages/prompt/PromptListPage.ts:46 +msgid "Field" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:82 +msgid "Field Key" +msgstr "" + +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:77 +#: src/pages/policies/password/PasswordPolicyForm.ts:77 +msgid "Field key to check, field keys defined in Prompt stages are available." +msgstr "" + +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:62 +msgid "Field of the user object this value is written to." +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:230 +msgid "Field which contains a unique Identifier." +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:223 +msgid "Field which contains members of a group." +msgstr "" + +#: src/pages/stages/prompt/PromptStageForm.ts:64 +msgid "Fields" +msgstr "" + +#: src/pages/stages/identification/IdentificationStageForm.ts:81 +msgid "Fields a user can identify themselves with." +msgstr "" + +#: src/pages/flows/FlowImportForm.ts:34 +#: src/pages/flows/FlowListPage.ts:79 +msgid "Flow" +msgstr "" + +#: src/pages/flows/FlowViewPage.ts:57 +msgid "Flow Overview" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:161 +#: src/pages/sources/saml/SAMLSourceForm.ts:219 +msgid "Flow settings" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:183 +#: src/pages/sources/saml/SAMLSourceForm.ts:262 +msgid "Flow to use when authenticating existing users." +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:204 +#: src/pages/sources/saml/SAMLSourceForm.ts:283 +msgid "Flow to use when enrolling new users." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:241 +msgid "Flow used before authentication." +msgstr "" + +#: src/pages/stages/password/PasswordStageForm.ts:105 +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_static/AuthenticatorStaticStageForm.ts:89 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:95 +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/oauth2/OAuth2ProviderForm.ts:76 +#: src/pages/providers/proxy/ProxyProviderForm.ts:74 +#: src/pages/providers/saml/SAMLProviderForm.ts:73 +#: src/pages/providers/saml/SAMLProviderImportForm.ts:57 +msgid "Flow used when authorizing this provider." +msgstr "" + +#: src/pages/flows/FlowListPage.ts:28 +msgid "Flows" +msgstr "" + +#: src/pages/flows/FlowListPage.ts:31 +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/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:85 +msgid "Force the user to configure an authenticator" +msgstr "" + +#: src/flows/stages/password/PasswordStage.ts:67 +msgid "Forgot password?" +msgstr "" + +#: src/flows/stages/identification/IdentificationStage.ts:125 +msgid "Forgot username or password?" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:67 +msgid "Friendly Name" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:107 +msgid "From address" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:135 +#: src/pages/crypto/CertificateKeyPairListPage.ts:143 +msgid "Generate" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:138 +msgid "Generate Certificate-Key Pair" +msgstr "" + +#: src/elements/table/TablePagination.ts:51 +msgid "Go to next page" +msgstr "" + +#: src/elements/table/TablePagination.ts:41 +msgid "Go to previous page" +msgstr "" + +#: src/pages/events/RuleForm.ts:65 +#: src/pages/groups/GroupListPage.ts:75 +#: src/pages/policies/PolicyBindingForm.ts:96 +#: src/pages/stages/StageListPage.ts:103 +msgid "Group" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:167 +msgid "Group Property Mappings" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:219 +msgid "Group membership field" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:212 +msgid "Group object filter" +msgstr "" + +#: src/pages/groups/GroupListPage.ts:30 +msgid "Group users together and give them permissions based on the membership." +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:48 +msgid "Group {0}" +msgstr "" + +#: src/pages/groups/GroupListPage.ts:27 +msgid "Groups" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:146 +msgid "HS256 (Symmetric Encryption)" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:149 +msgid "HTTP-Basic Password Key" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:143 +msgid "HTTP-Basic Username Key" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:71 +msgid "Hidden: Hidden field, can be used to insert data into form." +msgstr "" + +#: src/pages/property-mappings/PropertyMappingListPage.ts:153 +msgid "Hide managed mappings" +msgstr "" + +#: src/pages/events/RuleForm.ts:93 +#: src/pages/groups/GroupForm.ts:92 +#: src/pages/outposts/OutpostForm.ts:96 +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:169 +#: src/pages/providers/saml/SAMLProviderForm.ts:171 +#: src/pages/sources/ldap/LDAPSourceForm.ts:164 +#: src/pages/sources/ldap/LDAPSourceForm.ts:190 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:111 +#: src/pages/stages/identification/IdentificationStageForm.ts:82 +#: src/pages/stages/password/PasswordStageForm.ts:83 +#: src/pages/stages/prompt/PromptStageForm.ts:82 +#: src/pages/stages/prompt/PromptStageForm.ts:103 +msgid "Hold control/command to select multiple items." +msgstr "" + +#: src/pages/stages/password/PasswordStageForm.ts:112 +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 "" + +#: src/pages/stages/invitation/InvitationListPage.ts:46 +msgid "ID" +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:121 +msgid "Icon" +msgstr "" + +#: src/pages/flows/FlowListPage.ts:46 +#: src/pages/system-tasks/SystemTaskListPage.ts:48 +#: src/pages/tokens/TokenListPage.ts:44 +#: src/pages/user-settings/tokens/UserTokenForm.ts:44 +#: src/pages/user-settings/tokens/UserTokenList.ts:39 +msgid "Identifier" +msgstr "" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:64 +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:65 +msgid "If enabled, use the local connection. Required Docker socket/Kubernetes Integration." +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:118 +msgid "If left empty, authentik will try to extract the launch URL based on the selected provider." +msgstr "" + +#: src/pages/stages/invitation/InvitationStageForm.ts:69 +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/outposts/OutpostListPage.ts:116 +msgid "If your authentik Instance is using a self-signed certificate, set this value." +msgstr "" + +#: src/pages/users/UserListPage.ts:135 +msgid "Impersonate" +msgstr "" + +#: src/pages/flows/FlowListPage.ts:122 +#: src/pages/flows/FlowListPage.ts:130 +msgid "Import" +msgstr "" + +#: src/pages/flows/FlowListPage.ts:125 +msgid "Import Flow" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:33 +msgid "Import certificates of external providers or create certificates to sign requests with." +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:87 +msgid "In case you can't access any other method." +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:218 +msgid "Include User claims from scopes in the id_token, for applications that don't access the userinfo endpoint." +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:215 +msgid "Include claims in id_token" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:92 +msgid "Internal Host" +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:89 +msgid "Internal application name, used in URLs." +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:83 +msgid "Internal host" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:92 +msgid "Internal host SSL Validation" +msgstr "" + +#: src/pages/flows/FlowForm.ts:64 +msgid "Invalidation" +msgstr "" + +#: src/pages/stages/invitation/InvitationListPage.ts:28 +msgid "Invitations" +msgstr "" + +#: src/pages/users/UserForm.ts:70 +msgid "Is active" +msgstr "" + +#: src/pages/groups/GroupForm.ts:56 +msgid "Is superuser" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:88 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:111 +#: src/pages/sources/saml/SAMLSourceForm.ts:92 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:100 +msgid "Issuer" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:221 +msgid "Issuer mode" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:138 +msgid "JWT Algorithm" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:187 +msgid "Key used to sign the tokens. Only required when JWT Algorithm is set to RS256." +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:135 +msgid "Keypair used to sign outgoing Responses going to the Service Provider." +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:154 +#: src/pages/sources/saml/SAMLSourceForm.ts:127 +msgid "Keypair which is used to sign outgoing requests. Leave empty to disable signing." +msgstr "" + +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:68 +msgid "Kubeconfig" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:44 +msgid "LDAP Source {0}" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:89 +#: src/pages/stages/prompt/PromptListPage.ts:47 +msgid "Label" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:93 +msgid "Label shown next to/above the prompt." +msgstr "" + +#: src/pages/users/UserListPage.ts:51 +#: src/pages/users/UserViewPage.ts:107 +msgid "Last login" +msgstr "" + +#: src/pages/outposts/OutpostHealth.ts:40 +msgid "Last seen: {0}" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:150 +msgid "Last sync: {0}" +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:115 +msgid "Launch URL" +msgstr "" + +#: src/elements/table/Table.ts:113 +#: src/flows/FlowExecutor.ts:154 +#: src/flows/FlowExecutor.ts:200 +#: src/flows/access_denied/FlowAccessDenied.ts:27 +#: src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts:43 +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:33 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:137 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:35 +#: src/flows/stages/autosubmit/AutosubmitStage.ts:30 +#: src/flows/stages/captcha/CaptchaStage.ts:62 +#: src/flows/stages/consent/ConsentStage.ts:28 +#: src/flows/stages/dummy/DummyStage.ts:27 +#: src/flows/stages/email/EmailStage.ts:26 +#: src/flows/stages/identification/IdentificationStage.ts:134 +#: src/flows/stages/password/PasswordStage.ts:31 +#: src/flows/stages/prompt/PromptStage.ts:108 +#: src/pages/applications/ApplicationViewPage.ts:53 +#: src/pages/user-settings/UserDetailsPage.ts:37 +#: src/utils.ts:40 +msgid "Loading" +msgstr "" + +#: src/elements/Spinner.ts:29 +#: src/pages/applications/ApplicationViewPage.ts:47 +msgid "Loading..." +msgstr "" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:61 +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:62 +#: src/pages/outposts/ServiceConnectionListPage.ts:54 +msgid "Local" +msgstr "" + +#: src/flows/stages/identification/IdentificationStage.ts:146 +msgid "Login to continue to {0}." +msgstr "" + +#: src/pages/admin-overview/TopApplicationsTable.ts:43 +msgid "Logins" +msgstr "" + +#: src/pages/admin-overview/AdminOverviewPage.ts:36 +#: src/pages/applications/ApplicationViewPage.ts:69 +msgid "Logins over the last 24 hours" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:196 +msgid "Logout URL" +msgstr "" + +#: src/pages/system-tasks/SystemTaskListPage.ts:27 +msgid "Long-running operations which authentik executes in the background." +msgstr "" + +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:84 +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:104 +msgid "Match events created by selected application. When left empty, all applications are matched." +msgstr "" + +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:90 +msgid "Matches Event's Client IP (strict matching, for network matching use an Expression Policy." +msgstr "" + +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:72 +msgid "Maximum age (in days)" +msgstr "" + +#: src/pages/groups/GroupForm.ts:76 +msgid "Members" +msgstr "" + +#: src/pages/events/EventInfo.ts:174 +#: src/pages/policies/PolicyTestForm.ts:43 +msgid "Messages" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:157 +#: src/pages/providers/saml/SAMLProviderImportForm.ts:61 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:152 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:140 +msgid "Metadata" +msgstr "" + +#: src/pages/policies/password/PasswordPolicyForm.ts:93 +msgid "Minimum amount of Lowercase Characters" +msgstr "" + +#: src/pages/policies/password/PasswordPolicyForm.ts:99 +msgid "Minimum amount of Symbols Characters" +msgstr "" + +#: src/pages/policies/password/PasswordPolicyForm.ts:87 +msgid "Minimum amount of Uppercase Characters" +msgstr "" + +#: src/pages/policies/password/PasswordPolicyForm.ts:81 +msgid "Minimum length" +msgstr "" + +#: src/pages/events/TransportForm.ts:78 +#: src/pages/events/TransportListPage.ts:47 +#: src/pages/stages/consent/ConsentStageForm.ts:65 +msgid "Mode" +msgstr "" + +#: src/pages/events/EventInfo.ts:67 +msgid "Model Name" +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:78 +#: src/pages/applications/ApplicationListPage.ts:57 +#: src/pages/crypto/CertificateKeyPairForm.ts:46 +#: src/pages/crypto/CertificateKeyPairListPage.ts:51 +#: src/pages/events/EventInfo.ts:51 +#: src/pages/events/RuleForm.ts:59 +#: src/pages/events/RuleListPage.ts:47 +#: src/pages/events/TransportForm.ts:72 +#: src/pages/events/TransportListPage.ts:46 +#: src/pages/flows/FlowForm.ts:81 +#: src/pages/flows/FlowForm.ts:94 +#: src/pages/flows/FlowListPage.ts:47 +#: src/pages/groups/GroupForm.ts:47 +#: src/pages/groups/GroupListPage.ts:45 +#: src/pages/outposts/OutpostForm.ts:47 +#: src/pages/outposts/OutpostListPage.ts:49 +#: src/pages/outposts/ServiceConnectionDockerForm.ts:52 +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:53 +#: src/pages/outposts/ServiceConnectionListPage.ts:52 +#: src/pages/policies/PolicyListPage.ts:56 +#: src/pages/policies/dummy/DummyPolicyForm.ts:53 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:53 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:52 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:53 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:53 +#: src/pages/policies/password/PasswordPolicyForm.ts:53 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:52 +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:52 +#: src/pages/property-mappings/PropertyMappingListPage.ts:54 +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:52 +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:52 +#: src/pages/providers/ProviderListPage.ts:52 +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:56 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:83 +#: src/pages/providers/proxy/ProxyProviderForm.ts:54 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:74 +#: src/pages/providers/saml/SAMLProviderForm.ts:53 +#: src/pages/providers/saml/SAMLProviderImportForm.ts:38 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:77 +#: src/pages/sources/SourcesListPage.ts:51 +#: src/pages/sources/ldap/LDAPSourceForm.ts:53 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:75 +#: src/pages/sources/oauth/OAuthSourceForm.ts:97 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:73 +#: src/pages/sources/saml/SAMLSourceForm.ts:53 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:76 +#: src/pages/stages/StageListPage.ts:65 +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:54 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:53 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:61 +#: src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts:51 +#: src/pages/stages/captcha/CaptchaStageForm.ts:52 +#: src/pages/stages/consent/ConsentStageForm.ts:54 +#: src/pages/stages/deny/DenyStageForm.ts:51 +#: src/pages/stages/dummy/DummyStageForm.ts:51 +#: src/pages/stages/email/EmailStageForm.ts:119 +#: src/pages/stages/identification/IdentificationStageForm.ts:59 +#: src/pages/stages/invitation/InvitationStageForm.ts:52 +#: src/pages/stages/password/PasswordStageForm.ts:60 +#: src/pages/stages/prompt/PromptStageForm.ts:53 +#: src/pages/stages/user_delete/UserDeleteStageForm.ts:51 +#: src/pages/stages/user_login/UserLoginStageForm.ts:52 +#: src/pages/stages/user_logout/UserLogoutStageForm.ts:51 +#: src/pages/stages/user_write/UserWriteStageForm.ts:51 +#: src/pages/user-settings/UserDetailsPage.ts:65 +#: src/pages/users/UserForm.ts:53 +#: src/pages/users/UserListPage.ts:49 +#: src/pages/users/UserViewPage.ts:91 +msgid "Name" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:86 +msgid "Name of the form field, also used to store the value." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:146 +msgid "NameID Policy" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:174 +msgid "NameID Property Mapping" +msgstr "" + +#: src/flows/stages/identification/IdentificationStage.ts:119 +#: src/flows/stages/identification/IdentificationStage.ts:124 +msgid "Need an account?" +msgstr "" + +#: src/pages/events/EventInfo.ts:189 +msgid "New version available!" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:61 +#: src/pages/policies/PolicyTestForm.ts:38 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:118 +msgid "No" +msgstr "" + +#: src/pages/LibraryPage.ts:111 +msgid "No Applications available." +msgstr "" + +#: src/elements/events/ObjectChangelog.ts:68 +msgid "No Events found." +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:150 +msgid "No Policies bound." +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:112 +msgid "No Stages bound" +msgstr "" + +#: src/pages/events/EventInfo.ts:206 +msgid "No additional data available." +msgstr "" + +#: src/elements/table/Table.ts:124 +msgid "No elements found." +msgstr "" + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:23 +msgid "No flows cached." +msgstr "" + +#: src/elements/events/ObjectChangelog.ts:70 +msgid "No matching events could be found." +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:152 +msgid "No policies are currently bound to this object." +msgstr "" + +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:24 +msgid "No policies cached. Users may experience slow response times." +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:114 +msgid "No stages are currently bound to this flow." +msgstr "" + +#: src/pages/admin-overview/cards/WorkerStatusCard.ts:22 +msgid "No workers connected. Background tasks will not run." +msgstr "" + +#: src/pages/events/RuleListPage.ts:58 +msgid "None (rule disabled)" +msgstr "" + +#: src/pages/outposts/OutpostHealth.ts:30 +msgid "Not available" +msgstr "" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:72 +msgid "Not configured action" +msgstr "" + +#: src/pages/user-settings/settings/SourceSettingsOAuth.ts:44 +msgid "Not connected." +msgstr "" + +#: src/elements/router/Router404.ts:24 +msgid "Not found" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:148 +msgid "Not synced in the last hour, check System tasks." +msgstr "" + +#: src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts:58 +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:48 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:45 +#: src/flows/stages/captcha/CaptchaStage.ts:77 +#: src/flows/stages/consent/ConsentStage.ts:43 +#: src/flows/stages/password/PasswordStage.ts:46 +msgid "Not you?" +msgstr "" + +#: src/pages/events/RuleForm.ts:51 +msgid "Notice" +msgstr "" + +#: src/pages/events/RuleListPage.ts:29 +msgid "Notification Rules" +msgstr "" + +#: src/pages/events/TransportListPage.ts:28 +msgid "Notification Transports" +msgstr "" + +#: src/pages/events/RuleListPage.ts:75 +msgid "Notification rule" +msgstr "" + +#: src/elements/notifications/NotificationDrawer.ts:99 +msgid "Notifications" +msgstr "" + +#: src/pages/events/TransportListPage.ts:79 +msgid "Notifications Transport" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:56 +msgid "Number" +msgstr "" + +#: src/pages/users/UserViewPage.ts:195 +msgid "OAuth Authorization Codes" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:45 +msgid "OAuth Provider {0}" +msgstr "" + +#: src/pages/users/UserViewPage.ts:203 +msgid "OAuth Refresh Codes" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:42 +msgid "OAuth Source {0}" +msgstr "" + +#: src/pages/events/EventInfo.ts:147 +#: src/pages/events/EventInfo.ts:166 +msgid "Object" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:58 +msgid "Object field" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:226 +msgid "Object uniqueness field" +msgstr "" + +#: src/pages/stages/consent/ConsentStageForm.ts:94 +msgid "Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +msgstr "" + +#: src/elements/events/ObjectChangelog.ts:50 +#: src/pages/events/EventListPage.ts:56 +msgid "On behalf of {0}" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairForm.ts:51 +msgid "Only change the fields below if you want to overwrite their values." +msgstr "" + +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:81 +msgid "Only fail the policy, don't set user's password." +msgstr "" + +#: src/pages/events/TransportForm.ts:101 +msgid "Only send notification once, for example when sending a webhook into a chat channel." +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:171 +msgid "OpenID Configuration Issuer" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:165 +msgid "OpenID Configuration URL" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairForm.ts:63 +msgid "Optional Private Key. If this is set, you can use this keypair for encryption." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:89 +msgid "Optional URL if the IDP supports Single-Logout." +msgstr "" + +#: src/pages/stages/invitation/InvitationForm.ts:55 +msgid "Optional data which is loaded into the flow's 'prompt_data' context variable." +msgstr "" + +#: src/pages/stages/identification/IdentificationStageForm.ts:118 +msgid "Optional enrollment flow, which is linked at the bottom of the page." +msgstr "" + +#: src/pages/stages/identification/IdentificationStageForm.ts:136 +msgid "Optional recovery flow, which is linked at the bottom of the page." +msgstr "" + +#: src/pages/crypto/CertificateGenerateForm.ts:38 +msgid "Optional, comma-separated SubjectAlt Names." +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:115 +msgid "Optionally pre-fill the input value" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:71 +msgid "Optionally set the 'FriendlyName' value of the Assertion attribute." +msgstr "" + +#: src/pages/flows/StageBindingForm.ts:124 +#: src/pages/policies/BoundPoliciesList.ts:37 +#: src/pages/policies/PolicyBindingForm.ts:135 +#: src/pages/stages/prompt/PromptForm.ts:118 +#: src/pages/stages/prompt/PromptListPage.ts:49 +msgid "Order" +msgstr "" + +#: src/pages/outposts/OutpostListPage.ts:79 +msgid "Outpost" +msgstr "" + +#: src/pages/outposts/OutpostListPage.ts:95 +msgid "Outpost Deployment Info" +msgstr "" + +#: src/pages/outposts/ServiceConnectionListPage.ts:93 +msgid "Outpost Service-connection" +msgstr "" + +#: src/pages/applications/ApplicationViewPage.ts:66 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:75 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:66 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:69 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:67 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:65 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:68 +#: src/pages/users/UserViewPage.ts:73 +msgid "Overview" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairForm.ts:57 +msgid "PEM-encoded Certificate data." +msgstr "" + +#: src/pages/groups/GroupForm.ts:62 +#: src/pages/groups/GroupListPage.ts:46 +msgid "Parent" +msgstr "" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:76 +msgid "Pass policy?" +msgstr "" + +#: src/pages/events/EventInfo.ts:173 +#: src/pages/policies/PolicyTestForm.ts:35 +msgid "Passing" +msgstr "" + +#: src/flows/stages/password/PasswordStage.ts:51 +msgid "Password" +msgstr "" + +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:73 +#: src/pages/policies/password/PasswordPolicyForm.ts:73 +msgid "Password field" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:163 +msgid "Password reset" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:53 +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/sources/saml/SAMLSourceForm.ts:151 +msgid "Persistent" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:112 +msgid "Placeholder" +msgstr "" + +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:81 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:58 +msgid "Please enter your TOTP Code" +msgstr "" + +#: src/flows/stages/password/PasswordStage.ts:57 +msgid "Please enter your password" +msgstr "" + +#: src/pages/admin-overview/AdminOverviewPage.ts:44 +#: src/pages/policies/PolicyListPage.ts:38 +msgid "Policies" +msgstr "" + +#: src/pages/admin-overview/cards/PolicyUnboundStatusCard.ts:25 +msgid "Policies without binding exist." +msgstr "" + +#: src/pages/policies/PolicyBindingForm.ts:84 +#: src/pages/policies/PolicyListPage.ts:108 +msgid "Policy" +msgstr "" + +#: src/pages/applications/ApplicationViewPage.ts:109 +#: src/pages/flows/FlowViewPage.ts:104 +msgid "Policy Bindings" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:137 +msgid "Policy binding" +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:102 +#: src/pages/flows/FlowForm.ts:101 +#: src/pages/flows/StageBindingForm.ts:130 +msgid "Policy engine mode" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:45 +msgid "Policy {0}" +msgstr "" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:69 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:69 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:68 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:69 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:69 +#: src/pages/policies/password/PasswordPolicyForm.ts:69 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:68 +msgid "Policy-specific settings" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:102 +msgid "Post" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:109 +msgid "Post binding" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:106 +msgid "Post binding (auto-submit)" +msgstr "" + +#: src/flows/FlowExecutor.ts:242 +msgid "Powered by authentik" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:223 +msgid "Pre-authentication flow" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairForm.ts:61 +#: src/pages/stages/captcha/CaptchaStageForm.ts:70 +msgid "Private Key" +msgstr "" + +#: src/pages/stages/captcha/CaptchaStageForm.ts:74 +msgid "Private key, acquired from https://www.google.com/recaptcha/intro/v3.html." +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:78 +msgid "Profile URL" +msgstr "" + +#: src/pages/stages/invitation/InvitationListPage.ts:61 +#: src/pages/stages/prompt/PromptListPage.ts:80 +msgid "Prompt" +msgstr "" + +#: src/pages/stages/prompt/PromptListPage.ts:28 +msgid "Prompts" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingListPage.ts:97 +msgid "Property Mapping" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingListPage.ts:35 +msgid "Property Mappings" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:155 +msgid "Property mappings" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:189 +msgid "Property mappings used to group creation." +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:163 +msgid "Property mappings used to user creation." +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:81 +#: src/pages/providers/proxy/ProxyProviderForm.ts:79 +#: src/pages/providers/saml/SAMLProviderForm.ts:78 +#: src/pages/sources/oauth/OAuthSourceForm.ts:119 +#: src/pages/sources/saml/SAMLSourceForm.ts:75 +msgid "Protocol settings" +msgstr "" + +#: src/pages/providers/ProviderListPage.ts:37 +msgid "Provide support for protocols like SAML and OAuth to assigned applications." +msgstr "" + +#: src/elements/oauth/UserCodeList.ts:29 +#: src/elements/oauth/UserRefreshList.ts:29 +#: src/pages/applications/ApplicationForm.ts:92 +#: src/pages/applications/ApplicationViewPage.ts:83 +#: src/pages/providers/ProviderListPage.ts:34 +msgid "Provider" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:81 +msgid "Provider Type" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:135 +msgid "Provider type" +msgstr "" + +#: src/pages/admin-overview/AdminOverviewPage.ts:42 +#: src/pages/outposts/OutpostForm.ts:80 +msgid "Providers" +msgstr "" + +#: src/pages/outposts/OutpostForm.ts:57 +msgid "Proxy" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:42 +msgid "Proxy Provider {0}" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:101 +msgid "Public" +msgstr "" + +#: src/pages/stages/captcha/CaptchaStageForm.ts:63 +msgid "Public Key" +msgstr "" + +#: src/pages/stages/captcha/CaptchaStageForm.ts:67 +msgid "Public key, acquired from https://www.google.com/recaptcha/intro/v3.html." +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:131 +msgid "Publisher" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:143 +msgid "RS256 (Asymmetric Encryption)" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:172 +msgid "RSA Key" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:237 +#: src/pages/sources/saml/SAMLSourceForm.ts:199 +msgid "RSA-SHA1" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:240 +#: src/pages/sources/saml/SAMLSourceForm.ts:202 +msgid "RSA-SHA256" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:243 +#: src/pages/sources/saml/SAMLSourceForm.ts:205 +msgid "RSA-SHA384" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:246 +#: src/pages/sources/saml/SAMLSourceForm.ts:208 +msgid "RSA-SHA512" +msgstr "" + +#: src/pages/flows/StageBindingForm.ts:118 +msgid "Re-evaluate policies" +msgstr "" + +#: src/pages/flows/FlowForm.ts:67 +msgid "Recovery" +msgstr "" + +#: src/pages/stages/identification/IdentificationStageForm.ts:121 +msgid "Recovery flow" +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:86 +msgid "Recovery keys" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:99 +msgid "Redirect" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:119 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:117 +msgid "Redirect URIs" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:103 +msgid "Redirect binding" +msgstr "" + +#: src/elements/table/Table.ts:183 +msgid "Refresh" +msgstr "" + +#: src/elements/oauth/UserRefreshList.ts:44 +msgid "Refresh Code" +msgstr "" + +#: src/flows/stages/authenticator_webauthn/WebAuthnAuthenticatorRegisterStage.ts:116 +msgid "Register device" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:130 +msgid "Regular expressions for which authentication is not required. Each new line is interpreted as a new Regular Expression." +msgstr "" + +#: src/pages/applications/ApplicationViewPage.ts:77 +#: src/pages/flows/FlowViewPage.ts:68 +msgid "Related" +msgstr "" + +#: src/pages/events/EventInfo.ts:145 +#: src/pages/events/EventInfo.ts:164 +msgid "Request" +msgstr "" + +#: src/flows/access_denied/FlowAccessDenied.ts:40 +msgid "Request has been denied." +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:85 +msgid "Request token URL" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:107 +msgid "Required" +msgstr "" + +#: src/pages/user-settings/UserDetailsPage.ts:61 +#: src/pages/users/UserForm.ts:50 +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +#: src/pages/users/UserListPage.ts:132 +#: src/pages/users/UserViewPage.ts:164 +msgid "Reset Password" +msgstr "" + +#: src/pages/events/EventInfo.ts:171 +#: src/pages/property-mappings/PropertyMappingTestForm.ts:34 +msgid "Result" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:163 +#: src/pages/system-tasks/SystemTaskListPage.ts:83 +msgid "Retry Task" +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts:106 +msgid "Retry authentication" +msgstr "" + +#: src/elements/router/Router404.ts:28 +msgid "Return home" +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageCode.ts:82 +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStageWebAuthn.ts:119 +msgid "Return to device picker" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:58 +msgid "SAML Attribute Name" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderViewPage.ts:45 +msgid "SAML Provider {0}" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceViewPage.ts:45 +msgid "SAML Source {0}" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:218 +#: src/pages/sources/saml/SAMLSourceForm.ts:180 +msgid "SHA1" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:221 +#: src/pages/sources/saml/SAMLSourceForm.ts:183 +msgid "SHA256" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:224 +#: src/pages/sources/saml/SAMLSourceForm.ts:186 +msgid "SHA384" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:227 +#: src/pages/sources/saml/SAMLSourceForm.ts:189 +msgid "SHA512" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:86 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:92 +msgid "SLO URL" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:61 +msgid "SMTP Host" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:79 +msgid "SMTP Password" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:67 +msgid "SMTP Port" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:73 +msgid "SMTP Username" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:79 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:84 +msgid "SSO URL" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:229 +msgid "Same identifier is used for all providers" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:58 +msgid "Scope name" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:62 +msgid "Scope which the client can specify to access these properties." +msgstr "" + +#: src/elements/oauth/UserCodeList.ts:31 +#: src/elements/oauth/UserRefreshList.ts:31 +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:152 +msgid "Scopes" +msgstr "" + +#: src/pages/events/EventInfo.ts:124 +msgid "Secret:" +msgstr "" + +#: src/elements/table/Table.ts:215 +msgid "Select all rows" +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:149 +msgid "Select an identification method." +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:168 +msgid "Select which scopes can be used by the client. The client stil has to specify the scope to access the data." +msgstr "" + +#: src/pages/events/RuleForm.ts:92 +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 "" + +#: src/pages/stages/prompt/PromptStageForm.ts:102 +msgid "Selected policies are executed when the stage is submitted to validate the data." +msgstr "" + +#: src/pages/outposts/OutpostForm.ts:74 +msgid "Selecting a service-connection enables the management of the outpost by authentik." +msgstr "" + +#: src/pages/stages/password/PasswordStageForm.ts:82 +msgid "Selection of backends to test the password against." +msgstr "" + +#: src/flows/stages/email/EmailStage.ts:44 +msgid "Send Email again." +msgstr "" + +#: src/pages/events/RuleListPage.ts:32 +msgid "Send notifications whenever a specific Event is created and matched by policies." +msgstr "" + +#: src/pages/events/TransportForm.ts:98 +msgid "Send once" +msgstr "" + +#: src/pages/events/RuleListPage.ts:49 +msgid "Sent to group" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:68 +msgid "Separator: Static Separator Line" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:102 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:83 +msgid "Server URI" +msgstr "" + +#: src/flows/stages/authenticator_webauthn/WebAuthnAuthenticatorRegisterStage.ts:70 +msgid "Server validation of credential failed: {err}" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:94 +msgid "Service Provider Binding" +msgstr "" + +#: src/pages/outposts/OutpostForm.ts:61 +msgid "Service connection" +msgstr "" + +#: src/pages/stages/user_login/UserLoginStageForm.ts:63 +msgid "Session duration" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:209 +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:205 +msgid "Session valid not on or after" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:137 +msgid "Set HTTP-Basic Authentication" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:140 +msgid "Set a custom HTTP-Basic Authentication header based on values from authentik." +msgstr "" + +#: src/pages/events/RuleForm.ts:96 +#: src/pages/events/RuleListPage.ts:48 +msgid "Severity" +msgstr "" + +#: src/pages/stages/identification/IdentificationStageForm.ts:97 +msgid "Show matched user" +msgstr "" + +#: src/pages/flows/FlowForm.ts:91 +msgid "Shown as the Title in Flow pages." +msgstr "" + +#: src/flows/stages/identification/IdentificationStage.ts:120 +msgid "Sign up." +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:232 +#: src/pages/sources/saml/SAMLSourceForm.ts:194 +msgid "Signature algorithm" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:121 +msgid "Signing Keypair" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:114 +msgid "Signing keypair" +msgstr "" + +#: src/pages/stages/prompt/PromptListPage.ts:31 +msgid "Single Prompts that can be used for Prompt Stages." +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:127 +msgid "Skip path regex" +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:85 +#: src/pages/applications/ApplicationListPage.ts:58 +#: src/pages/sources/ldap/LDAPSourceForm.ts:59 +#: src/pages/sources/oauth/OAuthSourceForm.ts:103 +#: src/pages/sources/saml/SAMLSourceForm.ts:59 +msgid "Slug" +msgstr "" + +#: src/flows/FlowExecutor.ts:134 +msgid "Something went wrong! Please try again later." +msgstr "" + +#: src/pages/providers/ProviderListPage.ts:91 +#: src/pages/sources/SourcesListPage.ts:84 +msgid "Source" +msgstr "" + +#: src/pages/user-settings/settings/SourceSettingsOAuth.ts:21 +msgid "Source {0}" +msgstr "" + +#: src/pages/flows/StageBindingForm.ts:94 +msgid "Stage" +msgstr "" + +#: src/pages/flows/FlowViewPage.ts:96 +msgid "Stage Bindings" +msgstr "" + +#: src/pages/flows/FlowForm.ts:70 +msgid "Stage Configuration" +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:84 +msgid "Stage binding" +msgstr "" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:130 +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_static/AuthenticatorStaticStageForm.ts:61 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:60 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:68 +#: src/pages/stages/captcha/CaptchaStageForm.ts:59 +#: src/pages/stages/consent/ConsentStageForm.ts:61 +#: src/pages/stages/email/EmailStageForm.ts:126 +#: src/pages/stages/identification/IdentificationStageForm.ts:66 +#: src/pages/stages/invitation/InvitationStageForm.ts:59 +#: src/pages/stages/password/PasswordStageForm.ts:67 +#: src/pages/stages/prompt/PromptStageForm.ts:60 +#: src/pages/stages/user_login/UserLoginStageForm.ts:59 +msgid "Stage-specific settings" +msgstr "" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:101 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts:77 +msgid "Static Tokens" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:74 +msgid "Static: Static value, displayed as-is." +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts:44 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts:59 +msgid "Status: Disabled" +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts:18 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts:22 +msgid "Status: Enabled" +msgstr "" + +#: src/interfaces/Interface.ts:52 +msgid "Stop impersonation" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:149 +msgid "Subject" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:190 +msgid "Subject mode" +msgstr "" + +#: src/pages/crypto/CertificateGenerateForm.ts:35 +msgid "Subject-alt name" +msgstr "" + +#: src/pages/system-tasks/SystemTaskListPage.ts:59 +msgid "Successful" +msgstr "" + +#: src/pages/admin-overview/cards/FlowCacheStatusCard.ts:34 +msgid "Successfully cleared flow cache" +msgstr "" + +#: src/pages/admin-overview/cards/PolicyCacheStatusCard.ts:35 +msgid "Successfully cleared policy cache" +msgstr "" + +#: src/flows/stages/authenticator_totp/AuthenticatorTOTPStage.ts:63 +msgid "Successfully copied TOTP Config." +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:50 +msgid "Successfully created application." +msgstr "" + +#: src/pages/flows/StageBindingForm.ts:39 +#: src/pages/policies/PolicyBindingForm.ts:48 +msgid "Successfully created binding." +msgstr "" + +#: src/pages/crypto/CertificateKeyPairForm.ts:39 +msgid "Successfully created certificate-key pair." +msgstr "" + +#: src/pages/flows/FlowForm.ts:48 +msgid "Successfully created flow." +msgstr "" + +#: src/pages/groups/GroupForm.ts:40 +msgid "Successfully created group." +msgstr "" + +#: src/pages/stages/invitation/InvitationForm.ts:38 +msgid "Successfully created invitation." +msgstr "" + +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:45 +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:45 +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:45 +msgid "Successfully created mapping." +msgstr "" + +#: src/pages/outposts/OutpostForm.ts:40 +msgid "Successfully created outpost." +msgstr "" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:46 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:46 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:45 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:46 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:46 +#: src/pages/policies/password/PasswordPolicyForm.ts:46 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:45 +msgid "Successfully created policy." +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:37 +msgid "Successfully created prompt." +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:49 +#: src/pages/providers/proxy/ProxyProviderForm.ts:47 +#: src/pages/providers/saml/SAMLProviderForm.ts:46 +msgid "Successfully created provider." +msgstr "" + +#: src/pages/events/RuleForm.ts:38 +msgid "Successfully created rule." +msgstr "" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:45 +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:46 +msgid "Successfully created service-connection." +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:46 +#: src/pages/sources/oauth/OAuthSourceForm.ts:49 +#: src/pages/sources/saml/SAMLSourceForm.ts:46 +msgid "Successfully created source." +msgstr "" + +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:47 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:46 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:48 +#: src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts:44 +#: src/pages/stages/captcha/CaptchaStageForm.ts:45 +#: src/pages/stages/consent/ConsentStageForm.ts:47 +#: src/pages/stages/deny/DenyStageForm.ts:44 +#: src/pages/stages/dummy/DummyStageForm.ts:44 +#: src/pages/stages/email/EmailStageForm.ts:47 +#: src/pages/stages/identification/IdentificationStageForm.ts:46 +#: src/pages/stages/invitation/InvitationStageForm.ts:45 +#: src/pages/stages/password/PasswordStageForm.ts:47 +#: src/pages/stages/prompt/PromptStageForm.ts:46 +#: src/pages/stages/user_delete/UserDeleteStageForm.ts:44 +#: src/pages/stages/user_login/UserLoginStageForm.ts:45 +#: src/pages/stages/user_logout/UserLogoutStageForm.ts:44 +#: src/pages/stages/user_write/UserWriteStageForm.ts:44 +msgid "Successfully created stage." +msgstr "" + +#: src/pages/user-settings/tokens/UserTokenForm.ts:37 +msgid "Successfully created token." +msgstr "" + +#: src/pages/events/TransportForm.ts:38 +msgid "Successfully created transport." +msgstr "" + +#: src/pages/users/UserForm.ts:39 +msgid "Successfully created user." +msgstr "" + +#: src/elements/forms/DeleteForm.ts:30 +msgid "Successfully deleted {0} {1}" +msgstr "" + +#: src/pages/crypto/CertificateGenerateForm.ts:24 +msgid "Successfully generated certificate-key pair." +msgstr "" + +#: src/pages/users/UserListPage.ts:127 +#: src/pages/users/UserViewPage.ts:159 +msgid "Successfully generated recovery link" +msgstr "" + +#: src/pages/flows/FlowImportForm.ts:29 +msgid "Successfully imported flow." +msgstr "" + +#: src/pages/providers/saml/SAMLProviderImportForm.ts:33 +msgid "Successfully imported provider." +msgstr "" + +#: src/pages/policies/PolicyTestForm.ts:29 +#: src/pages/property-mappings/PropertyMappingTestForm.ts:29 +msgid "Successfully sent test-request." +msgstr "" + +#: src/pages/applications/ApplicationForm.ts:47 +msgid "Successfully updated application." +msgstr "" + +#: src/pages/flows/StageBindingForm.ts:36 +#: src/pages/policies/PolicyBindingForm.ts:45 +msgid "Successfully updated binding." +msgstr "" + +#: src/pages/crypto/CertificateKeyPairForm.ts:36 +msgid "Successfully updated certificate-key pair." +msgstr "" + +#: src/pages/user-settings/UserDetailsPage.ts:46 +msgid "Successfully updated details." +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:50 +msgid "Successfully updated device." +msgstr "" + +#: src/pages/flows/FlowForm.ts:45 +msgid "Successfully updated flow." +msgstr "" + +#: src/pages/groups/GroupForm.ts:37 +msgid "Successfully updated group." +msgstr "" + +#: src/pages/stages/invitation/InvitationForm.ts:35 +msgid "Successfully updated invitation." +msgstr "" + +#: src/pages/property-mappings/PropertyMappingLDAPForm.ts:42 +#: src/pages/property-mappings/PropertyMappingSAMLForm.ts:42 +#: src/pages/property-mappings/PropertyMappingScopeForm.ts:42 +msgid "Successfully updated mapping." +msgstr "" + +#: src/pages/outposts/OutpostForm.ts:37 +msgid "Successfully updated outpost." +msgstr "" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:43 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:43 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:42 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:43 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:43 +#: src/pages/policies/password/PasswordPolicyForm.ts:43 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:42 +msgid "Successfully updated policy." +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:34 +msgid "Successfully updated prompt." +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:46 +#: src/pages/providers/proxy/ProxyProviderForm.ts:44 +#: src/pages/providers/saml/SAMLProviderForm.ts:43 +msgid "Successfully updated provider." +msgstr "" + +#: src/pages/events/RuleForm.ts:35 +msgid "Successfully updated rule." +msgstr "" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:42 +#: src/pages/outposts/ServiceConnectionKubernetesForm.ts:43 +msgid "Successfully updated service-connection." +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:43 +#: src/pages/sources/oauth/OAuthSourceForm.ts:46 +#: src/pages/sources/saml/SAMLSourceForm.ts:43 +msgid "Successfully updated source." +msgstr "" + +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:44 +#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts:43 +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:45 +#: src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts:41 +#: src/pages/stages/captcha/CaptchaStageForm.ts:42 +#: src/pages/stages/consent/ConsentStageForm.ts:44 +#: src/pages/stages/deny/DenyStageForm.ts:41 +#: src/pages/stages/dummy/DummyStageForm.ts:41 +#: src/pages/stages/email/EmailStageForm.ts:44 +#: src/pages/stages/identification/IdentificationStageForm.ts:43 +#: src/pages/stages/invitation/InvitationStageForm.ts:42 +#: src/pages/stages/password/PasswordStageForm.ts:44 +#: src/pages/stages/prompt/PromptStageForm.ts:43 +#: src/pages/stages/user_delete/UserDeleteStageForm.ts:41 +#: src/pages/stages/user_login/UserLoginStageForm.ts:42 +#: src/pages/stages/user_logout/UserLogoutStageForm.ts:41 +#: src/pages/stages/user_write/UserWriteStageForm.ts:41 +msgid "Successfully updated stage." +msgstr "" + +#: src/pages/user-settings/tokens/UserTokenForm.ts:34 +msgid "Successfully updated token." +msgstr "" + +#: src/pages/events/TransportForm.ts:35 +msgid "Successfully updated transport." +msgstr "" + +#: src/pages/users/UserForm.ts:36 +msgid "Successfully updated user." +msgstr "" + +#: src/pages/users/UserActiveForm.ts:17 +msgid "Successfully updated {0} {1}" +msgstr "" + +#: src/pages/users/UserViewPage.ts:125 +msgid "Superuser" +msgstr "" + +#: src/pages/policies/password/PasswordPolicyForm.ts:118 +msgid "Symbol charset" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:135 +msgid "Sync" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:92 +msgid "Sync groups" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:140 +msgid "Sync status" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:76 +msgid "Sync users" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:84 +msgid "Sync users' passwords" +msgstr "" + +#: src/pages/admin-overview/AdminOverviewPage.ts:31 +msgid "System Overview" +msgstr "" + +#: src/pages/system-tasks/SystemTaskListPage.ts:24 +msgid "System Tasks" +msgstr "" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:91 +msgid "TLS Authentication Certificate" +msgstr "" + +#: src/pages/outposts/ServiceConnectionDockerForm.ts:74 +msgid "TLS Verification Certificate" +msgstr "" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:104 +msgid "TOTP Authenticators" +msgstr "" + +#: src/pages/flows/StageBindingForm.ts:74 +msgid "Target" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:155 +msgid "Template" +msgstr "" + +#: src/pages/events/TransportListPage.ts:62 +#: src/pages/policies/PolicyListPage.ts:95 +#: src/pages/policies/PolicyListPage.ts:103 +#: src/pages/property-mappings/PropertyMappingListPage.ts:84 +#: src/pages/property-mappings/PropertyMappingListPage.ts:92 +msgid "Test" +msgstr "" + +#: src/pages/policies/PolicyListPage.ts:98 +msgid "Test Policy" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingListPage.ts:87 +msgid "Test Property Mapping" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:44 +msgid "Text: Simple Text input" +msgstr "" + +#: src/elements/router/Router404.ts:26 +msgid "The URL '{0}' was not found." +msgstr "" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:86 +msgid "The policy takes a random time to execute. This controls the minimum time it will take." +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:102 +msgid "These policies control when this stage will be applied to the flow." +msgstr "" + +#: src/pages/applications/ApplicationViewPage.ts:111 +msgid "These policies control which users can access this application." +msgstr "" + +#: src/pages/flows/FlowViewPage.ts:106 +msgid "These policies control which users can access this flow." +msgstr "" + +#: src/pages/policies/reputation/ReputationPolicyForm.ts:88 +msgid "Threshold" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:146 +msgid "Time in minutes the token sent is valid." +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:172 +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 "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts:62 +msgid "Time-based One-Time Passwords" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:38 +#: src/pages/policies/PolicyBindingForm.ts:141 +#: src/pages/stages/email/EmailStageForm.ts:101 +msgid "Timeout" +msgstr "" + +#: src/pages/flows/FlowForm.ts:87 +msgid "Title" +msgstr "" + +#: src/pages/tokens/TokenListPage.ts:61 +#: src/pages/user-settings/tokens/UserTokenList.ts:118 +msgid "Token" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:184 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:113 +msgid "Token URL" +msgstr "" + +#: src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts:65 +msgid "Token count" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:142 +msgid "Token expiry" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderForm.ts:132 +msgid "Token validity" +msgstr "" + +#: src/flows/stages/authenticator_static/AuthenticatorStaticStage.ts:62 +#: src/pages/tokens/TokenListPage.ts:26 +#: src/pages/user-settings/UserSettingsPage.ts:80 +msgid "Tokens" +msgstr "" + +#: src/pages/tokens/TokenListPage.ts:29 +msgid "Tokens are used throughout authentik for Email validation stages, Recovery keys and API access." +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:80 +msgid "Traditional authenticator" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:163 +msgid "Transient" +msgstr "" + +#: src/pages/events/RuleForm.ts:78 +msgid "Transports" +msgstr "" + +#: src/pages/outposts/OutpostForm.ts:53 +#: src/pages/property-mappings/PropertyMappingListPage.ts:55 +#: src/pages/providers/ProviderListPage.ts:54 +#: src/pages/sources/SourcesListPage.ts:52 +#: src/pages/stages/prompt/PromptForm.ts:96 +#: src/pages/stages/prompt/PromptListPage.ts:48 +msgid "Type" +msgstr "" + +#: src/pages/events/EventInfo.ts:43 +msgid "UID" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:60 +msgid "URL settings" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:83 +msgid "URL that the initial Login request is sent to." +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:68 +msgid "URL the user is redirect to to consent the authorization." +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:82 +msgid "URL used by authentik to get user information." +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:75 +msgid "URL used by authentik to retrieve tokens." +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceForm.ts:88 +msgid "URL used to request the initial token. This URL is only required for OAuth 1." +msgstr "" + +#: src/pages/flows/FlowForm.ts:73 +msgid "Unenrollment" +msgstr "" + +#: src/pages/outposts/ServiceConnectionListPage.ts:70 +msgid "Unhealthy" +msgstr "" + +#: src/pages/system-tasks/SystemTaskListPage.ts:65 +msgid "Unknown" +msgstr "" + +#: src/pages/admin-overview/cards/VersionStatusCard.ts:32 +msgid "Up-to-date!" +msgstr "" + +#: src/pages/applications/ApplicationListPage.ts:82 +#: src/pages/crypto/CertificateKeyPairListPage.ts:66 +#: src/pages/events/RuleListPage.ts:62 +#: src/pages/events/TransportListPage.ts:66 +#: src/pages/flows/BoundStagesList.ts:53 +#: src/pages/flows/BoundStagesList.ts:71 +#: src/pages/flows/FlowListPage.ts:66 +#: src/pages/groups/GroupListPage.ts:62 +#: src/pages/outposts/OutpostListPage.ts:66 +#: src/pages/outposts/ServiceConnectionListPage.ts:75 +#: src/pages/policies/BoundPoliciesList.ts:63 +#: src/pages/policies/BoundPoliciesList.ts:83 +#: src/pages/policies/BoundPoliciesList.ts:98 +#: src/pages/policies/BoundPoliciesList.ts:124 +#: src/pages/policies/PolicyListPage.ts:77 +#: src/pages/property-mappings/PropertyMappingListPage.ts:66 +#: src/pages/providers/ProviderListPage.ts:73 +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:128 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:127 +#: src/pages/providers/saml/SAMLProviderViewPage.ts:122 +#: src/pages/sources/SourcesListPage.ts:66 +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:106 +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:124 +#: src/pages/sources/saml/SAMLSourceViewPage.ts:111 +#: src/pages/stages/StageListPage.ts:85 +#: src/pages/stages/prompt/PromptListPage.ts:67 +#: src/pages/user-settings/UserDetailsPage.ts:81 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:43 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:46 +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:67 +#: src/pages/user-settings/tokens/UserTokenList.ts:105 +#: src/pages/users/UserActiveForm.ts:57 +#: src/pages/users/UserListPage.ts:67 +#: src/pages/users/UserViewPage.ts:138 +msgid "Update" +msgstr "" + +#: src/pages/applications/ApplicationListPage.ts:85 +msgid "Update Application" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:127 +msgid "Update Binding" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:69 +msgid "Update Certificate-Key Pair" +msgstr "" + +#: src/pages/flows/FlowListPage.ts:69 +msgid "Update Flow" +msgstr "" + +#: src/pages/groups/GroupListPage.ts:65 +#: src/pages/policies/BoundPoliciesList.ts:86 +msgid "Update Group" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceViewPage.ts:109 +msgid "Update LDAP Source" +msgstr "" + +#: src/pages/events/RuleListPage.ts:65 +msgid "Update Notification Rule" +msgstr "" + +#: src/pages/events/TransportListPage.ts:69 +msgid "Update Notification Transport" +msgstr "" + +#: src/pages/sources/oauth/OAuthSourceViewPage.ts:127 +msgid "Update OAuth Source" +msgstr "" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:131 +msgid "Update OAuth2 Provider" +msgstr "" + +#: src/pages/outposts/OutpostListPage.ts:69 +msgid "Update Outpost" +msgstr "" + +#: src/pages/stages/prompt/PromptListPage.ts:70 +msgid "Update Prompt" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:130 +msgid "Update Proxy Provider" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderViewPage.ts:125 +msgid "Update SAML Provider" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceViewPage.ts:114 +msgid "Update SAML Source" +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:74 +msgid "Update Stage binding" +msgstr "" + +#: src/pages/user-settings/tokens/UserTokenList.ts:108 +msgid "Update Token" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:101 +#: src/pages/users/UserListPage.ts:70 +#: src/pages/users/UserViewPage.ts:141 +msgid "Update User" +msgstr "" + +#: src/pages/user-settings/UserDetailsPage.ts:42 +msgid "Update details" +msgstr "" + +#: src/pages/flows/BoundStagesList.ts:56 +#: src/pages/outposts/ServiceConnectionListPage.ts:78 +#: src/pages/policies/BoundPoliciesList.ts:66 +#: src/pages/policies/PolicyListPage.ts:80 +#: src/pages/property-mappings/PropertyMappingListPage.ts:69 +#: src/pages/providers/ProviderListPage.ts:76 +#: src/pages/sources/SourcesListPage.ts:69 +#: src/pages/stages/StageListPage.ts:88 +#: src/pages/users/UserActiveForm.ts:32 +msgid "Update {0}" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:96 +msgid "Use SSL" +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:88 +msgid "Use TLS" +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:81 +msgid "Use a code-based authenticator." +msgstr "" + +#: src/flows/stages/authenticator_validate/AuthenticatorValidateStage.ts:64 +msgid "Use a security key to prove your identity." +msgstr "" + +#: src/pages/stages/email/EmailStageForm.ts:136 +msgid "Use global settings" +msgstr "" + +#: src/elements/events/ObjectChangelog.ts:39 +#: src/pages/events/EventInfo.ts:83 +#: src/pages/events/EventListPage.ts:44 +#: src/pages/policies/PolicyBindingForm.ts:111 +#: src/pages/policies/PolicyTestForm.ts:60 +#: src/pages/property-mappings/PropertyMappingTestForm.ts:49 +#: src/pages/tokens/TokenListPage.ts:45 +#: src/pages/user-settings/tokens/UserTokenList.ts:72 +#: src/pages/users/UserListPage.ts:87 +#: src/pages/users/UserListPage.ts:107 +msgid "User" +msgstr "" + +#: src/pages/users/UserViewPage.ts:77 +msgid "User Info" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:141 +msgid "User Property Mappings" +msgstr "" + +#: src/pages/user-settings/UserSettingsPage.ts:71 +msgid "User Settings" +msgstr "" + +#: src/pages/user-settings/UserSettingsPage.ts:77 +msgid "User details" +msgstr "" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:96 +#: src/pages/stages/identification/IdentificationStageForm.ts:70 +msgid "User fields" +msgstr "" + +#: src/pages/sources/ldap/LDAPSourceForm.ts:205 +msgid "User object filter" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:51 +#: src/pages/users/UserViewPage.ts:48 +msgid "User {0}" +msgstr "" + +#: src/flows/FormStatic.ts:43 +msgid "User's avatar" +msgstr "" + +#: src/pages/user-settings/UserDetailsPage.ts:68 +#: src/pages/users/UserForm.ts:57 +msgid "User's display name." +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:152 +msgid "User/Group Attribute used for the password part of the HTTP-Basic Header." +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:146 +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 "" + +#: src/pages/providers/oauth2/OAuth2ProviderViewPage.ts:190 +msgid "Userinfo URL" +msgstr "" + +#: src/pages/stages/identification/IdentificationStageForm.ts:75 +#: src/pages/user-settings/UserDetailsPage.ts:58 +#: src/pages/users/UserForm.ts:46 +#: src/pages/users/UserViewPage.ts:83 +msgid "Username" +msgstr "" + +#: src/pages/stages/prompt/PromptForm.ts:47 +msgid "Username: Same as Text input, but checks for and prevents duplicate usernames." +msgstr "" + +#: src/pages/admin-overview/AdminOverviewPage.ts:46 +#: src/pages/users/UserListPage.ts:31 +msgid "Users" +msgstr "" + +#: src/pages/groups/GroupForm.ts:59 +msgid "Users added to this group will be superusers." +msgstr "" + +#: src/pages/events/EventInfo.ts:108 +msgid "Using flow" +msgstr "" + +#: src/pages/events/EventInfo.ts:198 +msgid "Using source" +msgstr "" + +#: src/pages/providers/proxy/ProxyProviderForm.ts:95 +msgid "Validate SSL Certificates of upstream servers." +msgstr "" + +#: src/pages/stages/prompt/PromptStageForm.ts:85 +msgid "Validation Policies" +msgstr "" + +#: src/pages/crypto/CertificateGenerateForm.ts:41 +msgid "Validity days" +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:138 +msgid "Verification Certificate" +msgstr "" + +#: src/pages/admin-overview/AdminOverviewPage.ts:48 +msgid "Version" +msgstr "" + +#: src/pages/outposts/OutpostHealth.ts:46 +msgid "Version: {0}" +msgstr "" + +#: src/pages/outposts/OutpostListPage.ts:91 +msgid "View Deployment Info" +msgstr "" + +#: src/pages/outposts/OutpostListPage.ts:98 +msgid "View deployment documentation" +msgstr "" + +#: src/pages/flows/FlowForm.ts:98 +msgid "Visible in the URL." +msgstr "" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:89 +msgid "Wait (max)" +msgstr "" + +#: src/pages/policies/dummy/DummyPolicyForm.ts:82 +msgid "Wait (min)" +msgstr "" + +#: src/pages/events/RuleForm.ts:48 +#: src/pages/system-tasks/SystemTaskListPage.ts:61 +msgid "Warning" +msgstr "" + +#: src/pages/admin-overview/cards/ProviderStatusCard.ts:24 +msgid "Warning: At least one Provider has no application assigned." +msgstr "" + +#: src/pages/policies/PolicyListPage.ts:71 +msgid "Warning: Policy is not assigned." +msgstr "" + +#: src/pages/providers/ProviderListPage.ts:68 +msgid "Warning: Provider not assigned to any application." +msgstr "" + +#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts:107 +msgid "WebAuthn Authenticators" +msgstr "" + +#: src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts:74 +msgid "WebAuthn Devices" +msgstr "" + +#: src/pages/events/TransportForm.ts:51 +msgid "Webhook (Slack/Discord)" +msgstr "" + +#: src/pages/events/TransportForm.ts:48 +msgid "Webhook (generic)" +msgstr "" + +#: src/pages/events/TransportForm.ts:90 +msgid "Webhook URL" +msgstr "" + +#: src/pages/stages/identification/IdentificationStageForm.ts:100 +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/email/EmailStageForm.ts:139 +msgid "When enabled, global Email connection settings will be used and connection settings below will be ignored." +msgstr "" + +#: src/pages/stages/identification/IdentificationStageForm.ts:91 +msgid "When enabled, user fields are matched regardless of their casing." +msgstr "" + +#: src/pages/providers/saml/SAMLProviderForm.ts:151 +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:65 +#: src/pages/policies/dummy/DummyPolicyForm.ts:79 +#: src/pages/policies/event_matcher/EventMatcherPolicyForm.ts:65 +#: src/pages/policies/expiry/ExpiryPolicyForm.ts:64 +#: src/pages/policies/expression/ExpressionPolicyForm.ts:65 +#: src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts:65 +#: src/pages/policies/password/PasswordPolicyForm.ts:65 +#: src/pages/policies/reputation/ReputationPolicyForm.ts:64 +msgid "When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged." +msgstr "" + +#: src/flows/FlowExecutor.ts:130 +msgid "Whoops!" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:157 +msgid "Windows" +msgstr "" + +#: src/pages/admin-overview/AdminOverviewPage.ts:50 +msgid "Workers" +msgstr "" + +#: src/pages/sources/saml/SAMLSourceForm.ts:160 +msgid "X509 Subject" +msgstr "" + +#: src/pages/crypto/CertificateKeyPairListPage.ts:61 +#: src/pages/policies/PolicyTestForm.ts:38 +#: src/pages/providers/proxy/ProxyProviderViewPage.ts:115 +msgid "Yes" +msgstr "" + +#: src/interfaces/Interface.ts:50 +msgid "You're currently impersonating {0}." +msgstr "" + +#: src/elements/events/ObjectChangelog.ts:38 +#: src/pages/events/EventListPage.ts:43 +msgid "action" +msgstr "" + +#: src/pages/users/UserListPage.ts:50 +msgid "active" +msgstr "" + +#: src/elements/user/UserConsentList.ts:29 +msgid "application" +msgstr "" + +#: src/pages/stages/password/PasswordStageForm.ts:76 +msgid "authentik Builtin Database" +msgstr "" + +#: src/pages/stages/password/PasswordStageForm.ts:79 +msgid "authentik LDAP Backend" +msgstr "" + +#: src/elements/events/ObjectChangelog.ts:41 +#: src/pages/events/EventListPage.ts:46 +msgid "client_ip" +msgstr "" + +#: src/elements/events/ObjectChangelog.ts:40 +#: src/pages/events/EventListPage.ts:45 +msgid "created" +msgstr "" + +#: src/pages/stages/invitation/InvitationListPage.ts:47 +msgid "created_by" +msgstr "" + +#: src/pages/flows/FlowListPage.ts:48 +msgid "designation" +msgstr "" + +#: src/elements/events/ObjectChangelog.ts:39 +#: src/pages/policies/BoundPoliciesList.ts:36 +msgid "enabled" +msgstr "" + +#: src/elements/oauth/UserCodeList.ts:30 +#: src/elements/oauth/UserRefreshList.ts:30 +#: src/elements/user/UserConsentList.ts:30 +#: src/pages/tokens/TokenListPage.ts:47 +msgid "expires" +msgstr "" + +#: src/pages/tokens/TokenListPage.ts:46 +msgid "expiring" +msgstr "" + +#: src/pages/stages/prompt/PromptListPage.ts:46 +msgid "field_key" +msgstr "" + +#: src/pages/events/RuleListPage.ts:49 +msgid "group" +msgstr "" + +#: src/pages/tokens/TokenListPage.ts:44 +#: src/pages/user-settings/tokens/UserTokenList.ts:39 +msgid "identifier" +msgstr "" + +#: src/pages/stages/prompt/PromptListPage.ts:47 +msgid "label" +msgstr "" + +#: src/pages/users/UserListPage.ts:51 +msgid "last_login" +msgstr "" + +#: src/pages/outposts/ServiceConnectionListPage.ts:54 +msgid "local" +msgstr "" + +#: src/pages/events/TransportListPage.ts:47 +msgid "mode" +msgstr "" + +#: src/pages/applications/ApplicationListPage.ts:57 +#: src/pages/crypto/CertificateKeyPairListPage.ts:51 +#: src/pages/events/RuleListPage.ts:47 +#: src/pages/events/TransportListPage.ts:46 +#: src/pages/flows/FlowListPage.ts:47 +#: src/pages/groups/GroupListPage.ts:45 +#: src/pages/outposts/OutpostListPage.ts:49 +#: src/pages/outposts/ServiceConnectionListPage.ts:52 +#: src/pages/policies/PolicyListPage.ts:56 +#: src/pages/property-mappings/PropertyMappingListPage.ts:54 +#: src/pages/providers/ProviderListPage.ts:52 +#: src/pages/sources/SourcesListPage.ts:51 +#: src/pages/stages/StageListPage.ts:65 +msgid "name" +msgstr "" + +#: src/elements/Tabs.ts:59 +msgid "no tabs defined" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:37 +#: src/pages/stages/prompt/PromptListPage.ts:49 +msgid "order" +msgstr "" + +#: src/pages/groups/GroupListPage.ts:46 +msgid "parent" +msgstr "" + +#: src/pages/stages/invitation/InvitationListPage.ts:46 +msgid "pk" +msgstr "" + +#: src/elements/oauth/UserCodeList.ts:29 +#: src/elements/oauth/UserRefreshList.ts:29 +msgid "provider" +msgstr "" + +#: src/elements/oauth/UserCodeList.ts:31 +#: src/elements/oauth/UserRefreshList.ts:31 +msgid "scope" +msgstr "" + +#: src/pages/events/RuleListPage.ts:48 +msgid "severity" +msgstr "" + +#: src/pages/applications/ApplicationListPage.ts:58 +#: src/pages/flows/FlowListPage.ts:46 +msgid "slug" +msgstr "" + +#: src/pages/system-tasks/SystemTaskListPage.ts:48 +msgid "task_name" +msgstr "" + +#: src/pages/policies/BoundPoliciesList.ts:38 +msgid "timeout" +msgstr "" + +#: src/pages/property-mappings/PropertyMappingListPage.ts:55 +#: src/pages/providers/ProviderListPage.ts:54 +#: src/pages/stages/prompt/PromptListPage.ts:48 +msgid "type" +msgstr "" + +#: src/pages/events/EventListPage.ts:44 +#: src/pages/tokens/TokenListPage.ts:45 +msgid "user" +msgstr "" + +#: src/pages/users/UserListPage.ts:49 +msgid "username" +msgstr "" + +#: src/pages/sources/SourcesListPage.ts:52 +msgid "verboseName" +msgstr "" + +#: src/elements/Expand.ts:28 +#: src/elements/Expand.ts:28 +#: src/elements/Page.ts:11 +#: src/elements/table/TablePage.ts:28 +msgid "{0}" +msgstr "" + +#: src/pages/stages/prompt/PromptStageForm.ts:77 +msgid "{0} ('{1}', Type {2})" +msgstr "" + +#: src/pages/stages/prompt/PromptStageForm.ts:97 +msgid "{0} ({1})" +msgstr "" + +#: src/pages/admin-overview/cards/VersionStatusCard.ts:27 +msgid "{0} is available!" +msgstr "" + +#: src/elements/notifications/NotificationDrawer.ts:102 +msgid "{0} unread" +msgstr "" + +#: src/pages/outposts/OutpostHealth.ts:45 +msgid "{0}, should be {1}" +msgstr "" + +#: src/elements/forms/ConfirmationForm.ts:35 +msgid "{0}: {1}" +msgstr "" + +#: src/elements/Page.ts:13 +#: src/elements/table/TablePage.ts:30 +msgid "{description}" +msgstr "" diff --git a/web/src/pages/LibraryPage.ts b/web/src/pages/LibraryPage.ts index e46e6dd4c..f52ae02ab 100644 --- a/web/src/pages/LibraryPage.ts +++ b/web/src/pages/LibraryPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import { ifDefined } from "lit-html/directives/if-defined"; import { until } from "lit-html/directives/until"; @@ -87,7 +87,7 @@ export class LibraryPage extends LitElement { apps?: AKResponse<Application>; pageTitle(): string { - return gettext("Applications"); + return t`Applications`; } static get styles(): CSSResult[] { @@ -109,9 +109,9 @@ export class LibraryPage extends LitElement { return html` <div class="pf-c-empty-state pf-m-full-height"> <div class="pf-c-empty-state__content"> <i class="fas fa-cubes pf-c-empty-state__icon" aria-hidden="true"></i> - <h1 class="pf-c-title pf-m-lg">${gettext("No Applications available.")}</h1> + <h1 class="pf-c-title pf-m-lg">${t`No Applications available.`}</h1> <div class="pf-c-empty-state__body"> - ${gettext("Either no applications are defined, or you don't have access to any.")} + ${t`Either no applications are defined, or you don't have access to any.`} </div> </div> </div>`; @@ -129,7 +129,7 @@ export class LibraryPage extends LitElement { <div class="pf-c-content"> <h1> <i class="pf-icon pf-icon-applications"></i> - ${gettext("Applications")} + ${t`Applications`} </h1> </div> </section> diff --git a/web/src/pages/admin-overview/AdminOverviewPage.ts b/web/src/pages/admin-overview/AdminOverviewPage.ts index 4fbd2546e..9bb87791b 100644 --- a/web/src/pages/admin-overview/AdminOverviewPage.ts +++ b/web/src/pages/admin-overview/AdminOverviewPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, LitElement, TemplateResult } from "lit-element"; import "../../elements/charts/AdminLoginsChart"; @@ -28,30 +28,30 @@ export class AdminOverviewPage extends LitElement { render(): TemplateResult { return html`<section class="pf-c-page__main-section pf-m-light"> <div class="pf-c-content"> - <h1>${gettext("System Overview")}</h1> + <h1>${t`System Overview`}</h1> </div> </section> <section class="pf-c-page__main-section"> <div class="pf-l-gallery pf-m-gutter"> - <ak-aggregate-card class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header="Logins over the last 24 hours" style="grid-column-end: span 3;grid-row-end: span 2;"> + <ak-aggregate-card class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header=${t`Logins over the last 24 hours`} style="grid-column-end: span 3;grid-row-end: span 2;"> <ak-charts-admin-login></ak-charts-admin-login> </ak-aggregate-card> - <ak-aggregate-card class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header="Apps with most usage" style="grid-column-end: span 2;grid-row-end: span 3;"> + <ak-aggregate-card class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header=${t`Apps with most usage`} style="grid-column-end: span 2;grid-row-end: span 3;"> <ak-top-applications-table></ak-top-applications-table> </ak-aggregate-card> - <ak-admin-status-card-provider class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-plugged" header="Providers" headerLink="#/core/providers/"> + <ak-admin-status-card-provider class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-plugged" header=${t`Providers`} headerLink="#/core/providers/"> </ak-admin-status-card-provider> - <ak-admin-status-card-policy-unbound class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-infrastructure" header="Policies" headerLink="#/policy/policies"> + <ak-admin-status-card-policy-unbound class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-infrastructure" header=${t`Policies`} headerLink="#/policy/policies"> </ak-admin-status-card-policy-unbound> - <ak-admin-status-card-user-count class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-user" header="Users" headerLink="#/identity/users"> + <ak-admin-status-card-user-count class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-user" header=${t`Users`} headerLink="#/identity/users"> </ak-admin-status-card-user-count> - <ak-admin-status-version class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-bundle" header="Version" headerLink="https://github.com/BeryJu/authentik/releases"> + <ak-admin-status-version class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-bundle" header=${t`Version`} headerLink="https://github.com/BeryJu/authentik/releases"> </ak-admin-status-version> - <ak-admin-status-card-workers class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header="Workers"> + <ak-admin-status-card-workers class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header=${t`Workers`}> </ak-admin-status-card-workers> - <ak-admin-status-card-policy-cache class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header="Cached Policies"> + <ak-admin-status-card-policy-cache class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header=${t`Cached Policies`}> </ak-admin-status-card-policy-cache> - <ak-admin-status-card-flow-cache class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header="Cached Flows"> + <ak-admin-status-card-flow-cache class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header=${t`Cached Flows`}> </ak-admin-status-card-flow-cache> </div> </section>`; diff --git a/web/src/pages/admin-overview/TopApplicationsTable.ts b/web/src/pages/admin-overview/TopApplicationsTable.ts index 3c07d092d..3793147e1 100644 --- a/web/src/pages/admin-overview/TopApplicationsTable.ts +++ b/web/src/pages/admin-overview/TopApplicationsTable.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import { EventsApi, EventTopPerUser } from "authentik-api"; import PFTable from "@patternfly/patternfly/components/Table/table.css"; @@ -43,8 +43,8 @@ export class TopApplicationsTable extends LitElement { return html`<table class="pf-c-table pf-m-compact" role="grid"> <thead> <tr role="row"> - <th role="columnheader" scope="col">${gettext("Application")}</th> - <th role="columnheader" scope="col">${gettext("Logins")}</th> + <th role="columnheader" scope="col">${t`Application`}</th> + <th role="columnheader" scope="col">${t`Logins`}</th> <th role="columnheader" scope="col"></th> </tr> </thead> diff --git a/web/src/pages/admin-overview/cards/FlowCacheStatusCard.ts b/web/src/pages/admin-overview/cards/FlowCacheStatusCard.ts index c802e3dda..b9dfecd37 100644 --- a/web/src/pages/admin-overview/cards/FlowCacheStatusCard.ts +++ b/web/src/pages/admin-overview/cards/FlowCacheStatusCard.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, TemplateResult } from "lit-element"; import { AdminStatus, AdminStatusCard } from "./AdminStatusCard"; import { FlowsApi } from "authentik-api"; @@ -18,7 +18,7 @@ export class FlowCacheStatusCard extends AdminStatusCard<number> { if (value < 1) { return Promise.resolve<AdminStatus>({ icon: "fa fa-exclamation-triangle pf-m-warning", - message: gettext("No flows cached."), + message: t`No flows cached.`, }); } else { return Promise.resolve<AdminStatus>({ @@ -29,18 +29,18 @@ export class FlowCacheStatusCard extends AdminStatusCard<number> { renderHeaderLink(): TemplateResult { return html`<ak-forms-confirm - successMessage="Successfully cleared flow cache" - errorMessage="Failed to delete flow cache" - action="Clear cache" + successMessage=${t`Successfully cleared flow cache`} + errorMessage=${t`Failed to delete flow cache`} + action=${t`Clear cache`} .onConfirm=${() => { return new FlowsApi(DEFAULT_CONFIG).flowsInstancesCacheClear(); }}> <span slot="header"> - ${gettext("Clear Flow cache")} + ${t`Clear Flow cache`} </span> <p slot="body"> - ${gettext(`Are you sure you want to clear the flow cache? - This will cause all flows to be re-evaluated on their next usage.`)} + ${t`Are you sure you want to clear the flow cache? + This will cause all flows to be re-evaluated on their next usage.`} </p> <a slot="trigger"> <i class="fa fa-trash"> </i> diff --git a/web/src/pages/admin-overview/cards/PolicyCacheStatusCard.ts b/web/src/pages/admin-overview/cards/PolicyCacheStatusCard.ts index 74e1ac1ce..a8e06390f 100644 --- a/web/src/pages/admin-overview/cards/PolicyCacheStatusCard.ts +++ b/web/src/pages/admin-overview/cards/PolicyCacheStatusCard.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement } from "lit-element"; import { TemplateResult, html } from "lit-html"; import { AdminStatusCard, AdminStatus } from "./AdminStatusCard"; @@ -19,7 +19,7 @@ export class PolicyCacheStatusCard extends AdminStatusCard<number> { if (value < 1) { return Promise.resolve<AdminStatus>({ icon: "fa fa-exclamation-triangle pf-m-warning", - message: gettext("No policies cached. Users may experience slow response times."), + message: t`No policies cached. Users may experience slow response times.`, }); } else { return Promise.resolve<AdminStatus>({ @@ -30,18 +30,18 @@ export class PolicyCacheStatusCard extends AdminStatusCard<number> { renderHeaderLink(): TemplateResult { return html`<ak-forms-confirm - successMessage="Successfully cleared policy cache" - errorMessage="Failed to delete policy cache" - action="Clear cache" + successMessage=${t`Successfully cleared policy cache`} + errorMessage=${t`Failed to delete policy cache`} + action=${t`Clear cache`} .onConfirm=${() => { return new PoliciesApi(DEFAULT_CONFIG).policiesAllCacheClear(); }}> <span slot="header"> - ${gettext("Clear Policy cache")} + ${t`Clear Policy cache`} </span> <p slot="body"> - ${gettext(`Are you sure you want to clear the policy cache? - This will cause all policies to be re-evaluated on their next usage.`)} + ${t`Are you sure you want to clear the policy cache? + This will cause all policies to be re-evaluated on their next usage.`} </p> <a slot="trigger"> <i class="fa fa-trash"> </i> diff --git a/web/src/pages/admin-overview/cards/PolicyUnboundStatusCard.ts b/web/src/pages/admin-overview/cards/PolicyUnboundStatusCard.ts index c84a55eec..155813070 100644 --- a/web/src/pages/admin-overview/cards/PolicyUnboundStatusCard.ts +++ b/web/src/pages/admin-overview/cards/PolicyUnboundStatusCard.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement } from "lit-element"; import { PoliciesApi } from "authentik-api"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -20,7 +20,7 @@ export class PolicyUnboundStatusCard extends AdminStatusCard<number> { if (value > 0) { return Promise.resolve<AdminStatus>({ icon: "fa fa-exclamation-triangle pf-m-warning", - message: gettext("Policies without binding exist."), + message: t`Policies without binding exist.`, }); } else { return Promise.resolve<AdminStatus>({ diff --git a/web/src/pages/admin-overview/cards/ProviderStatusCard.ts b/web/src/pages/admin-overview/cards/ProviderStatusCard.ts index f8832479a..6685f5cf7 100644 --- a/web/src/pages/admin-overview/cards/ProviderStatusCard.ts +++ b/web/src/pages/admin-overview/cards/ProviderStatusCard.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement } from "lit-element"; import { ProvidersApi } from "authentik-api"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -19,7 +19,7 @@ export class ProviderStatusCard extends AdminStatusCard<number> { if (value > 0) { return Promise.resolve<AdminStatus>({ icon: "fa fa-exclamation-triangle pf-m-warning", - message: gettext("Warning: At least one Provider has no application assigned."), + message: t`Warning: At least one Provider has no application assigned.`, }); } else { return Promise.resolve<AdminStatus>({ diff --git a/web/src/pages/admin-overview/cards/VersionStatusCard.ts b/web/src/pages/admin-overview/cards/VersionStatusCard.ts index d17f9f21e..4d8934789 100644 --- a/web/src/pages/admin-overview/cards/VersionStatusCard.ts +++ b/web/src/pages/admin-overview/cards/VersionStatusCard.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, TemplateResult } from "lit-element"; import { AdminApi, Version } from "authentik-api"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -15,18 +15,18 @@ export class VersionStatusCard extends AdminStatusCard<Version> { if (value.buildHash) { return Promise.resolve<AdminStatus>({ icon: "fa fa-check-circle pf-m-success", - message: gettext(`Build hash: ${value.buildHash?.substring(0, 10)}`), + message: t`Build hash: ${value.buildHash?.substring(0, 10)}`, }); } if (value.outdated) { return Promise.resolve<AdminStatus>({ icon: "fa fa-exclamation-triangle pf-m-warning", - message: gettext(`${value.versionLatest} is available!`), + message: t`${value.versionLatest} is available!`, }); } return Promise.resolve<AdminStatus>({ icon: "fa fa-check-circle pf-m-success", - message: gettext("Up-to-date!") + message: t`Up-to-date!` }); } diff --git a/web/src/pages/admin-overview/cards/WorkerStatusCard.ts b/web/src/pages/admin-overview/cards/WorkerStatusCard.ts index 4044ef03a..f473244c2 100644 --- a/web/src/pages/admin-overview/cards/WorkerStatusCard.ts +++ b/web/src/pages/admin-overview/cards/WorkerStatusCard.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement } from "lit-element"; import { AdminApi } from "authentik-api"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -17,7 +17,7 @@ export class WorkersStatusCard extends AdminStatusCard<number> { if (value < 1) { return Promise.resolve<AdminStatus>({ icon: "fa fa-exclamation-triangle pf-m-warning", - message: gettext("No workers connected. Background tasks will not run."), + message: t`No workers connected. Background tasks will not run.`, }); } else { return Promise.resolve<AdminStatus>({ diff --git a/web/src/pages/applications/ApplicationForm.ts b/web/src/pages/applications/ApplicationForm.ts index c079517a5..bfd6e9289 100644 --- a/web/src/pages/applications/ApplicationForm.ts +++ b/web/src/pages/applications/ApplicationForm.ts @@ -1,5 +1,5 @@ import { CoreApi, Application, ProvidersApi, Provider, ApplicationPolicyEngineModeEnum } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -20,9 +20,9 @@ export class ApplicationForm extends Form<Application> { getSuccessMessage(): string { if (this.application) { - return gettext("Successfully updated application."); + return t`Successfully updated application.`; } else { - return gettext("Successfully created application."); + return t`Successfully created application.`; } } @@ -74,21 +74,21 @@ export class ApplicationForm extends Form<Application> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.application?.name)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Application's display Name.")}</p> + <p class="pf-c-form__helper-text">${t`Application's display Name.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Slug")} + label=${t`Slug`} ?required=${true} name="slug"> <input type="text" value="${ifDefined(this.application?.slug)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Internal application name, used in URLs.")}</p> + <p class="pf-c-form__helper-text">${t`Internal application name, used in URLs.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Provider")} + label=${t`Provider`} name="parent"> <select class="pf-c-form-control"> <option value="" ?selected=${this.application?.provider === undefined}>---------</option> @@ -98,36 +98,36 @@ export class ApplicationForm extends Form<Application> { </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Policy engine mode")} + label=${t`Policy engine mode`} ?required=${true} name="policyEngineMode"> <select class="pf-c-form-control"> <option value=${ApplicationPolicyEngineModeEnum.Any} ?selected=${this.application?.policyEngineMode === ApplicationPolicyEngineModeEnum.Any}> - ${gettext("ANY, any policy must match to grant access.")} + ${t`ANY, any policy must match to grant access.`} </option> <option value=${ApplicationPolicyEngineModeEnum.All} ?selected=${this.application?.policyEngineMode === ApplicationPolicyEngineModeEnum.All}> - ${gettext("ALL, all policies must match to grant access.")} + ${t`ALL, all policies must match to grant access.`} </option> </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Launch URL")} + label=${t`Launch URL`} name="launchUrl"> <input type="text" value="${ifDefined(this.application?.launchUrl)}" class="pf-c-form-control"> - <p class="pf-c-form__helper-text">${gettext("If left empty, authentik will try to extract the launch URL based on the selected provider.")}</p> + <p class="pf-c-form__helper-text">${t`If left empty, authentik will try to extract the launch URL based on the selected provider.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Icon")} + label=${t`Icon`} name="metaIcon"> <input type="file" value="${ifDefined(this.application?.metaIcon)}" class="pf-c-form-control"> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Description")} + label=${t`Description`} name="metaDescription"> <textarea class="pf-c-form-control">${ifDefined(this.application?.metaDescription)}</textarea> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Publisher")} + label=${t`Publisher`} name="metaPublisher"> <input type="text" value="${ifDefined(this.application?.metaPublisher)}" class="pf-c-form-control"> </ak-form-element-horizontal> diff --git a/web/src/pages/applications/ApplicationListPage.ts b/web/src/pages/applications/ApplicationListPage.ts index 5d457b5c2..95d6a8028 100644 --- a/web/src/pages/applications/ApplicationListPage.ts +++ b/web/src/pages/applications/ApplicationListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import PFAvatar from "@patternfly/patternfly/components/Avatar/avatar.css"; import { AKResponse } from "../../api/Client"; @@ -19,10 +19,10 @@ export class ApplicationListPage extends TablePage<Application> { return true; } pageTitle(): string { - return gettext("Applications"); + return t`Applications`; } pageDescription(): string { - return gettext("External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML."); + return t`External Applications which use authentik as Identity-Provider, utilizing protocols like OAuth2 and SAML.`; } pageIcon(): string { return "pf-icon pf-icon-applications"; @@ -54,8 +54,8 @@ export class ApplicationListPage extends TablePage<Application> { columns(): TableColumn[] { return [ new TableColumn(""), - new TableColumn("Name", "name"), - new TableColumn("Slug", "slug"), + new TableColumn(t`Name`, t`name`), + new TableColumn(t`Slug`, t`slug`), new TableColumn("Provider"), new TableColumn("Provider Type"), new TableColumn(""), @@ -65,7 +65,7 @@ export class ApplicationListPage extends TablePage<Application> { row(item: Application): TemplateResult[] { return [ item.metaIcon ? - html`<img class="app-icon pf-c-avatar" src="${item.metaIcon}" alt="${gettext("Application Icon")}">` : + html`<img class="app-icon pf-c-avatar" src="${item.metaIcon}" alt="${t`Application Icon`}">` : html`<i class="fas fas fa-share-square"></i>`, html`<a href="#/core/applications/${item.slug}"> <div> @@ -79,27 +79,27 @@ export class ApplicationListPage extends TablePage<Application> { html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Application")} + ${t`Update Application`} </span> <ak-application-form slot="form" .application=${item}> </ak-application-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Application")} + objectLabel=${t`Application`} .delete=${() => { return new CoreApi(DEFAULT_CONFIG).coreApplicationsDelete({ slug: item.slug || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -109,15 +109,15 @@ export class ApplicationListPage extends TablePage<Application> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Application")} + ${t`Create Application`} </span> <ak-application-form slot="form"> </ak-application-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/applications/ApplicationViewPage.ts b/web/src/pages/applications/ApplicationViewPage.ts index e47965df4..d55c00d2d 100644 --- a/web/src/pages/applications/ApplicationViewPage.ts +++ b/web/src/pages/applications/ApplicationViewPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import "../../elements/Tabs"; @@ -49,13 +49,13 @@ export class ApplicationViewPage extends LitElement { return html`<section class="pf-c-page__main-section pf-m-light"> <div class="pf-c-content"> <h1> - ${gettext("Loading...")} + ${t`Loading...`} </h1> </div> </section> <ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<section class="pf-c-page__main-section pf-m-light"> @@ -68,10 +68,10 @@ export class ApplicationViewPage extends LitElement { </div> </section> <ak-tabs> - <section slot="page-1" data-tab-title="${gettext("Overview")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-l-gallery pf-m-gutter"> <div class="pf-c-card pf-l-gallery__item" style="grid-column-end: span 3;grid-row-end: span 2;"> - <div class="pf-c-card__title">${gettext("Logins over the last 24 hours")}</div> + <div class="pf-c-card__title">${t`Logins over the last 24 hours`}</div> <div class="pf-c-card__body"> ${this.application && html` <ak-charts-application-authorize applicationSlug=${this.application.slug}> @@ -79,13 +79,13 @@ export class ApplicationViewPage extends LitElement { </div> </div> <div class="pf-c-card pf-l-gallery__item"> - <div class="pf-c-card__title">${gettext("Related")}</div> + <div class="pf-c-card__title">${t`Related`}</div> <div class="pf-c-card__body"> <dl class="pf-c-description-list"> ${this.application.provider ? html`<div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Provider")}</span> + <span class="pf-c-description-list__text">${t`Provider`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text"> @@ -100,7 +100,7 @@ export class ApplicationViewPage extends LitElement { </div> </div> <div class="pf-c-card pf-l-gallery__item" style="grid-column-end: span 3;grid-row-end: span 2;"> - <div class="pf-c-card__title">${gettext("Changelog")}</div> + <div class="pf-c-card__title">${t`Changelog`}</div> <div class="pf-c-card__body"> <ak-object-changelog targetModelPk=${this.application.pk || ""} @@ -111,9 +111,9 @@ export class ApplicationViewPage extends LitElement { </div> </div> </section> - <div slot="page-2" data-tab-title="${gettext("Policy Bindings")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <div slot="page-2" data-tab-title="${t`Policy Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> - <div class="pf-c-card__title">${gettext("These policies control which users can access this application.")}</div> + <div class="pf-c-card__title">${t`These policies control which users can access this application.`}</div> <ak-bound-policies-list .target=${this.application.pk}> </ak-bound-policies-list> </div> diff --git a/web/src/pages/crypto/CertificateGenerateForm.ts b/web/src/pages/crypto/CertificateGenerateForm.ts index 9de4505fe..5e6d86b87 100644 --- a/web/src/pages/crypto/CertificateGenerateForm.ts +++ b/web/src/pages/crypto/CertificateGenerateForm.ts @@ -1,6 +1,6 @@ import { CertificateGeneration, CryptoApi } from "authentik-api"; import { CertificateKeyPair } from "authentik-api/src"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -11,7 +11,7 @@ import "../../elements/forms/HorizontalFormElement"; export class CertificateKeyPairForm extends Form<CertificateGeneration> { getSuccessMessage(): string { - return gettext("Successfully generated certificate-key pair."); + return t`Successfully generated certificate-key pair.`; } send = (data: CertificateGeneration): Promise<CertificateKeyPair> => { @@ -23,19 +23,19 @@ export class CertificateKeyPairForm extends Form<CertificateGeneration> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Common Name")} + label=${t`Common Name`} name="commonName" ?required=${true}> <input type="text" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Subject-alt name")} + label=${t`Subject-alt name`} name="subjectAltName"> <input class="pf-c-form-control" type="text"> - <p class="pf-c-form__helper-text">${gettext("Optional, comma-separated SubjectAlt Names.")}</p> + <p class="pf-c-form__helper-text">${t`Optional, comma-separated SubjectAlt Names.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Validity days")} + label=${t`Validity days`} name="validityDays" ?required=${true}> <input class="pf-c-form-control" type="number" value="365"> diff --git a/web/src/pages/crypto/CertificateKeyPairForm.ts b/web/src/pages/crypto/CertificateKeyPairForm.ts index 168cc5a04..833955273 100644 --- a/web/src/pages/crypto/CertificateKeyPairForm.ts +++ b/web/src/pages/crypto/CertificateKeyPairForm.ts @@ -1,5 +1,5 @@ import { CertificateKeyPair, CryptoApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -17,9 +17,9 @@ export class CertificateKeyPairForm extends Form<CertificateKeyPair> { getSuccessMessage(): string { if (this.keyPair) { - return gettext("Successfully updated certificate-key pair."); + return t`Successfully updated certificate-key pair.`; } else { - return gettext("Successfully created certificate-key pair."); + return t`Successfully created certificate-key pair.`; } } @@ -39,24 +39,24 @@ export class CertificateKeyPairForm extends Form<CertificateKeyPair> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} name="name" ?required=${true}> <input type="text" value="${ifDefined(this.keyPair?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> - ${this.keyPair ? html`<ak-divider>${gettext("Only change the fields below if you want to overwrite their values.")}</ak-divider>` : html``} + ${this.keyPair ? html`<ak-divider>${t`Only change the fields below if you want to overwrite their values.`}</ak-divider>` : html``} <ak-form-element-horizontal - label=${gettext("Certificate")} + label=${t`Certificate`} name="certificateData" ?required=${true}> <textarea class="pf-c-form-control" required>${ifDefined(this.keyPair?.certificateData)}</textarea> - <p class="pf-c-form__helper-text">${gettext("PEM-encoded Certificate data.")}</p> + <p class="pf-c-form__helper-text">${t`PEM-encoded Certificate data.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal name="keyData" - label=${gettext("Private Key")}> + label=${t`Private Key`}> <textarea class="pf-c-form-control" >${ifDefined(this.keyPair?.keyData)}</textarea> - <p class="pf-c-form__helper-text">${gettext("Optional Private Key. If this is set, you can use this keypair for encryption.")}</p> + <p class="pf-c-form__helper-text">${t`Optional Private Key. If this is set, you can use this keypair for encryption.`}</p> </ak-form-element-horizontal> </form>`; } diff --git a/web/src/pages/crypto/CertificateKeyPairListPage.ts b/web/src/pages/crypto/CertificateKeyPairListPage.ts index d08ddba34..2c6dcb814 100644 --- a/web/src/pages/crypto/CertificateKeyPairListPage.ts +++ b/web/src/pages/crypto/CertificateKeyPairListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TablePage } from "../../elements/table/TablePage"; @@ -23,10 +23,10 @@ export class CertificateKeyPairListPage extends TablePage<CertificateKeyPair> { return true; } pageTitle(): string { - return gettext("Certificate-Key Pairs"); + return t`Certificate-Key Pairs`; } pageDescription(): string { - return gettext("Import certificates of external providers or create certificates to sign requests with."); + return t`Import certificates of external providers or create certificates to sign requests with.`; } pageIcon(): string { return "pf-icon pf-icon-key"; @@ -50,7 +50,7 @@ export class CertificateKeyPairListPage extends TablePage<CertificateKeyPair> { columns(): TableColumn[] { return [ - new TableColumn("Name", "name"), + new TableColumn(t`Name`, t`name`), new TableColumn("Private key available?"), new TableColumn("Expiry date"), new TableColumn(""), @@ -60,32 +60,32 @@ export class CertificateKeyPairListPage extends TablePage<CertificateKeyPair> { row(item: CertificateKeyPair): TemplateResult[] { return [ html`${item.name}`, - html`${gettext(item.privateKeyAvailable ? "Yes" : "No")}`, + html`${item.privateKeyAvailable ? t`Yes` : t`No`}`, html`${item.certExpiry?.toLocaleString()}`, html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Certificate-Key Pair")} + ${t`Update Certificate-Key Pair`} </span> <ak-crypto-certificate-form slot="form" .keyPair=${item}> </ak-crypto-certificate-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Certificate-Key Pair")} + objectLabel=${t`Certificate-Key Pair`} .delete=${() => { return new CryptoApi(DEFAULT_CONFIG).cryptoCertificatekeypairsDelete({ kpUuid: item.pk || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -98,7 +98,7 @@ export class CertificateKeyPairListPage extends TablePage<CertificateKeyPair> { <dl class="pf-c-description-list pf-m-horizontal"> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Certificate Fingerprint")}</span> + <span class="pf-c-description-list__text">${t`Certificate Fingerprint`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${item.fingerprint}</div> @@ -106,7 +106,7 @@ export class CertificateKeyPairListPage extends TablePage<CertificateKeyPair> { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Certificate Subjet")}</span> + <span class="pf-c-description-list__text">${t`Certificate Subjet`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${item.certSubject}</div> @@ -123,28 +123,28 @@ export class CertificateKeyPairListPage extends TablePage<CertificateKeyPair> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Certificate-Key Pair")} + ${t`Create Certificate-Key Pair`} </span> <ak-crypto-certificate-form slot="form"> </ak-crypto-certificate-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal> <ak-forms-modal> <span slot="submit"> - ${gettext("Generate")} + ${t`Generate`} </span> <span slot="header"> - ${gettext("Generate Certificate-Key Pair")} + ${t`Generate Certificate-Key Pair`} </span> <ak-crypto-certificate-generate-form slot="form"> </ak-crypto-certificate-generate-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Generate")} + ${t`Generate`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/events/EventInfo.ts b/web/src/pages/events/EventInfo.ts index a03abfbd3..e7490ceab 100644 --- a/web/src/pages/events/EventInfo.ts +++ b/web/src/pages/events/EventInfo.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import { until } from "lit-html/directives/until"; import { FlowsApi } from "authentik-api"; @@ -43,7 +43,7 @@ export class EventInfo extends LitElement { return html`<dl class="pf-c-description-list pf-m-horizontal"> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("UID")}</span> + <span class="pf-c-description-list__text">${t`UID`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${context.pk as string}</div> @@ -51,7 +51,7 @@ export class EventInfo extends LitElement { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Name")}</span> + <span class="pf-c-description-list__text">${t`Name`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${context.name as string}</div> @@ -59,7 +59,7 @@ export class EventInfo extends LitElement { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("App")}</span> + <span class="pf-c-description-list__text">${t`App`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${context.app as string}</div> @@ -67,7 +67,7 @@ export class EventInfo extends LitElement { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Model Name")}</span> + <span class="pf-c-description-list__text">${t`Model Name`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${context.model_name as string}</div> @@ -79,11 +79,11 @@ export class EventInfo extends LitElement { defaultResponse(): TemplateResult { return html`<div class="pf-l-flex"> <div class="pf-l-flex__item"> - <h3>${gettext("Context")}</h3> + <h3>${t`Context`}</h3> <code>${JSON.stringify(this.event?.context, null, 4)}</code> </div> <div class="pf-l-flex__item"> - <h3>${gettext("User")}</h3> + <h3>${t`User`}</h3> <code>${JSON.stringify(this.event?.user, null, 4)}</code> </div> </div>`; @@ -98,17 +98,17 @@ export class EventInfo extends LitElement { case "model_updated": case "model_deleted": return html` - <h3>${gettext("Affected model:")}</h3> + <h3>${t`Affected model:`}</h3> ${this.getModelInfo(this.event.context?.model as EventContext)} `; case "authorize_application": return html`<div class="pf-l-flex"> <div class="pf-l-flex__item"> - <h3>${gettext("Authorized application:")}</h3> + <h3>${t`Authorized application:`}</h3> ${this.getModelInfo(this.event.context.authorized_application as EventContext)} </div> <div class="pf-l-flex__item"> - <h3>${gettext("Using flow")}</h3> + <h3>${t`Using flow`}</h3> <span>${until(new FlowsApi(DEFAULT_CONFIG).flowsInstancesList({ flowUuid: this.event.context.flow as string, }).then(resp => { @@ -120,20 +120,20 @@ export class EventInfo extends LitElement { <ak-expand>${this.defaultResponse()}</ak-expand>`; case "login_failed": return html` - <h3>${gettext(`Attempted to log in as ${this.event.context.username}`)}</h3> + <h3>${t`Attempted to log in as ${this.event.context.username}`}</h3> <ak-expand>${this.defaultResponse()}</ak-expand>`; case "secret_view": return html` - <h3>${gettext("Secret:")}</h3> + <h3>${t`Secret:`}</h3> ${this.getModelInfo(this.event.context.secret as EventContext)}`; case "property_mapping_exception": return html`<div class="pf-l-flex"> <div class="pf-l-flex__item"> - <h3>${gettext("Exception")}</h3> + <h3>${t`Exception`}</h3> <code>${this.event.context.message || this.event.context.error}</code> </div> <div class="pf-l-flex__item"> - <h3>${gettext("Expression")}</h3> + <h3>${t`Expression`}</h3> <code>${this.event.context.expression}</code> </div> </div> @@ -141,18 +141,18 @@ export class EventInfo extends LitElement { case "policy_exception": return html`<div class="pf-l-flex"> <div class="pf-l-flex__item"> - <h3>${gettext("Binding")}</h3> + <h3>${t`Binding`}</h3> ${this.getModelInfo(this.event.context.binding as EventContext)} </div> <div class="pf-l-flex__item"> - <h3>${gettext("Request")}</h3> + <h3>${t`Request`}</h3> <ul class="pf-c-list"> - <li>${gettext("Object")}: ${this.getModelInfo((this.event.context.request as EventContext).obj as EventContext)}</li> - <li><span>${gettext("Context")}: <code>${JSON.stringify((this.event.context.request as EventContext).context, null, 4)}</code></span></li> + <li>${t`Object`}: ${this.getModelInfo((this.event.context.request as EventContext).obj as EventContext)}</li> + <li><span>${t`Context`}: <code>${JSON.stringify((this.event.context.request as EventContext).context, null, 4)}</code></span></li> </ul> </div> <div class="pf-l-flex__item"> - <h3>${gettext("Exception")}</h3> + <h3>${t`Exception`}</h3> <code>${this.event.context.message || this.event.context.error}</code> </div> </div> @@ -160,21 +160,21 @@ export class EventInfo extends LitElement { case "policy_execution": return html`<div class="pf-l-flex"> <div class="pf-l-flex__item"> - <h3>${gettext("Binding")}</h3> + <h3>${t`Binding`}</h3> ${this.getModelInfo(this.event.context.binding as EventContext)} </div> <div class="pf-l-flex__item"> - <h3>${gettext("Request")}</h3> + <h3>${t`Request`}</h3> <ul class="pf-c-list"> - <li>${gettext("Object")}: ${this.getModelInfo((this.event.context.request as EventContext).obj as EventContext)}</li> - <li><span>${gettext("Context")}: <code>${JSON.stringify((this.event.context.request as EventContext).context, null, 4)}</code></span></li> + <li>${t`Object`}: ${this.getModelInfo((this.event.context.request as EventContext).obj as EventContext)}</li> + <li><span>${t`Context`}: <code>${JSON.stringify((this.event.context.request as EventContext).context, null, 4)}</code></span></li> </ul> </div> <div class="pf-l-flex__item"> - <h3>${gettext("Result")}</h3> + <h3>${t`Result`}</h3> <ul class="pf-c-list"> - <li>${gettext("Passing")}: ${(this.event.context.result as EventContext).passing}</li> - <li>${gettext("Messages")}: + <li>${t`Passing`}: ${(this.event.context.result as EventContext).passing}</li> + <li>${t`Messages`}: <ul class="pf-c-list"> ${((this.event.context.result as EventContext).messages as string[]).map(msg => { return html`<li>${msg}</li>`; @@ -189,7 +189,7 @@ export class EventInfo extends LitElement { return html`<h3>${this.event.context.message}</h3> <ak-expand>${this.defaultResponse()}</ak-expand>`; case "update_available": - return html`<h3>${gettext("New version available!")}</h3> + return html`<h3>${t`New version available!`}</h3> <a target="_blank" href="https://github.com/BeryJu/authentik/releases/tag/version%2F${this.event.context.new_version}">${this.event.context.new_version}</a> `; // Action types which typically don't record any extra context. @@ -198,7 +198,7 @@ export class EventInfo extends LitElement { if ("using_source" in this.event.context) { return html`<div class="pf-l-flex"> <div class="pf-l-flex__item"> - <h3>${gettext("Using source")}</h3> + <h3>${t`Using source`}</h3> ${this.getModelInfo(this.event.context.using_source as EventContext)} </div> </div>`; @@ -206,7 +206,7 @@ export class EventInfo extends LitElement { return this.defaultResponse(); case "logout": if (this.event.context === {}) { - return html`<span>${gettext("No additional data available.")}</span>`; + return html`<span>${t`No additional data available.`}</span>`; } return this.defaultResponse(); default: diff --git a/web/src/pages/events/EventInfoPage.ts b/web/src/pages/events/EventInfoPage.ts index 233755bd8..bc78a57a3 100644 --- a/web/src/pages/events/EventInfoPage.ts +++ b/web/src/pages/events/EventInfoPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import { EventsApi } from "authentik-api"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -37,7 +37,7 @@ export class EventInfoPage extends LitElement { <div class="pf-c-content"> <h1> <i class="pf-icon pf-icon-catalog"></i> - ${gettext(`Event ${this.event?.pk || ""}`)} + ${t`Event ${this.event?.pk || ""}`} </h1> </div> </section> diff --git a/web/src/pages/events/EventListPage.ts b/web/src/pages/events/EventListPage.ts index fd6d9aa24..3eef8a45c 100644 --- a/web/src/pages/events/EventListPage.ts +++ b/web/src/pages/events/EventListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { Event, EventsApi } from "authentik-api"; import { AKResponse } from "../../api/Client"; @@ -40,10 +40,10 @@ export class EventListPage extends TablePage<Event> { columns(): TableColumn[] { return [ - new TableColumn("Action", "action"), - new TableColumn("User", "user"), - new TableColumn("Creation Date", "created"), - new TableColumn("Client IP", "client_ip"), + new TableColumn(t`Action`, t`action`), + new TableColumn(t`User`, t`user`), + new TableColumn(t`Creation Date`, t`created`), + new TableColumn(t`Client IP`, t`client_ip`), ]; } row(item: EventWithContext): TemplateResult[] { @@ -52,7 +52,7 @@ export class EventListPage extends TablePage<Event> { <small>${item.app}</small>`, html`<div>${item.user?.username}</div> ${item.user.on_behalf_of ? html`<small> - ${gettext(`On behalf of ${item.user.on_behalf_of.username}`)} + ${t`On behalf of ${item.user.on_behalf_of.username}`} </small>` : html``}`, html`<span>${item.created?.toLocaleString()}</span>`, html`<span>${item.clientIp}</span>`, diff --git a/web/src/pages/events/RuleForm.ts b/web/src/pages/events/RuleForm.ts index 28f43d12c..6735d764e 100644 --- a/web/src/pages/events/RuleForm.ts +++ b/web/src/pages/events/RuleForm.ts @@ -1,5 +1,5 @@ import { CoreApi, EventsApi, NotificationRule, NotificationRuleSeverityEnum } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -16,9 +16,9 @@ export class RuleForm extends Form<NotificationRule> { getSuccessMessage(): string { if (this.rule) { - return gettext("Successfully updated rule."); + return t`Successfully updated rule.`; } else { - return gettext("Successfully created rule."); + return t`Successfully created rule.`; } } @@ -38,13 +38,13 @@ export class RuleForm extends Form<NotificationRule> { renderSeverity(): TemplateResult { return html` <option value=${NotificationRuleSeverityEnum.Alert} ?selected=${this.rule?.severity === NotificationRuleSeverityEnum.Alert}> - ${gettext("Alert")} + ${t`Alert`} </option> <option value=${NotificationRuleSeverityEnum.Warning} ?selected=${this.rule?.severity === NotificationRuleSeverityEnum.Warning}> - ${gettext("Warning")} + ${t`Warning`} </option> <option value=${NotificationRuleSeverityEnum.Notice} ?selected=${this.rule?.severity === NotificationRuleSeverityEnum.Notice}> - ${gettext("Notice")} + ${t`Notice`} </option> `; } @@ -52,13 +52,13 @@ export class RuleForm extends Form<NotificationRule> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.rule?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Group")} + label=${t`Group`} name="group"> <select class="pf-c-form-control"> <option value="" ?selected=${this.rule?.group === undefined}>---------</option> @@ -70,7 +70,7 @@ export class RuleForm extends Form<NotificationRule> { </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Transports")} + label=${t`Transports`} ?required=${true} name="transports"> <select name="users" class="pf-c-form-control" multiple> @@ -83,11 +83,11 @@ export class RuleForm extends Form<NotificationRule> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Select which transports should be used to notify the user. If none are selected, the notification will only be shown in the authentik UI.")}</p> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Select which transports should be used to notify the user. If none are selected, the notification will only be shown in the authentik UI.`}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Severity")} + label=${t`Severity`} ?required=${true} name="severity"> <select class="pf-c-form-control"> diff --git a/web/src/pages/events/RuleListPage.ts b/web/src/pages/events/RuleListPage.ts index 3eee587d0..de7db0a1c 100644 --- a/web/src/pages/events/RuleListPage.ts +++ b/web/src/pages/events/RuleListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TablePage } from "../../elements/table/TablePage"; @@ -21,10 +21,10 @@ export class RuleListPage extends TablePage<NotificationRule> { return true; } pageTitle(): string { - return gettext("Notification Rules"); + return t`Notification Rules`; } pageDescription(): string { - return gettext("Send notifications whenever a specific Event is created and matched by policies."); + return t`Send notifications whenever a specific Event is created and matched by policies.`; } pageIcon(): string { return "pf-icon pf-icon-attention-bell"; @@ -44,9 +44,9 @@ export class RuleListPage extends TablePage<NotificationRule> { columns(): TableColumn[] { return [ - new TableColumn("Name", "name"), - new TableColumn("Severity", "severity"), - new TableColumn("Sent to group", "group"), + new TableColumn(t`Name`, t`name`), + new TableColumn(t`Severity`, t`severity`), + new TableColumn(t`Sent to group`, t`group`), new TableColumn(""), ]; } @@ -55,31 +55,31 @@ export class RuleListPage extends TablePage<NotificationRule> { return [ html`${item.name}`, html`${item.severity}`, - html`${item.group?.name || gettext("None (rule disabled)")}`, + html`${item.group?.name || t`None (rule disabled)`}`, html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Notification Rule")} + ${t`Update Notification Rule`} </span> <ak-event-rule-form slot="form" .rule=${item}> </ak-event-rule-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Notification rule")} + objectLabel=${t`Notification rule`} .delete=${() => { return new EventsApi(DEFAULT_CONFIG).eventsRulesDelete({ pbmUuid: item.pk || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -89,15 +89,15 @@ export class RuleListPage extends TablePage<NotificationRule> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Notification Rule")} + ${t`Create Notification Rule`} </span> <ak-event-rule-form slot="form"> </ak-event-rule-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/events/TransportForm.ts b/web/src/pages/events/TransportForm.ts index 4c255dc6d..2a9773491 100644 --- a/web/src/pages/events/TransportForm.ts +++ b/web/src/pages/events/TransportForm.ts @@ -1,5 +1,5 @@ import { EventsApi, NotificationTransport, NotificationTransportModeEnum } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -18,9 +18,9 @@ export class TransportForm extends Form<NotificationTransport> { getSuccessMessage(): string { if (this.transport) { - return gettext("Successfully updated transport."); + return t`Successfully updated transport.`; } else { - return gettext("Successfully created transport."); + return t`Successfully created transport.`; } } @@ -40,13 +40,13 @@ export class TransportForm extends Form<NotificationTransport> { renderTransportModes(): TemplateResult { return html` <option value=${NotificationTransportModeEnum.Email} ?selected=${this.transport?.mode === NotificationTransportModeEnum.Email}> - ${gettext("Email")} + ${t`Email`} </option> <option value=${NotificationTransportModeEnum.Webhook} ?selected=${this.transport?.mode === NotificationTransportModeEnum.Webhook}> - ${gettext("Webhook (generic)")} + ${t`Webhook (generic)`} </option> <option value=${NotificationTransportModeEnum.WebhookSlack} ?selected=${this.transport?.mode === NotificationTransportModeEnum.WebhookSlack}> - ${gettext("Webhook (Slack/Discord)")} + ${t`Webhook (Slack/Discord)`} </option> `; } @@ -68,13 +68,13 @@ export class TransportForm extends Form<NotificationTransport> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.transport?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Mode")} + label=${t`Mode`} ?required=${true} name="mode"> <select class="pf-c-form-control" @change=${(ev: Event) => { @@ -86,7 +86,7 @@ export class TransportForm extends Form<NotificationTransport> { </ak-form-element-horizontal> <ak-form-element-horizontal ?hidden=${!this.showWebhook} - label=${gettext("Webhook URL")} + label=${t`Webhook URL`} name="webhookUrl"> <input type="text" value="${ifDefined(this.transport?.webhookUrl)}" class="pf-c-form-control"> </ak-form-element-horizontal> @@ -94,10 +94,10 @@ export class TransportForm extends Form<NotificationTransport> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.transport?.sendOnce || false}> <label class="pf-c-check__label"> - ${gettext("Send once")} + ${t`Send once`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("Only send notification once, for example when sending a webhook into a chat channel.")}</p> + <p class="pf-c-form__helper-text">${t`Only send notification once, for example when sending a webhook into a chat channel.`}</p> </ak-form-element-horizontal> </form>`; } diff --git a/web/src/pages/events/TransportListPage.ts b/web/src/pages/events/TransportListPage.ts index a05afa785..00a01c19a 100644 --- a/web/src/pages/events/TransportListPage.ts +++ b/web/src/pages/events/TransportListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TablePage } from "../../elements/table/TablePage"; @@ -19,10 +19,10 @@ export class TransportListPage extends TablePage<NotificationTransport> { return true; } pageTitle(): string { - return gettext("Notification Transports"); + return t`Notification Transports`; } pageDescription(): string { - return gettext("Define how notifications are sent to users, like Email or Webhook."); + return t`Define how notifications are sent to users, like Email or Webhook.`; } pageIcon(): string { return "pf-icon pf-icon-export"; @@ -42,8 +42,8 @@ export class TransportListPage extends TablePage<NotificationTransport> { columns(): TableColumn[] { return [ - new TableColumn("Name", "name"), - new TableColumn("Mode", "mode"), + new TableColumn(t`Name`, t`name`), + new TableColumn(t`Mode`, t`mode`), new TableColumn(""), ]; } @@ -59,31 +59,31 @@ export class TransportListPage extends TablePage<NotificationTransport> { uuid: item.pk || "", }); }}> - ${gettext("Test")} + ${t`Test`} </ak-action-button> <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Notification Transport")} + ${t`Update Notification Transport`} </span> <ak-event-transport-form slot="form" .transport=${item}> </ak-event-transport-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Notifications Transport")} + objectLabel=${t`Notifications Transport`} .delete=${() => { return new EventsApi(DEFAULT_CONFIG).eventsTransportsDelete({ uuid: item.pk || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -93,15 +93,15 @@ export class TransportListPage extends TablePage<NotificationTransport> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Notification Transport")} + ${t`Create Notification Transport`} </span> <ak-event-transport-form slot="form"> </ak-event-transport-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/flows/BoundStagesList.ts b/web/src/pages/flows/BoundStagesList.ts index 5e9692e16..7ffae1662 100644 --- a/web/src/pages/flows/BoundStagesList.ts +++ b/web/src/pages/flows/BoundStagesList.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { Table, TableColumn } from "../../elements/table/Table"; @@ -50,10 +50,10 @@ export class BoundStagesList extends Table<FlowStageBinding> { html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext(`Update ${item.stageObj?.verboseName}`)} + ${t`Update ${item.stageObj?.verboseName}`} </span> <ak-proxy-form slot="form" @@ -63,32 +63,32 @@ export class BoundStagesList extends Table<FlowStageBinding> { type=${ifDefined(item.stageObj?.component)}> </ak-proxy-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit Stage")} + ${t`Edit Stage`} </button> </ak-forms-modal> <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Stage binding")} + ${t`Update Stage binding`} </span> <ak-stage-binding-form slot="form" .fsb=${item}> </ak-stage-binding-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit Binding")} + ${t`Edit Binding`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Stage binding")} + objectLabel=${t`Stage binding`} .delete=${() => { return new FlowsApi(DEFAULT_CONFIG).flowsBindingsDelete({ fsbUuid: item.pk || "", }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete Binding")} + ${t`Delete Binding`} </button> </ak-forms-delete>`, ]; @@ -100,7 +100,7 @@ export class BoundStagesList extends Table<FlowStageBinding> { <td role="cell" colspan="3"> <div class="pf-c-table__expandable-row-content"> <div class="pf-c-content"> - <p>${gettext("These policies control when this stage will be applied to the flow.")}</p> + <p>${t`These policies control when this stage will be applied to the flow.`}</p> <ak-bound-policies-list .target=${item.policybindingmodelPtrId}> </ak-bound-policies-list> </div> @@ -111,22 +111,22 @@ export class BoundStagesList extends Table<FlowStageBinding> { } renderEmpty(): TemplateResult { - return super.renderEmpty(html`<ak-empty-state header=${gettext("No Stages bound")} icon="pf-icon-module"> + return super.renderEmpty(html`<ak-empty-state header=${t`No Stages bound`} icon="pf-icon-module"> <div slot="body"> - ${gettext("No stages are currently bound to this flow.")} + ${t`No stages are currently bound to this flow.`} </div> <div slot="primary"> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Stage binding")} + ${t`Create Stage binding`} </span> <ak-stage-binding-form slot="form" targetPk=${ifDefined(this.target)}> </ak-stage-binding-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Bind stage")} + ${t`Bind stage`} </button> </ak-forms-modal> </div> @@ -137,7 +137,7 @@ export class BoundStagesList extends Table<FlowStageBinding> { return html` <ak-dropdown class="pf-c-dropdown"> <button class="pf-m-primary pf-c-dropdown__toggle" type="button"> - <span class="pf-c-dropdown__toggle-text">${gettext("Create Stage")}</span> + <span class="pf-c-dropdown__toggle-text">${t`Create Stage`}</span> <i class="fas fa-caret-down pf-c-dropdown__toggle-icon" aria-hidden="true"></i> </button> <ul class="pf-c-dropdown__menu" hidden> @@ -146,10 +146,10 @@ export class BoundStagesList extends Table<FlowStageBinding> { return html`<li> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext(`Create ${type.name}`)} + ${t`Create ${type.name}`} </span> <ak-proxy-form slot="form" @@ -167,15 +167,15 @@ export class BoundStagesList extends Table<FlowStageBinding> { </ak-dropdown> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Stage binding")} + ${t`Create Stage binding`} </span> <ak-stage-binding-form slot="form" targetPk=${ifDefined(this.target)}> </ak-stage-binding-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Bind stage")} + ${t`Bind stage`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/flows/FlowForm.ts b/web/src/pages/flows/FlowForm.ts index 9163ca6f1..c1ef47a06 100644 --- a/web/src/pages/flows/FlowForm.ts +++ b/web/src/pages/flows/FlowForm.ts @@ -1,5 +1,5 @@ import { Flow, FlowDesignationEnum, FlowPolicyEngineModeEnum, FlowsApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -15,9 +15,9 @@ export class FlowForm extends Form<Flow> { getSuccessMessage(): string { if (this.flow) { - return gettext("Successfully updated flow."); + return t`Successfully updated flow.`; } else { - return gettext("Successfully created flow."); + return t`Successfully created flow.`; } } @@ -48,25 +48,25 @@ export class FlowForm extends Form<Flow> { renderDesignations(): TemplateResult { return html` <option value=${FlowDesignationEnum.Authentication} ?selected=${this.flow?.designation === FlowDesignationEnum.Authentication}> - ${gettext("Authentication")} + ${t`Authentication`} </option> <option value=${FlowDesignationEnum.Authorization} ?selected=${this.flow?.designation === FlowDesignationEnum.Authorization}> - ${gettext("Authorization")} + ${t`Authorization`} </option> <option value=${FlowDesignationEnum.Enrollment} ?selected=${this.flow?.designation === FlowDesignationEnum.Enrollment}> - ${gettext("Enrollment")} + ${t`Enrollment`} </option> <option value=${FlowDesignationEnum.Invalidation} ?selected=${this.flow?.designation === FlowDesignationEnum.Invalidation}> - ${gettext("Invalidation")} + ${t`Invalidation`} </option> <option value=${FlowDesignationEnum.Recovery} ?selected=${this.flow?.designation === FlowDesignationEnum.Recovery}> - ${gettext("Recovery")} + ${t`Recovery`} </option> <option value=${FlowDesignationEnum.StageConfiguration} ?selected=${this.flow?.designation === FlowDesignationEnum.StageConfiguration}> - ${gettext("Stage Configuration")} + ${t`Stage Configuration`} </option> <option value=${FlowDesignationEnum.Unenrollment} ?selected=${this.flow?.designation === FlowDesignationEnum.Unenrollment}> - ${gettext("Unenrollment")} + ${t`Unenrollment`} </option> `; } @@ -74,53 +74,53 @@ export class FlowForm extends Form<Flow> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.flow?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Title")} + label=${t`Title`} ?required=${true} name="title"> <input type="text" value="${ifDefined(this.flow?.title)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Shown as the Title in Flow pages.")}</p> + <p class="pf-c-form__helper-text">${t`Shown as the Title in Flow pages.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="slug"> <input type="text" value="${ifDefined(this.flow?.slug)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Visible in the URL.")}</p> + <p class="pf-c-form__helper-text">${t`Visible in the URL.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Policy engine mode")} + label=${t`Policy engine mode`} ?required=${true} name="policyEngineMode"> <select class="pf-c-form-control"> <option value=${FlowPolicyEngineModeEnum.Any} ?selected=${this.flow?.policyEngineMode === FlowPolicyEngineModeEnum.Any}> - ${gettext("ANY, any policy must match to grant access.")} + ${t`ANY, any policy must match to grant access.`} </option> <option value=${FlowPolicyEngineModeEnum.All} ?selected=${this.flow?.policyEngineMode === FlowPolicyEngineModeEnum.All}> - ${gettext("ALL, all policies must match to grant access.")} + ${t`ALL, all policies must match to grant access.`} </option> </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Designation")} + label=${t`Designation`} ?required=${true} name="designation"> <select class="pf-c-form-control"> <option value="" ?selected=${this.flow?.designation === undefined}>---------</option> ${this.renderDesignations()} </select> - <p class="pf-c-form__helper-text">${gettext("Decides what this Flow is used for. For example, the Authentication flow is redirect to when an un-authenticated user visits authentik.")}</p> + <p class="pf-c-form__helper-text">${t`Decides what this Flow is used for. For example, the Authentication flow is redirect to when an un-authenticated user visits authentik.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Background")} + label=${t`Background`} name="background"> <input type="file" value="${ifDefined(this.flow?.background)}" class="pf-c-form-control"> - <p class="pf-c-form__helper-text">${gettext("Background shown during execution.")}</p> + <p class="pf-c-form__helper-text">${t`Background shown during execution.`}</p> </ak-form-element-horizontal> </form>`; } diff --git a/web/src/pages/flows/FlowImportForm.ts b/web/src/pages/flows/FlowImportForm.ts index 48161ef8a..9b35f5646 100644 --- a/web/src/pages/flows/FlowImportForm.ts +++ b/web/src/pages/flows/FlowImportForm.ts @@ -1,5 +1,5 @@ import { Flow, FlowsApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -10,7 +10,7 @@ import "../../elements/forms/HorizontalFormElement"; export class FlowImportForm extends Form<Flow> { getSuccessMessage(): string { - return gettext("Successfully imported flow."); + return t`Successfully imported flow.`; } // eslint-disable-next-line @@ -27,10 +27,10 @@ export class FlowImportForm extends Form<Flow> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Flow")} + label=${t`Flow`} name="flow"> <input type="file" value="" class="pf-c-form-control"> - <p class="pf-c-form__helper-text">${gettext("Background shown during execution.")}</p> + <p class="pf-c-form__helper-text">${t`Background shown during execution.`}</p> </ak-form-element-horizontal> </form>`; } diff --git a/web/src/pages/flows/FlowListPage.ts b/web/src/pages/flows/FlowListPage.ts index 473efd5c9..af5459d45 100644 --- a/web/src/pages/flows/FlowListPage.ts +++ b/web/src/pages/flows/FlowListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TablePage } from "../../elements/table/TablePage"; @@ -19,10 +19,10 @@ export class FlowListPage extends TablePage<Flow> { return true; } pageTitle(): string { - return gettext("Flows"); + return t`Flows`; } pageDescription(): string { - return gettext("Flows describe a chain of Stages to authenticate, enroll or recover a user. Stages are chosen based on policies applied to them."); + return t`Flows describe a chain of Stages to authenticate, enroll or recover a user. Stages are chosen based on policies applied to them.`; } pageIcon(): string { return "pf-icon pf-icon-process-automation"; @@ -42,9 +42,9 @@ export class FlowListPage extends TablePage<Flow> { columns(): TableColumn[] { return [ - new TableColumn("Identifier", "slug"), - new TableColumn("Name", "name"), - new TableColumn("Designation", "designation"), + new TableColumn(t`Identifier`, t`slug`), + new TableColumn(t`Name`, t`name`), + new TableColumn(t`Designation`, t`designation`), new TableColumn("Stages"), new TableColumn("Policies"), new TableColumn(""), @@ -63,27 +63,27 @@ export class FlowListPage extends TablePage<Flow> { html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Flow")} + ${t`Update Flow`} </span> <ak-flow-form slot="form" .flow=${item}> </ak-flow-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Flow")} + objectLabel=${t`Flow`} .delete=${() => { return new FlowsApi(DEFAULT_CONFIG).flowsInstancesDelete({ slug: item.slug }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete> <button @@ -95,10 +95,10 @@ export class FlowListPage extends TablePage<Flow> { window.location.assign(`${link.link}?next=/%23${window.location.href}`); }); }}> - ${gettext("Execute")} + ${t`Execute`} </button> <a class="pf-c-button pf-m-secondary" href="${`${DEFAULT_CONFIG.basePath}/flows/instances/${item.slug}/export/`}"> - ${gettext("Export")} + ${t`Export`} </a>`, ]; } @@ -107,28 +107,28 @@ export class FlowListPage extends TablePage<Flow> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Flow")} + ${t`Create Flow`} </span> <ak-flow-form slot="form"> </ak-flow-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal> <ak-forms-modal> <span slot="submit"> - ${gettext("Import")} + ${t`Import`} </span> <span slot="header"> - ${gettext("Import Flow")} + ${t`Import Flow`} </span> <ak-flow-import-form slot="form"> </ak-flow-import-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Import")} + ${t`Import`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/flows/FlowViewPage.ts b/web/src/pages/flows/FlowViewPage.ts index 34f09dcae..f0e87c94a 100644 --- a/web/src/pages/flows/FlowViewPage.ts +++ b/web/src/pages/flows/FlowViewPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import "../../elements/Tabs"; @@ -59,7 +59,7 @@ export class FlowViewPage extends LitElement { </div> </section> <ak-tabs> - <div slot="page-1" data-tab-title="${gettext("Flow Overview")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <div slot="page-1" data-tab-title="${t`Flow Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-l-gallery pf-m-gutter"> <div class="pf-c-card pf-l-gallery__item" style="grid-column-end: span 3;grid-row-end: span 2;"> <div class="pf-c-card"> @@ -70,12 +70,12 @@ export class FlowViewPage extends LitElement { </div> </div> <div class="pf-c-card pf-l-gallery__item"> - <div class="pf-c-card__title">${gettext("Related")}</div> + <div class="pf-c-card__title">${t`Related`}</div> <div class="pf-c-card__body"> <dl class="pf-c-description-list"> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Execute flow")}</span> + <span class="pf-c-description-list__text">${t`Execute flow`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text"> @@ -88,7 +88,7 @@ export class FlowViewPage extends LitElement { window.location.assign(`${link.link}?next=/%23${window.location.href}`); }); }}> - ${gettext("Execute")} + ${t`Execute`} </button> </div> </dd> @@ -98,7 +98,7 @@ export class FlowViewPage extends LitElement { </div> </div> </div> - <div slot="page-2" data-tab-title="${gettext("Stage Bindings")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <div slot="page-2" data-tab-title="${t`Stage Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-bound-stages-list .target=${this.flow.pk}> @@ -106,16 +106,16 @@ export class FlowViewPage extends LitElement { </div> </div> </div> - <div slot="page-3" data-tab-title="${gettext("Policy Bindings")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <div slot="page-3" data-tab-title="${t`Policy Bindings`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> - <div class="pf-c-card__title">${gettext("These policies control which users can access this flow.")}</div> + <div class="pf-c-card__title">${t`These policies control which users can access this flow.`}</div> <div class="pf-c-card__body"> <ak-bound-policies-list .target=${this.flow.policybindingmodelPtrId}> </ak-bound-policies-list> </div> </div> </div> - <div slot="page-4" data-tab-title="${gettext("Changelog")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <div slot="page-4" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-object-changelog diff --git a/web/src/pages/flows/StageBindingForm.ts b/web/src/pages/flows/StageBindingForm.ts index 5a7a9e8a2..868108641 100644 --- a/web/src/pages/flows/StageBindingForm.ts +++ b/web/src/pages/flows/StageBindingForm.ts @@ -1,5 +1,5 @@ import { FlowsApi, FlowStageBinding, FlowStageBindingPolicyEngineModeEnum, Stage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -20,9 +20,9 @@ export class StageBindingForm extends Form<FlowStageBinding> { getSuccessMessage(): string { if (this.fsb) { - return gettext("Successfully updated binding."); + return t`Successfully updated binding.`; } else { - return gettext("Successfully created binding."); + return t`Successfully created binding.`; } } @@ -71,7 +71,7 @@ export class StageBindingForm extends Form<FlowStageBinding> { `; } return html`<ak-form-element-horizontal - label=${gettext("Target")} + label=${t`Target`} ?required=${true} name="target"> <select class="pf-c-form-control"> @@ -91,7 +91,7 @@ export class StageBindingForm extends Form<FlowStageBinding> { return html`<form class="pf-c-form pf-m-horizontal"> ${this.renderTarget()} <ak-form-element-horizontal - label=${gettext("Stage")} + label=${t`Stage`} ?required=${true} name="stage"> <select class="pf-c-form-control"> @@ -106,36 +106,36 @@ export class StageBindingForm extends Form<FlowStageBinding> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.fsb?.evaluateOnPlan || true}> <label class="pf-c-check__label"> - ${gettext("Evaluate on plan")} + ${t`Evaluate on plan`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("Evaluate policies during the Flow planning process. Disable this for input-based policies.")}</p> + <p class="pf-c-form__helper-text">${t`Evaluate policies during the Flow planning process. Disable this for input-based policies.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal name="reEvaluatePolicies"> <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.fsb?.reEvaluatePolicies || false}> <label class="pf-c-check__label"> - ${gettext("Re-evaluate policies")} + ${t`Re-evaluate policies`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("Evaluate policies when the Stage is present to the user.")}</p> + <p class="pf-c-form__helper-text">${t`Evaluate policies when the Stage is present to the user.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Order")} + label=${t`Order`} ?required=${true} name="order"> <input type="number" value="${until(this.getOrder(), this.fsb?.order)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Policy engine mode")} + label=${t`Policy engine mode`} ?required=${true} name="policyEngineMode"> <select class="pf-c-form-control"> <option value=${FlowStageBindingPolicyEngineModeEnum.Any} ?selected=${this.fsb?.policyEngineMode === FlowStageBindingPolicyEngineModeEnum.Any}> - ${gettext("ANY, any policy must match to grant access.")} + ${t`ANY, any policy must match to grant access.`} </option> <option value=${FlowStageBindingPolicyEngineModeEnum.All} ?selected=${this.fsb?.policyEngineMode === FlowStageBindingPolicyEngineModeEnum.All}> - ${gettext("ALL, all policies must match to grant access.")} + ${t`ALL, all policies must match to grant access.`} </option> </select> </ak-form-element-horizontal> diff --git a/web/src/pages/groups/GroupForm.ts b/web/src/pages/groups/GroupForm.ts index 620432542..62862e250 100644 --- a/web/src/pages/groups/GroupForm.ts +++ b/web/src/pages/groups/GroupForm.ts @@ -1,5 +1,5 @@ import { CoreApi, Group } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -18,9 +18,9 @@ export class GroupForm extends Form<Group> { getSuccessMessage(): string { if (this.group) { - return gettext("Successfully updated group."); + return t`Successfully updated group.`; } else { - return gettext("Successfully created group."); + return t`Successfully created group.`; } } @@ -40,7 +40,7 @@ export class GroupForm extends Form<Group> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.group?.name)}" class="pf-c-form-control" required> @@ -49,13 +49,13 @@ export class GroupForm extends Form<Group> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.group?.isSuperuser || false}> <label class="pf-c-check__label"> - ${gettext("Is superuser")} + ${t`Is superuser`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("Users added to this group will be superusers.")}</p> + <p class="pf-c-form__helper-text">${t`Users added to this group will be superusers.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Parent")} + label=${t`Parent`} ?required=${true} name="parent"> <select class="pf-c-form-control"> @@ -68,7 +68,7 @@ export class GroupForm extends Form<Group> { </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Members")} + label=${t`Members`} ?required=${true} name="users"> <select class="pf-c-form-control" multiple> @@ -83,10 +83,10 @@ export class GroupForm extends Form<Group> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Attributes")} + label=${t`Attributes`} name="attributes"> <ak-codemirror mode="yaml" value="${YAML.stringify(this.group?.attributes)}"> </ak-codemirror> diff --git a/web/src/pages/groups/GroupListPage.ts b/web/src/pages/groups/GroupListPage.ts index 173afcfd7..3c6c07a86 100644 --- a/web/src/pages/groups/GroupListPage.ts +++ b/web/src/pages/groups/GroupListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TablePage } from "../../elements/table/TablePage"; @@ -18,10 +18,10 @@ export class GroupListPage extends TablePage<Group> { return true; } pageTitle(): string { - return gettext("Groups"); + return t`Groups`; } pageDescription(): string { - return gettext("Group users together and give them permissions based on the membership."); + return t`Group users together and give them permissions based on the membership.`; } pageIcon(): string { return "pf-icon pf-icon-users"; @@ -41,8 +41,8 @@ export class GroupListPage extends TablePage<Group> { columns(): TableColumn[] { return [ - new TableColumn("Name", "name"), - new TableColumn("Parent", "parent"), + new TableColumn(t`Name`, t`name`), + new TableColumn(t`Parent`, t`parent`), new TableColumn("Members"), new TableColumn("Superuser privileges?"), new TableColumn(""), @@ -58,27 +58,27 @@ export class GroupListPage extends TablePage<Group> { html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Group")} + ${t`Update Group`} </span> <ak-group-form slot="form" .group=${item}> </ak-group-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Group")} + objectLabel=${t`Group`} .delete=${() => { return new CoreApi(DEFAULT_CONFIG).coreGroupsDelete({ groupUuid: item.pk || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -88,15 +88,15 @@ export class GroupListPage extends TablePage<Group> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Group")} + ${t`Create Group`} </span> <ak-group-form slot="form"> </ak-group-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/outposts/OutpostForm.ts b/web/src/pages/outposts/OutpostForm.ts index fcb71b87c..62e89d9c4 100644 --- a/web/src/pages/outposts/OutpostForm.ts +++ b/web/src/pages/outposts/OutpostForm.ts @@ -1,5 +1,5 @@ import { Outpost, OutpostsApi, ProvidersApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -18,9 +18,9 @@ export class OutpostForm extends Form<Outpost> { getSuccessMessage(): string { if (this.outpost) { - return gettext("Successfully updated outpost."); + return t`Successfully updated outpost.`; } else { - return gettext("Successfully created outpost."); + return t`Successfully created outpost.`; } } @@ -40,21 +40,21 @@ export class OutpostForm extends Form<Outpost> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.outpost?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Type")} + label=${t`Type`} ?required=${true} name="type"> <select class="pf-c-form-control"> - <option value="proxy" ?selected=${true}>${gettext("Proxy")}</option>s + <option value="proxy" ?selected=${true}>${t`Proxy`}</option>s </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Service connection")} + label=${t`Service connection`} name="serviceConnection"> <select class="pf-c-form-control"> <option value="" ?selected=${this.outpost?.serviceConnection === undefined}>---------</option> @@ -66,13 +66,13 @@ export class OutpostForm extends Form<Outpost> { }); }), html``)} </select> - <p class="pf-c-form__helper-text">${gettext("Selecting a service-connection enables the management of the outpost by authentik.")}</p> + <p class="pf-c-form__helper-text">${t`Selecting a service-connection enables the management of the outpost by authentik.`}</p> <p class="pf-c-form__helper-text"> - See <a _target="blank" href="https://goauthentik.io/docs/outposts/outposts">documentation</a>. + See <a target="_blank" href="https://goauthentik.io/docs/outposts/outposts">documentation</a>. </p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Providers")} + label=${t`Providers`} ?required=${true} name="providers"> <select class="pf-c-form-control" multiple> @@ -87,7 +87,7 @@ export class OutpostForm extends Form<Outpost> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> ${until(new OutpostsApi(DEFAULT_CONFIG).outpostsOutpostsDefaultSettings({}).then(config => { let fc = config.config; @@ -95,7 +95,7 @@ export class OutpostForm extends Form<Outpost> { fc = this.outpost.config; } return html`<ak-form-element-horizontal - label=${gettext("Configuration")} + label=${t`Configuration`} name="config"> <ak-codemirror mode="yaml" value="${YAML.stringify(fc)}"></ak-codemirror> </ak-form-element-horizontal>`; diff --git a/web/src/pages/outposts/OutpostHealth.ts b/web/src/pages/outposts/OutpostHealth.ts index bca22cd4c..238f35b60 100644 --- a/web/src/pages/outposts/OutpostHealth.ts +++ b/web/src/pages/outposts/OutpostHealth.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import { until } from "lit-html/directives/until"; import { OutpostsApi } from "authentik-api"; @@ -28,7 +28,7 @@ export class OutpostHealth extends LitElement { return html`<li> <ul> <li role="cell"> - <i class="fas fa-question-circle"></i>${gettext("Not available")} + <i class="fas fa-question-circle"></i>${t`Not available`} </li> </ul> </li>`; @@ -37,13 +37,13 @@ export class OutpostHealth extends LitElement { return html`<li> <ul> <li role="cell"> - <i class="fas fa-check pf-m-success"></i>${gettext(`Last seen: ${h.lastSeen?.toLocaleTimeString()}`)} + <i class="fas fa-check pf-m-success"></i>${t`Last seen: ${h.lastSeen?.toLocaleTimeString()}`} </li> <li role="cell"> ${h.versionOutdated ? html`<i class="fas fa-times pf-m-danger"></i> - ${gettext(`${h.version}, should be ${h.versionShould}`)}` : - html`<i class="fas fa-check pf-m-success"></i>${gettext(`Version: ${h.version || ""}`)}`} + ${t`${h.version}, should be ${h.versionShould}`}` : + html`<i class="fas fa-check pf-m-success"></i>${t`Version: ${h.version || ""}`}`} </li> </ul> </li>`; diff --git a/web/src/pages/outposts/OutpostListPage.ts b/web/src/pages/outposts/OutpostListPage.ts index ca5dce387..ffeeff5e5 100644 --- a/web/src/pages/outposts/OutpostListPage.ts +++ b/web/src/pages/outposts/OutpostListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { AKResponse } from "../../api/Client"; @@ -40,7 +40,7 @@ export class OutpostListPage extends TablePage<Outpost> { } columns(): TableColumn[] { return [ - new TableColumn("Name", "name"), + new TableColumn(t`Name`, t`name`), new TableColumn("Providers"), new TableColumn("Health and Version"), new TableColumn(""), @@ -60,39 +60,39 @@ export class OutpostListPage extends TablePage<Outpost> { html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Outpost")} + ${t`Update Outpost`} </span> <ak-outpost-form slot="form" .outpost=${item}> </ak-outpost-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Outpost")} + objectLabel=${t`Outpost`} .delete=${() => { return new OutpostsApi(DEFAULT_CONFIG).outpostsOutpostsDelete({ uuid: item.pk || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete> <ak-modal-button> <button slot="trigger" class="pf-c-button pf-m-tertiary"> - ${gettext("View Deployment Info")} + ${t`View Deployment Info`} </button> <div slot="modal"> <div class="pf-c-modal-box__header"> - <h1 class="pf-c-title pf-m-2xl" id="modal-title">${gettext("Outpost Deployment Info")}</h1> + <h1 class="pf-c-title pf-m-2xl" id="modal-title">${t`Outpost Deployment Info`}</h1> </div> <div class="pf-c-modal-box__body" id="modal-description"> - <p><a href="https://goauthentik.io/docs/outposts/outposts/#deploy">${gettext("View deployment documentation")}</a></p> + <p><a href="https://goauthentik.io/docs/outposts/outposts/#deploy">${t`View deployment documentation`}</a></p> <form class="pf-c-form"> <div class="pf-c-form__group"> <label class="pf-c-form__label" for="help-text-simple-form-name"> @@ -106,11 +106,11 @@ export class OutpostListPage extends TablePage<Outpost> { </label> <div> <ak-token-copy-button identifier="${ifDefined(item.tokenIdentifier)}"> - ${gettext("Click to copy token")} + ${t`Click to copy token`} </ak-token-copy-button> </div> </div> - <h3>${gettext("If your authentik Instance is using a self-signed certificate, set this value.")}</h3> + <h3>${t`If your authentik Instance is using a self-signed certificate, set this value.`}</h3> <div class="pf-c-form__group"> <label class="pf-c-form__label" for="help-text-simple-form-name"> <span class="pf-c-form__label-text">AUTHENTIK_INSECURE</span> @@ -120,7 +120,7 @@ export class OutpostListPage extends TablePage<Outpost> { </form> </div> <footer class="pf-c-modal-box__footer pf-m-align-left"> - <a class="pf-c-button pf-m-primary">${gettext("Close")}</a> + <a class="pf-c-button pf-m-primary">${t`Close`}</a> </footer> </div> </ak-modal-button>`, @@ -131,15 +131,15 @@ export class OutpostListPage extends TablePage<Outpost> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Outpost")} + ${t`Create Outpost`} </span> <ak-outpost-form slot="form"> </ak-outpost-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/outposts/ServiceConnectionDockerForm.ts b/web/src/pages/outposts/ServiceConnectionDockerForm.ts index 409e2aa4d..71c3a189b 100644 --- a/web/src/pages/outposts/ServiceConnectionDockerForm.ts +++ b/web/src/pages/outposts/ServiceConnectionDockerForm.ts @@ -1,5 +1,5 @@ import { CryptoApi, DockerServiceConnection, OutpostsApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -24,9 +24,9 @@ export class ServiceConnectionDockerForm extends Form<DockerServiceConnection> { getSuccessMessage(): string { if (this.sc) { - return gettext("Successfully updated service-connection."); + return t`Successfully updated service-connection.`; } else { - return gettext("Successfully created service-connection."); + return t`Successfully created service-connection.`; } } @@ -46,7 +46,7 @@ export class ServiceConnectionDockerForm extends Form<DockerServiceConnection> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.sc?.name)}" class="pf-c-form-control" required> @@ -55,20 +55,20 @@ export class ServiceConnectionDockerForm extends Form<DockerServiceConnection> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.sc?.local || false}> <label class="pf-c-check__label"> - ${gettext("Local")} + ${t`Local`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("If enabled, use the local connection. Required Docker socket/Kubernetes Integration.")}</p> + <p class="pf-c-form__helper-text">${t`If enabled, use the local connection. Required Docker socket/Kubernetes Integration.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Docker URL")} + label=${t`Docker URL`} ?required=${true} name="url"> <input type="text" value="${ifDefined(this.sc?.url)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Can be in the format of 'unix://' when connecting to a local docker daemon, or 'https://:2376' when connecting to a remote system.")}</p> + <p class="pf-c-form__helper-text">${t`Can be in the format of 'unix://' when connecting to a local docker daemon, or 'https://:2376' when connecting to a remote system.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("TLS Verification Certificate")} + label=${t`TLS Verification Certificate`} ?required=${true} name="tlsVerification"> <select class="pf-c-form-control"> @@ -81,10 +81,10 @@ export class ServiceConnectionDockerForm extends Form<DockerServiceConnection> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("CA which the endpoint's Certificate is verified against. Can be left empty for no validation.")}</p> + <p class="pf-c-form__helper-text">${t`CA which the endpoint's Certificate is verified against. Can be left empty for no validation.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("TLS Authentication Certificate")} + label=${t`TLS Authentication Certificate`} ?required=${true} name="tlsAuthentication"> <select class="pf-c-form-control"> @@ -97,7 +97,7 @@ export class ServiceConnectionDockerForm extends Form<DockerServiceConnection> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Certificate/Key used for authentication. Can be left empty for no authentication.")}</p> + <p class="pf-c-form__helper-text">${t`Certificate/Key used for authentication. Can be left empty for no authentication.`}</p> </ak-form-element-horizontal> </form>`; } diff --git a/web/src/pages/outposts/ServiceConnectionKubernetesForm.ts b/web/src/pages/outposts/ServiceConnectionKubernetesForm.ts index 5fc86dc91..667212cd2 100644 --- a/web/src/pages/outposts/ServiceConnectionKubernetesForm.ts +++ b/web/src/pages/outposts/ServiceConnectionKubernetesForm.ts @@ -1,5 +1,5 @@ import { KubernetesServiceConnection, OutpostsApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -25,9 +25,9 @@ export class ServiceConnectionKubernetesForm extends Form<KubernetesServiceConne getSuccessMessage(): string { if (this.sc) { - return gettext("Successfully updated service-connection."); + return t`Successfully updated service-connection.`; } else { - return gettext("Successfully created service-connection."); + return t`Successfully created service-connection.`; } } @@ -47,7 +47,7 @@ export class ServiceConnectionKubernetesForm extends Form<KubernetesServiceConne renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.sc?.name)}" class="pf-c-form-control" required> @@ -56,13 +56,13 @@ export class ServiceConnectionKubernetesForm extends Form<KubernetesServiceConne <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.sc?.local || false}> <label class="pf-c-check__label"> - ${gettext("Local")} + ${t`Local`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("If enabled, use the local connection. Required Docker socket/Kubernetes Integration.")}</p> + <p class="pf-c-form__helper-text">${t`If enabled, use the local connection. Required Docker socket/Kubernetes Integration.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Kubeconfig")} + label=${t`Kubeconfig`} name="kubeconfig"> <ak-codemirror mode="yaml" value="${YAML.stringify(this.sc?.kubeconfig)}"> </ak-codemirror> diff --git a/web/src/pages/outposts/ServiceConnectionListPage.ts b/web/src/pages/outposts/ServiceConnectionListPage.ts index a3afcbc73..a8f81380f 100644 --- a/web/src/pages/outposts/ServiceConnectionListPage.ts +++ b/web/src/pages/outposts/ServiceConnectionListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { AKResponse } from "../../api/Client"; @@ -45,9 +45,9 @@ export class OutpostServiceConnectionListPage extends TablePage<ServiceConnectio columns(): TableColumn[] { return [ - new TableColumn("Name", "name"), + new TableColumn(t`Name`, t`name`), new TableColumn("Type"), - new TableColumn("Local", "local"), + new TableColumn(t`Local`, t`local`), new TableColumn("State"), new TableColumn(""), ]; @@ -68,15 +68,15 @@ export class OutpostServiceConnectionListPage extends TablePage<ServiceConnectio if (state.healthy) { return html`<i class="fas fa-check pf-m-success"></i> ${state.version}`; } - return html`<i class="fas fa-times pf-m-danger"></i> ${gettext("Unhealthy")}`; + return html`<i class="fas fa-times pf-m-danger"></i> ${t`Unhealthy`}`; }), html`<ak-spinner></ak-spinner>`)}`, html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext(`Update ${item.verboseName}`)} + ${t`Update ${item.verboseName}`} </span> <ak-proxy-form slot="form" @@ -86,19 +86,19 @@ export class OutpostServiceConnectionListPage extends TablePage<ServiceConnectio type=${ifDefined(item.component)}> </ak-proxy-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Outpost Service-connection")} + objectLabel=${t`Outpost Service-connection`} .delete=${() => { return new OutpostsApi(DEFAULT_CONFIG).outpostsServiceConnectionsAllDelete({ uuid: item.pk || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -108,7 +108,7 @@ export class OutpostServiceConnectionListPage extends TablePage<ServiceConnectio return html` <ak-dropdown class="pf-c-dropdown"> <button class="pf-m-primary pf-c-dropdown__toggle" type="button"> - <span class="pf-c-dropdown__toggle-text">${gettext("Create")}</span> + <span class="pf-c-dropdown__toggle-text">${t`Create`}</span> <i class="fas fa-caret-down pf-c-dropdown__toggle-icon" aria-hidden="true"></i> </button> <ul class="pf-c-dropdown__menu" hidden> @@ -117,10 +117,10 @@ export class OutpostServiceConnectionListPage extends TablePage<ServiceConnectio return html`<li> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext(`Create ${type.name}`)} + ${t`Create ${type.name}`} </span> <ak-proxy-form slot="form" diff --git a/web/src/pages/policies/BoundPoliciesList.ts b/web/src/pages/policies/BoundPoliciesList.ts index 0a52ae9d4..4e10c3556 100644 --- a/web/src/pages/policies/BoundPoliciesList.ts +++ b/web/src/pages/policies/BoundPoliciesList.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { Table, TableColumn } from "../../elements/table/Table"; @@ -36,22 +36,22 @@ export class BoundPoliciesList extends Table<PolicyBinding> { columns(): TableColumn[] { return [ new TableColumn("Policy / User / Group"), - new TableColumn("Enabled", "enabled"), - new TableColumn("Order", "order"), - new TableColumn("Timeout", "timeout"), + new TableColumn(t`Enabled`, t`enabled`), + new TableColumn(t`Order`, t`order`), + new TableColumn(t`Timeout`, t`timeout`), new TableColumn(""), ]; } getPolicyUserGroupRow(item: PolicyBinding): string { if (item.policy) { - return gettext(`Policy ${item.policyObj?.name}`); + return t`Policy ${item.policyObj?.name}`; } else if (item.group) { - return gettext(`Group ${item.groupObj?.name}`); + return t`Group ${item.groupObj?.name}`; } else if (item.user) { - return gettext(`User ${item.userObj?.name}`); + return t`User ${item.userObj?.name}`; } else { - return gettext(""); + return t`-`; } } @@ -60,10 +60,10 @@ export class BoundPoliciesList extends Table<PolicyBinding> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext(`Update ${item.policyObj?.name}`)} + ${t`Update ${item.policyObj?.name}`} </span> <ak-proxy-form slot="form" @@ -73,35 +73,35 @@ export class BoundPoliciesList extends Table<PolicyBinding> { type=${ifDefined(item.policyObj?.component)}> </ak-proxy-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal>`; } else if (item.group) { return html`<ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Group")} + ${t`Update Group`} </span> <ak-group-form slot="form" .group=${item.groupObj}> </ak-group-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Edit Group")} + ${t`Edit Group`} </button> </ak-forms-modal>`; } else if (item.user) { return html`<ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update User")} + ${t`Update User`} </span> <ak-user-form slot="form" .user=${item.userObj}> </ak-user-form> <button slot="trigger" class="pf-m-secondary pf-c-button"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal>`; } else { @@ -119,49 +119,49 @@ export class BoundPoliciesList extends Table<PolicyBinding> { ${this.getObjectEditButton(item)} <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Binding")} + ${t`Update Binding`} </span> <ak-policy-binding-form slot="form" .binding=${item} targetPk=${ifDefined(this.target)}> </ak-policy-binding-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit Binding")} + ${t`Edit Binding`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Policy binding")} + objectLabel=${t`Policy binding`} .delete=${() => { return new PoliciesApi(DEFAULT_CONFIG).policiesBindingsDelete({ policyBindingUuid: item.pk || "", }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete Binding")} + ${t`Delete Binding`} </button> </ak-forms-delete>`, ]; } renderEmpty(): TemplateResult { - return super.renderEmpty(html`<ak-empty-state header=${gettext("No Policies bound.")} icon="pf-icon-module"> + return super.renderEmpty(html`<ak-empty-state header=${t`No Policies bound.`} icon="pf-icon-module"> <div slot="body"> - ${gettext("No policies are currently bound to this object.")} + ${t`No policies are currently bound to this object.`} </div> <div slot="primary"> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Binding")} + ${t`Create Binding`} </span> <ak-policy-binding-form slot="form" targetPk=${ifDefined(this.target)}> </ak-policy-binding-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create Binding")} + ${t`Create Binding`} </button> </ak-forms-modal> </div> @@ -172,7 +172,7 @@ export class BoundPoliciesList extends Table<PolicyBinding> { return html` <ak-dropdown class="pf-c-dropdown"> <button class="pf-m-primary pf-c-dropdown__toggle" type="button"> - <span class="pf-c-dropdown__toggle-text">${gettext("Create Policy")}</span> + <span class="pf-c-dropdown__toggle-text">${t`Create Policy`}</span> <i class="fas fa-caret-down pf-c-dropdown__toggle-icon" aria-hidden="true"></i> </button> <ul class="pf-c-dropdown__menu" hidden> @@ -181,10 +181,10 @@ export class BoundPoliciesList extends Table<PolicyBinding> { return html`<li> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext(`Create ${type.name}`)} + ${t`Create ${type.name}`} </span> <ak-proxy-form slot="form" @@ -202,15 +202,15 @@ export class BoundPoliciesList extends Table<PolicyBinding> { </ak-dropdown> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Binding")} + ${t`Create Binding`} </span> <ak-policy-binding-form slot="form" targetPk=${ifDefined(this.target)}> </ak-policy-binding-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create Binding")} + ${t`Create Binding`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/policies/PolicyBindingForm.ts b/web/src/pages/policies/PolicyBindingForm.ts index 645a6a678..de0326806 100644 --- a/web/src/pages/policies/PolicyBindingForm.ts +++ b/web/src/pages/policies/PolicyBindingForm.ts @@ -1,5 +1,5 @@ import { CoreApi, PoliciesApi, Policy, PolicyBinding } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -20,9 +20,9 @@ export class PolicyBindingForm extends Form<PolicyBinding> { getSuccessMessage(): string { if (this.binding) { - return gettext("Successfully updated binding."); + return t`Successfully updated binding.`; } else { - return gettext("Successfully created binding."); + return t`Successfully created binding.`; } } @@ -72,7 +72,7 @@ export class PolicyBindingForm extends Form<PolicyBinding> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Policy")} + label=${t`Policy`} name="policy"> <select class="pf-c-form-control"> <option value="" ?selected=${this.binding?.policy === undefined}>---------</option> @@ -84,7 +84,7 @@ export class PolicyBindingForm extends Form<PolicyBinding> { </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Group")} + label=${t`Group`} name="group"> <select class="pf-c-form-control"> <option value="" ?selected=${this.binding?.group === undefined}>---------</option> @@ -98,7 +98,7 @@ export class PolicyBindingForm extends Form<PolicyBinding> { </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("User")} + label=${t`User`} name="user"> <select class="pf-c-form-control"> <option value="" ?selected=${this.binding?.user === undefined}>---------</option> @@ -116,18 +116,18 @@ export class PolicyBindingForm extends Form<PolicyBinding> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.binding?.enabled || true}> <label class="pf-c-check__label"> - ${gettext("Enabled")} + ${t`Enabled`} </label> </div> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Order")} + label=${t`Order`} ?required=${true} name="order"> <input type="number" value="${until(this.getOrder(), this.binding?.order)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Timeout")} + label=${t`Timeout`} ?required=${true} name="timeout"> <input type="number" value="${first(this.binding?.timeout, 30)}" class="pf-c-form-control" required> diff --git a/web/src/pages/policies/PolicyListPage.ts b/web/src/pages/policies/PolicyListPage.ts index b989e61c9..6bdb63d4b 100644 --- a/web/src/pages/policies/PolicyListPage.ts +++ b/web/src/pages/policies/PolicyListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TablePage } from "../../elements/table/TablePage"; @@ -29,10 +29,10 @@ export class PolicyListPage extends TablePage<Policy> { return true; } pageTitle(): string { - return gettext("Policies"); + return t`Policies`; } pageDescription(): string { - return gettext("Allow users to use Applications based on properties, enforce Password Criteria and selectively apply Stages."); + return t`Allow users to use Applications based on properties, enforce Password Criteria and selectively apply Stages.`; } pageIcon(): string { return "pf-icon pf-icon-infrastructure"; @@ -52,7 +52,7 @@ export class PolicyListPage extends TablePage<Policy> { columns(): TableColumn[] { return [ - new TableColumn("Name", "name"), + new TableColumn(t`Name`, t`name`), new TableColumn("Type"), new TableColumn(""), ]; @@ -65,19 +65,19 @@ export class PolicyListPage extends TablePage<Policy> { ${(item.boundTo || 0) > 0 ? html`<i class="pf-icon pf-icon-ok"></i> <small> - ${gettext(`Assigned to ${item.boundTo} objects.`)} + ${t`Assigned to ${item.boundTo} objects.`} </small>`: html`<i class="pf-icon pf-icon-warning-triangle"></i> - <small>${gettext("Warning: Policy is not assigned.")}</small>`} + <small>${t`Warning: Policy is not assigned.`}</small>`} </div>`, html`${item.verboseName}`, html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext(`Update ${item.verboseName}`)} + ${t`Update ${item.verboseName}`} </span> <ak-proxy-form slot="form" @@ -87,32 +87,32 @@ export class PolicyListPage extends TablePage<Policy> { type=${ifDefined(item.component)}> </ak-proxy-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-modal .closeAfterSuccessfulSubmit=${false}> <span slot="submit"> - ${gettext("Test")} + ${t`Test`} </span> <span slot="header"> - ${gettext("Test Policy")} + ${t`Test Policy`} </span> <ak-policy-test-form slot="form" .policy=${item}> </ak-policy-test-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Test")} + ${t`Test`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Policy")} + objectLabel=${t`Policy`} .delete=${() => { return new PoliciesApi(DEFAULT_CONFIG).policiesAllDelete({ policyUuid: item.pk || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -122,7 +122,7 @@ export class PolicyListPage extends TablePage<Policy> { return html` <ak-dropdown class="pf-c-dropdown"> <button class="pf-m-primary pf-c-dropdown__toggle" type="button"> - <span class="pf-c-dropdown__toggle-text">${gettext("Create")}</span> + <span class="pf-c-dropdown__toggle-text">${t`Create`}</span> <i class="fas fa-caret-down pf-c-dropdown__toggle-icon" aria-hidden="true"></i> </button> <ul class="pf-c-dropdown__menu" hidden> @@ -131,10 +131,10 @@ export class PolicyListPage extends TablePage<Policy> { return html`<li> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext(`Create ${type.name}`)} + ${t`Create ${type.name}`} </span> <ak-proxy-form slot="form" diff --git a/web/src/pages/policies/PolicyTestForm.ts b/web/src/pages/policies/PolicyTestForm.ts index 93a4f9138..8c6654d10 100644 --- a/web/src/pages/policies/PolicyTestForm.ts +++ b/web/src/pages/policies/PolicyTestForm.ts @@ -1,5 +1,5 @@ import { CoreApi, PoliciesApi, Policy, PolicyTestResult } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -20,7 +20,7 @@ export class PolicyTestForm extends Form<PolicyTest> { result?: PolicyTestResult; getSuccessMessage(): string { - return gettext("Successfully sent test-request."); + return t`Successfully sent test-request.`; } send = (data: PolicyTest): Promise<PolicyTestResult> => { @@ -33,15 +33,15 @@ export class PolicyTestForm extends Form<PolicyTest> { renderResult(): TemplateResult { return html` <ak-form-element-horizontal - label=${gettext("Passing")}> + label=${t`Passing`}> <div class="pf-c-form__group-label"> <div class="c-form__horizontal-group"> - <span class="pf-c-form__label-text">${this.result?.passing ? gettext("Yes") : gettext("No")}</span> + <span class="pf-c-form__label-text">${this.result?.passing ? t`Yes` : t`No`}</span> </div> </div> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Messages")}> + label=${t`Messages`}> <div class="pf-c-form__group-label"> <div class="c-form__horizontal-group"> <ul> @@ -59,7 +59,7 @@ export class PolicyTestForm extends Form<PolicyTest> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("User")} + label=${t`User`} ?required=${true} name="user"> <select class="pf-c-form-control"> @@ -73,7 +73,7 @@ export class PolicyTestForm extends Form<PolicyTest> { </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Context")} + label=${t`Context`} name="context"> <ak-codemirror mode="yaml"> </ak-codemirror> diff --git a/web/src/pages/policies/dummy/DummyPolicyForm.ts b/web/src/pages/policies/dummy/DummyPolicyForm.ts index b1d18012f..85c26a476 100644 --- a/web/src/pages/policies/dummy/DummyPolicyForm.ts +++ b/web/src/pages/policies/dummy/DummyPolicyForm.ts @@ -1,5 +1,5 @@ import { DummyPolicy, PoliciesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -25,9 +25,9 @@ export class DummyPolicyForm extends Form<DummyPolicy> { getSuccessMessage(): string { if (this.policy) { - return gettext("Successfully updated policy."); + return t`Successfully updated policy.`; } else { - return gettext("Successfully created policy."); + return t`Successfully created policy.`; } } @@ -47,7 +47,7 @@ export class DummyPolicyForm extends Form<DummyPolicy> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.policy?.name || "")}" class="pf-c-form-control" required> @@ -56,34 +56,34 @@ export class DummyPolicyForm extends Form<DummyPolicy> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.executionLogging || false}> <label class="pf-c-check__label"> - ${gettext("Execution logging")} + ${t`Execution logging`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.")}</p> + <p class="pf-c-form__helper-text">${t`When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.`}</p> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Policy-specific settings")} + ${t`Policy-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal name="result"> <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.result || false}> <label class="pf-c-check__label"> - ${gettext("Pass policy?")} + ${t`Pass policy?`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.")}</p> + <p class="pf-c-form__helper-text">${t`When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Wait (min)")} + label=${t`Wait (min)`} ?required=${true} name="waitMin"> <input type="number" value="${first(this.policy?.waitMin, 1)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("The policy takes a random time to execute. This controls the minimum time it will take.")}</p> + <p class="pf-c-form__helper-text">${t`The policy takes a random time to execute. This controls the minimum time it will take.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Wait (max)")} + label=${t`Wait (max)`} ?required=${true} name="waitMax"> <input type="number" value="${first(this.policy?.waitMax, 5)}" class="pf-c-form-control" required> diff --git a/web/src/pages/policies/event_matcher/EventMatcherPolicyForm.ts b/web/src/pages/policies/event_matcher/EventMatcherPolicyForm.ts index aa74ad36f..457cd3dab 100644 --- a/web/src/pages/policies/event_matcher/EventMatcherPolicyForm.ts +++ b/web/src/pages/policies/event_matcher/EventMatcherPolicyForm.ts @@ -1,5 +1,5 @@ import { AdminApi, EventMatcherPolicy, EventsApi, PoliciesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -25,9 +25,9 @@ export class EventMatcherPolicyForm extends Form<EventMatcherPolicy> { getSuccessMessage(): string { if (this.policy) { - return gettext("Successfully updated policy."); + return t`Successfully updated policy.`; } else { - return gettext("Successfully created policy."); + return t`Successfully created policy.`; } } @@ -47,7 +47,7 @@ export class EventMatcherPolicyForm extends Form<EventMatcherPolicy> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.policy?.name || "")}" class="pf-c-form-control" required> @@ -56,18 +56,18 @@ export class EventMatcherPolicyForm extends Form<EventMatcherPolicy> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.executionLogging || false}> <label class="pf-c-check__label"> - ${gettext("Execution logging")} + ${t`Execution logging`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.")}</p> + <p class="pf-c-form__helper-text">${t`When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.`}</p> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Policy-specific settings")} + ${t`Policy-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Action")} + label=${t`Action`} name="action"> <select class="pf-c-form-control"> <option value="" ?selected=${this.policy?.action === undefined}>---------</option> @@ -77,16 +77,16 @@ export class EventMatcherPolicyForm extends Form<EventMatcherPolicy> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Match created events with this action type. When left empty, all action types will be matched.")}</p> + <p class="pf-c-form__helper-text">${t`Match created events with this action type. When left empty, all action types will be matched.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Client IP")} + label=${t`Client IP`} name="clientIp"> <input type="text" value="${ifDefined(this.policy?.clientIp || "")}" class="pf-c-form-control"> - <p class="pf-c-form__helper-text">${gettext("Matches Event's Client IP (strict matching, for network matching use an Expression Policy.")}</p> + <p class="pf-c-form__helper-text">${t`Matches Event's Client IP (strict matching, for network matching use an Expression Policy.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("App")} + label=${t`App`} name="app"> <select class="pf-c-form-control"> <option value="" ?selected=${this.policy?.app === undefined}>---------</option> @@ -96,7 +96,7 @@ export class EventMatcherPolicyForm extends Form<EventMatcherPolicy> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Match events created by selected application. When left empty, all applications are matched.")}</p> + <p class="pf-c-form__helper-text">${t`Match events created by selected application. When left empty, all applications are matched.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/policies/expiry/ExpiryPolicyForm.ts b/web/src/pages/policies/expiry/ExpiryPolicyForm.ts index 32b620aa3..921252ea9 100644 --- a/web/src/pages/policies/expiry/ExpiryPolicyForm.ts +++ b/web/src/pages/policies/expiry/ExpiryPolicyForm.ts @@ -1,5 +1,5 @@ import { PasswordExpiryPolicy, PoliciesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -24,9 +24,9 @@ export class PasswordExpiryPolicyForm extends Form<PasswordExpiryPolicy> { getSuccessMessage(): string { if (this.policy) { - return gettext("Successfully updated policy."); + return t`Successfully updated policy.`; } else { - return gettext("Successfully created policy."); + return t`Successfully created policy.`; } } @@ -46,7 +46,7 @@ export class PasswordExpiryPolicyForm extends Form<PasswordExpiryPolicy> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.policy?.name || "")}" class="pf-c-form-control" required> @@ -55,18 +55,18 @@ export class PasswordExpiryPolicyForm extends Form<PasswordExpiryPolicy> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.executionLogging || false}> <label class="pf-c-check__label"> - ${gettext("Execution logging")} + ${t`Execution logging`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.")}</p> + <p class="pf-c-form__helper-text">${t`When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.`}</p> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Policy-specific settings")} + ${t`Policy-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Maximum age (in days)")} + label=${t`Maximum age (in days)`} ?required=${true} name="days"> <input type="number" value="${ifDefined(this.policy?.days || "")}" class="pf-c-form-control" required> @@ -75,7 +75,7 @@ export class PasswordExpiryPolicyForm extends Form<PasswordExpiryPolicy> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.denyOnly || false}> <label class="pf-c-check__label"> - ${gettext("Only fail the policy, don't set user's password.")} + ${t`Only fail the policy, don't set user's password.`} </label> </div> </ak-form-element-horizontal> diff --git a/web/src/pages/policies/expression/ExpressionPolicyForm.ts b/web/src/pages/policies/expression/ExpressionPolicyForm.ts index 72e22e709..776fc13c1 100644 --- a/web/src/pages/policies/expression/ExpressionPolicyForm.ts +++ b/web/src/pages/policies/expression/ExpressionPolicyForm.ts @@ -1,5 +1,5 @@ import { ExpressionPolicy, PoliciesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -25,9 +25,9 @@ export class ExpressionPolicyForm extends Form<ExpressionPolicy> { getSuccessMessage(): string { if (this.policy) { - return gettext("Successfully updated policy."); + return t`Successfully updated policy.`; } else { - return gettext("Successfully created policy."); + return t`Successfully created policy.`; } } @@ -47,7 +47,7 @@ export class ExpressionPolicyForm extends Form<ExpressionPolicy> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.policy?.name || "")}" class="pf-c-form-control" required> @@ -56,18 +56,18 @@ export class ExpressionPolicyForm extends Form<ExpressionPolicy> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.executionLogging || false}> <label class="pf-c-check__label"> - ${gettext("Execution logging")} + ${t`Execution logging`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.")}</p> + <p class="pf-c-form__helper-text">${t`When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.`}</p> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Policy-specific settings")} + ${t`Policy-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Expression")} + label=${t`Expression`} name="expression"> <ak-codemirror mode="python" value="${ifDefined(this.policy?.expression)}"> </ak-codemirror> diff --git a/web/src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts b/web/src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts index 25c5aa0b5..182f6f7f2 100644 --- a/web/src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts +++ b/web/src/pages/policies/hibp/HaveIBeenPwnedPolicyForm.ts @@ -1,5 +1,5 @@ import { HaveIBeenPwendPolicy, PoliciesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -25,9 +25,9 @@ export class HaveIBeenPwnedPolicyForm extends Form<HaveIBeenPwendPolicy> { getSuccessMessage(): string { if (this.policy) { - return gettext("Successfully updated policy."); + return t`Successfully updated policy.`; } else { - return gettext("Successfully created policy."); + return t`Successfully created policy.`; } } @@ -47,7 +47,7 @@ export class HaveIBeenPwnedPolicyForm extends Form<HaveIBeenPwendPolicy> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.policy?.name || "")}" class="pf-c-form-control" required> @@ -56,29 +56,29 @@ export class HaveIBeenPwnedPolicyForm extends Form<HaveIBeenPwendPolicy> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.executionLogging || false}> <label class="pf-c-check__label"> - ${gettext("Execution logging")} + ${t`Execution logging`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.")}</p> + <p class="pf-c-form__helper-text">${t`When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.`}</p> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Policy-specific settings")} + ${t`Policy-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Password field")} + label=${t`Password field`} ?required=${true} name="passwordField"> <input type="text" value="${ifDefined(this.policy?.passwordField || "password")}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Field key to check, field keys defined in Prompt stages are available.")}</p> + <p class="pf-c-form__helper-text">${t`Field key to check, field keys defined in Prompt stages are available.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Allowed count")} + label=${t`Allowed count`} ?required=${true} name="allowedCount"> <input type="number" value="${first(this.policy?.allowedCount, 0)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Allow up to N occurrences in the HIBP database.")}</p> + <p class="pf-c-form__helper-text">${t`Allow up to N occurrences in the HIBP database.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/policies/password/PasswordPolicyForm.ts b/web/src/pages/policies/password/PasswordPolicyForm.ts index 628ecfdcc..2221c3868 100644 --- a/web/src/pages/policies/password/PasswordPolicyForm.ts +++ b/web/src/pages/policies/password/PasswordPolicyForm.ts @@ -1,5 +1,5 @@ import { PasswordPolicy, PoliciesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -25,9 +25,9 @@ export class PasswordPolicyForm extends Form<PasswordPolicy> { getSuccessMessage(): string { if (this.policy) { - return gettext("Successfully updated policy."); + return t`Successfully updated policy.`; } else { - return gettext("Successfully created policy."); + return t`Successfully created policy.`; } } @@ -47,7 +47,7 @@ export class PasswordPolicyForm extends Form<PasswordPolicy> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.policy?.name || "")}" class="pf-c-form-control" required> @@ -56,50 +56,50 @@ export class PasswordPolicyForm extends Form<PasswordPolicy> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.executionLogging || false}> <label class="pf-c-check__label"> - ${gettext("Execution logging")} + ${t`Execution logging`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.")}</p> + <p class="pf-c-form__helper-text">${t`When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.`}</p> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Policy-specific settings")} + ${t`Policy-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Password field")} + label=${t`Password field`} ?required=${true} name="passwordField"> <input type="text" value="${ifDefined(this.policy?.passwordField || "password")}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Field key to check, field keys defined in Prompt stages are available.")}</p> + <p class="pf-c-form__helper-text">${t`Field key to check, field keys defined in Prompt stages are available.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Minimum length")} + label=${t`Minimum length`} ?required=${true} name="lengthMin"> <input type="number" value="${first(this.policy?.lengthMin, 10)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Minimum amount of Uppercase Characters")} + label=${t`Minimum amount of Uppercase Characters`} ?required=${true} name="amountUppercase"> <input type="number" value="${first(this.policy?.amountUppercase, 2)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Minimum amount of Lowercase Characters")} + label=${t`Minimum amount of Lowercase Characters`} ?required=${true} name="amountLowercase"> <input type="number" value="${first(this.policy?.amountLowercase, 2)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Minimum amount of Symbols Characters")} + label=${t`Minimum amount of Symbols Characters`} ?required=${true} name="amountSymbols"> <input type="number" value="${first(this.policy?.amountSymbols, 2)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Error message")} + label=${t`Error message`} ?required=${true} name="errorMessage"> <input type="text" value="${ifDefined(this.policy?.errorMessage)}" class="pf-c-form-control" required> @@ -108,15 +108,15 @@ export class PasswordPolicyForm extends Form<PasswordPolicy> { </ak-form-group> <ak-form-group> <span slot="header"> - ${gettext("Advanced settings")} + ${t`Advanced settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Symbol charset")} + label=${t`Symbol charset`} ?required=${true} name="symbolCharset"> <input type="text" value="${ifDefined(this.policy?.symbolCharset || "!\\\"#$%&'()*+,-./:;<=>?@[]^_`{|}~ ")}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Characters which are considered as symbols.")}</p> + <p class="pf-c-form__helper-text">${t`Characters which are considered as symbols.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/policies/reputation/ReputationPolicyForm.ts b/web/src/pages/policies/reputation/ReputationPolicyForm.ts index 18c6248d8..eab6f70fc 100644 --- a/web/src/pages/policies/reputation/ReputationPolicyForm.ts +++ b/web/src/pages/policies/reputation/ReputationPolicyForm.ts @@ -1,5 +1,5 @@ import { ReputationPolicy, PoliciesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -24,9 +24,9 @@ export class ReputationPolicyForm extends Form<ReputationPolicy> { getSuccessMessage(): string { if (this.policy) { - return gettext("Successfully updated policy."); + return t`Successfully updated policy.`; } else { - return gettext("Successfully created policy."); + return t`Successfully created policy.`; } } @@ -46,7 +46,7 @@ export class ReputationPolicyForm extends Form<ReputationPolicy> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.policy?.name || "")}" class="pf-c-form-control" required> @@ -55,21 +55,21 @@ export class ReputationPolicyForm extends Form<ReputationPolicy> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.executionLogging || false}> <label class="pf-c-check__label"> - ${gettext("Execution logging")} + ${t`Execution logging`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.")}</p> + <p class="pf-c-form__helper-text">${t`When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged.`}</p> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Policy-specific settings")} + ${t`Policy-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal name="checkIp"> <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.checkIp || false}> <label class="pf-c-check__label"> - ${gettext("Check IP")} + ${t`Check IP`} </label> </div> </ak-form-element-horizontal> @@ -77,12 +77,12 @@ export class ReputationPolicyForm extends Form<ReputationPolicy> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.policy?.checkUsername || false}> <label class="pf-c-check__label"> - ${gettext("Check Username")} + ${t`Check Username`} </label> </div> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Threshold")} + label=${t`Threshold`} ?required=${true} name="threshold"> <input type="number" value="${ifDefined(this.policy?.threshold || -5)}" class="pf-c-form-control" required> diff --git a/web/src/pages/property-mappings/PropertyMappingLDAPForm.ts b/web/src/pages/property-mappings/PropertyMappingLDAPForm.ts index 6b0bba82e..786daf1ed 100644 --- a/web/src/pages/property-mappings/PropertyMappingLDAPForm.ts +++ b/web/src/pages/property-mappings/PropertyMappingLDAPForm.ts @@ -1,5 +1,5 @@ import { LDAPPropertyMapping, PropertymappingsApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -24,9 +24,9 @@ export class PropertyMappingLDAPForm extends Form<LDAPPropertyMapping> { getSuccessMessage(): string { if (this.mapping) { - return gettext("Successfully updated mapping."); + return t`Successfully updated mapping.`; } else { - return gettext("Successfully created mapping."); + return t`Successfully created mapping.`; } } @@ -46,20 +46,20 @@ export class PropertyMappingLDAPForm extends Form<LDAPPropertyMapping> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.mapping?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Object field")} + label=${t`Object field`} ?required=${true} name="objectField"> <input type="text" value="${ifDefined(this.mapping?.objectField)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Field of the user object this value is written to.")}</p> + <p class="pf-c-form__helper-text">${t`Field of the user object this value is written to.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Expression")} + label=${t`Expression`} name="expression"> <ak-codemirror mode="python" value="${ifDefined(this.mapping?.expression)}"> </ak-codemirror> diff --git a/web/src/pages/property-mappings/PropertyMappingListPage.ts b/web/src/pages/property-mappings/PropertyMappingListPage.ts index fbf10fb20..ae840db2c 100644 --- a/web/src/pages/property-mappings/PropertyMappingListPage.ts +++ b/web/src/pages/property-mappings/PropertyMappingListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TablePage } from "../../elements/table/TablePage"; @@ -25,10 +25,10 @@ export class PropertyMappingListPage extends TablePage<PropertyMapping> { return true; } pageTitle(): string { - return gettext("Property Mappings"); + return t`Property Mappings`; } pageDescription(): string { - return gettext("Control how authentik exposes and interprets information."); + return t`Control how authentik exposes and interprets information.`; } pageIcon(): string { return "pf-icon pf-icon-blueprint"; @@ -52,8 +52,8 @@ export class PropertyMappingListPage extends TablePage<PropertyMapping> { columns(): TableColumn[] { return [ - new TableColumn("Name", "name"), - new TableColumn("Type", "type"), + new TableColumn(t`Name`, t`name`), + new TableColumn(t`Type`, t`type`), new TableColumn(""), ]; } @@ -65,10 +65,10 @@ export class PropertyMappingListPage extends TablePage<PropertyMapping> { html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext(`Update ${item.verboseName}`)} + ${t`Update ${item.verboseName}`} </span> <ak-proxy-form slot="form" @@ -78,32 +78,32 @@ export class PropertyMappingListPage extends TablePage<PropertyMapping> { type=${ifDefined(item.component)}> </ak-proxy-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-modal .closeAfterSuccessfulSubmit=${false}> <span slot="submit"> - ${gettext("Test")} + ${t`Test`} </span> <span slot="header"> - ${gettext("Test Property Mapping")} + ${t`Test Property Mapping`} </span> <ak-property-mapping-test-form slot="form" .mapping=${item}> </ak-property-mapping-test-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Test")} + ${t`Test`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Property Mapping")} + objectLabel=${t`Property Mapping`} .delete=${() => { return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsAllDelete({ pmUuid: item.pk || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -113,7 +113,7 @@ export class PropertyMappingListPage extends TablePage<PropertyMapping> { return html` <ak-dropdown class="pf-c-dropdown"> <button class="pf-m-primary pf-c-dropdown__toggle" type="button"> - <span class="pf-c-dropdown__toggle-text">${gettext("Create")}</span> + <span class="pf-c-dropdown__toggle-text">${t`Create`}</span> <i class="fas fa-caret-down pf-c-dropdown__toggle-icon" aria-hidden="true"></i> </button> <ul class="pf-c-dropdown__menu" hidden> @@ -122,10 +122,10 @@ export class PropertyMappingListPage extends TablePage<PropertyMapping> { return html`<li> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext(`Create ${type.name}`)} + ${t`Create ${type.name}`} </span> <ak-proxy-form slot="form" @@ -154,7 +154,7 @@ export class PropertyMappingListPage extends TablePage<PropertyMapping> { this.page = 1; this.fetch(); }} /> - <label class="pf-c-check__label" for="hide-managed">${gettext("Hide managed mappings")}</label> + <label class="pf-c-check__label" for="hide-managed">${t`Hide managed mappings`}</label> </div> </div> </div> diff --git a/web/src/pages/property-mappings/PropertyMappingSAMLForm.ts b/web/src/pages/property-mappings/PropertyMappingSAMLForm.ts index dd26006fe..baee22239 100644 --- a/web/src/pages/property-mappings/PropertyMappingSAMLForm.ts +++ b/web/src/pages/property-mappings/PropertyMappingSAMLForm.ts @@ -1,5 +1,5 @@ import { SAMLPropertyMapping, PropertymappingsApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -24,9 +24,9 @@ export class PropertyMappingLDAPForm extends Form<SAMLPropertyMapping> { getSuccessMessage(): string { if (this.mapping) { - return gettext("Successfully updated mapping."); + return t`Successfully updated mapping.`; } else { - return gettext("Successfully created mapping."); + return t`Successfully created mapping.`; } } @@ -46,30 +46,30 @@ export class PropertyMappingLDAPForm extends Form<SAMLPropertyMapping> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.mapping?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("SAML Attribute Name")} + label=${t`SAML Attribute Name`} ?required=${true} name="samlName"> <input type="text" value="${ifDefined(this.mapping?.samlName)}" class="pf-c-form-control" required> <p class="pf-c-form__helper-text"> - ${gettext("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.")} + ${t`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.`} </p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Friendly Name")} + label=${t`Friendly Name`} name="friendlyName"> <input type="text" value="${ifDefined(this.mapping?.friendlyName || "")}" class="pf-c-form-control"> <p class="pf-c-form__helper-text"> - ${gettext("Optionally set the `FriendlyName` value of the Assertion attribute.")} + ${t`Optionally set the 'FriendlyName' value of the Assertion attribute.`} </p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Expression")} + label=${t`Expression`} name="expression"> <ak-codemirror mode="python" value="${ifDefined(this.mapping?.expression)}"> </ak-codemirror> diff --git a/web/src/pages/property-mappings/PropertyMappingScopeForm.ts b/web/src/pages/property-mappings/PropertyMappingScopeForm.ts index 40cc3417b..00c39530e 100644 --- a/web/src/pages/property-mappings/PropertyMappingScopeForm.ts +++ b/web/src/pages/property-mappings/PropertyMappingScopeForm.ts @@ -1,5 +1,5 @@ import { ScopeMapping, PropertymappingsApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -24,9 +24,9 @@ export class PropertyMappingScopeForm extends Form<ScopeMapping> { getSuccessMessage(): string { if (this.mapping) { - return gettext("Successfully updated mapping."); + return t`Successfully updated mapping.`; } else { - return gettext("Successfully created mapping."); + return t`Successfully created mapping.`; } } @@ -46,27 +46,27 @@ export class PropertyMappingScopeForm extends Form<ScopeMapping> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.mapping?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Scope name")} + label=${t`Scope name`} ?required=${true} name="scopeName"> <input type="text" value="${ifDefined(this.mapping?.scopeName)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Scope which the client can specify to access these properties.")}</p> + <p class="pf-c-form__helper-text">${t`Scope which the client can specify to access these properties.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Description")} + label=${t`Description`} ?required=${true} name="description"> <input type="text" value="${ifDefined(this.mapping?.description)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Description shown to the user when consenting. If left empty, the user won't be informed.")}</p> + <p class="pf-c-form__helper-text">${t`Description shown to the user when consenting. If left empty, the user won't be informed.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Expression")} + label=${t`Expression`} name="expression"> <ak-codemirror mode="python" value="${ifDefined(this.mapping?.expression)}"> </ak-codemirror> diff --git a/web/src/pages/property-mappings/PropertyMappingTestForm.ts b/web/src/pages/property-mappings/PropertyMappingTestForm.ts index e90a60cf6..5e64bb70d 100644 --- a/web/src/pages/property-mappings/PropertyMappingTestForm.ts +++ b/web/src/pages/property-mappings/PropertyMappingTestForm.ts @@ -1,5 +1,5 @@ import { CoreApi, PropertyMapping, PropertymappingsApi, PropertyMappingTestResult } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -20,7 +20,7 @@ export class PolicyTestForm extends Form<PolicyTest> { result?: PropertyMappingTestResult; getSuccessMessage(): string { - return gettext("Successfully sent test-request."); + return t`Successfully sent test-request.`; } send = (data: PolicyTest): Promise<PropertyMappingTestResult> => { @@ -32,7 +32,7 @@ export class PolicyTestForm extends Form<PolicyTest> { renderResult(): TemplateResult { return html`<ak-form-element-horizontal - label=${gettext("Result")}> + label=${t`Result`}> ${this.result?.successful ? html`<ak-codemirror mode="javascript" ?readOnly=${true} value="${ifDefined(this.result?.result)}"> </ak-codemirror>`: @@ -48,7 +48,7 @@ export class PolicyTestForm extends Form<PolicyTest> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("User")} + label=${t`User`} ?required=${true} name="user"> <select class="pf-c-form-control"> @@ -62,7 +62,7 @@ export class PolicyTestForm extends Form<PolicyTest> { </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Context")} + label=${t`Context`} name="context"> <ak-codemirror mode="yaml"> </ak-codemirror> diff --git a/web/src/pages/providers/ProviderListPage.ts b/web/src/pages/providers/ProviderListPage.ts index 6bf8aec44..5d29fcd30 100644 --- a/web/src/pages/providers/ProviderListPage.ts +++ b/web/src/pages/providers/ProviderListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TablePage } from "../../elements/table/TablePage"; @@ -25,10 +25,10 @@ export class ProviderListPage extends TablePage<Provider> { return true; } pageTitle(): string { - return gettext("Provider"); + return t`Provider`; } pageDescription(): string { - return gettext("Provide support for protocols like SAML and OAuth to assigned applications."); + return t`Provide support for protocols like SAML and OAuth to assigned applications.`; } pageIcon(): string { return "pf-icon pf-icon-integration"; @@ -48,9 +48,9 @@ export class ProviderListPage extends TablePage<Provider> { columns(): TableColumn[] { return [ - new TableColumn("Name", "name"), + new TableColumn(t`Name`, t`name`), new TableColumn("Application"), - new TableColumn("Type", "type"), + new TableColumn(t`Type`, t`type`), new TableColumn(""), ]; } @@ -62,18 +62,18 @@ export class ProviderListPage extends TablePage<Provider> { </a>`, item.assignedApplicationName ? html`<i class="pf-icon pf-icon-ok"></i> - ${gettext("Assigned to application ")} + ${t`Assigned to application `} <a href="#/core/applications/${item.assignedApplicationSlug}">${item.assignedApplicationName}</a>` : html`<i class="pf-icon pf-icon-warning-triangle"></i> - ${gettext("Warning: Provider not assigned to any application.")}`, + ${t`Warning: Provider not assigned to any application.`}`, html`${item.verboseName}`, html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext(`Update ${item.verboseName}`)} + ${t`Update ${item.verboseName}`} </span> <ak-proxy-form slot="form" @@ -83,19 +83,19 @@ export class ProviderListPage extends TablePage<Provider> { type=${ifDefined(item.component)}> </ak-proxy-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Source")} + objectLabel=${t`Source`} .delete=${() => { return new ProvidersApi(DEFAULT_CONFIG).providersAllDelete({ id: item.pk || 0 }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -105,7 +105,7 @@ export class ProviderListPage extends TablePage<Provider> { return html` <ak-dropdown class="pf-c-dropdown"> <button class="pf-m-primary pf-c-dropdown__toggle" type="button"> - <span class="pf-c-dropdown__toggle-text">${gettext("Create")}</span> + <span class="pf-c-dropdown__toggle-text">${t`Create`}</span> <i class="fas fa-caret-down pf-c-dropdown__toggle-icon" aria-hidden="true"></i> </button> <ul class="pf-c-dropdown__menu" hidden> @@ -114,10 +114,10 @@ export class ProviderListPage extends TablePage<Provider> { return html`<li> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext(`Create ${type.name}`)} + ${t`Create ${type.name}`} </span> <ak-proxy-form slot="form" diff --git a/web/src/pages/providers/RelatedApplicationButton.ts b/web/src/pages/providers/RelatedApplicationButton.ts index 6417f5de2..3dda15672 100644 --- a/web/src/pages/providers/RelatedApplicationButton.ts +++ b/web/src/pages/providers/RelatedApplicationButton.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import { Provider } from "authentik-api"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; @@ -26,15 +26,15 @@ export class RelatedApplicationButton extends LitElement { } return html`<ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Application")} + ${t`Create Application`} </span> <ak-application-form slot="form" .provider=${this.provider?.pk}> </ak-application-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal>`; } diff --git a/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts b/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts index 298516650..648d607bf 100644 --- a/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts +++ b/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts @@ -1,5 +1,5 @@ import { CryptoApi, FlowDesignationEnum, FlowsApi, OAuth2Provider, OAuth2ProviderClientTypeEnum, OAuth2ProviderIssuerModeEnum, OAuth2ProviderJwtAlgEnum, OAuth2ProviderSubModeEnum, PropertymappingsApi, ProvidersApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -30,9 +30,9 @@ export class OAuth2ProviderFormPage extends Form<OAuth2Provider> { getSuccessMessage(): string { if (this.provider) { - return gettext("Successfully updated provider."); + return t`Successfully updated provider.`; } else { - return gettext("Successfully created provider."); + return t`Successfully created provider.`; } } @@ -52,13 +52,13 @@ export class OAuth2ProviderFormPage extends Form<OAuth2Provider> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.provider?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Authorization flow")} + label=${t`Authorization flow`} ?required=${true} name="authorizationFlow"> <select class="pf-c-form-control"> @@ -71,16 +71,16 @@ export class OAuth2ProviderFormPage extends Form<OAuth2Provider> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow used when authorizing this provider.")}</p> + <p class="pf-c-form__helper-text">${t`Flow used when authorizing this provider.`}</p> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Protocol settings")} + ${t`Protocol settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Client type")} + label=${t`Client type`} ?required=${true} name="clientType"> <select class="pf-c-form-control" @change=${(ev: Event) => { @@ -92,28 +92,28 @@ export class OAuth2ProviderFormPage extends Form<OAuth2Provider> { } }}> <option value=${OAuth2ProviderClientTypeEnum.Confidential} ?selected=${this.provider?.clientType === OAuth2ProviderClientTypeEnum.Confidential}> - ${gettext("Confidential")} + ${t`Confidential`} </option> <option value=${OAuth2ProviderClientTypeEnum.Public} ?selected=${this.provider?.clientType === OAuth2ProviderClientTypeEnum.Public}> - ${gettext("Public")} + ${t`Public`} </option> </select> - <p class="pf-c-form__helper-text">${gettext("Confidential clients are capable of maintaining the confidentiality of their credentials. Public clients are incapable.")}</p> + <p class="pf-c-form__helper-text">${t`Confidential clients are capable of maintaining the confidentiality of their credentials. Public clients are incapable.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Client ID")} + label=${t`Client ID`} ?required=${true} name="clientId"> <input type="text" value="${first(this.provider?.clientId, randomString(40))}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal ?hidden=${!this.showClientSecret} - label=${gettext("Client Secret")} + label=${t`Client Secret`} name="clientSecret"> <input type="text" value="${first(this.provider?.clientSecret, randomString(128))}" class="pf-c-form-control"> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Redirect URIs")} + label=${t`Redirect URIs`} name="redirectUris"> <textarea class="pf-c-form-control">${this.provider?.redirectUris}</textarea> </ak-form-element-horizontal> @@ -122,31 +122,31 @@ export class OAuth2ProviderFormPage extends Form<OAuth2Provider> { <ak-form-group> <span slot="header"> - ${gettext("Advanced protocol settings")} + ${t`Advanced protocol settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Token validity")} + label=${t`Token validity`} ?required=${true} name="tokenValidity"> <input type="text" value="${this.provider?.tokenValidity || "minutes=10"}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("JWT Algorithm")} + label=${t`JWT Algorithm`} ?required=${true} name="jwtAlg"> <select class="pf-c-form-control"> <option value=${OAuth2ProviderJwtAlgEnum.Rs256} ?selected=${this.provider?.jwtAlg === OAuth2ProviderJwtAlgEnum.Rs256}> - ${gettext("RS256 (Asymmetric Encryption)")} + ${t`RS256 (Asymmetric Encryption)`} </option> <option value=${OAuth2ProviderJwtAlgEnum.Hs256} ?selected=${this.provider?.jwtAlg === OAuth2ProviderJwtAlgEnum.Hs256}> - ${gettext("HS256 (Symmetric Encryption)")} + ${t`HS256 (Symmetric Encryption)`} </option> </select> - <p class="pf-c-form__helper-text">${gettext("Algorithm used to sign the JWT Tokens.")}</p> + <p class="pf-c-form__helper-text">${t`Algorithm used to sign the JWT Tokens.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Scopes")} + label=${t`Scopes`} ?required=${true} name="propertyMappings"> <select class="pf-c-form-control" multiple> @@ -161,11 +161,11 @@ export class OAuth2ProviderFormPage extends Form<OAuth2Provider> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Select which scopes can be used by the client. The client stil has to specify the scope to access the data.")}</p> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Select which scopes can be used by the client. The client stil has to specify the scope to access the data.`}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("RSA Key")} + label=${t`RSA Key`} ?required=${true} name="rsaKey"> <select class="pf-c-form-control"> @@ -179,53 +179,53 @@ export class OAuth2ProviderFormPage extends Form<OAuth2Provider> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Key used to sign the tokens. Only required when JWT Algorithm is set to RS256.")}</p> + <p class="pf-c-form__helper-text">${t`Key used to sign the tokens. Only required when JWT Algorithm is set to RS256.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Subject mode")} + label=${t`Subject mode`} ?required=${true} name="subMode"> <select class="pf-c-form-control"> <option value="${OAuth2ProviderSubModeEnum.HashedUserId}" ?selected=${this.provider?.subMode === OAuth2ProviderSubModeEnum.HashedUserId}> - ${gettext("Based on the Hashed User ID")} + ${t`Based on the Hashed User ID`} </option> <option value="${OAuth2ProviderSubModeEnum.UserUsername}" ?selected=${this.provider?.subMode === OAuth2ProviderSubModeEnum.UserUsername}> - ${gettext("Based on the username")} + ${t`Based on the username`} </option> <option value="${OAuth2ProviderSubModeEnum.UserEmail}" ?selected=${this.provider?.subMode === OAuth2ProviderSubModeEnum.UserEmail}> - ${gettext("Based on the User's Email. This is recommended over the UPN method.")} + ${t`Based on the User's Email. This is recommended over the UPN method.`} </option> <option value="${OAuth2ProviderSubModeEnum.UserUpn}" ?selected=${this.provider?.subMode === OAuth2ProviderSubModeEnum.UserUpn}> - ${gettext("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.")} + ${t`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.`} </option> </select> <p class="pf-c-form__helper-text"> - ${gettext("Configure what data should be used as unique User Identifier. For most cases, the default should be fine.")} + ${t`Configure what data should be used as unique User Identifier. For most cases, the default should be fine.`} </p> </ak-form-element-horizontal> <ak-form-element-horizontal name="includeClaimsInIdToken"> <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.provider?.includeClaimsInIdToken || false}> <label class="pf-c-check__label"> - ${gettext("Include claims in id_token")} + ${t`Include claims in id_token`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("Include User claims from scopes in the id_token, for applications that don't access the userinfo endpoint.")}</p> + <p class="pf-c-form__helper-text">${t`Include User claims from scopes in the id_token, for applications that don't access the userinfo endpoint.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Issuer mode")} + label=${t`Issuer mode`} ?required=${true} name="issuerMode"> <select class="pf-c-form-control"> <option value="${OAuth2ProviderIssuerModeEnum.PerProvider}" ?selected=${this.provider?.issuerMode === OAuth2ProviderIssuerModeEnum.PerProvider}> - ${gettext("Each provider has a different issuer, based on the application slug.")} + ${t`Each provider has a different issuer, based on the application slug.`} </option> <option value="${OAuth2ProviderIssuerModeEnum.Global}" ?selected=${this.provider?.issuerMode === OAuth2ProviderIssuerModeEnum.Global}> - ${gettext("Same identifier is used for all providers")} + ${t`Same identifier is used for all providers`} </option> </select> <p class="pf-c-form__helper-text"> - ${gettext("Configure how the issuer field of the ID Token should be filled.")} + ${t`Configure how the issuer field of the ID Token should be filled.`} </p> </ak-form-element-horizontal> </div> diff --git a/web/src/pages/providers/oauth2/OAuth2ProviderViewPage.ts b/web/src/pages/providers/oauth2/OAuth2ProviderViewPage.ts index bb7da7e76..a047f3e80 100644 --- a/web/src/pages/providers/oauth2/OAuth2ProviderViewPage.ts +++ b/web/src/pages/providers/oauth2/OAuth2ProviderViewPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import PFPage from "@patternfly/patternfly/components/Page/page.css"; @@ -30,7 +30,7 @@ import { EVENT_REFRESH } from "../../../constants"; @customElement("ak-provider-oauth2-view") export class OAuth2ProviderViewPage extends Page { pageTitle(): string { - return gettext(`OAuth Provider ${this.provider?.name || ""}`); + return t`OAuth Provider ${this.provider?.name || ""}`; } pageDescription(): string | undefined { return; @@ -77,7 +77,7 @@ export class OAuth2ProviderViewPage extends Page { return html``; } return html`<ak-tabs> - <section slot="page-1" data-tab-title="${gettext("Overview")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-u-display-flex pf-u-justify-content-center"> <div class="pf-u-w-75"> <div class="pf-c-card"> @@ -85,7 +85,7 @@ export class OAuth2ProviderViewPage extends Page { <dl class="pf-c-description-list pf-m-2-col-on-lg"> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Name")}</span> + <span class="pf-c-description-list__text">${t`Name`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.provider.name}</div> @@ -93,7 +93,7 @@ export class OAuth2ProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Assigned to application")}</span> + <span class="pf-c-description-list__text">${t`Assigned to application`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text"> @@ -103,7 +103,7 @@ export class OAuth2ProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Client type")}</span> + <span class="pf-c-description-list__text">${t`Client type`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${convertToTitle(this.provider.clientType || "")}</div> @@ -111,7 +111,7 @@ export class OAuth2ProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Client ID")}</span> + <span class="pf-c-description-list__text">${t`Client ID`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.provider.clientId}</div> @@ -119,7 +119,7 @@ export class OAuth2ProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Redirect URIs")}</span> + <span class="pf-c-description-list__text">${t`Redirect URIs`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.provider.redirectUris}</div> @@ -130,17 +130,17 @@ export class OAuth2ProviderViewPage extends Page { <div class="pf-c-card__footer"> <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update OAuth2 Provider")} + ${t`Update OAuth2 Provider`} </span> <ak-provider-oauth2-form slot="form" .providerUUID=${this.provider.pk || 0}> </ak-provider-oauth2-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> </div> @@ -148,7 +148,7 @@ export class OAuth2ProviderViewPage extends Page { </div> </div> </section> - <section slot="page-2" data-tab-title="${gettext("Changelog")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-object-changelog @@ -159,7 +159,7 @@ export class OAuth2ProviderViewPage extends Page { </div> </div> </section> - <section slot="page-3" data-tab-title="${gettext("Metadata")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-3" data-tab-title="${t`Metadata`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-u-display-flex pf-u-justify-content-center"> <div class="pf-u-w-75"> <div class="pf-c-card"> @@ -167,38 +167,38 @@ export class OAuth2ProviderViewPage extends Page { <form class="pf-c-form"> <div class="pf-c-form__group"> <label class="pf-c-form__label" for="help-text-simple-form-name"> - <span class="pf-c-form__label-text">${gettext("OpenID Configuration URL")}</span> + <span class="pf-c-form__label-text">${t`OpenID Configuration URL`}</span> </label> <input class="pf-c-form-control" readonly type="text" value="${this.providerUrls?.providerInfo || "-"}" /> </div> <div class="pf-c-form__group"> <label class="pf-c-form__label" for="help-text-simple-form-name"> - <span class="pf-c-form__label-text">${gettext("OpenID Configuration Issuer")}</span> + <span class="pf-c-form__label-text">${t`OpenID Configuration Issuer`}</span> </label> <input class="pf-c-form-control" readonly type="text" value="${this.providerUrls?.issuer || "-"}" /> </div> <hr> <div class="pf-c-form__group"> <label class="pf-c-form__label" for="help-text-simple-form-name"> - <span class="pf-c-form__label-text">${gettext("Authorize URL")}</span> + <span class="pf-c-form__label-text">${t`Authorize URL`}</span> </label> <input class="pf-c-form-control" readonly type="text" value="${this.providerUrls?.authorize || "-"}" /> </div> <div class="pf-c-form__group"> <label class="pf-c-form__label" for="help-text-simple-form-name"> - <span class="pf-c-form__label-text">${gettext("Token URL")}</span> + <span class="pf-c-form__label-text">${t`Token URL`}</span> </label> <input class="pf-c-form-control" readonly type="text" value="${this.providerUrls?.token || "-"}" /> </div> <div class="pf-c-form__group"> <label class="pf-c-form__label" for="help-text-simple-form-name"> - <span class="pf-c-form__label-text">${gettext("Userinfo URL")}</span> + <span class="pf-c-form__label-text">${t`Userinfo URL`}</span> </label> <input class="pf-c-form-control" readonly type="text" value="${this.providerUrls?.userInfo || "-"}" /> </div> <div class="pf-c-form__group"> <label class="pf-c-form__label" for="help-text-simple-form-name"> - <span class="pf-c-form__label-text">${gettext("Logout URL")}</span> + <span class="pf-c-form__label-text">${t`Logout URL`}</span> </label> <input class="pf-c-form-control" readonly type="text" value="${this.providerUrls?.logout || "-"}" /> </div> diff --git a/web/src/pages/providers/proxy/ProxyProviderForm.ts b/web/src/pages/providers/proxy/ProxyProviderForm.ts index 620694edd..b943440b8 100644 --- a/web/src/pages/providers/proxy/ProxyProviderForm.ts +++ b/web/src/pages/providers/proxy/ProxyProviderForm.ts @@ -1,5 +1,5 @@ import { CryptoApi, FlowDesignationEnum, FlowsApi, ProvidersApi, ProxyProvider } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -26,9 +26,9 @@ export class ProxyProviderFormPage extends Form<ProxyProvider> { getSuccessMessage(): string { if (this.provider) { - return gettext("Successfully updated provider."); + return t`Successfully updated provider.`; } else { - return gettext("Successfully created provider."); + return t`Successfully created provider.`; } } @@ -48,13 +48,13 @@ export class ProxyProviderFormPage extends Form<ProxyProvider> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.provider?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Authorization flow")} + label=${t`Authorization flow`} ?required=${true} name="authorizationFlow"> <select class="pf-c-form-control"> @@ -67,16 +67,16 @@ export class ProxyProviderFormPage extends Form<ProxyProvider> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow used when authorizing this provider.")}</p> + <p class="pf-c-form__helper-text">${t`Flow used when authorizing this provider.`}</p> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Protocol settings")} + ${t`Protocol settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Internal host")} + label=${t`Internal host`} ?required=${true} name="internalHost"> <input type="text" value="${ifDefined(this.provider?.internalHost)}" class="pf-c-form-control" required> @@ -85,13 +85,13 @@ export class ProxyProviderFormPage extends Form<ProxyProvider> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${first(this.provider?.internalHostSslValidation, true)}> <label class="pf-c-check__label"> - ${gettext("Internal host SSL Validation")} + ${t`Internal host SSL Validation`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("Validate SSL Certificates of upstream servers.")}</p> + <p class="pf-c-form__helper-text">${t`Validate SSL Certificates of upstream servers.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("External host")} + label=${t`External host`} ?required=${true} name="externalHost"> <input type="text" value="${ifDefined(this.provider?.externalHost)}" class="pf-c-form-control" required> @@ -101,10 +101,10 @@ export class ProxyProviderFormPage extends Form<ProxyProvider> { <ak-form-group> <span slot="header"> - ${gettext("Advanced protocol settings")} + ${t`Advanced protocol settings`} </span> <ak-form-element-horizontal - label=${gettext("Certificate")} + label=${t`Certificate`} name="certificate"> <select class="pf-c-form-control"> ${until(new CryptoApi(DEFAULT_CONFIG).cryptoCertificatekeypairsList({ @@ -119,32 +119,32 @@ export class ProxyProviderFormPage extends Form<ProxyProvider> { </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Skip path regex")} + label=${t`Skip path regex`} name="skipPathRegex"> <textarea class="pf-c-form-control">${this.provider?.skipPathRegex}</textarea> - <p class="pf-c-form__helper-text">${gettext("Regular expressions for which authentication is not required. Each new line is interpreted as a new Regular Expression.")}</p> + <p class="pf-c-form__helper-text">${t`Regular expressions for which authentication is not required. Each new line is interpreted as a new Regular Expression.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal name="basicAuthEnabled"> <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.provider?.basicAuthEnabled || false}> <label class="pf-c-check__label"> - ${gettext("Set HTTP-Basic Authentication")} + ${t`Set HTTP-Basic Authentication`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("Set a custom HTTP-Basic Authentication header based on values from authentik.")}</p> + <p class="pf-c-form__helper-text">${t`Set a custom HTTP-Basic Authentication header based on values from authentik.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("HTTP-Basic Username Key")} + label=${t`HTTP-Basic Username Key`} name="basicAuthUserAttribute"> <input type="text" value="${ifDefined(this.provider?.basicAuthUserAttribute)}" class="pf-c-form-control"> - <p class="pf-c-form__helper-text">${gettext("User/Group Attribute used for the user part of the HTTP-Basic Header. If not set, the user's Email address is used.")}</p> + <p class="pf-c-form__helper-text">${t`User/Group Attribute used for the user part of the HTTP-Basic Header. If not set, the user's Email address is used.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("HTTP-Basic Password Key")} + label=${t`HTTP-Basic Password Key`} name="basicAuthPasswordAttribute"> <input type="text" value="${ifDefined(this.provider?.basicAuthPasswordAttribute)}" class="pf-c-form-control"> - <p class="pf-c-form__helper-text">${gettext("User/Group Attribute used for the password part of the HTTP-Basic Header.")}</p> + <p class="pf-c-form__helper-text">${t`User/Group Attribute used for the password part of the HTTP-Basic Header.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/providers/proxy/ProxyProviderViewPage.ts b/web/src/pages/providers/proxy/ProxyProviderViewPage.ts index 8c3005240..acf5e66e6 100644 --- a/web/src/pages/providers/proxy/ProxyProviderViewPage.ts +++ b/web/src/pages/providers/proxy/ProxyProviderViewPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import PFPage from "@patternfly/patternfly/components/Page/page.css"; @@ -27,7 +27,7 @@ import { EVENT_REFRESH } from "../../../constants"; @customElement("ak-provider-proxy-view") export class ProxyProviderViewPage extends Page { pageTitle(): string { - return gettext(`Proxy Provider ${this.provider?.name || ""}`); + return t`Proxy Provider ${this.provider?.name || ""}`; } pageDescription(): string | undefined { return; @@ -68,7 +68,7 @@ export class ProxyProviderViewPage extends Page { return html``; } return html`<ak-tabs> - <section slot="page-1" data-tab-title="${gettext("Overview")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-u-display-flex pf-u-justify-content-center"> <div class="pf-u-w-75"> <div class="pf-c-card"> @@ -76,7 +76,7 @@ export class ProxyProviderViewPage extends Page { <dl class="pf-c-description-list pf-m-3-col-on-lg"> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Name")}</span> + <span class="pf-c-description-list__text">${t`Name`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.provider.name}</div> @@ -84,7 +84,7 @@ export class ProxyProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Assigned to application")}</span> + <span class="pf-c-description-list__text">${t`Assigned to application`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text"> @@ -94,7 +94,7 @@ export class ProxyProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Internal Host")}</span> + <span class="pf-c-description-list__text">${t`Internal Host`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.provider.internalHost}</div> @@ -102,7 +102,7 @@ export class ProxyProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("External Host")}</span> + <span class="pf-c-description-list__text">${t`External Host`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.provider.externalHost}</div> @@ -110,17 +110,17 @@ export class ProxyProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Basic-Auth")}</span> + <span class="pf-c-description-list__text">${t`Basic-Auth`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text"> ${this.provider.basicAuthEnabled ? html`<span class="pf-c-button__icon pf-m-start"> <i class="fas fa-check-circle" aria-hidden="true"></i> - </span>${gettext("Yes")}`: + </span>${t`Yes`}`: html`<span class="pf-c-button__icon pf-m-start"> <i class="fas fa-times-circle" aria-hidden="true"></i> - </span>${gettext("No")}` + </span>${t`No`}` } </div> </dd> @@ -130,17 +130,17 @@ export class ProxyProviderViewPage extends Page { <div class="pf-c-card__footer"> <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Proxy Provider")} + ${t`Update Proxy Provider`} </span> <ak-provider-proxy-form slot="form" .providerUUID=${this.provider.pk || 0}> </ak-provider-proxy-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> </div> @@ -148,7 +148,7 @@ export class ProxyProviderViewPage extends Page { </div> </div> </section> - <section slot="page-2" data-tab-title="${gettext("Changelog")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-object-changelog diff --git a/web/src/pages/providers/saml/SAMLProviderForm.ts b/web/src/pages/providers/saml/SAMLProviderForm.ts index 5664eda4a..d7ecd424f 100644 --- a/web/src/pages/providers/saml/SAMLProviderForm.ts +++ b/web/src/pages/providers/saml/SAMLProviderForm.ts @@ -1,5 +1,5 @@ import { CryptoApi, FlowDesignationEnum, FlowsApi, SAMLProvider, ProvidersApi, PropertymappingsApi, SAMLProviderSpBindingEnum, SAMLProviderDigestAlgorithmEnum, SAMLProviderSignatureAlgorithmEnum } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -25,9 +25,9 @@ export class SAMLProviderFormPage extends Form<SAMLProvider> { getSuccessMessage(): string { if (this.provider) { - return gettext("Successfully updated provider."); + return t`Successfully updated provider.`; } else { - return gettext("Successfully created provider."); + return t`Successfully created provider.`; } } @@ -47,13 +47,13 @@ export class SAMLProviderFormPage extends Form<SAMLProvider> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.provider?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Authorization flow")} + label=${t`Authorization flow`} ?required=${true} name="authorizationFlow"> <select class="pf-c-form-control"> @@ -66,42 +66,42 @@ export class SAMLProviderFormPage extends Form<SAMLProvider> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow used when authorizing this provider.")}</p> + <p class="pf-c-form__helper-text">${t`Flow used when authorizing this provider.`}</p> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Protocol settings")} + ${t`Protocol settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("ACS URL")} + label=${t`ACS URL`} ?required=${true} name="acsUrl"> <input type="text" value="${ifDefined(this.provider?.acsUrl)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Issuer")} + label=${t`Issuer`} ?required=${true} name="issuer"> <input type="text" value="${this.provider?.issuer || "authentik"}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Service Provider Binding")} + label=${t`Service Provider Binding`} ?required=${true} name="spBinding"> <select class="pf-c-form-control"> <option value=${SAMLProviderSpBindingEnum.Redirect} ?selected=${this.provider?.spBinding === SAMLProviderSpBindingEnum.Redirect}> - ${gettext("Redirect")} + ${t`Redirect`} </option> <option value=${SAMLProviderSpBindingEnum.Post} ?selected=${this.provider?.spBinding === SAMLProviderSpBindingEnum.Post}> - ${gettext("Post")} + ${t`Post`} </option> </select> - <p class="pf-c-form__helper-text">${gettext("Determines how authentik sends the response back to the Service Provider.")}</p> + <p class="pf-c-form__helper-text">${t`Determines how authentik sends the response back to the Service Provider.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Audience")} + label=${t`Audience`} name="audience"> <input type="text" value="${ifDefined(this.provider?.audience)}" class="pf-c-form-control"> </ak-form-element-horizontal> @@ -110,11 +110,11 @@ export class SAMLProviderFormPage extends Form<SAMLProvider> { <ak-form-group> <span slot="header"> - ${gettext("Advanced protocol settings")} + ${t`Advanced protocol settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Signing Keypair")} + label=${t`Signing Keypair`} name="signingKp"> <select class="pf-c-form-control"> <option value="" ?selected=${this.provider?.signingKp === undefined}>---------</option> @@ -127,10 +127,10 @@ export class SAMLProviderFormPage extends Form<SAMLProvider> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Keypair used to sign outgoing Responses going to the Service Provider.")}</p> + <p class="pf-c-form__helper-text">${t`Keypair used to sign outgoing Responses going to the Service Provider.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Verification Certificate")} + label=${t`Verification Certificate`} name="verificationKp"> <select class="pf-c-form-control"> <option value="" ?selected=${this.provider?.verificationKp === undefined}>---------</option> @@ -142,11 +142,11 @@ export class SAMLProviderFormPage extends Form<SAMLProvider> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("When selected, incoming assertion's Signatures will be validated against this certificate. To allow unsigned Requests, leave on default.")}</p> + <p class="pf-c-form__helper-text">${t`When selected, incoming assertion's Signatures will be validated against this certificate. To allow unsigned Requests, leave on default.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Property mappings")} + label=${t`Property mappings`} ?required=${true} name="propertyMappings"> <select class="pf-c-form-control" multiple> @@ -161,10 +161,10 @@ export class SAMLProviderFormPage extends Form<SAMLProvider> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("NameID Property Mapping")} + label=${t`NameID Property Mapping`} name="nameIdMapping"> <select class="pf-c-form-control"> <option value="" ?selected=${this.provider?.nameIdMapping === undefined}>---------</option> @@ -176,69 +176,69 @@ export class SAMLProviderFormPage extends Form<SAMLProvider> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Configure how the NameID value will be created. When left empty, the NameIDPolicy of the incoming request will be respected.")}</p> + <p class="pf-c-form__helper-text">${t`Configure how the NameID value will be created. When left empty, the NameIDPolicy of the incoming request will be respected.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Assertion valid not before")} + label=${t`Assertion valid not before`} ?required=${true} name="assertionValidNotBefore"> <input type="text" value="${this.provider?.assertionValidNotBefore || "minutes=-5"}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Assertion valid not before current time + this value (Format: hours=-1;minutes=-2;seconds=-3).")}</p> + <p class="pf-c-form__helper-text">${t`Assertion valid not before current time + this value (Format: hours=-1;minutes=-2;seconds=-3).`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Assertion valid not on or after")} + label=${t`Assertion valid not on or after`} ?required=${true} name="assertionValidNotOnOrAfter"> <input type="text" value="${this.provider?.assertionValidNotOnOrAfter || "minutes=5"}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3).")}</p> + <p class="pf-c-form__helper-text">${t`Assertion not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3).`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Session valid not on or after")} + label=${t`Session valid not on or after`} ?required=${true} name="sessionValidNotOnOrAfter"> <input type="text" value="${this.provider?.sessionValidNotOnOrAfter || "minutes=86400"}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3).")}</p> + <p class="pf-c-form__helper-text">${t`Session not valid on or after current time + this value (Format: hours=1;minutes=2;seconds=3).`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Digest algorithm")} + label=${t`Digest algorithm`} ?required=${true} name="digestAlgorithm"> <select class="pf-c-form-control"> <option value=${SAMLProviderDigestAlgorithmEnum._200009Xmldsigsha1} ?selected=${this.provider?.digestAlgorithm === SAMLProviderDigestAlgorithmEnum._200009Xmldsigsha1}> - ${gettext("SHA1")} + ${t`SHA1`} </option> <option value=${SAMLProviderDigestAlgorithmEnum._200104Xmlencsha256} ?selected=${this.provider?.digestAlgorithm === SAMLProviderDigestAlgorithmEnum._200104Xmlencsha256 || this.provider?.digestAlgorithm === undefined}> - ${gettext("SHA256")} + ${t`SHA256`} </option> <option value=${SAMLProviderDigestAlgorithmEnum._200104XmldsigMoresha384} ?selected=${this.provider?.digestAlgorithm === SAMLProviderDigestAlgorithmEnum._200104XmldsigMoresha384}> - ${gettext("SHA384")} + ${t`SHA384`} </option> <option value=${SAMLProviderDigestAlgorithmEnum._200104Xmlencsha512} ?selected=${this.provider?.digestAlgorithm === SAMLProviderDigestAlgorithmEnum._200104Xmlencsha512}> - ${gettext("SHA512")} + ${t`SHA512`} </option> </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Signature algorithm")} + label=${t`Signature algorithm`} ?required=${true} name="signatureAlgorithm"> <select class="pf-c-form-control"> <option value=${SAMLProviderSignatureAlgorithmEnum._200009XmldsigrsaSha1} ?selected=${this.provider?.signatureAlgorithm === SAMLProviderSignatureAlgorithmEnum._200009XmldsigrsaSha1}> - ${gettext("RSA-SHA1")} + ${t`RSA-SHA1`} </option> <option value=${SAMLProviderSignatureAlgorithmEnum._200104XmldsigMorersaSha256} ?selected=${this.provider?.signatureAlgorithm === SAMLProviderSignatureAlgorithmEnum._200104XmldsigMorersaSha256 || this.provider?.signatureAlgorithm === undefined}> - ${gettext("RSA-SHA256")} + ${t`RSA-SHA256`} </option> <option value=${SAMLProviderSignatureAlgorithmEnum._200104XmldsigMorersaSha384} ?selected=${this.provider?.signatureAlgorithm === SAMLProviderSignatureAlgorithmEnum._200104XmldsigMorersaSha384}> - ${gettext("RSA-SHA384")} + ${t`RSA-SHA384`} </option> <option value=${SAMLProviderSignatureAlgorithmEnum._200104XmldsigMorersaSha512} ?selected=${this.provider?.signatureAlgorithm === SAMLProviderSignatureAlgorithmEnum._200104XmldsigMorersaSha512}> - ${gettext("RSA-SHA512")} + ${t`RSA-SHA512`} </option> <option value=${SAMLProviderSignatureAlgorithmEnum._200009XmldsigdsaSha1} ?selected=${this.provider?.signatureAlgorithm === SAMLProviderSignatureAlgorithmEnum._200009XmldsigdsaSha1}> - ${gettext("DSA-SHA1")} + ${t`DSA-SHA1`} </option> </select> </ak-form-element-horizontal> diff --git a/web/src/pages/providers/saml/SAMLProviderImportForm.ts b/web/src/pages/providers/saml/SAMLProviderImportForm.ts index c0d79cae0..834eb3377 100644 --- a/web/src/pages/providers/saml/SAMLProviderImportForm.ts +++ b/web/src/pages/providers/saml/SAMLProviderImportForm.ts @@ -1,5 +1,5 @@ import { FlowDesignationEnum, FlowsApi, ProvidersApi, SAMLProvider } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { ifDefined } from "lit-html/directives/if-defined"; @@ -12,7 +12,7 @@ import "../../../elements/forms/HorizontalFormElement"; export class SAMLProviderImportForm extends Form<SAMLProvider> { getSuccessMessage(): string { - return gettext("Successfully imported provider."); + return t`Successfully imported provider.`; } // eslint-disable-next-line @@ -31,13 +31,13 @@ export class SAMLProviderImportForm extends Form<SAMLProvider> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Authorization flow")} + label=${t`Authorization flow`} ?required=${true} name="authorizationFlow"> <select class="pf-c-form-control"> @@ -50,11 +50,11 @@ export class SAMLProviderImportForm extends Form<SAMLProvider> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow used when authorizing this provider.")}</p> + <p class="pf-c-form__helper-text">${t`Flow used when authorizing this provider.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Metadata")} + label=${t`Metadata`} name="flow"> <input type="file" value="" class="pf-c-form-control"> </ak-form-element-horizontal> diff --git a/web/src/pages/providers/saml/SAMLProviderViewPage.ts b/web/src/pages/providers/saml/SAMLProviderViewPage.ts index ba5d10798..cc573fb03 100644 --- a/web/src/pages/providers/saml/SAMLProviderViewPage.ts +++ b/web/src/pages/providers/saml/SAMLProviderViewPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { until } from "lit-html/directives/until"; @@ -30,7 +30,7 @@ import { ifDefined } from "lit-html/directives/if-defined"; @customElement("ak-provider-saml-view") export class SAMLProviderViewPage extends Page { pageTitle(): string { - return gettext(`SAML Provider ${this.provider?.name || ""}`); + return t`SAML Provider ${this.provider?.name || ""}`; } pageDescription(): string | undefined { return; @@ -71,7 +71,7 @@ export class SAMLProviderViewPage extends Page { return html``; } return html`<ak-tabs> - <section slot="page-1" data-tab-title="${gettext("Overview")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-u-display-flex pf-u-justify-content-center"> <div class="pf-u-w-75"> <div class="pf-c-card"> @@ -79,7 +79,7 @@ export class SAMLProviderViewPage extends Page { <dl class="pf-c-description-list pf-m-3-col-on-lg"> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Name")}</span> + <span class="pf-c-description-list__text">${t`Name`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.provider.name}</div> @@ -87,7 +87,7 @@ export class SAMLProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Assigned to application")}</span> + <span class="pf-c-description-list__text">${t`Assigned to application`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text"> @@ -97,7 +97,7 @@ export class SAMLProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("ACS URL")}</span> + <span class="pf-c-description-list__text">${t`ACS URL`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.provider.acsUrl}</div> @@ -105,7 +105,7 @@ export class SAMLProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Audience")}</span> + <span class="pf-c-description-list__text">${t`Audience`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.provider.audience}</div> @@ -113,7 +113,7 @@ export class SAMLProviderViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Issuer")}</span> + <span class="pf-c-description-list__text">${t`Issuer`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.provider.issuer}</div> @@ -124,17 +124,17 @@ export class SAMLProviderViewPage extends Page { <div class="pf-c-card__footer"> <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update SAML Provider")} + ${t`Update SAML Provider`} </span> <ak-provider-saml-form slot="form" .providerUUID=${this.provider.pk || 0}> </ak-provider-saml-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> </div> @@ -142,7 +142,7 @@ export class SAMLProviderViewPage extends Page { </div> </div> </section> - <section slot="page-2" data-tab-title="${gettext("Changelog")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-object-changelog @@ -154,7 +154,7 @@ export class SAMLProviderViewPage extends Page { </div> </section> ${this.provider.assignedApplicationName ? html` - <section slot="page-3" data-tab-title="${gettext("Metadata")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-3" data-tab-title="${t`Metadata`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-u-display-flex pf-u-justify-content-center"> <div class="pf-u-w-75"> <div class="pf-c-card"> @@ -168,7 +168,7 @@ export class SAMLProviderViewPage extends Page { <div class="pf-c-card__footer"> <a class="pf-c-button pf-m-primary" target="_blank" href="/api/v2beta/providers/saml/${this.provider.pk}/metadata/?download"> - ${gettext("Download")} + ${t`Download`} </a> </div> </div> diff --git a/web/src/pages/sources/SourcesListPage.ts b/web/src/pages/sources/SourcesListPage.ts index 947de5419..947894df0 100644 --- a/web/src/pages/sources/SourcesListPage.ts +++ b/web/src/pages/sources/SourcesListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TableColumn } from "../../elements/table/Table"; @@ -47,8 +47,8 @@ export class SourceListPage extends TablePage<Source> { columns(): TableColumn[] { return [ - new TableColumn("Name", "name"), - new TableColumn("Type", "verboseName"), + new TableColumn(t`Name`, t`name`), + new TableColumn(t`Type`, t`verboseName`), new TableColumn(""), ]; } @@ -57,16 +57,16 @@ export class SourceListPage extends TablePage<Source> { return [ html`<a href="#/core/sources/${item.slug}"> <div>${item.name}</div> - ${item.enabled ? html`` : html`<small>${gettext("Disabled")}</small>`} + ${item.enabled ? html`` : html`<small>${t`Disabled`}</small>`} </a>`, html`${item.verboseName}`, html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext(`Update ${item.verboseName}`)} + ${t`Update ${item.verboseName}`} </span> <ak-proxy-form slot="form" @@ -76,19 +76,19 @@ export class SourceListPage extends TablePage<Source> { type=${ifDefined(item.component)}> </ak-proxy-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Source")} + objectLabel=${t`Source`} .delete=${() => { return new SourcesApi(DEFAULT_CONFIG).sourcesAllDelete({ slug: item.slug || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -98,7 +98,7 @@ export class SourceListPage extends TablePage<Source> { return html` <ak-dropdown class="pf-c-dropdown"> <button class="pf-m-primary pf-c-dropdown__toggle" type="button"> - <span class="pf-c-dropdown__toggle-text">${gettext("Create")}</span> + <span class="pf-c-dropdown__toggle-text">${t`Create`}</span> <i class="fas fa-caret-down pf-c-dropdown__toggle-icon" aria-hidden="true"></i> </button> <ul class="pf-c-dropdown__menu" hidden> @@ -107,10 +107,10 @@ export class SourceListPage extends TablePage<Source> { return html`<li> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext(`Create ${type.name}`)} + ${t`Create ${type.name}`} </span> <ak-proxy-form slot="form" diff --git a/web/src/pages/sources/ldap/LDAPSourceForm.ts b/web/src/pages/sources/ldap/LDAPSourceForm.ts index aae632ee4..2bde981e4 100644 --- a/web/src/pages/sources/ldap/LDAPSourceForm.ts +++ b/web/src/pages/sources/ldap/LDAPSourceForm.ts @@ -1,5 +1,5 @@ import { LDAPSource, SourcesApi, PropertymappingsApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -25,9 +25,9 @@ export class LDAPSourceForm extends Form<LDAPSource> { getSuccessMessage(): string { if (this.source) { - return gettext("Successfully updated source."); + return t`Successfully updated source.`; } else { - return gettext("Successfully created source."); + return t`Successfully created source.`; } } @@ -47,13 +47,13 @@ export class LDAPSourceForm extends Form<LDAPSource> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.source?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Slug")} + label=${t`Slug`} ?required=${true} name="slug"> <input type="text" value="${ifDefined(this.source?.slug)}" class="pf-c-form-control" required> @@ -62,7 +62,7 @@ export class LDAPSourceForm extends Form<LDAPSource> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.source?.enabled || true}> <label class="pf-c-check__label"> - ${gettext("Enabled")} + ${t`Enabled`} </label> </div> </ak-form-element-horizontal> @@ -70,7 +70,7 @@ export class LDAPSourceForm extends Form<LDAPSource> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.source?.syncUsers || true}> <label class="pf-c-check__label"> - ${gettext("Sync users")} + ${t`Sync users`} </label> </div> </ak-form-element-horizontal> @@ -78,7 +78,7 @@ export class LDAPSourceForm extends Form<LDAPSource> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.source?.syncUsersPassword || true}> <label class="pf-c-check__label"> - ${gettext("Sync users' passwords")} + ${t`Sync users' passwords`} </label> </div> </ak-form-element-horizontal> @@ -86,17 +86,17 @@ export class LDAPSourceForm extends Form<LDAPSource> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.source?.syncGroups || true}> <label class="pf-c-check__label"> - ${gettext("Sync groups")} + ${t`Sync groups`} </label> </div> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Connection settings")} + ${t`Connection settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Server URI")} + label=${t`Server URI`} ?required=${true} name="serverUri"> <input type="text" value="${ifDefined(this.source?.serverUri)}" class="pf-c-form-control" required> @@ -105,24 +105,24 @@ export class LDAPSourceForm extends Form<LDAPSource> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.source?.startTls || true}> <label class="pf-c-check__label"> - ${gettext("Enable StartTLS")} + ${t`Enable StartTLS`} </label> </div> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Bind CN")} + label=${t`Bind CN`} ?required=${true} name="bindCn"> <input type="text" value="${ifDefined(this.source?.bindCn)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Bind Password")} + label=${t`Bind Password`} ?required=${true} name="bindPassword"> <input type="text" value="${ifDefined(this.source?.bindPassword)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Base DN")} + label=${t`Base DN`} ?required=${true} name="baseDn"> <input type="text" value="${ifDefined(this.source?.baseDn)}" class="pf-c-form-control" required> @@ -131,11 +131,11 @@ export class LDAPSourceForm extends Form<LDAPSource> { </ak-form-group> <ak-form-group> <span slot="header"> - ${gettext("Advanced settings")} + ${t`Advanced settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("User Property Mappings")} + label=${t`User Property Mappings`} ?required=${true} name="propertyMappings"> <select class="pf-c-form-control" multiple> @@ -155,11 +155,11 @@ export class LDAPSourceForm extends Form<LDAPSource> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Property mappings used to user creation.")}</p> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Property mappings used to user creation.`}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Group Property Mappings")} + label=${t`Group Property Mappings`} ?required=${true} name="propertyMappingsGroup"> <select class="pf-c-form-control" multiple> @@ -179,48 +179,48 @@ export class LDAPSourceForm extends Form<LDAPSource> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Property mappings used to group creation.")}</p> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Property mappings used to group creation.`}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Addition User DN")} + label=${t`Addition User DN`} name="additionalUserDn"> <input type="text" value="${ifDefined(this.source?.additionalUserDn)}" class="pf-c-form-control"> - <p class="pf-c-form__helper-text">${gettext("Additional user DN, prepended to the Base DN.")}</p> + <p class="pf-c-form__helper-text">${t`Additional user DN, prepended to the Base DN.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Addition Group DN")} + label=${t`Addition Group DN`} name="additionalGroupDn"> <input type="text" value="${ifDefined(this.source?.additionalGroupDn)}" class="pf-c-form-control"> - <p class="pf-c-form__helper-text">${gettext("Additional group DN, prepended to the Base DN.")}</p> + <p class="pf-c-form__helper-text">${t`Additional group DN, prepended to the Base DN.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("User object filter")} + label=${t`User object filter`} ?required=${true} name="userObjectFilter"> <input type="text" value="${this.source?.userObjectFilter || "(objectClass=person)"}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Consider Objects matching this filter to be Users.")}</p> + <p class="pf-c-form__helper-text">${t`Consider Objects matching this filter to be Users.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Group object filter")} + label=${t`Group object filter`} ?required=${true} name="groupObjectFilter"> <input type="text" value="${this.source?.groupObjectFilter || "(objectClass=group)"}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Consider Objects matching this filter to be Groups.")}</p> + <p class="pf-c-form__helper-text">${t`Consider Objects matching this filter to be Groups.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Group membership field")} + label=${t`Group membership field`} ?required=${true} name="groupMembershipField"> <input type="text" value="${this.source?.groupMembershipField || "member"}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Field which contains members of a group.")}</p> + <p class="pf-c-form__helper-text">${t`Field which contains members of a group.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Object uniqueness field")} + label=${t`Object uniqueness field`} ?required=${true} name="objectUniquenessField"> <input type="text" value="${this.source?.objectUniquenessField || "objectSid"}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Field which contains a unique Identifier.")}</p> + <p class="pf-c-form__helper-text">${t`Field which contains a unique Identifier.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/sources/ldap/LDAPSourceViewPage.ts b/web/src/pages/sources/ldap/LDAPSourceViewPage.ts index 881ad37a2..b6b96abd5 100644 --- a/web/src/pages/sources/ldap/LDAPSourceViewPage.ts +++ b/web/src/pages/sources/ldap/LDAPSourceViewPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import PFPage from "@patternfly/patternfly/components/Page/page.css"; @@ -29,7 +29,7 @@ import { EVENT_REFRESH } from "../../../constants"; @customElement("ak-source-ldap-view") export class LDAPSourceViewPage extends Page { pageTitle(): string { - return gettext(`LDAP Source ${this.source?.name || ""}`); + return t`LDAP Source ${this.source?.name || ""}`; } pageDescription(): string | undefined { return; @@ -67,7 +67,7 @@ export class LDAPSourceViewPage extends Page { return html``; } return html`<ak-tabs> - <section slot="page-1" data-tab-title="${gettext("Overview")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-u-display-flex pf-u-justify-content-center"> <div class="pf-u-w-75"> <div class="pf-c-card"> @@ -75,7 +75,7 @@ export class LDAPSourceViewPage extends Page { <dl class="pf-c-description-list pf-m-2-col-on-lg"> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Name")}</span> + <span class="pf-c-description-list__text">${t`Name`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.source.name}</div> @@ -83,7 +83,7 @@ export class LDAPSourceViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Server URI")}</span> + <span class="pf-c-description-list__text">${t`Server URI`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.source.serverUri}</div> @@ -91,7 +91,7 @@ export class LDAPSourceViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Base DN")}</span> + <span class="pf-c-description-list__text">${t`Base DN`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text"> @@ -106,17 +106,17 @@ export class LDAPSourceViewPage extends Page { <div class="pf-c-card__footer"> <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update LDAP Source")} + ${t`Update LDAP Source`} </span> <ak-source-ldap-form slot="form" .sourceSlug=${this.source.slug}> </ak-source-ldap-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> </div> @@ -124,7 +124,7 @@ export class LDAPSourceViewPage extends Page { </div> </div> </section> - <section slot="page-2" data-tab-title="${gettext("Changelog")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-object-changelog @@ -135,12 +135,12 @@ export class LDAPSourceViewPage extends Page { </div> </div> </section> - <section slot="page-3" data-tab-title="${gettext("Sync")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-3" data-tab-title="${t`Sync`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-u-display-flex pf-u-justify-content-center"> <div class="pf-u-w-75"> <div class="pf-c-card"> <div class="pf-c-card__title"> - <p>${gettext("Sync status")}</p> + <p>${t`Sync status`}</p> </div> <div class="pf-c-card__body"> <p> @@ -148,9 +148,9 @@ export class LDAPSourceViewPage extends Page { slug: this.source.slug }).then((ls) => { if (!ls.lastSync) { - return gettext("Not synced in the last hour, check System tasks."); + return t`Not synced in the last hour, check System tasks.`; } - return gettext(`Last sync: ${ls.lastSync.toLocaleString()}`); + return t`Last sync: ${ls.lastSync.toLocaleString()}`; }), "loading")} </p> </div> @@ -162,7 +162,7 @@ export class LDAPSourceViewPage extends Page { data: this.source, }); }}> - ${gettext("Retry Task")} + ${t`Retry Task`} </ak-action-button> </div> </div> diff --git a/web/src/pages/sources/oauth/OAuthSourceForm.ts b/web/src/pages/sources/oauth/OAuthSourceForm.ts index 93f24ba3c..c68d1c695 100644 --- a/web/src/pages/sources/oauth/OAuthSourceForm.ts +++ b/web/src/pages/sources/oauth/OAuthSourceForm.ts @@ -1,5 +1,5 @@ import { OAuthSource, SourcesApi, FlowsApi, FlowDesignationEnum } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -29,9 +29,9 @@ export class OAuthSourceForm extends Form<OAuthSource> { getSuccessMessage(): string { if (this.source) { - return gettext("Successfully updated source."); + return t`Successfully updated source.`; } else { - return gettext("Successfully created source."); + return t`Successfully created source.`; } } @@ -55,35 +55,35 @@ export class OAuthSourceForm extends Form<OAuthSource> { return html` <ak-form-group> <span slot="header"> - ${gettext("URL settings")} + ${t`URL settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Authorization URL")} + label=${t`Authorization URL`} ?required=${true} name="authorizationUrl"> <input type="text" value="${ifDefined(this.source?.authorizationUrl)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("URL the user is redirect to to consent the authorization.")}</p> + <p class="pf-c-form__helper-text">${t`URL the user is redirect to to consent the authorization.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Access token URL")} + label=${t`Access token URL`} ?required=${true} name="accessTokenUrl"> <input type="text" value="${ifDefined(this.source?.accessTokenUrl)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("URL used by authentik to retrieve tokens.")}</p> + <p class="pf-c-form__helper-text">${t`URL used by authentik to retrieve tokens.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Profile URL")} + label=${t`Profile URL`} ?required=${true} name="profileUrl"> <input type="text" value="${ifDefined(this.source?.profileUrl)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("URL used by authentik to get user information.")}</p> + <p class="pf-c-form__helper-text">${t`URL used by authentik to get user information.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Request token URL")} + label=${t`Request token URL`} name="requestTokenUrl"> <input type="text" value="${ifDefined(this.source?.requestTokenUrl)}" class="pf-c-form-control"> - <p class="pf-c-form__helper-text">${gettext("URL used to request the initial token. This URL is only required for OAuth 1.")}</p> + <p class="pf-c-form__helper-text">${t`URL used to request the initial token. This URL is only required for OAuth 1.`}</p> </ak-form-element-horizontal> </div> </ak-form-group>`; @@ -92,13 +92,13 @@ export class OAuthSourceForm extends Form<OAuthSource> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.source?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Slug")} + label=${t`Slug`} ?required=${true} name="slug"> <input type="text" value="${ifDefined(this.source?.slug)}" class="pf-c-form-control" required> @@ -107,30 +107,30 @@ export class OAuthSourceForm extends Form<OAuthSource> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.source?.enabled || true}> <label class="pf-c-check__label"> - ${gettext("Enabled")} + ${t`Enabled`} </label> </div> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Protocol settings")} + ${t`Protocol settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Consumer key")} + label=${t`Consumer key`} ?required=${true} name="consumerKey"> <input type="text" value="${ifDefined(this.source?.consumerKey)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Consumer secret")} + label=${t`Consumer secret`} ?required=${true} name="consumerSecret"> <input type="text" value="${ifDefined(this.source?.consumerSecret)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Provider type")} + label=${t`Provider type`} name="providerType"> <select class="pf-c-form-control" @change=${(ev: Event) => { const el = (ev.target as HTMLSelectElement); @@ -147,18 +147,18 @@ export class OAuthSourceForm extends Form<OAuthSource> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Keypair which is used to sign outgoing requests. Leave empty to disable signing.")}</p> + <p class="pf-c-form__helper-text">${t`Keypair which is used to sign outgoing requests. Leave empty to disable signing.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> ${this.renderUrlOptions()} <ak-form-group> <span slot="header"> - ${gettext("Flow settings")} + ${t`Flow settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Authentication flow")} + label=${t`Authentication flow`} ?required=${true} name="authenticationFlow"> <select class="pf-c-form-control"> @@ -175,10 +175,10 @@ export class OAuthSourceForm extends Form<OAuthSource> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow to use when authenticating existing users.")}</p> + <p class="pf-c-form__helper-text">${t`Flow to use when authenticating existing users.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Enrollment flow")} + label=${t`Enrollment flow`} ?required=${true} name="enrollmentFlow"> <select class="pf-c-form-control"> @@ -195,7 +195,7 @@ export class OAuthSourceForm extends Form<OAuthSource> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow to use when enrolling new users.")}</p> + <p class="pf-c-form__helper-text">${t`Flow to use when enrolling new users.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/sources/oauth/OAuthSourceViewPage.ts b/web/src/pages/sources/oauth/OAuthSourceViewPage.ts index 671485510..dc13284fe 100644 --- a/web/src/pages/sources/oauth/OAuthSourceViewPage.ts +++ b/web/src/pages/sources/oauth/OAuthSourceViewPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import PFPage from "@patternfly/patternfly/components/Page/page.css"; @@ -27,7 +27,7 @@ import { EVENT_REFRESH } from "../../../constants"; @customElement("ak-source-oauth-view") export class OAuthSourceViewPage extends Page { pageTitle(): string { - return gettext(`OAuth Source ${this.source?.name || ""}`); + return t`OAuth Source ${this.source?.name || ""}`; } pageDescription(): string | undefined { return; @@ -65,7 +65,7 @@ export class OAuthSourceViewPage extends Page { return html``; } return html`<ak-tabs> - <section slot="page-1" data-tab-title="${gettext("Overview")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-u-display-flex pf-u-justify-content-center"> <div class="pf-u-w-75"> <div class="pf-c-card"> @@ -73,7 +73,7 @@ export class OAuthSourceViewPage extends Page { <dl class="pf-c-description-list pf-m-2-col-on-lg"> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Name")}</span> + <span class="pf-c-description-list__text">${t`Name`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.source.name}</div> @@ -81,7 +81,7 @@ export class OAuthSourceViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Provider Type")}</span> + <span class="pf-c-description-list__text">${t`Provider Type`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.source.providerType}</div> @@ -89,7 +89,7 @@ export class OAuthSourceViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Callback URL")}</span> + <span class="pf-c-description-list__text">${t`Callback URL`}</span> </dt> <dd class="pf-c-description-list__description"> <code class="pf-c-description-list__text">${this.source.callbackUrl}</code> @@ -97,7 +97,7 @@ export class OAuthSourceViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Access Key")}</span> + <span class="pf-c-description-list__text">${t`Access Key`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.source.consumerKey}</div> @@ -105,7 +105,7 @@ export class OAuthSourceViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Authorization URL")}</span> + <span class="pf-c-description-list__text">${t`Authorization URL`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.source.authorizationUrl}</div> @@ -113,7 +113,7 @@ export class OAuthSourceViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Token URL")}</span> + <span class="pf-c-description-list__text">${t`Token URL`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.source.accessTokenUrl}</div> @@ -124,17 +124,17 @@ export class OAuthSourceViewPage extends Page { <div class="pf-c-card__footer"> <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update OAuth Source")} + ${t`Update OAuth Source`} </span> <ak-source-oauth-form slot="form" .sourceSlug=${this.source.slug}> </ak-source-oauth-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> </div> @@ -142,7 +142,7 @@ export class OAuthSourceViewPage extends Page { </div> </div> </section> - <section slot="page-2" data-tab-title="${gettext("Changelog")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-object-changelog diff --git a/web/src/pages/sources/saml/SAMLSourceForm.ts b/web/src/pages/sources/saml/SAMLSourceForm.ts index 997dd094e..2bdef7afe 100644 --- a/web/src/pages/sources/saml/SAMLSourceForm.ts +++ b/web/src/pages/sources/saml/SAMLSourceForm.ts @@ -1,5 +1,5 @@ import { SAMLSource, SourcesApi, SAMLSourceBindingTypeEnum, SAMLSourceNameIdPolicyEnum, CryptoApi, SAMLSourceDigestAlgorithmEnum, SAMLSourceSignatureAlgorithmEnum, FlowsApi, FlowDesignationEnum } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -25,9 +25,9 @@ export class SAMLSourceForm extends Form<SAMLSource> { getSuccessMessage(): string { if (this.source) { - return gettext("Successfully updated source."); + return t`Successfully updated source.`; } else { - return gettext("Successfully created source."); + return t`Successfully created source.`; } } @@ -47,13 +47,13 @@ export class SAMLSourceForm extends Form<SAMLSource> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.source?.name)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Slug")} + label=${t`Slug`} ?required=${true} name="slug"> <input type="text" value="${ifDefined(this.source?.slug)}" class="pf-c-form-control" required> @@ -62,53 +62,53 @@ export class SAMLSourceForm extends Form<SAMLSource> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.source?.enabled || true}> <label class="pf-c-check__label"> - ${gettext("Enabled")} + ${t`Enabled`} </label> </div> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Protocol settings")} + ${t`Protocol settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("SSO URL")} + label=${t`SSO URL`} ?required=${true} name="ssoUrl"> <input type="text" value="${ifDefined(this.source?.ssoUrl)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("URL that the initial Login request is sent to.")}</p> + <p class="pf-c-form__helper-text">${t`URL that the initial Login request is sent to.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("SLO URL")} + label=${t`SLO URL`} name="sloUrl"> <input type="text" value="${ifDefined(this.source?.sloUrl || "")}" class="pf-c-form-control"> - <p class="pf-c-form__helper-text">${gettext("Optional URL if the IDP supports Single-Logout.")}</p> + <p class="pf-c-form__helper-text">${t`Optional URL if the IDP supports Single-Logout.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Issuer")} + label=${t`Issuer`} name="issuer"> <input type="text" value="${ifDefined(this.source?.issuer)}" class="pf-c-form-control"> - <p class="pf-c-form__helper-text">${gettext("Also known as Entity ID. Defaults the Metadata URL.")}</p> + <p class="pf-c-form__helper-text">${t`Also known as Entity ID. Defaults the Metadata URL.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Binding Type")} + label=${t`Binding Type`} ?required=${true} name="bindingType"> <select class="pf-c-form-control"> <option value=${SAMLSourceBindingTypeEnum.Redirect} ?selected=${this.source?.bindingType === SAMLSourceBindingTypeEnum.Redirect}> - ${gettext("Redirect binding")} + ${t`Redirect binding`} </option> <option value=${SAMLSourceBindingTypeEnum.PostAuto} ?selected=${this.source?.bindingType === SAMLSourceBindingTypeEnum.PostAuto}> - ${gettext("Post binding (auto-submit)")} + ${t`Post binding (auto-submit)`} </option> <option value=${SAMLSourceBindingTypeEnum.Post} ?selected=${this.source?.bindingType === SAMLSourceBindingTypeEnum.Post}> - ${gettext("Post binding")} + ${t`Post binding`} </option> </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Signing keypair")} + label=${t`Signing keypair`} name="signingKp"> <select class="pf-c-form-control"> <option value="" ?selected=${this.source?.signingKp === undefined}>---------</option> @@ -120,91 +120,91 @@ export class SAMLSourceForm extends Form<SAMLSource> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Keypair which is used to sign outgoing requests. Leave empty to disable signing.")}</p> + <p class="pf-c-form__helper-text">${t`Keypair which is used to sign outgoing requests. Leave empty to disable signing.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> <ak-form-group> <span slot="header"> - ${gettext("Advanced protocol settings")} + ${t`Advanced protocol settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal name="allowIdpInitiated"> <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.source?.allowIdpInitiated || false}> <label class="pf-c-check__label"> - ${gettext(" Allow IDP-initiated logins")} + ${t` Allow IDP-initiated logins`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("Allows authentication flows initiated by the IdP. This can be a security risk, as no validation of the request ID is done.")}</p> + <p class="pf-c-form__helper-text">${t`Allows authentication flows initiated by the IdP. This can be a security risk, as no validation of the request ID is done.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("NameID Policy")} + label=${t`NameID Policy`} ?required=${true} name="nameIdPolicy"> <select class="pf-c-form-control"> <option value=${SAMLSourceNameIdPolicyEnum._20nameidFormatpersistent} ?selected=${this.source?.nameIdPolicy === SAMLSourceNameIdPolicyEnum._20nameidFormatpersistent}> - ${gettext("Persistent")} + ${t`Persistent`} </option> <option value=${SAMLSourceNameIdPolicyEnum._11nameidFormatemailAddress} ?selected=${this.source?.nameIdPolicy === SAMLSourceNameIdPolicyEnum._11nameidFormatemailAddress}> - ${gettext("Email address")} + ${t`Email address`} </option> <option value=${SAMLSourceNameIdPolicyEnum._20nameidFormatWindowsDomainQualifiedName} ?selected=${this.source?.nameIdPolicy === SAMLSourceNameIdPolicyEnum._20nameidFormatWindowsDomainQualifiedName}> - ${gettext("Windows")} + ${t`Windows`} </option> <option value=${SAMLSourceNameIdPolicyEnum._20nameidFormatX509SubjectName} ?selected=${this.source?.nameIdPolicy === SAMLSourceNameIdPolicyEnum._20nameidFormatX509SubjectName}> - ${gettext("X509 Subject")} + ${t`X509 Subject`} </option> <option value=${SAMLSourceNameIdPolicyEnum._20nameidFormattransient} ?selected=${this.source?.nameIdPolicy === SAMLSourceNameIdPolicyEnum._20nameidFormattransient}> - ${gettext("Transient")} + ${t`Transient`} </option> </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Delete temporary users after")} + label=${t`Delete temporary users after`} ?required=${true} name="temporaryUserDeleteAfter"> <input type="text" value="${this.source?.temporaryUserDeleteAfter || "days=1"}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("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).")}</p> + <p class="pf-c-form__helper-text">${t`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).`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Digest algorithm")} + label=${t`Digest algorithm`} ?required=${true} name="digestAlgorithm"> <select class="pf-c-form-control"> <option value=${SAMLSourceDigestAlgorithmEnum._200009Xmldsigsha1} ?selected=${this.source?.digestAlgorithm === SAMLSourceDigestAlgorithmEnum._200009Xmldsigsha1}> - ${gettext("SHA1")} + ${t`SHA1`} </option> <option value=${SAMLSourceDigestAlgorithmEnum._200104Xmlencsha256} ?selected=${this.source?.digestAlgorithm === SAMLSourceDigestAlgorithmEnum._200104Xmlencsha256 || this.source?.digestAlgorithm === undefined}> - ${gettext("SHA256")} + ${t`SHA256`} </option> <option value=${SAMLSourceDigestAlgorithmEnum._200104XmldsigMoresha384} ?selected=${this.source?.digestAlgorithm === SAMLSourceDigestAlgorithmEnum._200104XmldsigMoresha384}> - ${gettext("SHA384")} + ${t`SHA384`} </option> <option value=${SAMLSourceDigestAlgorithmEnum._200104Xmlencsha512} ?selected=${this.source?.digestAlgorithm === SAMLSourceDigestAlgorithmEnum._200104Xmlencsha512}> - ${gettext("SHA512")} + ${t`SHA512`} </option> </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Signature algorithm")} + label=${t`Signature algorithm`} ?required=${true} name="signatureAlgorithm"> <select class="pf-c-form-control"> <option value=${SAMLSourceSignatureAlgorithmEnum._200009XmldsigrsaSha1} ?selected=${this.source?.signatureAlgorithm === SAMLSourceSignatureAlgorithmEnum._200009XmldsigrsaSha1}> - ${gettext("RSA-SHA1")} + ${t`RSA-SHA1`} </option> <option value=${SAMLSourceSignatureAlgorithmEnum._200104XmldsigMorersaSha256} ?selected=${this.source?.signatureAlgorithm === SAMLSourceSignatureAlgorithmEnum._200104XmldsigMorersaSha256 || this.source?.signatureAlgorithm === undefined}> - ${gettext("RSA-SHA256")} + ${t`RSA-SHA256`} </option> <option value=${SAMLSourceSignatureAlgorithmEnum._200104XmldsigMorersaSha384} ?selected=${this.source?.signatureAlgorithm === SAMLSourceSignatureAlgorithmEnum._200104XmldsigMorersaSha384}> - ${gettext("RSA-SHA384")} + ${t`RSA-SHA384`} </option> <option value=${SAMLSourceSignatureAlgorithmEnum._200104XmldsigMorersaSha512} ?selected=${this.source?.signatureAlgorithm === SAMLSourceSignatureAlgorithmEnum._200104XmldsigMorersaSha512}> - ${gettext("RSA-SHA512")} + ${t`RSA-SHA512`} </option> <option value=${SAMLSourceSignatureAlgorithmEnum._200009XmldsigdsaSha1} ?selected=${this.source?.signatureAlgorithm === SAMLSourceSignatureAlgorithmEnum._200009XmldsigdsaSha1}> - ${gettext("DSA-SHA1")} + ${t`DSA-SHA1`} </option> </select> </ak-form-element-horizontal> @@ -212,11 +212,11 @@ export class SAMLSourceForm extends Form<SAMLSource> { </ak-form-group> <ak-form-group> <span slot="header"> - ${gettext("Flow settings")} + ${t`Flow settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Pre-authentication flow")} + label=${t`Pre-authentication flow`} ?required=${true} name="preAuthenticationFlow"> <select class="pf-c-form-control"> @@ -233,10 +233,10 @@ export class SAMLSourceForm extends Form<SAMLSource> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow used before authentication.")}</p> + <p class="pf-c-form__helper-text">${t`Flow used before authentication.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Authentication flow")} + label=${t`Authentication flow`} ?required=${true} name="authenticationFlow"> <select class="pf-c-form-control"> @@ -253,10 +253,10 @@ export class SAMLSourceForm extends Form<SAMLSource> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow to use when authenticating existing users.")}</p> + <p class="pf-c-form__helper-text">${t`Flow to use when authenticating existing users.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Enrollment flow")} + label=${t`Enrollment flow`} ?required=${true} name="enrollmentFlow"> <select class="pf-c-form-control"> @@ -273,7 +273,7 @@ export class SAMLSourceForm extends Form<SAMLSource> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow to use when enrolling new users.")}</p> + <p class="pf-c-form__helper-text">${t`Flow to use when enrolling new users.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/sources/saml/SAMLSourceViewPage.ts b/web/src/pages/sources/saml/SAMLSourceViewPage.ts index 6ad4338db..dffed782f 100644 --- a/web/src/pages/sources/saml/SAMLSourceViewPage.ts +++ b/web/src/pages/sources/saml/SAMLSourceViewPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { until } from "lit-html/directives/until"; @@ -30,7 +30,7 @@ import { ifDefined } from "lit-html/directives/if-defined"; @customElement("ak-source-saml-view") export class SAMLSourceViewPage extends Page { pageTitle(): string { - return gettext(`SAML Source ${this.source?.name || ""}`); + return t`SAML Source ${this.source?.name || ""}`; } pageDescription(): string | undefined { return; @@ -68,7 +68,7 @@ export class SAMLSourceViewPage extends Page { return html``; } return html`<ak-tabs> - <section slot="page-1" data-tab-title="${gettext("Overview")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-u-display-flex pf-u-justify-content-center"> <div class="pf-u-w-75"> <div class="pf-c-card"> @@ -76,7 +76,7 @@ export class SAMLSourceViewPage extends Page { <dl class="pf-c-description-list pf-m-3-col-on-lg"> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Name")}</span> + <span class="pf-c-description-list__text">${t`Name`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.source.name}</div> @@ -84,7 +84,7 @@ export class SAMLSourceViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("SSO URL")}</span> + <span class="pf-c-description-list__text">${t`SSO URL`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.source.ssoUrl}</div> @@ -92,7 +92,7 @@ export class SAMLSourceViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("SLO URL")}</span> + <span class="pf-c-description-list__text">${t`SLO URL`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.source.sloUrl}</div> @@ -100,7 +100,7 @@ export class SAMLSourceViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Issuer")}</span> + <span class="pf-c-description-list__text">${t`Issuer`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.source.issuer}</div> @@ -111,17 +111,17 @@ export class SAMLSourceViewPage extends Page { <div class="pf-c-card__footer"> <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update SAML Source")} + ${t`Update SAML Source`} </span> <ak-source-saml-form slot="form" .sourceSlug=${this.source.slug}> </ak-source-saml-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> </div> @@ -129,7 +129,7 @@ export class SAMLSourceViewPage extends Page { </div> </div> </section> - <section slot="page-2" data-tab-title="${gettext("Changelog")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-object-changelog @@ -140,7 +140,7 @@ export class SAMLSourceViewPage extends Page { </div> </div> </section> - <section slot="page-3" data-tab-title="${gettext("Metadata")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-3" data-tab-title="${t`Metadata`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-u-display-flex pf-u-justify-content-center"> <div class="pf-u-w-75"> <div class="pf-c-card"> @@ -154,7 +154,7 @@ export class SAMLSourceViewPage extends Page { </div> <div class="pf-c-card__footer"> <a class="pf-c-button pf-m-primary" target="_blank" href="${AppURLManager.sourceSAML(this.source.slug, "metadata/")}"> - ${gettext("Download")} + ${t`Download`} </a> </div> </div> diff --git a/web/src/pages/stages/StageListPage.ts b/web/src/pages/stages/StageListPage.ts index b23f3fb41..5181731f2 100644 --- a/web/src/pages/stages/StageListPage.ts +++ b/web/src/pages/stages/StageListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TableColumn } from "../../elements/table/Table"; @@ -62,7 +62,7 @@ export class StageListPage extends TablePage<Stage> { columns(): TableColumn[] { return [ - new TableColumn("Name", "name"), + new TableColumn(t`Name`, t`name`), new TableColumn("Flows"), new TableColumn(""), ]; @@ -82,10 +82,10 @@ export class StageListPage extends TablePage<Stage> { html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext(`Update ${item.verboseName}`)} + ${t`Update ${item.verboseName}`} </span> <ak-proxy-form slot="form" @@ -95,19 +95,19 @@ export class StageListPage extends TablePage<Stage> { type=${ifDefined(item.component)}> </ak-proxy-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Group")} + objectLabel=${t`Group`} .delete=${() => { return new StagesApi(DEFAULT_CONFIG).stagesAllDelete({ stageUuid: item.pk || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -117,7 +117,7 @@ export class StageListPage extends TablePage<Stage> { return html` <ak-dropdown class="pf-c-dropdown"> <button class="pf-m-primary pf-c-dropdown__toggle" type="button"> - <span class="pf-c-dropdown__toggle-text">${gettext("Create")}</span> + <span class="pf-c-dropdown__toggle-text">${t`Create`}</span> <i class="fas fa-caret-down pf-c-dropdown__toggle-icon" aria-hidden="true"></i> </button> <ul class="pf-c-dropdown__menu" hidden> @@ -126,10 +126,10 @@ export class StageListPage extends TablePage<Stage> { return html`<li> <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext(`Create ${type.name}`)} + ${t`Create ${type.name}`} </span> <ak-proxy-form slot="form" diff --git a/web/src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts b/web/src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts index 4566e9979..12cac2f03 100644 --- a/web/src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts +++ b/web/src/pages/stages/authenticator_static/AuthenticatorStaticStageForm.ts @@ -1,5 +1,5 @@ import { FlowDesignationEnum, FlowsApi, AuthenticatorStaticStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -26,9 +26,9 @@ export class AuthenticatorStaticStageForm extends Form<AuthenticatorStaticStage> getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -48,24 +48,24 @@ export class AuthenticatorStaticStageForm extends Form<AuthenticatorStaticStage> renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Stage-specific settings")} + ${t`Stage-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Token count")} + label=${t`Token count`} ?required=${true} name="tokenCount"> <input type="text" value="${first(this.stage?.tokenCount, 6)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Configuration flow")} + label=${t`Configuration flow`} name="configureFlow"> <select class="pf-c-form-control"> <option value="" ?selected=${this.stage?.configureFlow === undefined}>---------</option> @@ -82,7 +82,7 @@ export class AuthenticatorStaticStageForm extends Form<AuthenticatorStaticStage> }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow used by an authenticated user to configure this Stage. If empty, user will not be able to configure this stage.")}</p> + <p class="pf-c-form__helper-text">${t`Flow used by an authenticated user to configure this Stage. If empty, user will not be able to configure this stage.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts b/web/src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts index e3dfe4a1f..d0be0350e 100644 --- a/web/src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts +++ b/web/src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts @@ -1,5 +1,5 @@ import { FlowDesignationEnum, FlowsApi, AuthenticatorTOTPStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -25,9 +25,9 @@ export class AuthenticatorTOTPStageForm extends Form<AuthenticatorTOTPStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -47,31 +47,31 @@ export class AuthenticatorTOTPStageForm extends Form<AuthenticatorTOTPStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Stage-specific settings")} + ${t`Stage-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Digits")} + label=${t`Digits`} ?required=${true} name="digits"> <select name="users" class="pf-c-form-control"> <option value="6" ?selected=${this.stage?.digits === 6}> - ${gettext("6 digits, widely compatible")} + ${t`6 digits, widely compatible`} </option> <option value="8" ?selected=${this.stage?.digits === 8}> - ${gettext("8 digits, not compatible with apps like Google Authenticator")} + ${t`8 digits, not compatible with apps like Google Authenticator`} </option> </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Configuration flow")} + label=${t`Configuration flow`} name="configureFlow"> <select class="pf-c-form-control"> <option value="" ?selected=${this.stage?.configureFlow === undefined}>---------</option> @@ -88,7 +88,7 @@ export class AuthenticatorTOTPStageForm extends Form<AuthenticatorTOTPStage> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow used by an authenticated user to configure this Stage. If empty, user will not be able to configure this stage.")}</p> + <p class="pf-c-form__helper-text">${t`Flow used by an authenticated user to configure this Stage. If empty, user will not be able to configure this stage.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts b/web/src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts index 4034be851..eb15e709c 100644 --- a/web/src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +++ b/web/src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts @@ -1,5 +1,5 @@ import { AuthenticatorValidateStage, AuthenticatorValidateStageNotConfiguredActionEnum, AuthenticatorValidateStageDeviceClassesEnum, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -29,9 +29,9 @@ export class AuthenticatorValidateStageForm extends Form<AuthenticatorValidateSt getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -57,18 +57,18 @@ export class AuthenticatorValidateStageForm extends Form<AuthenticatorValidateSt renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Stage-specific settings")} + ${t`Stage-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Not configured action")} + label=${t`Not configured action`} ?required=${true} name="mode"> <select class="pf-c-form-control" @change=${(ev: Event) => { @@ -80,37 +80,37 @@ export class AuthenticatorValidateStageForm extends Form<AuthenticatorValidateSt } }}> <option value=${AuthenticatorValidateStageNotConfiguredActionEnum.Configure} ?selected=${this.stage?.notConfiguredAction === AuthenticatorValidateStageNotConfiguredActionEnum.Configure}> - ${gettext("Force the user to configure an authenticator")} + ${t`Force the user to configure an authenticator`} </option> <option value=${AuthenticatorValidateStageNotConfiguredActionEnum.Deny} ?selected=${this.stage?.notConfiguredAction === AuthenticatorValidateStageNotConfiguredActionEnum.Deny}> - ${gettext("Deny the user access")} + ${t`Deny the user access`} </option> <option value=${AuthenticatorValidateStageNotConfiguredActionEnum.Skip} ?selected=${this.stage?.notConfiguredAction === AuthenticatorValidateStageNotConfiguredActionEnum.Skip}> - ${gettext("Continue")} + ${t`Continue`} </option> </select> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("User fields")} + label=${t`User fields`} ?required=${true} name="transports"> <select name="users" class="pf-c-form-control" multiple> <option value=${AuthenticatorValidateStageDeviceClassesEnum.Static} ?selected=${this.isDeviceClassSelected(AuthenticatorValidateStageDeviceClassesEnum.Static)}> - ${gettext("Static Tokens")} + ${t`Static Tokens`} </option> <option value=${AuthenticatorValidateStageDeviceClassesEnum.Totp} ?selected=${this.isDeviceClassSelected(AuthenticatorValidateStageDeviceClassesEnum.Totp)}> - ${gettext("TOTP Authenticators")} + ${t`TOTP Authenticators`} </option> <option value=${AuthenticatorValidateStageDeviceClassesEnum.Webauthn} ?selected=${this.isDeviceClassSelected(AuthenticatorValidateStageDeviceClassesEnum.Webauthn)}> - ${gettext("WebAuthn Authenticators")} + ${t`WebAuthn Authenticators`} </option> </select> - <p class="pf-c-form__helper-text">${gettext("Device classes which can be used to authenticate.")}</p> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Device classes which can be used to authenticate.`}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> ${this.showConfigureFlow ? html` <ak-form-element-horizontal - label=${gettext("Configuration flow")} + label=${t`Configuration flow`} ?required=${true} name="configureFlow"> <select class="pf-c-form-control"> @@ -124,7 +124,7 @@ export class AuthenticatorValidateStageForm extends Form<AuthenticatorValidateSt }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again.")}</p> + <p class="pf-c-form__helper-text">${t`Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again.`}</p> </ak-form-element-horizontal> `: html``} </div> diff --git a/web/src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts b/web/src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts index 827aee511..8ca59f94c 100644 --- a/web/src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts +++ b/web/src/pages/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts @@ -1,5 +1,5 @@ import { AuthenticateWebAuthnStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -23,9 +23,9 @@ export class AuthenticateWebAuthnStageForm extends Form<AuthenticateWebAuthnStag getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -45,7 +45,7 @@ export class AuthenticateWebAuthnStageForm extends Form<AuthenticateWebAuthnStag renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> diff --git a/web/src/pages/stages/captcha/CaptchaStageForm.ts b/web/src/pages/stages/captcha/CaptchaStageForm.ts index 747bda72c..418918674 100644 --- a/web/src/pages/stages/captcha/CaptchaStageForm.ts +++ b/web/src/pages/stages/captcha/CaptchaStageForm.ts @@ -1,5 +1,5 @@ import { CaptchaStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -24,9 +24,9 @@ export class CaptchaStageForm extends Form<CaptchaStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -46,29 +46,29 @@ export class CaptchaStageForm extends Form<CaptchaStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Stage-specific settings")} + ${t`Stage-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Public Key")} + label=${t`Public Key`} ?required=${true} name="publicKey"> <input type="text" value="${ifDefined(this.stage?.publicKey || "")}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Public key, acquired from https://www.google.com/recaptcha/intro/v3.html.")}</p> + <p class="pf-c-form__helper-text">${t`Public key, acquired from https://www.google.com/recaptcha/intro/v3.html.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Private Key")} + label=${t`Private Key`} ?required=${true} name="privateKey"> <input type="text" value="${ifDefined(this.stage?.privateKey || "")}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Private key, acquired from https://www.google.com/recaptcha/intro/v3.html.")}</p> + <p class="pf-c-form__helper-text">${t`Private key, acquired from https://www.google.com/recaptcha/intro/v3.html.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/stages/consent/ConsentStageForm.ts b/web/src/pages/stages/consent/ConsentStageForm.ts index 6f0a84fdf..096b350ac 100644 --- a/web/src/pages/stages/consent/ConsentStageForm.ts +++ b/web/src/pages/stages/consent/ConsentStageForm.ts @@ -1,5 +1,5 @@ import { ConsentStage, ConsentStageModeEnum, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -28,9 +28,9 @@ export class ConsentStageForm extends Form<ConsentStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -50,18 +50,18 @@ export class ConsentStageForm extends Form<ConsentStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Stage-specific settings")} + ${t`Stage-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Mode")} + label=${t`Mode`} ?required=${true} name="mode"> <select class="pf-c-form-control" @change=${(ev: Event) => { @@ -73,23 +73,23 @@ export class ConsentStageForm extends Form<ConsentStage> { } }}> <option value=${ConsentStageModeEnum.AlwaysRequire} ?selected=${this.stage?.mode === ConsentStageModeEnum.AlwaysRequire}> - ${gettext("Always require consent")} + ${t`Always require consent`} </option> <option value=${ConsentStageModeEnum.Permanent} ?selected=${this.stage?.mode === ConsentStageModeEnum.Permanent}> - ${gettext("Consent given last indefinitely")} + ${t`Consent given last indefinitely`} </option> <option value=${ConsentStageModeEnum.Expiring} ?selected=${this.stage?.mode === ConsentStageModeEnum.Expiring}> - ${gettext("Consent expires.")} + ${t`Consent expires.`} </option> </select> </ak-form-element-horizontal> <ak-form-element-horizontal ?hidden=${!this.showExpiresIn} - label=${gettext("Consent expires in")} + label=${t`Consent expires in`} ?required=${true} name="consentExpireIn"> <input type="text" value="${ifDefined(this.stage?.consentExpireIn || "weeks=4")}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3).")}</p> + <p class="pf-c-form__helper-text">${t`Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3).`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/stages/deny/DenyStageForm.ts b/web/src/pages/stages/deny/DenyStageForm.ts index 970f6aa87..7259c00ca 100644 --- a/web/src/pages/stages/deny/DenyStageForm.ts +++ b/web/src/pages/stages/deny/DenyStageForm.ts @@ -1,5 +1,5 @@ import { DenyStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -23,9 +23,9 @@ export class DenyStageForm extends Form<DenyStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -45,7 +45,7 @@ export class DenyStageForm extends Form<DenyStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> diff --git a/web/src/pages/stages/dummy/DummyStageForm.ts b/web/src/pages/stages/dummy/DummyStageForm.ts index b15e8b00f..b0f3d41a4 100644 --- a/web/src/pages/stages/dummy/DummyStageForm.ts +++ b/web/src/pages/stages/dummy/DummyStageForm.ts @@ -1,5 +1,5 @@ import { DummyStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -23,9 +23,9 @@ export class DummyStageForm extends Form<DummyStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -45,7 +45,7 @@ export class DummyStageForm extends Form<DummyStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> diff --git a/web/src/pages/stages/email/EmailStageForm.ts b/web/src/pages/stages/email/EmailStageForm.ts index 3451b0300..816f5908d 100644 --- a/web/src/pages/stages/email/EmailStageForm.ts +++ b/web/src/pages/stages/email/EmailStageForm.ts @@ -1,5 +1,5 @@ import { EmailStage, EmailStageTemplateEnum, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -28,9 +28,9 @@ export class EmailStageForm extends Form<EmailStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -53,29 +53,29 @@ export class EmailStageForm extends Form<EmailStage> { } return html`<ak-form-group> <span slot="header"> - ${gettext("Connection settings")} + ${t`Connection settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("SMTP Host")} + label=${t`SMTP Host`} ?required=${true} name="host"> <input type="text" value="${ifDefined(this.stage?.host || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("SMTP Port")} + label=${t`SMTP Port`} ?required=${true} name="port"> <input type="number" value="${first(this.stage?.port, 25)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("SMTP Username")} + label=${t`SMTP Username`} ?required=${true} name="username"> <input type="text" value="${ifDefined(this.stage?.username || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("SMTP Password")} + label=${t`SMTP Password`} ?required=${true} name="password"> <input type="text" value="${ifDefined(this.stage?.password || "")}" class="pf-c-form-control" required> @@ -84,7 +84,7 @@ export class EmailStageForm extends Form<EmailStage> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.stage?.useTls || true}> <label class="pf-c-check__label"> - ${gettext("Use TLS")} + ${t`Use TLS`} </label> </div> </ak-form-element-horizontal> @@ -92,18 +92,18 @@ export class EmailStageForm extends Form<EmailStage> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.stage?.useSsl || true}> <label class="pf-c-check__label"> - ${gettext("Use SSL")} + ${t`Use SSL`} </label> </div> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Timeout")} + label=${t`Timeout`} ?required=${true} name="timeout"> <input type="number" value="${first(this.stage?.timeout, 30)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("From address")} + label=${t`From address`} ?required=${true} name="fromAddress"> <input type="text" value="${ifDefined(this.stage?.fromAddress || "system@authentik.local")}" class="pf-c-form-control" required> @@ -115,14 +115,14 @@ export class EmailStageForm extends Form<EmailStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Stage-specific settings")} + ${t`Stage-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal name="useGlobalSettings"> @@ -132,34 +132,34 @@ export class EmailStageForm extends Form<EmailStage> { this.showConnectionSettings = !target.checked; }}> <label class="pf-c-check__label"> - ${gettext("Use global settings")} + ${t`Use global settings`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("When enabled, global Email connection settings will be used and connection settings below will be ignored.")}</p> + <p class="pf-c-form__helper-text">${t`When enabled, global Email connection settings will be used and connection settings below will be ignored.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Token expiry")} + label=${t`Token expiry`} ?required=${true} name="tokenExpiry"> <input type="number" value="${first(this.stage?.tokenExpiry, 30)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Time in minutes the token sent is valid.")}</p> + <p class="pf-c-form__helper-text">${t`Time in minutes the token sent is valid.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Subject")} + label=${t`Subject`} ?required=${true} name="subject"> <input type="text" value="${first(this.stage?.subject, "authentik")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Template")} + label=${t`Template`} ?required=${true} name="subject"> <select name="users" class="pf-c-form-control"> <option value=${EmailStageTemplateEnum.AccountConfirmationHtml} ?selected=${this.stage?.template === EmailStageTemplateEnum.AccountConfirmationHtml}> - ${gettext("Account confirmation")} + ${t`Account confirmation`} </option> <option value=${EmailStageTemplateEnum.PasswordResetHtml} ?selected=${this.stage?.template === EmailStageTemplateEnum.PasswordResetHtml}> - ${gettext("Password reset")} + ${t`Password reset`} </option> </select> </ak-form-element-horizontal> diff --git a/web/src/pages/stages/identification/IdentificationStageForm.ts b/web/src/pages/stages/identification/IdentificationStageForm.ts index b5dc9fca8..3286ea12e 100644 --- a/web/src/pages/stages/identification/IdentificationStageForm.ts +++ b/web/src/pages/stages/identification/IdentificationStageForm.ts @@ -1,5 +1,5 @@ import { FlowDesignationEnum, FlowsApi, IdentificationStage, IdentificationStageUserFieldsEnum, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -25,9 +25,9 @@ export class IdentificationStageForm extends Form<IdentificationStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -53,51 +53,51 @@ export class IdentificationStageForm extends Form<IdentificationStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Stage-specific settings")} + ${t`Stage-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("User fields")} + label=${t`User fields`} ?required=${true} name="transports"> <select name="users" class="pf-c-form-control" multiple> <option value=${IdentificationStageUserFieldsEnum.Username} ?selected=${this.isUserFieldSelected(IdentificationStageUserFieldsEnum.Username)}> - ${gettext("Username")} + ${t`Username`} </option> <option value=${IdentificationStageUserFieldsEnum.Email} ?selected=${this.isUserFieldSelected(IdentificationStageUserFieldsEnum.Email)}> - ${gettext("Email")} + ${t`Email`} </option> </select> - <p class="pf-c-form__helper-text">${gettext("Fields a user can identify themselves with.")}</p> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Fields a user can identify themselves with.`}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal name="caseInsensitiveMatching"> <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.stage?.caseInsensitiveMatching || true}> <label class="pf-c-check__label"> - ${gettext("Case insensitive matching")} + ${t`Case insensitive matching`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("When enabled, user fields are matched regardless of their casing.")}</p> + <p class="pf-c-form__helper-text">${t`When enabled, user fields are matched regardless of their casing.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal name="showMatchedUser"> <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.stage?.showMatchedUser || true}> <label class="pf-c-check__label"> - ${gettext("Show matched user")} + ${t`Show matched user`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("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.")}</p> + <p class="pf-c-form__helper-text">${t`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.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Enrollment flow")} + label=${t`Enrollment flow`} name="enrollmentFlow"> <select class="pf-c-form-control"> <option value="" ?selected=${this.stage?.enrollmentFlow === undefined}>---------</option> @@ -111,10 +111,10 @@ export class IdentificationStageForm extends Form<IdentificationStage> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Optional enrollment flow, which is linked at the bottom of the page.")}</p> + <p class="pf-c-form__helper-text">${t`Optional enrollment flow, which is linked at the bottom of the page.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Recovery flow")} + label=${t`Recovery flow`} name="recoveryFlow"> <select class="pf-c-form-control"> <option value="" ?selected=${this.stage?.recoveryFlow === undefined}>---------</option> @@ -128,7 +128,7 @@ export class IdentificationStageForm extends Form<IdentificationStage> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Optional recovery flow, which is linked at the bottom of the page.")}</p> + <p class="pf-c-form__helper-text">${t`Optional recovery flow, which is linked at the bottom of the page.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/stages/invitation/InvitationForm.ts b/web/src/pages/stages/invitation/InvitationForm.ts index 2c14a66ce..d81a67b3e 100644 --- a/web/src/pages/stages/invitation/InvitationForm.ts +++ b/web/src/pages/stages/invitation/InvitationForm.ts @@ -1,5 +1,5 @@ import { Invitation, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -16,9 +16,9 @@ export class InvitationForm extends Form<Invitation> { getSuccessMessage(): string { if (this.invitation) { - return gettext("Successfully updated invitation."); + return t`Successfully updated invitation.`; } else { - return gettext("Successfully created invitation."); + return t`Successfully created invitation.`; } } @@ -38,17 +38,17 @@ export class InvitationForm extends Form<Invitation> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Expires")} + label=${t`Expires`} ?required=${true} name="expires"> <input type="date" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Attributes")} + label=${t`Attributes`} name="fixedData"> <ak-codemirror mode="yaml" value="${YAML.stringify(this.invitation?.fixedData)}"> </ak-codemirror> - <p class="pf-c-form__helper-text">${gettext("Optional data which is loaded into the flow's 'prompt_data' context variable.")}</p> + <p class="pf-c-form__helper-text">${t`Optional data which is loaded into the flow's 'prompt_data' context variable.`}</p> </ak-form-element-horizontal> </form>`; } diff --git a/web/src/pages/stages/invitation/InvitationListPage.ts b/web/src/pages/stages/invitation/InvitationListPage.ts index 543ac8a93..e125b4640 100644 --- a/web/src/pages/stages/invitation/InvitationListPage.ts +++ b/web/src/pages/stages/invitation/InvitationListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../../api/Client"; import { TablePage } from "../../../elements/table/TablePage"; @@ -19,10 +19,10 @@ export class InvitationListPage extends TablePage<Invitation> { return true; } pageTitle(): string { - return gettext("Invitations"); + return t`Invitations`; } pageDescription(): string { - return gettext("Create Invitation Links to enroll Users, and optionally force specific attributes of their account."); + return t`Create Invitation Links to enroll Users, and optionally force specific attributes of their account.`; } pageIcon(): string { return "pf-icon pf-icon-migration"; @@ -42,8 +42,8 @@ export class InvitationListPage extends TablePage<Invitation> { columns(): TableColumn[] { return [ - new TableColumn("ID", "pk"), - new TableColumn("Created by", "created_by"), + new TableColumn(t`ID`, t`pk`), + new TableColumn(t`Created by`, t`created_by`), new TableColumn("Expiry"), new TableColumn(""), ]; @@ -57,14 +57,14 @@ export class InvitationListPage extends TablePage<Invitation> { html` <ak-forms-delete .obj=${item} - objectLabel=${gettext("Prompt")} + objectLabel=${t`Prompt`} .delete=${() => { return new StagesApi(DEFAULT_CONFIG).stagesInvitationInvitationsDelete({ inviteUuid: item.pk || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -74,15 +74,15 @@ export class InvitationListPage extends TablePage<Invitation> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Invitation")} + ${t`Create Invitation`} </span> <ak-invitation-form slot="form"> </ak-invitation-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/stages/invitation/InvitationStageForm.ts b/web/src/pages/stages/invitation/InvitationStageForm.ts index ae088d2c2..e62596fd7 100644 --- a/web/src/pages/stages/invitation/InvitationStageForm.ts +++ b/web/src/pages/stages/invitation/InvitationStageForm.ts @@ -1,5 +1,5 @@ import { InvitationStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -24,9 +24,9 @@ export class InvitationStageForm extends Form<InvitationStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -46,24 +46,24 @@ export class InvitationStageForm extends Form<InvitationStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Stage-specific settings")} + ${t`Stage-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal name="continueFlowWithoutInvitation"> <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.stage?.continueFlowWithoutInvitation || true}> <label class="pf-c-check__label"> - ${gettext("Continue flow without invitation")} + ${t`Continue flow without invitation`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("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.")}</p> + <p class="pf-c-form__helper-text">${t`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.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/stages/password/PasswordStageForm.ts b/web/src/pages/stages/password/PasswordStageForm.ts index 6da4c90c7..4fd60721d 100644 --- a/web/src/pages/stages/password/PasswordStageForm.ts +++ b/web/src/pages/stages/password/PasswordStageForm.ts @@ -1,5 +1,5 @@ import { FlowDesignationEnum, FlowsApi, PasswordStage, PasswordStageBackendsEnum, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -26,9 +26,9 @@ export class PasswordStageForm extends Form<PasswordStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -54,33 +54,33 @@ export class PasswordStageForm extends Form<PasswordStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Stage-specific settings")} + ${t`Stage-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Backends")} + label=${t`Backends`} ?required=${true} name="backends"> <select name="users" class="pf-c-form-control" multiple> <option value=${PasswordStageBackendsEnum.DjangoContribAuthBackendsModelBackend} ?selected=${this.isBackendSelected(PasswordStageBackendsEnum.DjangoContribAuthBackendsModelBackend)}> - ${gettext("authentik Builtin Database")} + ${t`authentik Builtin Database`} </option> <option value=${PasswordStageBackendsEnum.AuthentikSourcesLdapAuthLdapBackend} ?selected=${this.isBackendSelected(PasswordStageBackendsEnum.AuthentikSourcesLdapAuthLdapBackend)}> - ${gettext("authentik LDAP Backend")} + ${t`authentik LDAP Backend`} </option> </select> - <p class="pf-c-form__helper-text">${gettext("Selection of backends to test the password against.")}</p> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Selection of backends to test the password against.`}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Configuration flow")} + label=${t`Configuration flow`} ?required=${true} name="configureFlow"> <select class="pf-c-form-control"> @@ -98,14 +98,14 @@ export class PasswordStageForm extends Form<PasswordStage> { }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Flow used by an authenticated user to configure their password. If empty, user will not be able to configure change their password.")}</p> + <p class="pf-c-form__helper-text">${t`Flow used by an authenticated user to configure their password. If empty, user will not be able to configure change their password.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Failed attempts before cancel")} + label=${t`Failed attempts before cancel`} ?required=${true} name="failedAttemptsBeforeCancel"> <input type="number" value="${first(this.stage?.failedAttemptsBeforeCancel, 5)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("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.")}</p> + <p class="pf-c-form__helper-text">${t`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.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/stages/prompt/PromptForm.ts b/web/src/pages/stages/prompt/PromptForm.ts index 83dcfd53a..1376cb5ee 100644 --- a/web/src/pages/stages/prompt/PromptForm.ts +++ b/web/src/pages/stages/prompt/PromptForm.ts @@ -1,5 +1,5 @@ import { Prompt, PromptTypeEnum, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -15,9 +15,9 @@ export class PromptForm extends Form<Prompt> { getSuccessMessage(): string { if (this.prompt) { - return gettext("Successfully updated prompt."); + return t`Successfully updated prompt.`; } else { - return gettext("Successfully created prompt."); + return t`Successfully created prompt.`; } } @@ -37,37 +37,37 @@ export class PromptForm extends Form<Prompt> { renderTypes(): TemplateResult { return html` <option value=${PromptTypeEnum.Text} ?selected=${this.prompt?.type === PromptTypeEnum.Text}> - ${gettext("Text: Simple Text input")} + ${t`Text: Simple Text input`} </option> <option value=${PromptTypeEnum.Username} ?selected=${this.prompt?.type === PromptTypeEnum.Username}> - ${gettext("Username: Same as Text input, but checks for and prevents duplicate usernames.")} + ${t`Username: Same as Text input, but checks for and prevents duplicate usernames.`} </option> <option value=${PromptTypeEnum.Email} ?selected=${this.prompt?.type === PromptTypeEnum.Email}> - ${gettext("Email: Text field with Email type.")} + ${t`Email: Text field with Email type.`} </option> <option value=${PromptTypeEnum.Password} ?selected=${this.prompt?.type === PromptTypeEnum.Password}> - ${gettext("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.")} + ${t`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.`} </option> <option value=${PromptTypeEnum.Number} ?selected=${this.prompt?.type === PromptTypeEnum.Number}> - ${gettext("Number")} + ${t`Number`} </option> <option value=${PromptTypeEnum.Checkbox} ?selected=${this.prompt?.type === PromptTypeEnum.Checkbox}> - ${gettext("Checkbox")} + ${t`Checkbox`} </option> <option value=${PromptTypeEnum.Date} ?selected=${this.prompt?.type === PromptTypeEnum.Date}> - ${gettext("Date")} + ${t`Date`} </option> <option value=${PromptTypeEnum.DateTime} ?selected=${this.prompt?.type === PromptTypeEnum.DateTime}> - ${gettext("Date Time")} + ${t`Date Time`} </option> <option value=${PromptTypeEnum.Separator} ?selected=${this.prompt?.type === PromptTypeEnum.Separator}> - ${gettext("Separator: Static Separator Line")} + ${t`Separator: Static Separator Line`} </option> <option value=${PromptTypeEnum.Hidden} ?selected=${this.prompt?.type === PromptTypeEnum.Hidden}> - ${gettext("Hidden: Hidden field, can be used to insert data into form.")} + ${t`Hidden: Hidden field, can be used to insert data into form.`} </option> <option value=${PromptTypeEnum.Static} ?selected=${this.prompt?.type === PromptTypeEnum.Static}> - ${gettext("Static: Static value, displayed as-is.")} + ${t`Static: Static value, displayed as-is.`} </option> `; } @@ -75,21 +75,21 @@ export class PromptForm extends Form<Prompt> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Field Key")} + label=${t`Field Key`} ?required=${true} name="fieldKey"> <input type="text" value="${ifDefined(this.prompt?.fieldKey)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Name of the form field, also used to store the value.")}</p> + <p class="pf-c-form__helper-text">${t`Name of the form field, also used to store the value.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Label")} + label=${t`Label`} ?required=${true} name="label"> <input type="text" value="${ifDefined(this.prompt?.label)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Label shown next to/above the prompt.")}</p> + <p class="pf-c-form__helper-text">${t`Label shown next to/above the prompt.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Type")} + label=${t`Type`} ?required=${true} name="type"> <select class="pf-c-form-control"> @@ -100,18 +100,18 @@ export class PromptForm extends Form<Prompt> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.prompt?.required || false}> <label class="pf-c-check__label"> - ${gettext("Required")} + ${t`Required`} </label> </div> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Placeholder")} + label=${t`Placeholder`} name="placeholder"> <input type="text" value="${ifDefined(this.prompt?.placeholder)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Optionally pre-fill the input value")}</p> + <p class="pf-c-form__helper-text">${t`Optionally pre-fill the input value`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Order")} + label=${t`Order`} ?required=${true} name="order"> <input type="number" value="${ifDefined(this.prompt?.order)}" class="pf-c-form-control" required> diff --git a/web/src/pages/stages/prompt/PromptListPage.ts b/web/src/pages/stages/prompt/PromptListPage.ts index 8d3abe50c..509829752 100644 --- a/web/src/pages/stages/prompt/PromptListPage.ts +++ b/web/src/pages/stages/prompt/PromptListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../../api/Client"; import { TablePage } from "../../../elements/table/TablePage"; @@ -19,10 +19,10 @@ export class PromptListPage extends TablePage<Prompt> { return true; } pageTitle(): string { - return gettext("Prompts"); + return t`Prompts`; } pageDescription(): string { - return gettext("Single Prompts that can be used for Prompt Stages."); + return t`Single Prompts that can be used for Prompt Stages.`; } pageIcon(): string { return "pf-icon pf-icon-plugged"; @@ -42,10 +42,10 @@ export class PromptListPage extends TablePage<Prompt> { columns(): TableColumn[] { return [ - new TableColumn("Field", "field_key"), - new TableColumn("Label", "label"), - new TableColumn("Type", "type"), - new TableColumn("Order", "order"), + new TableColumn(t`Field`, t`field_key`), + new TableColumn(t`Label`, t`label`), + new TableColumn(t`Type`, t`type`), + new TableColumn(t`Order`, t`order`), new TableColumn("Stages"), new TableColumn(""), ]; @@ -63,27 +63,27 @@ export class PromptListPage extends TablePage<Prompt> { html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Prompt")} + ${t`Update Prompt`} </span> <ak-prompt-form slot="form" .prompt=${item}> </ak-prompt-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Prompt")} + objectLabel=${t`Prompt`} .delete=${() => { return new StagesApi(DEFAULT_CONFIG).stagesPromptPromptsDelete({ promptUuid: item.pk || "" }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`, ]; @@ -93,15 +93,15 @@ export class PromptListPage extends TablePage<Prompt> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Prompt")} + ${t`Create Prompt`} </span> <ak-prompt-form slot="form"> </ak-prompt-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/stages/prompt/PromptStageForm.ts b/web/src/pages/stages/prompt/PromptStageForm.ts index edc6d587f..b5e8bab50 100644 --- a/web/src/pages/stages/prompt/PromptStageForm.ts +++ b/web/src/pages/stages/prompt/PromptStageForm.ts @@ -1,5 +1,5 @@ import { PoliciesApi, PromptStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -25,9 +25,9 @@ export class PromptStageForm extends Form<PromptStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -47,18 +47,18 @@ export class PromptStageForm extends Form<PromptStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Stage-specific settings")} + ${t`Stage-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Fields")} + label=${t`Fields`} ?required=${true} name="fields"> <select name="users" class="pf-c-form-control" multiple> @@ -70,15 +70,15 @@ export class PromptStageForm extends Form<PromptStage> { return su == prompt.pk; }); return html`<option value=${ifDefined(prompt.pk)} ?selected=${selected}> - ${gettext(`${prompt.fieldKey} ('${prompt.label}', Type ${prompt.type})`)} + ${t`${prompt.fieldKey} ('${prompt.label}', Type ${prompt.type})`} </option>`; }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Validation Policies")} + label=${t`Validation Policies`} name="validationPolicies"> <select name="users" class="pf-c-form-control" multiple> ${until(new PoliciesApi(DEFAULT_CONFIG).policiesAllList({ @@ -89,13 +89,13 @@ export class PromptStageForm extends Form<PromptStage> { return su == policy.pk; }); return html`<option value=${ifDefined(policy.pk)} ?selected=${selected}> - ${gettext(`${policy.name} (${policy.verboseName})`)} + ${t`${policy.name} (${policy.verboseName})`} </option>`; }); }))} </select> - <p class="pf-c-form__helper-text">${gettext("Selected policies are executed when the stage is submitted to validate the data.")}</p> - <p class="pf-c-form__helper-text">${gettext("Hold control/command to select multiple items.")}</p> + <p class="pf-c-form__helper-text">${t`Selected policies are executed when the stage is submitted to validate the data.`}</p> + <p class="pf-c-form__helper-text">${t`Hold control/command to select multiple items.`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/stages/user_delete/UserDeleteStageForm.ts b/web/src/pages/stages/user_delete/UserDeleteStageForm.ts index 156286b3e..ee154950a 100644 --- a/web/src/pages/stages/user_delete/UserDeleteStageForm.ts +++ b/web/src/pages/stages/user_delete/UserDeleteStageForm.ts @@ -1,5 +1,5 @@ import { UserDeleteStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -23,9 +23,9 @@ export class UserDeleteStageForm extends Form<UserDeleteStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -45,7 +45,7 @@ export class UserDeleteStageForm extends Form<UserDeleteStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> diff --git a/web/src/pages/stages/user_login/UserLoginStageForm.ts b/web/src/pages/stages/user_login/UserLoginStageForm.ts index e4caefcb2..0b58db0e9 100644 --- a/web/src/pages/stages/user_login/UserLoginStageForm.ts +++ b/web/src/pages/stages/user_login/UserLoginStageForm.ts @@ -1,5 +1,5 @@ import { UserLoginStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -24,9 +24,9 @@ export class UserLoginStageForm extends Form<UserLoginStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -46,22 +46,22 @@ export class UserLoginStageForm extends Form<UserLoginStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-group .expanded=${true}> <span slot="header"> - ${gettext("Stage-specific settings")} + ${t`Stage-specific settings`} </span> <div slot="body" class="pf-c-form"> <ak-form-element-horizontal - label=${gettext("Session duration")} + label=${t`Session duration`} ?required=${true} name="privateKey"> <input type="text" value="${ifDefined(this.stage?.sessionDuration || "seconds=0")}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Determines how long a session lasts. Default of 0 seconds means that the sessions lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3).")}</p> + <p class="pf-c-form__helper-text">${t`Determines how long a session lasts. Default of 0 seconds means that the sessions lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3).`}</p> </ak-form-element-horizontal> </div> </ak-form-group> diff --git a/web/src/pages/stages/user_logout/UserLogoutStageForm.ts b/web/src/pages/stages/user_logout/UserLogoutStageForm.ts index 23bba1f67..2cd6795f1 100644 --- a/web/src/pages/stages/user_logout/UserLogoutStageForm.ts +++ b/web/src/pages/stages/user_logout/UserLogoutStageForm.ts @@ -1,5 +1,5 @@ import { UserLogoutStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -23,9 +23,9 @@ export class UserLogoutStageForm extends Form<UserLogoutStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -45,7 +45,7 @@ export class UserLogoutStageForm extends Form<UserLogoutStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> diff --git a/web/src/pages/stages/user_write/UserWriteStageForm.ts b/web/src/pages/stages/user_write/UserWriteStageForm.ts index 514a58c98..803ea2a8b 100644 --- a/web/src/pages/stages/user_write/UserWriteStageForm.ts +++ b/web/src/pages/stages/user_write/UserWriteStageForm.ts @@ -1,5 +1,5 @@ import { UserWriteStage, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -23,9 +23,9 @@ export class UserWriteStageForm extends Form<UserWriteStage> { getSuccessMessage(): string { if (this.stage) { - return gettext("Successfully updated stage."); + return t`Successfully updated stage.`; } else { - return gettext("Successfully created stage."); + return t`Successfully created stage.`; } } @@ -45,7 +45,7 @@ export class UserWriteStageForm extends Form<UserWriteStage> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.stage?.name || "")}" class="pf-c-form-control" required> diff --git a/web/src/pages/system-tasks/SystemTaskListPage.ts b/web/src/pages/system-tasks/SystemTaskListPage.ts index 64d60f0fa..1b818d1ad 100644 --- a/web/src/pages/system-tasks/SystemTaskListPage.ts +++ b/web/src/pages/system-tasks/SystemTaskListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TablePage } from "../../elements/table/TablePage"; @@ -15,10 +15,10 @@ export class SystemTaskListPage extends TablePage<Task> { return false; } pageTitle(): string { - return gettext("System Tasks"); + return t`System Tasks`; } pageDescription(): string { - return gettext("Long-running operations which authentik executes in the background."); + return t`Long-running operations which authentik executes in the background.`; } pageIcon(): string { return "pf-icon pf-icon-automation"; @@ -44,7 +44,7 @@ export class SystemTaskListPage extends TablePage<Task> { columns(): TableColumn[] { return [ - new TableColumn("Identifier", "task_name"), + new TableColumn(t`Identifier`, t`task_name`), new TableColumn("Description"), new TableColumn("Last run"), new TableColumn("Status"), @@ -56,13 +56,13 @@ export class SystemTaskListPage extends TablePage<Task> { taskStatus(task: Task): TemplateResult { switch (task.status) { case TaskStatusEnum.Successful: - return html`<i class="fas fa-check pf-m-success" > </i> ${gettext("Successful")}`; + return html`<i class="fas fa-check pf-m-success" > </i> ${t`Successful`}`; case TaskStatusEnum.Warning: - return html`<i class="fas fa-exclamation-triangle pf-m-warning" > </i> ${gettext("Warning")}`; + return html`<i class="fas fa-exclamation-triangle pf-m-warning" > </i> ${t`Warning`}`; case TaskStatusEnum.Error: - return html`<i class="fas fa-times pf-m-danger" > </i> ${gettext("Error")}`; + return html`<i class="fas fa-times pf-m-danger" > </i> ${t`Error`}`; default: - return html`<i class="fas fa-question-circle" > </i> ${gettext("Unknown")}`; + return html`<i class="fas fa-question-circle" > </i> ${t`Unknown`}`; } } @@ -81,7 +81,7 @@ export class SystemTaskListPage extends TablePage<Task> { id: item.taskName }); }}> - ${gettext("Retry Task")} + ${t`Retry Task`} </ak-action-button>`, ]; } diff --git a/web/src/pages/tokens/TokenListPage.ts b/web/src/pages/tokens/TokenListPage.ts index 4df40798d..cc323a8ce 100644 --- a/web/src/pages/tokens/TokenListPage.ts +++ b/web/src/pages/tokens/TokenListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TablePage } from "../../elements/table/TablePage"; @@ -17,10 +17,10 @@ export class TokenListPage extends TablePage<Token> { return true; } pageTitle(): string { - return gettext("Tokens"); + return t`Tokens`; } pageDescription(): string { - return gettext("Tokens are used throughout authentik for Email validation stages, Recovery keys and API access."); + return t`Tokens are used throughout authentik for Email validation stages, Recovery keys and API access.`; } pageIcon(): string { return "pf-icon pf-icon-security"; @@ -40,10 +40,10 @@ export class TokenListPage extends TablePage<Token> { columns(): TableColumn[] { return [ - new TableColumn("Identifier", "identifier"), - new TableColumn("User", "user"), - new TableColumn("Expires?", "expiring"), - new TableColumn("Expiry date", "expires"), + new TableColumn(t`Identifier`, t`identifier`), + new TableColumn(t`User`, t`user`), + new TableColumn(t`Expires?`, t`expiring`), + new TableColumn(t`Expiry date`, t`expires`), new TableColumn(""), ]; } @@ -57,18 +57,18 @@ export class TokenListPage extends TablePage<Token> { html` <ak-forms-delete .obj=${item} - objectLabel=${gettext("Token")} + objectLabel=${t`Token`} .delete=${() => { return new CoreApi(DEFAULT_CONFIG).coreTokensDelete({ identifier: item.identifier }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete> <ak-token-copy-button identifier="${item.identifier}"> - ${gettext("Copy Key")} + ${t`Copy Key`} </ak-token-copy-button> `, ]; diff --git a/web/src/pages/user-settings/UserDetailsPage.ts b/web/src/pages/user-settings/UserDetailsPage.ts index 6547dbccd..6550eb71c 100644 --- a/web/src/pages/user-settings/UserDetailsPage.ts +++ b/web/src/pages/user-settings/UserDetailsPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import PFCard from "@patternfly/patternfly/components/Card/card.css"; import AKGlobal from "../../authentik.css"; @@ -36,16 +36,16 @@ export class UserDetailsPage extends LitElement { if (!this.user) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return html`<div class="pf-c-card"> <div class="pf-c-card__title"> - ${gettext("Update details")} + ${t`Update details`} </div> <div class="pf-c-card__body"> <ak-form - successMessage=${gettext("Successfully updated details.")} + successMessage=${t`Successfully updated details.`} .send=${(data: unknown) => { return new CoreApi(DEFAULT_CONFIG).coreUsersUpdate({ id: this.user?.pk || 0, @@ -56,22 +56,22 @@ export class UserDetailsPage extends LitElement { <paper-input name="username" ?alwaysFloatLabel=${true} - label="${gettext("Username")}" + label="${t`Username`}" value=${this.user.username}> </paper-input> - <p class="pf-c-form__helper-text">${gettext("Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.")}</p> + <p class="pf-c-form__helper-text">${t`Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.`}</p> <paper-input name="name" ?alwaysFloatLabel=${true} - label="${gettext("Name")}" + label="${t`Name`}" value=${this.user.name}> </paper-input> - <p class="pf-c-form__helper-text">${gettext("User's display name.")}</p> + <p class="pf-c-form__helper-text">${t`User's display name.`}</p> <paper-input name="email" ?alwaysFloatLabel=${true} type="email" - label="${gettext("Email address")}" + label="${t`Email address`}" value=${this.user.email || ""}> </paper-input> @@ -79,11 +79,11 @@ export class UserDetailsPage extends LitElement { <div class="pf-c-form__horizontal-group"> <div class="pf-c-form__actions"> <button class="pf-c-button pf-m-primary"> - ${gettext("Update")} + ${t`Update`} </button> <a class="pf-c-button pf-m-danger" href="${FlowURLManager.defaultUnenrollment()}"> - ${gettext("Delete account")} + ${t`Delete account`} </a> </div> </div> diff --git a/web/src/pages/user-settings/UserSettingsPage.ts b/web/src/pages/user-settings/UserSettingsPage.ts index 32d15fbfa..5ae117b04 100644 --- a/web/src/pages/user-settings/UserSettingsPage.ts +++ b/web/src/pages/user-settings/UserSettingsPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, LitElement, TemplateResult } from "lit-element"; import PFPage from "@patternfly/patternfly/components/Page/page.css"; @@ -48,7 +48,7 @@ export class UserSettingsPage extends LitElement { return html`<ak-user-settings-authenticator-static objectId=${stage.objectUid}> </ak-user-settings-authenticator-static>`; default: - return html`<p>${gettext(`Error: unsupported stage settings: ${stage.component}`)}</p>`; + return html`<p>${t`Error: unsupported stage settings: ${stage.component}`}</p>`; } } @@ -58,7 +58,7 @@ export class UserSettingsPage extends LitElement { return html`<ak-user-settings-source-oauth objectId=${source.objectUid}> </ak-user-settings-source-oauth>`; default: - return html`<p>${gettext(`Error: unsupported source settings: ${source.component}`)}</p>`; + return html`<p>${t`Error: unsupported source settings: ${source.component}`}</p>`; } } @@ -69,16 +69,16 @@ export class UserSettingsPage extends LitElement { <div class="pf-c-content"> <h1> <i class="pf-icon pf-icon-user"></i> - ${gettext("User Settings")} + ${t`User Settings`} </h1> - <p>${gettext("Configure settings relevant to your user profile.")}</p> + <p>${t`Configure settings relevant to your user profile.`}</p> </div> </section> <ak-tabs ?vertical="${true}" style="height: 100%;"> - <section slot="page-1" data-tab-title="${gettext("User details")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-1" data-tab-title="${t`User details`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <ak-user-details></ak-user-details> </section> - <section slot="page-2" data-tab-title="${gettext("Tokens")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-2" data-tab-title="${t`Tokens`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <ak-user-token-list></ak-user-token-list> </section> ${until(new StagesApi(DEFAULT_CONFIG).stagesAllUserSettings().then((stages) => { diff --git a/web/src/pages/user-settings/settings/SourceSettingsOAuth.ts b/web/src/pages/user-settings/settings/SourceSettingsOAuth.ts index 94fad46e9..fca0c8a5b 100644 --- a/web/src/pages/user-settings/settings/SourceSettingsOAuth.ts +++ b/web/src/pages/user-settings/settings/SourceSettingsOAuth.ts @@ -3,7 +3,7 @@ import { BaseUserSettings } from "./BaseUserSettings"; import { OAuthSource, SourcesApi } from "authentik-api"; import { until } from "lit-html/directives/until"; import { DEFAULT_CONFIG } from "../../../api/Config"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { AppURLManager } from "../../../api/legacy"; @customElement("ak-user-settings-source-oauth") @@ -15,7 +15,7 @@ export class SourceSettingsOAuth extends BaseUserSettings { }).then((source) => { return html`<div class="pf-c-card"> <div class="pf-pf-c-card__title"> - ${gettext(`Source ${source.name}`)} + ${t`Source ${source.name}`} </div> <div class="pf-c-card__body"> ${this.renderInner(source)} @@ -29,20 +29,20 @@ export class SourceSettingsOAuth extends BaseUserSettings { sourceSlug: this.objectId }).then((connection) => { if (connection.results.length > 0) { - return html`<p>${gettext("Connected.")}</p> + return html`<p>${t`Connected.`}</p> <button class="pf-c-button pf-m-danger" @click=${() => { return new SourcesApi(DEFAULT_CONFIG).sourcesOauthUserConnectionsDelete({ id: connection.results[0].pk || 0 }); }}> - ${gettext("Disconnect")} + ${t`Disconnect`} </button>`; } - return html`<p>${gettext("Not connected.")}</p> + return html`<p>${t`Not connected.`}</p> <a class="pf-c-button pf-m-primary" href=${AppURLManager.sourceOAuth(source.slug, "login")}> - ${gettext("Connect")} + ${t`Connect`} </a>`; }))}`; } diff --git a/web/src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts b/web/src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts index cc92d121b..d14514ee8 100644 --- a/web/src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts +++ b/web/src/pages/user-settings/settings/UserSettingsAuthenticatorStatic.ts @@ -1,5 +1,5 @@ import { AuthenticatorsApi, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, TemplateResult } from "lit-element"; import { until } from "lit-html/directives/until"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -12,7 +12,7 @@ export class UserSettingsAuthenticatorStatic extends BaseUserSettings { renderEnabled(): TemplateResult { return html`<div class="pf-c-card__body"> <p> - ${gettext("Status: Enabled")} + ${t`Status: Enabled`} <i class="pf-icon pf-icon-ok"></i> </p> </div> @@ -30,7 +30,7 @@ export class UserSettingsAuthenticatorStatic extends BaseUserSettings { }); }); }}> - ${gettext("Disable Time-based OTP")} + ${t`Disable Time-based OTP`} </button> </div>`; } @@ -39,7 +39,7 @@ export class UserSettingsAuthenticatorStatic extends BaseUserSettings { return html` <div class="pf-c-card__body"> <p> - ${gettext("Status: Disabled")} + ${t`Status: Disabled`} <i class="pf-icon pf-icon-error-circle-o"></i> </p> </div> @@ -47,7 +47,7 @@ export class UserSettingsAuthenticatorStatic extends BaseUserSettings { ${until(new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorTotpRead({ stageUuid: this.objectId}).then((stage) => { if (stage.configureFlow) { return html`<a href="${FlowURLManager.configure(stage.pk || "", "?next=/%23%2Fuser")}" - class="pf-c-button pf-m-primary">${gettext("Enable Time-based OTP")} + class="pf-c-button pf-m-primary">${t`Enable Time-based OTP`} </a>`; } return html``; @@ -58,7 +58,7 @@ export class UserSettingsAuthenticatorStatic extends BaseUserSettings { render(): TemplateResult { return html`<div class="pf-c-card"> <div class="pf-c-card__title"> - ${gettext("Time-based One-Time Passwords")} + ${t`Time-based One-Time Passwords`} </div> ${until(new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsTotpList({}).then((devices) => { return devices.results.length > 0 ? this.renderEnabled() : this.renderDisabled(); diff --git a/web/src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts b/web/src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts index 07acc82b6..06171eece 100644 --- a/web/src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts +++ b/web/src/pages/user-settings/settings/UserSettingsAuthenticatorTOTP.ts @@ -1,5 +1,5 @@ import { AuthenticatorsApi, StagesApi } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, TemplateResult } from "lit-element"; import { until } from "lit-html/directives/until"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -17,7 +17,7 @@ export class UserSettingsAuthenticatorTOTP extends BaseUserSettings { renderEnabled(): TemplateResult { return html`<div class="pf-c-card__body"> <p> - ${gettext("Status: Enabled")} + ${t`Status: Enabled`} <i class="pf-icon pf-icon-ok"></i> </p> <ul class="ak-otp-tokens"> @@ -45,7 +45,7 @@ export class UserSettingsAuthenticatorTOTP extends BaseUserSettings { }); }); }}> - ${gettext("Disable Static Tokens")} + ${t`Disable Static Tokens`} </button> </div>`; } @@ -54,7 +54,7 @@ export class UserSettingsAuthenticatorTOTP extends BaseUserSettings { return html` <div class="pf-c-card__body"> <p> - ${gettext("Status: Disabled")} + ${t`Status: Disabled`} <i class="pf-icon pf-icon-error-circle-o"></i> </p> </div> @@ -62,7 +62,7 @@ export class UserSettingsAuthenticatorTOTP extends BaseUserSettings { ${until(new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorStaticRead({ stageUuid: this.objectId}).then((stage) => { if (stage.configureFlow) { return html`<a href="${FlowURLManager.configure(stage.pk || "", "?next=/%23%2Fuser")}" - class="pf-c-button pf-m-primary">${gettext("Enable Static Tokens")} + class="pf-c-button pf-m-primary">${t`Enable Static Tokens`} </a>`; } return html``; @@ -73,7 +73,7 @@ export class UserSettingsAuthenticatorTOTP extends BaseUserSettings { render(): TemplateResult { return html`<div class="pf-c-card"> <div class="pf-c-card__title"> - ${gettext("Static Tokens")} + ${t`Static Tokens`} </div> ${until(new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsTotpList({}).then((devices) => { return devices.results.length > 0 ? this.renderEnabled() : this.renderDisabled(); diff --git a/web/src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts b/web/src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts index 3cc5c5e04..c454d76d3 100644 --- a/web/src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts +++ b/web/src/pages/user-settings/settings/UserSettingsAuthenticatorWebAuthn.ts @@ -1,5 +1,5 @@ import { CSSResult, customElement, html, TemplateResult } from "lit-element"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { AuthenticatorsApi, StagesApi, WebAuthnDevice } from "authentik-api"; import { until } from "lit-html/directives/until"; import { FlowURLManager } from "../../../api/legacy"; @@ -24,14 +24,14 @@ export class UserSettingsAuthenticatorWebAuthn extends BaseUserSettings { renderDelete(device: WebAuthnDevice): TemplateResult { return html`<ak-forms-delete .obj=${device} - objectLabel=${gettext("Authenticator")} + objectLabel=${t`Authenticator`} .delete=${() => { return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsWebauthnDelete({ id: device.pk || 0 }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete>`; } @@ -39,14 +39,14 @@ export class UserSettingsAuthenticatorWebAuthn extends BaseUserSettings { renderUpdate(device: WebAuthnDevice): TemplateResult { return html`<ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update")} + ${t`Update`} </span> <ak-form slot="form" - successMessage=${gettext("Successfully updated device.")} + successMessage=${t`Successfully updated device.`} .send=${(data: unknown) => { return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsWebauthnUpdate({ id: device.pk || 0, @@ -55,7 +55,7 @@ export class UserSettingsAuthenticatorWebAuthn extends BaseUserSettings { }}> <form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Device name")} + label=${t`Device name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(device.name)}" class="pf-c-form-control" required> @@ -63,7 +63,7 @@ export class UserSettingsAuthenticatorWebAuthn extends BaseUserSettings { </form> </ak-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Update")} + ${t`Update`} </button> </ak-forms-modal>`; } @@ -71,7 +71,7 @@ export class UserSettingsAuthenticatorWebAuthn extends BaseUserSettings { render(): TemplateResult { return html`<div class="pf-c-card"> <div class="pf-c-card__title"> - ${gettext("WebAuthn Devices")} + ${t`WebAuthn Devices`} </div> <div class="pf-c-card__body"> <ul class="pf-c-data-list" role="list"> @@ -82,7 +82,7 @@ export class UserSettingsAuthenticatorWebAuthn extends BaseUserSettings { <div class="pf-c-data-list__item-content"> <div class="pf-c-data-list__cell">${device.name || "-"}</div> <div class="pf-c-data-list__cell"> - ${gettext(`Created ${device.createdOn?.toLocaleString()}`)} + ${t`Created ${device.createdOn?.toLocaleString()}`} </div> <div class="pf-c-data-list__cell"> ${this.renderUpdate(device)} @@ -99,7 +99,7 @@ export class UserSettingsAuthenticatorWebAuthn extends BaseUserSettings { ${until(new StagesApi(DEFAULT_CONFIG).stagesAuthenticatorWebauthnRead({ stageUuid: this.objectId}).then((stage) => { if (stage.configureFlow) { return html`<a href="${FlowURLManager.configure(stage.pk || "", "?next=/%23%2Fuser")}" - class="pf-c-button pf-m-primary">${gettext("Configure WebAuthn")} + class="pf-c-button pf-m-primary">${t`Configure WebAuthn`} </a>`; } return html``; diff --git a/web/src/pages/user-settings/settings/UserSettingsPassword.ts b/web/src/pages/user-settings/settings/UserSettingsPassword.ts index a1ad32d30..dc5d9cc51 100644 --- a/web/src/pages/user-settings/settings/UserSettingsPassword.ts +++ b/web/src/pages/user-settings/settings/UserSettingsPassword.ts @@ -1,5 +1,5 @@ import { customElement, html, TemplateResult } from "lit-element"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { FlowURLManager } from "../../../api/legacy"; import { BaseUserSettings } from "./BaseUserSettings"; @@ -11,12 +11,12 @@ export class UserSettingsPassword extends BaseUserSettings { // as the stage won't return any UI Elements if no configureFlow is set. return html`<div class="pf-c-card"> <div class="pf-c-card__title"> - ${gettext("Change your password")} + ${t`Change your password`} </div> <div class="pf-c-card__body"> <a href="${FlowURLManager.configure(this.objectId, "?next=/%23%2Fuser")}" class="pf-c-button pf-m-primary"> - ${gettext("Change password")} + ${t`Change password`} </a> </div> </div>`; diff --git a/web/src/pages/user-settings/tokens/UserTokenForm.ts b/web/src/pages/user-settings/tokens/UserTokenForm.ts index 1de5b64dd..25878f84a 100644 --- a/web/src/pages/user-settings/tokens/UserTokenForm.ts +++ b/web/src/pages/user-settings/tokens/UserTokenForm.ts @@ -1,5 +1,5 @@ import { CoreApi, Token } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../../api/Config"; @@ -15,9 +15,9 @@ export class UserTokenForm extends Form<Token> { getSuccessMessage(): string { if (this.token) { - return gettext("Successfully updated token."); + return t`Successfully updated token.`; } else { - return gettext("Successfully created token."); + return t`Successfully created token.`; } } @@ -37,13 +37,13 @@ export class UserTokenForm extends Form<Token> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Identifier")} + label=${t`Identifier`} ?required=${true} name="identifier"> <input type="text" value="${ifDefined(this.token?.identifier)}" class="pf-c-form-control" required> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Description")} + label=${t`Description`} ?required=${true} name="description"> <input type="text" value="${ifDefined(this.token?.description)}" class="pf-c-form-control" required> diff --git a/web/src/pages/user-settings/tokens/UserTokenList.ts b/web/src/pages/user-settings/tokens/UserTokenList.ts index 4f4202aa6..733dfd79b 100644 --- a/web/src/pages/user-settings/tokens/UserTokenList.ts +++ b/web/src/pages/user-settings/tokens/UserTokenList.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../../api/Client"; import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css"; @@ -36,7 +36,7 @@ export class UserTokenList extends Table<Token> { columns(): TableColumn[] { return [ - new TableColumn("Identifier", "identifier"), + new TableColumn(t`Identifier`, t`identifier`), new TableColumn(""), ]; } @@ -49,15 +49,15 @@ export class UserTokenList extends Table<Token> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create Token")} + ${t`Create Token`} </span> <ak-user-token-form slot="form"> </ak-user-token-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal> ${super.renderToolbar()} @@ -71,7 +71,7 @@ export class UserTokenList extends Table<Token> { <dl class="pf-c-description-list pf-m-horizontal"> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("User")}</span> + <span class="pf-c-description-list__text">${t`User`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${item.user?.username}</div> @@ -79,7 +79,7 @@ export class UserTokenList extends Table<Token> { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Expiring")}</span> + <span class="pf-c-description-list__text">${t`Expiring`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${item.expiring ? "Yes" : "No"}</div> @@ -87,7 +87,7 @@ export class UserTokenList extends Table<Token> { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Expiring")}</span> + <span class="pf-c-description-list__text">${t`Expiring`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${item.expiring ? item.expires?.toLocaleString() : "-"}</div> @@ -105,31 +105,31 @@ export class UserTokenList extends Table<Token> { html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update Token")} + ${t`Update Token`} </span> <ak-user-token-form slot="form" .token=${item}> </ak-user-token-form> <button slot="trigger" class="pf-c-button pf-m-secondary"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-forms-delete .obj=${item} - objectLabel=${gettext("Token")} + objectLabel=${t`Token`} .delete=${() => { return new CoreApi(DEFAULT_CONFIG).coreTokensDelete({ identifier: item.identifier }); }}> <button slot="trigger" class="pf-c-button pf-m-danger"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete> <ak-token-copy-button identifier="${item.identifier}"> - ${gettext("Copy Key")} + ${t`Copy Key`} </ak-token-copy-button> `, ]; diff --git a/web/src/pages/users/UserActiveForm.ts b/web/src/pages/users/UserActiveForm.ts index 3a4c41c22..7e60c763a 100644 --- a/web/src/pages/users/UserActiveForm.ts +++ b/web/src/pages/users/UserActiveForm.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, TemplateResult } from "lit-element"; import { DeleteForm } from "../../elements/forms/DeleteForm"; import { MessageLevel } from "../../elements/messages/Message"; @@ -10,14 +10,14 @@ export class UserActiveForm extends DeleteForm { onSuccess(): void { showMessage({ - message: gettext(`Successfully updated ${this.objectLabel} ${this.obj?.name}`), + message: t`Successfully updated ${this.objectLabel} ${this.obj?.name}`, level: MessageLevel.success, }); } onError(e: Error): void { showMessage({ - message: gettext(`Failed to update ${this.objectLabel}: ${e.toString()}`), + message: t`Failed to update ${this.objectLabel}: ${e.toString()}`, level: MessageLevel.error, }); } @@ -26,7 +26,7 @@ export class UserActiveForm extends DeleteForm { return html`<section class="pf-c-page__main-section pf-m-light"> <div class="pf-c-content"> <h1 class="pf-c-title pf-m-2xl"> - ${gettext(`Update ${this.objectLabel}`)} + ${t`Update ${this.objectLabel}`} </h1> </div> </section> @@ -37,9 +37,7 @@ export class UserActiveForm extends DeleteForm { <div class="pf-c-card__body"> <form class="pf-c-form pf-m-horizontal"> <p> - ${gettext( - `Are you sure you want to update ${this.objectLabel} '${this.obj?.name}'?` - )} + ${t`Are you sure you want to update ${this.objectLabel} '${this.obj?.name}'?`} </p> </form> </div> @@ -53,14 +51,14 @@ export class UserActiveForm extends DeleteForm { this.confirm(); }} class="pf-m-warning"> - ${gettext("Update")} + ${t`Update`} </ak-spinner-button> <ak-spinner-button .callAction=${() => { this.open = false; }} class="pf-m-secondary"> - ${gettext("Cancel")} + ${t`Cancel`} </ak-spinner-button> </footer>`; } diff --git a/web/src/pages/users/UserForm.ts b/web/src/pages/users/UserForm.ts index 47929ab7e..02e93d0bc 100644 --- a/web/src/pages/users/UserForm.ts +++ b/web/src/pages/users/UserForm.ts @@ -1,5 +1,5 @@ import { CoreApi, User } from "authentik-api"; -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, property } from "lit-element"; import { html, TemplateResult } from "lit-html"; import { DEFAULT_CONFIG } from "../../api/Config"; @@ -17,9 +17,9 @@ export class UserForm extends Form<User> { getSuccessMessage(): string { if (this.user) { - return gettext("Successfully updated user."); + return t`Successfully updated user.`; } else { - return gettext("Successfully created user."); + return t`Successfully created user.`; } } @@ -39,21 +39,21 @@ export class UserForm extends Form<User> { renderForm(): TemplateResult { return html`<form class="pf-c-form pf-m-horizontal"> <ak-form-element-horizontal - label=${gettext("Username")} + label=${t`Username`} ?required=${true} name="username"> <input type="text" value="${ifDefined(this.user?.username)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.")}</p> + <p class="pf-c-form__helper-text">${t`Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Name")} + label=${t`Name`} ?required=${true} name="name"> <input type="text" value="${ifDefined(this.user?.name)}" class="pf-c-form-control" required> - <p class="pf-c-form__helper-text">${gettext("User's display name.")}</p> + <p class="pf-c-form__helper-text">${t`User's display name.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Email")} + label=${t`Email`} ?required=${true} name="email"> <input type="email" autocomplete="off" value="${ifDefined(this.user?.email)}" class="pf-c-form-control" required> @@ -63,13 +63,13 @@ export class UserForm extends Form<User> { <div class="pf-c-check"> <input type="checkbox" class="pf-c-check__input" ?checked=${this.user?.isActive || false}> <label class="pf-c-check__label"> - ${gettext("Is active")} + ${t`Is active`} </label> </div> - <p class="pf-c-form__helper-text">${gettext("Designates whether this user should be treated as active. Unselect this instead of deleting accounts.")}</p> + <p class="pf-c-form__helper-text">${t`Designates whether this user should be treated as active. Unselect this instead of deleting accounts.`}</p> </ak-form-element-horizontal> <ak-form-element-horizontal - label=${gettext("Attributes")} + label=${t`Attributes`} name="attributes"> <ak-codemirror mode="yaml" value="${YAML.stringify(this.user?.attributes)}"> </ak-codemirror> diff --git a/web/src/pages/users/UserListPage.ts b/web/src/pages/users/UserListPage.ts index b0fd53486..065dd5a68 100644 --- a/web/src/pages/users/UserListPage.ts +++ b/web/src/pages/users/UserListPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { customElement, html, property, TemplateResult } from "lit-element"; import { AKResponse } from "../../api/Client"; import { TablePage } from "../../elements/table/TablePage"; @@ -22,7 +22,7 @@ export class UserListPage extends TablePage<User> { return true; } pageTitle(): string { - return gettext("Users"); + return t`Users`; } pageDescription(): string { return ""; @@ -45,9 +45,9 @@ export class UserListPage extends TablePage<User> { columns(): TableColumn[] { return [ - new TableColumn("Name", "username"), - new TableColumn("Active", "active"), - new TableColumn("Last login", "last_login"), + new TableColumn(t`Name`, t`username`), + new TableColumn(t`Active`, t`active`), + new TableColumn(t`Last login`, t`last_login`), new TableColumn(""), ]; } @@ -63,27 +63,27 @@ export class UserListPage extends TablePage<User> { html` <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update User")} + ${t`Update User`} </span> <ak-user-form slot="form" .user=${item}> </ak-user-form> <button slot="trigger" class="pf-m-secondary pf-c-button"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> <ak-dropdown class="pf-c-dropdown"> <button class="pf-c-dropdown__toggle pf-m-primary" type="button"> - <span class="pf-c-dropdown__toggle-text">${gettext(item.isActive ? "Disable" : "Enable")}</span> + <span class="pf-c-dropdown__toggle-text">${item.isActive ? t`Disable` : t`Enable`}</span> <i class="fas fa-caret-down pf-c-dropdown__toggle-icon" aria-hidden="true"></i> </button> <ul class="pf-c-dropdown__menu" hidden> <li> <ak-user-active-form .obj=${item} - objectLabel=${gettext("User")} + objectLabel=${t`User`} .delete=${() => { return new CoreApi(DEFAULT_CONFIG).coreUsersPartialUpdate({ id: item.pk || 0, @@ -95,7 +95,7 @@ export class UserListPage extends TablePage<User> { }); }}> <button slot="trigger" class="pf-c-dropdown__menu-item"> - ${item.isActive ? gettext("Disable") : gettext("Enable")} + ${item.isActive ? t`Disable` : t`Enable`} </button> </ak-user-active-form> </li> @@ -103,14 +103,14 @@ export class UserListPage extends TablePage<User> { <li> <ak-forms-delete .obj=${item} - objectLabel=${gettext("User")} + objectLabel=${t`User`} .delete=${() => { return new CoreApi(DEFAULT_CONFIG).coreUsersDelete({ id: item.pk || 0 }); }}> <button slot="trigger" class="pf-c-dropdown__menu-item"> - ${gettext("Delete")} + ${t`Delete`} </button> </ak-forms-delete> </li> @@ -123,15 +123,15 @@ export class UserListPage extends TablePage<User> { }).then(rec => { showMessage({ level: MessageLevel.success, - message: gettext("Successfully generated recovery link"), + message: t`Successfully generated recovery link`, description: rec.link }); }); }}> - ${gettext("Reset Password")} + ${t`Reset Password`} </ak-action-button> <a class="pf-c-button pf-m-tertiary" href="${`/-/impersonation/${item.pk}/`}"> - ${gettext("Impersonate")} + ${t`Impersonate`} </a>`, ]; } @@ -140,15 +140,15 @@ export class UserListPage extends TablePage<User> { return html` <ak-forms-modal> <span slot="submit"> - ${gettext("Create")} + ${t`Create`} </span> <span slot="header"> - ${gettext("Create User")} + ${t`Create User`} </span> <ak-user-form slot="form"> </ak-user-form> <button slot="trigger" class="pf-c-button pf-m-primary"> - ${gettext("Create")} + ${t`Create`} </button> </ak-forms-modal> ${super.renderToolbar()} diff --git a/web/src/pages/users/UserViewPage.ts b/web/src/pages/users/UserViewPage.ts index e29acc762..956117bfc 100644 --- a/web/src/pages/users/UserViewPage.ts +++ b/web/src/pages/users/UserViewPage.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { CSSResult, customElement, html, property, TemplateResult } from "lit-element"; import PFPage from "@patternfly/patternfly/components/Page/page.css"; @@ -33,7 +33,7 @@ import { MessageLevel } from "../../elements/messages/Message"; @customElement("ak-user-view") export class UserViewPage extends Page { pageTitle(): string { - return gettext(`User ${this.user?.username || ""}`); + return t`User ${this.user?.username || ""}`; } pageDescription(): string | undefined { return this.user?.name || ""; @@ -71,17 +71,17 @@ export class UserViewPage extends Page { return html``; } return html`<ak-tabs> - <section slot="page-1" data-tab-title="${gettext("Overview")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-1" data-tab-title="${t`Overview`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-l-gallery pf-m-gutter"> <div class="pf-c-card pf-l-gallery__item pf-m-4-col"> <div class="pf-c-card__title"> - ${gettext("User Info")} + ${t`User Info`} </div> <div class="pf-c-card__body"> <dl class="pf-c-description-list"> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Username")}</span> + <span class="pf-c-description-list__text">${t`Username`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.user.username}</div> @@ -89,7 +89,7 @@ export class UserViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Name")}</span> + <span class="pf-c-description-list__text">${t`Name`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.user.name}</div> @@ -97,7 +97,7 @@ export class UserViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Email")}</span> + <span class="pf-c-description-list__text">${t`Email`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.user.email}</div> @@ -105,7 +105,7 @@ export class UserViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Last login")}</span> + <span class="pf-c-description-list__text">${t`Last login`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text">${this.user.lastLogin?.toLocaleString()}</div> @@ -113,7 +113,7 @@ export class UserViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Active")}</span> + <span class="pf-c-description-list__text">${t`Active`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text"> @@ -123,7 +123,7 @@ export class UserViewPage extends Page { </div> <div class="pf-c-description-list__group"> <dt class="pf-c-description-list__term"> - <span class="pf-c-description-list__text">${gettext("Superuser")}</span> + <span class="pf-c-description-list__text">${t`Superuser`}</span> </dt> <dd class="pf-c-description-list__description"> <div class="pf-c-description-list__text"> @@ -136,15 +136,15 @@ export class UserViewPage extends Page { <div class="pf-c-card__footer"> <ak-forms-modal> <span slot="submit"> - ${gettext("Update")} + ${t`Update`} </span> <span slot="header"> - ${gettext("Update User")} + ${t`Update User`} </span> <ak-user-form slot="form" .user=${this.user}> </ak-user-form> <button slot="trigger" class="pf-m-primary pf-c-button"> - ${gettext("Edit")} + ${t`Edit`} </button> </ak-forms-modal> </div> @@ -156,12 +156,12 @@ export class UserViewPage extends Page { }).then(rec => { showMessage({ level: MessageLevel.success, - message: gettext("Successfully generated recovery link"), + message: t`Successfully generated recovery link`, description: rec.link }); }); }}> - ${gettext("Reset Password")} + ${t`Reset Password`} </ak-action-button> </div> </div> @@ -173,7 +173,7 @@ export class UserViewPage extends Page { </div> </div> </section> - <section slot="page-2" data-tab-title="${gettext("Changelog")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-2" data-tab-title="${t`Changelog`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-object-changelog @@ -184,7 +184,7 @@ export class UserViewPage extends Page { </div> </div> </section> - <section slot="page-3" data-tab-title="${gettext("Explicit Consent")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-3" data-tab-title="${t`Explicit Consent`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-user-consent-list .userId="${(this.user.pk || 0).toString()}"> @@ -192,7 +192,7 @@ export class UserViewPage extends Page { </div> </div> </section> - <section slot="page-4" data-tab-title="${gettext("OAuth Authorization Codes")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-4" data-tab-title="${t`OAuth Authorization Codes`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-user-oauth-code-list .userId="${(this.user.pk || 0).toString()}"> @@ -200,7 +200,7 @@ export class UserViewPage extends Page { </div> </div> </section> - <section slot="page-5" data-tab-title="${gettext("OAuth Refresh Codes")}" class="pf-c-page__main-section pf-m-no-padding-mobile"> + <section slot="page-5" data-tab-title="${t`OAuth Refresh Codes`}" class="pf-c-page__main-section pf-m-no-padding-mobile"> <div class="pf-c-card"> <div class="pf-c-card__body"> <ak-user-oauth-refresh-list .userId="${(this.user.pk || 0).toString()}"> diff --git a/web/src/utils.ts b/web/src/utils.ts index 74778a003..1852d6d4a 100644 --- a/web/src/utils.ts +++ b/web/src/utils.ts @@ -1,4 +1,4 @@ -import { gettext } from "django"; +import { t } from "@lingui/macro"; import { html, TemplateResult } from "lit-html"; import "./elements/EmptyState"; @@ -46,7 +46,7 @@ export function loading<T>(v: T, actual: TemplateResult): TemplateResult { if (!v) { return html`<ak-empty-state ?loading="${true}" - header=${gettext("Loading")}> + header=${t`Loading`}> </ak-empty-state>`; } return actual;